lcms2-2.6/0000755002406300000240000000000012311617072011726 5ustar mariamauserslcms2-2.6/autogen.sh0000755002406300000240000000464212311617072013735 0ustar mariamausers#!/bin/sh # Run this to generate all the initial makefiles, etc. srcdir=`dirname $0` test -z "$srcdir" && srcdir=. DIE=0 ACLOCAL_FLAGS="-I m4" (test -f $srcdir/configure.ac) || { echo -n "**Error**: Directory $srcdir does not look like the" echo " top-level package directory" exit 1 } (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have autoconf installed." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } (grep "^LT_INIT" $srcdir/configure.ac >/dev/null) && { (libtool --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have libtool installed." echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" DIE=1 } } (automake --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have automake installed." echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" DIE=1 NO_AUTOMAKE=yes } # if no automake, don't bother testing for aclocal test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: Missing aclocal. The version of automake" echo "installed doesn't appear recent enough." echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/" DIE=1 } if test "$DIE" -eq 1; then exit 1 fi if test -z "$*"; then echo "**Warning**: I am going to run configure with no arguments." echo "If you wish to pass any to it, please specify them on the" echo $0 " command line." echo fi case $CC in xlc ) am_opt=--include-deps;; esac aclocalinclude="$ACLOCAL_FLAGS" if grep "^LT_INIT" configure.ac >/dev/null; then if test -z "$NO_LIBTOOLIZE" ; then echo "Running libtoolize..." libtoolize --force --copy fi fi echo "Running aclocal $aclocalinclude ..." aclocal $aclocalinclude if grep "^AC_CONFIG_HEADERS" configure.ac >/dev/null; then echo "Running autoheader..." autoheader fi echo "Running automake --add-missing --gnu -Wno-portability $am_opt ..." automake --add-missing --gnu -Wno-portability $am_opt echo "Running autoconf ..." autoconf conf_flags="--enable-maintainer-mode" if test x$NOCONFIGURE = x; then echo "Running $srcdir/configure $conf_flags $@ ..." $srcdir/configure $conf_flags "$@" \ && echo "Now type make to compile." || exit 1 else echo "Skipping configure process." fi lcms2-2.6/utils/0000755002406300000240000000000012311617072013066 5ustar mariamauserslcms2-2.6/utils/samples/0000755002406300000240000000000012311617072014532 5ustar mariamauserslcms2-2.6/utils/samples/roundtrip.c0000644002406300000240000000511012311617072016721 0ustar mariamausers// // Little cms // Copyright (C) 1998-2011 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION #include "lcms2.h" #include static double VecDist(cmsUInt8Number bin[3], cmsUInt8Number bout[3]) { double rdist, gdist, bdist; rdist = fabs((double) bout[0] - bin[0]); gdist = fabs((double) bout[1] - bin[1]); bdist = fabs((double) bout[2] - bin[2]); return (sqrt((rdist*rdist + gdist*gdist + bdist*bdist))); } int main(int argc, char* argv[]) { int r, g, b; cmsUInt8Number RGB[3], RGB_OUT[3]; cmsHTRANSFORM xform; cmsHPROFILE hProfile; double err, SumX=0, SumX2=0, Peak = 0, n = 0; if (argc != 2) { printf("roundtrip \n"); return 1; } hProfile = cmsOpenProfileFromFile(argv[1], "r"); xform = cmsCreateTransform(hProfile,TYPE_RGB_8, hProfile, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE); for (r=0; r< 256; r++) { printf("%d \r", r); for (g=0; g < 256; g++) { for (b=0; b < 256; b++) { RGB[0] = r; RGB[1] = g; RGB[2] = b; cmsDoTransform(xform, RGB, RGB_OUT, 1); err = VecDist(RGB, RGB_OUT); SumX += err; SumX2 += err * err; n += 1.0; if (err > Peak) Peak = err; } } } printf("Average %g\n", SumX / n); printf("Max %g\n", Peak); printf("Std %g\n", sqrt((n*SumX2 - SumX * SumX) / (n*(n-1)))); cmsCloseProfile(hProfile); cmsDeleteTransform(xform); return 0; }lcms2-2.6/utils/samples/mktiff8.c0000644002406300000240000000725312311617072016255 0ustar mariamausers// // Little cms // Copyright (C) 1998-2010 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // Creates a devicelink that decodes TIFF8 Lab files #include "lcms2.h" #include #include static double DecodeAbTIFF(double ab) { if (ab <= 128.) ab += 127.; else ab -= 127.; return ab; } static cmsToneCurve* CreateStep(void) { cmsToneCurve* Gamma; cmsUInt16Number* Table; int i; double a; Table = calloc(4096, sizeof(cmsUInt16Number)); if (Table == NULL) return NULL; for (i=0; i < 4096; i++) { a = (double) i * 255. / 4095.; a = DecodeAbTIFF(a); Table[i] = (cmsUInt16Number) floor(a * 257. + 0.5); } Gamma = cmsBuildTabulatedToneCurve16(0, 4096, Table); free(Table); return Gamma; } static cmsToneCurve* CreateLinear(void) { cmsUInt16Number Linear[2] = { 0, 0xffff }; return cmsBuildTabulatedToneCurve16(0, 2, Linear); } // Set the copyright and description static cmsBool SetTextTags(cmsHPROFILE hProfile) { cmsMLU *DescriptionMLU, *CopyrightMLU; cmsBool rc = FALSE; DescriptionMLU = cmsMLUalloc(0, 1); CopyrightMLU = cmsMLUalloc(0, 1); if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error; if (!cmsMLUsetASCII(DescriptionMLU, "en", "US", "Little cms Tiff8 CIELab")) goto Error; if (!cmsMLUsetASCII(CopyrightMLU, "en", "US", "Copyright (c) Marti Maria, 2010. All rights reserved.")) goto Error; if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Error; if (!cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU)) goto Error; rc = TRUE; Error: if (DescriptionMLU) cmsMLUfree(DescriptionMLU); if (CopyrightMLU) cmsMLUfree(CopyrightMLU); return rc; } int main(int argc, char *argv[]) { cmsHPROFILE hProfile; cmsPipeline *AToB0; cmsToneCurve* PreLinear[3]; cmsToneCurve *Lin, *Step; fprintf(stderr, "Creating lcmstiff8.icm..."); remove("lcmstiff8.icm"); hProfile = cmsOpenProfileFromFile("lcmstiff8.icm", "w"); // Create linearization Lin = CreateLinear(); Step = CreateStep(); PreLinear[0] = Lin; PreLinear[1] = Step; PreLinear[2] = Step; AToB0 = cmsPipelineAlloc(0, 3, 3); cmsPipelineInsertStage(AToB0, cmsAT_BEGIN, cmsStageAllocToneCurves(0, 3, PreLinear)); cmsSetColorSpace(hProfile, cmsSigLabData); cmsSetPCS(hProfile, cmsSigLabData); cmsSetDeviceClass(hProfile, cmsSigLinkClass); cmsSetProfileVersion(hProfile, 4.2); cmsWriteTag(hProfile, cmsSigAToB0Tag, AToB0); SetTextTags(hProfile); cmsCloseProfile(hProfile); cmsFreeToneCurve(Lin); cmsFreeToneCurve(Step); cmsPipelineFree(AToB0); fprintf(stderr, "Done.\n"); return 0; } lcms2-2.6/utils/samples/wtpt.10000644002406300000240000000147212311617072015616 0ustar mariamausers.\"Shiju P. Nair September 30, 2004 .TH WTPT 1 "September 30, 2004" .SH NAME wtpt - Show media white of profiles, identifying black body locus. .SH SYNOPSIS .B wtpt .RI [ profile ] .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B wtpt shows media white of profiles, identifying black body locus. .P If no parameters are given, then this program will ask for XYZ value of media white. If parameter given, it must be the profile to inspect. .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com .SH SEE ALSO .BR jpegicc (1), .BR tifficc (1), .BR icc2ps (1), .BR icclink (1), .BR icctrans (1) .SH AUTHOR This manual page was written by Shiju p. Nair , for the Debian project. lcms2-2.6/utils/samples/itufax.c0000644002406300000240000001060112311617072016174 0ustar mariamausers// // Little cms // Copyright (C) 1998-2003 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "lcms.h" // This is a sample on how to build a profile for decoding ITU T.42/Fax JPEG // streams. The profile has an additional ability in the input direction of // gamut compress values between 85 < a < -85 and -75 < b < 125. This conforms // the default range for ITU/T.42 -- See RFC 2301, section 6.2.3 for details // L* = [0, 100] // a* = [85, 85] // b* = [75, 125] // These functions does convert the encoding of ITUFAX to floating point static void ITU2Lab(WORD In[3], LPcmsCIELab Lab) { Lab -> L = (double) In[0] / 655.35; Lab -> a = (double) 170.* (In[1] - 32768.) / 65535.; Lab -> b = (double) 200.* (In[2] - 24576.) / 65535.; } static void Lab2ITU(LPcmsCIELab Lab, WORD Out[3]) { Out[0] = (WORD) floor((double) (Lab -> L / 100.)* 65535. + 0.5); Out[1] = (WORD) floor((double) (Lab -> a / 170.)* 65535. + 32768. + 0.5); Out[2] = (WORD) floor((double) (Lab -> b / 200.)* 65535. + 24576. + 0.5); } // These are the samplers-- They are passed as callbacks to cmsSample3DGrid() // then, cmsSample3DGrid() will sweel whole Lab gamut calling these functions // once for each node. In[] will contain the Lab PCS value to convert to ITUFAX // on InputDirection, or the ITUFAX value to convert to Lab in OutputDirection // You can change the number of sample points if desired, the algorithm will // remain same. 33 points gives good accurancy, but you can reduce to 22 or less // is space is critical #define GRID_POINTS 33 static int InputDirection(register WORD In[], register WORD Out[], register LPVOID Cargo) { cmsCIELab Lab; cmsLabEncoded2Float(&Lab, In); cmsClampLab(&Lab, 85, -85, 125, -75); // This function does the necessary gamut remapping Lab2ITU(&Lab, Out); return TRUE; } static int OutputDirection(register WORD In[], register WORD Out[], register LPVOID Cargo) { cmsCIELab Lab; ITU2Lab(In, &Lab); cmsFloat2LabEncoded(Out, &Lab); return TRUE; } // The main entry point. Just create a profile an populate it with required tags. // note that cmsOpenProfileFromFile("itufax.icm", "w") will NOT delete the file // if already exists. This is for obvious safety reasons. int main(int argc, char *argv[]) { LPLUT AToB0, BToA0; cmsHPROFILE hProfile; fprintf(stderr, "Creating itufax.icm..."); unlink("itufax.icm"); hProfile = cmsOpenProfileFromFile("itufax.icm", "w"); AToB0 = cmsAllocLUT(); BToA0 = cmsAllocLUT(); cmsAlloc3DGrid(AToB0, GRID_POINTS, 3, 3); cmsAlloc3DGrid(BToA0, GRID_POINTS, 3, 3); cmsSample3DGrid(AToB0, InputDirection, NULL, 0); cmsSample3DGrid(BToA0, OutputDirection, NULL, 0); cmsAddTag(hProfile, icSigAToB0Tag, AToB0); cmsAddTag(hProfile, icSigBToA0Tag, BToA0); cmsSetColorSpace(hProfile, icSigLabData); cmsSetPCS(hProfile, icSigLabData); cmsSetDeviceClass(hProfile, icSigColorSpaceClass); cmsAddTag(hProfile, icSigProfileDescriptionTag, "ITU T.42/Fax JPEG CIEL*a*b*"); cmsAddTag(hProfile, icSigCopyrightTag, "No Copyright, use freely."); cmsAddTag(hProfile, icSigDeviceMfgDescTag, "Little cms"); cmsAddTag(hProfile, icSigDeviceModelDescTag, "ITU T.42/Fax JPEG CIEL*a*b*"); cmsCloseProfile(hProfile); cmsFreeLUT(AToB0); cmsFreeLUT(BToA0); fprintf(stderr, "Done.\n"); return 0; } lcms2-2.6/utils/samples/Makefile.in0000644002406300000240000004613712311617072016612 0ustar mariamausers# Makefile.in generated by automake 1.10 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria Oct 2004 VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = icctrans$(EXEEXT) wtpt$(EXEEXT) icc2ps$(EXEEXT) \ icclink$(EXEEXT) subdir = samples DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_icc2ps_OBJECTS = icc2ps.$(OBJEXT) xgetopt.$(OBJEXT) icc2ps_OBJECTS = $(am_icc2ps_OBJECTS) icc2ps_DEPENDENCIES = $(top_builddir)/src/liblcms.la icc2ps_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(icc2ps_LDFLAGS) \ $(LDFLAGS) -o $@ am_icclink_OBJECTS = icclink.$(OBJEXT) xgetopt.$(OBJEXT) \ vprf.$(OBJEXT) icclink_OBJECTS = $(am_icclink_OBJECTS) icclink_DEPENDENCIES = $(top_builddir)/src/liblcms.la icclink_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(icclink_LDFLAGS) \ $(LDFLAGS) -o $@ am_icctrans_OBJECTS = icctrans.$(OBJEXT) xgetopt.$(OBJEXT) \ vprf.$(OBJEXT) icctrans_OBJECTS = $(am_icctrans_OBJECTS) icctrans_DEPENDENCIES = $(top_builddir)/src/liblcms.la icctrans_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(icctrans_LDFLAGS) \ $(LDFLAGS) -o $@ am_wtpt_OBJECTS = wtpt.$(OBJEXT) xgetopt.$(OBJEXT) wtpt_OBJECTS = $(am_wtpt_OBJECTS) wtpt_DEPENDENCIES = $(top_builddir)/src/liblcms.la wtpt_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(wtpt_LDFLAGS) \ $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(icc2ps_SOURCES) $(icclink_SOURCES) $(icctrans_SOURCES) \ $(wtpt_SOURCES) DIST_SOURCES = $(icc2ps_SOURCES) $(icclink_SOURCES) \ $(icctrans_SOURCES) $(wtpt_SOURCES) man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INT16_T = @INT16_T@ INT32_T = @INT32_T@ INT64_T = @INT64_T@ INT8_T = @INT8_T@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LCMS_PYEXECDIR = @LCMS_PYEXECDIR@ LCMS_PYINCLUDE = @LCMS_PYINCLUDE@ LCMS_PYLIB = @LCMS_PYLIB@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ UINT16_T = @UINT16_T@ UINT32_T = @UINT32_T@ UINT64_T = @UINT64_T@ UINT8_T = @UINT8_T@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include icctrans_LDADD = $(top_builddir)/src/liblcms.la icctrans_LDFLAGS = @LDFLAGS@ icctrans_SOURCES = icctrans.c xgetopt.c vprf.c icctrans_MANS = icctrans.1 wtpt_LDADD = $(top_builddir)/src/liblcms.la wtpt_LDFLAGS = @LDFLAGS@ wtpt_SOURCES = wtpt.c xgetopt.c icc2ps_LDADD = $(top_builddir)/src/liblcms.la icc2ps_LDFLAGS = @LDFLAGS@ icc2ps_SOURCES = icc2ps.c xgetopt.c icclink_LDADD = $(top_builddir)/src/liblcms.la icclink_LDFLAGS = @LDFLAGS@ icclink_SOURCES = icclink.c xgetopt.c vprf.c man_MANS = wtpt.1 icc2ps.1 icclink.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign samples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ || test -f $$p1 \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done icc2ps$(EXEEXT): $(icc2ps_OBJECTS) $(icc2ps_DEPENDENCIES) @rm -f icc2ps$(EXEEXT) $(icc2ps_LINK) $(icc2ps_OBJECTS) $(icc2ps_LDADD) $(LIBS) icclink$(EXEEXT): $(icclink_OBJECTS) $(icclink_DEPENDENCIES) @rm -f icclink$(EXEEXT) $(icclink_LINK) $(icclink_OBJECTS) $(icclink_LDADD) $(LIBS) icctrans$(EXEEXT): $(icctrans_OBJECTS) $(icctrans_DEPENDENCIES) @rm -f icctrans$(EXEEXT) $(icctrans_LINK) $(icctrans_OBJECTS) $(icctrans_LDADD) $(LIBS) wtpt$(EXEEXT): $(wtpt_OBJECTS) $(wtpt_DEPENDENCIES) @rm -f wtpt$(EXEEXT) $(wtpt_LINK) $(wtpt_OBJECTS) $(wtpt_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icc2ps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icclink.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icctrans.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vprf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wtpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgetopt.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lcms2-2.6/utils/samples/vericc.c0000644002406300000240000000426112311617072016154 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2.h" #include #include static int PrintUsage(void) { fprintf(stderr, "Sets profile version\n\nUsage: vericc --r iccprofile.icc\n"); return 0; } int main(int argc, char *argv[]) { cmsHPROFILE hProfile; char* ptr; cmsFloat64Number Version; if (argc != 3) return PrintUsage(); ptr = argv[1]; if (strncmp(ptr, "--r", 3) != 0) return PrintUsage(); ptr += 3; if (!*ptr) { fprintf(stderr, "Wrong version number\n"); return 1; } Version = atof(ptr); hProfile = cmsOpenProfileFromFile(argv[2], "r"); if (hProfile == NULL) { fprintf(stderr, "'%s': cannot open\n", argv[2]); return 1; } cmsSetProfileVersion(hProfile, Version); cmsSaveProfileToFile(hProfile, "$$tmp.icc"); cmsCloseProfile(hProfile); remove(argv[2]); rename("$$tmp.icc", argv[2]); return 0; } lcms2-2.6/utils/samples/mkcmy.c0000644002406300000240000000753112311617072016024 0ustar mariamausers// // Little cms // Copyright (C) 1998-2003 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THIS SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, // EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY // WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. // // IN NO EVENT SHALL MARTI MARIA BE LIABLE FOR ANY SPECIAL, INCIDENTAL, // INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, // OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, // WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF // LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE // OF THIS SOFTWARE. // // Version 1.12 #include "lcms.h" typedef struct { cmsHPROFILE hLab; cmsHPROFILE hRGB; cmsHTRANSFORM Lab2RGB; cmsHTRANSFORM RGB2Lab; } CARGO, FAR* LPCARGO; // Our space will be CIE primaries plus a gamma of 4.5 static int Forward(register WORD In[], register WORD Out[], register LPVOID Cargo) { LPCARGO C = (LPCARGO) Cargo; WORD RGB[3]; cmsCIELab Lab; cmsLabEncoded2Float(&Lab, In); printf("%g %g %g\n", Lab.L, Lab.a, Lab.b); cmsDoTransform(C ->Lab2RGB, In, &RGB, 1); Out[0] = 0xFFFF - RGB[0]; // Our CMY is negative of RGB Out[1] = 0xFFFF - RGB[1]; Out[2] = 0xFFFF - RGB[2]; return TRUE; } static int Reverse(register WORD In[], register WORD Out[], register LPVOID Cargo) { LPCARGO C = (LPCARGO) Cargo; WORD RGB[3]; RGB[0] = 0xFFFF - In[0]; RGB[1] = 0xFFFF - In[1]; RGB[2] = 0xFFFF - In[2]; cmsDoTransform(C ->RGB2Lab, &RGB, Out, 1); return TRUE; } static void InitCargo(LPCARGO Cargo) { Cargo -> hLab = cmsCreateLabProfile(NULL); Cargo -> hRGB = cmsCreate_sRGBProfile(); Cargo->Lab2RGB = cmsCreateTransform(Cargo->hLab, TYPE_Lab_16, Cargo ->hRGB, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOTPRECALC); Cargo->RGB2Lab = cmsCreateTransform(Cargo ->hRGB, TYPE_RGB_16, Cargo ->hLab, TYPE_Lab_16, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOTPRECALC); } static void FreeCargo(LPCARGO Cargo) { cmsDeleteTransform(Cargo ->Lab2RGB); cmsDeleteTransform(Cargo ->RGB2Lab); cmsCloseProfile(Cargo ->hLab); cmsCloseProfile(Cargo ->hRGB); } int main(void) { LPLUT AToB0, BToA0; CARGO Cargo; cmsHPROFILE hProfile; fprintf(stderr, "Creating lcmscmy.icm..."); InitCargo(&Cargo); hProfile = cmsCreateLabProfile(NULL); AToB0 = cmsAllocLUT(); BToA0 = cmsAllocLUT(); cmsAlloc3DGrid(AToB0, 25, 3, 3); cmsAlloc3DGrid(BToA0, 25, 3, 3); cmsSample3DGrid(AToB0, Reverse, &Cargo, 0); cmsSample3DGrid(BToA0, Forward, &Cargo, 0); cmsAddTag(hProfile, icSigAToB0Tag, AToB0); cmsAddTag(hProfile, icSigBToA0Tag, BToA0); cmsSetColorSpace(hProfile, icSigCmyData); cmsSetDeviceClass(hProfile, icSigOutputClass); cmsAddTag(hProfile, icSigProfileDescriptionTag, "CMY "); cmsAddTag(hProfile, icSigCopyrightTag, "Copyright (c) HP, 2007. All rights reserved."); cmsAddTag(hProfile, icSigDeviceMfgDescTag, "Little cms"); cmsAddTag(hProfile, icSigDeviceModelDescTag, "CMY space"); _cmsSaveProfile(hProfile, "lcmscmy.icm"); cmsFreeLUT(AToB0); cmsFreeLUT(BToA0); cmsCloseProfile(hProfile); FreeCargo(&Cargo); fprintf(stderr, "Done.\n"); return 0; } lcms2-2.6/utils/samples/Makefile.am0000644002406300000240000000115312311617072016566 0ustar mariamausers# # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common bin_PROGRAMS = wtpt wtpt_LDADD = $(top_builddir)/src/liblcms2.la wtpt_LDFLAGS = @LDFLAGS@ wtpt_SOURCES = wtpt.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h wtpt_MANS = wtpt.1 EXTRA_DIST = $(man_MANS) roundtrip.c mktiff8.c mkgrayer.c mkcmy.c itufax.c lcms2-2.6/utils/samples/wtpt.c0000644002406300000240000000565212311617072015704 0ustar mariamausers// // Little cms // Copyright (C) 1998-2000 Marti Maria // // THIS SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, // EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY // WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. // // IN NO EVENT SHALL MARTI MARIA BE LIABLE FOR ANY SPECIAL, INCIDENTAL, // INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, // OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, // WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF // LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE // OF THIS SOFTWARE. // // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // Example: how to show white points of profiles #include "lcms.h" static void ShowWhitePoint(LPcmsCIEXYZ WtPt) { cmsCIELab Lab; cmsCIELCh LCh; cmsCIExyY xyY; char Buffer[1024]; _cmsIdentifyWhitePoint(Buffer, WtPt); printf("%s\n", Buffer); cmsXYZ2Lab(NULL, &Lab, WtPt); cmsLab2LCh(&LCh, &Lab); cmsXYZ2xyY(&xyY, WtPt); printf("XYZ=(%3.1f, %3.1f, %3.1f)\n", WtPt->X, WtPt->Y, WtPt->Z); printf("Lab=(%3.3f, %3.3f, %3.3f)\n", Lab.L, Lab.a, Lab.b); printf("(x,y)=(%3.3f, %3.3f)\n", xyY.x, xyY.y); printf("Hue=%3.2f, Chroma=%3.2f\n", LCh.h, LCh.C); printf("\n"); } int main (int argc, char *argv[]) { printf("Show media white of profiles, identifying black body locus. v2\n\n"); if (argc == 2) { cmsCIEXYZ WtPt; cmsHPROFILE hProfile = cmsOpenProfileFromFile(argv[1], "r"); printf("%s\n", cmsTakeProductName(hProfile)); cmsTakeMediaWhitePoint(&WtPt, hProfile); ShowWhitePoint(&WtPt); cmsCloseProfile(hProfile); } else { cmsCIEXYZ xyz; printf("usage:\n\nIf no parameters are given, then this program will\n"); printf("ask for XYZ value of media white. If parameter given, it must be\n"); printf("the profile to inspect.\n\n"); printf("X? "); scanf("%lf", &xyz.X); printf("Y? "); scanf("%lf", &xyz.Y); printf("Z? "); scanf("%lf", &xyz.Z); ShowWhitePoint(&xyz); } return 0; } lcms2-2.6/utils/samples/mkgrayer.c0000644002406300000240000000476512311617072016533 0ustar mariamausers// // Little cms // Copyright (C) 1998-2003 Marti Maria // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "lcms.h" static int Forward(register WORD In[], register WORD Out[], register LPVOID Cargo) { cmsCIELab Lab; cmsLabEncoded2Float(&Lab, In); if (fabs(Lab.a) < 3 && fabs(Lab.b) < 3) { double L_01 = Lab.L / 100.0; WORD K; if (L_01 > 1) L_01 = 1; K = (WORD) floor(L_01* 65535.0 + 0.5); Out[0] = Out[1] = Out[2] = K; } else { Out[0] = 0xFFFF; Out[1] = 0; Out[2] = 0; } return TRUE; } int main(int argc, char *argv[]) { LPLUT BToA0; cmsHPROFILE hProfile; fprintf(stderr, "Creating interpol2.icc..."); unlink("interpol2.icc"); hProfile = cmsOpenProfileFromFile("interpol2.icc", "w8"); BToA0 = cmsAllocLUT(); cmsAlloc3DGrid(BToA0, 17, 3, 3); cmsSample3DGrid(BToA0, Forward, NULL, 0); cmsAddTag(hProfile, icSigBToA0Tag, BToA0); cmsSetColorSpace(hProfile, icSigRgbData); cmsSetPCS(hProfile, icSigLabData); cmsSetDeviceClass(hProfile, icSigOutputClass); cmsAddTag(hProfile, icSigProfileDescriptionTag, "Interpolation test"); cmsAddTag(hProfile, icSigCopyrightTag, "Copyright (c) HP 2007. All rights reserved."); cmsAddTag(hProfile, icSigDeviceMfgDescTag, "Little cms"); cmsAddTag(hProfile, icSigDeviceModelDescTag, "Interpolation test profile"); cmsCloseProfile(hProfile); cmsFreeLUT(BToA0); fprintf(stderr, "Done.\n"); return 0; } lcms2-2.6/utils/psicc/0000755002406300000240000000000012311617072014167 5ustar mariamauserslcms2-2.6/utils/psicc/Makefile.in0000644002406300000240000005151012311617072016236 0ustar mariamausers# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building psicc # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = psicc$(EXEEXT) subdir = utils/psicc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_psicc_OBJECTS = psicc.$(OBJEXT) xgetopt.$(OBJEXT) vprf.$(OBJEXT) psicc_OBJECTS = $(am_psicc_OBJECTS) psicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la psicc_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(psicc_LDFLAGS) \ $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(psicc_SOURCES) DIST_SOURCES = $(psicc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common psicc_LDADD = $(top_builddir)/src/liblcms2.la psicc_LDFLAGS = @LDFLAGS@ psicc_SOURCES = psicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h psicc_MANS = psicc.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/psicc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign utils/psicc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list psicc$(EXEEXT): $(psicc_OBJECTS) $(psicc_DEPENDENCIES) $(EXTRA_psicc_DEPENDENCIES) @rm -f psicc$(EXEEXT) $(psicc_LINK) $(psicc_OBJECTS) $(psicc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psicc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vprf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgetopt.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< xgetopt.o: ../common/xgetopt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgetopt.o -MD -MP -MF $(DEPDIR)/xgetopt.Tpo -c -o xgetopt.o `test -f '../common/xgetopt.c' || echo '$(srcdir)/'`../common/xgetopt.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgetopt.Tpo $(DEPDIR)/xgetopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/xgetopt.c' object='xgetopt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgetopt.o `test -f '../common/xgetopt.c' || echo '$(srcdir)/'`../common/xgetopt.c xgetopt.obj: ../common/xgetopt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgetopt.obj -MD -MP -MF $(DEPDIR)/xgetopt.Tpo -c -o xgetopt.obj `if test -f '../common/xgetopt.c'; then $(CYGPATH_W) '../common/xgetopt.c'; else $(CYGPATH_W) '$(srcdir)/../common/xgetopt.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgetopt.Tpo $(DEPDIR)/xgetopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/xgetopt.c' object='xgetopt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgetopt.obj `if test -f '../common/xgetopt.c'; then $(CYGPATH_W) '../common/xgetopt.c'; else $(CYGPATH_W) '$(srcdir)/../common/xgetopt.c'; fi` vprf.o: ../common/vprf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vprf.o -MD -MP -MF $(DEPDIR)/vprf.Tpo -c -o vprf.o `test -f '../common/vprf.c' || echo '$(srcdir)/'`../common/vprf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vprf.Tpo $(DEPDIR)/vprf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/vprf.c' object='vprf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vprf.o `test -f '../common/vprf.c' || echo '$(srcdir)/'`../common/vprf.c vprf.obj: ../common/vprf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vprf.obj -MD -MP -MF $(DEPDIR)/vprf.Tpo -c -o vprf.obj `if test -f '../common/vprf.c'; then $(CYGPATH_W) '../common/vprf.c'; else $(CYGPATH_W) '$(srcdir)/../common/vprf.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vprf.Tpo $(DEPDIR)/vprf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/vprf.c' object='vprf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vprf.obj `if test -f '../common/vprf.c'; then $(CYGPATH_W) '../common/vprf.c'; else $(CYGPATH_W) '$(srcdir)/../common/vprf.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lcms2-2.6/utils/psicc/Makefile.am0000644002406300000240000000106112311617072016221 0ustar mariamausers# # Makefile for building psicc # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common bin_PROGRAMS = psicc psicc_LDADD = $(top_builddir)/src/liblcms2.la psicc_LDFLAGS = @LDFLAGS@ psicc_SOURCES = psicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h psicc_MANS = psicc.1 EXTRA_DIST = $(man_MANS) lcms2-2.6/utils/psicc/psicc.10000644002406300000240000000173612311617072015361 0ustar mariamausers.\"Shiju P. Nair September 30, 2004 .TH ICC2PS 1 "September 30, 2004" .SH NAME icc2ps - little cms PostScript converter. .SH SYNOPSIS .B icc2ps .RI [ options ] .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B icc2ps is little cms PostScript converter. .SH OPTIONS .TP .B \-b Black point compensation (CRD only). .TP .BI \-i\ profile Input profile: Generates Color Space Array (CSA). .TP .BI \-o\ profile .p Output profile: Generates Color Rendering Dictionary(CRD). .TP .B \-t <0,1,2,3> Intent (0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute). .TP .B \-u Do NOT generate resource name on CRD. .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com. .SH SEE ALSO .BR jpegicc (1), .BR tifficc (1), .BR icclink (1), .BR icctrans (1), .BR wtpt (1) .SH AUTHOR This manual page was written by Shiju p. Nair , for the Debian project. lcms2-2.6/utils/psicc/psicc.c0000644002406300000240000001447312311617072015445 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- #include "utils.h" // ------------------------------------------------------------------------ static char *cInProf = NULL; static char *cOutProf = NULL; static int Intent = INTENT_PERCEPTUAL; static FILE* OutFile; static int BlackPointCompensation = FALSE; static int Undecorated = FALSE; static int PrecalcMode = 1; static int NumOfGridPoints = 0; // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s = xgetopt(argc,argv,"uUbBI:i:O:o:T:t:c:C:n:N:")) != EOF) { switch (s){ case 'i': case 'I': cInProf = xoptarg; break; case 'o': case 'O': cOutProf = xoptarg; break; case 'b': case 'B': BlackPointCompensation =TRUE; break; case 't': case 'T': Intent = atoi(xoptarg); if (Intent > 3) Intent = 3; if (Intent < 0) Intent = 0; break; case 'U': case 'u': Undecorated = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 2) FatalError("ERROR: Unknown precalc mode '%d'", PrecalcMode); break; case 'n': case 'N': if (PrecalcMode != 1) FatalError("Precalc mode already specified"); NumOfGridPoints = atoi(xoptarg); break; default: FatalError("Unknown option - run without args to see valid ones.\n"); } } } static void Help(void) { fprintf(stderr, "little CMS ICC PostScript generator - v2.1 [LittleCMS %2.2f]\n", LCMS_VERSION / 1000.0); fprintf(stderr, "usage: psicc [flags] []\n\n"); fprintf(stderr, "flags:\n\n"); fprintf(stderr, "%ci - Input profile: Generates Color Space Array (CSA)\n", SW); fprintf(stderr, "%co - Output profile: Generates Color Rendering Dictionary(CRD)\n", SW); fprintf(stderr, "%ct<0,1,2,3> - Intent (0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute)\n", SW); fprintf(stderr, "%cb - Black point compensation (CRD only)\n", SW); fprintf(stderr, "%cu - Do NOT generate resource name on CRD\n", SW); fprintf(stderr, "%cc<0,1,2> - Precision (0=LowRes, 1=Normal (default), 2=Hi-res) (CRD only)\n", SW); fprintf(stderr, "%cn - Alternate way to set precission, number of CLUT points (CRD only)\n", SW); fprintf(stderr, "\n"); fprintf(stderr, "If no output file is specified, output goes to stdout.\n\n"); fprintf(stderr, "This program is intended to be a demo of the little cms\n" "engine. Both lcms and this program are freeware. You can\n" "obtain both in source code at http://www.littlecms.com\n" "For suggestions, comments, bug reports etc. send mail to\n" "info@littlecms.com\n\n"); exit(0); } static void GenerateCSA(void) { cmsHPROFILE hProfile = OpenStockProfile(0, cInProf); size_t n; char* Buffer; if (hProfile == NULL) return; n = cmsGetPostScriptCSA(0, hProfile, Intent, 0, NULL, 0); if (n == 0) return; Buffer = (char*) malloc(n + 1); if (Buffer != NULL) { cmsGetPostScriptCSA(0, hProfile, Intent, 0, Buffer, (cmsUInt32Number) n); Buffer[n] = 0; fprintf(OutFile, "%s", Buffer); free(Buffer); } cmsCloseProfile(hProfile); } static void GenerateCRD(void) { cmsHPROFILE hProfile = OpenStockProfile(0, cOutProf); size_t n; char* Buffer; cmsUInt32Number dwFlags = 0; if (hProfile == NULL) return; if (BlackPointCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; if (Undecorated) dwFlags |= cmsFLAGS_NODEFAULTRESOURCEDEF; switch (PrecalcMode) { case 0: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; case 1: if (NumOfGridPoints > 0) dwFlags |= cmsFLAGS_GRIDPOINTS(NumOfGridPoints); break; default: FatalError("ERROR: Unknown precalculation mode '%d'", PrecalcMode); } n = cmsGetPostScriptCRD(0, hProfile, Intent, dwFlags, NULL, 0); if (n == 0) return; Buffer = (char*) malloc(n + 1); cmsGetPostScriptCRD(0, hProfile, Intent, dwFlags, Buffer, (cmsUInt32Number) n); Buffer[n] = 0; fprintf(OutFile, "%s", Buffer); free(Buffer); cmsCloseProfile(hProfile); } int main(int argc, char *argv[]) { int nargs; // Initialize InitUtils("psicc"); HandleSwitches(argc, argv); nargs = (argc - xoptind); if (nargs != 0 && nargs != 1) Help(); if (cInProf == NULL && cOutProf == NULL) Help(); if (nargs == 0) OutFile = stdout; else OutFile = fopen(argv[xoptind], "wt"); if (cInProf != NULL) GenerateCSA(); if (cOutProf != NULL) GenerateCRD(); if (nargs == 1) { fclose(OutFile); } return 0; } lcms2-2.6/utils/linkicc/0000755002406300000240000000000012311617072014502 5ustar mariamauserslcms2-2.6/utils/linkicc/linkicc.c0000644002406300000240000002735712311617072016300 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- #include "utils.h" // --------------------------------------------------------------------------------- static char* Description = "Devicelink profile"; static char* Copyright = "No copyright, use freely"; static int Intent = INTENT_PERCEPTUAL; static char* cOutProf = "devicelink.icc"; static int PrecalcMode = 1; static int NumOfGridPoints = 0; static cmsFloat64Number ObserverAdaptationState = 1.0; // According ICC 4.2 this is the default static cmsBool BlackPointCompensation = FALSE; static cmsFloat64Number InkLimit = 400; static cmsBool lUse8bits = FALSE; static cmsBool TagResult = FALSE; static cmsBool KeepLinearization = FALSE; static cmsFloat64Number Version = 4.3; // The manual static int Help(int level) { switch (level) { default: case 0: fprintf(stderr, "\nlinkicc: Links profiles into a single devicelink.\n"); fprintf(stderr, "\n"); fprintf(stderr, "usage: linkicc [flags] \n\n"); fprintf(stderr, "flags:\n\n"); fprintf(stderr, "%co - Output devicelink profile. [defaults to 'devicelink.icc']\n", SW); PrintRenderingIntents(); fprintf(stderr, "%cc<0,1,2> - Precision (0=LowRes, 1=Normal, 2=Hi-res) [defaults to 1]\n", SW); fprintf(stderr, "%cn - Alternate way to set precision, number of CLUT points\n", SW); fprintf(stderr, "%cd - description text (quotes can be used)\n", SW); fprintf(stderr, "%cy - copyright notice (quotes can be used)\n", SW); fprintf(stderr, "\n%ck<0..400> - Ink-limiting in %% (CMYK only)\n", SW); fprintf(stderr, "%c8 - Creates 8-bit devicelink\n", SW); fprintf(stderr, "%cx - Creatively, guess deviceclass of resulting profile.\n", SW); fprintf(stderr, "%cb - Black point compensation\n", SW); fprintf(stderr, "%ca<0..1> - Observer adaptation state (abs.col. only)\n\n", SW); fprintf(stderr, "%cl - Use linearization curves (may affect accuracy)\n", SW); fprintf(stderr, "%cr - Profile version. (CAUTION: may change the profile implementation)\n", SW); fprintf(stderr, "\n"); fprintf(stderr, "Colorspaces must be paired except Lab/XYZ, that can be interchanged.\n\n"); fprintf(stderr, "%ch<0,1,2,3> - More help\n", SW); break; case 1: PrintBuiltins(); break; case 2: fprintf(stderr, "\nExamples:\n\n" "To create 'devicelink.icm' from a.icc to b.icc:\n" "\tlinkicc a.icc b.icc\n\n" "To create 'out.icc' from sRGB to cmyk.icc:\n" "\tlinkicc -o out.icc *sRGB cmyk.icc\n\n" "To create a sRGB input profile working in Lab:\n" "\tlinkicc -x -o sRGBLab.icc *sRGB *Lab\n\n" "To create a XYZ -> sRGB output profile:\n" "\tlinkicc -x -o sRGBLab.icc *XYZ *sRGB\n\n" "To create a abstract profile doing softproof for cmyk.icc:\n" "\tlinkicc -t1 -x -o softproof.icc *Lab cmyk.icc cmyk.icc *Lab\n\n" "To create a 'grayer' sRGB input profile:\n" "\tlinkicc -x -o grayer.icc *sRGB gray.icc gray.icc *Lab\n\n" "To embed ink limiting into a cmyk output profile:\n" "\tlinkicc -x -o cmyklimited.icc -k 250 cmyk.icc *Lab\n\n"); break; case 3: fprintf(stderr, "This program is intended to be a demo of the little cms\n" "engine. Both lcms and this program are freeware. You can\n" "obtain both in source code at http://www.littlecms.com\n" "For suggestions, comments, bug reports etc. send mail to\n" "info@littlecms.com\n\n"); } exit(0); } // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s = xgetopt(argc,argv,"a:A:BbC:c:D:d:h:H:k:K:lLn:N:O:o:r:R:T:t:V:v:xX8y:Y:")) != EOF) { switch (s) { case 'a': case 'A': ObserverAdaptationState = atof(xoptarg); if (ObserverAdaptationState < 0 || ObserverAdaptationState > 1.0) FatalError("Adaptation state should be 0..1"); break; case 'b': case 'B': BlackPointCompensation = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 2) { FatalError("Unknown precalc mode '%d'", PrecalcMode); } break; case 'd': case 'D': // Doing that is correct and safe: Description points to memory allocated in the command line. // same for Copyright and output devicelink. Description = xoptarg; break; case 'h': case 'H': Help(atoi(xoptarg)); return; case 'k': case 'K': InkLimit = atof(xoptarg); if (InkLimit < 0.0 || InkLimit > 400.0) { FatalError("Ink limit must be 0%%..400%%"); } break; case 'l': case 'L': KeepLinearization = TRUE; break; case 'n': case 'N': if (PrecalcMode != 1) { FatalError("Precalc mode already specified"); } NumOfGridPoints = atoi(xoptarg); break; case 'o': case 'O': cOutProf = xoptarg; break; case 'r': case 'R': Version = atof(xoptarg); if (Version < 2.0 || Version > 4.3) { fprintf(stderr, "WARNING: lcms was not aware of this version, tag types may be wrong!\n"); } break; case 't': case 'T': Intent = atoi(xoptarg); // Will be validated latter on break; case 'V': case 'v': Verbose = atoi(xoptarg); if (Verbose < 0 || Verbose > 3) { FatalError("Unknown verbosity level '%d'", Verbose); } break; case '8': lUse8bits = TRUE; break; case 'y': case 'Y': Copyright = xoptarg; break; case 'x': case 'X': TagResult = TRUE; break; default: FatalError("Unknown option - run without args to see valid ones.\n"); } } } // Set the copyright and description static cmsBool SetTextTags(cmsHPROFILE hProfile) { cmsMLU *DescriptionMLU, *CopyrightMLU; cmsBool rc = FALSE; cmsContext ContextID = cmsGetProfileContextID(hProfile); DescriptionMLU = cmsMLUalloc(ContextID, 1); CopyrightMLU = cmsMLUalloc(ContextID, 1); if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error; if (!cmsMLUsetASCII(DescriptionMLU, "en", "US", Description)) goto Error; if (!cmsMLUsetASCII(CopyrightMLU, "en", "US", Copyright)) goto Error; if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Error; if (!cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU)) goto Error; rc = TRUE; Error: if (DescriptionMLU) cmsMLUfree(DescriptionMLU); if (CopyrightMLU) cmsMLUfree(CopyrightMLU); return rc; } int main(int argc, char *argv[]) { int i, nargs, rc; cmsHPROFILE Profiles[257]; cmsHPROFILE hProfile; cmsUInt32Number dwFlags; cmsHTRANSFORM hTransform = NULL; // Here we are fprintf(stderr, "little cms ICC device link generator - v2.2 [LittleCMS %2.2f]\n", LCMS_VERSION / 1000.0); fflush(stderr); // Initialize InitUtils("linkicc"); rc = 0; // Get the options HandleSwitches(argc, argv); // How many profiles to link? nargs = (argc - xoptind); if (nargs < 1) return Help(0); if (nargs > 255) { FatalError("Holy profile! what are you trying to do with so many profiles!?"); goto Cleanup; } // Open all profiles memset(Profiles, 0, sizeof(Profiles)); for (i=0; i < nargs; i++) { Profiles[i] = OpenStockProfile(0, argv[i + xoptind]); if (Profiles[i] == NULL) goto Cleanup; if (Verbose >= 1) { PrintProfileInformation(Profiles[i]); } } // Ink limiting if (InkLimit != 400.0) { cmsColorSpaceSignature EndingColorSpace = cmsGetColorSpace(Profiles[nargs-1]); Profiles[nargs++] = cmsCreateInkLimitingDeviceLink(EndingColorSpace, InkLimit); } // Set the flags dwFlags = cmsFLAGS_KEEP_SEQUENCE; switch (PrecalcMode) { case 0: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; case 1: if (NumOfGridPoints > 0) dwFlags |= cmsFLAGS_GRIDPOINTS(NumOfGridPoints); break; default: { FatalError("Unknown precalculation mode '%d'", PrecalcMode); goto Cleanup; } } if (BlackPointCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; if (TagResult) dwFlags |= cmsFLAGS_GUESSDEVICECLASS; if (KeepLinearization) dwFlags |= cmsFLAGS_CLUT_PRE_LINEARIZATION|cmsFLAGS_CLUT_POST_LINEARIZATION; if (lUse8bits) dwFlags |= cmsFLAGS_8BITS_DEVICELINK; cmsSetAdaptationState(ObserverAdaptationState); // Create the color transform. Specify 0 for the format is safe as the transform // is intended to be used only for the devicelink. hTransform = cmsCreateMultiprofileTransform(Profiles, nargs, 0, 0, Intent, dwFlags|cmsFLAGS_NOOPTIMIZE); if (hTransform == NULL) { FatalError("Transform creation failed"); goto Cleanup; } hProfile = cmsTransform2DeviceLink(hTransform, Version, dwFlags); if (hProfile == NULL) { FatalError("Devicelink creation failed"); goto Cleanup; } SetTextTags(hProfile); cmsSetHeaderRenderingIntent(hProfile, Intent); if (cmsSaveProfileToFile(hProfile, cOutProf)) { if (Verbose > 0) fprintf(stderr, "Ok"); } else FatalError("Error saving file!"); cmsCloseProfile(hProfile); Cleanup: if (hTransform != NULL) cmsDeleteTransform(hTransform); for (i=0; i < nargs; i++) { if (Profiles[i] != NULL) cmsCloseProfile(Profiles[i]); } return rc; } lcms2-2.6/utils/linkicc/linkicc.10000644002406300000240000000435512311617072016207 0ustar mariamausers.\"Shiju P. Nair September 30, 2004 .TH ICCLINK 1 "September 30, 2004" .SH NAME icclink - little cms device link generator. .SH SYNOPSIS .B icclink .RI [ options ] " " .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B icclink is little cms device link generator. .P Links two or more profiles into a single devicelink profile. Colorspaces must be paired except Lab/XYZ, that can be interchanged. .SH OPTIONS .TP .B \-8 Creates 8-bit devicelink. .TP .B \-b Black point compensation. .TP .B \-c <0,1,2,3> Precision (0=LowRes, 1=Normal, 2=Hi-res). [defaults to 1] .TP .BI \-d\ description Description text (quotes can be used). .TP .B \-h <0,1,2,3> Show summary of options and examples. .TP .BI \-i\ profile Input profile (defaults to sRGB). .TP .B -k <0..400> Ink-limiting in % (CMYK only) .TP .BI \-o\ profile Output devicelink profile. [defaults to 'devicelink.icm'] .TP .B \-t <0,1,2,3> Intent (0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute). .TP .B \-x Creatively, guess deviceclass of resulting profile. .TP .nf Built-in profiles: *Lab -- D50-based CIEL*a*b (PCS) *XYZ -- CIE XYZ (PCS) *sRGB -- sRGB color space *Gray22- Monochrome of Gamma 2.2 *Lin2222- CMYK linearization of gamma 2.2 on each channel .fi .SH EXAMPLES .nf To create 'devicelink.icm' from a.icc to b.icc: icclink a.icc b.icc To create 'out.icc' from sRGB to cmyk.icc: icclink -o out.icc *sRGB cmyk.icc To create a sRGB input profile working in Lab: icclink -x -o sRGBLab.icc *sRGB *Lab To create a XYZ -> sRGB output profile: icclink -x -o sRGBLab.icc *XYZ *sRGB To create a abstract profile doing softproof for cmyk.icc: icclink -t1 -x -o softproof.icc *Lab cmyk.icc cmyk.icc *Lab To create a 'grayer' sRGB input profile: icclink -x -o grayer.icc *sRGB gray.icc gray.icc *Lab To embed ink limiting into a cmyk output profile: icclink -x -o cmyklimited.icc -k 250 cmyk.icc *Lab .fi .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com. .SH SEE ALSO .BR jpegicc (1), .BR tifficc (1), .BR icc2ps (1), .BR icctrans (1), .BR wtpt (1) .SH AUTHOR This manual page was written by Shiju p. Nair , for the Debian project. lcms2-2.6/utils/linkicc/Makefile.in0000644002406300000240000005162112311617072016554 0ustar mariamausers# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = linkicc$(EXEEXT) subdir = utils/linkicc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_linkicc_OBJECTS = linkicc.$(OBJEXT) xgetopt.$(OBJEXT) \ vprf.$(OBJEXT) linkicc_OBJECTS = $(am_linkicc_OBJECTS) linkicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la linkicc_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(linkicc_LDFLAGS) \ $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(linkicc_SOURCES) DIST_SOURCES = $(linkicc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common linkicc_LDADD = $(top_builddir)/src/liblcms2.la linkicc_LDFLAGS = @LDFLAGS@ linkicc_SOURCES = linkicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h linkicc_MANS = linkicc.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/linkicc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign utils/linkicc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list linkicc$(EXEEXT): $(linkicc_OBJECTS) $(linkicc_DEPENDENCIES) $(EXTRA_linkicc_DEPENDENCIES) @rm -f linkicc$(EXEEXT) $(linkicc_LINK) $(linkicc_OBJECTS) $(linkicc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linkicc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vprf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgetopt.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< xgetopt.o: ../common/xgetopt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgetopt.o -MD -MP -MF $(DEPDIR)/xgetopt.Tpo -c -o xgetopt.o `test -f '../common/xgetopt.c' || echo '$(srcdir)/'`../common/xgetopt.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgetopt.Tpo $(DEPDIR)/xgetopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/xgetopt.c' object='xgetopt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgetopt.o `test -f '../common/xgetopt.c' || echo '$(srcdir)/'`../common/xgetopt.c xgetopt.obj: ../common/xgetopt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgetopt.obj -MD -MP -MF $(DEPDIR)/xgetopt.Tpo -c -o xgetopt.obj `if test -f '../common/xgetopt.c'; then $(CYGPATH_W) '../common/xgetopt.c'; else $(CYGPATH_W) '$(srcdir)/../common/xgetopt.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgetopt.Tpo $(DEPDIR)/xgetopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/xgetopt.c' object='xgetopt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgetopt.obj `if test -f '../common/xgetopt.c'; then $(CYGPATH_W) '../common/xgetopt.c'; else $(CYGPATH_W) '$(srcdir)/../common/xgetopt.c'; fi` vprf.o: ../common/vprf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vprf.o -MD -MP -MF $(DEPDIR)/vprf.Tpo -c -o vprf.o `test -f '../common/vprf.c' || echo '$(srcdir)/'`../common/vprf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vprf.Tpo $(DEPDIR)/vprf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/vprf.c' object='vprf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vprf.o `test -f '../common/vprf.c' || echo '$(srcdir)/'`../common/vprf.c vprf.obj: ../common/vprf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vprf.obj -MD -MP -MF $(DEPDIR)/vprf.Tpo -c -o vprf.obj `if test -f '../common/vprf.c'; then $(CYGPATH_W) '../common/vprf.c'; else $(CYGPATH_W) '$(srcdir)/../common/vprf.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vprf.Tpo $(DEPDIR)/vprf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/vprf.c' object='vprf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vprf.obj `if test -f '../common/vprf.c'; then $(CYGPATH_W) '../common/vprf.c'; else $(CYGPATH_W) '$(srcdir)/../common/vprf.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lcms2-2.6/utils/linkicc/Makefile.am0000644002406300000240000000111512311617072016534 0ustar mariamausers# # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common bin_PROGRAMS = linkicc linkicc_LDADD = $(top_builddir)/src/liblcms2.la linkicc_LDFLAGS = @LDFLAGS@ linkicc_SOURCES = linkicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h linkicc_MANS = linkicc.1 EXTRA_DIST = $(man_MANS) lcms2-2.6/utils/matlab/0000755002406300000240000000000012311617072014326 5ustar mariamauserslcms2-2.6/utils/matlab/lcms_rsp0000644002406300000240000000077612311617072016105 0ustar mariamausers-O -I..\..\include icctrans.c ..\..\src\cmscam02.c ..\..\src\cmscgats.c ..\..\src\cmscnvrt.c ..\..\src\cmserr.c ..\..\src\cmsgamma.c ..\..\src\cmsgmt.c ..\..\src\cmsintrp.c ..\..\src\cmsio0.c ..\..\src\cmsio1.c ..\..\src\cmslut.c ..\..\src\cmsmd5.c ..\..\src\cmsmtrx.c ..\..\src\cmsnamed.c ..\..\src\cmsopt.c ..\..\src\cmspack.c ..\..\src\cmspcs.c ..\..\src\cmsplugin.c ..\..\src\cmsps2.c ..\..\src\cmssamp.c ..\..\src\cmssm.c ..\..\src\cmstypes.c ..\..\src\cmsvirt.c ..\..\src\cmswtpnt.c ..\..\src\cmsxform.c lcms2-2.6/utils/matlab/icctrans.c0000644002406300000240000004016112311617072016302 0ustar mariamausers// // Little cms // Copyright (C) 1998-2010 Marti Maria, Ignacio Ruiz de Conejo // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "mex.h" #include "lcms2.h" #include "string.h" #include "stdarg.h" // xgetopt() interface ----------------------------------------------------- static int xoptind; static char *xoptarg; static int xopterr; static char *letP; static char SW = '-'; // ------------------------------------------------------------------------ static int Verbose ; // Print some statistics static char *cInProf; // Input profile static char *cOutProf; // Output profile static char *cProofing; // Softproofing profile static int Intent; // Rendering Intent static int ProofingIntent; // RI for proof static int PrecalcMode; // 0 = Not, 1=Normal, 2=Accurate, 3=Fast static cmsBool BlackPointCompensation; static cmsBool lIsDeviceLink; static cmsBool lMultiProfileChain; // Multiple profile chain static cmsHPROFILE hInput, hOutput, hProof; static cmsHTRANSFORM hColorTransform; static cmsHPROFILE hProfiles[255]; static int nProfiles; static cmsColorSpaceSignature InputColorSpace, OutputColorSpace; static int OutputChannels, InputChannels, nBytesDepth; // Error. Print error message and abort static cmsBool FatalError(const char *frm, ...) { va_list args; char Buffer[1024]; va_start(args, frm); vsprintf(Buffer, frm, args); mexErrMsgTxt(Buffer); va_end(args); return FALSE; } // This is the handler passed to lcms static void MatLabErrorHandler(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { mexErrMsgTxt(Text); } // // Parse the command line options, System V style. // static void xoptinit() { xoptind = 1; xopterr = 0; letP = NULL; } static int xgetopt(int argc, char *argv[], char *optionS) { unsigned char ch; char *optP; if (SW == 0) { SW = '/'; } if (argc > xoptind) { if (letP == NULL) { if ((letP = argv[xoptind]) == NULL || *(letP++) != SW) goto gopEOF; if (*letP == SW) { xoptind++; goto gopEOF; } } if (0 == (ch = *(letP++))) { xoptind++; goto gopEOF; } if (':' == ch || (optP = strchr(optionS, ch)) == NULL) goto gopError; if (':' == *(++optP)) { xoptind++; if (0 == *letP) { if (argc <= xoptind) goto gopError; letP = argv[xoptind++]; } xoptarg = letP; letP = NULL; } else { if (0 == *letP) { xoptind++; letP = NULL; } xoptarg = NULL; } return ch; } gopEOF: xoptarg = letP = NULL; return EOF; gopError: xoptarg = NULL; if (xopterr) FatalError ("get command line option"); return ('?'); } // Return Mathlab type by depth static size_t SizeOfArrayType(const mxArray *Array) { switch (mxGetClassID(Array)) { case mxINT8_CLASS: return 1; case mxUINT8_CLASS: return 1; case mxINT16_CLASS: return 2; case mxUINT16_CLASS: return 2; case mxSINGLE_CLASS: return 4; case mxDOUBLE_CLASS: return 0; // Special case -- lcms handles double as size=0 default: FatalError("Unsupported data type"); return 0; } } // Get number of pixels of input array. Supported arrays are // organized as NxMxD, being N and M the size of image and D the // number of components. static size_t GetNumberOfPixels(const mxArray* In) { int nDimensions = mxGetNumberOfDimensions(In); const int *Dimensions = mxGetDimensions(In); switch (nDimensions) { case 1: return 1; // It is just a spot color case 2: return Dimensions[0]; // A scanline case 3: return Dimensions[0]*Dimensions[1]; // A image default: FatalError("Unsupported array of %d dimensions", nDimensions); return 0; } } // Allocates the output array. Copies the input array modifying the pixel // definition to match "OutputChannels". static mxArray* AllocateOutputArray(const mxArray* In, int OutputChannels) { mxArray* Out = mxDuplicateArray(In); // Make a "deep copy" of Input array int nDimensions = mxGetNumberOfDimensions(In); const int* Dimensions = mxGetDimensions(In); int InputChannels = Dimensions[nDimensions-1]; // Modify pixel size only if needed if (InputChannels != OutputChannels) { int i, NewSize; int *ModifiedDimensions = (int*) mxMalloc(nDimensions * sizeof(int)); memmove(ModifiedDimensions, Dimensions, nDimensions * sizeof(int)); ModifiedDimensions[nDimensions - 1] = OutputChannels; switch (mxGetClassID(In)) { case mxINT8_CLASS: NewSize = sizeof(char); break; case mxUINT8_CLASS: NewSize = sizeof(unsigned char); break; case mxINT16_CLASS: NewSize = sizeof(short); break; case mxUINT16_CLASS: NewSize = sizeof(unsigned short); break; default: case mxDOUBLE_CLASS: NewSize = sizeof(double); break; } // NewSize = 1; for (i=0; i < nDimensions; i++) NewSize *= ModifiedDimensions[i]; mxSetDimensions(Out, ModifiedDimensions, nDimensions); mxFree(ModifiedDimensions); mxSetPr(Out, mxRealloc(mxGetPr(Out), NewSize)); } return Out; } // Does create a format descriptor. "Bytes" is the sizeof type in bytes // // Bytes Meaning // ------ -------- // 0 Floating point (double) // 1 8-bit samples // 2 16-bit samples static cmsUInt32Number MakeFormatDescriptor(cmsColorSpaceSignature ColorSpace, int Bytes) { int IsFloat = (Bytes == 0 || Bytes == 4) ? 1 : 0; int Channels = cmsChannelsOf(ColorSpace); return FLOAT_SH(IsFloat)|COLORSPACE_SH(_cmsLCMScolorSpace(ColorSpace))|BYTES_SH(Bytes)|CHANNELS_SH(Channels)|PLANAR_SH(1); } // Opens a profile or proper built-in static cmsHPROFILE OpenProfile(const char* File) { cmsContext ContextID = 0; if (!File) return cmsCreate_sRGBProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Lab2") == 0) return cmsCreateLab2ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*Lab4") == 0) return cmsCreateLab4ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*Lab") == 0) return cmsCreateLab4ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*LabD65") == 0) { cmsCIExyY D65xyY; cmsWhitePointFromTemp( &D65xyY, 6504); return cmsCreateLab4ProfileTHR(ContextID, &D65xyY); } if (cmsstrcasecmp(File, "*XYZ") == 0) return cmsCreateXYZProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Gray22") == 0) { cmsToneCurve* Curve = cmsBuildGamma(ContextID, 2.2); cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } if (cmsstrcasecmp(File, "*Gray30") == 0) { cmsToneCurve* Curve = cmsBuildGamma(ContextID, 3.0); cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } if (cmsstrcasecmp(File, "*srgb") == 0) return cmsCreate_sRGBProfileTHR(ContextID); if (cmsstrcasecmp(File, "*null") == 0) return cmsCreateNULLProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Lin2222") == 0) { cmsToneCurve* Gamma = cmsBuildGamma(0, 2.2); cmsToneCurve* Gamma4[4]; cmsHPROFILE hProfile; Gamma4[0] = Gamma4[1] = Gamma4[2] = Gamma4[3] = Gamma; hProfile = cmsCreateLinearizationDeviceLink(cmsSigCmykData, Gamma4); cmsFreeToneCurve(Gamma); return hProfile; } return cmsOpenProfileFromFileTHR(ContextID, File, "r"); } static cmsUInt32Number GetFlags() { cmsUInt32Number dwFlags = 0; switch (PrecalcMode) { case 0: dwFlags = cmsFLAGS_NOOPTIMIZE; break; case 2: dwFlags = cmsFLAGS_HIGHRESPRECALC; break; case 3: dwFlags = cmsFLAGS_LOWRESPRECALC; break; case 1: break; default: FatalError("Unknown precalculation mode '%d'", PrecalcMode); } if (BlackPointCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; return dwFlags; } // Create transforms static void OpenTransforms(int argc, char *argv[]) { cmsUInt32Number dwIn, dwOut, dwFlags; if (lMultiProfileChain) { int i; cmsHTRANSFORM hTmp; nProfiles = argc - xoptind; for (i=0; i < nProfiles; i++) { hProfiles[i] = OpenProfile(argv[i+xoptind]); } // Create a temporary devicelink hTmp = cmsCreateMultiprofileTransform(hProfiles, nProfiles, 0, 0, Intent, GetFlags()); hInput = cmsTransform2DeviceLink(hTmp, 4.2, 0); hOutput = NULL; cmsDeleteTransform(hTmp); InputColorSpace = cmsGetColorSpace(hInput); OutputColorSpace = cmsGetPCS(hInput); lIsDeviceLink = TRUE; } else if (lIsDeviceLink) { hInput = cmsOpenProfileFromFile(cInProf, "r"); hOutput = NULL; InputColorSpace = cmsGetColorSpace(hInput); OutputColorSpace = cmsGetPCS(hInput); } else { hInput = OpenProfile(cInProf); hOutput = OpenProfile(cOutProf); InputColorSpace = cmsGetColorSpace(hInput); OutputColorSpace = cmsGetColorSpace(hOutput); if (cmsGetDeviceClass(hInput) == cmsSigLinkClass || cmsGetDeviceClass(hOutput) == cmsSigLinkClass) FatalError("Use %cl flag for devicelink profiles!\n", SW); } /* if (Verbose) { mexPrintf("From: %s\n", cmsTakeProductName(hInput)); if (hOutput) mexPrintf("To : %s\n\n", cmsTakeProductName(hOutput)); } */ OutputChannels = cmsChannelsOf(OutputColorSpace); InputChannels = cmsChannelsOf(InputColorSpace); dwIn = MakeFormatDescriptor(InputColorSpace, nBytesDepth); dwOut = MakeFormatDescriptor(OutputColorSpace, nBytesDepth); dwFlags = GetFlags(); if (cProofing != NULL) { hProof = OpenProfile(cProofing); dwFlags |= cmsFLAGS_SOFTPROOFING; } hColorTransform = cmsCreateProofingTransform(hInput, dwIn, hOutput, dwOut, hProof, Intent, ProofingIntent, dwFlags); } static void ApplyTransforms(const mxArray *In, mxArray *Out) { double *Input = mxGetPr(In); double *Output = mxGetPr(Out); size_t nPixels = GetNumberOfPixels(In);; cmsDoTransform(hColorTransform, Input, Output, nPixels ); } static void CloseTransforms(void) { int i; if (hColorTransform) cmsDeleteTransform(hColorTransform); if (hInput) cmsCloseProfile(hInput); if (hOutput) cmsCloseProfile(hOutput); if (hProof) cmsCloseProfile(hProof); for (i=0; i < nProfiles; i++) cmsCloseProfile(hProfiles[i]); hColorTransform = NULL; hInput = NULL; hOutput = NULL; hProof = NULL; } static void HandleSwitches(int argc, char *argv[]) { int s; xoptinit(); while ((s = xgetopt(argc, argv,"C:c:VvbBI:i:O:o:T:t:L:l:r:r:P:p:Mm")) != EOF) { switch (s){ case 'b': case 'B': BlackPointCompensation = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 3) FatalError("Unknown precalc mode '%d'", PrecalcMode); break; case 'v': case 'V': Verbose = TRUE; break; case 'i': case 'I': if (lIsDeviceLink) FatalError("Device-link already specified"); cInProf = xoptarg; break; case 'o': case 'O': if (lIsDeviceLink) FatalError("Device-link already specified"); cOutProf = xoptarg; break; case 't': case 'T': Intent = atoi(xoptarg); // if (Intent > 3) Intent = 3; if (Intent < 0) Intent = 0; break; case 'l': case 'L': cInProf = xoptarg; lIsDeviceLink = TRUE; break; case 'p': case 'P': cProofing = xoptarg; break; case 'r': case 'R': ProofingIntent = atoi(xoptarg); // if (ProofingIntent > 3) ProofingIntent = 3; if (ProofingIntent < 0) ProofingIntent = 0; break; case 'm': case 'M': lMultiProfileChain = TRUE; break; default: FatalError("Unknown option."); } } // For multiprofile, need to specify -m if (xoptind < argc) { if (!lMultiProfileChain) FatalError("Use %cm for multiprofile transforms", SW); } } // -------------------------------------------------- Print some fancy help static void PrintHelp(void) { mexPrintf("(MX) little cms ColorSpace conversion tool - v2.0\n\n"); mexPrintf("usage: icctrans (mVar, flags)\n\n"); mexPrintf("mVar : Matlab array.\n"); mexPrintf("flags: a string containing one or more of following options.\n\n"); mexPrintf("\t%cv - Verbose\n", SW); mexPrintf("\t%ci - Input profile (defaults to sRGB)\n", SW); mexPrintf("\t%co - Output profile (defaults to sRGB)\n", SW); mexPrintf("\t%cl - Transform by device-link profile\n", SW); mexPrintf("\t%cm - Apply multiprofile chain\n", SW); mexPrintf("\t%ct - Rendering intent\n", SW); mexPrintf("\t%cb - Black point compensation\n", SW); mexPrintf("\t%cc<0,1,2,3> - Optimize transform (0=Off, 1=Normal, 2=Hi-res, 3=Lo-Res) [defaults to 1]\n", SW); mexPrintf("\t%cp - Soft proof profile\n", SW); mexPrintf("\t%cr<0,1,2,3> - Soft proof intent\n", SW); mexPrintf("\nYou can use following built-ins as profiles:\n\n"); mexPrintf("\t*Lab2 -- D50-based v2 CIEL*a*b\n" "\t*Lab4 -- D50-based v4 CIEL*a*b\n" "\t*Lab -- D50-based v4 CIEL*a*b\n" "\t*XYZ -- CIE XYZ (PCS)\n" "\t*sRGB -- IEC6 1996-2.1 sRGB color space\n" "\t*Gray22 - Monochrome of Gamma 2.2\n" "\t*Gray30 - Monochrome of Gamma 3.0\n" "\t*null - Monochrome black for all input\n" "\t*Lin2222- CMYK linearization of gamma 2.2 on each channel\n\n"); mexPrintf("For suggestions, comments, bug reports etc. send mail to info@littlecms.com\n\n"); } // Main entry point void mexFunction( int nlhs, // Number of left hand side (output) arguments mxArray *plhs[], // Array of left hand side arguments int nrhs, // Number of right hand side (input) arguments const mxArray *prhs[] // Array of right hand side arguments ) { char CommandLine[4096+1]; char *pt, *argv[128]; int argc = 1; if (nrhs != 2) { PrintHelp(); return; } if(nlhs > 1) { FatalError("Too many output arguments."); } // Setup error handler cmsSetLogErrorHandler(MatLabErrorHandler); // Defaults Verbose = 0; cInProf = NULL; cOutProf = NULL; cProofing = NULL; lMultiProfileChain = FALSE; nProfiles = 0; Intent = INTENT_PERCEPTUAL; ProofingIntent = INTENT_ABSOLUTE_COLORIMETRIC; PrecalcMode = 1; BlackPointCompensation = FALSE; lIsDeviceLink = FALSE; // Check types. Fist parameter is array of values, second parameter is command line if (!mxIsNumeric(prhs[0])) FatalError("Type mismatch on argument 1 -- Must be numeric"); if (!mxIsChar(prhs[1])) FatalError("Type mismatch on argument 2 -- Must be string"); // Unpack string to command line buffer if (mxGetString(prhs[1], CommandLine, 4096)) FatalError("Cannot unpack command string"); // Separate to argv[] convention argv[0] = NULL; for (pt = strtok(CommandLine, " "); pt; pt = strtok(NULL, " ")) { argv[argc++] = pt; } // Parse arguments HandleSwitches(argc, argv); nBytesDepth = SizeOfArrayType(prhs[0]); OpenTransforms(argc, argv); plhs[0] = AllocateOutputArray(prhs[0], OutputChannels); ApplyTransforms(prhs[0], plhs[0]); CloseTransforms(); // Done! } lcms2-2.6/utils/transicc/0000755002406300000240000000000012311617072014674 5ustar mariamauserslcms2-2.6/utils/transicc/transicc.10000644002406300000240000000235212311617072016566 0ustar mariamausers.\"Shiju P. Nair September 30, 2004 .TH TRANSICC 1 "MAY 30, 2011" .SH NAME icctrans - little cms ColorSpace conversion calculator. .SH SYNOPSIS .B icctrans .RI [ options ] .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B icctrans is lcms ColorSpace conversion calculator. .SH OPTIONS .TP .B \-% use percent % of ink. .TP .B \-b Black point compensation. .TP .B \-c <0,1,2,3> Precalculates transform. (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1] .TP .BI \-i\ profile Input profile (defaults to sRGB). .TP .B \-l Transform by device-link profile. .TP .B \-n Terse output, intended for pipe usage. .TP .BI \-o\ profile .p Output profile (defaults to sRGB). .TP .B \-t <0,1,2,3> Intent (0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute). .TP .B \-v Verbose. .TP .B \-w Use 16 bits. .TP .B \-x Hexadecimal. .TP You can use '*Lab' and '*xyz' as built-in profiles. .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com. .SH SEE ALSO .BR jpegicc (1), .BR tifficc (1), .BR icc2ps (1), .BR icclink (1), .BR wtpt (1) .SH AUTHOR This manual page was written by Shiju p. Nair , for the Debian project. lcms2-2.6/utils/transicc/Makefile.in0000644002406300000240000005165712311617072016757 0ustar mariamausers# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = transicc$(EXEEXT) subdir = utils/transicc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_transicc_OBJECTS = transicc.$(OBJEXT) xgetopt.$(OBJEXT) \ vprf.$(OBJEXT) transicc_OBJECTS = $(am_transicc_OBJECTS) transicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la transicc_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(transicc_LDFLAGS) \ $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(transicc_SOURCES) DIST_SOURCES = $(transicc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common transicc_LDADD = $(top_builddir)/src/liblcms2.la transicc_LDFLAGS = @LDFLAGS@ transicc_SOURCES = transicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h transicc_MANS = transicc.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/transicc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign utils/transicc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list transicc$(EXEEXT): $(transicc_OBJECTS) $(transicc_DEPENDENCIES) $(EXTRA_transicc_DEPENDENCIES) @rm -f transicc$(EXEEXT) $(transicc_LINK) $(transicc_OBJECTS) $(transicc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transicc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vprf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgetopt.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< xgetopt.o: ../common/xgetopt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgetopt.o -MD -MP -MF $(DEPDIR)/xgetopt.Tpo -c -o xgetopt.o `test -f '../common/xgetopt.c' || echo '$(srcdir)/'`../common/xgetopt.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgetopt.Tpo $(DEPDIR)/xgetopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/xgetopt.c' object='xgetopt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgetopt.o `test -f '../common/xgetopt.c' || echo '$(srcdir)/'`../common/xgetopt.c xgetopt.obj: ../common/xgetopt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgetopt.obj -MD -MP -MF $(DEPDIR)/xgetopt.Tpo -c -o xgetopt.obj `if test -f '../common/xgetopt.c'; then $(CYGPATH_W) '../common/xgetopt.c'; else $(CYGPATH_W) '$(srcdir)/../common/xgetopt.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgetopt.Tpo $(DEPDIR)/xgetopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/xgetopt.c' object='xgetopt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgetopt.obj `if test -f '../common/xgetopt.c'; then $(CYGPATH_W) '../common/xgetopt.c'; else $(CYGPATH_W) '$(srcdir)/../common/xgetopt.c'; fi` vprf.o: ../common/vprf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vprf.o -MD -MP -MF $(DEPDIR)/vprf.Tpo -c -o vprf.o `test -f '../common/vprf.c' || echo '$(srcdir)/'`../common/vprf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vprf.Tpo $(DEPDIR)/vprf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/vprf.c' object='vprf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vprf.o `test -f '../common/vprf.c' || echo '$(srcdir)/'`../common/vprf.c vprf.obj: ../common/vprf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vprf.obj -MD -MP -MF $(DEPDIR)/vprf.Tpo -c -o vprf.obj `if test -f '../common/vprf.c'; then $(CYGPATH_W) '../common/vprf.c'; else $(CYGPATH_W) '$(srcdir)/../common/vprf.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vprf.Tpo $(DEPDIR)/vprf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/vprf.c' object='vprf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vprf.obj `if test -f '../common/vprf.c'; then $(CYGPATH_W) '../common/vprf.c'; else $(CYGPATH_W) '$(srcdir)/../common/vprf.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lcms2-2.6/utils/transicc/transicc.c0000644002406300000240000010352612311617072016655 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "utils.h" #ifndef _MSC_VER # include #endif #ifdef CMS_IS_WINDOWS_ # include #endif #define MAX_INPUT_BUFFER 4096 // Global options static cmsBool InHexa = FALSE; static cmsBool GamutCheck = FALSE; static cmsBool Width16 = FALSE; static cmsBool BlackPointCompensation = FALSE; static cmsBool lIsDeviceLink = FALSE; static cmsBool lQuantize = FALSE; static cmsBool lIsFloat = TRUE; static cmsUInt32Number Intent = INTENT_PERCEPTUAL; static cmsUInt32Number ProofingIntent = INTENT_PERCEPTUAL; static int PrecalcMode = 0; // -------------------------------------------------------------- static char *cInProf = NULL; static char *cOutProf = NULL; static char *cProofing = NULL; static char *IncludePart = NULL; static cmsHANDLE hIT8in = NULL; // CGATS input static cmsHANDLE hIT8out = NULL; // CGATS output static char CGATSPatch[1024]; // Actual Patch Name static char CGATSoutFilename[cmsMAX_PATH]; static int nMaxPatches; static cmsHTRANSFORM hTrans, hTransXYZ, hTransLab; static cmsBool InputNamedColor = FALSE; static cmsColorSpaceSignature InputColorSpace, OutputColorSpace; static cmsNAMEDCOLORLIST* InputColorant = NULL; static cmsNAMEDCOLORLIST* OutputColorant = NULL; static cmsFloat64Number InputRange, OutputRange; // isatty replacement #ifdef _MSC_VER #define xisatty(x) _isatty( _fileno( (x) ) ) #else #define xisatty(x) isatty( fileno( (x) ) ) #endif //--------------------------------------------------------------------------------------------------- // Print usage to stderr static void Help(void) { fprintf(stderr, "usage: transicc [flags] [CGATS input] [CGATS output]\n\n"); fprintf(stderr, "flags:\n\n"); fprintf(stderr, "%cv<0..3> - Verbosity level\n", SW); fprintf(stderr, "%ce[op] - Encoded representation of numbers\n", SW); fprintf(stderr, "\t%cw - use 16 bits\n", SW); fprintf(stderr, "\t%cx - Hexadecimal\n", SW); fprintf(stderr, "%cq - Quantize CGATS to 8 bits\n\n", SW); fprintf(stderr, "%ci - Input profile (defaults to sRGB)\n", SW); fprintf(stderr, "%co - Output profile (defaults to sRGB)\n", SW); fprintf(stderr, "%cl - Transform by device-link profile\n", SW); fprintf(stderr, "\nYou can use '*Lab', '*xyz' and others as built-in profiles\n\n"); PrintRenderingIntents(); fprintf(stderr, "\n"); fprintf(stderr, "%cd<0..1> - Observer adaptation state (abs.col. only)\n\n", SW); fprintf(stderr, "%cb - Black point compensation\n", SW); fprintf(stderr, "%cc<0,1,2,3> Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes)\n\n", SW); fprintf(stderr, "%cn - Terse output, intended for pipe usage\n", SW); fprintf(stderr, "%cp - Soft proof profile\n", SW); fprintf(stderr, "%cm<0,1,2,3> - Soft proof intent\n", SW); fprintf(stderr, "%cg - Marks out-of-gamut colors on softproof\n\n", SW); fprintf(stderr, "This program is intended to be a demo of the little cms\n" "engine. Both lcms and this program are freeware. You can\n" "obtain both in source code at http://www.littlecms.com\n" "For suggestions, comments, bug reports etc. send mail to\n" "info@littlecms.com\n\n"); } // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s = xgetopt(argc, argv, "bBC:c:d:D:eEgGI:i:L:l:m:M:nNO:o:p:P:QqT:t:V:v:WwxX!:")) != EOF) { switch (s){ case '!': IncludePart = xoptarg; break; case 'b': case 'B': BlackPointCompensation = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 3) FatalError("Unknown precalc mode '%d'", PrecalcMode); break; case 'd': case 'D': { cmsFloat64Number ObserverAdaptationState = atof(xoptarg); if (ObserverAdaptationState < 0 || ObserverAdaptationState > 1.0) FatalError("Adaptation states should be between 0 and 1"); cmsSetAdaptationState(ObserverAdaptationState); } break; case 'e': case 'E': lIsFloat = FALSE; break; case 'g': case 'G': GamutCheck = TRUE; break; case 'i': case 'I': if (lIsDeviceLink) FatalError("icctrans: Device-link already specified"); cInProf = xoptarg; break; case 'l': case 'L': cInProf = xoptarg; lIsDeviceLink = TRUE; break; // No extra intents for proofing case 'm': case 'M': ProofingIntent = atoi(xoptarg); if (ProofingIntent > 3) FatalError("Unknown Proofing Intent '%d'", ProofingIntent); break; // For compatibility case 'n': case 'N': Verbose = 0; break; // Output profile case 'o': case 'O': if (lIsDeviceLink) FatalError("icctrans: Device-link already specified"); cOutProf = xoptarg; break; // Proofing profile case 'p': case 'P': cProofing = xoptarg; break; // Quantize to 16 bits case 'q': case 'Q': lQuantize = TRUE; break; // The intent case 't': case 'T': Intent = atoi(xoptarg); break; // Verbosity level case 'V': case 'v': Verbose = atoi(xoptarg); if (Verbose < 0 || Verbose > 3) { FatalError("Unknown verbosity level '%d'", Verbose); } break; // Wide (16 bits) case 'W': case 'w': Width16 = TRUE; break; // Hexadecimal case 'x': case 'X': InHexa = TRUE; break; default: FatalError("Unknown option - run without args to see valid ones.\n"); } } // If output CGATS involved, switch to float if ((argc - xoptind) > 2) { lIsFloat = TRUE; } } static void SetRange(cmsFloat64Number range, cmsBool IsInput) { if (IsInput) InputRange = range; else OutputRange = range; } // Populate a named color list with usual component names. // I am using the first Colorant channel to store the range, but it works since // this space is not used anyway. static cmsNAMEDCOLORLIST* ComponentNames(cmsColorSpaceSignature space, cmsBool IsInput) { cmsNAMEDCOLORLIST* out; int i, n; char Buffer[cmsMAX_PATH]; out = cmsAllocNamedColorList(0, 12, cmsMAXCHANNELS, "", ""); if (out == NULL) return NULL; switch (space) { case cmsSigXYZData: SetRange(100, IsInput); cmsAppendNamedColor(out, "X", NULL, NULL); cmsAppendNamedColor(out, "Y", NULL, NULL); cmsAppendNamedColor(out, "Z", NULL, NULL); break; case cmsSigLabData: SetRange(1, IsInput); cmsAppendNamedColor(out, "L*", NULL, NULL); cmsAppendNamedColor(out, "a*", NULL, NULL); cmsAppendNamedColor(out, "b*", NULL, NULL); break; case cmsSigLuvData: SetRange(1, IsInput); cmsAppendNamedColor(out, "L", NULL, NULL); cmsAppendNamedColor(out, "u", NULL, NULL); cmsAppendNamedColor(out, "v", NULL, NULL); break; case cmsSigYCbCrData: SetRange(255, IsInput); cmsAppendNamedColor(out, "Y", NULL, NULL ); cmsAppendNamedColor(out, "Cb", NULL, NULL); cmsAppendNamedColor(out, "Cr", NULL, NULL); break; case cmsSigYxyData: SetRange(1, IsInput); cmsAppendNamedColor(out, "Y", NULL, NULL); cmsAppendNamedColor(out, "x", NULL, NULL); cmsAppendNamedColor(out, "y", NULL, NULL); break; case cmsSigRgbData: SetRange(255, IsInput); cmsAppendNamedColor(out, "R", NULL, NULL); cmsAppendNamedColor(out, "G", NULL, NULL); cmsAppendNamedColor(out, "B", NULL, NULL); break; case cmsSigGrayData: SetRange(255, IsInput); cmsAppendNamedColor(out, "G", NULL, NULL); break; case cmsSigHsvData: SetRange(255, IsInput); cmsAppendNamedColor(out, "H", NULL, NULL); cmsAppendNamedColor(out, "s", NULL, NULL); cmsAppendNamedColor(out, "v", NULL, NULL); break; case cmsSigHlsData: SetRange(255, IsInput); cmsAppendNamedColor(out, "H", NULL, NULL); cmsAppendNamedColor(out, "l", NULL, NULL); cmsAppendNamedColor(out, "s", NULL, NULL); break; case cmsSigCmykData: SetRange(1, IsInput); cmsAppendNamedColor(out, "C", NULL, NULL); cmsAppendNamedColor(out, "M", NULL, NULL); cmsAppendNamedColor(out, "Y", NULL, NULL); cmsAppendNamedColor(out, "K", NULL, NULL); break; case cmsSigCmyData: SetRange(1, IsInput); cmsAppendNamedColor(out, "C", NULL, NULL); cmsAppendNamedColor(out, "M", NULL, NULL); cmsAppendNamedColor(out, "Y", NULL, NULL); break; default: SetRange(1, IsInput); n = cmsChannelsOf(space); for (i=0; i < n; i++) { sprintf(Buffer, "Channel #%d", i + 1); cmsAppendNamedColor(out, Buffer, NULL, NULL); } } return out; } // Creates all needed color transforms static cmsBool OpenTransforms(void) { cmsHPROFILE hInput, hOutput, hProof; cmsUInt32Number dwIn, dwOut, dwFlags; cmsNAMEDCOLORLIST* List; int i; // We don't need cache dwFlags = cmsFLAGS_NOCACHE; if (lIsDeviceLink) { hInput = OpenStockProfile(0, cInProf); if (hInput == NULL) return FALSE; hOutput = NULL; hProof = NULL; if (cmsGetDeviceClass(hInput) == cmsSigNamedColorClass) { OutputColorSpace = cmsGetColorSpace(hInput); InputColorSpace = cmsGetPCS(hInput); } else { InputColorSpace = cmsGetColorSpace(hInput); OutputColorSpace = cmsGetPCS(hInput); } // Read colorant tables if present if (cmsIsTag(hInput, cmsSigColorantTableTag)) { List = cmsReadTag(hInput, cmsSigColorantTableTag); InputColorant = cmsDupNamedColorList(List); InputRange = 1; } else InputColorant = ComponentNames(InputColorSpace, TRUE); if (cmsIsTag(hInput, cmsSigColorantTableOutTag)){ List = cmsReadTag(hInput, cmsSigColorantTableOutTag); OutputColorant = cmsDupNamedColorList(List); OutputRange = 1; } else OutputColorant = ComponentNames(OutputColorSpace, FALSE); } else { hInput = OpenStockProfile(0, cInProf); if (hInput == NULL) return FALSE; hOutput = OpenStockProfile(0, cOutProf); if (hOutput == NULL) return FALSE; hProof = NULL; if (cmsGetDeviceClass(hInput) == cmsSigLinkClass || cmsGetDeviceClass(hOutput) == cmsSigLinkClass) FatalError("Use %cl flag for devicelink profiles!\n", SW); InputColorSpace = cmsGetColorSpace(hInput); OutputColorSpace = cmsGetColorSpace(hOutput); // Read colorant tables if present if (cmsIsTag(hInput, cmsSigColorantTableTag)) { List = cmsReadTag(hInput, cmsSigColorantTableTag); InputColorant = cmsDupNamedColorList(List); if (cmsNamedColorCount(InputColorant) <= 3) SetRange(255, TRUE); else SetRange(1, TRUE); // Inks are already divided by 100 in the formatter } else InputColorant = ComponentNames(InputColorSpace, TRUE); if (cmsIsTag(hOutput, cmsSigColorantTableTag)){ List = cmsReadTag(hOutput, cmsSigColorantTableTag); OutputColorant = cmsDupNamedColorList(List); if (cmsNamedColorCount(OutputColorant) <= 3) SetRange(255, FALSE); else SetRange(1, FALSE); // Inks are already divided by 100 in the formatter } else OutputColorant = ComponentNames(OutputColorSpace, FALSE); if (cProofing != NULL) { hProof = OpenStockProfile(0, cProofing); if (hProof == NULL) return FALSE; dwFlags |= cmsFLAGS_SOFTPROOFING; } } // Print information on profiles if (Verbose > 2) { printf("Profile:\n"); PrintProfileInformation(hInput); if (hOutput) { printf("Output profile:\n"); PrintProfileInformation(hOutput); } if (hProof != NULL) { printf("Proofing profile:\n"); PrintProfileInformation(hProof); } } // Input is always in floating point dwIn = cmsFormatterForColorspaceOfProfile(hInput, 0, TRUE); if (lIsDeviceLink) { dwOut = cmsFormatterForPCSOfProfile(hInput, lIsFloat ? 0 : 2, lIsFloat); } else { // 16 bits or floating point (only on output) dwOut = cmsFormatterForColorspaceOfProfile(hOutput, lIsFloat ? 0 : 2, lIsFloat); } // For named color, there is a specialized formatter if (cmsGetDeviceClass(hInput) == cmsSigNamedColorClass) { dwOut = dwIn; dwIn = TYPE_NAMED_COLOR_INDEX; InputNamedColor = TRUE; } // Precision mode switch (PrecalcMode) { case 0: dwFlags |= cmsFLAGS_NOOPTIMIZE; break; case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; case 3: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; case 1: break; default: FatalError("Unknown precalculation mode '%d'", PrecalcMode); } if (BlackPointCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; if (GamutCheck) { cmsUInt16Number Alarm[cmsMAXCHANNELS]; if (hProof == NULL) FatalError("I need proofing profile -p for gamut checking!"); for (i=0; i < cmsMAXCHANNELS; i++) Alarm[i] = 0xFFFF; cmsSetAlarmCodes(Alarm); dwFlags |= cmsFLAGS_GAMUTCHECK; } // The main transform hTrans = cmsCreateProofingTransform(hInput, dwIn, hOutput, dwOut, hProof, Intent, ProofingIntent, dwFlags); if (hProof) cmsCloseProfile(hProof); if (hTrans == NULL) return FALSE; // PCS Dump if requested hTransXYZ = NULL; hTransLab = NULL; if (hOutput && Verbose > 1) { cmsHPROFILE hXYZ = cmsCreateXYZProfile(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); hTransXYZ = cmsCreateTransform(hInput, dwIn, hXYZ, lIsFloat ? TYPE_XYZ_DBL : TYPE_XYZ_16, Intent, cmsFLAGS_NOCACHE); if (hTransXYZ == NULL) return FALSE; hTransLab = cmsCreateTransform(hInput, dwIn, hLab, lIsFloat? TYPE_Lab_DBL : TYPE_Lab_16, Intent, cmsFLAGS_NOCACHE); if (hTransLab == NULL) return FALSE; cmsCloseProfile(hXYZ); cmsCloseProfile(hLab); } if (hInput) cmsCloseProfile(hInput); if (hOutput) cmsCloseProfile(hOutput); return TRUE; } // Free open resources static void CloseTransforms(void) { if (InputColorant) cmsFreeNamedColorList(InputColorant); if (OutputColorant) cmsFreeNamedColorList(OutputColorant); if (hTrans) cmsDeleteTransform(hTrans); if (hTransLab) cmsDeleteTransform(hTransLab); if (hTransXYZ) cmsDeleteTransform(hTransXYZ); } // --------------------------------------------------------------------------------------------------- // Get input from user static void GetLine(char* Buffer, const char* frm, ...) { int res; va_list args; va_start(args, frm); do { if (xisatty(stdin)) vfprintf(stderr, frm, args); res = scanf("%4095s", Buffer); if (res < 0 || toupper(Buffer[0]) == 'Q') { // Quit? CloseTransforms(); if (xisatty(stdin)) fprintf(stderr, "Done.\n"); exit(0); } } while (res == 0); va_end(args); } // Print a value which is given in double floating point static void PrintFloatResults(cmsFloat64Number Value[]) { cmsUInt32Number i, n; char ChannelName[cmsMAX_PATH]; cmsFloat64Number v; n = cmsChannelsOf(OutputColorSpace); for (i=0; i < n; i++) { if (OutputColorant != NULL) { cmsNamedColorInfo(OutputColorant, i, ChannelName, NULL, NULL, NULL, NULL); } else { OutputRange = 1; sprintf(ChannelName, "Channel #%u", i + 1); } v = (cmsFloat64Number) Value[i]* OutputRange; if (lQuantize) v = floor(v + 0.5); if (Verbose <= 0) printf("%.4f ", v); else printf("%s=%.4f ", ChannelName, v); } printf("\n"); } // Get a named-color index static cmsUInt16Number GetIndex(void) { char Buffer[4096], Name[40], Prefix[40], Suffix[40]; int index, max; const cmsNAMEDCOLORLIST* NamedColorList; NamedColorList = cmsGetNamedColorList(hTrans); if (NamedColorList == NULL) return 0; max = cmsNamedColorCount(NamedColorList)-1; GetLine(Buffer, "Color index (0..%d)? ", max); index = atoi(Buffer); if (index > max) FatalError("Named color %d out of range!", index); cmsNamedColorInfo(NamedColorList, index, Name, Prefix, Suffix, NULL, NULL); printf("\n%s %s %s\n", Prefix, Name, Suffix); return (cmsUInt16Number) index; } // Read values from a text file or terminal static void TakeFloatValues(cmsFloat64Number Float[]) { cmsUInt32Number i, n; char ChannelName[cmsMAX_PATH]; char Buffer[cmsMAX_PATH]; if (xisatty(stdin)) fprintf(stderr, "\nEnter values, 'q' to quit\n"); if (InputNamedColor) { // This is named color index, which is always cmsUInt16Number cmsUInt16Number index = GetIndex(); memcpy(Float, &index, sizeof(cmsUInt16Number)); return; } n = cmsChannelsOf(InputColorSpace); for (i=0; i < n; i++) { if (InputColorant) { cmsNamedColorInfo(InputColorant, i, ChannelName, NULL, NULL, NULL, NULL); } else { InputRange = 1; sprintf(ChannelName, "Channel #%u", i+1); } GetLine(Buffer, "%s? ", ChannelName); Float[i] = (cmsFloat64Number) atof(Buffer) / InputRange; } if (xisatty(stdin)) fprintf(stderr, "\n"); } static void PrintPCSFloat(cmsFloat64Number Input[]) { if (Verbose > 1 && hTransXYZ && hTransLab) { cmsCIEXYZ XYZ = { 0, 0, 0 }; cmsCIELab Lab = { 0, 0, 0 }; if (hTransXYZ) cmsDoTransform(hTransXYZ, Input, &XYZ, 1); if (hTransLab) cmsDoTransform(hTransLab, Input, &Lab, 1); printf("[PCS] Lab=(%.4f,%.4f,%.4f) XYZ=(%.4f,%.4f,%.4f)\n", Lab.L, Lab.a, Lab.b, XYZ.X * 100.0, XYZ.Y * 100.0, XYZ.Z * 100.0); } } // ----------------------------------------------------------------------------------------------- static void PrintEncodedResults(cmsUInt16Number Encoded[]) { cmsUInt32Number i, n; char ChannelName[cmsMAX_PATH]; cmsUInt32Number v; n = cmsChannelsOf(OutputColorSpace); for (i=0; i < n; i++) { if (OutputColorant != NULL) { cmsNamedColorInfo(OutputColorant, i, ChannelName, NULL, NULL, NULL, NULL); } else { sprintf(ChannelName, "Channel #%u", i + 1); } if (Verbose > 0) printf("%s=", ChannelName); v = Encoded[i]; if (InHexa) { if (Width16) printf("0x%04X ", (int) floor(v + .5)); else printf("0x%02X ", (int) floor(v / 257. + .5)); } else { if (Width16) printf("%d ", (int) floor(v + .5)); else printf("%d ", (int) floor(v / 257. + .5)); } } printf("\n"); } // Print XYZ/Lab values on verbose mode static void PrintPCSEncoded(cmsFloat64Number Input[]) { if (Verbose > 1 && hTransXYZ && hTransLab) { cmsUInt16Number XYZ[3], Lab[3]; if (hTransXYZ) cmsDoTransform(hTransXYZ, Input, XYZ, 1); if (hTransLab) cmsDoTransform(hTransLab, Input, Lab, 1); printf("[PCS] Lab=(0x%04X,0x%04X,0x%04X) XYZ=(0x%04X,0x%04X,0x%04X)\n", Lab[0], Lab[1], Lab[2], XYZ[0], XYZ[1], XYZ[2]); } } // -------------------------------------------------------------------------------------- // Take a value from IT8 and scale it accordly to fill a cmsUInt16Number (0..FFFF) static cmsFloat64Number GetIT8Val(const char* Name, cmsFloat64Number Max) { const char* Val = cmsIT8GetData(hIT8in, CGATSPatch, Name); if (Val == NULL) FatalError("Field '%s' not found", Name); return atof(Val) / Max; } // Read input values from CGATS file. static void TakeCGATSValues(int nPatch, cmsFloat64Number Float[]) { // At first take the name if SAMPLE_ID is present if (cmsIT8GetPatchName(hIT8in, nPatch, CGATSPatch) == NULL) { FatalError("Sorry, I need 'SAMPLE_ID' on input CGATS to operate."); } // Special handling for named color profiles. // Lookup the name in the names database (the transform) if (InputNamedColor) { const cmsNAMEDCOLORLIST* NamedColorList; int index; NamedColorList = cmsGetNamedColorList(hTrans); if (NamedColorList == NULL) FatalError("Malformed named color profile"); index = cmsNamedColorIndex(NamedColorList, CGATSPatch); if (index < 0) FatalError("Named color '%s' not found in the profile", CGATSPatch); Float[0] = index; return; } // Color is not a spot color, proceed. switch (InputColorSpace) { // Encoding should follow CGATS specification. case cmsSigXYZData: Float[0] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "XYZ_X") / 100.0; Float[1] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "XYZ_Y") / 100.0; Float[2] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "XYZ_Z") / 100.0; break; case cmsSigLabData: Float[0] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "LAB_L"); Float[1] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "LAB_A"); Float[2] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "LAB_B"); break; case cmsSigRgbData: Float[0] = GetIT8Val("RGB_R", 255.0); Float[1] = GetIT8Val("RGB_G", 255.0); Float[2] = GetIT8Val("RGB_B", 255.0); break; case cmsSigGrayData: Float[0] = GetIT8Val("GRAY", 255.0); break; case cmsSigCmykData: Float[0] = GetIT8Val("CMYK_C", 1.0); Float[1] = GetIT8Val("CMYK_M", 1.0); Float[2] = GetIT8Val("CMYK_Y", 1.0); Float[3] = GetIT8Val("CMYK_K", 1.0); break; case cmsSigCmyData: Float[0] = GetIT8Val("CMY_C", 1.0); Float[1] = GetIT8Val("CMY_M", 1.0); Float[2] = GetIT8Val("CMY_Y", 1.0); break; case cmsSig1colorData: case cmsSig2colorData: case cmsSig3colorData: case cmsSig4colorData: case cmsSig5colorData: case cmsSig6colorData: case cmsSig7colorData: case cmsSig8colorData: case cmsSig9colorData: case cmsSig10colorData: case cmsSig11colorData: case cmsSig12colorData: case cmsSig13colorData: case cmsSig14colorData: case cmsSig15colorData: { cmsUInt32Number i, n; n = cmsChannelsOf(InputColorSpace); for (i=0; i < n; i++) { char Buffer[255]; sprintf(Buffer, "%uCLR_%u", n, i+1); Float[i] = GetIT8Val(Buffer, 100.0); } } break; default: { cmsUInt32Number i, n; n = cmsChannelsOf(InputColorSpace); for (i=0; i < n; i++) { char Buffer[255]; sprintf(Buffer, "CHAN_%u", i+1); Float[i] = GetIT8Val(Buffer, 1.0); } } } } static void SetCGATSfld(const char* Col, cmsFloat64Number Val) { if (lQuantize) Val = floor(Val + 0.5); if (!cmsIT8SetDataDbl(hIT8out, CGATSPatch, Col, Val)) { FatalError("couldn't set '%s' on output cgats '%s'", Col, CGATSoutFilename); } } static void PutCGATSValues(cmsFloat64Number Float[]) { cmsIT8SetData(hIT8out, CGATSPatch, "SAMPLE_ID", CGATSPatch); switch (OutputColorSpace) { // Encoding should follow CGATS specification. case cmsSigXYZData: SetCGATSfld("XYZ_X", Float[0] * 100.0); SetCGATSfld("XYZ_Y", Float[1] * 100.0); SetCGATSfld("XYZ_Z", Float[2] * 100.0); break; case cmsSigLabData: SetCGATSfld("LAB_L", Float[0]); SetCGATSfld("LAB_A", Float[1]); SetCGATSfld("LAB_B", Float[2]); break; case cmsSigRgbData: SetCGATSfld("RGB_R", Float[0] * 255.0); SetCGATSfld("RGB_G", Float[1] * 255.0); SetCGATSfld("RGB_B", Float[2] * 255.0); break; case cmsSigGrayData: SetCGATSfld("GRAY", Float[0] * 255.0); break; case cmsSigCmykData: SetCGATSfld("CMYK_C", Float[0]); SetCGATSfld("CMYK_M", Float[1]); SetCGATSfld("CMYK_Y", Float[2]); SetCGATSfld("CMYK_K", Float[3]); break; case cmsSigCmyData: SetCGATSfld("CMY_C", Float[0]); SetCGATSfld("CMY_M", Float[1]); SetCGATSfld("CMY_Y", Float[2]); break; case cmsSig1colorData: case cmsSig2colorData: case cmsSig3colorData: case cmsSig4colorData: case cmsSig5colorData: case cmsSig6colorData: case cmsSig7colorData: case cmsSig8colorData: case cmsSig9colorData: case cmsSig10colorData: case cmsSig11colorData: case cmsSig12colorData: case cmsSig13colorData: case cmsSig14colorData: case cmsSig15colorData: { cmsUInt32Number i, n; n = cmsChannelsOf(InputColorSpace); for (i=0; i < n; i++) { char Buffer[255]; sprintf(Buffer, "%uCLR_%u", n, i+1); SetCGATSfld(Buffer, Float[i] * 100.0); } } break; default: { cmsUInt32Number i, n; n = cmsChannelsOf(InputColorSpace); for (i=0; i < n; i++) { char Buffer[255]; sprintf(Buffer, "CHAN_%u", i+1); SetCGATSfld(Buffer, Float[i]); } } } } // Create data format static void SetOutputDataFormat(void) { cmsIT8DefineDblFormat(hIT8out, "%.4g"); cmsIT8SetPropertyStr(hIT8out, "ORIGINATOR", "icctrans"); if (IncludePart != NULL) cmsIT8SetPropertyStr(hIT8out, ".INCLUDE", IncludePart); cmsIT8SetComment(hIT8out, "Data follows"); cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_SETS", nMaxPatches); switch (OutputColorSpace) { // Encoding should follow CGATS specification. case cmsSigXYZData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "XYZ_X"); cmsIT8SetDataFormat(hIT8out, 2, "XYZ_Y"); cmsIT8SetDataFormat(hIT8out, 3, "XYZ_Z"); break; case cmsSigLabData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "LAB_L"); cmsIT8SetDataFormat(hIT8out, 2, "LAB_A"); cmsIT8SetDataFormat(hIT8out, 3, "LAB_B"); break; case cmsSigRgbData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "RGB_R"); cmsIT8SetDataFormat(hIT8out, 2, "RGB_G"); cmsIT8SetDataFormat(hIT8out, 3, "RGB_B"); break; case cmsSigGrayData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 2); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "GRAY"); break; case cmsSigCmykData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 5); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "CMYK_C"); cmsIT8SetDataFormat(hIT8out, 2, "CMYK_M"); cmsIT8SetDataFormat(hIT8out, 3, "CMYK_Y"); cmsIT8SetDataFormat(hIT8out, 4, "CMYK_K"); break; case cmsSigCmyData: cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8out, 1, "CMY_C"); cmsIT8SetDataFormat(hIT8out, 2, "CMY_M"); cmsIT8SetDataFormat(hIT8out, 3, "CMY_Y"); break; case cmsSig1colorData: case cmsSig2colorData: case cmsSig3colorData: case cmsSig4colorData: case cmsSig5colorData: case cmsSig6colorData: case cmsSig7colorData: case cmsSig8colorData: case cmsSig9colorData: case cmsSig10colorData: case cmsSig11colorData: case cmsSig12colorData: case cmsSig13colorData: case cmsSig14colorData: case cmsSig15colorData: { int i, n; char Buffer[255]; n = cmsChannelsOf(OutputColorSpace); cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", n+1); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); for (i=1; i <= n; i++) { sprintf(Buffer, "%dCLR_%d", n, i); cmsIT8SetDataFormat(hIT8out, i, Buffer); } } break; default: { int i, n; char Buffer[255]; n = cmsChannelsOf(OutputColorSpace); cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", n+1); cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); for (i=1; i <= n; i++) { sprintf(Buffer, "CHAN_%d", i); cmsIT8SetDataFormat(hIT8out, i, Buffer); } } } } // Open CGATS if specified static void OpenCGATSFiles(int argc, char *argv[]) { int nParams = argc - xoptind; if (nParams >= 1) { hIT8in = cmsIT8LoadFromFile(0, argv[xoptind]); if (hIT8in == NULL) FatalError("'%s' is not recognized as a CGATS file", argv[xoptind]); nMaxPatches = (int) cmsIT8GetPropertyDbl(hIT8in, "NUMBER_OF_SETS"); } if (nParams == 2) { hIT8out = cmsIT8Alloc(NULL); SetOutputDataFormat(); strncpy(CGATSoutFilename, argv[xoptind+1], cmsMAX_PATH-1); } if (nParams > 2) FatalError("Too many CGATS files"); } // The main sink int main(int argc, char *argv[]) { cmsUInt16Number Output[cmsMAXCHANNELS]; cmsFloat64Number OutputFloat[cmsMAXCHANNELS]; cmsFloat64Number InputFloat[cmsMAXCHANNELS]; int nPatch = 0; fprintf(stderr, "LittleCMS ColorSpace conversion calculator - 4.2 [LittleCMS %2.2f]\n", LCMS_VERSION / 1000.0); InitUtils("transicc"); Verbose = 1; if (argc == 1) { Help(); return 0; } HandleSwitches(argc, argv); // Open profiles, create transforms if (!OpenTransforms()) return 1; // Open CGATS input if specified OpenCGATSFiles(argc, argv); // Main loop: read all values and convert them for(;;) { if (hIT8in != NULL) { if (nPatch >= nMaxPatches) break; TakeCGATSValues(nPatch++, InputFloat); } else { if (feof(stdin)) break; TakeFloatValues(InputFloat); } if (lIsFloat) cmsDoTransform(hTrans, InputFloat, OutputFloat, 1); else cmsDoTransform(hTrans, InputFloat, Output, 1); if (hIT8out != NULL) { PutCGATSValues(OutputFloat); } else { if (lIsFloat) { PrintFloatResults(OutputFloat); PrintPCSFloat(InputFloat); } else { PrintEncodedResults(Output); PrintPCSEncoded(InputFloat); } } } // Cleanup CloseTransforms(); if (hIT8in) cmsIT8Free(hIT8in); if (hIT8out) { cmsIT8SaveToFile(hIT8out, CGATSoutFilename); cmsIT8Free(hIT8out); } // All is ok return 0; } lcms2-2.6/utils/transicc/Makefile.am0000644002406300000240000000112612311617072016730 0ustar mariamausers# # Makefile for building lcms sample programs # Originally Written by Bob Friesenhahn, June 2003 # Additions and bugs by Marti Maria # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common bin_PROGRAMS = transicc transicc_LDADD = $(top_builddir)/src/liblcms2.la transicc_LDFLAGS = @LDFLAGS@ transicc_SOURCES = transicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h transicc_MANS = transicc.1 EXTRA_DIST = $(man_MANS) lcms2-2.6/utils/tificc/0000755002406300000240000000000012311617072014327 5ustar mariamauserslcms2-2.6/utils/tificc/tificc.10000644002406300000240000000426212311617072015656 0ustar mariamausers.\"Shiju P. Nair September 30, 2004 .TH TIFFICC 1 "October 23, 2004" .SH NAME tifficc - little cms ICC profile applier for TIFF. .SH SYNOPSIS .B tifficc .RI [ options ] " input.tif output.tif" .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B tifficc is little cms ICC profile applier for TIFF. .SH OPTIONS .TP .B \-a Handle channels > 4 as alpha. .TP .B \-b Black point compensation. .TP .B \-c <0,1,2,3> Precalculates transform. (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1] .TP .B \-e Embed destination profile. .TP .B \-g Marks out-of-gamut colors on softproof. .TP .B \-h <0,1,2> Show summary of options and examples. .TP .BI \-i\ profile Input profile (defaults to sRGB). .TP .B -k <0..400> Ink-limiting in % (CMYK only). .TP .BI \-l\ profile Transform by device-link profile. .TP .B \-m <0,1,2,3> SoftProof intent. .TP .B \-n Ignore embedded profile on input. .TP .BI \-p\ profile Soft proof profile. .TP .BI \-o\ profile .p Output profile (defaults to sRGB). .TP .BI \-s\ profile Save embedded profile as .TP .B \-t <0,1,2,3> Intent (0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute). .TP .B \-v Verbose. .TP .B \-w Wide output (generates 16 bps tiff). .TP You can also use following builtins *Lab - CIE Lab D50 based *XYZ - XYZ *adobe1998RBB - AdobeRGB *colormatchrgb - ColorMatch RGB *applergb - Apple RGB .SH EXAMPLES .nf To color correct from scanner to sRGB: tifficc -iscanner.icm in.tif out.tif To convert from monitor1 to monitor2: tifficc -imon1.icm -omon2.icm in.tif out.tif To make a CMYK separation: tifficc -oprinter.icm inrgb.tif outcmyk.tif To recover sRGB from a CMYK separation: tifficc -iprinter.icm incmyk.tif outrgb.tif To convert from CIELab TIFF to sRGB tifficc -iTiffLab8Spac.icm in.tif out.tif .fi .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com. .SH SEE ALSO .BR jpegicc (1), .BR icc2ps (1), .BR icclink (1), .BR icctrans (1), .BR wtpt (1) .SH AUTHOR This manual page was originally written by Shiju p. Nair , for the Debian project. Modified by Marti Maria to reflect further changes. lcms2-2.6/utils/tificc/tifdiff.c0000644002406300000240000004647412311617072016125 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "utils.h" #include "tiffio.h" // ------------------------------------------------------------------------ static TIFF *Tiff1, *Tiff2, *TiffDiff; static const char* TiffDiffFilename; static const char* CGATSout; typedef struct { double n, x, x2; double Min, Peak; } STAT, *LPSTAT; static STAT ColorantStat[4]; static STAT EuclideanStat; static STAT ColorimetricStat; static uint16 Channels; static cmsHPROFILE hLab; static void ConsoleWarningHandler(const char* module, const char* fmt, va_list ap) { char e[512] = { '\0' }; if (module != NULL) strcat(strcpy(e, module), ": "); vsprintf(e+strlen(e), fmt, ap); strcat(e, "."); if (Verbose) { fprintf(stderr, "\nWarning"); fprintf(stderr, " %s\n", e); fflush(stderr); } } static void ConsoleErrorHandler(const char* module, const char* fmt, va_list ap) { char e[512] = { '\0' }; if (module != NULL) strcat(strcpy(e, module), ": "); vsprintf(e+strlen(e), fmt, ap); strcat(e, "."); fprintf(stderr, "\nError"); fprintf(stderr, " %s\n", e); fflush(stderr); } static void Help() { fprintf(stderr, "Little cms TIFF compare utility. v1.0\n\n"); fprintf(stderr, "usage: tiffdiff [flags] input.tif output.tif\n"); fprintf(stderr, "\nflags:\n\n"); fprintf(stderr, "%co - Output TIFF file\n", SW); fprintf(stderr, "%cg - Output results in CGATS file\n", SW); fprintf(stderr, "\n"); fprintf(stderr, "%cv - Verbose (show warnings)\n", SW); fprintf(stderr, "%ch - This help\n", SW); fflush(stderr); exit(0); } // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s=xgetopt(argc,argv,"o:O:hHvVg:G:")) != EOF) { switch (s) { case 'v': case 'V': Verbose = TRUE; break; case 'o': case 'O': TiffDiffFilename = xoptarg; break; case 'H': case 'h': Help(); break; case 'g': case 'G': CGATSout = xoptarg; break; default: FatalError("Unknown option - run without args to see valid ones"); } } } static void ClearStatistics(LPSTAT st) { st ->n = st ->x = st->x2 = st->Peak = 0; st ->Min = 1E10; } static void AddOnePixel(LPSTAT st, double dE) { st-> x += dE; st ->x2 += (dE * dE); st->n += 1.0; if (dE > st ->Peak) st ->Peak = dE; if (dE < st ->Min) st ->Min= dE; } static double Std(LPSTAT st) { return sqrt((st->n * st->x2 - st->x * st->x) / (st->n*(st->n-1))); } static double Mean(LPSTAT st) { return st ->x/st ->n; } // Build up the pixeltype descriptor static cmsUInt32Number GetInputPixelType(TIFF *Bank) { uint16 Photometric, bps, spp, extra, PlanarConfig, *info; uint16 Compression, reverse = 0; int ColorChannels, IsPlanar = 0, pt = 0; TIFFGetField(Bank, TIFFTAG_PHOTOMETRIC, &Photometric); TIFFGetFieldDefaulted(Bank, TIFFTAG_BITSPERSAMPLE, &bps); if (bps == 1) FatalError("Sorry, bilevel TIFFs has nothig to do with ICC profiles"); if (bps != 8 && bps != 16) FatalError("Sorry, 8 or 16 bits per sample only"); TIFFGetFieldDefaulted(Bank, TIFFTAG_SAMPLESPERPIXEL, &spp); TIFFGetFieldDefaulted(Bank, TIFFTAG_PLANARCONFIG, &PlanarConfig); switch (PlanarConfig) { case PLANARCONFIG_CONTIG: IsPlanar = 0; break; case PLANARCONFIG_SEPARATE: FatalError("Planar TIFF are not supported"); default: FatalError("Unsupported planar configuration (=%d) ", (int) PlanarConfig); } // If Samples per pixel == 1, PlanarConfiguration is irrelevant and need // not to be included. if (spp == 1) IsPlanar = 0; // Any alpha? TIFFGetFieldDefaulted(Bank, TIFFTAG_EXTRASAMPLES, &extra, &info); ColorChannels = spp - extra; switch (Photometric) { case PHOTOMETRIC_MINISWHITE: reverse = 1; case PHOTOMETRIC_MINISBLACK: pt = PT_GRAY; break; case PHOTOMETRIC_RGB: pt = PT_RGB; break; case PHOTOMETRIC_PALETTE: FatalError("Sorry, palette images not supported (at least on this version)"); case PHOTOMETRIC_SEPARATED: pt = PixelTypeFromChanCount(ColorChannels); break; case PHOTOMETRIC_YCBCR: TIFFGetField(Bank, TIFFTAG_COMPRESSION, &Compression); { uint16 subx, suby; pt = PT_YCbCr; TIFFGetFieldDefaulted(Bank, TIFFTAG_YCBCRSUBSAMPLING, &subx, &suby); if (subx != 1 || suby != 1) FatalError("Sorry, subsampled images not supported"); } break; case 9: case PHOTOMETRIC_CIELAB: pt = PT_Lab; break; case PHOTOMETRIC_LOGLUV: /* CIE Log2(L) (u',v') */ TIFFSetField(Bank, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_16BIT); pt = PT_YUV; // *ICCSpace = icSigLuvData; bps = 16; // 16 bits forced by LibTiff break; default: FatalError("Unsupported TIFF color space (Photometric %d)", Photometric); } // Convert bits per sample to bytes per sample bps >>= 3; return (COLORSPACE_SH(pt)|PLANAR_SH(IsPlanar)|EXTRA_SH(extra)|CHANNELS_SH(ColorChannels)|BYTES_SH(bps)|FLAVOR_SH(reverse)); } static cmsUInt32Number OpenEmbedded(TIFF* tiff, cmsHPROFILE* PtrProfile, cmsHTRANSFORM* PtrXform) { cmsUInt32Number EmbedLen, dwFormat = 0; cmsUInt8Number* EmbedBuffer; *PtrProfile = NULL; *PtrXform = NULL; if (TIFFGetField(tiff, TIFFTAG_ICCPROFILE, &EmbedLen, &EmbedBuffer)) { *PtrProfile = cmsOpenProfileFromMem(EmbedBuffer, EmbedLen); if (Verbose) { fprintf(stdout, "Embedded profile found:\n"); PrintProfileInformation(*PtrProfile); } dwFormat = GetInputPixelType(tiff); *PtrXform = cmsCreateTransform(*PtrProfile, dwFormat, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); } return dwFormat; } static size_t PixelSize(cmsUInt32Number dwFormat) { return T_BYTES(dwFormat) * (T_CHANNELS(dwFormat) + T_EXTRA(dwFormat)); } static int CmpImages(TIFF* tiff1, TIFF* tiff2, TIFF* diff) { cmsUInt8Number* buf1, *buf2, *buf3=NULL; int row, cols, imagewidth = 0, imagelength = 0; uint16 Photometric; double dE = 0; double dR, dG, dB, dC, dM, dY, dK; int rc = 0; cmsHPROFILE hProfile1 = 0, hProfile2 = 0; cmsHTRANSFORM xform1 = 0, xform2 = 0; cmsUInt32Number dwFormat1, dwFormat2; TIFFGetField(tiff1, TIFFTAG_PHOTOMETRIC, &Photometric); TIFFGetField(tiff1, TIFFTAG_IMAGEWIDTH, &imagewidth); TIFFGetField(tiff1, TIFFTAG_IMAGELENGTH, &imagelength); TIFFGetField(tiff1, TIFFTAG_SAMPLESPERPIXEL, &Channels); dwFormat1 = OpenEmbedded(tiff1, &hProfile1, &xform1); dwFormat2 = OpenEmbedded(tiff2, &hProfile2, &xform2); buf1 = (cmsUInt8Number*)_TIFFmalloc(TIFFScanlineSize(tiff1)); buf2 = (cmsUInt8Number*)_TIFFmalloc(TIFFScanlineSize(tiff2)); if (diff) { TIFFSetField(diff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); TIFFSetField(diff, TIFFTAG_COMPRESSION, COMPRESSION_NONE); TIFFSetField(diff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(diff, TIFFTAG_IMAGEWIDTH, imagewidth); TIFFSetField(diff, TIFFTAG_IMAGELENGTH, imagelength); TIFFSetField(diff, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(diff, TIFFTAG_BITSPERSAMPLE, 8); buf3 = (cmsUInt8Number*)_TIFFmalloc(TIFFScanlineSize(diff)); } for (row = 0; row < imagelength; row++) { if (TIFFReadScanline(tiff1, buf1, row, 0) < 0) goto Error; if (TIFFReadScanline(tiff2, buf2, row, 0) < 0) goto Error; for (cols = 0; cols < imagewidth; cols++) { switch (Photometric) { case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: dE = fabs(buf2[cols] - buf1[cols]); AddOnePixel(&ColorantStat[0], dE); AddOnePixel(&EuclideanStat, dE); break; case PHOTOMETRIC_RGB: { int index = 3 * cols; dR = fabs(buf2[index+0] - buf1[index+0]); dG = fabs(buf2[index+1] - buf1[index+1]); dB = fabs(buf2[index+2] - buf1[index+2]); dE = sqrt(dR * dR + dG * dG + dB * dB) / sqrt(3.); } AddOnePixel(&ColorantStat[0], dR); AddOnePixel(&ColorantStat[1], dG); AddOnePixel(&ColorantStat[2], dB); AddOnePixel(&EuclideanStat, dE); break; case PHOTOMETRIC_SEPARATED: { int index = 4 * cols; dC = fabs(buf2[index+0] - buf1[index+0]); dM = fabs(buf2[index+1] - buf1[index+1]); dY = fabs(buf2[index+2] - buf1[index+2]); dK = fabs(buf2[index+3] - buf1[index+3]); dE = sqrt(dC * dC + dM * dM + dY * dY + dK * dK) / 2.; } AddOnePixel(&ColorantStat[0], dC); AddOnePixel(&ColorantStat[1], dM); AddOnePixel(&ColorantStat[2], dY); AddOnePixel(&ColorantStat[3], dK); AddOnePixel(&EuclideanStat, dE); break; default: FatalError("Unsupported channels: %d", Channels); } if (xform1 && xform2) { cmsCIELab Lab1, Lab2; size_t index1 = cols * PixelSize(dwFormat1); size_t index2 = cols * PixelSize(dwFormat2); cmsDoTransform(xform1, &buf1[index1], &Lab1, 1); cmsDoTransform(xform2, &buf2[index2], &Lab2, 1); dE = cmsDeltaE(&Lab1, &Lab2); AddOnePixel(&ColorimetricStat, dE); } if (diff) { buf3[cols] = (cmsUInt8Number) floor(dE + 0.5); } } if (diff) { if (TIFFWriteScanline(diff, buf3, row, 0) < 0) goto Error; } } rc = 1; Error: if (hProfile1) cmsCloseProfile(hProfile1); if (hProfile2) cmsCloseProfile(hProfile2); if (xform1) cmsDeleteTransform(xform1); if (xform2) cmsDeleteTransform(xform2); _TIFFfree(buf1); _TIFFfree(buf2); if (diff) { TIFFWriteDirectory(diff); if (buf3 != NULL) _TIFFfree(buf3); } return rc; } static void AssureShortTagIs(TIFF* tif1, TIFF* tiff2, int tag, int Val, const char* Error) { uint16 v1; if (!TIFFGetField(tif1, tag, &v1)) goto Err; if (v1 != Val) goto Err; if (!TIFFGetField(tiff2, tag, &v1)) goto Err; if (v1 != Val) goto Err; return; Err: FatalError("%s is not proper", Error); } static int CmpShortTag(TIFF* tif1, TIFF* tif2, int tag) { uint16 v1, v2; if (!TIFFGetField(tif1, tag, &v1)) return 0; if (!TIFFGetField(tif2, tag, &v2)) return 0; return v1 == v2; } static int CmpLongTag(TIFF* tif1, TIFF* tif2, int tag) { uint32 v1, v2; if (!TIFFGetField(tif1, tag, &v1)) return 0; if (!TIFFGetField(tif2, tag, &v2)) return 0; return v1 == v2; } static void EqualShortTag(TIFF* tif1, TIFF* tif2, int tag, const char* Error) { if (!CmpShortTag(tif1, tif2, tag)) FatalError("%s is different", Error); } static void EqualLongTag(TIFF* tif1, TIFF* tif2, int tag, const char* Error) { if (!CmpLongTag(tif1, tif2, tag)) FatalError("%s is different", Error); } static void AddOneCGATSRow(cmsHANDLE hIT8, char *Name, LPSTAT st) { double Per100 = 100.0 * ((255.0 - Mean(st)) / 255.0); cmsIT8SetData(hIT8, Name, "SAMPLE_ID", Name); cmsIT8SetDataDbl(hIT8, Name, "PER100_EQUAL", Per100); cmsIT8SetDataDbl(hIT8, Name, "MEAN_DE", Mean(st)); cmsIT8SetDataDbl(hIT8, Name, "STDEV_DE", Std(st)); cmsIT8SetDataDbl(hIT8, Name, "MIN_DE", st ->Min); cmsIT8SetDataDbl(hIT8, Name, "MAX_DE", st ->Peak); } static void CreateCGATS(const char* TiffName1, const char* TiffName2) { cmsHANDLE hIT8 = cmsIT8Alloc(0); time_t ltime; char Buffer[256]; cmsIT8SetSheetType(hIT8, "TIFFDIFF"); sprintf(Buffer, "Differences between %s and %s", TiffName1, TiffName2); cmsIT8SetComment(hIT8, Buffer); cmsIT8SetPropertyStr(hIT8, "ORIGINATOR", "TIFFDIFF"); time( <ime ); strcpy(Buffer, ctime(<ime)); Buffer[strlen(Buffer)-1] = 0; // Remove the nasty "\n" cmsIT8SetPropertyStr(hIT8, "CREATED", Buffer); cmsIT8SetComment(hIT8, " "); cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_FIELDS", 6); cmsIT8SetDataFormat(hIT8, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8, 1, "PER100_EQUAL"); cmsIT8SetDataFormat(hIT8, 2, "MEAN_DE"); cmsIT8SetDataFormat(hIT8, 3, "STDEV_DE"); cmsIT8SetDataFormat(hIT8, 4, "MIN_DE"); cmsIT8SetDataFormat(hIT8, 5, "MAX_DE"); switch (Channels) { case 1: cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", 3); AddOneCGATSRow(hIT8, "GRAY_PLANE", &ColorantStat[0]); break; case 3: cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", 5); AddOneCGATSRow(hIT8, "R_PLANE", &ColorantStat[0]); AddOneCGATSRow(hIT8, "G_PLANE", &ColorantStat[1]); AddOneCGATSRow(hIT8, "B_PLANE", &ColorantStat[2]); break; case 4: cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", 6); AddOneCGATSRow(hIT8, "C_PLANE", &ColorantStat[0]); AddOneCGATSRow(hIT8, "M_PLANE", &ColorantStat[1]); AddOneCGATSRow(hIT8, "Y_PLANE", &ColorantStat[2]); AddOneCGATSRow(hIT8, "K_PLANE", &ColorantStat[3]); break; default: FatalError("Internal error: Bad ColorSpace"); } AddOneCGATSRow(hIT8, "EUCLIDEAN", &EuclideanStat); AddOneCGATSRow(hIT8, "COLORIMETRIC", &ColorimetricStat); cmsIT8SaveToFile(hIT8, CGATSout); cmsIT8Free(hIT8); } int main(int argc, char* argv[]) { int i; Tiff1 = Tiff2 = TiffDiff = NULL; InitUtils("tiffdiff"); HandleSwitches(argc, argv); if ((argc - xoptind) != 2) { Help(); } TIFFSetErrorHandler(ConsoleErrorHandler); TIFFSetWarningHandler(ConsoleWarningHandler); Tiff1 = TIFFOpen(argv[xoptind], "r"); if (Tiff1 == NULL) FatalError("Unable to open '%s'", argv[xoptind]); Tiff2 = TIFFOpen(argv[xoptind+1], "r"); if (Tiff2 == NULL) FatalError("Unable to open '%s'", argv[xoptind+1]); if (TiffDiffFilename) { TiffDiff = TIFFOpen(TiffDiffFilename, "w"); if (TiffDiff == NULL) FatalError("Unable to create '%s'", TiffDiffFilename); } AssureShortTagIs(Tiff1, Tiff2, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG, "Planar Config"); AssureShortTagIs(Tiff1, Tiff2, TIFFTAG_BITSPERSAMPLE, 8, "8 bit per sample"); EqualLongTag(Tiff1, Tiff2, TIFFTAG_IMAGEWIDTH, "Image width"); EqualLongTag(Tiff1, Tiff2, TIFFTAG_IMAGELENGTH, "Image length"); EqualShortTag(Tiff1, Tiff2, TIFFTAG_SAMPLESPERPIXEL, "Samples per pixel"); hLab = cmsCreateLab4Profile(NULL); ClearStatistics(&EuclideanStat); for (i=0; i < 4; i++) ClearStatistics(&ColorantStat[i]); if (!CmpImages(Tiff1, Tiff2, TiffDiff)) FatalError("Error comparing images"); if (CGATSout) { CreateCGATS(argv[xoptind], argv[xoptind+1]); } else { double Per100 = 100.0 * ((255.0 - Mean(&EuclideanStat)) / 255.0); printf("Digital counts %g%% equal. mean %g, min %g, max %g, Std %g\n", Per100, Mean(&EuclideanStat), EuclideanStat.Min, EuclideanStat.Peak, Std(&EuclideanStat)); if (ColorimetricStat.n > 0) { Per100 = 100.0 * ((255.0 - Mean(&ColorimetricStat)) / 255.0); printf("dE Colorimetric %g%% equal. mean %g, min %g, max %g, Std %g\n", Per100, Mean(&ColorimetricStat), ColorimetricStat.Min, ColorimetricStat.Peak, Std(&ColorimetricStat)); } } if (hLab) cmsCloseProfile(hLab); if (Tiff1) TIFFClose(Tiff1); if (Tiff2) TIFFClose(Tiff2); if (TiffDiff) TIFFClose(TiffDiff); return 0; } lcms2-2.6/utils/tificc/Makefile.in0000644002406300000240000006104212311617072016377 0ustar mariamausers# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building tificc # Originally written by Bob Friesenhahn, June 2003 # bugs introduced by Marti Maria VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HasTIFF_TRUE@bin_PROGRAMS = tificc$(EXEEXT) subdir = utils/tificc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_tificc_OBJECTS = tificc.$(OBJEXT) xgetopt.$(OBJEXT) vprf.$(OBJEXT) tificc_OBJECTS = $(am_tificc_OBJECTS) tificc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la tificc_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(tificc_LDFLAGS) \ $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(tificc_SOURCES) DIST_SOURCES = $(tificc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common tificc_LDADD = $(top_builddir)/src/liblcms2.la @TIFFICC_DEPLIBS@ tificc_LDFLAGS = @LDFLAGS@ tificc_SOURCES = tificc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = tificc.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/tificc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign utils/tificc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list tificc$(EXEEXT): $(tificc_OBJECTS) $(tificc_DEPENDENCIES) $(EXTRA_tificc_DEPENDENCIES) @rm -f tificc$(EXEEXT) $(tificc_LINK) $(tificc_OBJECTS) $(tificc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tificc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vprf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgetopt.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< xgetopt.o: ../common/xgetopt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgetopt.o -MD -MP -MF $(DEPDIR)/xgetopt.Tpo -c -o xgetopt.o `test -f '../common/xgetopt.c' || echo '$(srcdir)/'`../common/xgetopt.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgetopt.Tpo $(DEPDIR)/xgetopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/xgetopt.c' object='xgetopt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgetopt.o `test -f '../common/xgetopt.c' || echo '$(srcdir)/'`../common/xgetopt.c xgetopt.obj: ../common/xgetopt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgetopt.obj -MD -MP -MF $(DEPDIR)/xgetopt.Tpo -c -o xgetopt.obj `if test -f '../common/xgetopt.c'; then $(CYGPATH_W) '../common/xgetopt.c'; else $(CYGPATH_W) '$(srcdir)/../common/xgetopt.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgetopt.Tpo $(DEPDIR)/xgetopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/xgetopt.c' object='xgetopt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgetopt.obj `if test -f '../common/xgetopt.c'; then $(CYGPATH_W) '../common/xgetopt.c'; else $(CYGPATH_W) '$(srcdir)/../common/xgetopt.c'; fi` vprf.o: ../common/vprf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vprf.o -MD -MP -MF $(DEPDIR)/vprf.Tpo -c -o vprf.o `test -f '../common/vprf.c' || echo '$(srcdir)/'`../common/vprf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vprf.Tpo $(DEPDIR)/vprf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/vprf.c' object='vprf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vprf.o `test -f '../common/vprf.c' || echo '$(srcdir)/'`../common/vprf.c vprf.obj: ../common/vprf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vprf.obj -MD -MP -MF $(DEPDIR)/vprf.Tpo -c -o vprf.obj `if test -f '../common/vprf.c'; then $(CYGPATH_W) '../common/vprf.c'; else $(CYGPATH_W) '$(srcdir)/../common/vprf.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vprf.Tpo $(DEPDIR)/vprf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/vprf.c' object='vprf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vprf.obj `if test -f '../common/vprf.c'; then $(CYGPATH_W) '../common/vprf.c'; else $(CYGPATH_W) '$(srcdir)/../common/vprf.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lcms2-2.6/utils/tificc/Makefile.am0000644002406300000240000000117012311617072016362 0ustar mariamausers# # Makefile for building tificc # Originally written by Bob Friesenhahn, June 2003 # bugs introduced by Marti Maria # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common if HasTIFF bin_PROGRAMS = tificc else bin_PROGRAMS = endif tificc_LDADD = $(top_builddir)/src/liblcms2.la @TIFFICC_DEPLIBS@ tificc_LDFLAGS = @LDFLAGS@ tificc_SOURCES = tificc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = tificc.1 EXTRA_DIST = $(man_MANS) lcms2-2.6/utils/tificc/tificc.c0000644002406300000240000007740312311617072015747 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // This program does apply profiles to (some) TIFF files #include "lcms2_plugin.h" #include "tiffio.h" #include "utils.h" // Flags static cmsBool BlackWhiteCompensation = FALSE; static cmsBool IgnoreEmbedded = FALSE; static cmsBool EmbedProfile = FALSE; static int Width = 8; static cmsBool GamutCheck = FALSE; static cmsBool lIsDeviceLink = FALSE; static cmsBool StoreAsAlpha = FALSE; static int Intent = INTENT_PERCEPTUAL; static int ProofingIntent = INTENT_PERCEPTUAL; static int PrecalcMode = 1; static cmsFloat64Number InkLimit = 400; static cmsFloat64Number ObserverAdaptationState = 1.0; // According ICC 4.3 this is the default static const char *cInpProf = NULL; static const char *cOutProf = NULL; static const char *cProofing = NULL; static const char* SaveEmbedded = NULL; // Console error & warning static void ConsoleWarningHandler(const char* module, const char* fmt, va_list ap) { char e[512] = { '\0' }; if (module != NULL) strcat(strcpy(e, module), ": "); vsprintf(e+strlen(e), fmt, ap); strcat(e, "."); if (Verbose) { fprintf(stderr, "\nWarning"); fprintf(stderr, " %s\n", e); fflush(stderr); } } static void ConsoleErrorHandler(const char* module, const char* fmt, va_list ap) { char e[512] = { '\0' }; if (module != NULL) { if (strlen(module) < 500) strcat(strcpy(e, module), ": "); } vsprintf(e+strlen(e), fmt, ap); strcat(e, "."); fprintf(stderr, "\nError"); fprintf(stderr, " %s\n", e); fflush(stderr); } // Issue a warning static void Warning(const char *frm, ...) { va_list args; va_start(args, frm); ConsoleWarningHandler("[tificc]", frm, args); va_end(args); } // Out of mememory is a fatal error static void OutOfMem(cmsUInt32Number size) { FatalError("Out of memory on allocating %d bytes.", size); } // ----------------------------------------------------------------------------------------------- // In TIFF, Lab is encoded in a different way, so let's use the plug-in // capabilities of lcms2 to change the meaning of TYPE_Lab_8. // * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256 static int FromLabV2ToLabV4(int x) { int a; a = ((x << 8) | x) >> 8; // * 257 / 256 if ( a > 0xffff) return 0xffff; return a; } // * 0xf00 / 0xffff = * 256 / 257 static int FromLabV4ToLabV2(int x) { return ((x << 8) + 0x80) / 257; } // Formatter for 8bit Lab TIFF (photometric 8) static unsigned char* UnrollTIFFLab8(struct _cmstransform_struct* CMMcargo, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = (cmsUInt16Number) FromLabV2ToLabV4((accum[0]) << 8); wIn[1] = (cmsUInt16Number) FromLabV2ToLabV4(((accum[1] > 127) ? (accum[1] - 128) : (accum[1] + 128)) << 8); wIn[2] = (cmsUInt16Number) FromLabV2ToLabV4(((accum[2] > 127) ? (accum[2] - 128) : (accum[2] + 128)) << 8); return accum + 3; UTILS_UNUSED_PARAMETER(Stride); UTILS_UNUSED_PARAMETER(CMMcargo); } // Formatter for 16bit Lab TIFF (photometric 8) static unsigned char* UnrollTIFFLab16(struct _cmstransform_struct* CMMcargo, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride ) { cmsUInt16Number* accum16 = (cmsUInt16Number*) accum; wIn[0] = (cmsUInt16Number) FromLabV2ToLabV4(accum16[0]); wIn[1] = (cmsUInt16Number) FromLabV2ToLabV4(((accum16[1] > 0x7f00) ? (accum16[1] - 0x8000) : (accum16[1] + 0x8000)) ); wIn[2] = (cmsUInt16Number) FromLabV2ToLabV4(((accum16[2] > 0x7f00) ? (accum16[2] - 0x8000) : (accum16[2] + 0x8000)) ); return accum + 3 * sizeof(cmsUInt16Number); UTILS_UNUSED_PARAMETER(Stride); UTILS_UNUSED_PARAMETER(CMMcargo); } static unsigned char* PackTIFFLab8(struct _cmstransform_struct* CMMcargo, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { int a, b; *output++ = (cmsUInt8Number) (FromLabV4ToLabV2(wOut[0] + 0x0080) >> 8); a = (FromLabV4ToLabV2(wOut[1]) + 0x0080) >> 8; b = (FromLabV4ToLabV2(wOut[2]) + 0x0080) >> 8; *output++ = (cmsUInt8Number) ((a < 128) ? (a + 128) : (a - 128)); *output++ = (cmsUInt8Number) ((b < 128) ? (b + 128) : (b - 128)); return output; UTILS_UNUSED_PARAMETER(Stride); UTILS_UNUSED_PARAMETER(CMMcargo); } static unsigned char* PackTIFFLab16(struct _cmstransform_struct* CMMcargo, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { int a, b; cmsUInt16Number* output16 = (cmsUInt16Number*) output; *output16++ = (cmsUInt16Number) FromLabV4ToLabV2(wOut[0]); a = FromLabV4ToLabV2(wOut[1]); b = FromLabV4ToLabV2(wOut[2]); *output16++ = (cmsUInt16Number) ((a < 0x7f00) ? (a + 0x8000) : (a - 0x8000)); *output16++ = (cmsUInt16Number) ((b < 0x7f00) ? (b + 0x8000) : (b - 0x8000)); return (cmsUInt8Number*) output16; UTILS_UNUSED_PARAMETER(Stride); UTILS_UNUSED_PARAMETER(CMMcargo); } static cmsFormatter TiffFormatterFactory(cmsUInt32Number Type, cmsFormatterDirection Dir, cmsUInt32Number dwFlags) { cmsFormatter Result = { NULL }; int bps = T_BYTES(Type); int IsTiffSpecial = (Type >> 23) & 1; if (IsTiffSpecial && !(dwFlags & CMS_PACK_FLAGS_FLOAT)) { if (Dir == cmsFormatterInput) { Result.Fmt16 = (bps == 1) ? UnrollTIFFLab8 : UnrollTIFFLab16; } else Result.Fmt16 = (bps == 1) ? PackTIFFLab8 : PackTIFFLab16; } return Result; } static cmsPluginFormatters TiffLabPlugin = { {cmsPluginMagicNumber, 2000, cmsPluginFormattersSig, NULL}, TiffFormatterFactory }; // Build up the pixeltype descriptor static cmsUInt32Number GetInputPixelType(TIFF *Bank) { uint16 Photometric, bps, spp, extra, PlanarConfig, *info; uint16 Compression, reverse = 0; int ColorChannels, IsPlanar = 0, pt = 0, IsFlt; int labTiffSpecial = FALSE; TIFFGetField(Bank, TIFFTAG_PHOTOMETRIC, &Photometric); TIFFGetFieldDefaulted(Bank, TIFFTAG_BITSPERSAMPLE, &bps); if (bps == 1) FatalError("Sorry, bilevel TIFFs has nothing to do with ICC profiles"); if (bps != 8 && bps != 16 && bps != 32) FatalError("Sorry, 8, 16 or 32 bits per sample only"); TIFFGetFieldDefaulted(Bank, TIFFTAG_SAMPLESPERPIXEL, &spp); TIFFGetFieldDefaulted(Bank, TIFFTAG_PLANARCONFIG, &PlanarConfig); switch (PlanarConfig) { case PLANARCONFIG_CONTIG: IsPlanar = 0; break; case PLANARCONFIG_SEPARATE: IsPlanar = 1; break; default: FatalError("Unsupported planar configuration (=%d) ", (int) PlanarConfig); } // If Samples per pixel == 1, PlanarConfiguration is irrelevant and need // not to be included. if (spp == 1) IsPlanar = 0; // Any alpha? TIFFGetFieldDefaulted(Bank, TIFFTAG_EXTRASAMPLES, &extra, &info); // Read alpha channels as colorant if (StoreAsAlpha) { ColorChannels = spp; extra = 0; } else ColorChannels = spp - extra; switch (Photometric) { case PHOTOMETRIC_MINISWHITE: reverse = 1; // ... fall through ... case PHOTOMETRIC_MINISBLACK: pt = PT_GRAY; break; case PHOTOMETRIC_RGB: pt = PT_RGB; break; case PHOTOMETRIC_PALETTE: FatalError("Sorry, palette images not supported"); break; case PHOTOMETRIC_SEPARATED: pt = PixelTypeFromChanCount(ColorChannels); break; case PHOTOMETRIC_YCBCR: TIFFGetField(Bank, TIFFTAG_COMPRESSION, &Compression); { uint16 subx, suby; pt = PT_YCbCr; TIFFGetFieldDefaulted(Bank, TIFFTAG_YCBCRSUBSAMPLING, &subx, &suby); if (subx != 1 || suby != 1) FatalError("Sorry, subsampled images not supported"); } break; case PHOTOMETRIC_ICCLAB: pt = PT_LabV2; break; case PHOTOMETRIC_CIELAB: pt = PT_Lab; labTiffSpecial = TRUE; break; case PHOTOMETRIC_LOGLUV: // CIE Log2(L) (u',v') TIFFSetField(Bank, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_16BIT); pt = PT_YUV; // *ICCSpace = icSigLuvData; bps = 16; // 16 bits forced by LibTiff break; default: FatalError("Unsupported TIFF color space (Photometric %d)", Photometric); } // Convert bits per sample to bytes per sample bps >>= 3; IsFlt = (bps == 0) || (bps == 4); return (FLOAT_SH(IsFlt)|COLORSPACE_SH(pt)|PLANAR_SH(IsPlanar)|EXTRA_SH(extra)|CHANNELS_SH(ColorChannels)|BYTES_SH(bps)|FLAVOR_SH(reverse) | (labTiffSpecial << 23) ); } // Rearrange pixel type to build output descriptor static cmsUInt32Number ComputeOutputFormatDescriptor(cmsUInt32Number dwInput, int OutColorSpace, int bps) { int IsPlanar = T_PLANAR(dwInput); int Channels = ChanCountFromPixelType(OutColorSpace); int IsFlt = (bps == 0) || (bps == 4); return (FLOAT_SH(IsFlt)|COLORSPACE_SH(OutColorSpace)|PLANAR_SH(IsPlanar)|CHANNELS_SH(Channels)|BYTES_SH(bps)); } // Tile based transforms static int TileBasedXform(cmsHTRANSFORM hXForm, TIFF* in, TIFF* out, int nPlanes) { tsize_t BufSizeIn = TIFFTileSize(in); tsize_t BufSizeOut = TIFFTileSize(out); unsigned char *BufferIn, *BufferOut; ttile_t i, TileCount = TIFFNumberOfTiles(in) / nPlanes; uint32 tw, tl; int PixelCount, j; TIFFGetFieldDefaulted(in, TIFFTAG_TILEWIDTH, &tw); TIFFGetFieldDefaulted(in, TIFFTAG_TILELENGTH, &tl); PixelCount = (int) tw * tl; BufferIn = (unsigned char *) _TIFFmalloc(BufSizeIn * nPlanes); if (!BufferIn) OutOfMem(BufSizeIn * nPlanes); BufferOut = (unsigned char *) _TIFFmalloc(BufSizeOut * nPlanes); if (!BufferOut) OutOfMem(BufSizeOut * nPlanes); for (i = 0; i < TileCount; i++) { for (j=0; j < nPlanes; j++) { if (TIFFReadEncodedTile(in, i + (j* TileCount), BufferIn + (j*BufSizeIn), BufSizeIn) < 0) goto cleanup; } cmsDoTransform(hXForm, BufferIn, BufferOut, PixelCount); for (j=0; j < nPlanes; j++) { if (TIFFWriteEncodedTile(out, i + (j*TileCount), BufferOut + (j*BufSizeOut), BufSizeOut) < 0) goto cleanup; } } _TIFFfree(BufferIn); _TIFFfree(BufferOut); return 1; cleanup: _TIFFfree(BufferIn); _TIFFfree(BufferOut); return 0; } // Strip based transforms static int StripBasedXform(cmsHTRANSFORM hXForm, TIFF* in, TIFF* out, int nPlanes) { tsize_t BufSizeIn = TIFFStripSize(in); tsize_t BufSizeOut = TIFFStripSize(out); unsigned char *BufferIn, *BufferOut; ttile_t i, StripCount = TIFFNumberOfStrips(in) / nPlanes; uint32 sw; uint32 sl; uint32 iml; int j; int PixelCount; TIFFGetFieldDefaulted(in, TIFFTAG_IMAGEWIDTH, &sw); TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &sl); TIFFGetFieldDefaulted(in, TIFFTAG_IMAGELENGTH, &iml); // It is possible to get infinite rows per strip if (sl == 0 || sl > iml) sl = iml; // One strip for whole image BufferIn = (unsigned char *) _TIFFmalloc(BufSizeIn * nPlanes); if (!BufferIn) OutOfMem(BufSizeIn * nPlanes); BufferOut = (unsigned char *) _TIFFmalloc(BufSizeOut * nPlanes); if (!BufferOut) OutOfMem(BufSizeOut * nPlanes); for (i = 0; i < StripCount; i++) { for (j=0; j < nPlanes; j++) { if (TIFFReadEncodedStrip(in, i + (j * StripCount), BufferIn + (j * BufSizeIn), BufSizeIn) < 0) goto cleanup; } PixelCount = (int) sw * (iml < sl ? iml : sl); iml -= sl; cmsDoTransform(hXForm, BufferIn, BufferOut, PixelCount); for (j=0; j < nPlanes; j++) { if (TIFFWriteEncodedStrip(out, i + (j * StripCount), BufferOut + j * BufSizeOut, BufSizeOut) < 0) goto cleanup; } } _TIFFfree(BufferIn); _TIFFfree(BufferOut); return 1; cleanup: _TIFFfree(BufferIn); _TIFFfree(BufferOut); return 0; } // Creates minimum required tags static void WriteOutputTags(TIFF *out, int Colorspace, int BytesPerSample) { int BitsPerSample = (8 * BytesPerSample); int nChannels = ChanCountFromPixelType(Colorspace); uint16 Extra[] = { EXTRASAMPLE_UNASSALPHA, EXTRASAMPLE_UNASSALPHA, EXTRASAMPLE_UNASSALPHA, EXTRASAMPLE_UNASSALPHA, EXTRASAMPLE_UNASSALPHA, EXTRASAMPLE_UNASSALPHA, EXTRASAMPLE_UNASSALPHA, EXTRASAMPLE_UNASSALPHA, EXTRASAMPLE_UNASSALPHA, EXTRASAMPLE_UNASSALPHA, EXTRASAMPLE_UNASSALPHA }; switch (Colorspace) { case PT_GRAY: TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, BitsPerSample); break; case PT_RGB: TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, BitsPerSample); break; case PT_CMY: TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_SEPARATED); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(out, TIFFTAG_INKSET, 2); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, BitsPerSample); break; case PT_CMYK: TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_SEPARATED); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 4); TIFFSetField(out, TIFFTAG_INKSET, INKSET_CMYK); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, BitsPerSample); break; case PT_Lab: if (BitsPerSample == 16) TIFFSetField(out, TIFFTAG_PHOTOMETRIC, 9); else TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_CIELAB); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, BitsPerSample); // Needed by TIFF Spec break; // Multi-ink separations case PT_MCH2: case PT_MCH3: case PT_MCH4: case PT_MCH5: case PT_MCH6: case PT_MCH7: case PT_MCH8: case PT_MCH9: case PT_MCH10: case PT_MCH11: case PT_MCH12: case PT_MCH13: case PT_MCH14: case PT_MCH15: TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_SEPARATED); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, nChannels); if (StoreAsAlpha && nChannels >= 4) { // CMYK plus extra alpha TIFFSetField(out, TIFFTAG_EXTRASAMPLES, nChannels - 4, Extra); TIFFSetField(out, TIFFTAG_INKSET, 1); TIFFSetField(out, TIFFTAG_NUMBEROFINKS, 4); } else { TIFFSetField(out, TIFFTAG_INKSET, 2); TIFFSetField(out, TIFFTAG_NUMBEROFINKS, nChannels); } TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, BitsPerSample); break; default: FatalError("Unsupported output colorspace"); } if (Width == 32) TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); } // Copies a bunch of tages static void CopyOtherTags(TIFF* in, TIFF* out) { #define CopyField(tag, v) \ if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) short shortv; uint32 ow, ol; cmsFloat32Number floatv; char *stringv; uint32 longv; CopyField(TIFFTAG_SUBFILETYPE, longv); TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &ow); TIFFGetField(in, TIFFTAG_IMAGELENGTH, &ol); TIFFSetField(out, TIFFTAG_IMAGEWIDTH, ow); TIFFSetField(out, TIFFTAG_IMAGELENGTH, ol); CopyField(TIFFTAG_PLANARCONFIG, shortv); CopyField(TIFFTAG_COMPRESSION, shortv); if (Width != 32) CopyField(TIFFTAG_PREDICTOR, shortv); CopyField(TIFFTAG_THRESHHOLDING, shortv); CopyField(TIFFTAG_FILLORDER, shortv); CopyField(TIFFTAG_ORIENTATION, shortv); CopyField(TIFFTAG_MINSAMPLEVALUE, shortv); CopyField(TIFFTAG_MAXSAMPLEVALUE, shortv); CopyField(TIFFTAG_XRESOLUTION, floatv); CopyField(TIFFTAG_YRESOLUTION, floatv); CopyField(TIFFTAG_RESOLUTIONUNIT, shortv); CopyField(TIFFTAG_ROWSPERSTRIP, longv); CopyField(TIFFTAG_XPOSITION, floatv); CopyField(TIFFTAG_YPOSITION, floatv); CopyField(TIFFTAG_IMAGEDEPTH, longv); CopyField(TIFFTAG_TILEDEPTH, longv); CopyField(TIFFTAG_TILEWIDTH, longv); CopyField(TIFFTAG_TILELENGTH, longv); CopyField(TIFFTAG_ARTIST, stringv); CopyField(TIFFTAG_IMAGEDESCRIPTION, stringv); CopyField(TIFFTAG_MAKE, stringv); CopyField(TIFFTAG_MODEL, stringv); CopyField(TIFFTAG_DATETIME, stringv); CopyField(TIFFTAG_HOSTCOMPUTER, stringv); CopyField(TIFFTAG_PAGENAME, stringv); CopyField(TIFFTAG_DOCUMENTNAME, stringv); } // A replacement for (the nonstandard) filelenght static void DoEmbedProfile(TIFF* Out, const char* ProfileFile) { FILE* f; cmsUInt32Number size, EmbedLen; cmsUInt8Number* EmbedBuffer; f = fopen(ProfileFile, "rb"); if (f == NULL) return; size = cmsfilelength(f); EmbedBuffer = (cmsUInt8Number*) malloc(size + 1); if (EmbedBuffer == NULL) { OutOfMem(size+1); return; } EmbedLen = (cmsUInt32Number) fread(EmbedBuffer, 1, (size_t) size, f); if (EmbedLen != size) FatalError("Cannot read %ld bytes to %s", size, ProfileFile); fclose(f); EmbedBuffer[EmbedLen] = 0; TIFFSetField(Out, TIFFTAG_ICCPROFILE, EmbedLen, EmbedBuffer); free(EmbedBuffer); } static cmsHPROFILE GetTIFFProfile(TIFF* in) { cmsCIExyYTRIPLE Primaries; cmsFloat32Number* chr; cmsCIExyY WhitePoint; cmsFloat32Number* wp; int i; cmsToneCurve* Curve[3]; cmsUInt16Number *gmr, *gmg, *gmb; cmsHPROFILE hProfile; cmsUInt32Number EmbedLen; cmsUInt8Number* EmbedBuffer; if (IgnoreEmbedded) return NULL; if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &EmbedLen, &EmbedBuffer)) { hProfile = cmsOpenProfileFromMem(EmbedBuffer, EmbedLen); // Print description found in the profile if (Verbose) { fprintf(stdout, "\n[Embedded profile]\n"); PrintProfileInformation(hProfile); fflush(stdout); } if (hProfile != NULL && SaveEmbedded != NULL) SaveMemoryBlock(EmbedBuffer, EmbedLen, SaveEmbedded); if (hProfile) return hProfile; } // Try to see if "colorimetric" tiff if (TIFFGetField(in, TIFFTAG_PRIMARYCHROMATICITIES, &chr)) { Primaries.Red.x = chr[0]; Primaries.Red.y = chr[1]; Primaries.Green.x = chr[2]; Primaries.Green.y = chr[3]; Primaries.Blue.x = chr[4]; Primaries.Blue.y = chr[5]; Primaries.Red.Y = Primaries.Green.Y = Primaries.Blue.Y = 1.0; if (TIFFGetField(in, TIFFTAG_WHITEPOINT, &wp)) { WhitePoint.x = wp[0]; WhitePoint.y = wp[1]; WhitePoint.Y = 1.0; // Transferfunction is a bit harder.... TIFFGetFieldDefaulted(in, TIFFTAG_TRANSFERFUNCTION, &gmr, &gmg, &gmb); Curve[0] = cmsBuildTabulatedToneCurve16(NULL, 256, gmr); Curve[1] = cmsBuildTabulatedToneCurve16(NULL, 256, gmg); Curve[2] = cmsBuildTabulatedToneCurve16(NULL, 256, gmb); hProfile = cmsCreateRGBProfileTHR(NULL, &WhitePoint, &Primaries, Curve); for (i=0; i < 3; i++) cmsFreeToneCurve(Curve[i]); if (Verbose) { fprintf(stdout, "\n[Colorimetric TIFF]\n"); } return hProfile; } } return NULL; } // Transform one image static int TransformImage(TIFF* in, TIFF* out, const char *cDefInpProf) { cmsHPROFILE hIn, hOut, hProof, hInkLimit = NULL; cmsHTRANSFORM xform; cmsUInt32Number wInput, wOutput; int OutputColorSpace; int bps = Width / 8; cmsUInt32Number dwFlags = 0; int nPlanes; // Observer adaptation state (only meaningful on absolute colorimetric intent) cmsSetAdaptationState(ObserverAdaptationState); if (EmbedProfile && cOutProf) DoEmbedProfile(out, cOutProf); if (BlackWhiteCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; switch (PrecalcMode) { case 0: dwFlags |= cmsFLAGS_NOOPTIMIZE; break; case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; case 3: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; case 1: break; default: FatalError("Unknown precalculation mode '%d'", PrecalcMode); } if (GamutCheck) dwFlags |= cmsFLAGS_GAMUTCHECK; hProof = NULL; hOut = NULL; if (lIsDeviceLink) { hIn = cmsOpenProfileFromFile(cDefInpProf, "r"); } else { hIn = GetTIFFProfile(in); if (hIn == NULL) hIn = OpenStockProfile(NULL, cDefInpProf); hOut = OpenStockProfile(NULL, cOutProf); if (cProofing != NULL) { hProof = OpenStockProfile(NULL, cProofing); dwFlags |= cmsFLAGS_SOFTPROOFING; } } // Take input color space wInput = GetInputPixelType(in); // Assure both, input profile and input TIFF are on same colorspace if (_cmsLCMScolorSpace(cmsGetColorSpace(hIn)) != (int) T_COLORSPACE(wInput)) FatalError("Input profile is not operating in proper color space"); if (!lIsDeviceLink) OutputColorSpace = _cmsLCMScolorSpace(cmsGetColorSpace(hOut)); else OutputColorSpace = _cmsLCMScolorSpace(cmsGetPCS(hIn)); wOutput = ComputeOutputFormatDescriptor(wInput, OutputColorSpace, bps); WriteOutputTags(out, OutputColorSpace, bps); CopyOtherTags(in, out); // Ink limit if (InkLimit != 400.0 && (OutputColorSpace == PT_CMYK || OutputColorSpace == PT_CMY)) { cmsHPROFILE hProfiles[10]; int nProfiles = 0; hInkLimit = cmsCreateInkLimitingDeviceLink(cmsGetColorSpace(hOut), InkLimit); hProfiles[nProfiles++] = hIn; if (hProof) { hProfiles[nProfiles++] = hProof; hProfiles[nProfiles++] = hProof; } hProfiles[nProfiles++] = hOut; hProfiles[nProfiles++] = hInkLimit; xform = cmsCreateMultiprofileTransform(hProfiles, nProfiles, wInput, wOutput, Intent, dwFlags); } else { xform = cmsCreateProofingTransform(hIn, wInput, hOut, wOutput, hProof, Intent, ProofingIntent, dwFlags); } cmsCloseProfile(hIn); cmsCloseProfile(hOut); if (hInkLimit) cmsCloseProfile(hInkLimit); if (hProof) cmsCloseProfile(hProof); if (xform == NULL) return 0; // Planar stuff if (T_PLANAR(wInput)) nPlanes = T_CHANNELS(wInput) + T_EXTRA(wInput); else nPlanes = 1; // Handle tile by tile or strip by strip if (TIFFIsTiled(in)) { TileBasedXform(xform, in, out, nPlanes); } else { StripBasedXform(xform, in, out, nPlanes); } cmsDeleteTransform(xform); TIFFWriteDirectory(out); return 1; } // Print help static void Help(int level) { fprintf(stderr, "little cms ICC profile applier for TIFF - v6.2 [LittleCMS %2.2f]\n\n", LCMS_VERSION / 1000.0); fflush(stderr); switch(level) { default: case 0: fprintf(stderr, "usage: tificc [flags] input.tif output.tif\n"); fprintf(stderr, "\nflags:\n\n"); fprintf(stderr, "%cv - Verbose\n", SW); fprintf(stderr, "%ci - Input profile (defaults to sRGB)\n", SW); fprintf(stderr, "%co - Output profile (defaults to sRGB)\n", SW); fprintf(stderr, "%cl - Transform by device-link profile\n", SW); PrintRenderingIntents(); fprintf(stderr, "%cb - Black point compensation\n", SW); fprintf(stderr, "%cd<0..1> - Observer adaptation state (abs.col. only)\n", SW); fprintf(stderr, "%cc<0,1,2,3> - Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes)\n", SW); fprintf(stderr, "\n"); fprintf(stderr, "%cw<8,16,32> - Output depth. Use 32 for floating-point\n\n", SW); fprintf(stderr, "%ca - Handle channels > 4 as alpha\n", SW); fprintf(stderr, "%cn - Ignore embedded profile on input\n", SW); fprintf(stderr, "%ce - Embed destination profile\n", SW); fprintf(stderr, "%cs - Save embedded profile as \n", SW); fprintf(stderr, "\n"); fprintf(stderr, "%cp - Soft proof profile\n", SW); fprintf(stderr, "%cm - Soft proof intent\n", SW); fprintf(stderr, "%cg - Marks out-of-gamut colors on softproof\n", SW); fprintf(stderr, "\n"); fprintf(stderr, "%ck<0..400> - Ink-limiting in %% (CMYK only)\n", SW); fprintf(stderr, "\n"); fprintf(stderr, "%ch<0,1,2,3> - More help\n", SW); break; case 1: fprintf(stderr, "Examples:\n\n" "To color correct from scanner to sRGB:\n" "\ttificc %ciscanner.icm in.tif out.tif\n" "To convert from monitor1 to monitor2:\n" "\ttificc %cimon1.icm %comon2.icm in.tif out.tif\n" "To make a CMYK separation:\n" "\ttificc %coprinter.icm inrgb.tif outcmyk.tif\n" "To recover sRGB from a CMYK separation:\n" "\ttificc %ciprinter.icm incmyk.tif outrgb.tif\n" "To convert from CIELab TIFF to sRGB\n" "\ttificc %ci*Lab in.tif out.tif\n\n", SW, SW, SW, SW, SW, SW); break; case 2: PrintBuiltins(); break; case 3: fprintf(stderr, "This program is intended to be a demo of the little cms\n" "engine. Both lcms and this program are freeware. You can\n" "obtain both in source code at http://www.littlecms.com\n" "For suggestions, comments, bug reports etc. send mail to\n" "info@littlecms.com\n\n"); break; } fflush(stderr); exit(0); } // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s=xgetopt(argc,argv,"aAeEbBw:W:nNvVGgh:H:i:I:o:O:P:p:t:T:c:C:l:L:M:m:K:k:S:s:D:d:")) != EOF) { switch (s) { case 'a': case 'A': StoreAsAlpha = TRUE; break; case 'b': case 'B': BlackWhiteCompensation = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 3) FatalError("Unknown precalc mode '%d'", PrecalcMode); break; case 'd': case 'D': ObserverAdaptationState = atof(xoptarg); if (ObserverAdaptationState < 0 || ObserverAdaptationState > 1.0) Warning("Adaptation state should be 0..1"); break; case 'e': case 'E': EmbedProfile = TRUE; break; case 'g': case 'G': GamutCheck = TRUE; break; case 'v': case 'V': Verbose = TRUE; break; case 'i': case 'I': if (lIsDeviceLink) FatalError("Device-link already specified"); cInpProf = xoptarg; break; case 'o': case 'O': if (lIsDeviceLink) FatalError("Device-link already specified"); cOutProf = xoptarg; break; case 'l': case 'L': if (cInpProf != NULL || cOutProf != NULL) FatalError("input/output profiles already specified"); cInpProf = xoptarg; lIsDeviceLink = TRUE; break; case 'p': case 'P': cProofing = xoptarg; break; case 't': case 'T': Intent = atoi(xoptarg); break; case 'm': case 'M': ProofingIntent = atoi(xoptarg); break; case 'N': case 'n': IgnoreEmbedded = TRUE; break; case 'W': case 'w': Width = atoi(xoptarg); if (Width != 8 && Width != 16 && Width != 32) FatalError("Only 8, 16 and 32 bps are supported"); break; case 'k': case 'K': InkLimit = atof(xoptarg); if (InkLimit < 0.0 || InkLimit > 400.0) FatalError("Ink limit must be 0%%..400%%"); break; case 's': case 'S': SaveEmbedded = xoptarg; break; case 'H': case 'h': { int a = atoi(xoptarg); Help(a); } break; default: FatalError("Unknown option - run without args to see valid ones"); } } } // The main sink int main(int argc, char* argv[]) { TIFF *in, *out; cmsPlugin(&TiffLabPlugin); InitUtils("tificc"); HandleSwitches(argc, argv); if ((argc - xoptind) != 2) { Help(0); } TIFFSetErrorHandler(ConsoleErrorHandler); TIFFSetWarningHandler(ConsoleWarningHandler); in = TIFFOpen(argv[xoptind], "r"); if (in == NULL) FatalError("Unable to open '%s'", argv[xoptind]); out = TIFFOpen(argv[xoptind+1], "w"); if (out == NULL) { TIFFClose(in); FatalError("Unable to write '%s'", argv[xoptind+1]); } do { TransformImage(in, out, cInpProf); } while (TIFFReadDirectory(in)); if (Verbose) { fprintf(stdout, "\n"); fflush(stdout); } TIFFClose(in); TIFFClose(out); return 0; } lcms2-2.6/utils/delphi/0000755002406300000240000000000012311617072014333 5ustar mariamauserslcms2-2.6/utils/delphi/demo1.dfm0000755002406300000240000001046012311617072016034 0ustar mariamausers TFORM10 TPF0TForm1Form1LeftTopCaptionLittle cms 2 Delphi demo ClientHeight ClientWidthColor clBtnFaceConstraints.MinHeight Font.CharsetDEFAULT_CHARSET Font.Color clWindowText Font.Height Font.Name MS Sans Serif Font.Style OldCreateOrder PixelsPerInch` TextHeightTImageImage1LeftTopWidth\Height Margins.Left Margins.Top Margins.RightMargins.BottomAlignalLeftStretch ExplicitLeftTImageImage2LeftfTopWidthjHeight Margins.Left Margins.Top Margins.RightMargins.BottomAlignalClientStretch ExplicitLeftn ExplicitWidthExplicitHeightP TSplitter Splitter1Left\TopWidth Height Margins.Left Margins.Top Margins.RightMargins.BottomBeveled ExplicitLeft ExplicitTopExplicitHeightTPanelPanel1LeftTopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAlignalBottomConstraints.MinWidthhCtl3D ParentCtl3DTabOrder ExplicitTop DesignSizeTLabelLabel1Left(TopWidthGHeight Margins.Left Margins.Top Margins.RightMargins.Bottom AlignmenttaRightJustifyAnchors akLeftakBottomCaptionInput profile: ExplicitTopSTLabelLabel2Left%TopWidthWHeight Margins.Left Margins.Top Margins.RightMargins.Bottom AlignmenttaRightJustifyAnchors akLeftakBottomCaptionMonitor profile: ExplicitToppTLabelLabel3Left(Top6WidthdHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakRightakBottomCaptionRendering intent:LayouttlCenterTLabelLabel4Left%Top`WidthHeightAnchors akLeftakBottomCaption Adaptation state (abs col. only)TButtonButton3LeftTopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akRightakBottomCaption...TabOrder OnClick Button3Click TComboBox ComboBoxInputLeftTopWidth(Height Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakRightakBottomCtl3D ParentCtl3DTabOrderTButtonButton2Left Top6WidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakBottomCaption Load &pictureTabOrderOnClick Button2Click TComboBoxComboBoxOutputLeftTopWidth(Height Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakRightakBottomTabOrder TCheckBoxWBCompensationLeft'TopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakBottomCaptionBlack point compensationTabOrder TCheckBox NoTransformLeftTopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akRightakBottomCaptionDon't transform at allTabOrder TRadioGroup RadioGroup1Left TophWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakBottomCaptionTroughput optimization ItemIndex Items.Strings &No optimize (top quality, slow)&More memory (quality)&Standard (Balanced)&Less memory (for previews)TabOrderTButtonButton1LeftTopWidthHeight) Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakRightakBottomCaptionApply profilesTabOrderOnClick Button1Click TProgressBar ProgressBar1Left TopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akLeftakRightakBottomTabOrder TComboBoxComboBoxIntentLeftTop6Width2Height Margins.Left Margins.Top Margins.RightMargins.BottomStylecsDropDownListAnchors akLeftakRightakBottomTabOrderOnChangeComboBoxIntentChange Items.Strings PerceptualRelative colorimetric SaturationAbsolute colorimetricTButtonButton4LeftTopWidthHeight Margins.Left Margins.Top Margins.RightMargins.BottomAnchors akRightakBottomCaption...TabOrder OnClick Button4Click TScrollBar ScrollBar1LeftTop`WidthHeightAnchors akLeftakRightakBottomEnabledPageSizeTabOrder OnChangeScrollBar1ChangeTOpenPictureDialogOpenPictureDialog1FilterBMP files|*.bmpLeftTop TOpenDialog OpenDialog1 DefaultExticmFilter 0) AND (Signature = cmsSigDisplayClass)) then InSignatures := TRUE else if (((dwFlags AND IS_OUTPUT) <> 0) AND (Signature = cmsSigOutputClass)) then InSignatures := TRUE else if (((dwFlags AND IS_INPUT) <> 0) AND (Signature = cmsSigInputClass)) then InSignatures := TRUE else if (((dwFlags AND IS_COLORSPACE) <> 0) AND (Signature = cmsSigColorSpaceClass)) then InSignatures := TRUE else if (((dwFlags AND IS_ABSTRACT) <> 0) AND (Signature = cmsSigAbstractClass)) then InSignatures := TRUE else InSignatures := FALSE END; PROCEDURE FillCombo(var Combo: TComboBox; Signatures: DWORD); var Files, Descriptions: TStringList; Found: Integer; SearchRec: TSearchRec; Path, Profile: String; Dir: ARRAY [0 .. 1024] OF Char; hProfile: cmsHPROFILE; Descrip: array [0 .. 256] of Char; begin Files := TStringList.Create; Descriptions := TStringList.Create; GetSystemDirectory(Dir, 1023); Path := String(Dir) + '\SPOOL\DRIVERS\COLOR\'; Found := FindFirst(Path + '*.ic?', faAnyFile, SearchRec); while Found = 0 do begin Profile := Path + SearchRec.Name; hProfile := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Profile)), 'r'); if (hProfile <> NIL) THEN begin if ((cmsGetColorSpace(hProfile) = cmsSigRgbData) AND InSignatures (cmsGetDeviceClass(hProfile), Signatures)) then begin cmsGetProfileInfo(hProfile, cmsInfoDescription, 'EN', 'us', Descrip, 256); Descriptions.Add(Descrip); Files.Add(Profile); end; cmsCloseProfile(hProfile); end; Found := FindNext(SearchRec); end; FindClose(SearchRec); Combo.Items := Descriptions; Combo.Tag := Integer(Files); end; // A rather simple Logger... note the "cdecl" convention PROCEDURE ErrorLogger(ContextID: cmsContext; ErrorCode: cmsUInt32Number; Text: PAnsiChar); Cdecl; begin MessageBox(0, PWideChar(WideString(Text)), 'Something is going wrong...', MB_OK OR MB_ICONWARNING or MB_TASKMODAL); end; constructor TForm1.Create(Owner: TComponent); var IntentNames: array [0 .. 20] of PAnsiChar; i, n: Integer; begin inherited Create(Owner); // Set the logger cmsSetLogErrorHandler(ErrorLogger); ScrollBar1.Min := 0; ScrollBar1.Max := 100; FillCombo(ComboBoxInput, IS_INPUT OR IS_COLORSPACE OR IS_DISPLAY); FillCombo(ComboBoxOutput, $FFFF ); // Get the supported intents n := cmsGetSupportedIntents(20, @IntentCodes, @IntentNames); ComboBoxIntent.Items.BeginUpdate; ComboBoxIntent.Items.Clear; for i:= 0 TO n - 1 DO ComboBoxIntent.Items.Add(String(IntentNames[i])); ComboBoxIntent.ItemIndex := 0; ComboBoxIntent.Items.EndUpdate; end; procedure TForm1.ScrollBar1Change(Sender: TObject); var d: Integer; s: String; begin d := ScrollBar1.Position; Str(d, s); Label4.Caption := 'Adaptation state '+s + '% (Abs. col only)'; end; procedure TForm1.Button2Click(Sender: TObject); begin if OpenPictureDialog1.Execute then begin Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); Image1.Picture.Bitmap.PixelFormat := pf24bit; Image2.Picture.LoadFromFile(OpenPictureDialog1.FileName); Image2.Picture.Bitmap.PixelFormat := pf24bit; end end; function SelectedFile(var Combo: TComboBox): string; var List: TStringList; n: Integer; begin List := TStringList(Combo.Tag); n := Combo.ItemIndex; if (n >= 0) then SelectedFile := List.Strings[n] else SelectedFile := Combo.Text; end; procedure TForm1.ComboBoxIntentChange(Sender: TObject); begin ScrollBar1.Enabled := (ComboBoxIntent.itemIndex = 3); end; function TForm1.ComputeFlags: DWORD; var dwFlags: DWORD; begin dwFlags := 0; if (WBCompensation.Checked) then begin dwFlags := dwFlags OR cmsFLAGS_BLACKPOINTCOMPENSATION end; if (NoTransform.Checked) then begin dwFlags := dwFlags OR cmsFLAGS_NULLTRANSFORM end; case RadioGroup1.ItemIndex of 0: dwFlags := dwFlags OR cmsFLAGS_NOOPTIMIZE; 1: dwFlags := dwFlags OR cmsFLAGS_HIGHRESPRECALC; 3: dwFlags := dwFlags OR cmsFLAGS_LOWRESPRECALC; end; ComputeFlags := dwFlags end; procedure TForm1.Button1Click(Sender: TObject); var Source, Dest: String; hSrc, hDest: cmsHPROFILE; xform: cmsHTRANSFORM; i, PicW, PicH: Integer; Intent: Integer; dwFlags: DWORD; begin Source := SelectedFile(ComboBoxInput); Dest := SelectedFile(ComboBoxOutput); dwFlags := ComputeFlags; Intent := IntentCodes[ComboBoxIntent.ItemIndex]; cmsSetAdaptationState( ScrollBar1.Position / 100.0 ); if (Source <> '') AND (Dest <> '') then begin hSrc := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Source)), 'r'); hDest := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Dest)), 'r'); if (hSrc <> Nil) and (hDest <> Nil) then begin xform := cmsCreateTransform(hSrc, TYPE_BGR_8, hDest, TYPE_BGR_8, Intent, dwFlags); end else begin xform := nil; end; if hSrc <> nil then begin cmsCloseProfile(hSrc); end; if hDest <> Nil then begin cmsCloseProfile(hDest); end; if (xform <> nil) then begin PicW := Image2.Picture.width; PicH := Image2.Picture.height; ProgressBar1.Min := 0; ProgressBar1.Max := PicH; ProgressBar1.Step := 1; for i := 0 TO (PicH - 1) do begin if ((i MOD 100) = 0) then ProgressBar1.Position := i; cmsDoTransform(xform, Image1.Picture.Bitmap.Scanline[i], Image2.Picture.Bitmap.Scanline[i], PicW); end; ProgressBar1.Position := PicH; cmsDeleteTransform(xform); end; Image2.Repaint; ProgressBar1.Position := 0; end end; procedure TForm1.Button3Click(Sender: TObject); begin if OpenDialog1.Execute then ComboBoxInput.Text := OpenDialog1.FileName; end; procedure TForm1.Button4Click(Sender: TObject); begin if OpenDialog1.Execute then ComboBoxOutput.Text := OpenDialog1.FileName; end; end. lcms2-2.6/utils/delphi/delphidemo.res0000755002406300000240000000155412311617072017170 0ustar mariamausers   ( @wxx LLLx LLLLLLLx LLLLLLLLx LLLLLL@ LLw LLLLLLxwp LLLHLLxpx LLLLxwyHLćp LLLLGw{LćxxDDDDHw{ĄxDDDHxyĄDDDHHDDDDDDHHDDDDD@O?H?0MAINICON  lcms2-2.6/utils/delphi/delphidemo.dproj0000644002406300000240000001234712311617072017514 0ustar mariamausers {E3F889E8-CB8A-49AE-8173-4DDA022466BE} delphidemo.dpr Debug DCC32 12.0 true true Base true true Base true vcl;rtl;vclx;vclimg;vclactnband;dbrtl;vcldb;vcldbx;bdertl;vcltouch;xmlrtl;dsnap;dsnapcon;TeeUI;TeeDB;Tee;vclib;ibxpress;adortl;IndyCore;IndySystem;IndyProtocols;inet;intrawebdb_100_140;Intraweb_100_140;VclSmp;vclie;websnap;webdsnap;inetdb;inetdbbde;inetdbxpress;soaprtl;vclribbon;dbexpress;DbxCommonDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;DbxClientDriver;DataSnapServer;DBXInterBaseDriver;DBXMySQLDriver;dbxcds;DBXFirebirdDriver;DBXSybaseASEDriver;DBXSybaseASADriver;DBXOracleDriver;DBXMSSQLDriver;DBXInformixDriver;DBXDb2Driver;Rave77VCL 00400000 1 delphidemo.exe WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) x86 true false false false false false RELEASE;$(DCC_Define) 0 false DEBUG;$(DCC_Define) MainSource
Form1
Base Cfg_2 Base Cfg_1 Base
Delphi.Personality.12 VCLApplication delphidemo.dpr False d:\lcms-1.13\delphi True False False False 1 0 0 0 False False False False False 3082 1252 1.0.0.0 1.0.0.0 Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components False 12
lcms2-2.6/utils/delphi/lcms2dll.pas0000644002406300000240000034267312311617072016573 0ustar mariamausers// // Little cms DELPHI wrapper //--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // // Version 2.6 // UNIT lcms2dll; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} INTERFACE {$IFNDEF MSWINDOWS} USES LCLType, types; Type PWChar = PWideChar; {$ELSE} USES Windows; {$ENDIF} CONST LCMS2_SO = {$IFDEF DARWIN} 'liblcms2.2.dylib'; {$ELSE} 'lcms2.dll'; {$ENDIF} TYPE Uint8 = Byte; Int8 = Shortint; UInt16 = Word; Int16 = Smallint; UInt32 = LongWord; Int32 = Longint; TYPE cmsUInt8Number = Uint8; cmsInt8Number = Int8; cmsUInt16Number = UInt16; cmsInt16Number = Int16; cmsUInt32Number = UInt32; cmsInt32Number = Int32; cmsInt64Number = Int64; cmsUInt64Number = UInt64; cmsFloat32Number = Single; cmsFloat64Number = Double; LPcmsUInt8Number = ^cmsUInt8Number; LPcmsInt8Number = ^cmsInt8Number; LPcmsUInt16Number = ^cmsUInt16Number; LPcmsInt16Number = ^cmsInt16Number; LPcmsUInt32Number = ^cmsUInt32Number; LPcmsInt32Number = ^cmsInt32Number; LPcmsInt64Number = ^cmsInt64Number; LPcmsUInt64Number = ^cmsUInt64Number; LPcmsFloat32Number = ^cmsFloat32Number; LPcmsFloat64Number = ^cmsFloat64Number; // Derivative types cmsSignature = cmsUInt32Number; cmsU8Fixed8Number = cmsUInt16Number; cmsS15Fixed16Number = cmsInt32Number; cmsU16Fixed16Number = cmsUInt32Number; // Boolean type, which will be using the native integer cmsBool = Boolean; CONST // Some common definitions cmsMAX_PATH = 256; // D50 XYZ normalized to Y=1.0 cmsD50X = 0.9642; cmsD50Y = 1.0; cmsD50Z = 0.8249; // V4 perceptual black cmsPERCEPTUAL_BLACK_X = 0.00336; cmsPERCEPTUAL_BLACK_Y = 0.0034731; cmsPERCEPTUAL_BLACK_Z = 0.00287; // Definitions in ICC spec cmsMagicNumber = $61637370; // 'acsp' lcmsSignature = $6c636d73; // 'lcms' TYPE // Base ICC type definitions cmsTagTypeSignature = ( cmsSigChromaticityType = $6368726D, // 'chrm' cmsSigColorantOrderType = $636C726F, // 'clro' cmsSigColorantTableType = $636C7274, // 'clrt' cmsSigCrdInfoType = $63726469, // 'crdi' cmsSigCurveType = $63757276, // 'curv' cmsSigDataType = $64617461, // 'data' cmsSigDictType = $64696374, // 'dict' cmsSigDateTimeType = $6474696D, // 'dtim' cmsSigDeviceSettingsType = $64657673, // 'devs' cmsSigLut16Type = $6d667432, // 'mft2' cmsSigLut8Type = $6d667431, // 'mft1' cmsSigLutAtoBType = $6d414220, // 'mAB ' cmsSigLutBtoAType = $6d424120, // 'mBA ' cmsSigMeasurementType = $6D656173, // 'meas' cmsSigMultiLocalizedUnicodeType = $6D6C7563, // 'mluc' cmsSigMultiProcessElementType = $6D706574, // 'mpet' cmsSigNamedColorType = $6E636f6C, // 'ncol' -- DEPRECATED! cmsSigNamedColor2Type = $6E636C32, // 'ncl2' cmsSigParametricCurveType = $70617261, // 'para' cmsSigProfileSequenceDescType = $70736571, // 'pseq' cmsSigProfileSequenceIdType = $70736964, // 'psid' cmsSigResponseCurveSet16Type = $72637332, // 'rcs2' cmsSigS15Fixed16ArrayType = $73663332, // 'sf32' cmsSigScreeningType = $7363726E, // 'scrn' cmsSigSignatureType = $73696720, // 'sig ' cmsSigTextType = $74657874, // 'text' cmsSigTextDescriptionType = $64657363, // 'desc' cmsSigU16Fixed16ArrayType = $75663332, // 'uf32' cmsSigUcrBgType = $62666420, // 'bfd ' cmsSigUInt16ArrayType = $75693136, // 'ui16' cmsSigUInt32ArrayType = $75693332, // 'ui32' cmsSigUInt64ArrayType = $75693634, // 'ui64' cmsSigUInt8ArrayType = $75693038, // 'ui08' cmsSigViewingConditionsType = $76696577, // 'view' cmsSigXYZType = $58595A20, // 'XYZ ' cmsSigVcgtType = $76636774 // 'vcgt' ); // Base ICC tag definitions cmsTagSignature = ( cmsSigAToB0Tag = $41324230, // 'A2B0' cmsSigAToB1Tag = $41324231, // 'A2B1' cmsSigAToB2Tag = $41324232, // 'A2B2' cmsSigBlueColorantTag = $6258595A, // 'bXYZ' cmsSigBlueMatrixColumnTag = $6258595A, // 'bXYZ' cmsSigBlueTRCTag = $62545243, // 'bTRC' cmsSigBToA0Tag = $42324130, // 'B2A0' cmsSigBToA1Tag = $42324131, // 'B2A1' cmsSigBToA2Tag = $42324132, // 'B2A2' cmsSigCalibrationDateTimeTag = $63616C74, // 'calt' cmsSigCharTargetTag = $74617267, // 'targ' cmsSigChromaticAdaptationTag = $63686164, // 'chad' cmsSigChromaticityTag = $6368726D, // 'chrm' cmsSigColorantOrderTag = $636C726F, // 'clro' cmsSigColorantTableTag = $636C7274, // 'clrt' cmsSigColorantTableOutTag = $636C6F74, // 'clot' cmsSigColorimetricIntentImageStateTag = $63696973, // 'ciis' cmsSigCopyrightTag = $63707274, // 'cprt' cmsSigCrdInfoTag = $63726469, // 'crdi' cmsSigDataTag = $64617461, // 'data' cmsSigDateTimeTag = $6474696D, // 'dtim' cmsSigDeviceMfgDescTag = $646D6E64, // 'dmnd' cmsSigDeviceModelDescTag = $646D6464, // 'dmdd' cmsSigDeviceSettingsTag = $64657673, // 'devs' cmsSigDToB0Tag = $44324230, // 'D2B0' cmsSigDToB1Tag = $44324231, // 'D2B1' cmsSigDToB2Tag = $44324232, // 'D2B2' cmsSigDToB3Tag = $44324233, // 'D2B3' cmsSigBToD0Tag = $42324430, // 'B2D0' cmsSigBToD1Tag = $42324431, // 'B2D1' cmsSigBToD2Tag = $42324432, // 'B2D2' cmsSigBToD3Tag = $42324433, // 'B2D3' cmsSigGamutTag = $67616D74, // 'gamt' cmsSigGrayTRCTag = $6b545243, // 'kTRC' cmsSigGreenColorantTag = $6758595A, // 'gXYZ' cmsSigGreenMatrixColumnTag = $6758595A, // 'gXYZ' cmsSigGreenTRCTag = $67545243, // 'gTRC' cmsSigLuminanceTag = $6C756d69, // 'lumi' cmsSigMeasurementTag = $6D656173, // 'meas' cmsSigMediaBlackPointTag = $626B7074, // 'bkpt' cmsSigMediaWhitePointTag = $77747074, // 'wtpt' cmsSigNamedColorTag = $6E636f6C, // 'ncol' // Deprecated by the ICC cmsSigNamedColor2Tag = $6E636C32, // 'ncl2' cmsSigOutputResponseTag = $72657370, // 'resp' cmsSigPerceptualRenderingIntentGamutTag = $72696730, // 'rig0' cmsSigPreview0Tag = $70726530, // 'pre0' cmsSigPreview1Tag = $70726531, // 'pre1' cmsSigPreview2Tag = $70726532, // 'pre2' cmsSigProfileDescriptionTag = $64657363, // 'desc' cmsSigProfileSequenceDescTag = $70736571, // 'pseq' cmsSigProfileSequenceIdTag = $70736964, // 'psid' cmsSigPs2CRD0Tag = $70736430, // 'psd0' cmsSigPs2CRD1Tag = $70736431, // 'psd1' cmsSigPs2CRD2Tag = $70736432, // 'psd2' cmsSigPs2CRD3Tag = $70736433, // 'psd3' cmsSigPs2CSATag = $70733273, // 'ps2s' cmsSigPs2RenderingIntentTag = $70733269, // 'ps2i' cmsSigRedColorantTag = $7258595A, // 'rXYZ' cmsSigRedMatrixColumnTag = $7258595A, // 'rXYZ' cmsSigRedTRCTag = $72545243, // 'rTRC' cmsSigSaturationRenderingIntentGamutTag = $72696732, // 'rig2' cmsSigScreeningDescTag = $73637264, // 'scrd' cmsSigScreeningTag = $7363726E, // 'scrn' cmsSigTechnologyTag = $74656368, // 'tech' cmsSigUcrBgTag = $62666420, // 'bfd ' cmsSigViewingCondDescTag = $76756564, // 'vued' cmsSigViewingConditionsTag = $76696577, // 'view' cmsSigVcgtTag = $76636774, // 'vcgt' cmsSigMetaTag = $6D657461 // 'meta' ); // ICC Technology tag cmsTechnologySignature = ( cmsSigDigitalCamera = $6463616D, // 'dcam' cmsSigFilmScanner = $6673636E, // 'fscn' cmsSigReflectiveScanner = $7273636E, // 'rscn' cmsSigInkJetPrinter = $696A6574, // 'ijet' cmsSigThermalWaxPrinter = $74776178, // 'twax' cmsSigElectrophotographicPrinter = $6570686F, // 'epho' cmsSigElectrostaticPrinter = $65737461, // 'esta' cmsSigDyeSublimationPrinter = $64737562, // 'dsub' cmsSigPhotographicPaperPrinter = $7270686F, // 'rpho' cmsSigFilmWriter = $6670726E, // 'fprn' cmsSigVideoMonitor = $7669646D, // 'vidm' cmsSigVideoCamera = $76696463, // 'vidc' cmsSigProjectionTelevision = $706A7476, // 'pjtv' cmsSigCRTDisplay = $43525420, // 'CRT ' cmsSigPMDisplay = $504D4420, // 'PMD ' cmsSigAMDisplay = $414D4420, // 'AMD ' cmsSigPhotoCD = $4B504344, // 'KPCD' cmsSigPhotoImageSetter = $696D6773, // 'imgs' cmsSigGravure = $67726176, // 'grav' cmsSigOffsetLithography = $6F666673, // 'offs' cmsSigSilkscreen = $73696C6B, // 'silk' cmsSigFlexography = $666C6578, // 'flex' cmsSigMotionPictureFilmScanner = $6D706673, // 'mpfs' cmsSigMotionPictureFilmRecorder = $6D706672, // 'mpfr' cmsSigDigitalMotionPictureCamera = $646D7063, // 'dmpc' cmsSigDigitalCinemaProjector = $64636A70 // 'dcpj' ); // ICC Color spaces cmsColorSpaceSignature = ( cmsSigXYZData = $58595A20, // 'XYZ ' cmsSigLabData = $4C616220, // 'Lab ' cmsSigLuvData = $4C757620, // 'Luv ' cmsSigYCbCrData = $59436272, // 'YCbr' cmsSigYxyData = $59787920, // 'Yxy ' cmsSigRgbData = $52474220, // 'RGB ' cmsSigGrayData = $47524159, // 'GRAY' cmsSigHsvData = $48535620, // 'HSV ' cmsSigHlsData = $484C5320, // 'HLS ' cmsSigCmykData = $434D594B, // 'CMYK' cmsSigCmyData = $434D5920, // 'CMY ' cmsSigMCH1Data = $4D434831, // 'MCH1' cmsSigMCH2Data = $4D434832, // 'MCH2' cmsSigMCH3Data = $4D434833, // 'MCH3' cmsSigMCH4Data = $4D434834, // 'MCH4' cmsSigMCH5Data = $4D434835, // 'MCH5' cmsSigMCH6Data = $4D434836, // 'MCH6' cmsSigMCH7Data = $4D434837, // 'MCH7' cmsSigMCH8Data = $4D434838, // 'MCH8' cmsSigMCH9Data = $4D434839, // 'MCH9' cmsSigMCHAData = $4D43483A, // 'MCHA' cmsSigMCHBData = $4D43483B, // 'MCHB' cmsSigMCHCData = $4D43483C, // 'MCHC' cmsSigMCHDData = $4D43483D, // 'MCHD' cmsSigMCHEData = $4D43483E, // 'MCHE' cmsSigMCHFData = $4D43483F, // 'MCHF' cmsSigNamedData = $6e6d636c, // 'nmcl' cmsSig1colorData = $31434C52, // '1CLR' cmsSig2colorData = $32434C52, // '2CLR' cmsSig3colorData = $33434C52, // '3CLR' cmsSig4colorData = $34434C52, // '4CLR' cmsSig5colorData = $35434C52, // '5CLR' cmsSig6colorData = $36434C52, // '6CLR' cmsSig7colorData = $37434C52, // '7CLR' cmsSig8colorData = $38434C52, // '8CLR' cmsSig9colorData = $39434C52, // '9CLR' cmsSig10colorData = $41434C52, // 'ACLR' cmsSig11colorData = $42434C52, // 'BCLR' cmsSig12colorData = $43434C52, // 'CCLR' cmsSig13colorData = $44434C52, // 'DCLR' cmsSig14colorData = $45434C52, // 'ECLR' cmsSig15colorData = $46434C52, // 'FCLR' cmsSigLuvKData = $4C75764B // 'LuvK' ); // ICC Profile Class cmsProfileClassSignature = ( cmsSigInputClass = $73636E72, // 'scnr' cmsSigDisplayClass = $6D6E7472, // 'mntr' cmsSigOutputClass = $70727472, // 'prtr' cmsSigLinkClass = $6C696E6B, // 'link' cmsSigAbstractClass = $61627374, // 'abst' cmsSigColorSpaceClass = $73706163, // 'spac' cmsSigNamedColorClass = $6e6d636c // 'nmcl' ); // ICC Platforms cmsPlatformSignature = ( cmsSigMacintosh = $4150504C, // 'APPL' cmsSigMicrosoft = $4D534654, // 'MSFT' cmsSigSolaris = $53554E57, // 'SUNW' cmsSigSGI = $53474920, // 'SGI ' cmsSigTaligent = $54474E54, // 'TGNT' cmsSigUnices = $2A6E6978 // '*nix' // From argyll -- Not official ); CONST // Reference gamut cmsSigPerceptualReferenceMediumGamut = $70726d67; //'prmg' // For cmsSigColorimetricIntentImageStateTag cmsSigSceneColorimetryEstimates = $73636F65; //'scoe' cmsSigSceneAppearanceEstimates = $73617065; //'sape' cmsSigFocalPlaneColorimetryEstimates = $66706365; //'fpce' cmsSigReflectionHardcopyOriginalColorimetry = $72686F63; //'rhoc' cmsSigReflectionPrintOutputColorimetry = $72706F63; //'rpoc' TYPE // Multi process elements types cmsStageSignature = ( cmsSigCurveSetElemType = $63767374, //'cvst' cmsSigMatrixElemType = $6D617466, //'matf' cmsSigCLutElemType = $636C7574, //'clut' cmsSigBAcsElemType = $62414353, // 'bACS' cmsSigEAcsElemType = $65414353, // 'eACS' // Custom from here, not in the ICC Spec cmsSigXYZ2LabElemType = $6C327820, // 'l2x ' cmsSigLab2XYZElemType = $78326C20, // 'x2l ' cmsSigNamedColorElemType = $6E636C20, // 'ncl ' cmsSigLabV2toV4 = $32203420, // '2 4 ' cmsSigLabV4toV2 = $34203220, // '4 2 ' // Identities cmsSigIdentityElemType = $69646E20 // 'idn ' ); // Types of CurveElements cmsCurveSegSignature = ( cmsSigFormulaCurveSeg = $70617266, // 'parf' cmsSigSampledCurveSeg = $73616D66, // 'samf' cmsSigSegmentedCurve = $63757266 // 'curf' ); CONST // Used in ResponseCurveType cmsSigStatusA = $53746141; //'StaA' cmsSigStatusE = $53746145; //'StaE' cmsSigStatusI = $53746149; //'StaI' cmsSigStatusT = $53746154; //'StaT' cmsSigStatusM = $5374614D; //'StaM' cmsSigDN = $444E2020; //'DN ' cmsSigDNP = $444E2050; //'DN P' cmsSigDNN = $444E4E20; //'DNN ' cmsSigDNNP = $444E4E50; //'DNNP' // Device attributes, currently defined values correspond to the low 4 bytes // of the 8 byte attribute quantity cmsReflective = 0; cmsTransparency = 1; cmsGlossy = 0; cmsMatte = 2; TYPE // Common structures in ICC tags cmsICCData = PACKED RECORD len : cmsUInt32Number; flag : cmsUInt32Number; data : Array [0..1] of cmsUInt8Number; END; // ICC date time cmsDateTimeNumber = PACKED RECORD year: cmsUInt16Number; month: cmsUInt16Number; day: cmsUInt16Number; hours: cmsUInt16Number; minutes: cmsUInt16Number; seconds: cmsUInt16Number; END; // ICC XYZ cmsEncodedXYZNumber = PACKED RECORD X: cmsS15Fixed16Number; Y: cmsS15Fixed16Number; Z: cmsS15Fixed16Number; END; // Profile ID as computed by MD5 algorithm cmsProfileID = PACKED RECORD CASE Integer OF 1: (ID8: Array[0..15] OF cmsUInt8Number); 2: (ID16: Array[0..7] OF cmsUInt16Number); 3: (ID32: Array[0..3] OF cmsUInt32Number); END; // ---------------------------------------------------------------------------------------------- // ICC profile internal base types. Strictly, shouldn't be declared in this unit, but maybe // somebody want to use this info for accessing profile header directly, so here it is. // Profile header -- it is 32-bit aligned, so no issues are expected on alignment cmsICCHeader = PACKED RECORD size: cmsUInt32Number; // Profile size in bytes cmmId: cmsSignature; // CMM for this profile version: cmsUInt32Number; // Format version number deviceClass: cmsProfileClassSignature; // Type of profile colorSpace: cmsColorSpaceSignature; // Color space of data pcs: cmsColorSpaceSignature; // PCS, XYZ or Lab only date: cmsDateTimeNumber; // Date profile was created magic: cmsSignature; // Magic Number to identify an ICC profile platform: cmsPlatformSignature; // Primary Platform flags: cmsUInt32Number; // Various bit settings manufacturer: cmsSignature; // Device manufacturer model: cmsUInt32Number; // Device model number attributes: cmsUInt64Number; // Device attributes renderingIntent:cmsUInt32Number; // Rendering intent illuminant: cmsEncodedXYZNumber; // Profile illuminant creator: cmsSignature; // Profile creator profileID: cmsProfileID; // Profile ID using MD5 reserved: array [0..27] of cmsInt8Number; // Reserved for future use END; // ICC base tag cmsTagBase = PACKED RECORD sig: cmsTagTypeSignature; reserved: array[0..3] of cmsInt8Number; END; // A tag entry in directory cmsTagEntry = PACKED RECORD sig: cmsTagSignature; // The tag signature offset: cmsUInt32Number; // Start of tag size: cmsUInt32Number; // Size in bytes END; cmsContext = Pointer; // Context identifier for multithreaded environments cmsHANDLE = Pointer; // Generic handle cmsHPROFILE = Pointer; // Opaque typedefs to hide internals cmsHTRANSFORM = Pointer; CONST cmsMAXCHANNELS = 16; // Maximum number of channels in ICC profiles // Format of pixel is defined by one cmsUInt32Number, using bit fields as follows // // A O TTTTT U Y F P X S EEE CCCC BBB // // A: Floating point -- With this flag we can differentiate 16 bits as float and as int // O: Optimized -- previous optimization already returns the final 8-bit value // T: Pixeltype // F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla) // P: Planar? 0=Chunky, 1=Planar // X: swap 16 bps endianess? // S: Do swap? ie, BGR, KYMC // E: Extra samples // C: Channels (Samples per pixel) // B: bytes per sample // Y: Swap first - changes ABGR to BGRA and KCMY to CMYK FUNCTION FLOAT_SH(a: cmsUInt32Number): cmsUInt32Number; FUNCTION OPTIMIZED_SH(s: cmsUInt32Number): cmsUInt32Number; FUNCTION COLORSPACE_SH(s: cmsUInt32Number):cmsUInt32Number; FUNCTION SWAPFIRST_SH(s: cmsUInt32Number):cmsUInt32Number; FUNCTION FLAVOR_SH(s: cmsUInt32Number):cmsUInt32Number; FUNCTION PLANAR_SH(p: cmsUInt32Number):cmsUInt32Number; FUNCTION ENDIAN16_SH(e: cmsUInt32Number):cmsUInt32Number; FUNCTION DOSWAP_SH(e: cmsUInt32Number):cmsUInt32Number; FUNCTION EXTRA_SH(e: cmsUInt32Number):cmsUInt32Number; FUNCTION CHANNELS_SH(c: cmsUInt32Number):cmsUInt32Number; FUNCTION BYTES_SH(b: cmsUInt32Number):cmsUInt32Number; FUNCTION T_FLOAT(a: cmsUInt32Number): cmsUInt32Number; FUNCTION T_OPTIMIZED(o: cmsUInt32Number): cmsUInt32Number; FUNCTION T_COLORSPACE(s: cmsUInt32Number): cmsUInt32Number; FUNCTION T_SWAPFIRST(s: cmsUInt32Number): cmsUInt32Number; FUNCTION T_FLAVOR(s: cmsUInt32Number): cmsUInt32Number; FUNCTION T_PLANAR(p: cmsUInt32Number): cmsUInt32Number; FUNCTION T_ENDIAN16(e: cmsUInt32Number): cmsUInt32Number; FUNCTION T_DOSWAP(e: cmsUInt32Number): cmsUInt32Number; FUNCTION T_EXTRA(e: cmsUInt32Number): cmsUInt32Number; FUNCTION T_CHANNELS(c: cmsUInt32Number): cmsUInt32Number; FUNCTION T_BYTES(b: cmsUInt32Number): cmsUInt32Number; CONST // Pixel types PT_ANY = 0; // Don't check colorspace // 1 & 2 are reserved PT_GRAY = 3; PT_RGB = 4; PT_CMY = 5; PT_CMYK = 6; PT_YCbCr = 7; PT_YUV = 8; // Lu'v' PT_XYZ = 9; PT_Lab = 10; PT_YUVK = 11; // Lu'v'K PT_HSV = 12; PT_HLS = 13; PT_Yxy = 14; PT_MCH1 = 15; PT_MCH2 = 16; PT_MCH3 = 17; PT_MCH4 = 18; PT_MCH5 = 19; PT_MCH6 = 20; PT_MCH7 = 21; PT_MCH8 = 22; PT_MCH9 = 23; PT_MCH10 = 24; PT_MCH11 = 25; PT_MCH12 = 26; PT_MCH13 = 27; PT_MCH14 = 28; PT_MCH15 = 29; PT_LabV2 = 30; // Identical to PT_Lab, but using the V2 old encoding // Format descriptors TYPE_GRAY_8 = $030009; TYPE_GRAY_8_REV = $032009; TYPE_GRAY_16 = $03000a; TYPE_GRAY_16_REV = $03200a; TYPE_GRAY_16_SE = $03080a; TYPE_GRAYA_8 = $030089; TYPE_GRAYA_16 = $03008a; TYPE_GRAYA_16_SE = $03088a; TYPE_GRAYA_8_PLANAR = $031089; TYPE_GRAYA_16_PLANAR = $03108a; TYPE_RGB_8 = $040019; TYPE_RGB_8_PLANAR = $041019; TYPE_BGR_8 = $040419; TYPE_BGR_8_PLANAR = $041419; TYPE_RGB_16 = $04001a; TYPE_RGB_16_PLANAR = $04101a; TYPE_RGB_16_SE = $04081a; TYPE_BGR_16 = $04041a; TYPE_BGR_16_PLANAR = $04141a; TYPE_BGR_16_SE = $040c1a; TYPE_RGBA_8 = $040099; TYPE_RGBA_8_PLANAR = $041099; TYPE_ARGB_8_PLANAR = $045099; TYPE_ABGR_8_PLANAR = $041499; TYPE_BGRA_8_PLANAR = $045499; TYPE_RGBA_16 = $04009a; TYPE_RGBA_16_PLANAR = $04109a; TYPE_RGBA_16_SE = $04089a; TYPE_ARGB_8 = $044099; TYPE_ARGB_16 = $04409a; TYPE_ABGR_8 = $040499; TYPE_ABGR_16 = $04049a; TYPE_ABGR_16_PLANAR = $04149a; TYPE_ABGR_16_SE = $040c9a; TYPE_BGRA_8 = $044499; TYPE_BGRA_16 = $04449a; TYPE_BGRA_16_SE = $04489a; TYPE_CMY_8 = $050019; TYPE_CMY_8_PLANAR = $051019; TYPE_CMY_16 = $05001a; TYPE_CMY_16_PLANAR = $05101a; TYPE_CMY_16_SE = $05081a; TYPE_CMYK_8 = $060021; TYPE_CMYKA_8 = $0600a1; TYPE_CMYK_8_REV = $062021; TYPE_YUVK_8 = $062021; TYPE_CMYK_8_PLANAR = $061021; TYPE_CMYK_16 = $060022; TYPE_CMYK_16_REV = $062022; TYPE_YUVK_16 = $062022; TYPE_CMYK_16_PLANAR = $061022; TYPE_CMYK_16_SE = $060822; TYPE_KYMC_8 = $060421; TYPE_KYMC_16 = $060422; TYPE_KYMC_16_SE = $060c22; TYPE_KCMY_8 = $064021; TYPE_KCMY_8_REV = $066021; TYPE_KCMY_16 = $064022; TYPE_KCMY_16_REV = $066022; TYPE_KCMY_16_SE = $064822; TYPE_CMYK5_8 = $130029; TYPE_CMYK5_16 = $13002a; TYPE_CMYK5_16_SE = $13082a; TYPE_KYMC5_8 = $130429; TYPE_KYMC5_16 = $13042a; TYPE_KYMC5_16_SE = $130c2a; TYPE_CMYK6_8 = $140031; TYPE_CMYK6_8_PLANAR = $141031; TYPE_CMYK6_16 = $140032; TYPE_CMYK6_16_PLANAR = $141032; TYPE_CMYK6_16_SE = $140832; TYPE_CMYK7_8 = $150039; TYPE_CMYK7_16 = $15003a; TYPE_CMYK7_16_SE = $15083a; TYPE_KYMC7_8 = $150439; TYPE_KYMC7_16 = $15043a; TYPE_KYMC7_16_SE = $150c3a; TYPE_CMYK8_8 = $160041; TYPE_CMYK8_16 = $160042; TYPE_CMYK8_16_SE = $160842; TYPE_KYMC8_8 = $160441; TYPE_KYMC8_16 = $160442; TYPE_KYMC8_16_SE = $160c42; TYPE_CMYK9_8 = $170049; TYPE_CMYK9_16 = $17004a; TYPE_CMYK9_16_SE = $17084a; TYPE_KYMC9_8 = $170449; TYPE_KYMC9_16 = $17044a; TYPE_KYMC9_16_SE = $170c4a; TYPE_CMYK10_8 = $180051; TYPE_CMYK10_16 = $180052; TYPE_CMYK10_16_SE = $180852; TYPE_KYMC10_8 = $180451; TYPE_KYMC10_16 = $180452; TYPE_KYMC10_16_SE = $180c52; TYPE_CMYK11_8 = $190059; TYPE_CMYK11_16 = $19005a; TYPE_CMYK11_16_SE = $19085a; TYPE_KYMC11_8 = $190459; TYPE_KYMC11_16 = $19045a; TYPE_KYMC11_16_SE = $190c5a; TYPE_CMYK12_8 = $1a0061; TYPE_CMYK12_16 = $1a0062; TYPE_CMYK12_16_SE = $1a0862; TYPE_KYMC12_8 = $1a0461; TYPE_KYMC12_16 = $1a0462; TYPE_KYMC12_16_SE = $1a0c62; TYPE_XYZ_16 = $09001a; TYPE_Lab_8 = $0a0019; TYPE_ALab_8 = $0a0499; TYPE_Lab_16 = $0a001a; TYPE_Yxy_16 = $0e001a; TYPE_YCbCr_8 = $070019; TYPE_YCbCr_8_PLANAR = $071019; TYPE_YCbCr_16 = $07001a; TYPE_YCbCr_16_PLANAR = $07101a; TYPE_YCbCr_16_SE = $07081a; TYPE_YUV_8 = $080019; TYPE_YUV_8_PLANAR = $081019; TYPE_YUV_16 = $08001a; TYPE_YUV_16_PLANAR = $08101a; TYPE_YUV_16_SE = $08081a; TYPE_HLS_8 = $0d0019; TYPE_HLS_8_PLANAR = $0d1019; TYPE_HLS_16 = $0d001a; TYPE_HLS_16_PLANAR = $0d101a; TYPE_HLS_16_SE = $0d081a; TYPE_HSV_8 = $0c0019; TYPE_HSV_8_PLANAR = $0c1019; TYPE_HSV_16 = $0c001a; TYPE_HSV_16_PLANAR = $0c101a; TYPE_HSV_16_SE = $0c081a; TYPE_NAMED_COLOR_INDEX = $000A; TYPE_XYZ_FLT = $49001c; TYPE_Lab_FLT = $4a001c; TYPE_GRAY_FLT = $43000c; TYPE_RGB_FLT = $44001c; TYPE_CMYK_FLT = $460024; TYPE_XYZA_FLT = $49009c; TYPE_LabA_FLT = $4a009c; TYPE_RGBA_FLT = $44009c; TYPE_XYZ_DBL = $490018; TYPE_Lab_DBL = $4a0018; TYPE_GRAY_DBL = $430008; TYPE_RGB_DBL = $440018; TYPE_CMYK_DBL = $460020; TYPE_LabV2_8 = $1e0019; TYPE_ALabV2_8 = $1e0499; TYPE_LabV2_16 = $1e001a; TYPE_GRAY_HALF_FLT = $43000a; TYPE_RGB_HALF_FLT = $44001a; TYPE_RGBA_HALF_FLT = $44009a; TYPE_CMYK_HALF_FLT = $460022; TYPE_ARGB_HALF_FLT = $44409a; TYPE_BGR_HALF_FLT = $44041a; TYPE_BGRA_HALF_FLT = $44449a; TYPE_ABGR_HALF_FLT = $44041a; TYPE // Colorimetric spaces cmsCIEXYZ = PACKED RECORD X, Y, Z : cmsFloat64Number; END; LPcmsCIEXYZ = ^cmsCIEXYZ; cmsCIExyY = PACKED RECORD x, y, YY : cmsFloat64Number END; LPcmsCIExyY = ^cmsCIEXYY; cmsCIELab = PACKED RECORD L, a, b: cmsFloat64Number END; LPcmsCIELab = ^cmsCIELab; cmsCIELCh = PACKED RECORD L, C, h : cmsFloat64Number END; LPcmsCIELCh = ^cmsCIELCh; cmsJCh = PACKED RECORD J, C, h : cmsFloat64Number END; LPcmsJCh = ^cmsJCH; cmsCIEXYZTRIPLE = PACKED RECORD Red, Green, Blue : cmsCIEXYZ END; LPcmsCIEXYZTRIPLE = ^cmsCIEXYZTRIPLE; cmsCIExyYTRIPLE = PACKED RECORD Red, Green, Blue : cmsCIExyY END; LPcmsCIExyYTRIPLE = ^cmsCIExyYTRIPLE; CONST // Illuminant types for structs below cmsILLUMINANT_TYPE_UNKNOWN = $0000000; cmsILLUMINANT_TYPE_D50 = $0000001; cmsILLUMINANT_TYPE_D65 = $0000002; cmsILLUMINANT_TYPE_D93 = $0000003; cmsILLUMINANT_TYPE_F2 = $0000004; cmsILLUMINANT_TYPE_D55 = $0000005; cmsILLUMINANT_TYPE_A = $0000006; cmsILLUMINANT_TYPE_E = $0000007; cmsILLUMINANT_TYPE_F8 = $0000008; TYPE cmsICCMeasurementConditions = PACKED RECORD Observer: cmsUInt32Number; // 0 = unknown, 1=CIE 1931, 2=CIE 1964 Backing: cmsCIEXYZ; // Value of backing Geometry: cmsUInt32Number; // 0=unknown, 1=45/0, 0/45 2=0d, d/0 Flare: cmsFloat64Number; // 0..1.0 IlluminantType: cmsUInt32Number; END; cmsICCViewingConditions = PACKED RECORD IlluminantXYZ: cmsCIEXYZ; // Not the same struct as CAM02, SurroundXYZ: cmsCIEXYZ; // This is for storing the tag IlluminantType: cmsUInt32Number; // viewing condition END; // Context -------------------------------------------------------------------------------------------------------------- FUNCTION cmsCreateContext(Plugin : Pointer; UserData : Pointer) : cmsContext; StdCall; PROCEDURE cmsDeleteContext(ContextID: cmsContext); StdCall; FUNCTION cmsDupContext(ContextID: cmsContext; NewUserData: Pointer): cmsContext; StdCall; FUNCTION cmsGetContextUserData(ContextID: cmsContext): Pointer; StdCall; // Plug-In registering --------------------------------------------------------------------------------------------------- FUNCTION cmsPlugin(Plugin: Pointer): cmsBool; StdCall; PROCEDURE cmsUnregisterPlugins; StdCall; // Error logging ---------------------------------------------------------------------------------------------------------- // There is no error handling at all. When a function fails, it returns proper value. // For example, all create functions does return NULL on failure. Other may return FALSE. // It may be interesting, for the developer, to know why the function is failing. // for that reason, lcms2 does offer a logging function. This function will get // an ENGLISH string with some clues on what is going wrong. You can show this // info to the end user if you wish, or just create some sort of log on disk. // The logging function should NOT terminate the program, as this obviously can leave // unfreed resources. It is the programmer's responsibility to check each function // return code to make sure it didn't fail. CONST cmsERROR_UNDEFINED = 0; cmsERROR_FILE = 1; cmsERROR_RANGE = 2; cmsERROR_INTERNAL = 3; cmsERROR_NULL = 4; cmsERROR_READ = 5; cmsERROR_SEEK = 6; cmsERROR_WRITE = 7; cmsERROR_UNKNOWN_EXTENSION = 8; cmsERROR_COLORSPACE_CHECK = 9; cmsERROR_ALREADY_DEFINED = 10; cmsERROR_BAD_SIGNATURE = 11; cmsERROR_CORRUPTION_DETECTED = 12; cmsERROR_NOT_SUITABLE = 13; // Error logger is called with the ContextID when a message is raised. This gives the // chance to know which thread is responsible of the warning and any environment associated // with it. Non-multithreading applications may safely ignore this parameter. // Note that under certain special circumstances, ContextID may be NULL. TYPE cmsLogErrorHandlerFunction = PROCEDURE( ContextID: cmsContext; ErrorCode: cmsUInt32Number; Text: PAnsiChar); CDecl; // Allows user to set any specific logger PROCEDURE cmsSetLogErrorHandler(Fn: cmsLogErrorHandlerFunction); StdCall; // Conversions -------------------------------------------------------------------------------------------------------------- // Returns pointers to constant structs FUNCTION cmsD50_XYZ: LPcmsCIEXYZ; StdCall; FUNCTION cmsD50_xyY: LPcmsCIExyY; StdCall; // Colorimetric space conversions PROCEDURE cmsXYZ2xyY(Dest: LPcmsCIExyY; Source: LPcmsCIEXYZ); StdCall; PROCEDURE cmsxyY2XYZ(Dest: LPcmsCIEXYZ; Source: LPcmsCIExyY); StdCall; PROCEDURE cmsLab2XYZ(WhitePoint: LPcmsCIEXYZ; xyz: LPcmsCIEXYZ; Lab: LPcmsCIELab); StdCall; PROCEDURE cmsXYZ2Lab(WhitePoint: LPcmsCIEXYZ; Lab: LPcmsCIELab; xyz: LPcmsCIEXYZ); StdCall; PROCEDURE cmsLab2LCh(LCh: LPcmsCIELCh; Lab: LPcmsCIELab); StdCall; PROCEDURE cmsLCh2Lab(Lab: LPcmsCIELab; LCh: LPcmsCIELCh); StdCall; // Encoding /Decoding on PCS PROCEDURE cmsLabEncoded2Float(Lab: LPcmsCIELab; wLab: Pointer); StdCall; PROCEDURE cmsLabEncoded2FloatV2(Lab: LPcmsCIELab; wLab: Pointer); StdCall; PROCEDURE cmsFloat2LabEncoded(wLab: Pointer; Lab: LPcmsCIELab); StdCall; PROCEDURE cmsFloat2LabEncodedV2(wLab: Pointer; Lab: LPcmsCIELab); StdCall; PROCEDURE cmsXYZEncoded2Float(fxyz : LPcmsCIEXYZ; XYZ: Pointer); StdCall; PROCEDURE cmsFloat2XYZEncoded(XYZ: Pointer; fXYZ: LPcmsCIEXYZ); StdCall; // DeltaE metrics FUNCTION cmsDeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; FUNCTION cmsCIE94DeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; FUNCTION cmsBFDdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; FUNCTION cmsCMCdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; FUNCTION cmsCIE2000DeltaE(Lab1, Lab2: LPcmsCIELab; Kl, Kc, Kh: Double): Double; StdCall; // Temperature <-> Chromaticity (Black body) FUNCTION cmsWhitePointFromTemp(var WhitePoint: cmsCIExyY; TempK: cmsFloat64Number) : cmsBool; StdCall; FUNCTION cmsTempFromWhitePoint(var TeampK: cmsFloat64Number; var WhitePoint: cmsCIExyY) : cmsBool; StdCall; // Chromatic adaptation FUNCTION cmsAdaptToIlluminant(Result: LPcmsCIEXYZ; SourceWhitePt: LPcmsCIEXYZ; Illuminant: LPcmsCIEXYZ; Value: LPcmsCIEXYZ): cmsBool; StdCall; // CIECAM02 --------------------------------------------------------------------------------------------------- // Viewing conditions. Please note those are CAM model viewing conditions, and not the ICC tag viewing // conditions, which I'm naming cmsICCViewingConditions to make differences evident. Unfortunately, the tag // cannot deal with surround La, Yb and D value so is basically useless to store CAM02 viewing conditions. CONST AVG_SURROUND = 1; DIM_SURROUND = 2; DARK_SURROUND = 3; CUTSHEET_SURROUND = 4; D_CALCULATE = -1; TYPE cmsViewingConditions = PACKED RECORD WhitePoint: cmsCIEXYZ; Yb : cmsFloat64Number; La : cmsFloat64Number; surround : Integer; D_value : cmsFloat64Number END; LPcmsViewingConditions = ^cmsViewingConditions; FUNCTION cmsCIECAM02Init(pVC : LPcmsViewingConditions ) : Pointer; StdCall; PROCEDURE cmsCIECAM02Done(hModel : Pointer); StdCall; PROCEDURE cmsCIECAM02Forward(hModel: Pointer; pIn: LPcmsCIEXYZ; pOut: LPcmsJCh ); StdCall; PROCEDURE cmsCIECAM02Reverse(hModel: Pointer; pIn: LPcmsJCh; pOut: LPcmsCIEXYZ ); StdCall; // Tone curves ----------------------------------------------------------------------------------------- // This describes a curve segment. For a table of supported types, see the manual. User can increase the number of // available types by using a proper plug-in. Parametric segments allow 10 parameters at most TYPE cmsCurveSegment = PACKED RECORD x0, x1: cmsFloat32Number; // Domain; for x0 < x <= x1 PType: cmsInt32Number; // Parametric type, Type == 0 means sampled segment. Negative values are reserved Params: array [0..9] of cmsFloat64Number; // Parameters if Type != 0 nGridPoints: cmsUInt32Number; // Number of grid points if Type == 0 SampledPoints: LPcmsFloat32Number; // Points to an array of floats if Type == 0 END; LPcmsToneCurve = Pointer; LPcmsCurveSegmentArray = ^cmsCurveSegmentArray; cmsCurveSegmentArray = array[0..0] of cmsCurveSegment; LPcmsFloat64NumberArray = ^cmsFloat64NumberArray; cmsFloat64NumberArray = array[0..0] of cmsFloat64Number; LPcmsUInt16NumberArray = ^cmsUInt16NumberArray; cmsUInt16NumberArray = array[0..0] of cmsUInt16Number; LPcmsFloat32NumberArray = ^cmsFloat32NumberArray; cmsFloat32NumberArray = array[0..0] of cmsFloat32Number; LPLPcmsToneCurveArray = ^LPcmsToneCurveArray; LPcmsToneCurveArray = array[0..0] of LPcmsToneCurve; LPcmsUInt32NumberArray = ^cmsUInt32NumberArray; cmsUInt32NumberArray = array[0..0] of cmsUInt32Number; FUNCTION cmsBuildSegmentedToneCurve(ContextID: cmsContext; nSegments: cmsInt32Number; Segments: LPcmsCurveSegmentArray): LPcmsToneCurve; StdCall; FUNCTION cmsBuildParametricToneCurve(ContextID: cmsContext; CType: cmsInt32Number; Params: LPcmsFloat64NumberArray): LPcmsToneCurve; StdCall; FUNCTION cmsBuildGamma(ContextID: cmsContext; Gamma: cmsFloat64Number): LPcmsToneCurve; StdCall; FUNCTION cmsBuildTabulatedToneCurve16(ContextID: cmsContext; nEntries: cmsInt32Number; values: LPcmsUInt16NumberArray): LPcmsToneCurve; StdCall; FUNCTION cmsBuildTabulatedToneCurveFloat(ContextID: cmsContext; nEntries: cmsUInt32Number; values: LPcmsFloat32NumberArray): LPcmsToneCurve; StdCall; PROCEDURE cmsFreeToneCurve(Curve: LPcmsToneCurve); StdCall; PROCEDURE cmsFreeToneCurveTriple(Curve: LPLPcmsToneCurveArray); StdCall; FUNCTION cmsDupToneCurve(Src: LPcmsToneCurve): LPcmsToneCurve; StdCall; FUNCTION cmsReverseToneCurve(InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; FUNCTION cmsReverseToneCurveEx(nResultSamples: cmsInt32Number; InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; FUNCTION cmsJoinToneCurve(ContextID: cmsContext; X, Y: LPcmsToneCurve; nPoints: cmsUInt32Number ): LPcmsToneCurve; StdCall; FUNCTION cmsSmoothToneCurve(Tab: LPcmsToneCurve; lambda: cmsFloat64Number): cmsBool; StdCall; FUNCTION cmsEvalToneCurveFloat(Curve: LPcmsToneCurve; v: cmsFloat32Number):cmsFloat32Number; StdCall; FUNCTION cmsEvalToneCurve16(Curve: LPcmsToneCurve; v:cmsUInt16Number):cmsUInt16Number; StdCall; FUNCTION cmsIsToneCurveMultisegment(InGamma: LPcmsToneCurve):cmsBool; StdCall; FUNCTION cmsIsToneCurveLinear(Curve: LPcmsToneCurve):cmsBool; StdCall; FUNCTION cmsIsToneCurveMonotonic(t: LPcmsToneCurve):cmsBool; StdCall; FUNCTION cmsIsToneCurveDescending(t: LPcmsToneCurve):cmsBool; StdCall; FUNCTION cmsGetToneCurveParametricType(t: LPcmsToneCurve):cmsInt32Number; StdCall; FUNCTION cmsEstimateGamma(t: LPcmsToneCurve; Precision:cmsFloat64Number):cmsFloat64Number; StdCall; FUNCTION cmsGetToneCurveEstimatedTableEntries(t: LPcmsToneCurve): cmsUInt32Number; StdCall; FUNCTION cmsGetToneCurveEstimatedTable(t: LPcmsToneCurve): LPcmsUInt16Number; StdCall; // Implements pipelines of multi-processing elements ------------------------------------------------------------- TYPE LPcmsPipeline = Pointer; LPcmsStage = Pointer; LPLPcmsStage = ^LPcmsStage; // Those are hi-level pipelines FUNCTION cmsPipelineAlloc(ContextID: cmsContext; InputChannels, OutputChannels: cmsUInt32Number): LPcmsPipeline; StdCall; PROCEDURE cmsPipelineFree(lut: LPcmsPipeline); StdCall; FUNCTION cmsPipelineDup(Orig: LPcmsPipeline): LPcmsPipeline; StdCall; FUNCTION cmsGetPipelineContextID(lut: LPcmsPipeline) : cmsContext; StdCall; FUNCTION cmsPipelineInputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; FUNCTION cmsPipelineOutputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; FUNCTION cmsPipelineStageCount(lut: LPcmsPipeline): cmsUInt32Number; StdCall; FUNCTION cmsPipelineGetPtrToFirstStage(lut: LPcmsPipeline): LPcmsStage; StdCall; FUNCTION cmsPipelineGetPtrToLastStage(lut: LPcmsPipeline): LPcmsStage; StdCall; PROCEDURE cmsPipelineEval16(Inv, Outv: LPcmsUInt16NumberArray; lut: LPcmsPipeline); StdCall; PROCEDURE cmsPipelineEvalFloat(Inv, Outv: LPcmsFloat32NumberArray; lut: LPcmsPipeline); StdCall; FUNCTION cmsPipelineEvalReverseFloat(Target, Result, Hint: LPcmsFloat32NumberArray; lut: LPcmsPipeline): cmsBool; StdCall; FUNCTION cmsPipelineCat(l1, l2: LPcmsPipeline): cmsBool; StdCall; FUNCTION cmsPipelineSetSaveAs8bitsFlag(lut: LPcmsPipeline; On: cmsBool): cmsBool; StdCall; // Where to place/locate the stages in the pipeline chain TYPE cmsStageLoc = (cmsAT_BEGIN = 0, cmsAT_END = 1 ); PROCEDURE cmsPipelineInsertStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPcmsStage); StdCall; PROCEDURE cmsPipelineUnlinkStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPLPcmsStage); StdCall; // This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements // that conform the Pipeline. It should be called with the Pipeline, the number of expected elements and // then a list of expected types followed with a list of double pointers to Stage elements. If // the function founds a match with current pipeline, it fills the pointers and returns TRUE // if not, returns FALSE without touching anything. // FUNCTION cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, n: cmsUInt32Number, ...): cmsBool; StdCall; // Matrix has double precision and CLUT has only float precision. That is because an ICC profile can encode // matrices with far more precision that CLUTS FUNCTION cmsStageAllocIdentity(ContextID: cmsContext; nChannels: cmsUInt32Number): LPcmsStage; StdCall; FUNCTION cmsStageAllocToneCurves(ContextID: cmsContext; nChannels: cmsUInt32Number; Curves: LPLPcmsToneCurveArray): LPcmsStage; StdCall; FUNCTION cmsStageAllocMatrix(ContextID: cmsContext; Rows, Cols: cmsUInt32Number; Matrix, Offset: LPcmsFloat64NumberArray): LPcmsStage; StdCall; FUNCTION cmsStageAllocCLut16bit(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; FUNCTION cmsStageAllocCLutFloat(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; FUNCTION cmsStageAllocCLut16bitGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; FUNCTION cmsStageAllocCLutFloatGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; FUNCTION cmsStageDup(mpe: LPcmsStage): LPcmsStage; StdCall; PROCEDURE cmsStageFree(mpe: LPcmsStage); StdCall; FUNCTION cmsStageNext(mpe: LPcmsStage): LPcmsStage; StdCall; FUNCTION cmsStageInputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; FUNCTION cmsStageOutputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; FUNCTION cmsStageType(mpe: LPcmsStage): cmsStageSignature; StdCall; FUNCTION cmsStageData(mpe: LPcmsStage): Pointer; StdCall; // Sampling Type cmsSAMPLER16 = FUNCTION (Inp, Outp: LPcmsUInt16NumberArray; Cargo: Pointer): cmsInt32Number; CDecl; cmsSAMPLERFLOAT = FUNCTION (Inp, Outp: LPcmsFloat32NumberArray; Cargo: Pointer): cmsInt32Number; CDecl; // Use this flag to prevent changes being written to destination Const SAMPLER_INSPECT = $01000000; // For CLUT only FUNCTION cmsStageSampleCLut16bit(mpe: LPcmsStage; Sampler: cmsSAMPLER16; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; FUNCTION cmsStageSampleCLutFloat(mpe: LPcmsStage; Sampler: cmsSAMPLERFLOAT; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; // Slicers FUNCTION cmsSliceSpace16(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; Sampler: cmsSAMPLER16; Cargo: Pointer): cmsBool; StdCall; FUNCTION cmsSliceSpaceFloat(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; Sampler: cmsSAMPLERFLOAT; Cargo: Pointer): cmsBool; StdCall; // Multilocalized Unicode management --------------------------------------------------------------------------------------- Type LPcmsMLU = Pointer; Const cmsNoLanguage = #0#0#0; cmsNoCountry = #0#0#0; FUNCTION cmsMLUalloc(ContextID: cmsContext; nItems: cmsUInt32Number): LPcmsMLU; StdCall; PROCEDURE cmsMLUfree(mlu: LPcmsMLU); StdCall; FUNCTION cmsMLUdup(mlu: LPcmsMLU): LPcmsMLU; StdCall; FUNCTION cmsMLUsetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode, ASCIIString: PAnsiChar): cmsBool; StdCall; FUNCTION cmsMLUsetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; WideString: PWChar): cmsBool; StdCall; FUNCTION cmsMLUgetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; FUNCTION cmsMLUgetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; FUNCTION cmsMLUgetTranslation(mlu: LPcmsMLU; LanguageCode, CountryCode, ObtainedLanguage, ObtainedCountry: PAnsiChar): cmsBool; StdCall; // Undercolorremoval & black generation ------------------------------------------------------------------------------------- Type cmsUcrBg = PACKED RECORD Ucr, Bg: LPcmsToneCurve; Desc: LPcmsMLU; END; // Screening ---------------------------------------------------------------------------------------------------------------- Const cmsPRINTER_DEFAULT_SCREENS = $0001; cmsFREQUENCE_UNITS_LINES_CM = $0000; cmsFREQUENCE_UNITS_LINES_INCH = $0002; cmsSPOT_UNKNOWN = 0; cmsSPOT_PRINTER_DEFAULT = 1; cmsSPOT_ROUND = 2; cmsSPOT_DIAMOND = 3; cmsSPOT_ELLIPSE = 4; cmsSPOT_LINE = 5; cmsSPOT_SQUARE = 6; cmsSPOT_CROSS = 7; Type cmsScreeningChannel = PACKED RECORD Frequency, ScreenAngle: cmsFloat64Number; SpotShape: cmsUInt32Number; END; cmsScreening = PACKED RECORD Flag, nChannels : cmsUInt32Number; Channels: Array [0..cmsMAXCHANNELS-1] OF cmsScreeningChannel; END; // Named color ----------------------------------------------------------------------------------------------------------------- LPcmsNAMEDCOLORLIST = Pointer; FUNCTION cmsAllocNamedColorList(ContextID: cmsContext; n, ColorantCount :cmsUInt32Number; Prefix, Suffix: PAnsiChar): LPcmsNAMEDCOLORLIST; StdCall; PROCEDURE cmsFreeNamedColorList(v: LPcmsNAMEDCOLORLIST); StdCall; FUNCTION cmsDupNamedColorList(v: LPcmsNAMEDCOLORLIST): LPcmsNAMEDCOLORLIST; StdCall; FUNCTION cmsAppendNamedColor(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar; PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; FUNCTION cmsNamedColorCount(v: LPcmsNAMEDCOLORLIST): cmsUInt32Number; StdCall; FUNCTION cmsNamedColorIndex(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar): cmsInt32Number; StdCall; FUNCTION cmsNamedColorInfo(v: LPcmsNAMEDCOLORLIST; nColor : cmsUInt32Number; Name,Prefix, Suffix : PAnsiChar; PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; // Retrieve named color list from transform FUNCTION cmsGetNamedColorList(xform: cmsHTRANSFORM ): LPcmsNAMEDCOLORLIST; StdCall; // Profile sequence ----------------------------------------------------------------------------------------------------- Type // Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others // come from Profile Sequence Identifier Tag cmsPSEQDESC = PACKED RECORD deviceMfg, deviceModel: cmsSignature; attributes: cmsUInt64Number; technology: cmsTechnologySignature; ProfileID: cmsProfileID; Manufacturer, Model, Description : LPcmsMLU; END; LPcmsSEQDESC = ^cmsPSEQDESC; cmsSEQ = PACKED RECORD n: cmsUInt32Number; ContextID: cmsContext; seq: LPcmsSEQDESC; END; LPcmsSEQ = ^cmsSEQ; FUNCTION cmsAllocProfileSequenceDescription(ContextID: cmsContext; n: cmsUInt32Number):LPcmsSEQ; StdCall; FUNCTION cmsDupProfileSequenceDescription(pseq: LPcmsSEQ):LPcmsSEQ; StdCall; PROCEDURE cmsFreeProfileSequenceDescription(pseq: LPcmsSEQ); StdCall; // Dictionaries -------------------------------------------------------------------------------------------------------- TYPE LPcmsDICTentry = ^cmsDICTentry; cmsDICTentry = PACKED RECORD Next: LPcmsDICTentry; DisplayName, DisplayValue: LPcmsMLU; Name, Value : PWChar; END; FUNCTION cmsDictAlloc(ContextID: cmsContext): cmsHANDLE; StdCall; PROCEDURE cmsDictFree(hDict: cmsHANDLE); StdCall; FUNCTION cmsDictDup(hDict: cmsHANDLE): cmsHANDLE; StdCall; FUNCTION cmsDictAddEntry(hDict: cmsHANDLE; Name, Value: PWChar; DisplayName, DisplayValue : LPcmsMLU): cmsBool; StdCall; FUNCTION cmsDictGetEntryList(hDict: cmsHANDLE): LPcmsDICTentry; StdCall; FUNCTION cmsDictNextEntry(e : LPcmsDICTentry): LPcmsDICTentry; StdCall; // Access to Profile data ---------------------------------------------------------------------------------------------- FUNCTION cmsCreateProfilePlaceholder(ContextID: cmsContext): cmsHPROFILE; StdCall; FUNCTION cmsGetProfileContextID(hProfile: cmsHPROFILE):cmsContext; StdCall; FUNCTION cmsGetTagCount(hProfile: cmsHPROFILE): cmsInt32Number; StdCall; FUNCTION cmsGetTagSignature(hProfile: cmsHPROFILE; n: cmsUInt32Number): cmsTagSignature; StdCall; FUNCTION cmsIsTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): cmsBool; StdCall; // Read and write pre-formatted data FUNCTION cmsReadTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): Pointer; StdCall; FUNCTION cmsWriteTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer): cmsBool; StdCall; FUNCTION cmsLinkTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; dest: cmsTagSignature): cmsBool; StdCall; FUNCTION cmsTagLinkedTo(hProfile: cmsHPROFILE; sig: cmsTagSignature):cmsTagSignature; StdCall; // Read and write raw data FUNCTION cmsReadRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; Buffer: Pointer; BufferSize: cmsUInt32Number): cmsInt32Number; StdCall; FUNCTION cmsWriteRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer; Size: cmsUInt32Number): cmsBool; StdCall; // Access header data Const cmsEmbeddedProfileFalse = $00000000; cmsEmbeddedProfileTrue = $00000001; cmsUseAnywhere = $00000000; cmsUseWithEmbeddedDataOnly = $00000002; FUNCTION cmsGetHeaderFlags(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; PROCEDURE cmsGetHeaderAttributes(hProfile: cmsHPROFILE; Flags: LPcmsUInt64Number); StdCall; PROCEDURE cmsGetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; // TODO: // FUNCTION cmsGetHeaderCreationDateTime(hProfile: cmsHPROFILE; struct tm *Dest): cmsBool; StdCall; FUNCTION cmsGetHeaderRenderingIntent(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; PROCEDURE cmsSetHeaderFlags(hProfile: cmsHPROFILE; Flags: cmsUInt32Number); StdCall; FUNCTION cmsGetHeaderManufacturer(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; PROCEDURE cmsSetHeaderManufacturer(hProfile: cmsHPROFILE; manufacturer: cmsUInt32Number ); StdCall; FUNCTION cmsGetHeaderModel(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; PROCEDURE cmsSetHeaderModel(hProfile: cmsHPROFILE; model: cmsUInt32Number ); StdCall; PROCEDURE cmsSetHeaderAttributes(hProfile: cmsHPROFILE; Flags: cmsUInt64Number); StdCall; PROCEDURE cmsSetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; PROCEDURE cmsSetHeaderRenderingIntent(hProfile: cmsHPROFILE; RenderingIntent: cmsUInt32Number ); StdCall; FUNCTION cmsGetPCS(hProfile: cmsHPROFILE):cmsColorSpaceSignature; StdCall; PROCEDURE cmsSetPCS(hProfile: cmsHPROFILE; pcs: cmsColorSpaceSignature); StdCall; FUNCTION cmsGetColorSpace(hProfile: cmsHPROFILE): cmsColorSpaceSignature; StdCall; PROCEDURE cmsSetColorSpace(hProfile: cmsHPROFILE; sig: cmsColorSpaceSignature); StdCall; FUNCTION cmsGetDeviceClass(hProfile: cmsHPROFILE): cmsProfileClassSignature; StdCall; PROCEDURE cmsSetDeviceClass(hProfile: cmsHPROFILE; sig: cmsProfileClassSignature); StdCall; PROCEDURE cmsSetProfileVersion(hProfile: cmsHPROFILE; Version: cmsFloat64Number); StdCall; FUNCTION cmsGetProfileVersion(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; FUNCTION cmsGetEncodedICCversion(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; PROCEDURE cmsSetEncodedICCversion(hProfile: cmsHPROFILE; Version: cmsUInt32Number); StdCall; Const // How profiles may be used LCMS_USED_AS_INPUT = 0; LCMS_USED_AS_OUTPUT = 1; LCMS_USED_AS_PROOF = 2; FUNCTION cmsIsIntentSupported(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; FUNCTION cmsIsMatrixShaper(hProfile: cmsHPROFILE): cmsBool; StdCall; FUNCTION cmsIsCLUT(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; // Translate form/to our notation to ICC FUNCTION _cmsICCcolorSpace(OurNotation: Integer): cmsColorSpaceSignature; StdCall; FUNCTION _cmsLCMScolorSpace(ProfileSpace: cmsColorSpaceSignature): Integer; StdCall; FUNCTION cmsChannelsOf( ColorSpace: cmsColorSpaceSignature): cmsUInt32Number; StdCall; // Build a suitable formatter for the colorspace of this profile FUNCTION cmsFormatterForColorspaceOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; FUNCTION cmsFormatterForPCSOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; Type // Localized info cmsInfoType = ( cmsInfoDescription = 0, cmsInfoManufacturer = 1, cmsInfoModel = 2, cmsInfoCopyright = 3 ); FUNCTION cmsGetProfileInfo(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; FUNCTION cmsGetProfileInfoASCII(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; // IO handlers ---------------------------------------------------------------------------------------------------------- Type LPcmsIOHANDLER = Pointer; FUNCTION cmsOpenIOhandlerFromFile(ContextID: cmsContext; FileName, AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; // FUNCTION cmsOpenIOhandlerFromStream(ContextID: cmsContext; FILE* Stream): LPcmsIOHANDLER; StdCall; FUNCTION cmsOpenIOhandlerFromMem(ContextID: cmsContext; Buffer: Pointer; size: cmsUInt32Number; AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; FUNCTION cmsOpenIOhandlerFromNULL(ContextID: cmsContext): LPcmsIOHANDLER; StdCall; FUNCTION cmsCloseIOhandler(io: LPcmsIOHANDLER): cmsBool; StdCall; // MD5 message digest -------------------------------------------------------------------------------------------------- FUNCTION cmsMD5computeID(hProfile: cmsHPROFILE): cmsBool; StdCall; // Profile high level funtions ------------------------------------------------------------------------------------------ FUNCTION cmsOpenProfileFromFile(ICCProfile : PAnsiChar; sAccess: PAnsiChar): cmsHPROFILE; StdCall; FUNCTION cmsOpenProfileFromFileTHR(ContextID: cmsContext; ICCProfile, sAccess: PAnsiChar): cmsHPROFILE; StdCall; // FUNCTION CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; // FUNCTION CMSEXPORT cmsOpenProfileFromStreamTHR(ContextID: cmsContext; FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; FUNCTION cmsOpenProfileFromMem(MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; FUNCTION cmsOpenProfileFromMemTHR(ContextID: cmsContext; MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; FUNCTION cmsOpenProfileFromIOhandlerTHR(ContextID: cmsContext; io: LPcmsIOHANDLER): cmsHPROFILE; StdCall; FUNCTION cmsCloseProfile(hProfile: cmsHPROFILE): cmsBool; StdCall; FUNCTION cmsSaveProfileToFile(hProfile: cmsHPROFILE; FileName: PAnsiChar): cmsBool; StdCall; // FUNCTION CMSEXPORT cmsSaveProfileToStream(hProfile: cmsHPROFILE, FILE* Stream): cmsBool; StdCall; FUNCTION cmsSaveProfileToMem(hProfile: cmsHPROFILE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; FUNCTION cmsSaveProfileToIOhandler(hProfile: cmsHPROFILE; io: LPcmsIOHANDLER):cmsUInt32Number; StdCall; // Predefined virtual profiles ------------------------------------------------------------------------------------------ FUNCTION cmsCreateRGBProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY; Primaries: LPcmsCIExyYTRIPLE; TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; FUNCTION cmsCreateRGBProfile(WhitePoint: LPcmsCIExyY; Primaries: LPcmsCIExyYTRIPLE; TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; FUNCTION cmsCreateGrayProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY; TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; FUNCTION cmsCreateGrayProfile(WhitePoint: LPcmsCIExyY; TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; FUNCTION cmsCreateLinearizationDeviceLinkTHR(ContextID: cmsContext; ColorSpace: cmsColorSpaceSignature; TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; FUNCTION cmsCreateLinearizationDeviceLink(ColorSpace: cmsColorSpaceSignature; TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; FUNCTION cmsCreateInkLimitingDeviceLinkTHR(ContextID: cmsContext; ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; FUNCTION cmsCreateInkLimitingDeviceLink(ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; FUNCTION cmsCreateLab2ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; FUNCTION cmsCreateLab2Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; FUNCTION cmsCreateLab4ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; FUNCTION cmsCreateLab4Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; FUNCTION cmsCreateXYZProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; FUNCTION cmsCreateXYZProfile: cmsHPROFILE; StdCall; FUNCTION cmsCreate_sRGBProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; FUNCTION cmsCreate_sRGBProfile: cmsHPROFILE; StdCall; FUNCTION cmsCreateBCHSWabstractProfileTHR(ContextID: cmsContext; nLUTPoints: Integer; Bright, Contrast, Hue, Saturation: cmsFloat64Number; TempSrc, TempDest: Integer): cmsHPROFILE; StdCall; FUNCTION cmsCreateBCHSWabstractProfile( nLUTPoints: Integer; Bright, Contrast, Hue, Saturation: cmsFloat64Number; TempSrc, TempDest: Integer): cmsHPROFILE; StdCall; FUNCTION cmsCreateNULLProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; FUNCTION cmsCreateNULLProfile: cmsHPROFILE; StdCall; // Converts a transform to a devicelink profile FUNCTION cmsTransform2DeviceLink(hTransform: cmsHTRANSFORM; Version: cmsFloat64Number; dwFlags: cmsUInt32Number): cmsHPROFILE; StdCall; // Intents ---------------------------------------------------------------------------------------------- Const // ICC Intents INTENT_PERCEPTUAL = 0; INTENT_RELATIVE_COLORIMETRIC = 1; INTENT_SATURATION = 2; INTENT_ABSOLUTE_COLORIMETRIC = 3; // Non-ICC intents INTENT_PRESERVE_K_ONLY_PERCEPTUAL = 10; INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC = 11; INTENT_PRESERVE_K_ONLY_SATURATION = 12; INTENT_PRESERVE_K_PLANE_PERCEPTUAL = 13; INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC = 14; INTENT_PRESERVE_K_PLANE_SATURATION = 15; Type LPPAnsiChar = ^PAnsiChar; // Call with NULL as parameters to get the intent count FUNCTION cmsGetSupportedIntents(nMax: cmsUInt32Number; Codes: LPcmsUInt32Number; Descriptions: LPPAnsiChar): cmsUInt32Number; StdCall; Const // Flags cmsFLAGS_NOCACHE = $0040; // Inhibit 1-pixel cache cmsFLAGS_NOOPTIMIZE = $0100; // Inhibit optimizations cmsFLAGS_NULLTRANSFORM = $0200; // Don't transform anyway // Proofing flags cmsFLAGS_GAMUTCHECK = $1000; // Out of Gamut alarm cmsFLAGS_SOFTPROOFING = $4000; // Do softproofing // Misc cmsFLAGS_BLACKPOINTCOMPENSATION = $2000; cmsFLAGS_NOWHITEONWHITEFIXUP = $0004; // Don't fix scum dot cmsFLAGS_HIGHRESPRECALC = $0400; // Use more memory to give better accurancy cmsFLAGS_LOWRESPRECALC = $0800; // Use less memory to minimize resouces // For devicelink creation cmsFLAGS_8BITS_DEVICELINK = $0008; // Create 8 bits devicelinks cmsFLAGS_GUESSDEVICECLASS = $0020; // Guess device class (for transform2devicelink) cmsFLAGS_KEEP_SEQUENCE = $0080; // Keep profile sequence for devicelink creation // Specific to a particular optimizations cmsFLAGS_FORCE_CLUT = $0002; // Force CLUT optimization cmsFLAGS_CLUT_POST_LINEARIZATION = $0001; // create postlinearization tables if possible cmsFLAGS_CLUT_PRE_LINEARIZATION = $0010; // create prelinearization tables if possible // CRD special cmsFLAGS_NODEFAULTRESOURCEDEF = $01000000; // Fine-tune control over number of gridpoints FUNCTION cmsFLAGS_GRIDPOINTS(n: Integer): Integer; // Transforms --------------------------------------------------------------------------------------------------- type LPcmsHPROFILEArray = ^cmsHPROFILEArray; cmsHPROFILEArray = array[0..0] of cmsHPROFILE; LPcmsBoolArray = ^cmsBoolArray; cmsBoolArray = array[0..0] of cmsBool; FUNCTION cmsCreateTransformTHR(ContextID: cmsContext; Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateTransform(Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateProofingTransformTHR(ContextID: cmsContext; Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Proofing: cmsHPROFILE; Intent: cmsUInt32Number; ProofingIntent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateProofingTransform(Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Proofing: cmsHPROFILE; Intent: cmsUInt32Number; ProofingIntent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateMultiprofileTransformTHR(ContextID: cmsContext; hProfiles: LPcmsHPROFILEArray; nProfiles: cmsUInt32Number; InputFormat: cmsUInt32Number; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateMultiprofileTransform( hProfiles: LPcmsHPROFILEArray; nProfiles: cmsUInt32Number; InputFormat: cmsUInt32Number; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; FUNCTION cmsCreateExtendedTransform(ContextID: cmsContext; nProfiles: cmsUInt32Number; hProfiles: LPcmsHPROFILEArray; BPC: LPcmsBoolArray; Intents: LPcmsUInt32NumberArray; AdaptationStates: LPcmsFloat64NumberArray; hGamutProfile: cmsHPROFILE; nGamutPCSposition: cmsUInt32Number; InputFormat, OutputFormat: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; PROCEDURE cmsDeleteTransform(hTransform: cmsHTRANSFORM); StdCall; PROCEDURE cmsDoTransform(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number); StdCall; PROCEDURE cmsDoTransformStride(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number; stride: cmsUInt32Number); StdCall; PROCEDURE cmsSetAlarmCodes( NewAlarm: LPcmsUInt16NumberArray); StdCall; PROCEDURE cmsGetAlarmCodes(NewAlarm: LPcmsUInt16NumberArray); StdCall; // Adaptation state for absolute colorimetric intent FUNCTION cmsSetAdaptationState(d: cmsFloat64Number):cmsFloat64Number; StdCall; // Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed FUNCTION cmsGetTransformContextID(hTransform: cmsHTRANSFORM):cmsContext; StdCall; // For backwards compatibility FUNCTION cmsChangeBuffersFormat(hTransform: cmsHTRANSFORM; InputFormat, OutputFormat: cmsUInt32Number): cmsBool; StdCall; // PostScript ColorRenderingDictionary and ColorSpaceArray ---------------------------------------------------- Type cmsPSResourceType = (cmsPS_RESOURCE_CSA, cmsPS_RESOURCE_CRD ) ; // lcms2 unified method to access postscript color resources FUNCTION cmsGetPostScriptColorResource(ContextID: cmsContext; RType: cmsPSResourceType; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; io: LPcmsIOHANDLER): cmsUInt32Number; StdCall; FUNCTION cmsGetPostScriptCSA(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number ): cmsUInt32Number; StdCall; FUNCTION cmsGetPostScriptCRD(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number): cmsUInt32Number; StdCall; // IT8.7 / CGATS.17-20$ handling ----------------------------------------------------------------------------- // CGATS.13 parser FUNCTION cmsIT8Alloc: cmsHANDLE; StdCall; PROCEDURE cmsIT8Free(hIT8: cmsHANDLE); StdCall; // Tables FUNCTION cmsIT8TableCount(hIT8: cmsHANDLE): Integer; StdCall; FUNCTION cmsIT8SetTable(hIT8: cmsHANDLE; nTable: Integer): Integer; StdCall; // Persistence FUNCTION cmsIT8LoadFromFile(cFileName: PAnsiChar): cmsHANDLE; StdCall; FUNCTION cmsIT8LoadFromMem(Ptr: Pointer; size :DWord): cmsHANDLE; StdCall; FUNCTION cmsIT8SaveToFile(hIT8: cmsHANDLE; cFileName: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SaveToMem(hIT8: cmsHANDLE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; // Properties FUNCTION cmsIT8GetSheetType(hIT8: cmsHANDLE): PAnsiChar; StdCall; FUNCTION cmsIT8SetSheetType(hIT8: cmsHANDLE; TheType: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SetComment(hIT8: cmsHANDLE; cComment: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SetPropertyStr(hIT8: cmsHANDLE; cProp, Str: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Double): cmsBool; StdCall; FUNCTION cmsIT8SetPropertyHex(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Integer): cmsBool; StdCall; FUNCTION cmsIT8SetPropertyUncooked(hIT8: cmsHANDLE; Key, Buffer: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8GetProperty(hIT8: cmsHANDLE; cProp: PAnsiChar): PAnsiChar; StdCall; FUNCTION cmsIT8GetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar): Double; StdCall; FUNCTION cmsIT8EnumProperties(hIT8: cmsHANDLE; var PropertyNames: LPPAnsiChar): Integer; StdCall; // Datasets FUNCTION cmsIT8GetDataRowCol(hIT8: cmsHANDLE; row, col: Integer): PAnsiChar; StdCall; FUNCTION cmsIT8GetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer): Double; StdCall; FUNCTION cmsIT8SetDataRowCol(hIT8: cmsHANDLE; row, col: Integer; Val: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer; Val: Double): cmsBool; StdCall; FUNCTION cmsIT8GetData(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar): PAnsiChar; StdCall; FUNCTION cmsIT8GetDataDbl(hIT8: cmsHANDLE;cPatch, cSample: PAnsiChar): Double; StdCall; FUNCTION cmsIT8SetData(hIT8: cmsHANDLE; cPatch, cSample, Val: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8SetDataDbl(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar; Val: Double): cmsBool; StdCall; FUNCTION cmsIT8SetDataFormat(hIT8: cmsHANDLE; n: Integer; Sample: PAnsiChar): cmsBool; StdCall; FUNCTION cmsIT8EnumDataFormat(hIT8: cmsHANDLE; var SampleNames: LPPAnsiChar): Integer; StdCall; FUNCTION cmsIT8GetPatchName(hIT8: cmsHANDLE; nPatch: Integer; Buffer: PAnsiChar): PAnsiChar; StdCall; // The LABEL extension FUNCTION cmsIT8SetTableByLabel(hIT8: cmsHANDLE; cSet, cField, ExpectedType: PAnsiChar): Integer; StdCall; FUNCTION cmsIT8FindDataFormat(hIT8: cmsHANDLE; cSample: PAnsiChar): Integer; StdCall; // Formatter for double PROCEDURE cmsIT8DefineDblFormat(hIT8: cmsHANDLE; Formatter: PAnsiChar); StdCall; // Gamut boundary description routines ------------------------------------------------------------------------------ FUNCTION cmsGBDAlloc(ContextID: cmsContext):cmsHANDLE; StdCall; PROCEDURE cmsGBDFree(hGBD: cmsHANDLE); StdCall; FUNCTION cmsGDBAddPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; FUNCTION cmsGDBCompute(hGDB: cmsHANDLE; dwFlags: cmsUInt32Number): cmsBool; StdCall; FUNCTION cmsGDBCheckPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; // Feature detection ---------------------------------------------------------------------------------------------- // Estimate the black point FUNCTION cmsDetectBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; FUNCTION cmsDetectDestinationBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; // Estimate total area coverage FUNCTION cmsDetectTAC(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; // Poor man's gamut mapping FUNCTION cmsDesaturateLab(Lab: LPcmsCIELab; amax, amin, bmax, bmin: cmsFloat64Number): cmsBool; StdCall; IMPLEMENTATION FUNCTION FLOAT_SH(a: cmsUInt32Number): cmsUInt32Number; begin FLOAT_SH := ((a) shl 22) end; FUNCTION OPTIMIZED_SH(s: cmsUInt32Number): cmsUInt32Number; begin OPTIMIZED_SH := ((s) shl 21) end; FUNCTION COLORSPACE_SH(s: cmsUInt32Number):cmsUInt32Number; begin COLORSPACE_SH := ((s) shl 16) end; FUNCTION SWAPFIRST_SH(s: cmsUInt32Number):cmsUInt32Number; begin SWAPFIRST_SH := ((s) shl 14) end; FUNCTION FLAVOR_SH(s: cmsUInt32Number):cmsUInt32Number; begin FLAVOR_SH := ((s) shl 13) end; FUNCTION PLANAR_SH(p: cmsUInt32Number):cmsUInt32Number; begin PLANAR_SH := ((p) shl 12) end; FUNCTION ENDIAN16_SH(e: cmsUInt32Number):cmsUInt32Number; begin ENDIAN16_SH := ((e) shl 11) end; FUNCTION DOSWAP_SH(e: cmsUInt32Number):cmsUInt32Number; begin DOSWAP_SH := ((e) shl 10) end; FUNCTION EXTRA_SH(e: cmsUInt32Number):cmsUInt32Number; begin EXTRA_SH := ((e) shl 7) end; FUNCTION CHANNELS_SH(c: cmsUInt32Number):cmsUInt32Number; begin CHANNELS_SH := ((c) shl 3) end; FUNCTION BYTES_SH(b: cmsUInt32Number):cmsUInt32Number; begin BYTES_SH := (b) end; FUNCTION T_FLOAT(a: cmsUInt32Number): cmsUInt32Number; begin T_FLOAT := (((a) shr 22) and 1) end; FUNCTION T_OPTIMIZED(o: cmsUInt32Number): cmsUInt32Number; begin T_OPTIMIZED := (((o) shr 21) and 1) end; FUNCTION T_COLORSPACE(s: cmsUInt32Number): cmsUInt32Number; begin T_COLORSPACE := (((s) shr 16) and 31) end; FUNCTION T_SWAPFIRST(s: cmsUInt32Number): cmsUInt32Number; begin T_SWAPFIRST := (((s) shr 14) and 1) end; FUNCTION T_FLAVOR(s: cmsUInt32Number): cmsUInt32Number; begin T_FLAVOR := (((s) shr 13) and 1) end; FUNCTION T_PLANAR(p: cmsUInt32Number): cmsUInt32Number; begin T_PLANAR := (((p) shr 12) and 1) end; FUNCTION T_ENDIAN16(e: cmsUInt32Number): cmsUInt32Number; begin T_ENDIAN16 := (((e) shr 11) and 1) end; FUNCTION T_DOSWAP(e: cmsUInt32Number): cmsUInt32Number; begin T_DOSWAP := (((e) shr 10) and 1) end; FUNCTION T_EXTRA(e: cmsUInt32Number): cmsUInt32Number; begin T_EXTRA := (((e) shr 7) and 7) end; FUNCTION T_CHANNELS(c: cmsUInt32Number): cmsUInt32Number; begin T_CHANNELS := (((c) shr 3) and 15) end; FUNCTION T_BYTES(b: cmsUInt32Number): cmsUInt32Number; begin T_BYTES := ((b) and 7) end; // FUNCTION cmsCreateContext(Plugin : Pointer; UserData : Pointer) : cmsContext; StdCall; external LCMS2_SO; PROCEDURE cmsDeleteContext(ContextID: cmsContext); StdCall; external LCMS2_SO; FUNCTION cmsDupContext(ContextID: cmsContext; NewUserData: Pointer): cmsContext; StdCall; external LCMS2_SO; FUNCTION cmsGetContextUserData(ContextID: cmsContext): Pointer; StdCall; external LCMS2_SO; FUNCTION cmsPlugin(Plugin: Pointer): cmsBool; StdCall; external LCMS2_SO; PROCEDURE cmsUnregisterPlugins; StdCall; external LCMS2_SO; PROCEDURE cmsSetLogErrorHandler(Fn: cmsLogErrorHandlerFunction); StdCall; external LCMS2_SO; FUNCTION cmsD50_XYZ: LPcmsCIEXYZ; StdCall; external LCMS2_SO; FUNCTION cmsD50_xyY: LPcmsCIExyY; StdCall; external LCMS2_SO; PROCEDURE cmsXYZ2xyY(Dest: LPcmsCIExyY; Source: LPcmsCIEXYZ); StdCall; external LCMS2_SO; PROCEDURE cmsxyY2XYZ(Dest: LPcmsCIEXYZ; Source: LPcmsCIExyY); StdCall; external LCMS2_SO; PROCEDURE cmsLab2XYZ(WhitePoint: LPcmsCIEXYZ; xyz: LPcmsCIEXYZ; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; PROCEDURE cmsXYZ2Lab(WhitePoint: LPcmsCIEXYZ; Lab: LPcmsCIELab; xyz: LPcmsCIEXYZ); StdCall; external LCMS2_SO; PROCEDURE cmsLab2LCh(LCh: LPcmsCIELCh; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; PROCEDURE cmsLCh2Lab(Lab: LPcmsCIELab; LCh: LPcmsCIELCh); StdCall; external LCMS2_SO; PROCEDURE cmsLabEncoded2Float(Lab: LPcmsCIELab; wLab: Pointer); StdCall; external LCMS2_SO; PROCEDURE cmsLabEncoded2FloatV2(Lab: LPcmsCIELab; wLab: Pointer); StdCall; external LCMS2_SO; PROCEDURE cmsFloat2LabEncoded(wLab: Pointer; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; PROCEDURE cmsFloat2LabEncodedV2(wLab: Pointer; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; PROCEDURE cmsXYZEncoded2Float(fxyz : LPcmsCIEXYZ; XYZ: Pointer); StdCall; external LCMS2_SO; PROCEDURE cmsFloat2XYZEncoded(XYZ: Pointer; fXYZ: LPcmsCIEXYZ); StdCall; external LCMS2_SO; FUNCTION cmsDeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; FUNCTION cmsCIE94DeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; FUNCTION cmsBFDdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; FUNCTION cmsCMCdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; FUNCTION cmsCIE2000DeltaE(Lab1, Lab2: LPcmsCIELab; Kl, Kc, Kh: Double): Double; StdCall; external LCMS2_SO; FUNCTION cmsWhitePointFromTemp(var WhitePoint: cmsCIExyY; TempK: cmsFloat64Number) : cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsTempFromWhitePoint(var TeampK: cmsFloat64Number; var WhitePoint: cmsCIExyY) : cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsAdaptToIlluminant(Result: LPcmsCIEXYZ; SourceWhitePt: LPcmsCIEXYZ; Illuminant: LPcmsCIEXYZ; Value: LPcmsCIEXYZ): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsCIECAM02Init(pVC : LPcmsViewingConditions ) : Pointer; StdCall; external LCMS2_SO; PROCEDURE cmsCIECAM02Done(hModel : Pointer); StdCall; external LCMS2_SO; PROCEDURE cmsCIECAM02Forward(hModel: Pointer; pIn: LPcmsCIEXYZ; pOut: LPcmsJCh ); StdCall; external LCMS2_SO; PROCEDURE cmsCIECAM02Reverse(hModel: Pointer; pIn: LPcmsJCh; pOut: LPcmsCIEXYZ ); StdCall; external LCMS2_SO; FUNCTION cmsBuildSegmentedToneCurve(ContextID: cmsContext; nSegments: cmsInt32Number; Segments: LPcmsCurveSegmentArray): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsBuildParametricToneCurve(ContextID: cmsContext; CType: cmsInt32Number; Params: LPcmsFloat64NumberArray): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsBuildGamma(ContextID: cmsContext; Gamma: cmsFloat64Number): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsBuildTabulatedToneCurve16(ContextID: cmsContext; nEntries: cmsInt32Number; values: LPcmsUInt16NumberArray): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsBuildTabulatedToneCurveFloat(ContextID: cmsContext; nEntries: cmsUInt32Number; values: LPcmsFloat32NumberArray): LPcmsToneCurve; StdCall; external LCMS2_SO; PROCEDURE cmsFreeToneCurve(Curve: LPcmsToneCurve); StdCall; external LCMS2_SO; PROCEDURE cmsFreeToneCurveTriple(Curve: LPLPcmsToneCurveArray); StdCall; external LCMS2_SO; FUNCTION cmsDupToneCurve(Src: LPcmsToneCurve): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsReverseToneCurve(InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsReverseToneCurveEx(nResultSamples: cmsInt32Number; InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsJoinToneCurve(ContextID: cmsContext; X, Y: LPcmsToneCurve; nPoints: cmsUInt32Number ): LPcmsToneCurve; StdCall; external LCMS2_SO; FUNCTION cmsSmoothToneCurve(Tab: LPcmsToneCurve; lambda: cmsFloat64Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsEvalToneCurveFloat(Curve: LPcmsToneCurve; v: cmsFloat32Number):cmsFloat32Number; StdCall; external LCMS2_SO; FUNCTION cmsEvalToneCurve16(Curve: LPcmsToneCurve; v:cmsUInt16Number):cmsUInt16Number; StdCall; external LCMS2_SO; FUNCTION cmsIsToneCurveMultisegment(InGamma: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIsToneCurveLinear(Curve: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIsToneCurveMonotonic(t: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIsToneCurveDescending(t: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsGetToneCurveParametricType(t: LPcmsToneCurve):cmsInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsEstimateGamma(t: LPcmsToneCurve; Precision:cmsFloat64Number):cmsFloat64Number; StdCall; external LCMS2_SO; FUNCTION cmsGetToneCurveEstimatedTableEntries(t: LPcmsToneCurve): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetToneCurveEstimatedTable(t: LPcmsToneCurve): LPcmsUInt16Number; StdCall; external LCMS2_SO; FUNCTION cmsPipelineAlloc(ContextID: cmsContext; InputChannels, OutputChannels: cmsUInt32Number): LPcmsPipeline; StdCall; external LCMS2_SO; PROCEDURE cmsPipelineFree(lut: LPcmsPipeline); StdCall; external LCMS2_SO; FUNCTION cmsPipelineDup(Orig: LPcmsPipeline): LPcmsPipeline; StdCall; external LCMS2_SO; FUNCTION cmsGetPipelineContextID(lut: LPcmsPipeline) : cmsContext; StdCall; external LCMS2_SO; FUNCTION cmsPipelineInputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsPipelineOutputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsPipelineStageCount(lut: LPcmsPipeline): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsPipelineGetPtrToFirstStage(lut: LPcmsPipeline): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsPipelineGetPtrToLastStage(lut: LPcmsPipeline): LPcmsStage; StdCall; external LCMS2_SO; PROCEDURE cmsPipelineEval16(Inv, Outv: LPcmsUInt16NumberArray; lut: LPcmsPipeline); StdCall; external LCMS2_SO; PROCEDURE cmsPipelineEvalFloat(Inv, Outv: LPcmsFloat32NumberArray; lut: LPcmsPipeline); StdCall; external LCMS2_SO; FUNCTION cmsPipelineEvalReverseFloat(Target, Result, Hint: LPcmsFloat32NumberArray; lut: LPcmsPipeline): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsPipelineCat(l1, l2: LPcmsPipeline): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsPipelineSetSaveAs8bitsFlag(lut: LPcmsPipeline; On: cmsBool): cmsBool; StdCall; external LCMS2_SO; PROCEDURE cmsPipelineInsertStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPcmsStage); StdCall; external LCMS2_SO; PROCEDURE cmsPipelineUnlinkStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPLPcmsStage); StdCall; external LCMS2_SO; FUNCTION cmsStageAllocIdentity(ContextID: cmsContext; nChannels: cmsUInt32Number): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocToneCurves(ContextID: cmsContext; nChannels: cmsUInt32Number; Curves: LPLPcmsToneCurveArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocMatrix(ContextID: cmsContext; Rows, Cols: cmsUInt32Number; Matrix, Offset: LPcmsFloat64NumberArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocCLut16bit(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocCLutFloat(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocCLut16bitGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageAllocCLutFloatGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageDup(mpe: LPcmsStage): LPcmsStage; StdCall; external LCMS2_SO; PROCEDURE cmsStageFree(mpe: LPcmsStage); StdCall; external LCMS2_SO; FUNCTION cmsStageNext(mpe: LPcmsStage): LPcmsStage; StdCall; external LCMS2_SO; FUNCTION cmsStageInputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsStageOutputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsStageType(mpe: LPcmsStage): cmsStageSignature; StdCall; external LCMS2_SO; FUNCTION cmsStageData(mpe: LPcmsStage): Pointer; StdCall; external LCMS2_SO; FUNCTION cmsStageSampleCLut16bit(mpe: LPcmsStage; Sampler: cmsSAMPLER16; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsStageSampleCLutFloat(mpe: LPcmsStage; Sampler: cmsSAMPLERFLOAT; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsSliceSpace16(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; Sampler: cmsSAMPLER16; Cargo: Pointer): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsSliceSpaceFloat(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; Sampler: cmsSAMPLERFLOAT; Cargo: Pointer): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsMLUalloc(ContextID: cmsContext; nItems: cmsUInt32Number): LPcmsMLU; StdCall; external LCMS2_SO; PROCEDURE cmsMLUfree(mlu: LPcmsMLU); StdCall; external LCMS2_SO; FUNCTION cmsMLUdup(mlu: LPcmsMLU): LPcmsMLU; StdCall; external LCMS2_SO; FUNCTION cmsMLUsetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode, ASCIIString: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsMLUsetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; WideString: PWChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsMLUgetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsMLUgetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsMLUgetTranslation(mlu: LPcmsMLU; LanguageCode, CountryCode, ObtainedLanguage, ObtainedCountry: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsAllocNamedColorList(ContextID: cmsContext; n, ColorantCount :cmsUInt32Number; Prefix, Suffix: PAnsiChar): LPcmsNAMEDCOLORLIST; StdCall; external LCMS2_SO; PROCEDURE cmsFreeNamedColorList(v: LPcmsNAMEDCOLORLIST); StdCall; external LCMS2_SO; FUNCTION cmsDupNamedColorList(v: LPcmsNAMEDCOLORLIST): LPcmsNAMEDCOLORLIST; StdCall; external LCMS2_SO; FUNCTION cmsAppendNamedColor(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar; PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsNamedColorCount(v: LPcmsNAMEDCOLORLIST): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsNamedColorIndex(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar): cmsInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsNamedColorInfo(v: LPcmsNAMEDCOLORLIST; nColor : cmsUInt32Number; Name,Prefix, Suffix : PAnsiChar; PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsGetNamedColorList(xform: cmsHTRANSFORM ): LPcmsNAMEDCOLORLIST; StdCall; external LCMS2_SO; FUNCTION cmsAllocProfileSequenceDescription(ContextID: cmsContext; n: cmsUInt32Number):LPcmsSEQ; StdCall; external LCMS2_SO; FUNCTION cmsDupProfileSequenceDescription(pseq: LPcmsSEQ):LPcmsSEQ; StdCall; external LCMS2_SO; PROCEDURE cmsFreeProfileSequenceDescription(pseq: LPcmsSEQ); StdCall; external LCMS2_SO; FUNCTION cmsDictAlloc(ContextID: cmsContext): cmsHANDLE; StdCall; external LCMS2_SO; PROCEDURE cmsDictFree(hDict: cmsHANDLE); StdCall; external LCMS2_SO; FUNCTION cmsDictDup(hDict: cmsHANDLE): cmsHANDLE; StdCall; external LCMS2_SO; FUNCTION cmsDictAddEntry(hDict: cmsHANDLE; Name, Value: PWChar; DisplayName, DisplayValue : LPcmsMLU): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsDictGetEntryList(hDict: cmsHANDLE): LPcmsDICTentry; StdCall; external LCMS2_SO; FUNCTION cmsDictNextEntry(e : LPcmsDICTentry): LPcmsDICTentry; StdCall; external LCMS2_SO; FUNCTION cmsCreateProfilePlaceholder(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsGetProfileContextID(hProfile: cmsHPROFILE):cmsContext; StdCall; external LCMS2_SO; FUNCTION cmsGetTagCount(hProfile: cmsHPROFILE): cmsInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetTagSignature(hProfile: cmsHPROFILE; n: cmsUInt32Number): cmsTagSignature; StdCall; external LCMS2_SO; FUNCTION cmsIsTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsReadTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): Pointer; StdCall; external LCMS2_SO; FUNCTION cmsWriteTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsLinkTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; dest: cmsTagSignature): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsTagLinkedTo(hProfile: cmsHPROFILE; sig: cmsTagSignature):cmsTagSignature; StdCall; external LCMS2_SO; FUNCTION cmsReadRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; Buffer: Pointer; BufferSize: cmsUInt32Number): cmsInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsWriteRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer; Size: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsGetHeaderFlags(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; PROCEDURE cmsGetHeaderAttributes(hProfile: cmsHPROFILE; Flags: LPcmsUInt64Number); StdCall; external LCMS2_SO; PROCEDURE cmsGetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; external LCMS2_SO; FUNCTION cmsGetHeaderRenderingIntent(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderFlags(hProfile: cmsHPROFILE; Flags: cmsUInt32Number); StdCall; external LCMS2_SO; FUNCTION cmsGetHeaderManufacturer(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderManufacturer(hProfile: cmsHPROFILE; manufacturer: cmsUInt32Number ); StdCall; external LCMS2_SO; FUNCTION cmsGetHeaderModel(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderModel(hProfile: cmsHPROFILE; model: cmsUInt32Number ); StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderAttributes(hProfile: cmsHPROFILE; Flags: cmsUInt64Number); StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; external LCMS2_SO; PROCEDURE cmsSetHeaderRenderingIntent(hProfile: cmsHPROFILE; RenderingIntent: cmsUInt32Number ); StdCall; external LCMS2_SO; FUNCTION cmsGetPCS(hProfile: cmsHPROFILE):cmsColorSpaceSignature; StdCall; external LCMS2_SO; PROCEDURE cmsSetPCS(hProfile: cmsHPROFILE; pcs: cmsColorSpaceSignature); StdCall; external LCMS2_SO; FUNCTION cmsGetColorSpace(hProfile: cmsHPROFILE): cmsColorSpaceSignature; StdCall; external LCMS2_SO; PROCEDURE cmsSetColorSpace(hProfile: cmsHPROFILE; sig: cmsColorSpaceSignature); StdCall; external LCMS2_SO; FUNCTION cmsGetDeviceClass(hProfile: cmsHPROFILE): cmsProfileClassSignature; StdCall; external LCMS2_SO; PROCEDURE cmsSetDeviceClass(hProfile: cmsHPROFILE; sig: cmsProfileClassSignature); StdCall; external LCMS2_SO; PROCEDURE cmsSetProfileVersion(hProfile: cmsHPROFILE; Version: cmsFloat64Number); StdCall; external LCMS2_SO; FUNCTION cmsGetProfileVersion(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; external LCMS2_SO; FUNCTION cmsGetEncodedICCversion(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; PROCEDURE cmsSetEncodedICCversion(hProfile: cmsHPROFILE; Version: cmsUInt32Number); StdCall; external LCMS2_SO; FUNCTION cmsIsIntentSupported(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIsMatrixShaper(hProfile: cmsHPROFILE): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIsCLUT(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION _cmsICCcolorSpace(OurNotation: Integer): cmsColorSpaceSignature; StdCall; external LCMS2_SO; FUNCTION _cmsLCMScolorSpace(ProfileSpace: cmsColorSpaceSignature): Integer; StdCall; external LCMS2_SO; FUNCTION cmsChannelsOf( ColorSpace: cmsColorSpaceSignature): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsFormatterForColorspaceOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsFormatterForPCSOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetProfileInfo(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetProfileInfoASCII(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsOpenIOhandlerFromFile(ContextID: cmsContext; FileName, AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; external LCMS2_SO; // FUNCTION cmsOpenIOhandlerFromStream(ContextID: cmsContext; FILE* Stream): LPcmsIOHANDLER; StdCall; external LCMS2_SO; FUNCTION cmsOpenIOhandlerFromMem(ContextID: cmsContext; Buffer: Pointer; size: cmsUInt32Number; AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; external LCMS2_SO; FUNCTION cmsOpenIOhandlerFromNULL(ContextID: cmsContext): LPcmsIOHANDLER; StdCall; external LCMS2_SO; FUNCTION cmsCloseIOhandler(io: LPcmsIOHANDLER): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsMD5computeID(hProfile: cmsHPROFILE): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsOpenProfileFromFile(ICCProfile : PAnsiChar; sAccess: PAnsiChar): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsOpenProfileFromFileTHR(ContextID: cmsContext; ICCProfile, sAccess: PAnsiChar): cmsHPROFILE; StdCall; external LCMS2_SO; // FUNCTION CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; external LCMS2_SO; // FUNCTION CMSEXPORT cmsOpenProfileFromStreamTHR(ContextID: cmsContext; FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsOpenProfileFromMem(MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsOpenProfileFromMemTHR(ContextID: cmsContext; MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsOpenProfileFromIOhandlerTHR(ContextID: cmsContext; io: LPcmsIOHANDLER): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCloseProfile(hProfile: cmsHPROFILE): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsSaveProfileToFile(hProfile: cmsHPROFILE; FileName: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; // FUNCTION CMSEXPORT cmsSaveProfileToStream(hProfile: cmsHPROFILE, FILE* Stream): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsSaveProfileToMem(hProfile: cmsHPROFILE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsSaveProfileToIOhandler(hProfile: cmsHPROFILE; io: LPcmsIOHANDLER):cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsCreateRGBProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY; Primaries: LPcmsCIExyYTRIPLE; TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateRGBProfile(WhitePoint: LPcmsCIExyY; Primaries: LPcmsCIExyYTRIPLE; TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateGrayProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY; TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateGrayProfile(WhitePoint: LPcmsCIExyY; TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLinearizationDeviceLinkTHR(ContextID: cmsContext; ColorSpace: cmsColorSpaceSignature; TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLinearizationDeviceLink(ColorSpace: cmsColorSpaceSignature; TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateInkLimitingDeviceLinkTHR(ContextID: cmsContext; ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateInkLimitingDeviceLink(ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLab2ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLab2Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLab4ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateLab4Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateXYZProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateXYZProfile: cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreate_sRGBProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreate_sRGBProfile: cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateBCHSWabstractProfileTHR(ContextID: cmsContext; nLUTPoints: Integer; Bright, Contrast, Hue, Saturation: cmsFloat64Number; TempSrc, TempDest: Integer): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateBCHSWabstractProfile( nLUTPoints: Integer; Bright, Contrast, Hue, Saturation: cmsFloat64Number; TempSrc, TempDest: Integer): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateNULLProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; FUNCTION cmsCreateNULLProfile: cmsHPROFILE; StdCall; external LCMS2_SO; // Converts a transform to a devicelink profile FUNCTION cmsTransform2DeviceLink(hTransform: cmsHTRANSFORM; Version: cmsFloat64Number; dwFlags: cmsUInt32Number): cmsHPROFILE; StdCall; external LCMS2_SO; // Call with NULL as parameters to get the intent count FUNCTION cmsGetSupportedIntents(nMax: cmsUInt32Number; Codes: LPcmsUInt32Number; Descriptions: LPPAnsiChar): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsFLAGS_GRIDPOINTS(n: Integer): Integer; begin cmsFLAGS_GRIDPOINTS := (((n) and $FF) shl 16) end; FUNCTION cmsCreateTransformTHR(ContextID: cmsContext; Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateTransform(Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateProofingTransformTHR(ContextID: cmsContext; Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Proofing: cmsHPROFILE; Intent: cmsUInt32Number; ProofingIntent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateProofingTransform(Input: cmsHPROFILE; InputFormat: cmsUInt32Number; Output: cmsHPROFILE; OutputFormat: cmsUInt32Number; Proofing: cmsHPROFILE; Intent: cmsUInt32Number; ProofingIntent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateMultiprofileTransformTHR(ContextID: cmsContext; hProfiles: LPcmsHPROFILEArray; nProfiles: cmsUInt32Number; InputFormat: cmsUInt32Number; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateMultiprofileTransform( hProfiles: LPcmsHPROFILEArray; nProfiles: cmsUInt32Number; InputFormat: cmsUInt32Number; OutputFormat: cmsUInt32Number; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; FUNCTION cmsCreateExtendedTransform(ContextID: cmsContext; nProfiles: cmsUInt32Number; hProfiles: LPcmsHPROFILEArray; BPC: LPcmsBoolArray; Intents: LPcmsUInt32NumberArray; AdaptationStates: LPcmsFloat64NumberArray; hGamutProfile: cmsHPROFILE; nGamutPCSposition: cmsUInt32Number; InputFormat, OutputFormat: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; PROCEDURE cmsDeleteTransform(hTransform: cmsHTRANSFORM); StdCall; external LCMS2_SO; PROCEDURE cmsDoTransform(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number); StdCall; external LCMS2_SO; PROCEDURE cmsDoTransformStride(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number; stride: cmsUInt32Number); StdCall; external LCMS2_SO; PROCEDURE cmsSetAlarmCodes( NewAlarm: LPcmsUInt16NumberArray); StdCall; external LCMS2_SO; PROCEDURE cmsGetAlarmCodes(NewAlarm: LPcmsUInt16NumberArray); StdCall; external LCMS2_SO; // Adaptation state for absolute colorimetric intent FUNCTION cmsSetAdaptationState(d: cmsFloat64Number):cmsFloat64Number; StdCall; external LCMS2_SO; // Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed FUNCTION cmsGetTransformContextID(hTransform: cmsHTRANSFORM):cmsContext; StdCall; external LCMS2_SO; // For backwards compatibility FUNCTION cmsChangeBuffersFormat(hTransform: cmsHTRANSFORM; InputFormat, OutputFormat: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; // lcms2 unified method to access postscript color resources FUNCTION cmsGetPostScriptColorResource(ContextID: cmsContext; RType: cmsPSResourceType; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; io: LPcmsIOHANDLER): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetPostScriptCSA(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number ): cmsUInt32Number; StdCall; external LCMS2_SO; FUNCTION cmsGetPostScriptCRD(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; // CGATS.13 parser FUNCTION cmsIT8Alloc: cmsHANDLE; StdCall; external LCMS2_SO; PROCEDURE cmsIT8Free(hIT8: cmsHANDLE); StdCall; external LCMS2_SO; // Tables FUNCTION cmsIT8TableCount(hIT8: cmsHANDLE): Integer; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetTable(hIT8: cmsHANDLE; nTable: Integer): Integer; StdCall; external LCMS2_SO; // Persistence FUNCTION cmsIT8LoadFromFile(cFileName: PAnsiChar): cmsHANDLE; StdCall; external LCMS2_SO; FUNCTION cmsIT8LoadFromMem(Ptr: Pointer; size :DWord): cmsHANDLE; StdCall; external LCMS2_SO; FUNCTION cmsIT8SaveToFile(hIT8: cmsHANDLE; cFileName: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SaveToMem(hIT8: cmsHANDLE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; // Properties FUNCTION cmsIT8GetSheetType(hIT8: cmsHANDLE): PAnsiChar; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetSheetType(hIT8: cmsHANDLE; TheType: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetComment(hIT8: cmsHANDLE; cComment: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetPropertyStr(hIT8: cmsHANDLE; cProp, Str: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Double): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetPropertyHex(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Integer): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetPropertyUncooked(hIT8: cmsHANDLE; Key, Buffer: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetProperty(hIT8: cmsHANDLE; cProp: PAnsiChar): PAnsiChar; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar): Double; StdCall; external LCMS2_SO; FUNCTION cmsIT8EnumProperties(hIT8: cmsHANDLE; var PropertyNames: LPPAnsiChar): Integer; StdCall; external LCMS2_SO; // Datasets FUNCTION cmsIT8GetDataRowCol(hIT8: cmsHANDLE; row, col: Integer): PAnsiChar; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer): Double; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetDataRowCol(hIT8: cmsHANDLE; row, col: Integer; Val: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer; Val: Double): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetData(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar): PAnsiChar; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetDataDbl(hIT8: cmsHANDLE;cPatch, cSample: PAnsiChar): Double; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetData(hIT8: cmsHANDLE; cPatch, cSample, Val: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetDataDbl(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar; Val: Double): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8SetDataFormat(hIT8: cmsHANDLE; n: Integer; Sample: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsIT8EnumDataFormat(hIT8: cmsHANDLE; var SampleNames: LPPAnsiChar): Integer; StdCall; external LCMS2_SO; FUNCTION cmsIT8GetPatchName(hIT8: cmsHANDLE; nPatch: Integer; Buffer: PAnsiChar): PAnsiChar; StdCall; external LCMS2_SO; // The LABEL extension FUNCTION cmsIT8SetTableByLabel(hIT8: cmsHANDLE; cSet, cField, ExpectedType: PAnsiChar): Integer; StdCall; external LCMS2_SO; FUNCTION cmsIT8FindDataFormat(hIT8: cmsHANDLE; cSample: PAnsiChar): Integer; StdCall; external LCMS2_SO; // Formatter for double PROCEDURE cmsIT8DefineDblFormat(hIT8: cmsHANDLE; Formatter: PAnsiChar); StdCall; external LCMS2_SO; FUNCTION cmsGBDAlloc(ContextID: cmsContext):cmsHANDLE; StdCall; external LCMS2_SO; PROCEDURE cmsGBDFree(hGBD: cmsHANDLE); StdCall; external LCMS2_SO; FUNCTION cmsGDBAddPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsGDBCompute(hGDB: cmsHANDLE; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsGDBCheckPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsDetectBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsDetectDestinationBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; FUNCTION cmsDetectTAC(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; external LCMS2_SO; FUNCTION cmsDesaturateLab(Lab: LPcmsCIELab; amax, amin, bmax, bmin: cmsFloat64Number): cmsBool; StdCall; external LCMS2_SO; END. lcms2-2.6/utils/delphi/lcms2.dll0000755002406300000240000121600012311617072016053 0ustar mariamausersMZ@ !L!This program cannot be run in DOS mode. $Ysssrf>srS,srgτs ^ssOsrcsrVsrWsrPsRichsPELPN!  pp@`$܏(0X@Њ@$.text `.rdataq@@.datalnH@.rsrcX0@@.reloc%@&@B݀p@݀8z ܰ8 y ̃݀ $yT$py \$$yL$D$  $݆% 5  ܮD$V WɹBD$t$  D$ \$$   \$,  x  p \$4_^U3ĉ$ Vܢ`W݂`Bru |$EBt$JL$ \$8݂`r JL$(\$@݂`r(JL$0\$H󥋌$_^3^]D${ ;Dz*{  { ݔ$ p3s݆( ܎H\$ ݄$z+55 Au)55Au"5eAu$505 5ݜ$݄$݆ܶP܎ atݔ$@Ct\$݆X.tT$0ܶ L$݆ݜ$D$D$@sL$ ݄$ D$(sL$\$(x݆8s-phsL$(ݔ$L$0ݔ$ܴ$@xs Bt$@ݜ$_^4̃$݄$V5WT$݆P܎ #s܎ݜ$݄$ T$ pzp݆( ܎H\$x݆8r-phr\$D$@rL$ܼ$`r|$\$݄$ܶ@X\$D$ T$ q\$D$ oD$AzJD$PHD$ @%80ݔ$ݔ$FD$PHD$@ (ݔ$ݔ$ɹBʍt$0 ɋ ݜ$ ݜ$  ݜ$_^$́ 3ĉ$$$ܰXVWB$0|$3\$Dx%Au8\$pD$L$F\XrBt$󥋌$$_^3̋V D$TVWɹBD$Tt$ D$d\$<  \$D   \$L_^U3ĉ$ BV܊`WBu |$rEBt$ܢ`|$8\$ r ܢ`|$@\$(r(ܢ`|$H\$0󥋌$_^3U]D$$VWɹBD$$t$ D$4x\$ p h `\$ X P H\$_^USVuWhpVK؅u _^[]E h@[@[@ ݛ@ݛ@0ݛ`@(0tPHt3Htݓ ݛ Rݓ ݛ 8ݓ ݛ ݛx ݛ p ݛ(ݛ8ݛPT$ݛ@ݛX݃`8Dz ,ݛ`D$BݛH$ /B$ BPBB$ BB󥍌$ Qb B_^[]̋D$t PhP[JUE S\$V@W\$@B$ݜ$($ 5]$ BPB$ B󥍌$ QùB$ ZEB$݄$݄$X݄$X_^[] UE Sݜ$V@Wݜ$@EBݜ$$$ ,EBP$$!B$ UB󥍌$ Q,B$ EB$݄$݄$ X݄$(X_^[] ̃ t t t3ø̋u#t"t't߃]w3V[u uøVgYut3Qt@8t;jPD$PZD$ D$<\uYQXt|$:t3Y̋htWVZƆ ËD$PV~Zj\VƆoau3Ë+΁s+R@WPIZ j%VTXú3ĉ$$ V$ $PQT$ hR^D$PQƄ$Ph|$$hQT$,Rhj PƄ$;džG$<8^33N̋;D$tPW(ø̋tiPTQOtW~(HQbdž džËtASUl$ VW;+‹PUBty^~;}_^]3[Ë_^][hD$agD$ SVݞWPOVt=0L$D$݆ hݞRVuÃ.ux3\$PUt?I0L$D$GD$ h\$IRUuW |$܆ݞP_E-u+u3Q|$ t PP;VQ;u_^t PR;SP;[̋WPQ";t4jR;uWP];3_Éx_VWy+;vBu džP 9sdžX_^̋ÍP@u+VWxD$ bt OWSVM _^Ul$Vt7tKt7;#tFPSY7t 6u^3]Åu^]Åt7N QU.7tvu^3]QSUl$V؋D$WU|$u|$HD$uL$htQ_^]3[YËT$RFu3D$PF D$8u0F6ttw?t ??ut7Ft$\$$L$(NtT$Rg_F^][Y_F^][YQjjRPD$jjjQPD$̋iL3҉ ̋D$Vt$ ;rup^VhP ^SVW|$hW73;u_^3[iݞ^dž džf hVfn3 $IhlRlr38Pnr_^[Vt$^Vt$D$ hPVTJ Ɔ^̋D$u38tVt$jPj PV^̋D$ u3 8tVt$jPj_ PD$Vo^ ́3ĉ$݄$V$ W$$PL$Q?jT$ Rj PV$_^3>́3ĉ$$V$ W$PL$ hQ> jT$ Rjd PVv$_^3G> ̋D$ Vt$jPj PD$V-^ SVt$ Wj\$ |$_^[t D$@3̋D$L$PQt PQVWu^hV|RhVLJ  &uhV_^ tL$3Ul$VWu@;~h,V_^3]ÃtV_^]ËD$S\$PD$ [ VWgudhVQPAhV7PAH@ɃɋuhPV[_^;};}t ˋ3Ul$ VWu0u_^3]ËL$;NxJ;,x(VL$_^]PUhV_^]PQhV_^]SWuÍP@u+‹~ N t%PWjSK;tDhjj3 _[Ã~t*;Nvhjjy3 _[ËFWSP< ~_[̸3ĉ$$ V$ $PQT$ hRID$Ƅ$$^38:QSUl$Vt$W0 \$< $\$C8#uQ4{t+Ph<U ? u |GGuո@ht$؋j3|$uOQ3ɋG)Gt`Owz$7PhDU @PhHU /P>PhPP>PhX W PRh`UU0\$\$_^][YQL$hlQ _^][YÍI]7n7777QVWD$tsUJ@hWUP>3~3d$D$  E;0tG;|Ѹ]_^YQSVWt$hSPy=D$ U39ID$ŋu-j SG<tt$2+Ët$J0;tt$E;|D$@D$;R]_^[Ỹ3$D$D$D$ D$D$hPC$uVt$W39>v5SWV5L$ QVjƍ\$RuG ;>rыD$ [PJ_@^̃L$3Ul$$VD$D$ D$D$WD$D$ L$L$D$;t ML$D$t$$39v1SWVT$RVƍ\$SPG ;>r[L$_A^M] QSUVW3VP tCt>t9t4ujWstiVGEm u]j 4L;tWPhVu_^][YhV\_^][Y_^]3[Ý3ĉ$SU$$V3W\$\$U|$ Z9u uBj pD$@;PQh8U3ۃtL$;|D$\$ th |$$[tBT$D$RPߋ1t(D$U|$ uB3$$_^][33Á3ĉ$SU$VWg\ S J @$?U%hl$jtQ3ɋ73Uhl$$tыRtjPL$ Q$= j|$\$Ƅ$4uR3ɋ؃\$d\$UDh$29Ct039QRj  PUD$,9$j;W6؃tCj,WCCFIH;r8 tƍP@u+€|0 D0u H8 thWfDhVYD?>jVWG PUD$,WJU:$_^][30ĐÍD$P$QhU5ʍT$RhU 뵍D$PhU hU됋=o?U==?VW?t+u싆 t( t# ttGo u_^USVu FxV9 $t,HtV3^[]ËtVt9HF~uQtzu샾 uQVV/hV"uRVV93^[]́$3ĉ$ SUVFD$$3Wt$D$$9|$I3Fl$ 9oG\$h0SK"/D$9Gd$|$؅tghL$4SQ_8D$< Ƅ$/P@u+yAu+;wD$0Ӌ+ъ @uT$UR\$8D$L$@D$;Ar\$hS!t ;$D$|$EtvD$390vlD$T$j|$0t8D$,HQVUh$T$@hR2D$8L$(PD$4Q\$P T$D$F;2rD$L$l$ t$@D$;A[El$ ;oKD$$@D$$|$;T$(V$0_^][3a,$hVSUVW33۽ |e~Ճ~QD$ȃw&D$Du us3 < r <w 3B;|_^]3[Ãt_^][ÍIDDDD́3ĉ$VWh,W7u*Wh0jP$_3^$3;+ČVhD$jP9Vq?uƍL$D<Q$_^3*Č̋D$UW|$P~u_] S\$VSt_OQSD!T$WRP5hhQ4}ƉIuVo^[_3] P3S~M!^[_] UW|$su_]D$ VPtnh,W,6t?hWP"4 }Ƃu#Q=V^_3]FP=uˋ^_]Vt$&L$ ^tVt$W 3Ʌt$Auɋ 3t q4 @uL$_^SUVW39~0$tL$QPtG;|_^][Ë_^][SUVW539~!$%tG;|_^][Ë_^][SUl$ VW39~"IWUPtG;|_^][Ë_^][̋D$PD$S\$Vt$ W|$|_^[ ̋D$ L$T$PQRt P#; ̋D$ L$S\$PD$ QX[́3ĉ$݄$SV$$PL$Q&$($$RP\$ $ ^[3&̋D$ SVt$ P؃y^3[ L$QxWc_^[ ̋D$ L$T$PQRt P: SUVt$Wl$Uy _^]3[uC\%h0Uu+oyD$PhDV _^][L$Qx\$ WP_^][́3ĉ$݄$S$V$W$$PL$hQ*T$ RSWV$ _^[3$SVt$ W|$u_^[ t$thPV'/ Ɔ_^[ ́3ĉ$$$V$W$ t8uPQVuHL$ QT$ R$QhdPU%uօt?tWT$R6uD$PV$ _^3#̋D$u(D$ ffƀVt$+ЍI @u^QD$@u3Y8Az ظY%` @\$D$Y̡`t$9t u3̃,V  B`B`A`\$ A`\$("\$@AbH\$8AbH\$0T$\$ $VT$D$ F\$$PD$\$0T$$VD$L$4\$D$8\$D$@$Q^,́VW|$@$PL$DQu _^ \$T$@R\$L$$@$P\$ QD$ \$T$D$(R\$D$$D$4P\$ 9L$ QT$f~f~u|D$h383ɉWf@u3fGufG%` @\$T$fGPL$PQT$tR2D$L8@` @u3+u ظ\$D$D$PfAz3*u ظ\$L$D$TfGAz3*u ظ\$T$D$XfGu 35Az ٸ\$D$d$hfG@ SjL$QWRSjD$`PL$TQRrCPL$PQRD$hPܫD$hT$XD$PD$LD$TS(AuKc(Au8@Az3` @Puظ` @(` @\$L$fAz3*u ظ\$T$D$TfGAz3)u ظ\$D$D$hfGu 30u ڸ\$L$jT$4RfGCWPL$0QT$R1SAu[؋L$|_^[3̸b]UL3ĉ$HEMU S]Vu D$ FW}L$T$=g3҅t*EL$P+D$D$DP0DPB;r Qk=KYMCLQk=KYMCQk=rtrpjjWD$j0T$$jRxL ID$0*DP3.5T$HL$T$D$QRPSL$`QVWD$ T$D$L$RPQT$\RӋƋ@(D$,jWh@jhJPD$ Dj"PWK D$$|L$Th@jh@Qh$@RW D$(tSD$P|rL$\$8jjjhKYMC;PWHtL$VjQejT$$Rh[V賘D$ tPD$(tPD$$tPD$,tPD$0tPͣD$_^[$H3 ]ËD$L$T$PQRSD$`PVW(_^[$H3 ]Ë$T_^[33 ]QUl$E=t]L$S\$+VL$ +߉l$L$ >u3tu 1QJju3L$u^[uT$ QhjR3]YËL$ T$QL$RT$QL$RWUQ҃]YËD$ UhjPk3]Y̋ `3t>S\$ UVW|$+;D$st),ti*@u_^][ ̅u`GËOV%uh %Iu^ËGhOQVR `ƆG 5`^SUVt$W|$P{Ss;u#GFt=RXSP;tP@Q5+_^][_^]3[SVt$ V{"jjV $t^[WVY"jSV#_^[̋D$= v3P̋D$VW|$WPu_^WjVs _^̋D$tPwYËD$ = v3PD$ P#"Vt$ W|$υt)3;s;r;r wD$ QP_^_3^W|$ v3_ËD$VWPtD$t WPV]  ^_̅uBeeeef`fVptMPtFHt? H5t H t @$t^3^̋D$L$PQ̋D$L$PQ̋D$ L$T$PQR ̋D$ L$T$PQR ̋D$tPD$P̋D$ L$T$PQR VWuPjSKtWSu VS_3^É~_FF ^Vjjt"S3F[u VP>3^Ë^S Vst#W~ t PP VQu_SR^[̋ SVWpBHz+X;v ;sƋu_^[ËH Aq_^[̋D$ it́3ĉ$$V$ $PQT$ hR$ D$PQV$ ^3QP:jL$QVD$ FWuG _VhCu^_ËG~QWRFPQdVTWR5^_V73Ʌ~3+W;t A;|^Ë^W=tIuu3_Åt_̃VUl$ D$hjP@ ]3^S\$WjS73;;GG jhUS6Gt|jUS&Gtlo GjVSGtL|$(wt~3~T$(fBOfA@;|t$$jUSG u;GtPSGtPSGtPSWS_[]3^D$nd+t$$t$ t$}uEjP3ҋw'O T$OjhEPQ }uEtURPSXODd WDdu3tOD$D$\$@hD$;D$ \OWjQ&_[]^ËT$hjRL 3^UE lV=$_][3̸豧ĨÁ3ĉ$$SWP3KhsmclD$=N,QD$ 0V0RD$$#D$$F4PN8QD$, VD$,RD$4PhpscahTFSMD$@N@QD$DVDRD$HD$HFHPNTVPQD$PRD$XPND$> D$@wl$@|$@D$@Pl$BaM _A,^] ̋D$H.VW Qw(D$ D$ y 5_^UQEVPtM ouVu3^]^]UQSVW}Wt/]E SPWtWtwtuV3_^[] dž\ _^[] ̋D$L$PQjUVW}Wt;E PW_t%M9wudž\ _^] xuV~_3^] ̋D$L$PQjUVW}Wt(EM hPQW6t uV3_^] _^] ̋D$L$PQj̃(3ĉD$$SUl$4}h]VWT$D$ D$+ōD$$ $T$Pvi {|$>D$(F>L$9D$$ 0QP|$уkUWR贖WL$D$jQWP҃4D$ WPSу UWRC+D$ptp PQS҃ lrD$ttuEQhjPTPSD$4MD$OU,WT$(GQRSWЃtK|$K+ωpS tUD$ D$@D$ ;Eh^_^][L$$3Ԟ(ËD$,t$,ERhjPfL$4_^][33蜞(UW39ohv>SVt!3xpE;ohr^[_]Ul 3ĉ$h SVuWh` D$VPP VP1>tmj2t_VT$tNE _t]'tStVT$u2Wh` L$QVϞ 3_^[$h 3c]h` T$RV裞 Wj$t _#^[3-]SVt$ WV\$hSPcu_^[WVW#u S藹_^[Vt$WVdL$QPIu_^WVgW_#^UVuWVM uQV1M_^] UhRQP=u_^] WVW<_#^] SUVt$3W;u 3_^][9\ tPV\ 9^hvC<t.tNHV,PPQP҃ FQP趒C;^hrËtP#NVQ蕒_^][̋Jr3t;2t @;r3ø̃3ĉD$SUVt$,W|$,/Ήt$4؅<t$_^]#[L$3˚PUL$$҃-mD$t|UtpT$ tcultX OHW,L$PQT$RUP@Ѓ<u:D$t$OWQhj R̒_^]3[L$3D$l$;Es,D$t$L$UQORPh(j Q|<L$$_^][3譙SWy_3[Ë _[U43ĉD$0ESVu 3W}t$ D$$΅u#kx\l3_^[L$03] H؅xK<tyt PGPc tXOHW,P<PQP҃9_hd|+GjdhjP]3_^[L$03蔘] KOh3Ήkt$(u,GRh`jP 3_^[L$03A] WKFXtL$$Q$Ѓ v؋T$(uIƍt$4#D$ t$,ORD$8PhxjQ莐3_^[L$03ŗ] i3;tT$  TlOHW,L$(PL$$RP QP҃ <uIƍt$4脐D$ t$,wWPL$8Qhj R3_^[L$03&] L$<_^[3̸ ] SUl$VW|$<uTl$tlD$ ;s؋QPЃSjUPуu5_^][t2\$tL$ ;sPRS褗 _^][UW D$tMD$uWP`T$ hRPWP؅t huS_^]3[GFO,RSN)t؋EL$VPQSV҃StЃS_^][Vt$ W|$ D$Pu_^L$S\$DŽtlt$VDŽWQR|<[_^Vt$ W|$ D$Pju_^ D$T$3ɉtl<_A^ ̋L$SW|$ 3y_3[_[htptwWUȅu-}PHVP NHV PNVW|=s WO=rtnmtQAVQ FAIV FNQVWhdahcSt_^YW:S=sS=rtnmuhtptwSȅuWs:_^Y|WM_^YUl$VWhZYXrSNhZYXgSAhZYXbS4ȅtktgtc\$\$$U8A\$EG\$F$P8A\$0G\$F$U8_^]_^3]̃SUVWShCRTkSl$t>jjV(t.St= baLuwT$RjVD$踔؅uWL(3_^][jhjjVl$(\$,\$0uPjW\)D$PjVPjWF)S@_^][ÍL$QjVPjW )jhjjVPjW)_^][̃d3ĉD$\SUVWSvD$ P*D$ hCRTr S\$(D$0\$0D$8\$8D$@\$@D$H\$HD$P\$PD$X\$XD$`\$`L$h\$hhCRTgSt$hCRTbSl$ D$t]tYtUjjWX&t0L$QjWPjV'jT$$RjjWPjV'_^][L$\3軐dËL$l_^][33覐dSWVH؋D$ PV[P&Vmu_3[= baLu6"PjWm'_[= ZYXu:"PjWQ'_[QSU,VWV= baLu1\$PjW"V= baLuPjW"_^][YV=YARGu _^][Y_^][SUWVg؋D$PVzP!VlVu_]3[= baLu = ZYXuPjWs! baLu$PjW[!_][Á ZYXu&PjW=!_][SUV4xWW=lcmnuD$u^YS3ۅUW3$pL$<VRWFPW WWhhcetWFduFNdnmdZF$ddmdKF(csedvF<tQr_VRP:x VQ1x^[SUl$ E] VjPwu^][ËWjMPQwFt039>v#ISP贆NV<t G;>r_^][Ã~t 39>vF<t KR舅G;>rCMPQwUVR|w_^]3[U4S] VuWjh@hhSShtsvcV|$l$$D$$ /|$@. /IuŋL$,|$ ;s ыB;rl$0L$(jQWssFuT$Rb_]^3[ L$(3|n+ՉT$ +A_ET$,<T$,n@*n@ \*V\T$ @nЃ *IuƋl$0L$(;sDFG;rD$_]p ^[ D$ @ @D$ @t́3ĉ$$SU$V$^ W~ L$QPGP$RPtL$ Qҋ~$$Pj$(_^][3/{SVWt|t3;w Nu_^[_^3[S\$VW{ jPqu_^[ËONW V tOɃ tQPRqGW PQ RGQ軜F_^[VW|$ w t#t PPdqF輝O QRPq_^̋D$ SUl$W|$jh@hhUPhtulcW؉\$u_][VjWpuS ^_]3[L$D$s ݉^F tcjSWypuT$Ri ^_]3[L$$t3tf,Af,B@;rl$ jPD$ UW|$,艛FuL$Q ^_]3[D$^_][̃$3ĉD$ D$,T$0L$(Vt$8D$D$D$ D$D$D$D$D$ D$D$< 3T$TD$Ty L$<$NfDtZy‹t$H>t3~L$4ffTDx@;|D$@PL$|QT$`RT$X Eu%>t 3~L$4If|Dxf<@;|D$4D$8@D$8;D$D*$|_^[3̸t]Ut3ĉ$pEM USVp L$ NYWy AT$0D$|$4|3_^[$p3s]}ߋn3ɉD$,;tΉL$ L$K\$(L$\$(T$xbD$t^3|8L$W\hD \lD \pD \t;|;}L$ ɋ@\t;|D$0PL$|QT$@RT$0 Euf>ta3|:L$WDxD|\Dp\Dt\;|;}L$ ɐDx@;||$ D$D$@D$;D$,$|_^[3̸q]Ut3ĉD$pEMS] VuWD$HL$Pr3_^[L$p3q]΋aD$LtD$D~pNt$Tt$T|$Dx5 3T$XD$Xy $4NfDt^yˋT$PRD$`jPT$T nD$D@D$D;D$L|L$|_^[3̸p]Ut3ĉD$pEMSVu W}t$$D$,L$(r3_^[L$p3p]ϋmD$0tD$O|$4|$4T$xV\$8+\$$436ʉL$ D$ Ѕy $2D$(OD$ 58\3yt$$L$(QT$uD$  ȋ@$uD$ A$@$p D$ H$] W|$3ɅuD$t__ T$ +t!Ju,3ɋыȋ@$utB$H$@$ȋD$t ׉_ Q_ ̋D$VW|$ ?u8u HOPW0tV4t!PjWv$u_^_3^̋L$T$A$Q$̋D$̋L$ 3t d$I$űL$ 3t d$I$@űD$L$T$HL$PT$ HP z %̃!$$\$@a$$D$\$@a$$D$\$D$z\$D$U3ĉ$( S]\$CVu W}|$t$tt3_^[$3"f]{uMu ٔ$ٔ$ٜ$ٜ$Aٜ$Aٜ$uG D$ٜ$D$ٜ$t$|$S$P$QǍ$D$ A3T$ 9Kv$+A;Kr3$ d$ل$ٜ$ل$ٜ$ل$ٜ$ل$ٜ$S$R$Pل$ل$F\Pل$ل$\hل$ل$ݜ?D$L$(QɍT$\R\$0`\$8`D$HP\$D/ل$3D$@\$d$ٜ$ل$D$H\$d$ٜ$ل$D$P\$d$ٜ$ؔAu ٔؔzٔArƋD$@؉D$؋$_^[3̸qc]̃ 8|$ 3l$ hD꾤xl$0΋33|$@*K 33P`Kߋ3ӉT$P(3T$,.ph4t$ 3~(0l$<ʋ33/' t$p 33t$(+0ߋ3t$p3t$8t$*h$ 39ʋ33l$Hh0@<> 33|D$33\$ÍeV ׋ 3D$D")ʋ 3D$0*C  3D$ 8# 3D$$9 ׋ 3ōY[eʋ 3D$(0  3D$,8} 3D$0] ׋ 3D$4O~o 3D$0,  3t$8>C 3|$<N  3|$@~Sʋ 3|$D5:  3Í0* 3D$HӆD$PًH ʉHHΉHH _^]H [KF uVWL_^3[_^F^[̅u3ËFWt<;rFWPQKu3_ÉF~_̅u3ËNW< Ǚ+;uN PQRSKu3_ÉF ~_̅tQ3~I f9quf99t @ ;|Ul$Wu_3]ËCV;C| _t:t$y+K+K;stS+S;rCsu^_3]ËL$UQPTCk@C tCS @lCK fT$$@fTCK @f<^C_]̋D$P@uSU+VpD$Q轆T$P譆\$ȉL$u^]3[WjVRI3t7tL$ ffG@;rD$P 6WQ WRI_^][̋D$SVQ1ЋD$Q!\$ u^3[L$t2VDQPT ^[Vt$u3^FWPQtF9G|qW tjN tc@PQRISNOF uGPR{HGt/FGGt"NtVRQPSF G_^W_3^Vt$t)F t PPHFt PQHVR~H^̃3ty9G~tUVw~2O f)f;l$uufl$f9itG@ ;|܃u3ҋO RtffL$tfPfL$ tP@G^]ÅtffD$tfQfD$ tQAG^]QD$ WQD$ЋD$Q |$ u3_YSVjPRT$R3tT$ |$ t:D$$u ^[3_YJ;sP3Ʌtf9Nu9N9A;r:^[B_YQD$ WQD$iЋD$QY|$ u3_YSjPRT$R3F[t|$u D$_YL$tVt$V;sqVPWPƃ 3f GF^_Y̋D$WQ҂ЋD$Q‚|$u3_SL$QPRj\$ [tߋT$ R茂T$fD$P{L$f2AB_̅u3ËFWux@ <wNPVTi&PQREu3_ÉFP~_VW|$ jXW"Eu_^~T|$FP9~s y9~rD$j!PN QXT$(j!RF-PXL$,_FMF,N^Vt$FPt PFTPDNTVQD^W|$u3_GWTSUV_-So UPQR&u^][_F;GsN;Orj!V URNj!F-SPNONGPi&NPRPQN$^][_Vt$u3^@;Fv Dt3W9Fv0T$SIu3 B>^Pi@f{;Fr[D$u3~Pi&f:u3H~Pi&f:_t@VPi&fD$ t8hPi&FPPVVPi& Ƅ^NPi&^Vt$u3^WV|$;r_3^T$ti&FP @BuT$tF +А @uT$tF-+Њ @uD$ tVPi&jQPL D$$t Vi&NPRRPL _^Ul$u]SVWU3~!3EPL$PQ-?tF&;|_^[]_^[]̋D$H Q̋D$@ PUUE8H Ƀ V@u31u ظ%` @\$D$;rITPhjQB^]ËQPi&T$U D$qPt$^D$ZIPD$D$Z]UUE8H ɃVW@u31u ظ%` @\$D$;rITRhjQB_^]39Av-u i&yP<|$@D$\;Ar_^]̃|$SWt %~&V-PFTh%h%SWjh lcnP_[̋D$H\x lcnt3@ SW|$3;u_3[wUl$Vj U7?;u ^]_3[j0WUn;v3N\$V\(N\,0Ou^]_[SVt$ 39v@W3FD$tPoND(tP^VD,tPMC0;r_Ft PFP>NVQ>^[W|$u3_GSj P5>؅tWj0QRa>Cu ST[3_GCU3 9/V3IWKDjPT1RHGKGTKT1GSLjQD2PXHOSDD2OT$RKD1$WD(PKD1(WD,PKD1,E0;/_^][_Vt$jVS=u^p^S\$V3tSWIFtPFtPF t PCPe=Ft KPQT=S>VRH=u_CSP7=^[̅u3DPQL$ Q4=VW|$ GjPu^Ul$V39u^]Wz$J$t$9ju9_u|>u_^]SUV3dh x2l l2x S x2l h 2 4 4 2o S 2 4` t^][̋D$fT$f ̃3ĉD$D$$S\$$UVt$43WD$9n~6D$+Í~0D$ D$WQPSE ;n|FTN PFPQT$ R3 9~~-IV\NXRT$?RV ЋRG ;~|؋L$(_^][33CVt$ F W|$ PW<:NXQW2:V\RW(:VW!:_^S\$Vt$Wj`VS:u_^[ËFjPS9G NVXQRS9GXFN\PQS9G\_^[Ul$Vj`UB9u^]3ɉ~^~+FT$u P , P RtA;|؋D$NjFT@tQUFP 9jSUF 8jSUFX8F\3~9L$uV\ NX,N\N\NXRt@;|Nj^]U3ĉ$M8SVu W}W3t$|^rY\$ YD$ \$ \D$ \$ Y\ D$ \$ \D$ \;rt$M;sA\$@D$\;rW؍D$\PL$ Q;39Ovo@` @8DXAz3*u ظ\$T$fNA;Or؋$_^[3̸i@]UQSVW؅u 3_^[]RJ3tPStF;r_^[]U4MytulcQ SVrWT$thjP8 3_^[]ËN0F0y T$N4D$8T$0F4y PT$N8D$\$ F8y PT$NL$,+L~D,PQQfD|,G;|$r9l$vL$|$,fD$ tO׹3tY\$$T$L+IDPE sT LRW%QWfDtPz@F;t$rӋ\$tt$$|$LfD$T$PSL$TQRD$<$_^][3 ;Ā̃3SD$D$D$D$ D$(UVWzReT$8eRPQhȃRL$(oh|$t9[ KW QhRL$$ @ h@EhEPhFWyrSHW QhRL$$ @ h@EhEPhFW=6VF|$ O PQ腡PjWlD$@jjWhGWVT$$:_^[3̸&]̋D$t PD$P̋D$L$h<PQ̋D$ L$S UVqIW ϋ  Tˋ(   ݋ ݋, + $   0 * y3 @~@y3 @~@y3 @~@H4 L$f1X6_fqfP8 ^]fA[QV3t$D$Q5\$D$$W9 P @$:M9Ft$|^ỸUl$ V3t$ D$ Q H \$D$$UE9\$ D$ 8@t_u31Az ظ%` @\$D$i f wCu32Az ظ %` @\$T$fwFt$ @ ^]̃ D$$SUVW:|$ O h<Qt$ u_^][ ËW D$$U8]DL$$y2T$$z D$0Q4 lT$4BP6VL$4QR8 @t$, D$ P @$757KuL$u3( D$,u$ P @$76F|ǃ|$t D$4 D$ hJhJUhJPx_^][ Ut3ĉD$pEMUD$SȃxVWT$(M x92T$RD$0PL$(QT$RhtsvchftamhftamhtsvcjVt$LԞ(>D$ P/T$,R#yPQT$8RD$0P3 t 9_uNVF QRPt$L$QPjV蛷uWN RD$4PjjQ葢PjVxT$R讳PjVet$D$MUPE QRPL$(Qt$,;T$RSȋD$PGT$ @U@IRWPRD$0=RLC4"=RLC2t =RLC3=RLC5u=RLC9 =RLC7=RLC8u¸=RLCAu =RLCE:=KYMCt~=RLCC= YMC=RLCDr =RLCF=YARGt = SLH=5HCM-M- baL+- += BGRʷ$   ǣϣףߣ6̊D$L$L$D$fD$̊L$T$D$L$L$T$L$D$D$̋D$L$T$ HL$ PT$ HL$ PT$ HL$PT$H jjD$ PD$Pуt3D$tT$jjD$ PD$Pуt3T$t D$PfS\$ UV3Wt&|$l$|$tWjUtF;r_^][ _^]3[ jjD$ PD$Pуt3Vt$ t T$R^UjjD$PEPуt3]E tT$ $RQP\]VjjD$PD$Pуt3^t$ tT$RP^pzAhQz)QzAYAY{U3ĉD$EVu jj L$QP҃t3^L$3g]t?D$PPL$ QP^T$RP^L$^3̸ ]̍D$PD$ jPH @D$PvT$ȋD$RjP L$H @SUVW|$3t\$l$sPUtF;r_^][ _^]3[ ̋D$PL$QD$ D$ jPH @̋D$PD$ D$D$PD$ jPH @UEM PQT$R$PE jPH @] U@E $iPSD$ȃlJBBB ^̋T$VPt$fF JQfFBPfFJ QfFfBf@QfFlfBQf^̃3ĉD$ D$jjL$ QP҃t3L$ 3D$PwL$ 3̃3ĉD$D$Vt$PC L$QjVD$D$ҋL$ ^3RVt$VЍH+uA^v3^jQL$QVH@^VW|$ WЍp+u_F^v_3^VL$jQ, T$RVWЃ_^́3ĉ$$ V$ $PQT$ hRy3^$3GË L$QPVҋ$ ^3̃= u 貺 D$$Vt$W>ppca~F=HepmwStH=Htniw-t"=Hmrft=Hpniikd)[=HmemuGL>=Hgatw)t=Htpot=Hrapuy茻蕢L=HpytuYt&v =_^hljj赺 _3^FhPhjj蔺_3^Phjj{_3^VW3跷33i3貓3343ͺ3fѡ95 td_5 ^̃$D$5H@$|$D$ D$ l$ \$ D$ l$PhVa <~h0VAhPh0 =t t u @8ú 3ĉ$SUVD$ PJhcsedV%htrpcV%3ۋ$\$$$;thL$QhhUwo;th$RhhVVohW;hW0hhW D$0PhW $<PhWD$@PPh WDhWh0W$$^][3J @\$@\$$hDV 7@\$@\$$h\VV htPẼwk$LPD$hP øPD$hP øPD$hP øPD$hP øPD$hP ÍI̱hVh4VhDVhhVthVihV^hVShVH@hV:hV/hxV$hVhV(W{SW($SMz$h0V_hDVHhHV39{vIC xQhLVmG ;{rhPVYhTVNh\VChlV8hxV-hTV"hTVhV @hVhVhVhVhVhVhlVhV@hTVhVhVhlVhTVwhVlhVahxVV@hVHhV=hV2_VWrI;ustM:+u1v>Fz+u v-Fz+uvFJ+3҅_^33҅_^QSUl$VW39|$~@\t8~(ËHPD@=thTVNDG;|$|_^][YU S]VW} tuf9ukCxf;r]f;wSCf;rJf;wEO$t$ T$D$tu_^[]ËT$ tE L$+f4f0Ju G;tIt$WGRPOWQRG sGOPQYWKG ;t,tWGRP3OWQR#CG Q39Z vE fXAwQC;Z r_^[]̃0SD$D$D$8H D$+ƉD$VWT$RWD$$C;r3ۅtRt$D$ +ƉD$ D$ 0QW҃tJL$(T$PSQWRT$@t0C;rƋT$ GRPHL$WQR:^][ Ët$ \$GVPt OSQ^]3[ ̃FS\$ UWjSP認D$[NjSQ蒍|$ %V҃3D$t%jV&jVE;r3tjD$+Nj߉D$$VЋT$D$4j+L$4UP L$4VQT$LV+ljE;l$(r\$(|$ VЋL$QVD$(҃ tX3t9l$ D$+ʼnD$D$(PVRt+MQVDtG;r؋T$RVЃu)|$ L$VQR葌t FWP背_]3[ËL$VQRlD$ NPQ^_][S\$VW|$CjPԋtL$VQSuSVR_^3[_^[̋D$ L$PQqËD$L$QjPR̸ ZYXS\$Ul$ VEjHPDu^][W|$L$QWf|$u*|$ jWT$RWtrf|$ujD$PWt[VWtPNQWtBVR^Wt/F PWt!N0Q^(WptV8RWbuEVPԊ_^]3[_^@^][QD$$PPVuYD$$4PVYU8Vu WjVZu3_^]jVFt}G\$${tG \$G$_tG8\$G0$C_^]̋D$L$QjHPRQD$S\$L$QSu[YW|$v_3[YUl$UVjjR;t,WFjFF VSЃ;tMVQI^]_3[YËT$ ^]_[YS\$V3WCN8PtF8tF8PtF8PtFIu|$VWgu_^[Ë SVWЃ _^[̋D$L$QjPR̈̋D$ L$UVt$jQVR=u^]SW3t݋D$SPtG;rD$_[0^]ËL$QUR8_[^3]U4SVW}3t&]E $P.tF;r_^[]_^3[]ËD$SUl$Vt$jEHVQ{؅u^][W3t4D$T$RP{t+L$D$y  XG\;r_u^][ËT$BSP^_^]3[U4SV3W9uvV}]  P@$譥|$>D$6 D$8l$8|$8D$8PSl$>qtF;ur_^[]_^3[]̋D$ T$ D$QHRQ҆̋D$L$QPR螆̋D$HVjQu3^ËT$ VRKtD$^̋D$ T$QR̋D$ T$ D$QHRQ2̋D$HSVjQ39؅u^[Ul$W|$ utOD$HWRQQt8D$WjVP҃;u Vhh>SE7;uSLtWjVRSЃ;tMVQG[^]3_ËT$[^]_Vt$FW|$PWu_^Ë NQRWЃ _^̋D$T$ QPBP̋D$ S\$s3[Ul$L$ QUru][W|$$;s _]3[Vt$VjR#7D$DNGPQʂ#WjVU҃;D$VhhP+78L$QVRD$(PUL$(QU|$(?D$(;ru3t"jjT$RUЃtVF;rD$(+؃FrFL$(QU̿t7T$(RU}t(3$jjD$PUуt*FCrT$$D$^_][ËT$BVPL$Qc9^_]3[̃\3ĉD$XD$`S\$lUl$lVWjDL$(jQD$D$$ jjhhS:w+ljD$ ju,\$ShR詁jD$ ChP蕁D$eL$QWR!D$/D$HjWQD$T$WRhhSs9L$?PQhhS :VUT$ RWUЃ T$ L$$QRUЃ tujU?tiFVU3t]\$UtLT$ L$$QBRUt7jUt+jUUt D$$PjCUу tD$D$tT$PBPj@D$jP hUu|$3~jhUhDF;|3t$$D$`jhWPуT3ɍGy@Ip rf,10 rfl1p rfl1p rfl1Out$l$\|$Ft$;dWUuT$RSU3u-3~DtPWF;|tWUWu3_^]LPD$hjP13~LQ!F;|_^]LSUl$V3tcItG yuV3ۅt"WHYiT$\$D$L$PQ袴t+C|F;r^][ËT$hDjR&v ^]3[VWu_3^Ått3;wOu3ҋ3_;B#^Ut3ĉD$pES] VW}D$,D$PS\$(jL$QSWT$RSDjSѰ4L$'D$<PD$GQPL$(t$L$0QST$8RS۱D$@PSȱL$HQS赱T$PRS袱D$XPS菱|L$`QS|iT$hRSiVD$pPSVC|$u2L$0Q"u$PGT$4RjjPPjVOVS\$$Q L$Ë\$WjVRrD$(D$$GVPq؅D$ jVSPу3t  ыL$$f@L$$;rGSPqt$(L$T$D$VQRPGPt5L$PjQWVRqD$L$ W\$PQR ut$V53_^[L$p3Oz]ËD$,L$|_^[D$3/z]U4S]V3W33xftamt$8t$u!3~DtP{F;|3^]@ËL$TPjQl 3~TRV{F;|^]@QCUiVW39;v43~)SHqT$PRtF;|G;;r̸_^]Y_^3]YUt3ĉD$pESVuW} D$,D$PW|$0ǩL$QW贩~T$RW衩kjW葩[\$ND$<BPD$(FQPL$,w D$L$0QW谪T$8RW蝪D$@PW芪L$HQWwT$PRWdD$XPWQL$`QW>T$hRW+{D$pPWhu6L$0Qu(PFT$4RjjPj:L$PjQE T$RW蚨$D$PW臨L$V\$QW|$(R L$\$$|FjWPj؅L$(SWQ`VSu$RjD$Ph 3_^[L$p3s]ËD$(L$$PD$QPRNu(FSPjD$P& 3_^[L$p3@s]ËL$PjQE VSRKjD$L$(V\$|$$PQR uD$P3_^[L$p3r]ËL$,D$_L$x^[3r]U4MSVW333ۉ|$4|$0t$,;trxftamuX @$;t_tsvc9Pu x @$|$43;tExtulcu p @$t$,;t.9Pu P @$T$0;thjPj 3_^[]QAQT$@D$8;tNyu RVtɋT$8RVtWVtjVרt$V t A$VnB$VݩU@$Vĩ< A $V諩#B($V蒩 @0$Vy A8$V`B@$VG_^[]$V-$V$Vy$Vc$VըM$V迨7$V詨!$V蓨 $V}\$4tCQRV-u_^[]jVD$0t@QRVu_^[]jVtVzD$<\$8;tL$,t QPVM\$0tV?4_^[]Uh3ĉD$dEPVуu3L$d3o]ÍT$RV謤tD$ PV蝤tэL$(QV莤tT$0RVtD$8PVptL$@QVatT$HRVRtD$PPVCsL$XQV0`$RVND$PV ;L$QV(O$RD$PjjQZL$d3)n]̃X3ĉD$TD$\SUl$hWPVу&jjT$XRVЃ3LPL@rT$RVjVԡjVġjV贡OjUSD$PQJD$] <uM39{v[jjT$RVЃulD$ f zG;{r_][L$T3mX<u%KPQV觡t+_][L$T3lXЋGRhjP{eL$`_][33lX̃3ĉD$ VV虧=vructY=arapt1t$eOPhjQe3^L$ 3XljT$ RVWL^L$ 37ljD$ PVWkL$ ^3lUHV3Wt$ v3_^]ËEPE Pуt;v 3|$t.$M }Dt(U RTtF;rۋMQD$PSR9|$ 3tDPpF;r_^]̃UVt$,VЃL$ QVhmu^3]ÍT$,RVVtjV芟tݍD$ PV t΍L$QVtT$RVtD$PVޟtL$QVϟtD$,S\$W|$0WPSRD$u_[^]ËD$tPVW~ PD$jPL$t&D$4PQӋDt L$PjQ`D$ t#\$4PVW) t T$PjR5D$$tPt PD$jPD$(t#\$4PVW t L$PjQT$8D$_[^]U t PD$jPJD$tPt L$PjQ&D$ tPVW t T$PjRL$$t&D$4PQӋt PD$jPD$(t#\$4PVW t L$PjQT$8D$_[^]̃(SU3Vt$<WVl$l$l$ l$$l$l$8l$(l$,l$0l$4Ћ\$HL$QhtsvcjSxT$RD$$PL$QhtsvchftamhtsvcjS T$RD$PL$QhtsvchtulchtsvcjS ubT$RD$PL$$QT$,RD$ PhtsvchtulchtsvchftamhtsvcjSF0u!L$EVPF^+ _]YUl$VWjjShUD$HVQ9FT$VR,u_^3]VWShUtD$WVP Ѓ tҋL$QWRlF_^]SUVW|$GjP l$L$hVUW\$0tPhVUWttE $P)tNU QRhtG;{r_^[]̋D$L$QhPRCUl$EVj8P/Cu^]S\$W|$VW蟂tNQW葂tV0RW3uEVPEC_[^3]_[^]UVuW} VW蛄u3_^]ÍFPW腄tN0QWw_^]̋D$P̋D$P̃83ĉD$4t VW\$ D$PV|$t$ ou_3^L$43VK8Á|$frucujVFt׍L$QVtjVtfD$frWUjhURl$0At$u]_^L$43J8S]3t/D$ D$V^P.Gh\$;r؋t$D$khD$\0p \0W^dd$t$ T$$RVqjVaD$$=fraptp=fmastD$,PV8|$,L$j{QWR@x3IT$ QR~QF;rD$4D$8D$PVD$8.~jV~fL$PSf|03t.d$L$ D$u^[_]Yh0(VUl$$SU譯tEVSP[33ttPLG;rL$QVR>L$ 3^[_]Ỹ 3ĉD$S\$,CUl$,VW{hfrucUD$~jU~WU2~jU"~3Ot'\$Q$U~wFh;r\$8{D$A\$+D$\$D$d$;uyhfmasU0~%jU ~KXQU~|$D$8H39t`S\Q$U ~D$8HF;t`rhfrapUD$(D$,D$0}jU};w}WU|trjU|tf| 3t'Q\$ D$ $Ux}tAF;r\$D$T$8@hD$\$;B_^][L$3aE ËL$,_^][33LE ̋D$ HT$L$PQS\$Uk Vt$WVK QVx|u_^]3[S RV|tC L$h`+UWPQ_^][USVu WD$PVytUL$QVxtF|$t$]SjVRG;D$t"CjWP3;D$uL$SQR];3_^[]3ۅt"M D$PQ ytD$T$C;r3t(M D$PQxtD$T$F;rދD$\$uNPD$SPWQVSR:D$NPQ:U_^[]QS\$K C Ul$QUD$ zu]3[YSRU~ztVW{{ 3t$D$ Q\$D$$U{tEF;r39sv.T$ BQu \$D$$UztF;sr_^][Y_^]3[Ỹ@3ĉD$̋FW3;t PP.F;t PQ .~~_̃Vttw tw(tw$^SUl$ VWj0jU؋躟 0t2u $t&|$v ut|$vu$uc_^]3[_^][VGPSku3^ËOQS ktW<v L$ 0^SUl$V3W9t$vf|$Ut]U tK|$v|$Uct.|$v|$U$FtF;t$r_^][_^]3[̋G QSluËWPSlSUl$ V3W9t$vDtC} t7|$v }t$|$v }$tF;t$r_^][_^]3[SUl$ WFمu _E][ËPSуt7V<D?PQ)+EtSuURPg+_]3[ËM3fy_]B[f9tf8u+SUW؋VЋL$yD$+T$uQI_]C[ËV#u_][ËVҋL$QL$+_][QGUl$tFO<t=PS҃u]YËG D$ QT$RSPl3ɃE]YE]Ỹ|$ Ul$ uEM]ËWVҋT$M+D$jRD$VP衱u_]ËVыU+_]UTMS] 3VWSD$,D$(D$D$ ҃pD$PS`gt9L$QSQgt*|$t*t% t UBWhjP*3_^[]ËMQRnD$ tMID$0WPD$QXT$VWRD$h hhVXt%WhcsedSxtVhtrpcShtW9tV/_^]YQSVWV3RjP;u3_^[YËGOYGXX Wh@ZGH$hhQT$GH(RhhQؤtW _^[YU43ĉ$0EMSVu W}PL$D|$H)؅h $SmhrtnmSh BGRS跇h ZYXS茇jSdhLJMWhtptwSVT$LRC$P׍L$L$QhdahcSȑJ|$@D$@\$HL$`Ft$H\$P\$XD$`$ݜ$RD$|hZYXrݜ$S݄$ݜ$D$tݜ$݄$ݜ$݄$ݜ$D$|ݜ$݄$ݜ$݄$ݜ$$PhZYXbSto$QhZYXgSҐtX|$Dt8RhCRTrS踐t>GPhCRTgS襐t+OQhCRTbS蒐tD$@t/PhmrhcSzuSЍ3_^[$03)]$<_^[3)]̋D$ L$T$PQRjj U43ĉD$0ESVu W}P}؅h $SޅhrtnmSShYARGS(h ZYXSjSՃhht7tVD$$PeAL$ QhtptwSutt,WhCRTkSauS跌3_^[L$03(] L$<_^[3(] ̋D$L$PQjU4SVW}W|؅h $S߄hknilSTU RS*RSjSۂRYVVW[tOEMPVQ觧t=PjWht#Wh0B2AS]th uS蠋3_^[] Wo_^[] ̋D$L$PQjU MEQ VqЉD$At$D$D$D$AuzD$@8` @Az3,u ظ\$T$‹U fAD$D$Az3)u ظ\$D$fBAD$D$u 3/Az ظ\$D$fBfIfJ^]U4} KYMCSVWtEhj Pk 3_^[]E{AtuD؋uhjV)E z]z]Vy؅th $SɁhknilS>hKYMCShKYMCSjSjjVFhKYMCVMjWWjQ豫D$uFL$ L$QT$ R\$(FD$\$0FD$ \$8?D$PL$$QV R9D$ PL$ Q8V^8E T$RP0=^]U3ĉ$ES\$@VEW}\$PE \$`$E(\$hE0$P>$QT$lRL7E4$$P$Q$R!7Wr؅htsbaSzh baLSzh baLS`zjS8yjjW辳tqE jj$$$$$$$$j$PWt"jL$LQhPWqu%VdzS3_^[$3]0WjVߴhutPhtptwS=Vh0B2AS1Vk$_^[3]0UE0E$M,UPQ \$E\$E\$E $Rj ],U4SVW}3WD$@eq؅h $SyhhrtrpS yhYARGSxh baLSxjjWt^T$ P H  @ 8  0 ( Rz} un  H   8    E  % XX] hljjY 3] U0E T$V\$W3@@\$( \$ F\$D$ fD$(f\$0Z)|$0tD${!\$GD$ \$r3_^]E_^D$D$=]́(U$4VW|$X$PL$\Qau _^](E\$D$(E\$E$PB\$L$XB\$$Q¹T$RSD$0P蒾L$@QST$R肾T$\$$D$(t$@$P}T$D$0$t$H\$$QXD$ t$8$\$T$$R3S$PL$`QP$8T$XR$PQ6_^](̃T3ĉD$P D$X\$S Q\$P \$\$  \$( \$0 \$8 \$@ \$H \$P8L$\[3T́VWPL$ Q+T$hRЍL$ Hu _^Ĭù|$ D$ PL$lQS;_^Ĭ́ S\$XF\$hT$X@\$(@T$`@ \$ @0T$P@8$\$0\$\$$P薷D$\$$D$ \$D$($QoD$8鍔$d$0T$xd$`d$ ݔ$d$Xd$(ݔ$\$\$$R$P$QYu[ $D$pD$h\$\$$RʶP$QT$(R蕻D$0L$8\$D$@L$`\$D$8L$X$S艶D$0L$C\$D$@L$ \$D$8L$($PZD$`L$0K0\$݄$L$@\$݄$L$8$Q%[ UUM D$Pu]E@\$L$8@\$$QĵRD$}+߃)}};]r\}t3;v uu+ ;w;Ew[PuVz=YPZ t{tdE+)E$V9YtR}t"MEFKME&E} tu ju8[ ""N +3uN j h=3u9ut/9ut*9uu-} tu VuZ ="!3=u7Yuuuuu uEEEu:8YËUuuu juZ]ËU eWj3Y}9Eu!N!xM Vutu!*!SE;wMuEuEBuuPutMxE EPjYY^_ËUujuu u<]ËU SVW} t}tuu  3_^[ËMt39Ew}F M}tFEEN t/Ft(;rWu6b)~> +}O;]rOt V&aYu}}t 3ҋu+WuV:YP+` ta;wM+;rP})EVPYYt)EFKEEAEN +3u N Ej hF:39u t!9ut39u;u&3\:uD5Yuuuu uPEEEu5YUW}3كE 8t3_ËUSu M]sTM胹~EPjSZJM Xt}tE`pE胸~1]}EPE%PfYYtEjE]EYH*3Ɉ]EAEjpUjRQMQhpEPe$kEt M }tMap[ËU= uEHw]juYY]UV3PPPPPPPPU I t $uI t $r ^ËU,3ʼnEVu uMu!J}tE܃`pXEԃ~EPjPH HtFɍEPEVPXe@ }tE܃`pM3^+ËUjuFYY]ËUVuWuC DF t8Vf]VHnV6PxmyFt PfYf _^]j h6M3uu& F @t f E6V1YeVYvP&YʋUVuF uLg}F uV(E eYVYF YyF ttuFuu Vc2YPo3Ƀ A^]j hq239Eu]?ut tuum-YeVu u EE EQ2u-Ỹ=r\$D$%=u<$f$ffd$zr~D$f(pf(f(fs4f~fTffʩtL= |}f=2  fL$D$f.{$T$ ԃT$T$$"oD$~D$ff(f=|%=2fT`XfL$D$ffT`f\$D$ËUeVuu$j^0 j$hVNE tӋ@ME|@Ws j^0뼃| &AwSWjh3PQ-rHF+yjd}M؋Ǚ_jh+؋EDAڙRPq+jQSRPq}U}M|sGEǀ3UȁEyIAu jdYuEluAU2EȁyIAu jdYuEluEEjSuFW'qjFhRPpU}uF3A9B} A9|QIN+jF E Sp0pjY3ShuWVpjFhRP_pSUj_^ 3[^ËUVqtuVYY#^]ËUuu3t PY]3]ËUQQEPEMj*h!NbQPp|=o@vЋMtQËU(3ʼnEEu>3M3Ãx|8s PEPrYYuȍEPpYjh -E uzdu38<udy h.HN+IN;~WPu N EM F yM tt@@ tjSSQ^x#ƒt%FM3GWEPu 6N E9}t N E%_[^A @tyt$Ix  QPvYYu ËUG @SVt2u,E+MC>u 8*uϰ?}^[]ËUx3ʼnES]Vu3Wu} u+  t `p F @u^VZ'Yttȃ @A$uttȃ@@$q3;g3ɉ: G9' B ƒ tJt6t%HHtv j ^ R C 7 *u,[;  k ʍDЉ*u&[;k ʍDЉItUhtDltws?luGXL @<6u4u<3u2u]u ]FE /F<-uqtm]tfF:s{{:{s,{*ЋσdzDGJu苝L{D2ȊЋDL<]cD@b+u.du t ƅs\t ؉l0\t؉lxt_XtZLxDžTt&HtdusDžLo.tt\S aYYj0[\tlH؉ltdd}sDžLxF@xGrtt\P`YY;c4cZt@3f@ƅ{l-u ƅY+u.du t ƅs\tx؉l(<sLxt]LptTPYLou88<Kjj <8M0P&Ytk8<SYlTCЙH8f>D[GDd<%u8GuG\tGlD;uwP7Yt%\tGD;u7tlu?%uNDxnuB4lt\P\YYt\l\YY0u PYlu*4u 8[ut% apt `p4[M_3^ƽWƃуtefofoNfoV fo^0ffOfW f_0fof@fonPfov`fo~pfg@foPfw`fpJutItfofvJut$t vIuȃt FGIuX^_]ú++Q‹ȃt FGIut vHuY j <d.3ËUVuMEu t0u$(}tE`p3}t }|Ѓ}$ʃeMSW~~EPjPeM BtGǀ-uM+uGEOF$=u*0t E 6WTt3%>uN@ uNhF PPt,F N@Ch58H3_[^ÃVW@t6;s!p ~tV\@N;r7'Y@|_^ËUEu{]Ë@]h@d5D$l$l$+SVW1E3PeuEEEEdËMd Y__^[]Q̋US] Vs35WEE{t N3 8!N F3 8E@fMUS[ EMt_I[LDEEttEx@GE؃u΀}t$t N3 8螳N V3 :莳E_^[]EɋM9csmu)=4t h4VtUjR4M UE 9X thWӋE MH t N3 8N V3 :EH9S OhW-t"t t Ht3øøøøËVWh3FWP3ȋ~~~  ~@ F+ο@Ou@Nu_^ËU3ʼnESWPv`3@;rƅ t0;w+@P j R Cujv vPWPjjV3SvWPWPWv S)DSvWPWPhv S)$3EtLtL @;rRDž3)ЍZ w LQ w L QA;rƋM_3[誰j h` `Gptltwhuj 5Yj SYewhu;5ht6tVhu@tVYhGh5huVdE뎋uj QYËUS3SME u p8]tEMapElD;FG;v}>uЋuE}urlj{CijC CtZf1f0JuL@;v~0C@IuCC Ss3ȋ {95 TM_^3[衭jhM}_huqE;CWh 3@Y؅Fwh#SuYYEuvhhuFh=@tPY^hS=dFp`j OYeC C C 3E}fLCf E @3E=} L`@3E=}h@5hhuh=@tP!YhSE0j NY%u @tSYeEÃ=,ujVY,3ËUSV5dW}W֋tP֋tP֋tP֋tP֍_PE{dt tPփ{t CtPփMu֋P_^[]ËUW}SV5hW֋tP֋tP֋tP֋tP֍_PE{dt tPփ{t CtPփMu֋P^[_]ËUSVu3W;to=th;t^9uZ;t9uPJSYY;t9uP)#SYYYY;tD9u@-P+PҾ+Pľ蹾=ht9uP)O萾YY~PEdt;t 9uPkY9_tG;t 9uPTYMuVEY_^[]ËUW} t;Et4V0;t(W8jYtV>YutVsY^3_]j ha`Fpt"~ltpluj g.Ytj KYe5lVYYYEEj ~JYuj8xV5|u5 V5^átP5 Ѓ tP Ijheh|uF\Hf3G~~pƆCƆKCFh@j JYevhdE>j dJY}E FluFlvlYE3Guj MIYj DIYËVW5ЋuNhje:YYt:V55 ЅtjVYYN VػY3W_^ËVuj_,Y^jhuF$tP苻YF,tP}YF4tPoYF t tjVhH3Z u~F> t>=unF> tjhLVX u ?jhTVX u  jh`VeX uF> t>tqhuE SuPUt3" EMH 3ɉHHHM H_^[jh33}jCY]3u;5`.@9t[@ uHuAFwFPBY@4VYY@@ t PVYYF둋}cj82Y @;tNh@ PP@u4uY@ P@@<}_ ;tg ___OE Ë}jAYSVWT$D$L$URPQQhd53ĉD$d%D$0XL$,3p t;T$4t;v.4v\ H {uhCXCXd_^[ËL$At3D$H3蚞Uhp pp> ]D$T$UL$)qqq( ]UVWS33333[_^]Ëj?X33333USVWjRhQJ_^[]Ul$RQt$ ]UUVujXEU;u o }S3;|;58r`F NW<@L0u# hwN];9] t5D0$EHjYtHuШtU] ]zШuB6M;rEu/Y]um unjjju6D(T,AHtzI tr}tlM} CED tPL% tE}t?@M}ED% u%L& t}t@MED& jMQuP4xMm;MdMD}t ; u ]EÉ]E;M<< t CAMEH;sA8 u M uEmEjEPjEP4u uE}t?DHt} t ML%;]u} tjjju*5} t CE9EFD@uC+E}EK xC3@;]rK @tu *zA;u@D1Ht%CT1| T%Cu T&C+ؙjRPuP4E+]Pu SujhEu4PYME;E tP詮YEEE3;EL0ƅt f; u ]EÉ]E;E tf EM;sHf9 u Ej MEjEPjEP4u u[}tUDHt(f} tj XfMLML%D& *;]uf} tjjju2f} t j XfE9Et@u ff+]]j^;u 0jmZe\3_[^jh0{]u x;8r <ҋ<@D0tƸ;E@um RSASYeD0tuu S E % ME EË]SSYËUVuu3a}uj^0sH}t9u rVuu u ju. }t9u sj"YjX^]̋T$ L$ti3D$ur=d.tTWr1كt +шuʃtt uD$_ËD$ËUGU3ʼnEE VuW34809}u3;u8BS@L8$$?tu'Mu[ @D8 tjjjV/VX1YD[@l39H P43;`;t 8?P4 3,9E#@?g $3 ǃx8tP4UM`8jEPKP Yt:4+M3@;jDSP4 C@jSDP4 n3PPjMQjDQP C@=j,PVEP$4 @089,j,PjEP$E 4,08<t<u!33Ƀ @D<t<uRDQYf;DI8t)j XPDQYf;D80E9@8T4D83ɋD8?D49M3+4H;Ms&CA u 0 @F@FrՋH+j(PVHP$4C(8;;+4;El%?49MH@+4jH^;MsCΉ u0j [f @@fƁ@rH+j(PVHP$4i(8;a+4;EGK4,9Mu,@+4jH^;Ms;,,΃ uj [f@@fƁ@r3VVhU QH++PPVh;j(P+P5P$4t (; D;\,+48;E ?Q(Qu448t(D8 D8ulDt-j^9Dua i0?DmY1$D@t48u3$!) 8+0[M_3^UjhP]u ҿ x;8rƿ 諿 Nҋ<@D0tSuJYeD0tuu Sn EQ Y ME EË]SJYËUSVuF Ȁ3ۀu@t9FW>+~,WPV_YP ;uF yF N _Ff^[]ËUVuu V5Y/V|YtF @tVP MYY3^]jhp 3}}jX0Y}3u;5`.@98t^@ tVPVAYY3BU@H t/9UuPJYtE9}utP/Yu E܉}F3u@4VJYYE}EtEj.YjYUWVu M};v;r=d.tWV;^_uur)$ Ǻr $4$0$Dp#ъFGFGr$ I#ъFGr$ #ъr$ IDDDDDDDDDDDDDD$ 08DXE^_ÐE^_ÐFGE^_ÍIFGFGE^_Ðt1|9u$r $$lIǺr +$$F#шGr$IF#шGFGr$F#шGFGFGV$IpxDDDDDDDDD D DDDD$E^_ÐFGE^_ÍIFGFGE^_ÐFGFGFGE^_ËUEt8uP7Y]ËU3ʼnEUS3VW;~EI8t@;u+H;}@E]9]$u E@E$539](SSuuPu$֋};u3R~Cj3Xr7D?=wH;tP蹝Y;t E]9]tWuuuju$օ5SSWuuu ։E;Mt)E ;9EPuWuuu };~Bj3Xr6D?;w$H;thPY;t 3;t?uWuuuu օt"SS9] uSSu uuWSu$EWYuEYe_^[M3脇ËUuMĎu(Eu$u uuuuu P$}tMapËUu M~EMA%}tMapËUjuYY]ËU$3ʼnEEM SVuWP3WWWWQEPEPM3 Et }}0EPEPFEYYuuEuuE+EMFEFEF_^3[Lø(F@D=H<L =Pt<TXE\<`;d~;ËU}t[]ËU|3ʼnEE3V3EE FWE}MuMMMMMMM9M$u$ǵ3<UU< t < t< t< uBS0B $uHπwjYJߋM$ :ujY+tHHt |jYE뤃ejY뛍HωuvM$ :uj<+t"<-t:t7֋5(֋5$9]u9Et]܉]ЉE؋}ԋ]EH}TsEtЃEEX}\sEtЃEE }u) jYu}tjY;ËUjju ]jjj ËUu2Yh̋U3M; t @r3]Ë]ËU3ʼnESVuWV3Y;ljXYjXYu =p6hTh WW hB VSfJ uh$SVW t 3PPPPPxVW@Y=YXt"jSYYt?VSP uG>u5d)%d' 3Y[_^5 % 3PPPPP̋UQMS3VU 9Et ]EE>"u39E"FE<tBU PF ]Yt} t M E FU Mt2}u t utBe>< t< uFN>}t EE3C3FA>\t>"u&u}t F8"u 339EEtIt\BuU tU}u< tK< tGt=Pt#;\Yt M E FM E  \YtFU FVtBU ME^[t ËU S3VW9,ufhhVSlh.5 ;tE8uuUEPSS} E =?sJMsB;r6PY;t)UEPWV}E H 5 3_^[ËU SV3;u3wf93tf90uf90uW=VVV+V@PSVVE׉E;t8PGYE;t*VVuPuSVVׅu u}YuSE S3_^[ËV00W;stЃ;r_^ËV88W;stЃ;r_^ËUVe2N\UW9t ;r;s9t3tPu3u `3@M S^`N`Hj$Y~\d9 |~d=u Fd~=u Fdn=u Fd^=u FdN=u Fd>=u Fd.=u Fd=u Fd=uFdvdjY~d`QY^`[_^]ËUcsm9Eu u PYY]3]3@ UeeSWN@;t t УeVEPu3u333EPE3E3;uO@u G 5։5^_[Ã%ËUQQE VuEEWVE Y;uI NjJuMQuPE;ut P;Yϋ@D0 EU_^jh艰]܉]Eu ŕ Ëx;8r踕 蝕 @ы<@L1tPg YeD0tuuu uE܉U; C ]܉]E E܋Uu YËU h$YMAt I AI AAAAa]ËUEu誔 3]Åx;8r菔 2ދȃ @D@]ËVW3@8@(r_^á39pËUSVu 3W};u;v E;t3{E;tvj^0蒓VuMjE9XfEf;v6;t;v WSVA 裓*蘓8]tMap_^[;t&;w xj"^08]tE`pyE;t8]t~t WW2s&Y|ܾp_t ~uPӃ|^[ËUE4pD]j h8X3G}39 ufjhYYu4p9tmjY;ue 3Pj XY]9u+hWPuWarY0 ] >WFrYE Ej )YËUEV4p>uP#YujY6@^]̋UMMZf9t3]ËA<8PEu3ҹ f9H‹]̋UEH<ASVq3WDt} H ;r X;r B(;r3_^[]̋UjhXh@dPSVW1E3PEdeEh*tTE-PhPt:@$ЃEMd Y_^[]ËE3ҁ9‹ËeE3Md Y_^[]ËUQQ3ʼnES3VW]9]u E@E539] SSuuPu֋;u3~<w4D?=wt;tPOpY;t ؅t?PjS` WSuujuօtuPSu EStEYe_^[M3ZËUuM)bu$Euuuuu P}tMapËUVucvYovQov IovAov9ov1o6*ov "ov$ov(ov, ov0ov4nvnv8nvWW6 Ej[+PD=P6J ;݃ @D$2M0 @D$M ʀ}u!Etȃ @D M#;u~EtxujuEjPuE%Pu ;u4P|ȃ @D 6TY6 @EVSSSSSs{jhx谖3}3u;;u{j^0{Y39};t9}tE%@tʉ}uuu uEP]EEE;tq3u9}t(9}t @D 6YËUjuuuuu !]ËUSuMQ39]u8]tE`p3E9Xu&uu u= 8]Map9]u&zoz8]tE`pfW} ;u&zAz8]tE`p7VM MEDMte9]uD]fU:u]Tf EfMf;pr f;pwfp1f;pr+f;pw%fpU At ʉMfuGDMtG9]u]XM:tf GMf;Hr f;HwfH1f;Hr+f;Hw%fHU At ʉMfMf;u!f;t 9]8]tE`p3^_[H8]tMapUjuu u]ËU}u3WuMO}u'uu u }MapS]u#x\x8]tE`p_Vu u$x1x}tE`p2 MCD8t=}u 3D8tY}tE`p3^[_Êu3 f CFD:t }u3Mtf Ff;uft}pH}tMap닋Ujuu u]USVWUjjh)u([]_^[]ËL$At2D$H3FUhP(RP$R]D$T$SVWD$UPjh)d53PD$dD$(Xp t:|$,t;t$,v-4v L$ H |uhDID_뷋L$d _^[3d y)uQ R 9QuSQ SQL$ KCk UQPXY]Y[ËUEVWxY;8sQ<@<u5=pS] utHtHuSjSjSj3[v v _^]ËUMS3VW;|[; 8sS<@D0t6<0t0=pu+tItIuSjSjSj 3u u_^[]ËUEumu Ru ]Åx;8rIu .u tՋ @Dt͋]j h蝏}4@E39^u5j Y]9^uhF PPu]FE09]t@D8 P@E^3ۋ}j YËUEȃ @D PD]jh׎M3}j cYuaj Y}}؃@;4@u@;Fu[~u8j Y3C]~uhF PPu]Fe(}u^ S@FtSD@냋}؋uj YÃ}uF+4@u}uyG,j@j YYEta @8 ;s@@ `@E}σ@DWYuME E虍j YfQSuƒt7$ffAfA fA0fA@fAPfA`fApHuЅt7tIfIHut3tIJutAHu[XËۃ+3RӃtAJutIKuZUUQ=u7ujMQjMQPtfEQL$+#ȋ%;r Y$-jh ]uVq x;8r7q pڋ<@DtSYeDt1SYPu Ee}tpMp ME E荋Ë]S4YQL$+ȃ YQL$+ȃ YU83ʼnEEM MH SفMȋHMH?WMEu'339\u @|33}jXeVu}䥥=OGW]ԉEyJBtj3Y+@MЅE؃҅T|u@|nǙjY#yOGe+3BL9}99}r"9Ut+eLz};rsEHUMyщM܋MЃjY!E@;} |+3}tC+ ;} 3}𫫫 ; +Eԍuȍ}𥙃¥yJBeeE )U׋]\3#ωMԋM u؉3uE}u|ӋjMZ+;|1tdJy5NFVEyJBjY+3B\Mԅ҅T|u@|fƙjY#yNFe3+BL1<;r;sE9MtLr3;rs3G1HyދMԃ!E@} jY|+3 AQyJBeeE )U׋]\3#ωMԋM u؉3uE}u|ӋjMZ+;|1tdJyj3XS ;3}𫫫M‹yJBeeE )U׋]\3#ωMԋM u؉3uE}u|ӋjMZ+;|1tdJy$3@$e‹yJBeeE )U֋M|#ΉMԋM }؉|}ԋME}}|ЋjMZ+;|1tdJy3^jY+ MɁ ً  ]@u M̋UY uM̉M_3[o:ËU83ʼnEEM MH SفMȋHMH?WMEu'339\u @|33}jXeVu}䥥=0OGW]ԉEyJBtj3Y+@MЅE؃҅T|u@|nǙjY#yOGe+3BL9}99}r"9Ut+eLz};rsEHUMyщM܋MЃjY!E@;} |+3}tC,+ 0;} 3}𫫫 ; +Eԍuȍ}𥙃¥yJBeeE )U׋]\3#ωMԋM u؉3uE}u|ӋjMZ+;|1tdJy50NFVEyJBjY+3B\Mԅ҅T|u@|fƙjY#yNFe3+BL1<;r;sE9MtLr3;rs3G1HyދMԃ!E@} jY|+3 4AQyJBeeE )U׋]\3#ωMԋM u؉3uE}u|ӋjMZ+;|1tdJyj3XS 4;(3}𫫫M‹yJBeeE )U׋]\3#ωMԋM u؉3uE}u|ӋjMZ+;|1tdJy<(3@<e‹yJBeeE )U֋M|#ΉMԋM }؉|}ԋME}}|ЋjMZ+;|1tdJy3^jY+ 4MɁ ً 8 ]@u M̋UY uM̉M_3[5ËUVu M]OdMGdu, M܋  9M}Mk W\DE}EuwdSUY]}؃}tjYSUYt tuEԉG`uEЉGd3qËUE]ËUE]ËUQSV5W5(5$؉]֋;+GruS="؍GY;sH;s;rPu׸YYuC;r>PuYYt/P48(u=8׉Vף$E3_^[ËVjj -YYV8($ujX^Ã&3^j h@)peuYEE EEpΧËUuYH]ËU$3ʼnEESEE VWE{e=Eu}h؅=hSׅ58PhSPhSPhpSP֣thXSP֣M5;tG9 t?P5֋؅t,t(ׅtMQj MQjPӅtEu M 3;Et)Pօt"ЉEt;EtPօtuЉE5օtuuuu3M_^3[2#ËUVuWt} uSj^0ZS_^]ËMu3f݋f:tOut+f ftOu3ufdSj"Y몋UUS]VWuu9U u3_^[]Åt} u)Sj^0R݅u3fЋMu3fԋƒu+fft'Ou"+ fftOtKuu3fy3uM jPfDJXdfRj"YjUEffu+EH]ËUVuWt} uYRj^0Q_^]ËEufߋ+f ftOu3ufRj"Y뼋UMx~ ul]ál l]QQ]3ËUEMSVW3xE3ۉxECx t E XEtEHEtEHEtEHEtEHEu E3H1HE3H1HE3H1HE3H1HE3H#1HtMI tMI tMI tMI  tE X  #t5=t"=t ;u)E!EE E #t =t ;u"E E EEM31E X 9} E}t&` EEXE X`E``EXP4H H EEXE X`EH`H`EXPcEPSjuMAt&At&At&At&Yt&ߋ3+út/HtHt Hu( % % !+tHtHu!#  # 9] tAPAP_^[]ËUjuuuuu u]ËUESV3ۋCut]tSYtEtjyYxEjWEY #tT=t7=t;ubM {LHM {,2M zM zE3tW} DEPQQ$M] } E S]Au3ҋEfE;}"+]tum]tMmHutE]E_tjYeuEtE t j Y3^[ËU}t~}L"]L!]ËUE tjt3@]ètjtjX]]ËU 3 ;M td@|3Et^EEEEEEEVuEE EE$hu(uEEPS uV,YE^Ëhu(uE ËU=u(uE \$\$E $uj/$]Khu!\E YY]ËSQQUkl$3ʼnEs CPs u#ePCPCPs C sPEPjso=u+t's C\$\$C$s Pq$P$s CYYM32][ËUQQE]EËUQQEEM] fEEËU3ҁ} u 9Uu3@]Á} u 9UujX]fMVf#^f;ujf;uE u9Utj3]ËUEDz3E3ɩukE u9Mt]]Au3@3e EtM eJEtVf!u^;t f EEQQQ$ &QEQQ$U E]ËUQ}EËUQ}EËUQ}E M#M f#Ef E m EËUQQMt -]t-]t -]t ؛ t]jh`Wc39d.tVE@tH9(t@EU.E=t =t33@Ëe%(eUEeU7cËUEu:HGjX]Ë 43]ËUEu HGjX]Ë 83]ËUEuGGjX]Ë 03]ø4ø8ø0øj,hFb3ۉ]ȉ]ԉ]]܉]؉]j艹Y]EEPY;EPY;EP.Y;Ẻ==hVYu;tt8tp;t!PV$YYA;tP+YV4G@P YY;VVGY@P5t ;SSSSSE;t P*Yh;3A k-uEFV=YiE<+t<0|<9F3ۋujMYÀ>:u8FVYk<E<9F<0}>:uFVYE<9F<0}9]t]E;tjVj@wоt Gu0u0_ËU e} SVW}%yH@Eu jd[ult  E +_jd_FjEÙU}[+ЉUGEim%Ek+E;Ut}}u jd[ult E  E ;~D?%yH@u jd[ult 44uk<M k<M$iM(}u5 =_^[ÍEP5 YuDEiy\& \&9| )=3PPPPPA̋U VE3Pu@Y9uXWS3C;u ;95 PPPf95uVPPRS PVVRVScZ T$PXPVPf95LuPVPRPwSRPVVwVNV$TjXjYE ]k}jXE EVVVVVQRSSjYEVVVVVuwSVjYH W;};|";;~;}[^;|;;~;}3Gk<Gk<i;u 3; 3;VVVVV(@jhe[395u*j貲Yu95u Eq[j話Yj h[jmYe}EE E0[jhYSW3D$ }GT$ ڃD$T$ D$ }T$ڃD$T$ uL$D$3D$ 3OyNS؋L$T$D$ ud$d$r;T$wr;D$ v+D$T$+D$ T$Oy؃_[UMtj3X;E sk? 3]M VuF3wVj5 u2=<tV=YuҋEt 3 Mt ^]ËUM S3;vj3X;Es> 3AMVW9]t u YVu%YYt;s+VjS8w _^[]ËUuM:E MUTu}tMA#E3t3@}tMapËUjjuj]jYËU}SVWuM]u'==}tE`pu tҿ9}v!=c=}tE`p]ExuuVSW }tAMap8+3MQPTMQPEFMtt;t+3_^[ËU39 u09Eu)=<]9E t}w] Puu u]ËUSVW3jSSu]]\E#ƒUtYjSSu@#ʃtAu }+;Sj PEum< b<_^[huYYE| ;rPuu=u t6+xӅuϋuuuYYuj P3;8u ; u;q|;skSuu uE#ƒDu7YPHE#‰Uu); ;u#uSuuuڤ#ƒ3US] Vu@ ΊA$Wy@tPtBt&tu=I L1$⁀'I L1$₀a I L1$!_^[u]%@]ËUEum::jX]Ë 3]3PPjPjh@hát tPËUSVu M];sTM胹~EPjSveM Xt}tE`pE胸~1]}EPE%P襁YYtEjE]EYd9*3Ɉ]EAEjpUjRQMQVpEP$oEt M }tMap^[ËU= uEHw ]juYY]ËU(3ʼnESVuWu} MiEP3SSSSWEPEP+EEVP1(Eu+u8]tE`pjX/u8]tE`pjEuEu8]tE`p3M_^3[ËU(3ʼnESVuWu} MEP3SSSSWEPEP胁EEVP(Eu+u8]tE`pjX/u8]tE`pjEuEu8]tE`p3M_^3[ËUMSY Vu3;uo7j^079E vU;~@9E wC7j"YW~0Dž~ tCj0Y@JMx;5| 0H89t>1uAW@7@PWV3_^[]ËUQM AS%V#WE A %ut;t<($3;u;uEfM PB<U UE  ɁPtM _^fH[ËU03ʼnEES]VEWEPEP"YYEPjj uЋfu܉CEECEPuV$uM_s ^3[3PPPPP4WVU33D$ }GET$ڃD$T$D$ }GT$ڃD$T$ u(L$D$3؋D$d$ȋd$G؋L$T$D$ ud$ȋD$r;T$wr;D$v N+D$T$3+D$T$My؃ʋӋًȋOu؃]^_̀@s sË3Ҁ33ËUEM %#Vut$t jj YYW4j^03Pu t  YY3^]tjYtjh@j72 j諈̋U}u33]uj5 ]ËU= V5 u3cWu95 tSuJ5 t@}t:u3Y'P3Y;v<8=uWuP tu3_^]ËD8UWVSM tMu} AZ I& t' t#:r:w:r:w:u u3:t rً[^_ËUt3ʼnEEU#S]EAV#f}W]EEE?EtC-C u }fu73f9Mf$  CfC0C3@ f;M 3@f;u}t@uhS3PPPPPX13f9Utu 9Uu-h;u"9UuhCjP般 uChCjPk uC3kʋiMCkM 3fMع@`ۉEfUu}My`ۉEETgk MMf9r}ĥEĥMƉE3ɉMMMMH 3UUU##΍4f;f;f;?f;w3uuu3f;uGEu9uu9uu 3fEf;uG@u 9pu90t!uuEMUɉU~UL MEEEVȃe ;r;sE}FtfEmM}EEM}f~;Eu-EMe EE EffMfyBEtEMuUm M HuMu9EtfMf9EwMu4}u+e}uef9MufEGfEEEf;33f9EEEIM3;}M?f;]E3҉UUUUU3##Ё4 ]f;Lf;Cf;5?f;wK3EE9fE }fEEEEEf}Z33f9uH%Ea3f;uFEu9Eu9Eu fEf;uFEu9Eu 9EvE}EEMM~KM؉MDM eʋW ;r;sE}_tfmM}EM}f~7}x+EMe E? EffMfyBEtEM}Um M H}Mu9EtfMf9EwMu4}u+e}uef9MufEFfEEEf;r#33f9EEEIM;fE ufEEEEEfu3feH%eEEUE}ft0)3ff9EfB0$  BBs~j_u?3fEEE]Me ؋E M]Eu؅y2ށ~(E]Mm ؋E N]E؍GZ]EUEu}ĥe}e ʋU ֋4  U ȋE <;r;sF3;rs3BtAEȍ0U;r;sAM ʍ4?uuM0 CM}uEKC<5}MD;9u 0K;]sE;]sCf*؀ˈXDEM_^3[À;0uK;sE;s3ff9U@ʀ P0@3t@tttt t˺#Vt#t;t ;u  ˁt u  ^t 3tSVWt t t t t Njʾ#t;t;t ;u ` @ _#^[tt ;u Ã@ @ËUSVW}f]3tjZttt ttˋ #ƿt$=t=t;u #tuét} M## E ;Em}]3tjZttt ttˋ#t(=t=t ;ututU 395d.}]Eyj^tttttȻ`#t* t@t ;u@#ǃ@t-t @uE#E# ;uPEY]M3҄yjZttttt#t$= t=@t ;u  #σ@tt @u‹3M E t _^[ËUSuMBM3;u8]tE`p39]u&g% %8]tE`p9] tV;v2%$?E9XuuQu u6pQu Quhp EPI ;u8]tE`p8]tMap^[ËUjuu u ]ËUQQSV3W= u;teVVVVjPVVӉE;tTjPYYE;tCVVuPj7VVӅt6EVPYYy9ut uaYu;u3_^[Ãu@YU,3ʼnEESVW}ىE܉U~?I8t@u+}u~*΋I8t@u+u}3|e}u@Et;ujX3C;~;~jEPu`t~-}r}Et؊PtыM܊ :r:v8u뺅~4}r}EtPtM :r:u8uw5jjWuj u֋؉]ԅ~@j3Xr4D;wątPYt Ee}Suuujuօjjuuj u֋؅tx~?j3Xr3D;w蕱ątPpYt 3t1SWuujuօtSWuuu uEWgYugEYe_^[M3ËUuMFu$Uu Muuuu b}tMapËUSuMU3;u8]tE`p39]u&(! 8]tE`p9] tV;v  KEH;uEPRu u?pERu RuhQP ;u 8]tE`p8]tMap^[ËUV5 !WPu u <=ttuً+ ^]Ë+ UQW3υtL9t @9uV@jPwYYuuj tYt+PY7Yu&E^_ËUES3ۉ];uOnV0Wu;tSj=VYY};t@;t<38_E ; u 7 ;u`9] t$9 ttJ9_^[9]jOY ;tމ9 uj4Y ;tÉ5 u;t+}udY;|R9tN46Y9]uEEFEG49u?sjjW5 蟁 ;tUN9];}ߍG;6=?+Pj5 c ;U YM 9] tmujVvYP菀YY;tPVV]YPW轘 uRM+E@#QWuM*WY9]tuEYEsSSSSSuEY3TUS39]u3>VWupVYY;tuVW u SSSSS3_^[]ËUSuME3;u 8]tE`p3pVu9^u:u PYY=D2t@:t: 9M u H9U t @f;u9M u8]tMap8]tE`p3^[ËUju u> ]%̃ $ ÍT$XR<$D$ tQf<$tu=  u,u%|$u "u|$u%t-`= & / Z̃=d.t-U$,$Ã=d.t<$XfftU T$|$l$T$D$t\ЁuT$t1 # fnfs f PYfT$^ʺ #f@YfWfTfvfɁf%=uefL$ fT$ fnfT `Yfs4ffffvf%=t#fL$ f%tYYfL$ f%GfL$ f%+XĺfT$f~fs f~ҁ ¹f YfYYɺHfd$fT$ f@YfWfTfvf%=f~u fs f~?uf@YfWfTfvf%=uUffd$% уtf%=?rf%=?sYXºcf~fs f~ fPYt:f~%=w%rwfD$D$f fD$T$ ԃT$T$$DUD$Ã~(=<VЃW?&=VЃ €WXX0YfY\0YfY\f(0Qf(5pYfYfXfpYXXf%Yfnʁƒ fW?fYT$Yfs-fpDf(=YXfYXffYYfYfXfYYfpYfpYYfnfs-fnfvfXXfTXfWfvf\XfTf_\XXÃN^YYXYXf%=fD$D$^XYYXf%=fD$D$fYfnYfs-fVtfYYYefYYTfpDfYf%@+-p< Ё=r ɀfnfs-fD$D$fd$f?f3%-K$$ƅp u; ƅp2+at@u tF t2t-Yƅpݽ`aAuƅp-Y uS u uu tƅp-Yu t]Xݽ`au-Y tƅp'-Yƅp u-Y-Zٛݽ`aAuݽ`aݽ`ٛu "Zٛt øVtV$$vft^tËUQQEQQ$t YYuLEQQ$EYYDz1EQ @Q]E$蚬EYYDzjX3@3ËUEV339Eu:9UuzzAE9Mu@9Uu;z AEu 3F9E u(9Uu}UwUAEt^X9M uU9UuPEQQ$YUYzu!UAuuE^]U$~$fD$f(ffs4ff( PZf(Zf(%`Zf(5pZfTfVfXf%f(0[f(@_fTf\fYf\XfYf(fXƁ*f Df( [f(f([fYfYfXf( [Yf(-ZfYf(ZfTfXfXfYYfXf(ffY˃f(fXXXfD$D$fD$f( ZfwHt^wlfD$f( PZf(ZfTfVftZúOfZ^f Z4f ZY/s:fW^ɺfL$T$ ԃT$T$$eLD$fT$fD$f~fs f~с t릍d$U$~$fD$f(ffs4ff( Pcf(`cf(cf(%pcf(5cfTfVfXf%f(`hf(PdfTf\fYf\XfYf(fXƁ*f Df( df(f( dfYfYfXf(0dYf(-cfYf(cfTfXfXfYYfXf(@dfYf(ffY˃f(fXfXXXfD$D$fD$f( cfwHt^wlfD$f( Pcf(cfTfVftcúOfc^f c4f cYs:fW^ɺ fL$T$ ԃT$T$$ID$fT$fD$f~fs f~с t릍$U$~<$~|$ff(fTlf/mUf/msnf/mf(fYf(fYf(-PmfYfX-@mfYfX-0mfYfX- mYf(fXY\f|$D$f/mf(fYf(fYf(-mfYfX-mfYfX-lfYfX-lfYfX-lfYfX-lfYfX-lfYfX-lYf(fXY\f|$D$~fWf/msO~m~-`m~Xfs,ff~؍@~,r~\YXxm^f~~pm^f~r~$rf(fYf(fYf(-PmfYfX-@mfYfX-0mfYfX- mYf(fXY\\\fVfD$D$f/hmuD$f/msm m$$D$m mD$~~plfTf.zD$mŐlúT$ ԃT$T$$FD$ÐU$~$fD$ff( nf(5nf(0nf(@nf%@+-< Ё(fYfXf(f\fYf(%PnfYf(-`nf\f~ȃ?f\f(pnfYf(fYfXYXffo5mffo5mffs.fYXfVfX~|wYƒXfD$D$Ã|$fT$ff$,$+fo5mffnfs4fVfnfs4f$$ft$D$f$$$$f$l$fs't)Zr+#rJwT$9r<fD$T$ ԃT$T$$DfD$fD$D$=s1D$=sfrYfrY뉋T$=wuD$=urrúVD$%=@sfD$XprfD$D$ÍISQQUkl$3ʼnECVs HWxtRHtCHt4Ht%HtFHHtHDž|9Dž|"Dž|Dž| Dž|Q~W| uICtt teMF]MWNQP|xPEP肛hx!>YYt=u VzYu6TYM_3^蒹][ËUfUf#f;u-EQQ$|HYYtHt Ht3@]jjX]ø]MfuE u}t]EDz @]%](8DP^lґ 4D`xڒ6NXdv̓ޓ .>P`n|Ȕޔ,<Rdrȕ0ٳEzKg??33x(null)(null)EEE50P( 8PX700WP `h````xpxxxxHH:mm:ssdddd, MMMM dd, yyyyMM/dd/yyPMAMDecemberNovemberOctoberSeptemberAugustJulyJuneAprilMarchFebruaryJanuaryDecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundaySatFriThuWedTueMonSunHH:mm:ssdddd, MMMM dd, yyyyMM/dd/yyPMAMDecemberNovemberOctoberSeptemberAugustJulyJuneAprilMarchFebruaryJanuaryDecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundaySatFriThuWedTueMonSunKERNEL32.DLLFlsFreeFlsSetValueFlsGetValueFlsAlloc  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ccsUTF-8UTF-16LEUNICODECorExitProcessmscoree.dllruntime error TLOSS error SING error DOMAIN error R6033 - Attempt to use MSIL code from this assembly during native code initialization This indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain. R6032 - not enough space for locale information R6031 - Attempt to initialize the CRT more than once. This indicates a bug in your application. R6030 - CRT not initialized R6028 - unable to initialize heap R6027 - not enough space for lowio initialization R6026 - not enough space for stdio initialization R6025 - pure virtual function call R6024 - not enough space for _onexit/atexit table R6019 - unable to open console device R6018 - unexpected heap error R6017 - unexpected multithread lock error R6016 - not enough space for thread data R6010 - abort() has been called R6009 - not enough space for environment R6008 - not enough space for arguments R6002 - floating point support not loaded `  hh8x8p !xyzMicrosoft Visual C++ Runtime Library ...<program name unknown>Runtime Error! Program:  IqI`B `BYnYntancossinmodffloorceilatanexp10acosasinloglog10exppow  EEE00P('8PW700PP (`h`hhhxppwpp ((((( H h(((( H H  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~e+000GetProcessWindowStationGetUserObjectInformationWGetLastActivePopupGetActiveWindowMessageBoxWUSER32.DLL_nextafter_logb_yn_y1_y0frexpfmod_hypot_cabsldexpfabssqrtatan2tanhcoshsinhSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecTZCONOUT$1#QNAN1#INF1#IND1#SNANCHI_SQD_PARSTDEV_DESTDEV_BSTDEV_ASTDEV_LSTDEV_ZSTDEV_YSTDEV_XMEAN_DELAB_DE_2000LAB_DE_CMCLAB_DE_94LAB_DELAB_HLAB_CLAB_BLAB_ALAB_LXYY_CAPYXYY_XXYY_YXYZ_ZXYZ_YXYZ_XSPECTRAL_DECSPECTRAL_PCTSPECTRAL_NMRGB_BRGB_GRGB_RD_MAJOR_FILTERD_VISD_BLUED_GREEND_REDCMYK_KCMYK_YCMYK_MCMYK_CSTRINGSAMPLE_IDTABLE_NAMETABLE_DESCRIPTORCOLORANTTARGET_TYPECOMPUTATIONAL_PARAMETERWEIGHTING_FUNCTIONPOLARIZATIONFILTERMEASUREMENT_GEOMETRYCHISQ_DOFSAMPLE_BACKINGPRINT_CONDITIONSMEASUREMENT_SOURCEINSTRUMENTATIONMATERIALSERIALPROD_DATEMANUFACTUREMANUFACTURERDIFFUSE_GEOMETRYDESCRIPTORCREATEDFILE_DESCRIPTORORIGINATORNUMBER_OF_SETSNUMBER_OF_FIELDSKEYWORDEND_DATA_FORMATEND_DATADATA_FORMAT_IDENTIFIERBEGIN_DATA_FORMATBEGIN_DATA.INCLUDE$INCLUDE2tfmftamtsvctulctsvc2tfmtsvctulctsvc BAmtsvc0B2A BAmtsvcftamtsvc0B2A BAmtsvctulctsvc0B2A BAmtsvctulctsvcftamtsvc0A2B ABmtsvc0A2B ABmtsvcftamtsvc0A2B ABmtsvctulctsvc0A2B ABmtsvcftamtsvctulctsvc??? ? ? ?{Gz?p?p???{Gz?{Gz?{Gz?Y@o@o@``Y@Y@Y@0B2A1B2A2B2A1B2A0B2D1B2D2B2D3B2D0A2B1A2B2A2B1A2B0D2B1D2B2D2B3D2B2??"e??????0$     **** CORRUPTED FORMAT STRING ***%s: Line %d, %s%sInvalid hexadecimal numberInvalid binary number%dUnrecognized character: 0x%xToo many recursion levelsFilename expectedFile path too longrtFile %s not foundExpected separatorTable %d out of sequenceAddToList: out of memoryTable %d is out of sequence%.10gCGATS.17# AllocateDataFormat: Unknown NUMBER_OF_FIELDSAllocateDataFormat: Unable to allocate dataFormat arrayMore than NUMBER_OF_FIELDS fields.AllocateDataSet: Unable to allocate data arrayPatch %d out of range, there are %d patchesSample %d out of range, there are %d samples Write to file error in CGATS parserWrite to memory overflows in CGATS parser # # %c # %s "%s" 0x%X 0x%B "%s,%s"Unknown write mode %dBEGIN_DATA_FORMAT END_DATA_FORMAT BEGIN_DATA """END_DATA wtSample type expectedCount mismatch. NUMBER_OF_FIELDS was %d, found %d Sample data expectedCount mismatch. NUMBER_OF_SETS was %d, found %d Keyword expectedProperty data expectedInvalid value '%s' for property '%s'.Invalid value for property '%s'.expected keyword or identifierUndefined DATA_FORMATLABEL%s %d %sFile '%s' not foundCouldn't add more patches '%s' %255s %d %255sColorSpace mismatchCouldn't link '%d' profilesUnsupported intent '%d'Couldn't create tone curve of more than 65530 entriesCouldn't create tone curve with zero segments and no tableInvalid parametric curve type %dcmsSmoothToneCurve: too many points.Wrong position of PCS. 1..255 expected, %d found.Invalid angleToo many input channels (%d channels, max=%d)Unsupported interpolation (%d->%d channels)Read from memory error. Got %d bytes, block should be of %d bytesToo few data; probably corrupted profileCouldn't read profile from NULL pointerCouldn't allocate %ld bytes for profileUnknown access mode '%c'Read error. Got %d bytes, block should be of %d bytesSeek error; probably corrupted filerbwbCouldn't create '%s'Tag '%x' already existsToo many tags (%d)not an ICC profile, invalid signaturer(Internal) no handler for tag %xCouldn't write type '%s'wCorrupted tag '%s''%s' Inconsistent number of items: expected %d, got %dUnsupported tag '%x'Unsupported type '%s' for tag '%s'Malformed struct in type '%s' for tag '%s'Unexpected direction (%d)Color %d out of range; ignored(internal) Attempt to PatchLUT on non-lut MPE(internal) %d Channels are not supported on PatchLUTUnrecognized pluginplugin needs Little CMS %d, current version is %dUnrecognized plugin type '%X'%02x%%!PS-Adobe-3.0 %% %% %s %% Source: %s %% %s %% Created: %s%%%%BeginResource /BlackPoint [%f %f %f] /WhitePoint [%f %f %f] dup 0.0 lt { pop 0.0 } if dup 1.0 gt { pop 1.0 } if PerceptualRelativeColorimetricAbsoluteColorimetricSaturationUndefined/RenderingIntent (%s) /RangeABC [ 0 1 0 1 0 1] /DecodeABC [ {100 mul 16 add 116 div } bind {255 mul 128 sub 500 div } bind {255 mul 128 sub 200 div } bind ] /MatrixABC [ 1 1 1 1 0 0 0 0 -1] /RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ] /DecodeLMN [ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind { %g exp } bind { [%d ] dup length 1 sub 3 -1 roll mul floor cvi exch ceiling cvi 3 index get 4 -1 roll 3 1 roll sub add 65535 div } bind [ %d [ [ /CIEBasedA << /DecodeA /MatrixA [ 0.9642 1.0000 0.8249 ] /RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ] >> [ /CIEBasedABC << /DecodeABC [ /MatrixABC [ %.6f %.6f %.6f [ /CIEBasedDEF <> [ /CIEBasedDEFG /DecodeDEF [ /Table >> Cannot create transform Profile -> LabOnly 3, 4 channels supported for CSA. This profile has %d channels.Profile is not suitable for CSA. Unsupported colorspace.Named color CSA(colorlistcomment) (%s) (Prefix) [ (Pantone ) (PANTONE ) ] (Suffix) [ ( CV) ( CVC) ( C) ] (%s) [ %.3f %.3f %.3f ] Invalid output color space/MatrixPQR [1 0 0 0 1 0 0 0 1 ] /RangePQR [ -0.5 2 -0.5 2 -0.5 2 ] %% Absolute colorimetric -- encode to relative to maximize LUT usage /TransformPQR [ {0.9642 mul %g div exch pop exch pop exch pop exch pop} bind {1.0000 mul %g div exch pop exch pop exch pop exch pop} bind {0.8249 mul %g div exch pop exch pop exch pop exch pop} bind ] %% Bradford Cone Space /MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] %% VonKries-like transform in Bradford Cone Space /TransformPQR [ {exch pop exch 3 get mul exch pop exch 3 get div} bind {exch pop exch 4 get mul exch pop exch 4 get div} bind {exch pop exch 5 get mul exch pop exch 5 get div} bind ] %% VonKries-like transform in Bradford Cone Space plus BPC /TransformPQR [ {4 index 3 get div 2 index 3 get mul 2 index 3 get 2 index 3 get sub mul 2 index 3 get 4 index 3 get 3 index 3 get sub mul sub 3 index 3 get 3 index 3 get exch sub div exch pop exch pop exch pop exch pop } bind {4 index 4 get div 2 index 4 get mul 2 index 4 get 2 index 4 get sub mul 2 index 4 get 4 index 4 get 3 index 4 get sub mul sub 3 index 4 get 3 index 4 get exch sub div exch pop exch pop exch pop exch pop } bind {4 index 5 get div 2 index 5 get mul 2 index 5 get 2 index 5 get sub mul 2 index 5 get 4 index 5 get 3 index 5 get sub mul sub 3 index 5 get 3 index 5 get exch sub div exch pop exch pop exch pop exch pop } bind ] /RangeLMN [ -0.635 2.0 0 2 -0.635 2.0 ] /EncodeLMN [ { 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind { 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind { 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind /MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ] /EncodeABC [ { 116 mul 16 sub 100 div } bind { 500 mul 128 add 256 div } bind { 200 mul 128 add 256 div } bind Cannot create transform Lab -> Profile in CRD creation/ColorRenderingType 1 /RenderTable %d {} bind /Current exch /ColorRendering defineresource pop %.3fNamed profile(colorlistcomment) (%s) (%s) [ %s ] >> /Current exch /HPSpotTable defineresource pop Color Rendering Dictionary (CRD)%%%%EndResource %% CRD End spherical value out of range quadrant out of rangeUnknown parametric curve type '%d'Multisegment or Inverted parametric curves cannot be writtenUnsupported parametric curvemultiLocalizedUnicodeType of len != 12 is not supported.LUT8 needs 256 entries on prelinearizationLUT is not suitable to be saved as LUT8LUT is not suitable to be saved as LUT16Unknown precision of '%d'Unknown curve type '%s'Cannot save floating point data, CLUT are 8 or 16 bit onlyLUT is not suitable to be saved as LutAToBLUT is not suitable to be saved as LutBToAToo many colorants '%d'Too many named colors '%d'Too many device coordinates '%d'PSnm#0#1#2#3Unknown curve element type '%s' found.Unknown MPE type '%s' found.Found unknown MPE type '%s'Unsupported number of channels for VCGT '%d'Unsupported bit depth for VCGT '%d'Unsupported tag type for VCGT '%d'Unknown record length in dictionary '%d'USenNo copyright, use freelyLittle CMSRGB built-ingray built-inLinearization built-inLinearization built-inInkLimiting: Only CMYK currently supportedInkLimiting: Limit should be between 0..400ink-limiting built-inink-limiting built-inLab identity built-inXYZ identity built-insRGB built-inBCHS built-inNULL profile built-inNamed color devicelinkdevicelinkcmsWhitePointFromTemp: invalid tempUnsupported raster formatNULL input profiles on transformWrong input color space on transformWrong output color space on transformCouldn't link the profilesWrong number of profiles. 1..255 expected, %d found.cmsChangeBuffersFormat works only on transforms created originally with at least 16 bits of precision.A?@?@@f@v@0@-DT! @@?p@@>p?$@@cܥL@_@`Y@_@Y@`@z@ffffff@" p?{a?a{?UUUUUU?_B{ %@|T#??o@-C6?>MbP??OMbP?8Bty>?Iطq:Vwdu?=Զa?$[]N?j@+0d?rQ?\ѿ6`|?'gVD`u?Wӽx?ifF@ޚ?ByC濠ܾޑ0_I?6#\^n0 0 @y@zG!;@?و%@"??G5?0hyR?UnF?s_鳒?-d! Y- @/MҴ?Mozӛ??ffffff@Q?rq?\(\?= ףp=?(\?NN @ffffff@\Fߑ????r@i@)\m@d@ffffff??333333?Gz^@p= #4@SܥL@p@V@"@&@(@4@yzG?%kn'?P3u?$9C?͵?8?C>?d]Fx?~jth?_Qڋ?HPx?)\(?2%DioĿt$~?HPs?rq?W@E@?@333333?Gz??(\@SW?5l?"uq @Y8m?j@kt=?E_?@@!rhm@eA( @X@@@0q@I@Q?O@{Gz?Q?(\?>@ ףp= ?ff@9@@333333#@LK@&{?fffff:@]@؀q@Mb`?{Gzt?@@A>@xD l@`@s@F@@Affffff?zG??= ףp=?Gz??@'1Z?Ps?B>٬?"~j?<,Ԋ?|a2U? ףp= ??A@Q?e@u@d@vAE?q@'1Z?K7A?d@p= ף?@s@!rh?a@Mb?Y@J +?\@Q??@{Gz?a@)\(?o@X@y&1?<,Ԛm?Q?~jt?y&1?b=y?K7 g?'†Wʢ?"~j?ı.nTĿ镲 ?T?@p@{Gz???@0?{Gz?333333@xdx?ܵ?I!rг?JQ/#?` T?333333@@h@Q?333333?333333?333333?Q?{Gz??@vӂg?M]sl?yCnk???330C5h!??  ?5h!>@@?1mm.s,)?'>?i i1mm.s?,)'><i? i<ȿmb<Z" ?.ҿu<ϕk|?c}ؿ,g<ysh:?;8]+޿ ^ty[g?h9; %S ? %L jh2yʿ;f 4݋<Xw$3Ak ł<࿇暳s)f09N,J?8v<uZEeu?F2k Wt-v1-VA`пgY?\ϗb buпP/Ye?&%ѣ@}<P/Ye&%ѣ@}<?gY\ϗb bu?-v1?-VA`?uZEeuF2k Wt?N,J8v<?暳s?)f09?Xw$3?Ak ł<?2y?;f 4݋<?S Ϳ %L jh?ty[gſh9; %?ysh:;8]+޿ ^?ϕk|c}ؿ,g<?Z" .ҿu<?i i<ȿmb<?1mm.s,)'><?UUUUUUſ?UUUUUU?*llV4V>>m0_$@8C`a=`a=@T!?sp.c;`C?i i1mm.s?,)'><i? i<ȿmb<Z" ?.ҿu<ϕk|?c}ؿ,g<ysh:?;8]+޿ ^ty[g?h9; %S ? %L jh2yʿ;f 4݋<Xw$3Ak ł<࿇暳s)f09N,J?8v<uZEeu?F2k Wt-v1-VA`пgY?\ϗb buпP/Ye?&%ѣ@}<P/Ye&%ѣ@}<?gY\ϗb bu?-v1?-VA`?uZEeuF2k Wt?N,J8v<?暳s?)f09?Xw$3?Ak ł<?2y?;f 4݋<?S Ϳ %L jh?ty[gſh9; %?ysh:;8]+޿ ^?ϕk|c}ؿ,g<?Z" .ҿu<?i i<ȿmb<?1mm.s,)'><?UUUUUUſ?UUUUUU?*llV4V>>m0_$@8C`a=`a=@T!?sp.c;`CŠ#4<Xq?BJ=_D?mKF=Ԛ?s7E=@[-?K>d:=g?Z}=\uI=s~Q?g:"(N='?9~$O1=q?n1%=p)k?vʌ=`X:?q.W =Pi?g>M=[?ֲa M=_3?֍,uXO=`Ɏ/?1w<=>'eH?` JJ=x~? Š&=n`Y?˖C=0?]/=# g?uP= ?,lC=5q?ᕎ =@Dӳ?-[@=pt4z? فpnJ=l?i.Eg<y~??O^'=(Tt? x;;=P?RRF=&?XɣN=J@?~=Ht=c?AzU"=nB?U_lj7=]?qBD= h0"ؿ؍ IQn0ؿHn&E:׿E7D57A׿ %@@ֿ*Z+ASTֿrJD@ӑտNT?w3kտr19]ԿFKm8C!`Կ1y2Y@ Կ*(FEO5iѿ4Q!?: пC +pڌXпxO,C"пAri<q~_ϿR v== ~οo6@mPͿ d+>̿9Ȓ[\˿8B'&˿i[JZOʿbnEDE}ɿUgc@H ȿUZdL" ǿ=Dj!ǿVm:A@`3ƿ~%3kcſ"7M Ŀp>)%ÿ\Bjx¿#6HˆQ;`t-¿=]PH0;TaָE&a-#KV\ Vb4M@U@Xx55@캿D=iI^Gי'7AԷUNҪ1GƴO\C@+Bg:IB@Zu}M:(T!1n]vQ<)8h׾o$|f+x2S74U".mœFB*6IKS_ D 5M-Cz1}BKG c?OfFL,sX4I+xm w$VcE?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@??????????????????????@????@?? ? ?@ ? ? ? ?@ ? ? ? ?@ ? ? ? ?@ ? ? ? ?@ ? ???@????@????@????@????@????@????@????@????@??|)P!?Ua0 !=+34?2Q =`??7; WJ=`7E?'a%C=MkK?*b<=0ɘP?*,z?=d|S?KT'K=R_V?bF=p^BY?E&= 9&\?߇N9=p _?߭Eb2]A=`?f#I=hb?O2H`3=c?e2a1=ԆLe?2RM=f?A3_:=@0h?[2ieO=i?1rK=k?Σ-=l?̈[8=yQm?>|W8A=՛ko?>qݲN=np?z m{ M=t)(q?m,SD=E`q?}e?=ԩr?}~:fE=PSs?&A=& t?,&8=tt?eѴN@=PSu?^p?o40=!9v?W?N=<v?+#GYM=Hw?qC@=Pex?0 &ے=Xy?8=<8y?!({=H= z?d,GB=6K{?ҝE M=¾|?w31!=L|?^X-F=Dfqsg~7(7s6uE(ruv.E,t]rLvOrȚ p&qC"5FzIqoOjpO|Wp Ȯ/N#D5pO/3N^o I!` 1nDCE"Bnu ^!EWΉm--0lNpCP&`l™J$akN8xj[ -=8Riy~ La8i[٬zF+ghk<@8KHg}7ڒ%gmg1&3{4WfI8e}OA8ӌd_\MP4.dó6D@uc2I{bTWB`b.r}X]La6MŞr<P`;ƥIpη_v<-UF^9M\̢N3e[ݻk>? #JY&-DPZXm4I@@7eWO/jUIlNAi0TWq uIbR|m:K@VNQ?|G¾d0`7O84 fXLzB7CIp4"%H`/G: WI`ȃ1D/!H@%OAA9"Ix'8RؔN;*2]@G?E?@D?C?A?@?>?@=?;?@:?8?7?6?4?3?1?@0?.?@-?+?*?)?'?&?$?@#?!?@ ???????@??@???? ? ? ?@ ??@???????@??@?????@??@??@?????@??@???????@??@???????@??@???????@??@???????@??@?????@??@??@?????@??@????????@????@????@???@????@???@????@???????@????@???@????@???????@??~?~?@}?|?|?@{?z?y?y?@x?w?v?@v?u?t?t?@s?r?q?q?@p?o?o?@n?m?l?l?@k?j?j?@i?h?g?g?@f?e?d?d?c?b?b?@a?`?_?_?@^?]?]?@\?[?Z?Z?@Y?X?W?W?V?U?U?@T?S?R?R?@Q?P?P?@O?N?M?M?@L?K?J?@J?I?H?H?@G?>Y"G=>.ܶlWE=>jۋbH=>^IL#=>(i&I=h>gݟP'E=p>*)D=>&N=x>.;ĝ@=H >Qyu3= >c-=@>Rݡ:==> {M= @>C=` >bߔB= >tdC=$ >9O=>B NC=>j&==>.<=@>`lrG=>!ls1= ?8= @? mN=&?UtQ$=X?PiB{^C=?Gv72=@?qlm+=?!.j7/=d?L C=`?m +=P ?5Od% =?r<(?*Hga2=@ ?CI=r ?sA=* ?GTiA= ` ?KՋD=r" ?Dp`q=L$ ?~G=4& ? D='@?E=)?'P<+?f4±cC=@?qWn{;=?gC i8=?XKD=P?G;R"=7?8΁3,'1D=B'@?:+NB=(?1z@J=*?3=+`?wU4?=,?DO=;.?$b=/p?g)([|X>=H1?>gV=20?OBO=*4?bPA<5?e4=f7@?|[{~*L=9?ٹE=t:?G]C='"?@(6F=? #?'A=@H#?43 A=Ax#?uN}*J=C#?)r7Yr7=]D#?.K="=rE$?r =F0$?3=1Z1=H`$?h|=G=gI$?ܩN:=J$?4e 6=K$?{<9==M%?uYPwH=NH%?-*8=Px%?yF.=-Q%?\9 ;,=R%?29Zd@=T&?~YK| =sU0&?WĻ(J=VX&?RIG=X&?W N=Y&?g'9=[&? D"^=2)$7bmLMӿ( ԏS4_ >L|/ dM4g±82qڜ1ןqaPCQo%;9?_0Cw4g%6L&M;k@ڿ81ABۏ1uB)_ Y/󓎣,:x.Ճ^-?ޯԝI-:]=O>O#w_jُBn(+E -V~|_B}_ACK!ܨY:_5Gt/C$>#Hm- MVn@QU^tA$OÄþiM@K8|;2@(AV64oꬠTC9?&u.~Fs:4Կ J_L II=@0(ן$.G?}3Rʏ3 !|.4*ڟ ඄}3? G"jm >; *O 0 :O 2K;޿ Q`4_  ZD 69* F_ T3ʢK M.֢> @_@? 1\hUXpM&Jx3Ҭx/h 78Lv]EV 3Bv9r_cM*5&Lq3?:R$@܎$=K'\?Ъ{b>$EvCIw8R'FG_j,)+jBD|_ `kA%'r BL TE_GO#i# ;^طH?6(`JJ\HB5``.11\?QDTӾ96оk< xE˾CqTR;ǾdG GgL@_h %? SS@b?Wdy>c*GPAiFC.ֿ?53=?͸)a,?][SqnC?nwtӰY?eus<)kp?&<ߑțuE?Ka<>?5a1xH<lX? aJ.?#Eq<1 ?1j<1Lp!?|眊<dD8`<;f?Ud4ݛ u? gVr/eT'?*mb|L%?2L#FG?AֈDh?ԛƟfNJ?:|”<۠*B?&KVU?An/X0y?c~˛m?Lyc>=*p%??C;0=|?Ix"<=`` ә?yM==orO?+C==v?R1=PQ ?Ӏb=@P?5M[g?=V?d+[7=?nB>= kz*?w#8=0nط?C#7={?D i00=ˮf?j -=x)?}z= ? 0$=HV?o=X a?;M_8=@? 5=?^@'=L$?/r(==ɥ%?Nl,"=@\r??t8=85R?ӇӜ=L. ? >)g=Ը3U?Ӱ== ?hXg+=og?X=ذ0?{fHn=<w?y5s3R6=)?a8< O4W?4bV0=L?4@=@?Xۓ4=Tk?>_(=?*o=@[c?,=$4b?dO"=lx?#608=ě&m*?ɉh"0=בl?n6ѯ{<9[P?cezb<$?F 8"=8B.?0gǓW.=??BBxPD?X1=??0C0CΗ5@=)d U5j%5j?~@5wzA.lzZ? |?Q-8>=޶W?0 k8=ޮp? x9=>.ښ?pn5=Yح? Q*=c??b6=Y?T?=>?W!=@-32?Dz=p(?vP(=`?US?>=e?g7=`ŀ'?bͬ/=^s?}#=Jwk?zn=N ָ?LN9=@$"3?5Wg4p6=T?Nv$^)=&?.)<lB?M%=`j?w*= <śm?E2=ެ> ?E=t?? =OQ?w(@ <0?Ac 0=Pyp?dry?=St)?4K >=$?QhBC .=0 ub?-0=?a>-?=?Й,<(lX ?T@b ==P?3h,%=f??# =V ?ߠϡ6=Y?z $=G? $l35=@n?[+3=Rŷ?sdLi==p|?rx"#2=@.?|U2=lԝ?rF=a? 4=Y?sl׼#{ =`~R=?.i1=,? =vX?=p?h}s"= E[ ?%S#[k=7H?j=!V1?}a2=jq?20J5=?5=x¾/@?"B <1=iz?\-!y!=X0z?~b>==:? #.X'=HBO&?(~=xbb? .=Cq?y7i9+= v?:=0 ?2ض8=xPD?X1=??Q?Q?????????]?]?P?P? ? ?U?U?(?(?`?`?_?_?????z?z?1?1?p?p???(e?(e?@#?@#???`?`?hk?hk?,?,?x?x?????N?N?x?x?p?p???~?~?HN?HN???????p?p?Xi?Xi???????????8?8?s?s?pI?pI?&?&?????o?o? *? *???`?`?Z?Z???0?0???PY?PY???`?`???pm?pm?/?/?????-DT!?-DT!RUUUUU?vF$I?ɿ3YE?#Yqn?; 9/I?hKd?81UH!G?#$0|f?KRVnTUUUU?~I$I?gɿHB;E?q{雮?x֚? @ @??@>1|MC8C8C0<0<+eGW@+eGW@B.?B.?:;=:;=ѱt?ZfUUU?&WU?{?Mu{<`w>,g5RҌ<2ؼcnQU Zsni?տ?2n{a>?? M=?H{? {4r>?Pא?"">?u[?* >??G0_(>?4wb?i^^?(>?0?p3>?@?FM>?8M?BV>?d?}Ba.>?ȴ ?d>?g?ߊ>?@?f\*>?~e?-f>?]%?D G?>? ?\>>?X?1 #>?E?h>???ⳇ>??$ 49>?x8?k0H<>??rش8>?8fm?"m>">?ħ?[?k?"%>??݉@fR8>??T:>?T!?3&F >??<[#>?%?Y:/(A6>??N2>?8O?r!' >?r?8{K>?p?9l9$>? G?aj i9>?T|?'\|#<>?$?}dj#>?Wn?׈MVx:>?,?18o,>?D$? c/ >?@ |?x7|1>?|?9>?p #?IAu=>? s?xٴ4>?p?edf&.>?,?fA>?h*?v2>?$gN?RE\K>?q?'^IE>?DΒ?&aH>?L?&KrQF>?,?#/'>?إ?]Xc?>??Ԯ}>?e.?IdWA>?K?ΐ?>?Xg?4*A>?_?[džJ>??10H>??hc#]G>@,*?Qx F>@@p?ekR.N>@?Ӿn@>@b?O>@$Q/?CJO>@@E?G>@[?3E{A>@Tp?SfIS:>@X΅?B6)1<>@@3?>ځ7>@$?s(N>@@?V 6f=>@(?{>@@(W?-Jg >@?"aPK>@xm ?,Sڤ6>@?6hb">@@-?k,<>@X>?0=>@O?׀IXH>@-_? @>@@n?2E>@P~?=ő8>@lj?[j&,>@L7?x82>@@?c#VB>@0?7ڨ.Y>@P?[p&>@ؔ?h4MA>@@?EplE>@+?o$E>@h?\*K>@?-?B>@@P8?(l|@>@p!?u@J>@@p-?V1> @89?5>@ @ @h)P?R`DOG> @T[?9%K> @Mf?/<>@ @q?Ò?> @{?42G<> @L?Â|/> @Y?s @>@ @k?Òa@> @XS?x(3u8> @?vO,ib> @ȥ?&L͒C>@ @?}L> @X?Lo> @x?-Ϡ9> @s?6FID?9>@ @8J?gsL> @d?y> @?>&09C>@? @@(J?IV C>@`w?^@N>@?#%@>@s?MK>@@D'?ήQ->@.?9 !G>@6?.1>@>?.1NcB> @cE?sǔ1>@@LL?nHN>`@HS?W$>@8Z? Ȃq;>@a?N/[7>@(h?=mC>@0oo?H75M>@Hv?P.#> @|?G7>@@*?#42I>`@?ooJ>@?-#>@?h% F>@@?Rx^D>@PP?s@>@4L?P_! #> @4?:#G>@@L?qg:&J>`@Hɹ?5L$.4>@\w? !1C>@? [<>@D?<=@? ~=@y?B> @?~.4>@@h?u|8>`@E?A8yL;>@h?41C>@{?-+oF>@$?xO>@s?՝mT2>@W?=> @-?î\=>@@?\==`@ ?j\&">@X? 1D>>@?#O#`I>@?}0>@?F\IE>@t{#?ׯ,B> @0'?E ]$>@@,>,?ކ?5>`@0?iIqE>@4?ha;>@9?AD>@.=?̤KFw=@DMA?=@`E?apI0H> @gI?:->@@cM?%Q>`@@UQ?Ly5ښoE>@;U?vg0/>@Y?jv UG>@\?yK>@,`?A%My>@md?H> @ h?pM>@@0k?k}<>`@ho?f7O>@r?}O>@v?+ iI>@@z?bB'=>>@`}?ZM>@?1M> @a?R~=@@t?QNT B>`@x?W3cL>@ g?+(=@D?qJK>@L?;,*>@8!?D>@,O? E> @Du?in]D>@@?%3F>`@P?^F"VM>@?}30}->@@?~F y;>@?l R(>@躰?\7`>@?dg;> @?;Sv@E>@@<|?M>`@Y?|};2>@,0?@$?̯/p">@?\(0>@|?[s$F>@I?dӔV> @T?0)LK>@@h?)5G5>`@XY?|zJ>@@?W޾L?>@0?6:>@<3?QB>@x?7o/M>@Q?KcZ0> @?z-A5>@@Z?"BDcI>`@?`I.>@ L?Ld%>@ ?"l"w =@(??!>@?j^J>@8?ϞH0> @LL?%C>@@T?J+N>`@d?;l>0>@B?^{v@>@Ȋ?@Y˕B>@@?Tl0>@ ?w4n4>@G?oN=;> @h|?L{/>@@< ?Bnu5>`@ ?`,+>@d? 5>@$?l >@C?~+^M>@^?PKQD>@,u?^{#tF> @|?^4K >@@?4O >>`@?XEړ J>@?(gԹ,>@ ?43-spF>@"?P`E5+*>@$?=Q QD> @-DT!?\3&P`n|Ȕޔ,<Rdrȕ0GetLastErrorHeapFreeHeapAllocHeapReAllocDeleteFileAyGetSystemTimeAsFileTimeGetCurrentThreadIdDecodePointerGetCommandLineATerminateProcessGetCurrentProcessUnhandledExceptionFilterSetUnhandledExceptionFilterIsDebuggerPresentEncodePointerIsProcessorFeaturePresentEnterCriticalSection9LeaveCriticalSectionoSetHandleCountdGetStdHandleInitializeCriticalSectionAndSpinCountGetFileTypecGetStartupInfoWDeleteCriticalSectionrGetCPInfoInterlockedIncrementInterlockedDecrementhGetACP7GetOEMCP IsValidCodePageTlsAllocTlsGetValueTlsSetValueTlsFreeGetModuleHandleWsSetLastErrorEGetProcAddressRtlUnwindgMultiByteToWideCharReadFile%WriteFileWideCharToMultiByteGetConsoleCPGetConsoleMode-LCMapStringWRCloseHandleHeapCreateHeapDestroyExitProcessGetModuleFileNameWfSetFilePointerSleepGetModuleFileNameAaFreeEnvironmentStringsWGetEnvironmentStringsWQueryPerformanceCounterGetTickCountGetCurrentProcessIdiGetStringTypeWCreateFileASetStdHandle$WriteConsoleWWFlushFileBuffers?LoadLibraryWRaiseExceptionGetTimeZoneInformationSSetEndOfFileJGetProcessHeapCreateFileWHeapSizedCompareStringWVSetEnvironmentVariableAKERNEL32.dllNNr11L Щ@`gXpg0gp `p@g`g` @PPФgP @`p@@0`0"(#ut sr t`Pp`p p` S`QiH GLJpMLPNMI0Hml`T`SonGDpn n0O`NPOYY@ap@p** + *++a"(vPЌА`"(uPv @@aPpP'p`Pcpo+Pp/L`GGH+JPJI0IK220FE9@:0J0K4`IIP111`200/L ``pv 0@` `! `+`%$@0@ ` p  `@ pzxp ``0`0i@Pi `P[VY0@ed|Ң "8LWpkyɣ٣ F^pդ6DUan}Υ !7L_t¦Ϧݦ1Qbqħۧ )JezӨ-Nrȩ5I`sʪ ';HXep|ū0DZnì $3DRctҭ%AV`tϮ!4Rʯ߯ "3G^qа!5I`u̱۱ !3<UjIJϲ *5DYgvճ!8Rqմ&8Miy͵2ISalŶٶ(:Ri{ط ,?RiԸ &<I`x¹ڹ +6JXf  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0LCMS2.DLL_cms15Fixed16toDouble_cms8Fixed8toDouble_cmsAdjustEndianess16_cmsAdjustEndianess32_cmsAdjustEndianess64_cmsCalloc_cmsDecodeDateTimeNumber_cmsDefaultICCintents_cmsDoubleTo15Fixed16_cmsDoubleTo8Fixed8_cmsDupMem_cmsEncodeDateTimeNumber_cmsFree_cmsICCcolorSpace_cmsIOPrintf_cmsLCMScolorSpace_cmsMAT3eval_cmsMAT3identity_cmsMAT3inverse_cmsMAT3isIdentity_cmsMAT3per_cmsMAT3solve_cmsMalloc_cmsMallocZero_cmsPipelineSetOptimizationParameters_cmsRead15Fixed16Number_cmsReadAlignment_cmsReadFloat32Number_cmsReadTypeBase_cmsReadUInt16Array_cmsReadUInt16Number_cmsReadUInt32Number_cmsReadUInt64Number_cmsReadUInt8Number_cmsReadXYZNumber_cmsRealloc_cmsStageAllocPlaceholder_cmsVEC3cross_cmsVEC3distance_cmsVEC3dot_cmsVEC3init_cmsVEC3length_cmsVEC3minus_cmsWrite15Fixed16Number_cmsWriteAlignment_cmsWriteFloat32Number_cmsWriteTypeBase_cmsWriteUInt16Array_cmsWriteUInt16Number_cmsWriteUInt32Number_cmsWriteUInt64Number_cmsWriteUInt8Number_cmsWriteXYZNumbercmsAdaptToIlluminantcmsAllocNamedColorListcmsAllocProfileSequenceDescriptioncmsAppendNamedColorcmsBFDdeltaEcmsBuildGammacmsBuildParametricToneCurvecmsBuildSegmentedToneCurvecmsBuildTabulatedToneCurve16cmsBuildTabulatedToneCurveFloatcmsCIE2000DeltaEcmsCIE94DeltaEcmsCIECAM02DonecmsCIECAM02ForwardcmsCIECAM02InitcmsCIECAM02ReversecmsCMCdeltaEcmsChangeBuffersFormatcmsChannelsOfcmsCloseIOhandlercmsCloseProfilecmsCreateBCHSWabstractProfilecmsCreateBCHSWabstractProfileTHRcmsCreateExtendedTransformcmsCreateGrayProfilecmsCreateGrayProfileTHRcmsCreateInkLimitingDeviceLinkcmsCreateInkLimitingDeviceLinkTHRcmsCreateLab2ProfilecmsCreateLab2ProfileTHRcmsCreateLab4ProfilecmsCreateLab4ProfileTHRcmsCreateLinearizationDeviceLinkcmsCreateLinearizationDeviceLinkTHRcmsCreateMultiprofileTransformcmsCreateMultiprofileTransformTHRcmsCreateNULLProfilecmsCreateNULLProfileTHRcmsCreateProfilePlaceholdercmsCreateProofingTransformcmsCreateProofingTransformTHRcmsCreateRGBProfilecmsCreateRGBProfileTHRcmsCreateTransformcmsCreateTransformTHRcmsCreateXYZProfilecmsCreateXYZProfileTHRcmsCreate_sRGBProfilecmsCreate_sRGBProfileTHRcmsD50_XYZcmsD50_xyYcmsDeleteTransformcmsDeltaEcmsDesaturateLabcmsDetectBlackPointcmsDetectTACcmsDictAddEntrycmsDictAlloccmsDictDupcmsDictFreecmsDictGetEntryListcmsDictNextEntrycmsDoTransformcmsDupNamedColorListcmsDupProfileSequenceDescriptioncmsDupToneCurvecmsEstimateGammacmsEvalToneCurve16cmsEvalToneCurveFloatcmsFloat2LabEncodedcmsFloat2LabEncodedV2cmsFloat2XYZEncodedcmsFormatterForColorspaceOfProfilecmsFormatterForPCSOfProfilecmsFreeNamedColorListcmsFreeProfileSequenceDescriptioncmsFreeToneCurvecmsFreeToneCurveTriplecmsGBDAlloccmsGBDFreecmsGDBAddPointcmsGDBCheckPointcmsGDBComputecmsGetAlarmCodescmsGetColorSpacecmsGetDeviceClasscmsGetEncodedICCversioncmsGetHeaderAttributescmsGetHeaderCreationDateTimecmsGetHeaderFlagscmsGetHeaderManufacturercmsGetHeaderModelcmsGetHeaderProfileIDcmsGetHeaderRenderingIntentcmsGetNamedColorListcmsGetPCScmsGetPostScriptCRDcmsGetPostScriptCSAcmsGetPostScriptColorResourcecmsGetProfileContextIDcmsGetProfileInfocmsGetProfileInfoASCIIcmsGetProfileVersioncmsGetSupportedIntentscmsGetTagCountcmsGetTagSignaturecmsGetToneCurveParametricTypecmsGetTransformContextID_cmsGetTransformInputFormat@4_cmsGetTransformOutputFormat@4cmsIT8AlloccmsIT8DefineDblFormatcmsIT8EnumDataFormatcmsIT8EnumPropertiescmsIT8FindDataFormatcmsIT8FreecmsIT8GetDatacmsIT8GetDataDblcmsIT8GetDataRowColcmsIT8GetDataRowColDblcmsIT8GetPatchNamecmsIT8GetPropertycmsIT8GetPropertyDblcmsIT8GetSheetTypecmsIT8LoadFromFilecmsIT8LoadFromMemcmsIT8SaveToFilecmsIT8SaveToMemcmsIT8SetCommentcmsIT8SetDatacmsIT8SetDataDblcmsIT8SetDataFormatcmsIT8SetDataRowColcmsIT8SetDataRowColDblcmsIT8SetPropertyDblcmsIT8SetPropertyHexcmsIT8SetPropertyStrcmsIT8SetPropertyUncookedcmsIT8SetSheetTypecmsIT8SetTablecmsIT8SetTableByLabelcmsIT8TableCountcmsIsCLUTcmsIsIntentSupportedcmsIsMatrixShapercmsIsTagcmsIsToneCurveDescendingcmsIsToneCurveLinearcmsIsToneCurveMonotoniccmsIsToneCurveMultisegmentcmsJoinToneCurvecmsLCh2LabcmsLab2LChcmsLab2XYZcmsLabEncoded2FloatcmsLabEncoded2FloatV2cmsLinkTagcmsMD5computeIDcmsMLUalloccmsMLUdupcmsMLUfreecmsMLUgetASCIIcmsMLUgetTranslationcmsMLUgetWidecmsMLUsetASCIIcmsMLUsetWidecmsNamedColorCountcmsNamedColorIndexcmsNamedColorInfocmsOpenIOhandlerFromFilecmsOpenIOhandlerFromMemcmsOpenIOhandlerFromNULLcmsOpenIOhandlerFromStreamcmsOpenProfileFromFilecmsOpenProfileFromFileTHRcmsOpenProfileFromIOhandlerTHRcmsOpenProfileFromMemcmsOpenProfileFromMemTHRcmsOpenProfileFromStreamcmsOpenProfileFromStreamTHRcmsPipelineAlloccmsPipelineCatcmsPipelineCheckAndRetreiveStagescmsPipelineDupcmsPipelineEval16cmsPipelineEvalFloatcmsPipelineEvalReverseFloatcmsPipelineFreecmsPipelineGetPtrToFirstStagecmsPipelineGetPtrToLastStagecmsPipelineInputChannelscmsPipelineInsertStagecmsPipelineOutputChannelscmsPipelineSetSaveAs8bitsFlagcmsPipelineStageCountcmsPipelineUnlinkStagecmsPlugincmsReadRawTagcmsReadTagcmsReverseToneCurvecmsReverseToneCurveExcmsSaveProfileToFilecmsSaveProfileToIOhandlercmsSaveProfileToMemcmsSaveProfileToStreamcmsSetAdaptationStatecmsSetAlarmCodescmsSetColorSpacecmsSetDeviceClasscmsSetEncodedICCversioncmsSetHeaderAttributescmsSetHeaderFlagscmsSetHeaderManufacturercmsSetHeaderModelcmsSetHeaderProfileIDcmsSetHeaderRenderingIntentcmsSetLogErrorHandlercmsSetPCScmsSetProfileVersioncmsSignalErrorcmsSliceSpace16cmsSliceSpaceFloatcmsSmoothToneCurvecmsStageAllocCLut16bitcmsStageAllocCLut16bitGranularcmsStageAllocCLutFloatcmsStageAllocCLutFloatGranularcmsStageAllocIdentitycmsStageAllocMatrixcmsStageAllocToneCurvescmsStageDatacmsStageDupcmsStageFreecmsStageInputChannelscmsStageNextcmsStageOutputChannelscmsStageSampleCLut16bitcmsStageSampleCLutFloatcmsStageTypecmsTagLinkedTocmsTempFromWhitePointcmsTransform2DeviceLinkcmsUnregisterPluginscmsWhitePointFromTempcmsWriteRawTagcmsWriteTagcmsXYZ2LabcmsXYZ2xyYcmsXYZEncoded2FloatcmsfilelengthcmsstrcasecmpcmsxyY2XYZN@D        ! 5A CPR S WY l m pr   )    ``  abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@`y!@~ڣ @ڣ AϢ[@~QQ^ _j21~Cxtplhd`XPH<0( |p\P H@80( |tld\TLD<, t|h@,dddddHPh@Lus?;Zx0Nm:Yw/Ml c c c c c c c c c c..HJ. 5 @ @@@@ @P@$@@ @4@N@ p+ŝi@]%O@qוC)@D@<զIx@oGAkU'9p|Bݎ~QCv)/&D(DJzEeǑF e uuvHMXB䧓9;5SM]=];Z] T7aZ%]g']݀nLɛ R`%u?q= ףp= ף?Zd;On?,eX?#GGŧ?@il7?3=BzՔ?aw̫?/L[Mľ?S;uD?g9Eϔ?$#⼺;1az?aUY~S|_?/D?$?9'*?}d|FU>c{#Tw=:zc%C1@eN?$@M-[?&kCҿD@'@j?_$\?9m4ӿI@1=a?׻?xԿN@\r)?;ǀ?;ֿQ@s?£#?Nё\CؿT@x#?X?K46ڿV@ 0*?;Tގ?VܿY@*g\?eN?WL޿@_@N?++MJ?מYb@R%?|'f?@ee@ʡE?S c A?BC+i@r3܀?˾+?_LJ l@a?r3܀?d]Fx@o@Sg?Pf?H}80q@?4KԲ?Br@Aǘ?X? F%uPt@Y?vq -?z6u@ .V`?X0_^?zpw@L7A`?I +?' y@ek?~7?Jtz@5?w?S: |@)?x?a?k }@St$?=?7A`0!@@gDio?a?S&h@]Fx ?0AC?K7A/0@ ?= ?33333S7@@j?zFw?(\bD@h˹W?a?]SCAb@SCAe`tsvc`(+$$ftam+-$$tulc-/$$mrhcPorlc23fs  23fup@txetp`csedvrucpParappPmitd`1tfmp`p2tfm`p trlc`@P@2lcn`P@P`culmpqesp`P` gis0psaem0atad BAm@ `p  ABm `p@ dfbp`idrc`!"tepm0`1`pnrcs"`#$weiv $$$ ZYXpp xpP@disp P``tcid>0@@BPBtgcv@478090B2A2tfm BAm1tfm1B2A2tfm BAm1tfmh2B2A2tfm BAm1tfm0A2B2tfm ABm1tfm01A2B2tfm ABm1tfm2A2B2tfm ABm1tfmZYXr ZYX\ZYXg ZYXZYXb ZYX$CRTrvrucarapx`CRTgvrucarapx`CRTbvrucarapx`Ptlacmitdgrattxetdahc 23fs|mrhcmrhcorlcorlcDtrlctrlctolctrlc trpctxetculmcsedpmitdmitddnmdcsedculmtxet8ddmdcsedculmtxettmag2tfm ABm1tfmCRTkvrucarap`dimul ZYXtpkb ZYX,tptw ZYX2lcn2lcn0erp2tfm ABm1tfmX1erp2tfm ABm1tfm2erp2tfm ABm1tfm csedcsedculmtxetqespqesphcet gisLsiic gis0gir gis2gir gisxsaemsaem0dspatad@1dspatad2dspatad3dspatadls2spatadi2spatad4deuvcsedculmtxet dfb dfbidrcidrc`0B2Dtepm1B2Dtepm(2B2Dtepm3B2Dtepm0D2BtepmT1D2Btepm2D2Btepm3D2BtepmdrcscsedweivweivHnrcsnrcstgcvtgcvatemtcidtdispdispJ0]I]CPd@^@ a @XpX X XXPVVWPUVU@U!S! T!@`T!T!DU'RgR \ \\]["Z\@p\@\" ["@P["["D[/ZoYJ@hJhI@iIi@d@fJxI@y@y@{ ww@x wqr0s s `u@ uD v @v `tsu@uD`vut10m1m!n! @o!@o!0p!Dpgj'k 0xx@x Px pxtttvw@0wD`w"q" @q"q"q2Pn2n/plojJ I JI@g}@@g@p0GO@5  lmeeeef`f iPerceptualVRelative colorimetricVSaturationV Absolute colorimetricV Perceptual preserving black inkY$ Relative colorimetric preserving black inkY0 Saturation preserving black inkY< Perceptual preserving black plane@`HRelative colorimetric preserving black plane@`TSaturation preserving black plane@`t`PD80$th\H<0( |pd\TLD<4(sqrtcossin?powloglog10atan? 8Ph  0\3Z\4VS_VERSION_INFOStringFileInfo040904e4Comments8 CompanyNameMarti MariaLFileDescriptionlcms color engine(FileVersion2.3*InternalNamelcms^LegalCopyrightCopyright Marti Maria 2011(LegalTrademarks< OriginalFilenamelcms2.dll PrivateBuildNProductNameLittleCMS color engine: ProductVersion2, 0, 3, 0 SpecialBuildDVarFileInfo$Translation  PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGX40%0:0E0[0j0}00000000 11/171A1M1U1]1}12-2=2M2W2a2o2w2222222 33 3M3U33334 444T4Z4k4q4~44444444445 55&595A5Y5l5z555555555 66K6a6m666666637=7H7T7f7w7}77778 88'8-8O8W8g8o888888899G9X9h9p9z99999:::%:-:M::: ;;';1;?;G;O;;;;<< <,<8<< X00N1s1222334$4n5u5^66677/78z8y9::: :::X::;e;t;x;|;;;=Q?000!0B0H0f00W1123/3e3354I44J5^5y555 666666Y7_7p777777777778'818j8q88888959F9_9h999q;;;>???????@T000 011k2%33A44444445)5>5$669::7;<<=V=\==B??PP142j22r4 6q88999 9999:;;(<:>>>>>>>`pM0?1S2h3333F4J44466666666666667 77$707L7l777778869:9C9W9999R:a::;<.=5=pl!00000111 11111 1$1(1,1014181\2223333-4<44425@57679s9~9999:$:M:S:W;;;<>H11f1>222245!6666(7W7p778<9d9s99:<>>z?800K1_1n111H2v2z2222334&6667B1M23334M6667819N9]:;;;<=K=S=_=g=s={=============> >>> >$>(>,>0>4>5???I?S?]???T0,1s11111132o283U3q333444$4.4444446866678>>><v002#2g224466888]9h:::::;;< <<=De0j0o03 33466677u8z88:[:::::;;[??H]0001121W132S2q2v22222313@3H3g34G5(6/69999-:<::;5779: 856*606U666 77677777>>>????0<0001(1L1 33677788(88888<999::c::@d0111111}3P4U4[4444=7,828o8w888999:::Q:<6W>>>>>> ?P$001(1|111>P>W>]>g>t>z>`T00.1`1g1m1w111 4$4`4j444 555t6x666688R8i8t888888 99R99p,9999;;;<<<==R>Y>_>??0!0'0T1X1111L3P333345,5B5J5555555,6666#7[777777B9W9]9d9r9999:::Q:W:d:s::::; ;$;<;B;g;m;s;;;;;;<<<>#>:>R>X>? ?[?a??@30<0w0}0000 1F22323b3s3|3333333(4444444 55#5)545E5K5V5h5n5y555555555?6E6P6a6g6r6666666666677778888(808>8H8V8b8j8x888899999y:::::,;2;8;F;\;;;;;;;;;; 2><>H>R>>d?h?l?p?t?x?|????????????????????????|122 22222 2$2(2,2024282<2@2D2H2L2P2T2333444 44444 4$4(4,4044484666J99[:~::;<===>>>!?/?R?X??????????0'000000000011'121w111111111 22"212;2L2P2T2X2a2l2w22222222222#3E3U3i33333333333444$4/4:4E4S4^4i4t4444444456Y77777888+868A8`8k8888888 9959@999999999999:-:O:x:::;;I;O;<<$==5>d>>>>>>W?j?0000011-181C1X1q1|11111111111233e3}33333333344444 5{55555%6B6Z666{77$889D::;;;F?8011"272u2222303n3333444444556L70=00022{2222244566-6A666667b9991:::W;;<<=00336:a> Z1233%4J8N999:4<,)1d33334g5E6i6W7p<2=>>3?8?Z?_? 800"1|11111$282L2`2t255678D9;=??0,20Q01d123M4456.848N8X888n>@xg222221333333+494>4T4Y4444*7R77Q888J99999:;;C;g;; >D?P?`?m?x???????P|000h0m12233M586677088 9999: :#:-:3:=:E:O:W:h:w:::::::::::0;6;@;P;};;;T=`=o={=======`D0000112D33$44-6 8888888N::::<2===>>p%00012L2d2k2s2x2|22222222333 33Z3`3d3h3l3333344 4-4W4444444444445556c7j7778!868A888T9`999Y:e:::7<<>l1Z334w5}5555556*77g8m8y888f99*:C:::::<>>>>>>>+?_?e?k?????90f0000000011111#1+131;1G1P1U1[1e1n1y111111111223V4t444 5$5r8b9::;=;=>?B?F?J?N?R?V?Z?g?y?,Y0c0p000001!1D1W12W3u33::33'6.6@6F6`6o6|666666666 7 7*7P77777788%9K9Q9{9999#:-:X:p:::::";E;K;`;;;;;R<,=4=L=g==1>n>>?(0@0M0W0e0n0x00000001R111 2'2p222s3333333334$4*43484G4n44445W55566\7v777778 888$8*838?8E8M8S8_8e8r8|888888)9/9Y9_9e9{9993:V:`:::::;;;$;*;0;?;M;W;];s;x;;;;;;;;;;;;;;;;;;;;; < <&<.<3<;<@6?070M000J1|112223n33 4$4+43484<4@4i444444444445 5$5(5,5555555556I6P6T6X6\6`6d6h6l666666:77889Q:V:\:`:f:j:p:t:z:~:::::::::::U;>)>u1y1}11111111111122D2v22A3M3V3\3b3n3t3}3334#464A4F4X4b4g44444444445;5E5k5r5555;6N6`6666666747A7V77778E8R8X888889E99999N:::::: ;;>;G;P;f;;;;;;;;;;;< 5H5Y5d5$757=7C7H7N77778P8\8k8p888,:O:\:h:p:x::::: ;;0;N;;;<<<<<<<<=>5>1?N?s?|01+1L1U1|11111111222<2C2\2p2v22222J3j344/4M4a4g4445{9999999 ::1:C:U:g:y:::::::? |0000000(1H14>4w444445'559: ::::::: ;[;n;;;;!<:">`>X?e????0H0N0X00h1\2d2334455;5I55566677f8G999:::6;M;=U>>@34Z888888888889M9R99999999:!:'::::::M;R;[;j;;;;;<*<5<;>$>3>9>R>Z>d>q>y>>>>>>>>>? ???(?4?A?H?S?[?c?l?u?????`\L0Y0r0000011244495@55566667 77;8i89;!=h=n={====j>,?T?d????p9<<1==[>j?00 11111!2-2<2H2223^34 525r5}5555R66677Q7Z7b777)878I8T888888Y9g9y9999999:B::;;$;>>>>?? ?2?r????0-0?0R0000 1p122K3L4\4m4u444455555566>6667i7u777777738?8888p99:u: ;;&;8;H;T;S<[<<<<<<===#=A=M=c=l=u==$>^>r>>>>>?4??N0_00000$1H1Q1\111+2k2r2223i334G444 5545w566667/8q88888199%:w:::;Y;a;i;q;;;;<<%<1<<<<<<<======>>q>}>>>>>?:?B?_?o?{??xJ0R0f0p000000011 1,181D1P1111111122$202<2t22222222263>3F3N333333V4I5\555556H014181<1@1L1P111h6?$?,?4?:B:F:d ;;X;x;;;;;<80>P>l>p>>>>>>??8?X?t?x????0 011h8h9l9p9t9x9|999999999999999999999999999999999::: :: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|::::::::::::::::::::(;8;H;X;h;;;;;;;;;;@=D=H=L=P=T=X=\=`=d=>>>>>>>>>>>>>>>>>>>>>2 222$2,242<2D2L2T2\2d2l2t2|2222222222222233<8\8d8h8l8p8|8888888888888888888899 999$9(9,909<9D9H9L9P9\9d9h9l9p9|999999999999999999999:: :::$:(:,:0:<:D:H:L:P:\:d:h:l:p:|:::::::::::::::::::::;; ;;;$;(;,;0;<;D;H;L;P;\;d;h;l;p;|;;;;;;;;;;;;;;;;;;;;;<< <<<$<(<,<0<<,>>>>>T?X???x0 00000H1L112x22@334h4l4405455555\6`66(777P8T88899|999H::;t;;<<<=h==0>>>>\??($000P112|22D33 4p455(545@5L5X5d5p5|555555555556 66$606<6H6T6`6l6x6666666666667 77$707<7H7T7`7l7x77777777777788 8,888D8P8\8h8t888888888888999(949@9L9X9d9p9|9999999999999::: ::::::::::::;;<<>>??0 0(1,14282@3D3L4P4X5`5h5p5x555555555555555556666 6(60686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|66666666666666666666666lcms2-2.6/utils/delphi/delphidemo.dpr0000644002406300000240000000026112311617072017153 0ustar mariamausersprogram delphidemo; uses Forms, demo1 in 'demo1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. lcms2-2.6/utils/common/0000755002406300000240000000000012311617072014356 5ustar mariamauserslcms2-2.6/utils/common/utils.h0000644002406300000240000000647012311617072015676 0ustar mariamausers //--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- #ifndef _lcms_utils_h // Deal with Microsoft's attempt at deprecating C standard runtime functions #ifdef _MSC_VER # if (_MSC_VER >= 1400) # ifndef _CRT_SECURE_NO_DEPRECATE # define _CRT_SECURE_NO_DEPRECATE # endif # ifndef _CRT_SECURE_NO_WARNINGS # define _CRT_SECURE_NO_WARNINGS # endif # endif #endif #include "lcms2.h" #include #include #include #include #include #include #include #include // Avoid warnings #define UTILS_UNUSED_PARAMETER(x) ((void)x) // Init the utility functions void InitUtils(const char* PName); // Fatal Error (print the message and exit(1))--------------------------------------------- extern int Verbose; void FatalError(const char *frm, ...); // xgetopt() interface ------------------------------------------------------------- extern int xoptind; extern char *xoptarg; extern int xopterr; extern char SW; int xgetopt(int argc, char *argv[], char *optionS); // The stock profile utility ------------------------------------------------------- cmsHPROFILE OpenStockProfile(cmsContext ContextID, const char* File); // The print info utility ---------------------------------------------------------- void PrintProfileInformation(cmsHPROFILE h); // --------------------------------------------------------------------------------- void PrintRenderingIntents(void); void PrintBuiltins(void); // --------------------------------------------------------------------------------- cmsBool SaveMemoryBlock(const cmsUInt8Number* Buffer, cmsUInt32Number dwLen, const char* Filename); // --------------------------------------------------------------------------------- // Return a pixel type on depending on the number of channels int PixelTypeFromChanCount(int ColorChannels); // ------------------------------------------------------------------------------ // Return number of channels of pixel type int ChanCountFromPixelType(int ColorChannels); #define _lcms_utils_h #endif lcms2-2.6/utils/common/xgetopt.c0000644002406300000240000000327312311617072016221 0ustar mariamausers/* getopt.c */ #include #include #include int xoptind = 1; /* index of which argument is next */ char *xoptarg; /* pointer to argument of current option */ int xopterr = 0; /* allow error message */ static char *letP = NULL; /* remember next option char's location */ char SW = '-'; /* DOS switch character, either '-' or '/' */ /* Parse the command line options, System V style. Standard option syntax is: option ::= SW [optLetter]* [argLetter space* argument] */ int xgetopt(int argc, char *argv[], char *optionS) { unsigned char ch; char *optP; if (SW == 0) { SW = '/'; } if (argc > xoptind) { if (letP == NULL) { if ((letP = argv[xoptind]) == NULL || *(letP++) != SW) goto gopEOF; if (*letP == SW) { xoptind++; goto gopEOF; } } if (0 == (ch = *(letP++))) { xoptind++; goto gopEOF; } if (':' == ch || (optP = strchr(optionS, ch)) == NULL) goto gopError; if (':' == *(++optP)) { xoptind++; if (0 == *letP) { if (argc <= xoptind) goto gopError; letP = argv[xoptind++]; } xoptarg = letP; letP = NULL; } else { if (0 == *letP) { xoptind++; letP = NULL; } xoptarg = NULL; } return ch; } gopEOF: xoptarg = letP = NULL; return EOF; gopError: xoptarg = NULL; errno = EINVAL; if (xopterr) perror ("get command line option"); return ('?'); } lcms2-2.6/utils/common/vprf.c0000644002406300000240000002206712311617072015506 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "utils.h" int Verbose = 0; static char ProgramName[256] = ""; void FatalError(const char *frm, ...) { va_list args; va_start(args, frm); fprintf(stderr, "[%s fatal error]: ", ProgramName); vfprintf(stderr, frm, args); fprintf(stderr, "\n"); va_end(args); exit(1); } // Show errors to the end user (unless quiet option) static void MyErrorLogHandler(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { if (Verbose >= 0) fprintf(stderr, "[%s]: %s\n", ProgramName, Text); UTILS_UNUSED_PARAMETER(ErrorCode); UTILS_UNUSED_PARAMETER(ContextID); } void InitUtils(const char* PName) { strncpy(ProgramName, PName, sizeof(ProgramName)); ProgramName[sizeof(ProgramName)-1] = 0; cmsSetLogErrorHandler(MyErrorLogHandler); } // Virtual profiles are handled here. cmsHPROFILE OpenStockProfile(cmsContext ContextID, const char* File) { if (!File) return cmsCreate_sRGBProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Lab2") == 0) return cmsCreateLab2ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*Lab4") == 0) return cmsCreateLab4ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*Lab") == 0) return cmsCreateLab4ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*LabD65") == 0) { cmsCIExyY D65xyY; cmsWhitePointFromTemp( &D65xyY, 6504); return cmsCreateLab4ProfileTHR(ContextID, &D65xyY); } if (cmsstrcasecmp(File, "*XYZ") == 0) return cmsCreateXYZProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Gray22") == 0) { cmsToneCurve* Curve = cmsBuildGamma(ContextID, 2.2); cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } if (cmsstrcasecmp(File, "*Gray30") == 0) { cmsToneCurve* Curve = cmsBuildGamma(ContextID, 3.0); cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } if (cmsstrcasecmp(File, "*srgb") == 0) return cmsCreate_sRGBProfileTHR(ContextID); if (cmsstrcasecmp(File, "*null") == 0) return cmsCreateNULLProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Lin2222") == 0) { cmsToneCurve* Gamma = cmsBuildGamma(0, 2.2); cmsToneCurve* Gamma4[4]; cmsHPROFILE hProfile; Gamma4[0] = Gamma4[1] = Gamma4[2] = Gamma4[3] = Gamma; hProfile = cmsCreateLinearizationDeviceLink(cmsSigCmykData, Gamma4); cmsFreeToneCurve(Gamma); return hProfile; } return cmsOpenProfileFromFileTHR(ContextID, File, "r"); } // Help on available built-ins void PrintBuiltins(void) { fprintf(stderr, "\nBuilt-in profiles:\n\n"); fprintf(stderr, "\t*Lab2 -- D50-based v2 CIEL*a*b\n" "\t*Lab4 -- D50-based v4 CIEL*a*b\n" "\t*Lab -- D50-based v4 CIEL*a*b\n" "\t*XYZ -- CIE XYZ (PCS)\n" "\t*sRGB -- sRGB color space\n" "\t*Gray22 - Monochrome of Gamma 2.2\n" "\t*Gray30 - Monochrome of Gamma 3.0\n" "\t*null - Monochrome black for all input\n" "\t*Lin2222- CMYK linearization of gamma 2.2 on each channel\n"); } // Auxiliar for printing information on profile static void PrintInfo(cmsHPROFILE h, cmsInfoType Info) { char* text; int len; len = cmsGetProfileInfoASCII(h, Info, "en", "US", NULL, 0); if (len == 0) return; text = malloc(len * sizeof(char)); if (text == NULL) return; cmsGetProfileInfoASCII(h, Info, "en", "US", text, len); if (strlen(text) > 0) printf("%s\n", text); free(text); } // Displays the colorant table static void PrintColorantTable(cmsHPROFILE hInput, cmsTagSignature Sig, const char* Title) { cmsNAMEDCOLORLIST* list; int i, n; if (cmsIsTag(hInput, Sig)) { printf("%s:\n", Title); list = cmsReadTag(hInput, Sig); if (list == NULL) { printf("(Unavailable)\n"); return; } n = cmsNamedColorCount(list); for (i=0; i < n; i++) { char Name[cmsMAX_PATH]; cmsNamedColorInfo(list, i, Name, NULL, NULL, NULL, NULL); printf("\t%s\n", Name); } printf("\n"); } } void PrintProfileInformation(cmsHPROFILE hInput) { PrintInfo(hInput, cmsInfoDescription); PrintInfo(hInput, cmsInfoManufacturer); PrintInfo(hInput, cmsInfoModel); PrintInfo(hInput, cmsInfoCopyright); if (Verbose > 2) { PrintColorantTable(hInput, cmsSigColorantTableTag, "Input colorant table"); PrintColorantTable(hInput, cmsSigColorantTableOutTag, "Input colorant out table"); } printf("\n"); } // ----------------------------------------------------------------------------- void PrintRenderingIntents(void) { cmsUInt32Number Codes[200]; char* Descriptions[200]; cmsUInt32Number n, i; fprintf(stderr, "%ct rendering intent:\n\n", SW); n = cmsGetSupportedIntents(200, Codes, Descriptions); for (i=0; i < n; i++) { fprintf(stderr, "\t%u - %s\n", Codes[i], Descriptions[i]); } fprintf(stderr, "\n"); } // ------------------------------------------------------------------------------ cmsBool SaveMemoryBlock(const cmsUInt8Number* Buffer, cmsUInt32Number dwLen, const char* Filename) { FILE* out = fopen(Filename, "wb"); if (out == NULL) { FatalError("Cannot create '%s'", Filename); return FALSE; } if (fwrite(Buffer, 1, dwLen, out) != dwLen) { FatalError("Cannot write %ld bytes to %s", dwLen, Filename); return FALSE; } if (fclose(out) != 0) { FatalError("Error flushing file '%s'", Filename); return FALSE; } return TRUE; } // ------------------------------------------------------------------------------ // Return a pixel type on depending on the number of channels int PixelTypeFromChanCount(int ColorChannels) { switch (ColorChannels) { case 1: return PT_GRAY; case 2: return PT_MCH2; case 3: return PT_MCH3; case 4: return PT_CMYK; case 5: return PT_MCH5; case 6: return PT_MCH6; case 7: return PT_MCH7; case 8: return PT_MCH8; case 9: return PT_MCH9; case 10: return PT_MCH10; case 11: return PT_MCH11; case 12: return PT_MCH12; case 13: return PT_MCH13; case 14: return PT_MCH14; case 15: return PT_MCH15; default: FatalError("What a weird separation of %d channels?!?!", ColorChannels); return -1; } } // ------------------------------------------------------------------------------ // Return number of channels of pixel type int ChanCountFromPixelType(int ColorChannels) { switch (ColorChannels) { case PT_GRAY: return 1; case PT_RGB: case PT_CMY: case PT_Lab: case PT_YUV: case PT_YCbCr: return 3; case PT_CMYK: return 4 ; case PT_MCH2: return 2 ; case PT_MCH3: return 3 ; case PT_MCH4: return 4 ; case PT_MCH5: return 5 ; case PT_MCH6: return 6 ; case PT_MCH7: return 7 ; case PT_MCH8: return 8 ; case PT_MCH9: return 9 ; case PT_MCH10: return 10; case PT_MCH11: return 11; case PT_MCH12: return 12; case PT_MCH13: return 12; case PT_MCH14: return 14; case PT_MCH15: return 15; default: FatalError("Unsupported color space of %d channels", ColorChannels); return -1; } } lcms2-2.6/utils/jpgicc/0000755002406300000240000000000012311617072014325 5ustar mariamauserslcms2-2.6/utils/jpgicc/iccjpeg.h0000644002406300000240000000523712311617072016111 0ustar mariamausers/* * iccprofile.h * * This file provides code to read and write International Color Consortium * (ICC) device profiles embedded in JFIF JPEG image files. The ICC has * defined a standard format for including such data in JPEG "APP2" markers. * The code given here does not know anything about the internal structure * of the ICC profile data; it just knows how to put the profile data into * a JPEG file being written, or get it back out when reading. * * This code depends on new features added to the IJG JPEG library as of * IJG release 6b; it will not compile or work with older IJG versions. * * NOTE: this code would need surgery to work on 16-bit-int machines * with ICC profiles exceeding 64K bytes in size. See iccprofile.c * for details. */ #include /* needed to define "FILE", "NULL" */ #include "jpeglib.h" /* * This routine writes the given ICC profile data into a JPEG file. * It *must* be called AFTER calling jpeg_start_compress() and BEFORE * the first call to jpeg_write_scanlines(). * (This ordering ensures that the APP2 marker(s) will appear after the * SOI and JFIF or Adobe markers, but before all else.) */ extern void write_icc_profile JPP((j_compress_ptr cinfo, const JOCTET *icc_data_ptr, unsigned int icc_data_len)); /* * Reading a JPEG file that may contain an ICC profile requires two steps: * * 1. After jpeg_create_decompress() but before jpeg_read_header(), * call setup_read_icc_profile(). This routine tells the IJG library * to save in memory any APP2 markers it may find in the file. * * 2. After jpeg_read_header(), call read_icc_profile() to find out * whether there was a profile and obtain it if so. */ /* * Prepare for reading an ICC profile */ extern void setup_read_icc_profile JPP((j_decompress_ptr cinfo)); /* * See if there was an ICC profile in the JPEG file being read; * if so, reassemble and return the profile data. * * TRUE is returned if an ICC profile was found, FALSE if not. * If TRUE is returned, *icc_data_ptr is set to point to the * returned data, and *icc_data_len is set to its length. * * IMPORTANT: the data at **icc_data_ptr has been allocated with malloc() * and must be freed by the caller with free() when the caller no longer * needs it. (Alternatively, we could write this routine to use the * IJG library's memory allocator, so that the data would be freed implicitly * at jpeg_finish_decompress() time. But it seems likely that many apps * will prefer to have the data stick around after decompression finishes.) */ extern boolean read_icc_profile JPP((j_decompress_ptr cinfo, JOCTET **icc_data_ptr, unsigned int *icc_data_len)); lcms2-2.6/utils/jpgicc/jpgicc.c0000644002406300000240000010442612311617072015737 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // This program does apply profiles to (some) JPEG files #include "utils.h" #include "jpeglib.h" #include "iccjpeg.h" // Flags static cmsBool BlackPointCompensation = FALSE; static cmsBool IgnoreEmbedded = FALSE; static cmsBool GamutCheck = FALSE; static cmsBool lIsITUFax = FALSE; static cmsBool lIsPhotoshopApp13 = FALSE; static cmsBool lIsEXIF; static cmsBool lIsDeviceLink = FALSE; static cmsBool EmbedProfile = FALSE; static const char* SaveEmbedded = NULL; static int Intent = INTENT_PERCEPTUAL; static int ProofingIntent = INTENT_PERCEPTUAL; static int PrecalcMode = 1; static int jpegQuality = 75; static cmsFloat64Number ObserverAdaptationState = 0; static char *cInpProf = NULL; static char *cOutProf = NULL; static char *cProofing = NULL; static FILE * InFile; static FILE * OutFile; static struct jpeg_decompress_struct Decompressor; static struct jpeg_compress_struct Compressor; static struct my_error_mgr { struct jpeg_error_mgr pub; // "public" fields void* Cargo; // "private" fields } ErrorHandler; cmsUInt16Number Alarm[4] = {128,128,128,0}; static void my_error_exit (j_common_ptr cinfo) { char buffer[JMSG_LENGTH_MAX]; (*cinfo->err->format_message) (cinfo, buffer); FatalError(buffer); } /* Definition of the APPn Markers Defined for continuous-tone G3FAX The application code APP1 initiates identification of the image as a G3FAX application and defines the spatial resolution and subsampling. This marker directly follows the SOI marker. The data format will be as follows: X'FFE1' (APP1), length, FAX identifier, version, spatial resolution. The above terms are defined as follows: Length: (Two octets) Total APP1 field octet count including the octet count itself, but excluding the APP1 marker. FAX identifier: (Six octets) X'47', X'33', X'46', X'41', X'58', X'00'. This X'00'-terminated string "G3FAX" uniquely identifies this APP1 marker. Version: (Two octets) X'07CA'. This string specifies the year of approval of the standard, for identification in the case of future revision (for example, 1994). Spatial Resolution: (Two octets) Lightness pixel density in pels/25.4 mm. The basic value is 200. Allowed values are 100, 200, 300, 400, 600 and 1200 pels/25.4 mm, with square (or equivalent) pels. NOTE The functional equivalence of inch-based and mm-based resolutions is maintained. For example, the 200 200 */ static cmsBool IsITUFax(jpeg_saved_marker_ptr ptr) { while (ptr) { if (ptr -> marker == (JPEG_APP0 + 1) && ptr -> data_length > 5) { const char* data = (const char*) ptr -> data; if (strcmp(data, "G3FAX") == 0) return TRUE; } ptr = ptr -> next; } return FALSE; } // Save a ITU T.42/Fax marker with defaults on boundaries. This is the only mode we support right now. static void SetITUFax(j_compress_ptr cinfo) { unsigned char Marker[] = "G3FAX\x00\0x07\xCA\x00\xC8"; jpeg_write_marker(cinfo, (JPEG_APP0 + 1), Marker, 10); } // Build a profile for decoding ITU T.42/Fax JPEG streams. // The profile has an additional ability in the input direction of // gamut compress values between 85 < a < -85 and -75 < b < 125. This conforms // the default range for ITU/T.42 -- See RFC 2301, section 6.2.3 for details // L* = [0, 100] // a* = [85, 85] // b* = [75, 125] // These functions does convert the encoding of ITUFAX to floating point // and vice-versa. No gamut mapping is performed yet. static void ITU2Lab(const cmsUInt16Number In[3], cmsCIELab* Lab) { Lab -> L = (double) In[0] / 655.35; Lab -> a = (double) 170.* (In[1] - 32768.) / 65535.; Lab -> b = (double) 200.* (In[2] - 24576.) / 65535.; } static void Lab2ITU(const cmsCIELab* Lab, cmsUInt16Number Out[3]) { Out[0] = (cmsUInt16Number) floor((double) (Lab -> L / 100.)* 65535. ); Out[1] = (cmsUInt16Number) floor((double) (Lab -> a / 170.)* 65535. + 32768. ); Out[2] = (cmsUInt16Number) floor((double) (Lab -> b / 200.)* 65535. + 24576. ); } // These are the samplers-- They are passed as callbacks to cmsStageSampleCLut16bit() // then, cmsSample3DGrid() will sweel whole Lab gamut calling these functions // once for each node. In[] will contain the Lab PCS value to convert to ITUFAX // on PCS2ITU, or the ITUFAX value to convert to Lab in ITU2PCS // You can change the number of sample points if desired, the algorithm will // remain same. 33 points gives good accurancy, but you can reduce to 22 or less // is space is critical #define GRID_POINTS 33 static int PCS2ITU(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { cmsCIELab Lab; cmsLabEncoded2Float(&Lab, In); cmsDesaturateLab(&Lab, 85, -85, 125, -75); // This function does the necessary gamut remapping Lab2ITU(&Lab, Out); return TRUE; UTILS_UNUSED_PARAMETER(Cargo); } static int ITU2PCS( register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { cmsCIELab Lab; ITU2Lab(In, &Lab); cmsFloat2LabEncoded(Out, &Lab); return TRUE; UTILS_UNUSED_PARAMETER(Cargo); } // This function does create the virtual input profile, which decodes ITU to the profile connection space static cmsHPROFILE CreateITU2PCS_ICC(void) { cmsHPROFILE hProfile; cmsPipeline* AToB0; cmsStage* ColorMap; AToB0 = cmsPipelineAlloc(0, 3, 3); if (AToB0 == NULL) return NULL; ColorMap = cmsStageAllocCLut16bit(0, GRID_POINTS, 3, 3, NULL); if (ColorMap == NULL) return NULL; cmsPipelineInsertStage(AToB0, cmsAT_BEGIN, ColorMap); cmsStageSampleCLut16bit(ColorMap, ITU2PCS, NULL, 0); hProfile = cmsCreateProfilePlaceholder(0); if (hProfile == NULL) { cmsPipelineFree(AToB0); return NULL; } cmsWriteTag(hProfile, cmsSigAToB0Tag, AToB0); cmsSetColorSpace(hProfile, cmsSigLabData); cmsSetPCS(hProfile, cmsSigLabData); cmsSetDeviceClass(hProfile, cmsSigColorSpaceClass); cmsPipelineFree(AToB0); return hProfile; } // This function does create the virtual output profile, with the necessary gamut mapping static cmsHPROFILE CreatePCS2ITU_ICC(void) { cmsHPROFILE hProfile; cmsPipeline* BToA0; cmsStage* ColorMap; BToA0 = cmsPipelineAlloc(0, 3, 3); if (BToA0 == NULL) return NULL; ColorMap = cmsStageAllocCLut16bit(0, GRID_POINTS, 3, 3, NULL); if (ColorMap == NULL) return NULL; cmsPipelineInsertStage(BToA0, cmsAT_BEGIN, ColorMap); cmsStageSampleCLut16bit(ColorMap, PCS2ITU, NULL, 0); hProfile = cmsCreateProfilePlaceholder(0); if (hProfile == NULL) { cmsPipelineFree(BToA0); return NULL; } cmsWriteTag(hProfile, cmsSigBToA0Tag, BToA0); cmsSetColorSpace(hProfile, cmsSigLabData); cmsSetPCS(hProfile, cmsSigLabData); cmsSetDeviceClass(hProfile, cmsSigColorSpaceClass); cmsPipelineFree(BToA0); return hProfile; } #define PS_FIXED_TO_FLOAT(h, l) ((float) (h) + ((float) (l)/(1<<16))) static cmsBool ProcessPhotoshopAPP13(JOCTET FAR *data, int datalen) { int i; for (i = 14; i < datalen; ) { long len; unsigned int type; if (!(GETJOCTET(data[i] ) == 0x38 && GETJOCTET(data[i+1]) == 0x42 && GETJOCTET(data[i+2]) == 0x49 && GETJOCTET(data[i+3]) == 0x4D)) break; // Not recognized i += 4; // identifying string type = (unsigned int) (GETJOCTET(data[i]<<8) + GETJOCTET(data[i+1])); i += 2; // resource type i += GETJOCTET(data[i]) + ((GETJOCTET(data[i]) & 1) ? 1 : 2); // resource name len = ((((GETJOCTET(data[i]<<8) + GETJOCTET(data[i+1]))<<8) + GETJOCTET(data[i+2]))<<8) + GETJOCTET(data[i+3]); i += 4; // Size if (type == 0x03ED && len >= 16) { Decompressor.X_density = (UINT16) PS_FIXED_TO_FLOAT(GETJOCTET(data[i]<<8) + GETJOCTET(data[i+1]), GETJOCTET(data[i+2]<<8) + GETJOCTET(data[i+3])); Decompressor.Y_density = (UINT16) PS_FIXED_TO_FLOAT(GETJOCTET(data[i+8]<<8) + GETJOCTET(data[i+9]), GETJOCTET(data[i+10]<<8) + GETJOCTET(data[i+11])); // Set the density unit to 1 since the // Vertical and Horizontal resolutions // are specified in Pixels per inch Decompressor.density_unit = 0x01; return TRUE; } i += len + ((len & 1) ? 1 : 0); // Alignment } return FALSE; } static cmsBool HandlePhotoshopAPP13(jpeg_saved_marker_ptr ptr) { while (ptr) { if (ptr -> marker == (JPEG_APP0 + 13) && ptr -> data_length > 9) { JOCTET FAR* data = ptr -> data; if(GETJOCTET(data[0]) == 0x50 && GETJOCTET(data[1]) == 0x68 && GETJOCTET(data[2]) == 0x6F && GETJOCTET(data[3]) == 0x74 && GETJOCTET(data[4]) == 0x6F && GETJOCTET(data[5]) == 0x73 && GETJOCTET(data[6]) == 0x68 && GETJOCTET(data[7]) == 0x6F && GETJOCTET(data[8]) == 0x70) { ProcessPhotoshopAPP13(data, ptr -> data_length); return TRUE; } } ptr = ptr -> next; } return FALSE; } typedef unsigned short uint16_t; typedef unsigned char uint8_t; typedef unsigned int uint32_t; #define INTEL_BYTE_ORDER 0x4949 #define XRESOLUTION 0x011a #define YRESOLUTION 0x011b #define RESOLUTION_UNIT 0x128 // Read a 16-bit word static uint16_t read16(uint8_t* arr, int pos, int swapBytes) { uint8_t b1 = arr[pos]; uint8_t b2 = arr[pos+1]; return (swapBytes) ? ((b2 << 8) | b1) : ((b1 << 8) | b2); } // Read a 32-bit word static uint32_t read32(uint8_t* arr, int pos, int swapBytes) { if(!swapBytes) { return (arr[pos] << 24) | (arr[pos+1] << 16) | (arr[pos+2] << 8) | arr[pos+3]; } return arr[pos] | (arr[pos+1] << 8) | (arr[pos+2] << 16) | (arr[pos+3] << 24); } static int read_tag(uint8_t* arr, int pos, int swapBytes, void* dest) { // Format should be 5 over here (rational) uint32_t format = read16(arr, pos + 2, swapBytes); // Components should be 1 uint32_t components = read32(arr, pos + 4, swapBytes); // Points to the value uint32_t offset; // sanity if (components != 1) return 0; if (format == 3) offset = pos + 8; else offset = read32(arr, pos + 8, swapBytes); switch (format) { case 5: // Rational { double num = read32(arr, offset, swapBytes); double den = read32(arr, offset + 4, swapBytes); *(double *) dest = num / den; } break; case 3: // uint 16 *(int*) dest = read16(arr, offset, swapBytes); break; default: return 0; } return 1; } // Handler for EXIF data static cmsBool HandleEXIF(struct jpeg_decompress_struct* cinfo) { jpeg_saved_marker_ptr ptr; uint32_t ifd_ofs; int pos = 0, swapBytes = 0; uint32_t i, numEntries; double XRes = -1, YRes = -1; int Unit = 2; // Inches for (ptr = cinfo ->marker_list; ptr; ptr = ptr ->next) { if ((ptr ->marker == JPEG_APP0+1) && ptr ->data_length > 6) { JOCTET FAR* data = ptr -> data; if (memcmp(data, "Exif\0\0", 6) == 0) { data += 6; // Skip EXIF marker // 8 byte TIFF header // first two determine byte order pos = 0; if (read16(data, pos, 0) == INTEL_BYTE_ORDER) { swapBytes = 1; } pos += 2; // next two bytes are always 0x002A (TIFF version) pos += 2; // offset to Image File Directory (includes the previous 8 bytes) ifd_ofs = read32(data, pos, swapBytes); // Search the directory for resolution tags numEntries = read16(data, ifd_ofs, swapBytes); for (i=0; i < numEntries; i++) { uint32_t entryOffset = ifd_ofs + 2 + (12 * i); uint32_t tag = read16(data, entryOffset, swapBytes); switch (tag) { case RESOLUTION_UNIT: if (!read_tag(data, entryOffset, swapBytes, &Unit)) return FALSE; break; case XRESOLUTION: if (!read_tag(data, entryOffset, swapBytes, &XRes)) return FALSE; break; case YRESOLUTION: if (!read_tag(data, entryOffset, swapBytes, &YRes)) return FALSE; break; default:; } } // Proceed if all found if (XRes != -1 && YRes != -1) { // 1 = None // 2 = inches // 3 = cm switch (Unit) { case 2: cinfo ->X_density = (UINT16) floor(XRes + 0.5); cinfo ->Y_density = (UINT16) floor(YRes + 0.5); break; case 1: cinfo ->X_density = (UINT16) floor(XRes * 2.54 + 0.5); cinfo ->Y_density = (UINT16) floor(YRes * 2.54 + 0.5); break; default: return FALSE; } cinfo ->density_unit = 1; /* 1 for dots/inch, or 2 for dots/cm.*/ } } } } return FALSE; } static cmsBool OpenInput(const char* FileName) { int m; lIsITUFax = FALSE; InFile = fopen(FileName, "rb"); if (InFile == NULL) { FatalError("Cannot open '%s'", FileName); } // Now we can initialize the JPEG decompression object. Decompressor.err = jpeg_std_error(&ErrorHandler.pub); ErrorHandler.pub.error_exit = my_error_exit; ErrorHandler.pub.output_message = my_error_exit; jpeg_create_decompress(&Decompressor); jpeg_stdio_src(&Decompressor, InFile); for (m = 0; m < 16; m++) jpeg_save_markers(&Decompressor, JPEG_APP0 + m, 0xFFFF); // setup_read_icc_profile(&Decompressor); fseek(InFile, 0, SEEK_SET); jpeg_read_header(&Decompressor, TRUE); return TRUE; } static cmsBool OpenOutput(const char* FileName) { OutFile = fopen(FileName, "wb"); if (OutFile == NULL) { FatalError("Cannot create '%s'", FileName); } Compressor.err = jpeg_std_error(&ErrorHandler.pub); ErrorHandler.pub.error_exit = my_error_exit; ErrorHandler.pub.output_message = my_error_exit; Compressor.input_components = Compressor.num_components = 4; jpeg_create_compress(&Compressor); jpeg_stdio_dest(&Compressor, OutFile); return TRUE; } static cmsBool Done(void) { jpeg_destroy_decompress(&Decompressor); jpeg_destroy_compress(&Compressor); return fclose(InFile) + fclose(OutFile); } // Build up the pixeltype descriptor static cmsUInt32Number GetInputPixelType(void) { int space, bps, extra, ColorChannels, Flavor; lIsITUFax = IsITUFax(Decompressor.marker_list); lIsPhotoshopApp13 = HandlePhotoshopAPP13(Decompressor.marker_list); lIsEXIF = HandleEXIF(&Decompressor); ColorChannels = Decompressor.num_components; extra = 0; // Alpha = None bps = 1; // 8 bits Flavor = 0; // Vanilla if (lIsITUFax) { space = PT_Lab; Decompressor.out_color_space = JCS_YCbCr; // Fake to don't touch } else switch (Decompressor.jpeg_color_space) { case JCS_GRAYSCALE: // monochrome space = PT_GRAY; Decompressor.out_color_space = JCS_GRAYSCALE; break; case JCS_RGB: // red/green/blue space = PT_RGB; Decompressor.out_color_space = JCS_RGB; break; case JCS_YCbCr: // Y/Cb/Cr (also known as YUV) space = PT_RGB; // Let IJG code to do the conversion Decompressor.out_color_space = JCS_RGB; break; case JCS_CMYK: // C/M/Y/K space = PT_CMYK; Decompressor.out_color_space = JCS_CMYK; if (Decompressor.saw_Adobe_marker) // Adobe keeps CMYK inverted, so change flavor Flavor = 1; // from vanilla to chocolate break; case JCS_YCCK: // Y/Cb/Cr/K space = PT_CMYK; Decompressor.out_color_space = JCS_CMYK; if (Decompressor.saw_Adobe_marker) // ditto Flavor = 1; break; default: FatalError("Unsupported color space (0x%x)", Decompressor.jpeg_color_space); return 0; } return (EXTRA_SH(extra)|CHANNELS_SH(ColorChannels)|BYTES_SH(bps)|COLORSPACE_SH(space)|FLAVOR_SH(Flavor)); } // Rearrange pixel type to build output descriptor static cmsUInt32Number ComputeOutputFormatDescriptor(cmsUInt32Number dwInput, int OutColorSpace) { int IsPlanar = T_PLANAR(dwInput); int Channels = 0; int Flavor = 0; switch (OutColorSpace) { case PT_GRAY: Channels = 1; break; case PT_RGB: case PT_CMY: case PT_Lab: case PT_YUV: case PT_YCbCr: Channels = 3; break; case PT_CMYK: if (Compressor.write_Adobe_marker) // Adobe keeps CMYK inverted, so change flavor to chocolate Flavor = 1; Channels = 4; break; default: FatalError("Unsupported output color space"); } return (COLORSPACE_SH(OutColorSpace)|PLANAR_SH(IsPlanar)|CHANNELS_SH(Channels)|BYTES_SH(1)|FLAVOR_SH(Flavor)); } // Equivalence between ICC color spaces and lcms color spaces static int GetProfileColorSpace(cmsHPROFILE hProfile) { cmsColorSpaceSignature ProfileSpace = cmsGetColorSpace(hProfile); return _cmsLCMScolorSpace(ProfileSpace); } static int GetDevicelinkColorSpace(cmsHPROFILE hProfile) { cmsColorSpaceSignature ProfileSpace = cmsGetPCS(hProfile); return _cmsLCMScolorSpace(ProfileSpace); } // From TRANSUPP static void jcopy_markers_execute(j_decompress_ptr srcinfo, j_compress_ptr dstinfo) { jpeg_saved_marker_ptr marker; /* In the current implementation, we don't actually need to examine the * option flag here; we just copy everything that got saved. * But to avoid confusion, we do not output JFIF and Adobe APP14 markers * if the encoder library already wrote one. */ for (marker = srcinfo->marker_list; marker != NULL; marker = marker->next) { if (dstinfo->write_JFIF_header && marker->marker == JPEG_APP0 && marker->data_length >= 5 && GETJOCTET(marker->data[0]) == 0x4A && GETJOCTET(marker->data[1]) == 0x46 && GETJOCTET(marker->data[2]) == 0x49 && GETJOCTET(marker->data[3]) == 0x46 && GETJOCTET(marker->data[4]) == 0) continue; /* reject duplicate JFIF */ if (dstinfo->write_Adobe_marker && marker->marker == JPEG_APP0+14 && marker->data_length >= 5 && GETJOCTET(marker->data[0]) == 0x41 && GETJOCTET(marker->data[1]) == 0x64 && GETJOCTET(marker->data[2]) == 0x6F && GETJOCTET(marker->data[3]) == 0x62 && GETJOCTET(marker->data[4]) == 0x65) continue; /* reject duplicate Adobe */ jpeg_write_marker(dstinfo, marker->marker, marker->data, marker->data_length); } } static void WriteOutputFields(int OutputColorSpace) { J_COLOR_SPACE in_space, jpeg_space; int components; switch (OutputColorSpace) { case PT_GRAY: in_space = jpeg_space = JCS_GRAYSCALE; components = 1; break; case PT_RGB: in_space = JCS_RGB; jpeg_space = JCS_YCbCr; components = 3; break; // red/green/blue case PT_YCbCr: in_space = jpeg_space = JCS_YCbCr; components = 3; break; // Y/Cb/Cr (also known as YUV) case PT_CMYK: in_space = JCS_CMYK; jpeg_space = JCS_YCCK; components = 4; break; // C/M/Y/components case PT_Lab: in_space = jpeg_space = JCS_YCbCr; components = 3; break; // Fake to don't touch default: FatalError("Unsupported output color space"); return; } if (jpegQuality >= 100) { // avoid destructive conversion when asking for lossless compression jpeg_space = in_space; } Compressor.in_color_space = in_space; Compressor.jpeg_color_space = jpeg_space; Compressor.input_components = Compressor.num_components = components; jpeg_set_defaults(&Compressor); jpeg_set_colorspace(&Compressor, jpeg_space); // Make sure to pass resolution through if (OutputColorSpace == PT_CMYK) Compressor.write_JFIF_header = 1; // Avoid subsampling on high quality factor jpeg_set_quality(&Compressor, jpegQuality, 1); if (jpegQuality >= 70) { int i; for(i=0; i < Compressor.num_components; i++) { Compressor.comp_info[i].h_samp_factor = 1; Compressor.comp_info[i].v_samp_factor = 1; } } } static void DoEmbedProfile(const char* ProfileFile) { FILE* f; size_t size, EmbedLen; cmsUInt8Number* EmbedBuffer; f = fopen(ProfileFile, "rb"); if (f == NULL) return; size = cmsfilelength(f); EmbedBuffer = (cmsUInt8Number*) malloc(size + 1); EmbedLen = fread(EmbedBuffer, 1, size, f); fclose(f); EmbedBuffer[EmbedLen] = 0; write_icc_profile (&Compressor, EmbedBuffer, (unsigned int) EmbedLen); free(EmbedBuffer); } static int DoTransform(cmsHTRANSFORM hXForm, int OutputColorSpace) { JSAMPROW ScanLineIn; JSAMPROW ScanLineOut; //Preserve resolution values from the original // (Thanks to Robert Bergs for finding out this bug) Compressor.density_unit = Decompressor.density_unit; Compressor.X_density = Decompressor.X_density; Compressor.Y_density = Decompressor.Y_density; // Compressor.write_JFIF_header = 1; jpeg_start_decompress(&Decompressor); jpeg_start_compress(&Compressor, TRUE); if (OutputColorSpace == PT_Lab) SetITUFax(&Compressor); // Embed the profile if needed if (EmbedProfile && cOutProf) DoEmbedProfile(cOutProf); ScanLineIn = (JSAMPROW) malloc(Decompressor.output_width * Decompressor.num_components); ScanLineOut = (JSAMPROW) malloc(Compressor.image_width * Compressor.num_components); while (Decompressor.output_scanline < Decompressor.output_height) { jpeg_read_scanlines(&Decompressor, &ScanLineIn, 1); cmsDoTransform(hXForm, ScanLineIn, ScanLineOut, Decompressor.output_width); jpeg_write_scanlines(&Compressor, &ScanLineOut, 1); } free(ScanLineIn); free(ScanLineOut); jpeg_finish_decompress(&Decompressor); jpeg_finish_compress(&Compressor); return TRUE; } // Transform one image static int TransformImage(char *cDefInpProf, char *cOutProf) { cmsHPROFILE hIn, hOut, hProof; cmsHTRANSFORM xform; cmsUInt32Number wInput, wOutput; int OutputColorSpace; cmsUInt32Number dwFlags = 0; cmsUInt32Number EmbedLen; cmsUInt8Number* EmbedBuffer; cmsSetAdaptationState(ObserverAdaptationState); if (BlackPointCompensation) { dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; } switch (PrecalcMode) { case 0: dwFlags |= cmsFLAGS_NOOPTIMIZE; break; case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; case 3: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; default:; } if (GamutCheck) { dwFlags |= cmsFLAGS_GAMUTCHECK; cmsSetAlarmCodes(Alarm); } // Take input color space wInput = GetInputPixelType(); if (lIsDeviceLink) { hIn = cmsOpenProfileFromFile(cDefInpProf, "r"); hOut = NULL; hProof = NULL; } else { if (!IgnoreEmbedded && read_icc_profile(&Decompressor, &EmbedBuffer, &EmbedLen)) { hIn = cmsOpenProfileFromMem(EmbedBuffer, EmbedLen); if (Verbose) { fprintf(stdout, " (Embedded profile found)\n"); PrintProfileInformation(hIn); fflush(stdout); } if (hIn != NULL && SaveEmbedded != NULL) SaveMemoryBlock(EmbedBuffer, EmbedLen, SaveEmbedded); free(EmbedBuffer); } else { // Default for ITU/Fax if (cDefInpProf == NULL && T_COLORSPACE(wInput) == PT_Lab) cDefInpProf = "*Lab"; if (cDefInpProf != NULL && cmsstrcasecmp(cDefInpProf, "*lab") == 0) hIn = CreateITU2PCS_ICC(); else hIn = OpenStockProfile(0, cDefInpProf); } if (cOutProf != NULL && cmsstrcasecmp(cOutProf, "*lab") == 0) hOut = CreatePCS2ITU_ICC(); else hOut = OpenStockProfile(0, cOutProf); hProof = NULL; if (cProofing != NULL) { hProof = OpenStockProfile(0, cProofing); if (hProof == NULL) { FatalError("Proofing profile couldn't be read."); } dwFlags |= cmsFLAGS_SOFTPROOFING; } } if (!hIn) FatalError("Input profile couldn't be read."); if (!lIsDeviceLink && !hOut) FatalError("Output profile couldn't be read."); // Assure both, input profile and input JPEG are on same colorspace if (cmsGetColorSpace(hIn) != _cmsICCcolorSpace(T_COLORSPACE(wInput))) FatalError("Input profile is not operating in proper color space"); // Output colorspace is given by output profile if (lIsDeviceLink) { OutputColorSpace = GetDevicelinkColorSpace(hIn); } else { OutputColorSpace = GetProfileColorSpace(hOut); } jpeg_copy_critical_parameters(&Decompressor, &Compressor); WriteOutputFields(OutputColorSpace); wOutput = ComputeOutputFormatDescriptor(wInput, OutputColorSpace); xform = cmsCreateProofingTransform(hIn, wInput, hOut, wOutput, hProof, Intent, ProofingIntent, dwFlags); if (xform == NULL) FatalError("Cannot transform by using the profiles"); DoTransform(xform, OutputColorSpace); jcopy_markers_execute(&Decompressor, &Compressor); cmsDeleteTransform(xform); cmsCloseProfile(hIn); cmsCloseProfile(hOut); if (hProof) cmsCloseProfile(hProof); return 1; } // Simply print help static void Help(int level) { fprintf(stderr, "little cms ICC profile applier for JPEG - v3.2 [LittleCMS %2.2f]\n\n", LCMS_VERSION / 1000.0); switch(level) { default: case 0: fprintf(stderr, "usage: jpgicc [flags] input.jpg output.jpg\n"); fprintf(stderr, "\nflags:\n\n"); fprintf(stderr, "%cv - Verbose\n", SW); fprintf(stderr, "%ci - Input profile (defaults to sRGB)\n", SW); fprintf(stderr, "%co - Output profile (defaults to sRGB)\n", SW); PrintRenderingIntents(); fprintf(stderr, "%cb - Black point compensation\n", SW); fprintf(stderr, "%cd<0..1> - Observer adaptation state (abs.col. only)\n", SW); fprintf(stderr, "%cn - Ignore embedded profile\n", SW); fprintf(stderr, "%ce - Embed destination profile\n", SW); fprintf(stderr, "%cs - Save embedded profile as \n", SW); fprintf(stderr, "\n"); fprintf(stderr, "%cc<0,1,2,3> - Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1]\n", SW); fprintf(stderr, "\n"); fprintf(stderr, "%cp - Soft proof profile\n", SW); fprintf(stderr, "%cm<0,1,2,3> - SoftProof intent\n", SW); fprintf(stderr, "%cg - Marks out-of-gamut colors on softproof\n", SW); fprintf(stderr, "%c!,, - Out-of-gamut marker channel values\n", SW); fprintf(stderr, "\n"); fprintf(stderr, "%cq<0..100> - Output JPEG quality\n", SW); fprintf(stderr, "\n"); fprintf(stderr, "%ch<0,1,2,3> - More help\n", SW); break; case 1: fprintf(stderr, "Examples:\n\n" "To color correct from scanner to sRGB:\n" "\tjpgicc %ciscanner.icm in.jpg out.jpg\n" "To convert from monitor1 to monitor2:\n" "\tjpgicc %cimon1.icm %comon2.icm in.jpg out.jpg\n" "To make a CMYK separation:\n" "\tjpgicc %coprinter.icm inrgb.jpg outcmyk.jpg\n" "To recover sRGB from a CMYK separation:\n" "\tjpgicc %ciprinter.icm incmyk.jpg outrgb.jpg\n" "To convert from CIELab ITU/Fax JPEG to sRGB\n" "\tjpgicc in.jpg out.jpg\n\n", SW, SW, SW, SW, SW); break; case 2: PrintBuiltins(); break; case 3: fprintf(stderr, "This program is intended to be a demo of the little cms\n" "engine. Both lcms and this program are freeware. You can\n" "obtain both in source code at http://www.littlecms.com\n" "For suggestions, comments, bug reports etc. send mail to\n" "marti@littlecms.com\n\n"); break; } exit(0); } // The toggles stuff static void HandleSwitches(int argc, char *argv[]) { int s; while ((s=xgetopt(argc,argv,"bBnNvVGgh:H:i:I:o:O:P:p:t:T:c:C:Q:q:M:m:L:l:eEs:S:!:D:d:")) != EOF) { switch (s) { case 'b': case 'B': BlackPointCompensation = TRUE; break; case 'd': case 'D': ObserverAdaptationState = atof(xoptarg); if (ObserverAdaptationState < 0 || ObserverAdaptationState > 1.0) FatalError("Adaptation state should be 0..1"); break; case 'v': case 'V': Verbose = TRUE; break; case 'i': case 'I': if (lIsDeviceLink) FatalError("Device-link already specified"); cInpProf = xoptarg; break; case 'o': case 'O': if (lIsDeviceLink) FatalError("Device-link already specified"); cOutProf = xoptarg; break; case 'l': case 'L': if (cInpProf != NULL || cOutProf != NULL) FatalError("input/output profiles already specified"); cInpProf = xoptarg; lIsDeviceLink = TRUE; break; case 'p': case 'P': cProofing = xoptarg; break; case 't': case 'T': Intent = atoi(xoptarg); break; case 'N': case 'n': IgnoreEmbedded = TRUE; break; case 'e': case 'E': EmbedProfile = TRUE; break; case 'g': case 'G': GamutCheck = TRUE; break; case 'c': case 'C': PrecalcMode = atoi(xoptarg); if (PrecalcMode < 0 || PrecalcMode > 2) FatalError("Unknown precalc mode '%d'", PrecalcMode); break; case 'H': case 'h': { int a = atoi(xoptarg); Help(a); } break; case 'q': case 'Q': jpegQuality = atoi(xoptarg); if (jpegQuality > 100) jpegQuality = 100; if (jpegQuality < 0) jpegQuality = 0; break; case 'm': case 'M': ProofingIntent = atoi(xoptarg); break; case 's': case 'S': SaveEmbedded = xoptarg; break; case '!': if (sscanf(xoptarg, "%hu,%hu,%hu", &Alarm[0], &Alarm[1], &Alarm[2]) == 3) { int i; for (i=0; i < 3; i++) { Alarm[i] = (Alarm[i] << 8) | Alarm[i]; } } break; default: FatalError("Unknown option - run without args to see valid ones"); } } } int main(int argc, char* argv[]) { InitUtils("jpgicc"); HandleSwitches(argc, argv); if ((argc - xoptind) != 2) { Help(0); } OpenInput(argv[xoptind]); OpenOutput(argv[xoptind+1]); TransformImage(cInpProf, cOutProf); if (Verbose) { fprintf(stdout, "\n"); fflush(stdout); } Done(); return 0; } lcms2-2.6/utils/jpgicc/jpgicc.10000644002406300000240000000331712311617072015652 0ustar mariamausers.\"Shiju P. Nair September 30, 2004 .TH JPEGICC 1 "September 30, 2004" .SH NAME jpegicc - little cms ICC profile applier for JPEG. .SH SYNOPSIS .B jpegicc .RI [ options ] " input.jpg output.jpg" .SH DESCRIPTION lcms is a standalone CMM engine, which deals with the color management. It implements a fast transformation between ICC profiles. .B jpegicc is little cms ICC profile applier for JPEG. .SH OPTIONS .TP .B \-b Black point compensation. .TP .B \-c <0,1,2,3> Precalculates transform. (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1] .TP .B \-g Marks out-of-gamut colors on softproof. .TP .B \-h <0,1,2> Show summary of options and examples. .TP .BI \-i\ profile Input profile (defaults to sRGB). .TP .B \-m <0,1,2,3> SoftProof intent. .TP .B \-n Ignore embedded profile. .TP .BI \-p\ profile Soft proof profile .TP .BI \-o\ profile .p Output profile (defaults to sRGB). .TP .B \-q <0..100> Output JPEG quality. .TP .B \-t <0,1,2,3> Intent (0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute). .TP .B \-v Verbose. .SH EXAMPLES .nf To color correct from scanner to sRGB: jpegicc -iscanner.icm in.jpg out.jpg To convert from monitor1 to monitor2: jpegicc -imon1.icm -omon2.icm in.jpg out.jpg To make a CMYK separation: jpegicc -oprinter.icm inrgb.jpg outcmyk.jpg To recover sRGB from a CMYK separation: jpegicc -iprinter.icm incmyk.jpg outrgb.jpg To convert from CIELab ITU/Fax JPEG to sRGB jpegicc -iitufax.icm in.jpg out.jpg .fi .SH NOTES For suggestions, comments, bug reports etc. send mail to info@littlecms.com. .SH SEE ALSO .BR tifficc (1), .BR icc2ps (1), .BR icclink (1), .BR icctrans (1), .BR wtpt (1) .SH AUTHOR This manual page was written by Shiju p. Nair , for the Debian project. lcms2-2.6/utils/jpgicc/Makefile.in0000644002406300000240000006122712311617072016402 0ustar mariamausers# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building jpegicc # Written by Bob Friesenhahn, June 2003 # Bugs introduced by Marti Maria on October 2004 VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HasJPEG_TRUE@bin_PROGRAMS = jpgicc$(EXEEXT) subdir = utils/jpgicc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_jpgicc_OBJECTS = jpgicc.$(OBJEXT) iccjpeg.$(OBJEXT) \ xgetopt.$(OBJEXT) vprf.$(OBJEXT) jpgicc_OBJECTS = $(am_jpgicc_OBJECTS) jpgicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la jpgicc_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(jpgicc_LDFLAGS) \ $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(jpgicc_SOURCES) DIST_SOURCES = $(jpgicc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common jpgicc_LDADD = $(top_builddir)/src/liblcms2.la @JPEGICC_DEPLIBS@ jpgicc_LDFLAGS = @LDFLAGS@ jpgicc_SOURCES = jpgicc.c iccjpeg.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = jpgicc.1 EXTRA_DIST = iccjpeg.h $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/jpgicc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign utils/jpgicc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list jpgicc$(EXEEXT): $(jpgicc_OBJECTS) $(jpgicc_DEPENDENCIES) $(EXTRA_jpgicc_DEPENDENCIES) @rm -f jpgicc$(EXEEXT) $(jpgicc_LINK) $(jpgicc_OBJECTS) $(jpgicc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iccjpeg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jpgicc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vprf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgetopt.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< xgetopt.o: ../common/xgetopt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgetopt.o -MD -MP -MF $(DEPDIR)/xgetopt.Tpo -c -o xgetopt.o `test -f '../common/xgetopt.c' || echo '$(srcdir)/'`../common/xgetopt.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgetopt.Tpo $(DEPDIR)/xgetopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/xgetopt.c' object='xgetopt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgetopt.o `test -f '../common/xgetopt.c' || echo '$(srcdir)/'`../common/xgetopt.c xgetopt.obj: ../common/xgetopt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xgetopt.obj -MD -MP -MF $(DEPDIR)/xgetopt.Tpo -c -o xgetopt.obj `if test -f '../common/xgetopt.c'; then $(CYGPATH_W) '../common/xgetopt.c'; else $(CYGPATH_W) '$(srcdir)/../common/xgetopt.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/xgetopt.Tpo $(DEPDIR)/xgetopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/xgetopt.c' object='xgetopt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xgetopt.obj `if test -f '../common/xgetopt.c'; then $(CYGPATH_W) '../common/xgetopt.c'; else $(CYGPATH_W) '$(srcdir)/../common/xgetopt.c'; fi` vprf.o: ../common/vprf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vprf.o -MD -MP -MF $(DEPDIR)/vprf.Tpo -c -o vprf.o `test -f '../common/vprf.c' || echo '$(srcdir)/'`../common/vprf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vprf.Tpo $(DEPDIR)/vprf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/vprf.c' object='vprf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vprf.o `test -f '../common/vprf.c' || echo '$(srcdir)/'`../common/vprf.c vprf.obj: ../common/vprf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vprf.obj -MD -MP -MF $(DEPDIR)/vprf.Tpo -c -o vprf.obj `if test -f '../common/vprf.c'; then $(CYGPATH_W) '../common/vprf.c'; else $(CYGPATH_W) '$(srcdir)/../common/vprf.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vprf.Tpo $(DEPDIR)/vprf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='../common/vprf.c' object='vprf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vprf.obj `if test -f '../common/vprf.c'; then $(CYGPATH_W) '../common/vprf.c'; else $(CYGPATH_W) '$(srcdir)/../common/vprf.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lcms2-2.6/utils/jpgicc/iccjpeg.c0000644002406300000240000002063612311617072016104 0ustar mariamausers/* * iccprofile.c * * This file provides code to read and write International Color Consortium * (ICC) device profiles embedded in JFIF JPEG image files. The ICC has * defined a standard format for including such data in JPEG "APP2" markers. * The code given here does not know anything about the internal structure * of the ICC profile data; it just knows how to put the profile data into * a JPEG file being written, or get it back out when reading. * * This code depends on new features added to the IJG JPEG library as of * IJG release 6b; it will not compile or work with older IJG versions. * * NOTE: this code would need surgery to work on 16-bit-int machines * with ICC profiles exceeding 64K bytes in size. If you need to do that, * change all the "unsigned int" variables to "INT32". You'll also need * to find a malloc() replacement that can allocate more than 64K. */ #include "iccjpeg.h" #include /* define malloc() */ /* * Since an ICC profile can be larger than the maximum size of a JPEG marker * (64K), we need provisions to split it into multiple markers. The format * defined by the ICC specifies one or more APP2 markers containing the * following data: * Identifying string ASCII "ICC_PROFILE\0" (12 bytes) * Marker sequence number 1 for first APP2, 2 for next, etc (1 byte) * Number of markers Total number of APP2's used (1 byte) * Profile data (remainder of APP2 data) * Decoders should use the marker sequence numbers to reassemble the profile, * rather than assuming that the APP2 markers appear in the correct sequence. */ #define ICC_MARKER (JPEG_APP0 + 2) /* JPEG marker code for ICC */ #define ICC_OVERHEAD_LEN 14 /* size of non-profile data in APP2 */ #define MAX_BYTES_IN_MARKER 65533 /* maximum data len of a JPEG marker */ #define MAX_DATA_BYTES_IN_MARKER (MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN) /* * This routine writes the given ICC profile data into a JPEG file. * It *must* be called AFTER calling jpeg_start_compress() and BEFORE * the first call to jpeg_write_scanlines(). * (This ordering ensures that the APP2 marker(s) will appear after the * SOI and JFIF or Adobe markers, but before all else.) */ void write_icc_profile (j_compress_ptr cinfo, const JOCTET *icc_data_ptr, unsigned int icc_data_len) { unsigned int num_markers; /* total number of markers we'll write */ int cur_marker = 1; /* per spec, counting starts at 1 */ unsigned int length; /* number of bytes to write in this marker */ /* Calculate the number of markers we'll need, rounding up of course */ num_markers = icc_data_len / MAX_DATA_BYTES_IN_MARKER; if (num_markers * MAX_DATA_BYTES_IN_MARKER != icc_data_len) num_markers++; while (icc_data_len > 0) { /* length of profile to put in this marker */ length = icc_data_len; if (length > MAX_DATA_BYTES_IN_MARKER) length = MAX_DATA_BYTES_IN_MARKER; icc_data_len -= length; /* Write the JPEG marker header (APP2 code and marker length) */ jpeg_write_m_header(cinfo, ICC_MARKER, (unsigned int) (length + ICC_OVERHEAD_LEN)); /* Write the marker identifying string "ICC_PROFILE" (null-terminated). * We code it in this less-than-transparent way so that the code works * even if the local character set is not ASCII. */ jpeg_write_m_byte(cinfo, 0x49); jpeg_write_m_byte(cinfo, 0x43); jpeg_write_m_byte(cinfo, 0x43); jpeg_write_m_byte(cinfo, 0x5F); jpeg_write_m_byte(cinfo, 0x50); jpeg_write_m_byte(cinfo, 0x52); jpeg_write_m_byte(cinfo, 0x4F); jpeg_write_m_byte(cinfo, 0x46); jpeg_write_m_byte(cinfo, 0x49); jpeg_write_m_byte(cinfo, 0x4C); jpeg_write_m_byte(cinfo, 0x45); jpeg_write_m_byte(cinfo, 0x0); /* Add the sequencing info */ jpeg_write_m_byte(cinfo, cur_marker); jpeg_write_m_byte(cinfo, (int) num_markers); /* Add the profile data */ while (length--) { jpeg_write_m_byte(cinfo, *icc_data_ptr); icc_data_ptr++; } cur_marker++; } } /* * Prepare for reading an ICC profile */ void setup_read_icc_profile (j_decompress_ptr cinfo) { /* Tell the library to keep any APP2 data it may find */ jpeg_save_markers(cinfo, ICC_MARKER, 0xFFFF); } /* * Handy subroutine to test whether a saved marker is an ICC profile marker. */ static boolean marker_is_icc (jpeg_saved_marker_ptr marker) { return marker->marker == ICC_MARKER && marker->data_length >= ICC_OVERHEAD_LEN && /* verify the identifying string */ GETJOCTET(marker->data[0]) == 0x49 && GETJOCTET(marker->data[1]) == 0x43 && GETJOCTET(marker->data[2]) == 0x43 && GETJOCTET(marker->data[3]) == 0x5F && GETJOCTET(marker->data[4]) == 0x50 && GETJOCTET(marker->data[5]) == 0x52 && GETJOCTET(marker->data[6]) == 0x4F && GETJOCTET(marker->data[7]) == 0x46 && GETJOCTET(marker->data[8]) == 0x49 && GETJOCTET(marker->data[9]) == 0x4C && GETJOCTET(marker->data[10]) == 0x45 && GETJOCTET(marker->data[11]) == 0x0; } /* * See if there was an ICC profile in the JPEG file being read; * if so, reassemble and return the profile data. * * TRUE is returned if an ICC profile was found, FALSE if not. * If TRUE is returned, *icc_data_ptr is set to point to the * returned data, and *icc_data_len is set to its length. * * IMPORTANT: the data at **icc_data_ptr has been allocated with malloc() * and must be freed by the caller with free() when the caller no longer * needs it. (Alternatively, we could write this routine to use the * IJG library's memory allocator, so that the data would be freed implicitly * at jpeg_finish_decompress() time. But it seems likely that many apps * will prefer to have the data stick around after decompression finishes.) * * NOTE: if the file contains invalid ICC APP2 markers, we just silently * return FALSE. You might want to issue an error message instead. */ boolean read_icc_profile (j_decompress_ptr cinfo, JOCTET **icc_data_ptr, unsigned int *icc_data_len) { jpeg_saved_marker_ptr marker; int num_markers = 0; int seq_no; JOCTET *icc_data; unsigned int total_length; #define MAX_SEQ_NO 255 /* sufficient since marker numbers are bytes */ char marker_present[MAX_SEQ_NO+1]; /* 1 if marker found */ unsigned int data_length[MAX_SEQ_NO+1]; /* size of profile data in marker */ unsigned int data_offset[MAX_SEQ_NO+1]; /* offset for data in marker */ *icc_data_ptr = NULL; /* avoid confusion if FALSE return */ *icc_data_len = 0; /* This first pass over the saved markers discovers whether there are * any ICC markers and verifies the consistency of the marker numbering. */ for (seq_no = 1; seq_no <= MAX_SEQ_NO; seq_no++) marker_present[seq_no] = 0; for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) { if (marker_is_icc(marker)) { if (num_markers == 0) num_markers = GETJOCTET(marker->data[13]); else if (num_markers != GETJOCTET(marker->data[13])) return FALSE; /* inconsistent num_markers fields */ seq_no = GETJOCTET(marker->data[12]); if (seq_no <= 0 || seq_no > num_markers) return FALSE; /* bogus sequence number */ if (marker_present[seq_no]) return FALSE; /* duplicate sequence numbers */ marker_present[seq_no] = 1; data_length[seq_no] = marker->data_length - ICC_OVERHEAD_LEN; } } if (num_markers == 0) return FALSE; /* Check for missing markers, count total space needed, * compute offset of each marker's part of the data. */ total_length = 0; for (seq_no = 1; seq_no <= num_markers; seq_no++) { if (marker_present[seq_no] == 0) return FALSE; /* missing sequence number */ data_offset[seq_no] = total_length; total_length += data_length[seq_no]; } if (total_length <= 0) return FALSE; /* found only empty markers? */ /* Allocate space for assembled data */ icc_data = (JOCTET *) malloc(total_length * sizeof(JOCTET)); if (icc_data == NULL) return FALSE; /* oops, out of memory */ /* and fill it in */ for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) { if (marker_is_icc(marker)) { JOCTET FAR *src_ptr; JOCTET *dst_ptr; unsigned int length; seq_no = GETJOCTET(marker->data[12]); dst_ptr = icc_data + data_offset[seq_no]; src_ptr = marker->data + ICC_OVERHEAD_LEN; length = data_length[seq_no]; while (length--) { *dst_ptr++ = *src_ptr++; } } } *icc_data_ptr = icc_data; *icc_data_len = total_length; return TRUE; } lcms2-2.6/utils/jpgicc/Makefile.am0000644002406300000240000000117712311617072016367 0ustar mariamausers# # Makefile for building jpegicc # Written by Bob Friesenhahn, June 2003 # Bugs introduced by Marti Maria on October 2004 # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common if HasJPEG bin_PROGRAMS = jpgicc else bin_PROGRAMS = endif jpgicc_LDADD = $(top_builddir)/src/liblcms2.la @JPEGICC_DEPLIBS@ jpgicc_LDFLAGS = @LDFLAGS@ jpgicc_SOURCES = jpgicc.c iccjpeg.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h man_MANS = jpgicc.1 EXTRA_DIST = iccjpeg.h $(man_MANS) lcms2-2.6/doc/0000755002406300000240000000000012311617072012473 5ustar mariamauserslcms2-2.6/doc/LittleCMS2.6 tutorial.pdf0000755002406300000240000314354512311617072017062 0ustar mariamausers%PDF-1.5 % 376 0 obj <> endobj 394 0 obj <>/Filter/FlateDecode/ID[<5949DD023FB32B489B2B96024FF283BC>]/Index[376 38]/Info 375 0 R/Length 95/Prev 836584/Root 377 0 R/Size 414/Type/XRef/W[1 3 1]>>stream hbbd```b`` , Z YD2M\`Q D]IV p 4'30Կ0: I endstream endobj startxref 0 %%EOF 413 0 obj <>stream hTOezrjotږ+G$K^a*0Vp+8MSؖ}m !Y̶0a-9hb&,iz{y>^[A 9J\J@@srVH.5 0הH_hǶjn3vԖ2 SظQTv"rX:[ׂQmr^>6_w~SX"%`K5w7J)8ҏFoAV'r;U\9d]Aչ &iodc㲅'g*OԶ DyO{(ֳwM4מstQ 6Ẽ&~DcZDjG?HUwW8lJ,sV×͗5MWӘe4<!д & 5W l1(s`[jJ$f X*eUkIm6:j%w̓aus/mHi&6dFS-¡BR/Z1c HlJS2UKaA<Mmo!ZKO+ ʴTh[{jypMcOؽ:KK?q6R|. bQw/E[$.u;}WQPNC_o3s.ɂݥG# 55ڹeSV:',^Qc7%Zݴ=qO&<%ZQ݉]l].AO@7lxDL/CAzLF0RXAet L!rfA̓MkEڳəΖ@胝|C@0eI':[gBH&2> Od\`xf [)D+x7ܙ̙|M#JRs F!b%@vEPu<U7 rXhVW 3qYl >o<~X|$T y~:-ȫx;}_r]n endstream endobj 377 0 obj <> endobj 378 0 obj <> endobj 379 0 obj <>stream hWmo8 +bȬwP K6wV,k}Hqq뿿Rڥn!K(ȇJ L ;&Cԧ(4)^0o4zɄDPLh\305{i`Szb2%d[0iMe*۷I`^JXؠ&gڳA[4s6A8sZZCc4cTccԊc^6hPYryr omҟ7e/O|TPqq{wŢ35Qs0}d_ɢd]~.e2Ky?>bTZ'P󲺹m''eH)Iq`{W:5I2.ӧŴܿ*"DDŴL%kjmScLI ]EpIdn&% r76 jMed dSyB2g_kx3.jv?M(\TQ2'Lð>\d(9}]%屖8 8U2)y͔H|k0-2 DrlTqv$'Y/nˎ+wR#w}ή k^UlQOfnitŒEHp]9\q{DMzkKƙ>՘Gt9КV[f,qaF%T։#gO}Wkl*h) 垔\H gԁTy8fE'(<b<b`7 Ot 9KI}zazBk;6ZL7Z{)nVG؆))4L`jJ{=HJ޲$g$%m2RY(P0Š Gև%4KiMր ,Zg``$ 47&%t+{ti5j*!M؃4 LTXm8u74FJo Mr% 5cSξuiC^~P*>^0y*_&"ѳE]ckagIrp1<0z|alI'zn~xIX?Nv3PKzկOw˟V硉EX6C% `UϨT5Bd0΅\L5B|-LL&1y!Uja~EtiWpzυQsjLfpJ:,)Q$))  #>v '!)vk endstream endobj 380 0 obj <>stream hTPn y :@H.Ru5iw>pRC}F:`tg}6Ow 3`yK g硑`I,:a_.t9&f;q ,sfgf-o\'X<^GYqsר 3B'hUgWu̗&vVG!h2ڣt)F 3T[Őx^*Xf~Jm* endstream endobj 381 0 obj <>stream hTn wcO T)b.;N!o_Q۟c~^:w p ++NC#:fxmI8w~ жhah Y$秬<ϯk8O @)82~g^?q"q B+xPiIz?/uM;xVlZ)XfҥpeVl*cS12#;m~ endstream endobj 382 0 obj <>stream hޔUn1SA(uC4(i&xKfݦYHڵ|.QY] Z MJHzhPZ {pFԫbxvbe lzzzWtJzZHQovyx3n[X.6lZ~56촁fMR@MilVIfI1'R/vDC2[(e46o,]& L6bR8ˏfc)X,vPIJO*A]N?g~O|r,t|?<|47ۈXt'C]l=k#~ *WξAL x%H{J\il").R/APO%lIٰ["Tzl;䙑,'n2JNB4hg<&N h9CS5!n xq j.zzwh>>ẝw{c7jUIrV8S\J`q0˰UY[^@JqH10ͬ9Y#U02AJ{k([Օmxj?.+bf3 rѕ,vtp}BUiat3S8C$3x uVbn @YM" Gb!O9TH4w# yi6H6F>kd*"o4bJ}Bqq_| endstream endobj 383 0 obj <>stream hTMo0 7ZRťۤ= C! Ħv q{gzsG<Tmoh b28\7fpA?{oлSTVWTgp@7Ll_5?p9Z'o,N)eĭЦtx9oRM&ҚD1e\*ı9Q+0UMOxWg>H\uI*'OY]CE6ŊDT\LquAb=V\T,"Q;^Y.KjHW=Iof;=#?4e f endstream endobj 384 0 obj <>stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 385 0 obj <>stream hj`'P` #T endstream endobj 386 0 obj <>stream h޴[|UE>Bt DDZ( $z&(FPbA"DŸ6dQQ\e] uWHSˣv/3̝;s̄ "MEdQzB,d/pϡDN˂:DDZL}]/!*{{BQwo|cn[8gѲ1ݟ eDJfˡ&m"|eㆴG ͙?Dϟ$:!lNE9[+PVJZGiIQdwLӴ-L7(UF|2dgCYO9#iTIעh m;ri5VI#Uz?9Tz<Ԑ= >T՚;jh5n]nLӀe޺[dT"aV24ʢ4&S6ӨfgflCseh.wBS*N5 i-%7Zq dx1-ſet-t=ݠ/\+Fhd,f5LJkiCBknǿ;hC mn{Fgezc_ezMKa5V4[+vѶbeЯ ˱DH)U)=Rnū[Ber!-ǽa=s = ,oѫA#ÒT]wӣy8Sro.@eTNx) ŝK֗4Oӟfǚ{AkI ?#,R fNoK!F(Ew`񻊎:S=5O{i MI2mɓ&fef>&-u#R:dprҠā _ӯo{_nuҡ]|[]SnZQ^٠.پ@?thW@\3M-jL@ʂ *eB(Gv%}$}FVZ$/pRd.qqKnV پ%I(v ],6hm@2CCCr2KucV|rδ@jZFrRl\\ YV3(ef:z_Y*b(7sii92V2[ŷ.O t\y349?şGa)cB0N|W 'jjr *&3' 5DD]W$P. Qnl9%t0EiMő]DEjJuqqTsgPU7$җUCʯy靵N(~[^ux.%.`g;rΉ;A[lbHrF0IX{iS&F®Dy@>Ӧ=y5p9 V@ hooB57&Kdj>ZSh]#(w1Z=m,WHh Iᴡ x[5Sw,@}5ZH3\,IMs.T ̴RiP%}]@֗Zȷfe/ vJ0NPq̀l9h hfRٟn^Eـĭ旚BݎQǃa+L`7.r ,.? ,h gRK+ *vjXY(ӟ:VEb%iDIy&E9tn vOڊ'Kc0y'`( m  M (޳⣎Q(=hgIE@kg +{uu}RiHo+#!z6=ݽ 7xǝ Y2  `:[t݊߸4iNfK)S3ҬiY50JRg)x^6_ os8JSs8S@Y[~ř!vg/8)_P6-#uNm 2RI;YH^){B+Y0VP6GI9Ԭ!Ƌ܂w56(ǘ㾇lc HḊ<Ư)"y .Jqky%c1-JĪ]ETy#k* u; Exp?Kl-t #< *Kny 씺OMAI}6>*oyxCm) ܼQ%ƿfrWuұL} |Ei^'fe/&cz>NWkDm= DX/s43znwRiDge[Uj?AjBNcz ]u+M %aMzJN*bZ N{`XBV9l^zalף>`!0, #1}[7ajgOQ7Y| LuށiΪ__sP߰!bo>1Mĺ`|CiiQ`{ZB, Bؠ`!zc 7}߻zo}8a;\б}XvA/.j%a q@0Y`88mZ.RّB^Ը{ Hr>qؾ~h]<ʏڬq^Cg߫ ?[b#2ЎxN7,Q_9u /GXPv5b/4{6?Ͻ,%/|<8-0 a5gެ )!7ht,`>O 8,!}|NvF4`r> :xE_t+'6p`]E @}xG̖ٗ媽X뾠lA <'vI|ͽ|b잘zҭrlS#PgmsD \Gwߪ=Nϝلgb]>h/*3 }T})숅Y(?c MkWョ~#9_c:P5h{kYX=hL[3!zXb VKXr<ܷ@`ޫ]cm'#|oVlGĩ=XiQ2C?PǨ#о$9HЏ}﨟/Ø{4@# 8ԧ[h?HV1ZWl YNAAww v⛊g=ro5LLgoY4FwEaxޤRo!G؋xim: ;2i ێxq"3[.{?/){6w4NYR 1 !,W)&XmFI;S[uřF0'N菲sS'{؃wG~tX5憝1 ܤfԥ0l&t_9/J$~5PkqaPmTM"!ocfo)C9J{{ րqt;wrKC7Yx)fKS,ڜ[(K왊1s'3۔m> {:xgv{G{#c;S껟a͵#4vV;Gㄏm Gܻ~؟ޅ956ջPƛX_o2RW(3 ~͇CD=?"THtXC c'ggP_3wQE,ߔ3)3:>g|K lNO8Eg}`ӏW|pk>>q587<0 MH)~}~<}sZ۱Շk96g-b| B`mF3N,ύRLk/c:Z`]0DcFW|J%̒sr`)%S:?s0J0Gy^+q~Bw5>9vΊٰxN  {BM@7| 2>з< 'B 8_ \vg῭C /\zB cP[ҶBLj7x#x !<{d ;U2n%V- U1Mcqg}U pU[SeKOsX^mɽu8,~hd9! H_^{>w={|rOALشT_8$y]J _Z7ߤϾ,2b݊t/=T_ ^#>А\.8OTyGm"|VO҉kKvio >,\d=K`1 2z[ǃ炫咿\f2xkp >GA`qOy7W˽ ]ͰiOW͜s6; Xp=/U:9#o{6S֗)0܍u|+ X "L:, Ę=oj= qg&wD߅Yq9 (@`Ce??]4"00by>v؍1Nlm{zCsLX}.ſ/fyb֎|ddQ0|0ls3p{"! \pFbna݁kfQϤX՗ge+"oZ_-hu~gOEzd/U@|cLq&%5q."F ,Υ's:g@L<5v [,qV4Ne9P?R~{v??0[A-<BA)Z6P l[\@?{8j"H^~*:F%uo-JXɮq7uw3ٞ2g-|`8vAD)ēz$S},;n=rhyJ^`Kuhz4Fyl))_vaDI9P&W(țE3KnbOz?Y](_@Q:)wsXHZc7iȤ{4GOBОzҏ"u?XH1@8R!R5z$>+߄OneZ%F4Θ'F+Fo/}?CO<a.aq*i|eg/_5Y\{= )0whD=Q"UAJn4no4<ޗacLOn|QWANmjy0ʼnv$"h38=X1"75;[!o2Ib{*hgtj6|@N}*0޺xElT8&VM+xbMIOhyV Cɡj U56 aa_Z68:i>N?߫Q`UuPdk&br)Lb`ҜI3&M4aҘI#& 4`r &cRI&D3$fb11LHedRŤ&LW&0OL~dSLgLN07LfrWLdϙ|S&0GL>dO&`3y{LecLf7&o1+Ld0y&1ya&0yKL13L^dr LggSODUGJ|TJ|UU=%-o:!)RvDIJO X(-e 4,mi 5RR@EEqA[eW\A7wKw;<;;wnfB~z8N4Q5GwG]Q~YhqnmŘ - [ ħħ bPX|6 ~cGay^?S|~@{ֺk݇b^5p܉z#lj"Nj+#Ŧȍ푛eM;F`Dj$}776,l6jpEk#I |it}pKXΪe`@ XO pG@嗼/蕘w =GOr#]{T/KAZ VKU 2X!;KeiΩRip4Y,"dZ̟,`T('JqsJscXi-ós#AcVn`\i3X|sxM)NbyX^$vUs,Fp6u9.组uvufvaؔgC92}PYݓ&7D0Zqf9c`L&etQ4 ʡݨqӇM (v2`DYWԄBI/)S?^/n_isMr&Q[L 0A\p5Xn FB FU000 0! C*􃾐W@ zBݠ+8@$H8v:C4X &0@ "@Zv5 *8eh\W~GoS^q/ >O>p>$;6o 8op 8 5x^%x^<<`?샽v.xZa' - x < Fx  !xup?k^5p wjX+ nVVͰF{p{p{p{p{p{p{p{p?Gs?Gs>Gs>Gs>Gs>GsԾ/ԏ/bp.4Ǖtl(cXfWή۷FۇG0γ]03..A&%-Sׄx);vؔBVۚ{Ű9Laf=Bm=jJr[FFk1FmB*~fqυ1ɏa|]%Y2΅hhCp[$199IkGT*JRT*oeJRT*JRT*JRT*JRT*JRT*JRT}ȶ #Qi\8e6hkGuЎhkֱa|JX'$9ms:hEm?l3s^X:>stream h޴[|UE>B4 ]ADD@!JBM!!"MDP"kApm袢XXwݵTPB;3DNyf:DZͧͺxڜE_CJ'dSz@QwW" nS2{Q] ۉl50~un7kvyI&#?'0'vK Qo*dިN4hG0Ѱ(>,q9lv.BZZiIqdwLӴ-L7v\@óJ! > 6@Vtɤt9VzVmmt?=D!z^w™Mu'G ԴZs B @Mp}M5x6?Uq6or;H>Ȣ4&$ʣ|*tLEi A4.Fh R"Tsi"Z/B7_[JW2ZNWU%Js%bRjoZZHYIxk7jZsК+Fifڀ6ѭt;ŝtW63 q32=NzBe!zMKy+•Q5$[Wܶ2K_c׏r%RR{R鉛ͫ[CTѽr&]Q=s 1՞J[noUfkUhݑT^wb"~A|;aډPG)BL d)S8&eNIi$P;҃ic|V`n tTmU.IIHoZy%eyi(v;Sy|m`yF"f^XcCVrzPfVNzZbRRUV7 Wesim޲u{ SsBV>2Yee7L uXyS4(9Da"0BNrB0P Gjj=/9bMt}II\{RPiV Rt yWbRd &J/.i*-'?!m^Aa `Z94|] }~1!+'%8/(@w0=;Ge 0rqeyi\V0+){ ы;r=BMॴM/˙Zj88JEsr-B>U.-&$9fo @ AD^ M1I)^ f5AJ0,:`pbRn9C:9ɡI?UөBEiQQU+4/#Ge%˅D1Joi D`Q071mV7#;5>Gmo=u(DI9cp`Dy*rJ\Əj@F;cI-SsJztNiRs .QҚe%F!'> TJ…{ R8TԺљZtԴ]6=0_ϕ%eyqQJ7BF/`r RC~ZchbsxN* b€ʡDCE q9Io$MP ꄹItyP s=hL')ŰdHJ啀UTw"* vLU9!DuN[~Pܲnħ|ZehM"xX$Լ0¼zۦl u='jMDmB|I,+vP P 3}N?7WW^n ڨQۨ2w57.&k .•V%<$_`OsDm}ZA[ɣH9s6*B:9.V[W:@:V cj2~ۉǷ:mz!-x)x%3NSmK 0=9C!0vNM]'M;M RB  ,%ހtow#?`MR*ʿ9RŋT)^³(F#i k$K-\7%z ۀE? V%%^JXL4qJ1hy ݝ6a0N4@<{0N t60SJ;DwzO F`M <}Qej8 )ߞ}tq,T[OffCs C 9fk/]o7!ֽ{4@G jaVfT~V Pw=>jbI>ջrh+40n* ;5PfMI>3Egu?ѓoZ;{XXK0'm'z+ٓX4Z/h9Bd@mYF!eL|6iTHW+QS+{l^5n2/Ts4EF^*cO֡~dMr+0-Fnsdݱnɑd^? փAO (b;k_W#(`0 qFn`P_+}Őa4ܲȜ0 h1Oe<\4qz7A8FgMekԻG?a:t[m0]Ps8RsxGȊ}%xk}3֋[;FUmٿv^h vZ /ZeB4Χ|w. [e'5ﻔECXKiqkV`gam5xY$3v[0fvb߈<ӑ8a#聱]4 3B`zjf]yṙ;Uz<>B]062gh 0My+VW9~Ϻ~]OU?|QPy?G4r7? eAfi 9I^s 4~ Qq9'=9e GgͰR3Z lU09OoP;*JO4W*W0 Lx.oJǏxvζCJͣ*) xa.M&4 =t'|bjo?04yQP~aמ<:mgx˧F> {4SFxD71j}jp?>pX_SӸo%tN%?x;u[oLX{=Fgtbǀm=E-`cB:JGNoOi\Rۑ,jܽ@NM l[02Da3O6>y ?hvgЍ:@71?a{6a\5=cg@ 6qgN\8^ LؘU uaRNDC0 u2j1 $E4A/L;P[gc{~U/26B+!0;a:n7Z,Ozh~63ca6A\Ӣ/}z /A*?e42-)GU+ƠQcM`Ԣa c lQn `L0*(<1 z9ф 10Ȍ?V}o]R s)ѹZa>$7{ c~SkEm&kan8̫.9~1Q/̾'z\%qθƴǾ $-{GԜ}}~{{\yIq~g?}a[Z9h< ?1(v}o_Y(kFjDߦw_>Ns㉪=|69<<sA9':#XsF09sa#gSȾ?y]s?ŻHÚ ͠vm=vY;7{fjg=9d0}?Kjόj1siXܝuirjysz:/O{(}^ HlxN쀣|ͽ| jlvɶ0ٳ9bK0zw 6XGb"o3'COaG,PNk0o*_zu[3'~Ӏlנnm7Xծ7ceO,qZJq3Vcu@ܭv!`n}{ ʹn17i{|i;|h#E]pR }QZuNyc8x;GGeÜ3FƵ܄tFe/v)yM3BmxMuFn/ܯ/psU)4y O.=u'zT[PFJ/^D]'{/z&Ћ>CZ=Cyٜ۽LZ8c}1s_=*d!n †Huz9's4+7!~Bڨ>E/[G:Xվvy.=H xn=dR݇?ρWًdSXs_g0QWw~ O?9=56D2o2W(7~͇CT ^Cqv&$pJÉL+~惔y~5+h0LcN}Fgw3>%KQG>3{#Y_|c99ρDJjoa|M|.FҠ4OǻrQ@s` ַ{[Qfy̨5"|Fk1e-3չXB|v #cP稳؈rm}n%bSg|:#n޹F~`l5~O_>W@ikQ6ɮV>mu5+}3dOΠ4E?Z>Yw)K>)vGLgl@W <Y&'TS!KzzJ$8CAȓpe@ g[sȓpz<jclk35Ծqx!:v+2vh߀P*ϟ8;ﻮoώATY̨V8R{{x|y}qH,՞D-ش=T_cߟ|6oKYKy{Mz-R/Ŝf{P}>g^ _>\&f^,3Od`39Wꄗ+c^ [Y_7: W[;CLonx9#>'|N}ih?^Kx}7'wQA)?Œ(~V}f7w(@0#H0r0(9ŝb. ם"HJ/sߺ ;!/s&CN ƑאS;[뼽lo#\_/ F _olf;#v>>i>lί1",,ڞQD~WX[X ?ZgPSꫳr Iw7-6;h!Kv9R{߃qGV~}$g@/MK|evs_,>+r' mx;P)?~&X[wПN-c?@zvP3W>':ͼWa1N&Gb=ASCt)?ΦMmhwR wT{51܉v2|/HLZԙ;n{xԜmwz[@;\vǖ`muOnH=tjH 0^o"x2Ԝݻ؅2|wGR{khAd;suǑR>۷l?jr$>+'rh}b#q'G#`;ft?{p~Qg}=H^n^AIvM7Qy\?tЗ|o3(]{=g|#2hQ| r h*%N.4notDC^9:WFSnD(Dy&<;s2/4@GjwD3P|^`h:NQki|z ѶޞjDdQv\'54_oUs` 0D8@gBAȮ'ܓQ)˓@U1p)1Fr;\}{G${.8<ū!![%b!*!BN9.7!O! EB~rDȷBB/|.3! DB>']!9$oB*m!rP[BׅW򊐗$d? yQ B y^sB򌐧ISByRBGT)Bv )a!;<$A!_'^!.dBE]BrBnr[lQ-B6YMB F!녬VH5BV A*! X DCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCcL`5W 6sE+tڊ Ju-hY*RZ,⊊C,8o-kH-ԡ˵X+K\-$̊3EӴ(hQCS(Ԣ@|-򴘢doMb"GqZbbYZdj1RZ bZ H1DC!i1"1""qDHqu-|}L>:eo-zjSKźZ\KŅZtՅu|-:kIZtТtmHe"Ek]t-8OZ$jѼfZ4h>\-hec-ieC-hqKТVӢut\m-⵨kh T4˂!C Rp$FUjqB:7W-~h:犦?ЏZ1}Q-oF+_iN}CЧZ|:#->hg(}g_g{F4F햬iٲd2* 6Ƅ1`pF66IL$C $sCĐlkNuȲM}wzQ:E7#K~MW)twR^ "$_:INyuB?'3B?%FU z B?&gD8ɱ=O:#tQB&g!{:L-Jf :HiBO!' z"ex'wyȱ% =Df!wy#нo{}>rnro^BwCvrmdn%uBڝ.9e]M)R ݐ&vюh;m-667@zBZGn\u*r}еVZN2dKK-&g."B #4GlDY3/Ah:y^.= uLYi) ) 6&B9e5IgCʲhJr P}ʲhrʲhRTGH T2&7ЄMPekHq3S,2rPI3S(aߌ*$ߐO(JnG(,PPP(a-e {f{.s>>?a5G![ ZWb_O/oA(& 8:\3hگAU r'kp~?FE uktkcuQzY0?8 !KOk7Oi7?nn'p𨶀5?.@~}pp{ۀ{ &\wNM;WߡY<߮3w1M13ymI6ֲm˶m&-6$һBMҿG?GT?gtk&\{pkij- Z5 [ن5U+^\rYeɥK'U.L.Wٗ;ЗS9+9{`Vrft8'IvWv&:volI$+&&+S@xz'hR[pvs(Aq7c2xktNʹùo:h`iovY6P61V,AD=2Q6[0`"Sx+9ȾF#2G`Ӎ@ͨ  F=fT=;FtzZ^K'--hmAQ ?Bb~ dlH`<F[UTWAմVuPTr1sѓ{ZZ:g&y[zg|;Nh1 ;h&͌]׿.]?6s׭a(׭}_ܧ9 h:Y\g??茺Qz p#Nv6Vf&F~z:j*Ju,\XX XX XXX L@7 @3 0hL&& LUJ@P(b@ (Q@ € d?^N`V`h(  -@Q4`ppps'>| 8Y W1π3?#p;]xp K[_Nxs?x ''?8E   RAAӀ?< <xGaCx~}{`n7wp[_ Z\#?G#?G#1A @1A @1A @1A @1A @1A @1A @1A @?G|#}>G;~f [?ys)9E1oo)%UEQ(=׫ /Ҕ ^E!4Y0h+d?}|x"8TZB,./)e`J+jf,Z#歋=-\F^!=SAM)*9Z6%=%ڼ&Yr7r e_QTId3jTL9yՁ^i,gS)M.~nc{Ze* S>Ke9cQkpXjGBCi@MuNpV[Չ[!|-jCiu,oPG6ұ:7LPԙ]>9O'e6z0p hz>7dX/?t"bYAֺ"(.Vf3/H;gVX߇⧢hiR-Y0.JK=+gJ `lԔ!cњS\; ߷(n͙qUjNUl5^he]yV>"1ln+i4iʺV(ZI;Fޟ0OWz*(D-='} =s.cVGb)_ںuXX+3Q.3 8Oz̃KW=O{£]EOj| Hl]FHO:"=ud7]H%w0:F‰'!AŘY b0J/g*K+VFKH/UUr9l RAhN#^#k4M*"䶘ܜ*Bz&L8(yPsfIn$Y,m6܇^UhCfS1r:8@J#RW5&JhiО^l *Ȳ@RLUnͩG+rȞRzDG?m=BB894:)#"#L(o7Jl<(o_@JQcieeUj!  X/~QN t^. [vQ[_&(S锺ʹ7ͺS6?fKY0Fܯ4 s..{7.暽fU0Vm=EA*1ͮ7ˡ{ܾ\ 溲}Ȧ%QP'H'H'N2"VǞbkXZxS7,);c.@q:CGcp )V.9V_h[V4eT巨FĖd9nmZ.>NE׎(Ӗi_hJM;w؟3BJR!%THI*BLԌ?а] X ]% yn5`wKOJ9 *, _q8j]c(N!dʥ >:nOȤbyI?ԯTfirJ YE~`VFN&F+c^ ůAjc.íFҴFM#DHiꬑuwDf;-x8A_bHRzg(lJK;oS&Sk\~RoJw78ro4.YKtBSСwGFGsQwQSDX$U* k⯒):Ұbg۸qhEpxnE=rž;&IXf52Oej#Y" #K ί]]K닊챘p Ŵ_vNqD #5,!CF;>(.T9|2&&HK@L 9;;&JJp?ΫgãeģE(* *:]h^gF1逗_P r[ns.OQ22HʠL? /[q_9j*rH<1-2E6JVERETOSXʌ;x'Yn)q| K*4ƈ̉Gtl!]D2)f}{IxUɶ.}+ Z<4M̼T.orh<^@ИyoR5Z.ztն4_<#._ r".=+;#@ȊP[ ʂW N\-APW$$KI)OJ |r} PNHAYؾ+"X-yٙ?ͷooL9} 5͡yO}|ۏ-[{\"+*8QH($SH.Q`s^/VQW^yŅ R(t vکa/W&{q);VNU\Ț׶{lIj=1g/r7\'p)K/9s@AC=Er\zqI9q70F_0rٻC Uz+󪊋"ŜTRht jY~w96i*Fs@bV/ l=عoꂚYFs>ڻf틷WmT˘:W˺HpҜ*iAeALXI_ TąQ^R^^a&RZUojHiCθ;1Zs+;kѿcΊާïMkҷZS@jkAdΥ\Y0 ;ua!q?R16 h1ĺU3N4l9 }4a)z#gjvT`HosV怊sp#\s90'R%@I$F@ӥ8Ζ[Q:%HH!#15A'H5LĚ ôJpR>^RTZZX7܂dʒy?.l[]eiƾ5s2ljܾ*i~9\l!C V6. -)rOG&`%mx:I7Tٸvc˷ڊ۫&.h*֩R'.-]#{OgN[5ѡAh5,k]j(V*itz]A9?焽 =| X5Ta%#.\U>>(~c_chL^4τ lk4mh*WUt66^EW\$e7%g%654DT&lH4N]sZNYxV:vFخ.*O˕Κ,)[f̡V&1RaG@諩MDuxj{;C^e7W,0E@NSo͎Uf/QaMHY*EWaRu }AQTh-&)+&)+&ylLRV hVE2Cl .2[q'S⊕+ў&ƻ 1cVń %>='y7 J mJ}`XXT]`qf hC[oM 8e2̒LYUq b>~jQzJȋ'W3fMf?^2q͑E#Q/}V*O&٘8_ Nٝ2 !m|jmP ozqUbA8^n|5R.*T8GR՝⦘NU04ԖV`턚5-ZM&Ω͢i:h[huYIo6Nv0~37+l]Ryz|#d`S6;xn)j3-3dLnrEyѓ 4g]EST:9艒Ob*: RIfՈ 9BiC~kmMT~jP#8lF WkՎ ˜d68e[zsFٍA(KʼJR<`54b/kTȍ~֌ZKb$$> >Pv@SM-31%J%VqAۭ,)a X3gy!A 2)tg̟k'[<] s-y+gOoL`!gV׮N5poR*t2eS̥|ԑYc-͇`dS%JQޥ`ɰǭK+0,}dO\İ4dϗdaD9RМlç8!4D˗D%k0$K2Ldu6n]q">374kKkg6>{FrLi[Hyy)QV*@~$ 26)R6|T5IVP3T쐓m٨ xVjT9zBcL̮̪*[GNߍT{#s2L ӫSQ%7 !r#I PdtP.z)HʕdY"-*lvebwōՌRT큘ϐ zXy<-=QFϙ`j3p:l?(%( &IQbi+Dctʂ߯klV q[Vi2!N2Cٽ8&Og` VfèH>P䄺.˪GJVrT>KvoAW30u6}4R@3+%+//Q/m% WlՏ&=$8Ө _)Y8% 5\ Ec _F⒤4`GṵiW8Dn{FdYH4Cu͵ MqR4_Ueqd .ZJ_2IJ*K~}aպ){Җ?jXdUq!P6e!3$69nYtoj4ʳ'ltXSuKڅ%Ihy"v.9#>JHbYmgsγhsZ:ՅAkџ5ߊKn47fvZ[SL59CS3Ӻ{ dOWaqYGUK@eeEmQ{+^כƗZZX$Ҏ ΔXzi߲t;F|τO쒂HUH4hL eEVAta5TL5.s= kNǁ,Qi^E:%,Q3f(\1\-,7*Uk0 aͻcA'm7=Gx G3ߟW~}۬9Z F w[Ls9DV;rюn#@:i(((E! lnTT㟔*%b<ö g*Du#3z73Mpt]vJ#2([?k(҅e͇:X\[ܸ@~uN޳-8Q!Dbs 8v3`Z紨G\W58i" 0F@ u4`(!?^dA?c''Zej8!Vc#gǩ_MǥʚAEsH]8*Pjfl&[.`%C 8epƼޘHeh^fMȷyE4i`+1j~đ&$70SƸ Qp,@ =Z-v~ka >0F|0aq7zP [`1E*vq7?/\"QҒuP g?\ b,5ukk[a"Sr|K8d!\P;3egĀ &}Eg$ WГ_'S4 ; iȟwNBl43Hp&šI!>q7T'fȀ/N?-8Z]hJ-@9"Xn$hHB;dz8g6U6X]Van-v+N#AX:xVtxǖ3 (̛DjΗsĚMXsy3p{"='hRJiE.bIO#뜅IMF|h2P$e`Puf>KF =k |]10b6Q:\ZL8eZSFE.hYܢŋOƄ#US&ūc5DLyS 0'oj0s41 C"=#lu%XF$qѤ>!'Yg@4z+(m|\XDFˣ|T1^H3qe3a4FE #P`1h҉ze4or0ZK3cns Ҵ|>G3t-GD}ddvYY\FXj,A+h9G狣`|1^qΟpt_%  ,1qGik{$pah?HLhBf=tl|UӬV!h:dlg-̾?D~ Y*d"ġ3Z_A8Q]\ŷLʇ1<1.c!)CQo 9hh,g.%X2ѭ -Ka;S%&TSĭ/MdwZw#uzDYQF`f"=|?!I6E?Ee*?LWOΦ=5U؟fAQ,15dR`8W|/s?Vba`B:k GQ8󏝽tx SEmSJ$R5MzNb?ă2Hv<&-') =5:EDEeڜW;fEjo@sJA)6u0e0{,D1 e0y-W b &ssmُa03 "J^+hc,nu"##՝n@\Q7K0n1I|9pU~ ^b"CN=G[)AjrѯЈr6xLRRuW)7DT6/TUUrVzSrz ^vZ6[[=?-!h|>Ew9AFP4p+i7拖X^`dC1Dj,D&+5&55QzÓokG?wxl V*rs">Fp"=F 羅*[V`^4i~ ԅ]!<qx;رR-dɩlJEZm6+ԨY+w6mҾ7mk>,ٕ]P{I$Z ,a.3[bM kUmIKnjzg;9`-/+)_6z-ŒAsF[Wi" @?zU'ް;ONqBj_3]DOmu*՟ERU+ӡ#\t$dIB=ᓲB啕͡@Wid $L>^H1#{ԥ=Khʼ8b/zD - 9bepB=6hɵ:56wl~#g`oM\ټ/4r^sK}4q*-EAγހr"v(Ζ3|VyC]7f}볧"LȯӲbm|2m0qnim-Z`і6nu)=R>)B'1qc6LcIk}dYӪ1h9EK~8x!pZҪ.{Y43z{zi Rv,E@V"ݕI^yV=hq[ֶ6{?}}Xm_߾%7%1EZ{|_2|nƖRDǕZpTcQO1'T{8(Ewh2,MY>0GI *#i91%T\=AWj7٫Utv*_T;k'^Q<ӓ>U?fԶvH|=iHOB^]0!ZWh/a|3]&-ϸJи.!"Ŏdw#tT֕OEψh`ˣqa \ĸ{ƯqΝ-8ˠm5ZWj'*ܧXu 4M2:Qz.eyIcv]fIrǴk킞&IQo?oʼnNlaEԾt3;mWÄ=8foCih\lU$UVb#D0u*G.GPpƕX['ug+LrXBH}iN 2Qa@FJ,jqpx223%;X>㹉³׿?\'SK"&ްjG & n'*5ĕì൚i5ǯݐHtFZx`Ԛ:urENR<[L8"lkQ/WVV>F"M;ctIҨ7&.φP钕˺(a(oʚFۍxLh 8!?º* vAVAA . M^‘.{U+I8!Q`TNR Ѯ LOǛqǼ=+y C \jh{@bb::zSC*X"o4=pymtI ܻ-5h4{,!}5+<,&ҫjbj_0l F {tZe?,RoqFa( CvÈ ð F0b3Mq! &\PVRNZXa5<;pn;&N{^~صp|o"vO _#DP9YE _Z4J*L%/*@Ѫx.BP?H%Oʻ+]24ᴬ ?6K5\"Kz@?Mb/2%Y">w#W)P`m:lR‘*ZcvD=^qъ6"Tj%T$ٜQR jtkpQl >zcx]Č=G+ &ף,8^pljJVK(yڦ1 Lvpe\Ig-Kx&pQ]1/OӫeV V_ME=iY^34Ajth¶ݽhM+#nC4ix-m`l:mv^tJK8j2Z#Gfq9o=91 Tg,dB #5UKQ[}h(iS< hWrD"0XTvb$a]y|LC9`4`7 rf@89 X_4 [Pl#iciӯ2[z2ŚSFb*eEX1..OYf eڝWlFitC,&Rwh}tT<h]2oMQ;u/m :A|NHu5-w,[q}v#e=R %ⵓ{/J -W+8$ XԅٍBl߱0oߑّv!*` J.>"%Uի{ܵjW,ކeNvM>GSs|Y)IewB̫$Lya>S$@nե#5MX\zR8Lz5u7!d<`0M: q*<@w e =UtSZ^Z=r )D5' g@RN:ܒw쥞$n֒c\[` )KBlIWW[mgbۿ دm7OEGP#Z,:2ǧlEO&bt֠AC A}u~nsϻ +1 9藫xen; a{!~7sú~6l=8_ "\s| wx:;'fܻCFwiDξ7DO#iď̍D WGɑs(}5P#}W (p~ u4i 4!܆4ZpBKsc^k/ъl֗v}O͍9,\>;s?=H[0]و+[iG?eg|oMgX{P@P@P@P@P@P@P@P@P@P@P{ T ̀- BT,I~| yyk9= nqx|U6f.;d#h3G1Fתnu+UGTGaTFGAp:^}td<@Mɽ(DIl" =PŒoMg&>o1䫓M96`L2LgWYpxLBIF@p1\JF\ K|xx#_r/[տʿ"" #xMSalz 3M#ԫm jAfAҐ= DmW6'6܄Km5CԨm4b w0Z{GC؂8JFkgVއP0jB|,#A2ZE GGŸ6ftA ]ن7ـuC{bމ{?3P#ڪ|>Ɣz#:DȆO>$WWݲ_nݻ{t]IyȈtx䥛m{pymK2 {' {6m9wOyKqꭈx# ڕt+2JBMc):豥'_u|C,?{Ʒ2q;2{}Z 0_[ endstream endobj 388 0 obj <>stream hj?` 0 00Q0"@c endstream endobj 389 0 obj <>stream hy|?&@a_"8qawB @H@ 웂(P*.VEKתUJR֟Zߙ󼞧_3ss=s'QIuT![]NmBZ,dۍogHI7Ytނí&jў< wu-RƔ%_GɌU 6HMR.]lUS pVVY;i߇ԳZqN}kmER3e;U1JsUV=qml9"+%'艡*y}; )pi+T[8Rscgg_52w+38uD[j}$JRdkmìjȧSlzB?s.уZόʯh.-|NS\MֹKbQ3U' ¢qPNo*Kvj h{~˨}y*VNE[FkFj JUꅺO{4[~MMޣJ~a~Mf-YWZ5I說'--.Օi=gU<6ؕ;؏%ڠdݨn߳yRXl)rҏ;}h]6~S@] Y/.f%h9xrh)X^-K mdo t1ٺP@=f:7½VwOER?&Φ}?%A3Z֌p {XwH UU3v^`G8@ea&w ?o{i'眯FA7St~܁/U wg>}3TÏ={:&^Y]~y~?cOul@cS55no;?t}*ۭﶮZ\OzC/i+xb?mk9{ȽU:RN)wJ.䶥~w]U}9&wKs;-?OaOܻشH%3Ν>mjaAIF,oTÇ 5xӻWݻuҹSgo׶MFY3[<#EfM4n԰AzuSԮ\Ƕhi64?,|hQ$9<,$lt뇺w.q3#ji4.Dӻ3xtZ('d/<$nB~z8DZ OOOX˥C%qb܈LI/sB~UZPτGl:pcQJKDMO DTJl 4<h 4_ ; ,S2}gbMU*'N:/uj ]|v׮a0Ţ݁A`%m))50E6Qn4eoMbX0V F1!Bs#Ym prT,L. Oˏt-;#tR䌼qX v?rJCM">̦_R:ȸI($X1xXAPha}k$UFOvc 9|#6Kr޸jv}*;Qp&>&Utg=,P<-xxxQephxeQehp(5\;9rQNQ?lJ \I-* wL27|B^fJccp8OZz>Uss*S?AdSZh 5{i>"|,D&O3.ș;1n,<3<&s$=ݜM{4Jb|~̴9},2--'DK0,owM߮nٷzK"&}"I}[phfKVmJ3 e"M3&Dpp$53?6 ZPLs/ 8FHዸwi)SYj/}Rè_Ahxo1ܜXQ&6G~ o;/rBf#a~H(H=R4̄@D6].g̴~W6c ԓe2)?n>ie5|ڊ>l>/=ҥsp>-g&ϛZ>ՑaR~dxfbX}DfZӚs̈́ikRp`Y menM[Iϵ 0M%d* 0V?m_T:>ïKJ׊R< eXVӬHָ5Ejs@<;42/ⵉ1 u.l_'^FvCj! >'*ČLFYafYqFW;-ƙͭvZQT'vV'sWrNLȿ`AALx!ށS#uM S`r,ۀf{5!3hg I-&ׁ\I>T4' ;ëktv74r,TΈL%p&MٕI)|@^I)0C9sUS0&xS=:rQWjZeow5/CXwx2> kr= 7:+['u]W{@fZt TSa,-!;{1bxJCr5_^ߛc83ſߎ7RL^ U7w! y C2{z?r?zl%]ԍGc_2;0? ιPsR91%l]l%RlI{?w,mїy7w!cW9Gc1ՏC''Z))^]uDIw ݮvac7q0És=/[_j[O[4ٷgp&4_t>W^RK:˘ o);D߁mZ<5_VR<ߋnY~!xZz3UFQ $]t_+a!5m/< `5g"C>^%s؞ս0yU~^ =m:OfM{ 1Կ9L< W\/ ͤL.F;f'^j ݦf~_q#8־O}ڟkڹ߿g:{M}?hw -jf*u'wY.NGe6'zPly@w1{ܻ7haIJQ ]l ?܀gPkܠN/}Z^Zrc? 7ا圱5#E:^wܞUIcS_ 2{Վzi99N7z9 : .WzхV:v{Q58Gy5 ,>dg&i;=B=][~(B.txt*hvR?Nw>x-8s~^8NuR3iy\twZsKYduS_>#xLVMB$FcN=r94\> bwQs;]S{yDճ؃M?ΰ.qZa/Q<@kIHdoyTd=Z *N}@G?6}!yH@~^ՐR9W-9=h FQO8>_7q?Ǐ-+6x2 LEЛlπrUM~O {qyour_V}[F0%&w6:lϙψ7.իpX2Pqپذl|/ywrT-wuh(ci7 o1(*IPc N;Ǽmic0[kt:jC1AF˴[{sֺUr+q߫8Lҥߣ Ҥ[!@S֋42Vw@749 o}נt7AKw ,8›&`S=uݠ[k?9 6ʷZJy_㗗'\힩͔(V/+Ќ= L>f a7naw&V[QrtKrgfgiVʃU^;yꃺ;960i/o{guo^@̛:o9/RzaBiĿ:r.߶WrOsőyIA>ŋz&C>S{g scuwIO׳kf0 5-p̼{7vɜb+[vo6|{|0G'9xt&U18ϊ!w/(o)Ms`Npq85f u|WޑGTVgIWW_@+3P P׆[ ^!:h=|=9xu Tܫ[znU▫;wplBwcZh}^W7iw9rwgq/tfye8_w9wcs缡a=hg{mMՈ7M fT;|a|]]_Ç%| j#=ǽw7rBk^s-|eA gr @F:ǙiNkioqn=[Rx2f9]U3rї_P*nވ+r53oľ2f ;=3{3"z϶i$fnV7g&=0l`}>ߚZj Ps:QFhYo}[ 㐯кq+~xGOU#j?lh{ 9Aʙ}=?o\ `pA} 1r  ^#7V*o[/'''+6(u'M\| bވ+ri׼sZ'ߣ|\ybG|F+kSS!NNrlxyVA,5֧}s>Fd ގD?i\i]9Duw7˹v=3Hp^D.}nFߋ }.s]ù~54~y)<ysxu3:99pR %s+im6?f4W3==ν, ücT5vM> }R?{Ojǰ{qmhFIj)vDu1s4zku@޻NozFiI=g "Ta>"{ɔ?lV.VMn,SjR>"{{!-|Ѝ83z3OO7y[K{ęA=,dvgQ2^'>CmrsrC^=枤2mi G.U<9iڳZ^+;a-yJvofIRrj8ԅ7\g6RΕq[EOWkp>Mtߊ٣v8%e0&|q&mƑ sV_PQ uW3'ʹml[+Z%-0ocC %m?M=yt9^w漓}9y&K:3竏]M俫u{Gu,r51^Ap-+[r6AsՇs<Đ{٫8Z# : Ό84Zs#wl.yfSL)gT+yK ,tO 䤦|wF1cȻGj .a5R;T~8g{UBޑWAs{Q߬}6Qׁ>c>ycM)o)Xw#5 ;b@\>OfA9Ev-br7fkA9/{of'71Z߰?7zESj;Mo1g-e_ˉYQEN IceMwD8Y +7PqyGtk#+\E.-ol=r`)/J}:w>ؚOw sп#'Ҷ=sV9aq>F|Aʸcs#v sySCA}r&,ن>-}@;<}!ȸj}dֲmyA";V/fkg<>Ur^b,nռY;k+MvEjޮg$ޮ%M7sa̼]ŧ;xկ5sS}J@VX.gp8'SuJ{o3zK\[ n|7:%&sn {9s ,9`{~@]8;#C5]RN|8ߍwK<`~o<=\F`x%|0`:x\v}RT7{M]^Myb"Hwa"LSs8{g}Xbd5]ӴZ׃2G>룇rc;*$]jߎ>'zI:tn(Us=n]h ?+Ky1Lӽ^&ks:EyySGٽĺKMÀ.P6vv[ lkټEvM\Kf߁~f6~D9=V>w4w2Dy7| hcbPmUFwXg'xBˬ?qt嗵+xcb#c+?++i m!fgD=ՙ^&AcQ)VC&;]ڒ{Ao.7˦OWb,x+t4r9ND䂏ϰI68M>.sBN$HuOF#DZKSk7υN)B>:|u 9Te&@ݞvlw) <%ern^ ދ)#N~]RG+nQyew$@ M)dC B(&+fB  *HUAD ATީz;%%f̛f{oVN5Z̃wjE5-C=sh`|E^r}1PCql1 :GهK0c[n AҏB];:?G8_rZSW[_#ͬh=?o +oh)l:Vkн6aZ@;, m9Tߢ[/c4Q*aZ'FBUY퉺ET4V6b_sQW{  ׾}knȊq~+֢gERzC5 sqlu#>Bx;thb]aӔc9cH j!?s 1w~ œaj,{5d0 h,ћEch>t}V< [;dEEo`~9Bɘ3M-\OXgB ֡<ܟוu 3Ti&="cmG[,f9u@,| aj=ԭ'-R ̦߫ݰc_M0ϖ]0_E{v}uȗ|sY)"̇E\\+c;iOx[s7 ,ˠ+??'QINSca3q`4OSƚYv;6@}Ж^#(7ѻ^oS_ 3kxJNbs9/9%!HO3悜 ND8Dy Muz,B8  ^P2?<LJ4)͐ %7W\rGE\2w{u7@xkEk ѿKP;L -!5=B (_+|k6@l|)'(?)c7UIhe5]m~[-5" ۩6פd@rf_gFXgz]7u3<a茄}| %QPPq qoX=qW(F(,g'Q<~Ɨ[&?3{&li`3gk8 Ϧxa ogP<gcS.k*Vm6օ6y}aѷ@^}c;@e=ߊ{jvjJ&<\u'q)l󴊯/՞!ku3c藍.jP1יH 6}y o g$u8 =Ci@j#9H5H #NoW6s՝VVd̗w]љ'mv)MV%[_"m(18cmV:ߦn35Cf>__g+p\jZ+ |~Q&ʷxc]jtY>AYT2#.)X NE9tʀh9L\DdJ~oy/6z4EP=zu|+iʿa/Ҳ)' w:MOb]:PeerEKS5^m'|Hxgr=z:J_+=5~[#[Su D]/K>v7|@@ǷF>nvxw{劾2SJOM$?2kb7Ho\&OΨ^ $RhF1kQ=iuz3Jߍ_w0'S6FɿS m5w#{6l Q+ZK왣F!sRL <Z3?+ɿ"oz{U|KC;qMm~>hpj3-h(DS⽢KICh\3} B;"]y4V|@\<4v0֚zG3_{ˆ ~=ׯa\Rgن.zćxƐ<|ALFx,;`9i息A xX d܇ׯO/+)C}i?'(plinSm 68-/*_|@ZHNvn>ք͘sTOTjc =@[`0q'?Imz7I- [inD-7ƒIۤqm< M*y } {)Ǻϔ,[& 6 U*$@QzR.2qڲt$. (1WS[&mzd Ȓ#=%*oc-y: [ʧϧ^A7@uA-o@@rn |o<ރ[;A:脶g| & ] (1~㶭[-濏XGE^y77bL>vhGUjSW^Q^Dzzq*Ca uܾV/&4ʋFa6ԍ8Q@0j~Б%B*{Sd&YI|>5']:s,_ "k4R}][pF<_MTg"'F~gX35CMxȷk]UOԝjR7cCSfM,⿥}XP.. DzgO2S-BE>vOˏ1߁eI ,7>/ bl怾7gt2b@3eҶš3B|DMkd ugSkqt^d%j ڃ2xq?Gg{Je_ǕBߖwyiZ 1vHq'_E=M^'( `;a +4Cm2 c#<ꦼ{}\?1ǐk?|z1B ?dz- E?)am:b-a5SK_OWNaͯY(˳6؊: o ]d49xyX#Gao4ChGELAp}>YPVѝ"^+atHFbj|i("7cFýz(gD:W%ښ*zD'MEFy 'ĺ2l"g7G)[#_\O\\IXK{)vbys{'bmW95y;Aga} \@Y1|ϰ}; &:nwwNeg1|6ׄ~an\j^soI[ة)sהϵfpLs;SvTOވ~#:wSc m2?Dˎ<8ֺ1d{, ?sVhȷv.~hqG2x a~a5.G2}]9~Ae>[i-BWGd;D~7Xv^?g1۪h67@9FKؗPsW#EqO<50 ^8܏'2x´H Fue A["]%tPC?iF[:[bq#FXpm FJ MA}%ON\{t y}›DOW~'ZoSݞW],鿍eb0oF&Uta t"wݱ~k֑b`;D{ݓXwڃk1A|4I<+=kX~,uڊr!F?:BP E \ W y]Fpo@5d/.S 86GTdY};[uq؇V)˰.,}BGiPl<-<;[>fN)mjQխOZ }%LAs)eԛ.3%~è mc2&HI p]ܻ?{;lo~pg=J^~HT<{|^(lhcI|>%$s }@0z ,]!ćG".y*^ Q1ɮQ,wA `vUЍ=OJJg7)Kzb]c;9<\v9KvwkC~r/Z.'S]! To('ǝ"cmъ{!}?_Big%0C?)կ]v__g`r!֣XIl-}WHVw]n3weU4}X;{(㝠oS;|]k:[nK%Nq.ԎB4HNHGsiotQSrxK5{en/y ә7Al=n`^>JCӺu{PWv6hՉ߇c♰bY c!}C+P =<ݟ|q4ݠ#&d<_M cOS 4/cj,p}bS %9 ϯ7H|M! BiۤC˷[J~˯eÓգj]sT#(v5uzTzx}QMEKGz{\nQ9>NJzxץJ=́ ~6sW]4? A 4 Z )28lecf(k,U(c AXAJ}Zw{Hեø~SG=7؋#Δ}PnH t8V2D\hi=q8|xqW#@rYޠ`X {#<א9|Ru_3*2~N]n)gRXmGN%؏j%|,6M2=LIs3=GMӳ,3=KMB33=sM@37=y5=]LOlzMO3ӓdzMO鱙Q$p pp/ ^y~-3=-Op p?-!+ܷ{Ppw wpwwp_&..". >٦sl%ܙ!a!\> ܶn@pl>A0FA ,5IPM'Yp+(5TRSQj*JME(5ꐆiHiHiHF5׀LpL0lTsRɝw;'sA~V+|XT ,:g RpYR= nÊu'd+b"@&{ lِzcC^)'O3vG3.$|̸YN\oh8#<l0?$#g>,9ƠC!BI ڳ kXΜF ¼խYz-;+ :k\w@ֵ07@z Z!d\hjDH~#l7d<2Ym`fQV,r?D<-kŭ yI0[2ݐ e4#_!M ٘ !,Q},MeuX] /c5 |X/:?bp|18P z4rb0"PR}0T2@(V(eR7C$?-}.}joe׆< Ӟk>&Ix|Y>$Ny5]ѼF'"><\TXG߽YKSo9cv$pXù!c:ɾ~j_BV}R;KHvzҚUųӫxGj)pU* )]J~aUP.JpXzTHoH]"MY}4PyUWE7W/g$/-B]Ū=3ODtL:".4NJGJ5>Ҕ;d Dau}Q'2,kА* zSȐ0:@b#4y;tm{HF\9xVJO;S/:(9 pکwb`[vܡ?ڡwr}f7RR((zQ#J"xj_P/X&7)k42Ƴo-;tt˖8M6Iǯ?,>[\Βf֟_,'pAbGqbyD],KqRx:̓kےfrR05 .Uެ5o( `hY?~*hQ6C i~ 4UB/`hEBe<@%_7&immgORD:5j*k$/Xxr-YlJ{%Ҥ?K):*dggFBF|F㌸Qu23jfd2 92rS{K%5s(wےZd%rTϒ{N-w`NIZ%l>se^Q݀y{rq>T IVc $,OHXP5 6mf:%;;m|s{-a唸zD|$,mNIBKۢ_!?X;w48e K&k*.K[ ΃skp|N88#`X`>悁`@o f $`:]?~tuuSG#\\\vtpzɵԵĵصȵеUzkkkkk+esζ\75jFi NJk$"|%6mꛐ4O&f5kSiLGS?˿M ):x4hPjє/%7a-3KtԔH\98848 Zh!1qYmԵ=]6b2-5Kh-BBb7Y;&%rNdӈ&qmZg'6HhԸ6^P2Byk;? &S:ZCO4*$8=>>]N__ѸYD"!>_b{?9hf!ug&'RNH:]ʴSX+vcM bIGrmX󠴦Q)!!5rJzcK4{վIWUEURRiqIzJrYmdˋlIe^dɲcyQl KE'3@2=@q $gah1LgrUi1g9gg{_ջxR^oIēpy<{3Oykxɷ[dkE=7.|1֟i- &^9DQGI}-kV>]t``zm71ϚX9c #l"( !D/JMQ`ibqjtJqRR)ghH\UA+}5!h@'VP@lUBLp#}$0A[M]֮ f82## uF,.hZTZ8 s\mö;\~.V`0֟ 6 M\ܙҶߟ:]/"{1O1q=zWW%kN/nsV\.t}}Zw$rՕA !:wٞ:ҦwoRDGeHj9 Zk4-W(,X/GQ/Q-yXt*+sig\:(A;j=1e ~7q#G rCza/@09iy>7-Xo䘡sGohd dž2EٞtKQvO*f&<0jGC:;·r/=b6m;%1F"ajsת72^&yx(S]Gmy-6q>ϭ\n{W@%9#>gCY!ފLcT FfsI"IXTt-X؂$}<:=Yͳ?է6K('Qg_xeR{)P?.p~Ǎk,&y]xHyƑ瞂H&l.'MݻU޻h/u6hmkoܔJluؒ]DU}WƞTg{WG_^o?7||Mi%e ^NEu:_uŔvdv`T|\ A~JR4Cf"o4FSϥV2ʏ;T T RUO$jR٣T m`dFe sb6v߶FIT>'/Ug+r#n^nx'KDA iHcFC YсmHnO+$ry3%HާES{!ףOV>crQ~ۡuM{R/~hzfuۂ-=iܼ`?ϲ4kN""ܥ UBL:!94CDI.#TRː-6CfNpd*?q!Y @+h/3yIMRj]Cp3?ikUeյyR}qsPȧ;̶eK/Ubf# ];w-N].-޳nskv(SƂ-'=yWՀ\1 |PsY_pk_oy[sELt- T:ԸE\t|sG_ݝvwM] սEg#i O@2l*-7,CqKܛD9"SۛD-%AL]g=iӑTEB/o:LԔ(mD\Os\ `ACAN<{iyvSϬ[FQkgIՠ1v 4ӧ3djo{t,||0e5e+yOtd$dDEutl1a?gofH3>gpo/4֯T;JJ%%NWSSG s9ĘB"1' Q@':ᠠ BgCn/o.An^`  IN9L!)"!#gjuQb.,+K^{~Y9}olѡwF-{fR6KdHk2U?2V{}lH[]ֆM~c[.o;O]uחW}ɞhO2h!rE)LKHHC8PJJU$)E$UWMQ R3ͫp4_kwV7$ʆB2$yExOrfr,^:QԤ/% Tʎ=)@K8Ge疮쑕 h9MI'f:BZ]z2g-D|ؙ$,\y*E5a6LȤ &]PfrWOu" kU PJظNar;'DNGsjWUL_UNvv ύ FLk]ށbW(X-̍).w4jL^oveS}v3:/#r쑎ZΪ&_!utVdyftТveIF05Of" ׅʉ/(#M4)O\z>O2.J(˂Is7$pgVOu#3O?C +S6CL$oo]LhƢ~_ҶHv7r/2ÎֱEE⎶hޜ̌L;Wtn]=R/v2DC bY Yd8!c-Rrj S ZDoa=B>S#BW'.C7-p4=ߍs?_k~ k\bT F|P!R ;,IG8'!p6܇byO XzR'd$K!#rlJC'u)jߘe9ʗ8WRcf7/Nt. цꖥa-K]4^\Z{2uAADPc+vFWŋy C?;-vQ63K}:FrVN\2&.֒2V-ary2L:$/ K!"9Dy93)7*4m-Q[2RiFv<Πd,5ޚNqsh(xKX/:(`hWD~-g L-JSVKM{Օj#5KD]6C?-a v{0NEI;! n(]X\m-涕zH +7 ˬmo:miH?t n-iIr差ްoF襯Z éPYie:Op#y͟; ]ɖN!EPQzCw/,,JȰ$˨2293[$ju  1@Bq,D"z1itm"&++$."PTk]j?U$5IuNv]]m1궚ntwg:_H, "/`qQHx֘xJn` ~{J"Brs1D0>s\[#^|\6Jβ}ӥ2Xv|-зU`iܻ7syV?.,dߍ{b)3iK5ӏW^aӞ8pRs֨>{O>;;@r۝x)T |9}.W~LY|<MsDoqV/ # Rؿ%ؕ9Y>5zFWUyb/<8y|ϑ{v.dj_JZ}`]X\}ǛۛSY1g0XO'T .Z ԍsrj+ee>$ϜK;89ֱJ݅KH$%HB89"LtqF#g@DJϟe|^ 6]P4SLM/z\wi;ׄ[QG2W8<ӎw~yZq&wt[oP5K}jR:q}cCp tIU>/(RTjcuӋV#Y7{,:P?Dgx< S*ˡ>8ˍ2*Ѩfj ߧ9b=`*LC\~I|ӭ6zt|??Hjoo 3FT97.U״gIPCzf`WN,skz?FZ|?ehw[U>|@@_/cЧz}q(WN4A;85Co vF8cf) u x> aqВ:"Or7 (4} p ch ~g7BV].uݰev  FQ0w`v\<>Fk#ǹ摱#c#\֭\;Cc6wnx'74l|`|h'7}C`DxȮcC; F`RԎ:P+ĸ T_{vNTJK x%%TN ވbx+Iץ 䂛zoב/Z7h|an`] endstream endobj 390 0 obj <>stream hj` 01 endstream endobj 391 0 obj <>stream h޴[ M{ p<8Fo23f C1Aa0yL^ 7J%J]TCy$_"KԽ)Jܒߵ>*svQ&FM٤yΓU pć#/&Rj뇌:jNlD ݇2DZN.Ni[2􎛈FKX{p때zhngE)Q*vB樢c'D(]4j#M Nc shAU/QFưGY FǨi*iSTMgf)Ry*i׽MUhk9(#acDP(yo !Ҫx _+~0/W#tߣ1=zz/$Sďo9mh"FI}bIt=AȔ2z^gdxZTQMcBbR@Bk %׷yn4$FZDCehM- ˆb&-E h@|WOnI)=G\KzEmNDJkkJTRmoOabWiTE:Pc:Ur}%"],࿧ ~`-۽[v.Y3;uLvm$U͛5mҸQ7a'ԍwש]FjUcTtT83.=?cY= tD{/tobR+SݢIA#{MmV_FόȽ&K] SK?OעbAn~'+_:fx&_d_"w.+I=d$Rr|~shA }0UJ«w2J6)V͒b6b ֨Th*M%;|cک[ x'x8Z\x,ƻKݥZ (m/ ME* CJH@cʔ mTrF}1bEx:oȩ|=^EUB L#tXp3SLZ.K]<zË=EMVe2J̚=" ]%nܝXn%gosG8G YC&]{zs]P)̳XyV?s}dgz2 KK3=Ңr>{)- /Q_AE.3sq]X+$smV'*]Rd dW|@m9~qJalN.w5.3:YY W> JO4$d i3 ;^E4svNw@fJm:^"g?'PЃuyK+ybmHK[lK6WNg..&B^WV<,cF{M==+] NA,8A@rDJT*;Frg;-xZeP\r빡LsY+x &ś-2Źr[%B6JwCȀ;]"tv"\Ov"CE\ǯZ;賱^\P&bVV|K.Dܘࢿ /lZ8lq nbAɼd73ƭxg+8uSv6 TqVQ攥* { |a^fUQ !/(U"U$[D([AkU,ږJ4[j2A+$Ӝ4VZ?MEf4KȈ+ =Xb3Gljm@lO{2UO2E5P43̓&;V!4l8ꥅ|r)b &974!7vqW,PAEbb2!˻ *0QBP"S* f- q8f^i0р }(4[mEGM JcȃAnp[A=_J[]?X"egu"B͐rpXc4k2.0~+  U}W4SN8bв%͈.E8V0xіS&6Y1p)A<$tT*(995B&:#n]3"@E"qF.EcZ6v ,b_Vy|u%"SMkA{oޣD-fIkDu)0! %>hWh6inD%]w5ӑD|6vhϲ;b|zsj*x;`s _ns13 ~RZ3c/RwIk̗h>j (F, zjoZbiԇErț^,3V/k\c@\b<7^e1r\c u>gMCf?_x[g|`OшzJImwA\Pmw^~^=I ! X? h^~N_İ=_ )Fs#b#wb)Z["ʁj*Z3Fd/g'h4gxnBx 9@?ߞϟ_ӞqZ[sFW~ C?/<%@YmV]O?t^C?*_i0ҷJ9UȡV ^9J߱WYu8my5W u?2k-z X6s|e/.އ0 6t#وOAE%=ZhoGMT4>M(a@6;kj"-D8XwZYv]"~Ax(ъ+ ӈ7AIkg E^7`->"~&@*Tꨬ"MMKԿ1=dN{h6dDiTMye|'O(M'u݁@P v@ (fu>5ֈz,kʏN^^TK7&/]ˆ0%@\ڄO$}ѶhN3uEY?$8BNR!C&2*RlEY^#D$MѫalzK9lu#Ui=_*<>&e}_Se)Rr-c=z>3z:Z=BHJI Cg_KGԳ@Zz\I;KeGoh бύ}H S z5+䛨_Lӥd{ z ˑ[v^HOs_p L/*}ߨ6Z/[w?t HܭoޣG=UhAIE"H? |uF8`0 FϨs ]F'ҍH{pЦH Nc57Cx _ƚoC<֖ZYDǁ\[t<_"|4WWjRp4Ҁtր >N"-h1>7Qpě͐v8À*ОNi"I8mң@<0Ih65@SL4bņR&jwGF_Z 14SփhƲx(& 糂w^{KB ld _6DZWo_Pޭ[ʝ6عbΊ[>?ngשmL3;ko#5m;Q rýGu{CHw>1m:P1DH}'^ZcR`603CX1m`b@ih_0χA'mm׬ ZWs=Za'=.g)EJ?0xv{<$()s@O{BGm '| &g$w,Z @q6UZvU h%-\X1TAxXl劧lD؋DПT@Xxa{\C_vZ6/Xpx ! D`lQhw_@^pmUA`#(i o/*d">um߬ʷi5\x_9cj{^.Cx#py3 :PޘjNSm6sf?hL>oמ;fuq˖MwM/'i@Ow+&hg[|A3oL?.i+3.׭}/qW'S~őH߅4T=Q";ElI& 8hᔤ Đ) x6R,~9}+_T+}:-h2n/^גK]~ŷKy9et%=>uVg=} G~M䷾nZ~l> `kF{ŏx̶q`W]C;~<5֪vå}uȲn͏{ZjOB0#.tq۽y>:iD.+4S[d 7l-'qSwc-Ƞ{6kxaHEX{=g [Gk/}n G@?~3m砞==}7 OZB ѷHyF2&-zauP[q&}9=uC^>J*jà}ar6;1)(ڱzb@6%ھ:߶3G%8[—{.o:l'ma'-߼ݤJR-C~%a aguVuᛒ} ;~4ږTu:+XSP.Q3ˏ/&Rzy?{K;i6&6B!Ao")~߽Z'L|ry i^7l,^m6|rd Z-|Ri:(-O[ X^?9Ҟ*7ں'x *+*Af8֐k.|acM#zK#V|2C^OAwYp7UeK^w-%ޱl%h @fh)4&U_El&= [kvvC4LjUB蝈kW|c|/w|OG?%N8SimY8xk)CϣnZa\ڄecs c1zcQL/Uc87riUnW+ib .p1^>]Z^qb\7C?2zغ+籦Ƴ'h_wpcF?M!8j3;4pҳzOZ?IDK#љ^׿>Xg|C(˸nM!<$SI씠o.($ٌ!OPs w !9:dm 1uf 'o#w El:Fp^ o)4~\u Na}7߅q-PF H1[Ɨ} wc~JĝQ] A~߉]r5ݍ'!w@][ ȶamm!C=6?d[_6ؐ(z]TFjg L/OSl9 2>OqZoJt%(IT$#K~BDIZ~6^G|3Ў(^ {z3-?(+7dOBIo'#o}cT7J'tQw8G 4C_1~/!  oP 7(Ui3a'FAoCiJ =vE{@M> [m_ix+NAvnXO|Bѷx/﨓|`s-{R@"=FyO?1\tYbllJg7Wwz}0E+C&0?-?Z-^nh(7a-uCmU?ud J#Γr6=Vy7`d3}h~<ě+Wb_6xh16fURaYk#}z ֦4)OポVBd/׾5l,V G |n0g܏7տR/I4ҰsRִHS}'ԡ^Yϰlva9U=GW4UA*͆}R]ZX'Puy]O#= |(BXm̠QVʭL9J9Vߍy2!!7hs@uX)4kNu?Eʼ?Į¶' OZa} 1О俲 %e1O%Z]ADv؏w$ZJ3K@Y `''@KvyAE8X -) 4 %uMRl| $ZRW42.v Bs1xzUZo@s+?ZrnpɂˏOUn$6%_Z򵠢S*>mef`M =u?"#,CY(#:Pf:PAkU  թYu6ݎtIȲ_=g(Y}DFDNOWpBh0\|{`Q_l_ PcΦq>/~B{E}oi"lH[o: Rʻd^O@G=K=τo"&hC`**^ǣTv@G&p9'v8JG7\p`lŞE@'t O xZN/9gP;jzQ[:lϖS~yag[l&?ޅ>I]5@+KR?rl5ք$|4tx|C;_wG\_ZSsM;t h4[=?7 I(øb SclŮ%:ltJ4W?]1_gt_@=OQ{-4 c97ާB ԁ5 fU#u>RN54wcu=E3E:XgmO_ގ&U/QXjSU0~M6! %whM/&@80i$`0 iUͅsnp rag jRdsm w4mugDڝ"Hr<3LM&Gr(15=]ȏɱ(a%%H<‘gpoiƏt~TFzg, mKүϧ DϏ7-T'NT2`ʕ?>%.$hJ7Y<(02Vϴ"$KeFiҠӎոt3` AA^"           WX*%(.ZT^z Ĥm_P_uҏ|@7zFW}-CXnZ˾5棼׀ArxQ- ui2*.RGYl)A/5C aXe#o.DŰq.Lm^ޛ6چZ Ϩ#08)rA svЫX{VPGk[]N\-urʖ}ɲu״:YVjY\oaolT^>yJ-lSϜvYzo1a 6M5l\[o}Ye|r0.?0pKLP6;mN2S5qo7yw"3pZx[ܿgI3|\>.Pg@zp %Ih|g![wKqoWZ;V.M~Ɖ3Oft\[ endstream endobj 392 0 obj <>stream h޴[ |E3C  C2 !$$JBN9>E.+(r*P D.A]tWa0gh_?Uի^Q%Fݬeӯ#K Șq1bˈ޸LzL~9JZ"% 3/Y+"=6K?%ֈŖ_vJYwo웫|Ox1L·"j3!6D?C"'9qp*6uGC6q;(cML,GAN(Y*hU#TMgfYRy2i׳I hm)#ac}DoP0@ "j{ |5DlW _,dY1*29IxgmI݂&")WzDi=*ƙ@nI*%zN,TO1a_*Z?lpWZ+_ߡE}zP_ѯʤ[ߓj ZN= ~(=m.I E4\h4g0=JO3[rծ%jڱ ){һO9RCJh &Q!]ES5밇TE_bw֋7A?/ONvݻetM9S:o6[lѼY& ƍiU?YnڎZ5cjTV5JdDxXhHpfSJPb<1i#=5S=.H'=y(l,Uʣ=T5SWn %'y w"{X\XTpy8su/(4΍uEpPS+576Q{ 3z sH?7ȕvCLWnl[T,.NC,(!#řp'Փ# 5@]$@QMwˋ5E=EzSXhTsG@^Yܴ.9{{ߥ%3{)nva(+3EGQlhJ/.Nw9Ӌ J.g$4x\ZS黖8z)۔ YmHoEyBJ:@!ج.D2ą!Np[!_L[]k8T"aeyB‚=AM]eᐦhlyyelU}GzB0*;&Ƃ0TQ=LV)e A˖lu+1 ŕ諌2IqLJ6ovM k+6&9C&S^qN{0\\ls_0?m ,IjD%m툂\k\*}zjշ t 6Qt MI;HZ@mOr`(CZ37R#}5ҮLm<I XiAjh-ʴ|6vk5ϲ1>%5c  \!|*s >vUw@HB߂ 9M=꧵2eW|֑znzO=B©֖%PBX8~u?l 5_-㩀zMXTqkΚ0t1DHHϰ`Az )q <;bU*HzBA >h1(ր5bh6 RD|7EY@gDQlERȢ7Ui_k`^ʾlQsΟ㩀l1>Zr@?vȚϟԞ}~Z{[sv&|<C/ׁ<UGX]VH?tIG?*9i(sӷJ)]PJȦ#նXCzu/3:Z*zNki6=pZJyޫȗ׽W@iH B\ħ!Nwȥ+Аp M5V_ ,ECMw ^\Gxo <l݊9ě!45Ⳁw#a/@ ht/WxE5eL P;Bt?fBFHB577iP,TzD`ܪ~ a@1p/ŧ F^W~ W:MU_EuԷx!h2F4/eV{Q-ȭG,!o=+~nK5ĽwK ?(i=* [:7!CCO/ӷ(?QmwZ`9SZ_KB7KIn=Yփq9UkOkԟ}F]}#_= )r 9k谭;tsvds[Ԕ}|L/Y_-ﵥ#_ rr:7Ҋ/􅱒J^=@0]@0X <[0jd&qO:Q!x>>7-CQZ10FIգ61βI4ir Bۤ6AZv k -@蜭`UXI+JRo.o^O9 p4 Gn`Q'AB(Hpo 9ƒʅ v"P͛ՁV]i/?Z37.c gYCg#<gs,q漼0^7їy=M!?h"^K5ދzw ]j'u;@UPp@//Gڧ [$ɳL彂㈰qݬg7͵.CZ-ry7)[JXZ:0{_~W+ x \FZ<5FT7sTǣ͝\]a͹yO#,l9@=s\Xyi<1h 3I$,Ygi,O*u[KGթn&}w!3A4]ERnyZIz{?FAZ(%h(>^C6z6dON3J-_>|m<[,ھ+ ſ ߟC{ϯw"/ 𛮦C'h^;m~[ӏmMaPwet,~nv@X[}1Ӧ{-? ~#jӿ?~RhŅo^潏#]`?lm77EtJ=hw;}"mcm-lٮi6~oQ䳅mg==y'b-Ơiۈ#yS;C}U.:m8>,>[|;突1v⮯G>ߺ‡h["X臿c$;xhZ5 tv|nT_VOs;>ڛzu>h1U˽Ҝ:Aح|.Ɖی=?RO` ͗o]yUڬKtZ0΅lZc`zI_p{*R;|xhxUн֡nź>|WRwmVOl#8=er372,E6@~@OwxWqKg}ye+@gKr+sVv>xrK_QT"ohP[ ;j ߔSca׶ڨU)z݋NrZ|]>}pG=:-_dn[>T淗>+wR,>LmMCD>ݒ|{T3@n> 8o8~2Tʽl.ۗЉLu{L?W @/YXNp;n~(iot;IO(x *봅F dzVkL+HbO 0ֱ H> /0փ2'EX 3$sH6fhҏRm5O1g}1NĵmJAKmSW{WϊݠydZc{&CN6^zJshQFU4QO[qLMQflqF}h{V U8m1FD# ]@_]M^AQAѪj" k866]5F4=E[}^F#o;L^fEhNi4m-3NЇFWzCF#OĞ6: >a8i.bPw(vb~֛ᜁocK[8 jƋRT`Wh/F^O}R:6ߴ'Cl4=_0m.+le^AyGӄ9dX ъi?᥆rh -^: 9$Ve9)QVvI|$۠CA'!\٧ Ҳ)8A䟢~Θc70ؿvKf^2QX|Qo~/"%BmaePGROA&K5Q9 zqg~@%C]Ұ5X8?7DJ2~=˿fh/E*Vy&?i.쓚Z$ֺ6:jͯt&χSԋF,1V0_ph>fWq6zjcTݏl =2~Za=mXqc;bomDj$8l 6R6dR-OaM=j-CxYJ|o9X[.:.qRmSXo9퀬4lݘnL-2wc,j[ǘը HahPgXKrp.<1v<ިy*^M״< =݂gݩW$s?o|mٵĴٰ/O׏MZפo>>/w} vr-9x \|,U:]P@+,U6 zEwe5PQeeS 84C6^`me:V+GxZ|`;xH|2w?X@ݷ{@-oyqF?'G{16VTQ~PW"T!pڍ@~?J<@'A76Q~(9 m`c`!Б濲r5dO$Z>н A;V؇w%ZK'@s9,`~@VyAG$6k )4ht5uM,tB $ZSw 2.v @K)xzkuw?Zo@s+ZsnpՄˇNOUn45_J?Z3>%6`+ŢBIloaNfVQOe`ڊ6Z Sg)uWG)ujlmt:sAr3]lWuV>Q5@?}6E3L|ߞęԛC(۟vT~'rϫ9{>P?[ZL!RVoķN =?SQ/P/?~DsA.;h10i_iqj`|Li-vR@C]5@+K苦R?{,M<֌!v4tx|M;߰F\_Z};L h4W=?72:(KSml%:lt*4_?])`t._eCH{4 c% 4ާ| ԁ5*fUu>RJɬu4w z=CE:6Y-KX 6jG~*W($95jv?3fVw̘YO<?cg5c9j=2Zt#3l~Us -Z0V͉է֌۟4NW;v'(NOHX -U}{ժHˎ:n]jXԒFlɛlc%ے%^ 62`Bp8bprsMBHyy$Ky5zhNk;ZLUwuu5Y8;N~@+ǩϐnX ab.| ̆͝öwCx)eQxrSo 9xzx`<8i4v<n%ff\EL91ݔu8^ s1]Z?N6t46ۗw=@bYSX6:[( uV(FcH%RImRTiiE<NԆi^0̜J~*JA%'j\^S^QJI*rtrBR1DV!gQ8^s k (ӧ'%r)J{[ޤV{ԖT/uE+ަN^H`ڈ|XEvTz VNg4y1;DP4R,%@ RUьJa4T:~Z8aRCΩDPJXh,몬!~i ^I4v \+Ҕ rM~o$I⨬C23%!$ *Go[L$Nj3Ka~#oSBe{1KJh$DKK8=LEÁx$аF3z8>,Eьcad6* P &;U+L>=;ػ.g A +5 JW9$c}*Y\y `šPa m1f,jٱ}XF+MW /j\J%KU*OXP GGfߜKI{H")ު =|/߻5X@(+Kzhܖ" jJqZDf봛 p-NHR){7߅*-(K`O!LaOY@6SW;Rk{sJ:׬ʴΒW@:M.^|`$oUBrF8gcUun$O sF佚a&84p0N8# OF|6FrDZTBtc/|!Q@pN<݌ x b(LJ4d:jɱ0dЏf . X(KF3⼕edy 3-oo9D/9``:+kǕ%xz= \&= $$ l:ϯ~.27Yx/{(l[`y cmKnM|&yiC+8n†F]*EBhF8=i0*q,YrӄA@ Kr;gXtZZ2=Ζ$XvrZ|R,FVBЮúa;mG kXP+ ctbFWiXXիrܸ- ̵zʏ/qy.Z D|ɠG:3_dP6Y}.8pE&$VU͘\UXThit4S:3hIXǚVRSpftܔoOfA |d_J\|hVqhuWtP'dȵ,rΔéyw*(ǝ_* EKñ0_QB.UJp`D SF| |X/4ьP:] H3~ =|J Tw,,6Jf*txv Yf>ɔ>f5ک>1.V&85_ڹLxu s_"{K[6lJ\k__=ܳ;s5kWU&nX_7U]MeK2[nX盛FB\x 5mOTJQ!;MBь*Qb\8L+ V# 1#`c|)F1I)iȝd]yfx4..)ֹ}O${Ý5;"~P˒sGCkYR+'t^[G- ,Y`x͛ gO^? %siːr)&;1$ETLUJ/hHքfГkg 1s! tzV l-7]0hb(o;hG^:1w\uvն=U}ܵBk\Vvڸ.ɔSRMl!7Y&Plus֥9Rys@WO:aYR9pob:d0u*UIT(w()RR Tb Vj2,VufӅYTF?IJ'|X Nb7*JcU{aNvjK`?U8Uo|}S-}Y dϋ^sJ:!\^ub?,ELc!\!:N:m FZ5Q]DjZ|%P VմzPK/U&՛*W(7uk2ѥښɑ{ 8kUވ6Za۽BВ6)r%%M ֋VRe¦-5SB/XUŪgl 0j j<—ʒ <n]]O?gO۹ֵBGz6}w@*-クeg[leBVV{EDO:e1AjX|/kCqQFdbU !s/\z:Sj^|hnT" @qsKBЬw*̃~,Kf|ySN{ B{/*vhMH@@&Bsɉ]v"L&>/VU8W- MqpsϦs2iEܭѨ28D &mHN .'"&çOqPL,q~Ly/X߭]bH|um"UZnO &oϩv<\ ܮ|7X9Moem6l;Mn)aPrQn6~xA,A0 Ngb+fh:6JX>j'WǼ__ɽOjH]W醧ۻzdB\rbWlAM-2uǁ-}U`'V@6,`En1)[^~6^D9ӋLO2cHeE%12$' 6RGO_wl8Ѷ2ꉇ-[{ⶑl׶}D [={٧\+~Fs9t<>Wk-ng zpv+)C FhRsVReT 4S%5̰BJ+7< z!Sl[$5Y\0Uѩ]'ej[9oJ*0%s,KZ5R߷ıNNVՂ"PU֢V%ɞ|j MHZ,!Je,cUhuSB>c-S)go`a}w V\`"rZ/̛/]TD|o\jS_{%(X]M"KElEZ+І3 غt& m`K"1c E()b|*zTcZmz:(lR(̤*;ȧ,Yd)=!>&Y*/y`C}M%;]U$:{fo垆Ғpݍڟtg35pK{k xʩ!Yt= )F#ԩ*R(XPAR"/Djbӎ[Fh<#-r2 %f%**Z{m D$%p \ZsfM%UJZNg<LwMKH_J7{7wC˪k4:?!3CkrN9B RMB 71fM Jczzݕո֧ J]48 QOK{vђ[멎xX5 w]M|ubPK{/ݑ2uٚ`߆Q/7wLfPR*,6r-A)*a ݐmPAp=+߰C7a+[ d[wn ֆ.鍹wZ&/~ cL#8dT:eNX YL.rCx zoNc,TH3S, cٷl 79W~ ~>95s`48>0̒ -PeAT<{:ywI)3 Fbu05}?ܽ{m%c /!6g4#MR`Dx#7r_|tI"z-fo AreB$-:!dVo)s%Z9%P|GnSce59s]ĬAA0(A[)x%N+ըٙ#ioB@;LlxGIx1R=Mh|3{ރ0-'Zf|#hk',R TNQ)_4o7у70٬;h4,dHoX !1SƩ8-8֦4N$;˖v2 fAlbfl, E/>w`3uupB;zuJ7>༕֜+ 4m)KOb?c4)pJ {e"/!1T;"2%g&X2Gñ4%0Cz; =4kCHʬcW; CDeaO=`kutS؃7 N5=x鶦ACtڞ/,=rGĆU7EbA{MWC]7THl'G;nٺMش֎u 퀱U WNUp$H&hkC! 4^baE bIZfs+yA̢T6qmO"!/wL6ĂTz+ >¦ vv .9d=-Գ@[DrG #ۖ޺ew]ݩ|P@~?[x5neKmʄ*K{7={dVN)Wk &:"YDA扂4!a4{$GHlCHiFHeDHEH#FHH d?B5]i ,B?Gu![y@VJy @_[!XA(2OE*RTTjhЩ2HE*RߑC(nHE*RT"HE*RT"HE*RT"HE*RT"HE*RߗRZiG|Rb }V/&2aojVS SH֥)kCzd@FdBݏ3? N8FPP UG h7399"ɶChтZQڊSx>O<2b@n0?l!GO_OA$+c#re g2re#=d W&$reBO2B|(G2G$Ñbځ6A8~@3}P(;߭p8> mkl{.쁖 p6A L^N|?7WٳN(36G[܎{~uG 3l_hh10_.6>s;q#1cPdZGq&sq_w ;w۱=ۺڷiwWoOaYSSkۆ҅][?Ip nwv9{7 8zzuoq`̨n }۝ЍsA``k{O :>{zY-CMp? Y\0Z]d3Ϣ2X,|dBX%%ܹbEkxx}C!kwo>~pew]P+*} endstream endobj 393 0 obj <>stream h Xպ2&kR+4&Sf(#(*(2#" *{nuzvoEu|{z)))))))))))))))))))))))))))))))))))))))))))g￯REEŽ{?7j>4*--]|GR9rd\\d& hVUU)V*))))iٽ{w )i&&& wRRIIIIOVZՒҫzܹsڵkn*))ʊ{UUjnc_SMhh%~>???++ P(++O_m%%%%ԉ'"ERكB;;;9D֭[w޼yD0Luedd\zPVL?_XÇMx\\\*eY3(\*)))~:/5jmwKKgeeO@Y[rlҤIppoh׋,xy 5jKɤe~W={ur䂒'ƍoߦUxeCȠdIII˖-z衇8+$ÂĒ%K3`aaZG˲<RRIIIЖ-[^#A8(5z6֯__nȑ#>>>QQQGKSy=s ;Vn7kI|XI2ᬤd22|+++믋 999emn:9F!Zj֭Ν[vr3&'%ٳg333(EJJJJ5(QQq"~a-Yi.bRRRbb"kY^VVA!7H7Pzxx,[l۶mY$b1FLu O!vf "ϟ߿?X$A PݻwXVIIIɌt…W_}Uu!XI˃wVVVTOaaa>}NJ!HFFƌ3ettx~,S^ .];vDwy'<y򤦓kӦMw>z('++6T'Nxgj֬8 C``a9~x1jgmڴ۸qH GdSyye۠A˗k RRRk& .-KJ!H\\ܚ5k0P˗/SwHI1cdžSJ666$THHȴiӼ4qUm۶f[nt#yUh rŋf;uꔦ7߼yewIkvӦMfz?C(J*)))Ք]SL5jԭ[ l޼y߾}ɸ`PR|R!%Q!ܹs}}}GA # _.^q~ i4h"K |7wuJCra۷o/ډ9fϞ= W\afxJJJJ5"JKK,W-,,̙SUU\-[dɒ{nh_J޻Ws6_)ر-,,^W^)))䜛˳+gQǏV=-- SAr}ǕM8<;99ڵ (JJJJ54rەyb.=<<q7xɒJa$M4?>)) /$$Wzj8KnPyʕǎ"M>0 .Gўʏ{X"lF56666P( MӠagΜu…[dd$i<==J|ʊ ܸqFSSS!ݡCٳsΈЭ[[lܸqx(p~zPKgΜڵDVVVVؾ};&R"sl/ԩ#M6[laBx^qلG]܄5 :u K2t.%%%?둦䫯zU͛L߿!.2ZkQ]xq@@P#>A<ؤI[jFׯC0%*MnZx VDHNNd$$,+wޑliܸٳg hcc#XJ^ii)^4.]YM˗/+B?$PTRR?"܍=Zcƌ!/jժm۶aw(PVV&()윖\75L6DA{l  yȐ!"ш$ A=z& ƍFӧ{XLq(YUyll7|8srrc${]㑟9+zJھ P-GM4U~,X.ʺ~:T^~O*))o'8g"8;;󽸻wav΢؂c LEx嗏?Ox!Cڶm+ vvv+VBj^k`F7n,w'K.g=N~W%%%Lx^fMM`` A3fXpGr}[QPBڷVh((SZAnݺÆ #y&>?FF...̯[*Ʌ2e&a.s O8QbZhakkrpߚLE'O^tڵkGm*))u~JJ4 :v?p77ݻw/.^_RR"p8Cʍ,rq㆟. t4hgy(uȑszG}$*lѢEՔ!24i4^Mo'fcǞx_ D$qesH/022_&;y-tURR2W\v4%*$$~ҥ|#Zwpu$tnڵ+TA# ݻWeuև-q„ r>sbzd!&WܪU+XFo5F_igg'vLÆ m짗ikq!]E $骤d2vƍ'MOFtxxx888\r۶m'55C;TQQ-O8!=֠A BEE>zիWE3f̐ _vMɕv…ӧOw·@.џ/];DgΜy¾ꫬ=xq;v2" k8oHw)ՕW|ͭ[ٳ'11JJJ(rww_3M>]۾}{llٳg(%@xHnԩF1p|M… .ڵsrr0eZǧ~:l0~g⶚5k&vȑXeIDl2hk֬:uoXYr7772aEscǎ;w#iu4d2(I閾@b1PNVT?;v@kƪW_hMt߂!CF5zhq%fmm-ְNs+K aν䲭[ L`ۍǗs℄L<|AȕyJΝ{Gj׮`ĭ@ɹsӴ!.2t֖X~8/ &o Ǹ'\/,7?8Ŀ;;;y&g1=8P"NF4*A{UUII$EdFww9s`p}ݩSrrr(]{hH >\ӱǏa㚎QFG"n ^|W^rN4'l\3f͚.ΗZ-uEn<,0`D(eW^gAz]vնmh_}%%%% xNpeggKEL6 wÏ۷oǚ֝۷oL =L`"@^;DPrG A-ok׮pI@\f &lm'OD !={$cƌ!O4#Ν;M6$O> ҥKbb"N8 e/UTRR2C>֭֗[:tHO7nt?>??NqqEO?TnnݺDt2qD&*3^ƢE fjTx'D"#<"jٳg %YKHSrʕD(-)!af7oHر# a74h G+x:,$OWK*))--[Hnݺj޽SLYlɢB#***^'uss6mHlҤ n^Λ7oŊqrL k]vtX <d=˨Z{&FڀTѺCBrbaz뭷rssuɓ'Z˗/kҥ脉׳f yR}T|pvvvK,ٰag,AMvݻw{yyA;wH3wРAByyySv & KK%%%AIC=aSTTDm5k+1 0T:Ÿq@۷.] 䫯˿O>0 HV`;v sRrwH---I,,Xa$"??_Ӎz7*++IVTM7*0lmmݩXȝ7lؐ`y^u@_61cΝ;;~̅I?TڷR8::BdpC@*3ctOOO[z5ݳg9s挜ESHnSLaZ֭[ ڸqcI 6g.(qfլY3E4by|q(++KݗTRR2GF2 c6mdoo{Ǐ_x*++ywNJ01##CPstp >sE.U+++0Ԅ ???sԩr\Mw%*s>>>hmۖDGG NMMWg%%%%AɵkJҥKIIɡHݽ+%E,//oZҷv… RAaM?똵&U"?/Zhƍ;vbf&N(jǎ\()6rSRRX$СC¶kN$8% $~U"""HeLnnuWTRR2/ׯZz>і-[&Zw !tJO.3LD+ . تU+}Dww(q;)}uLKpp0>LOOgd&ٴi:^z?g&ގӼyXw]g^rE0kR JJJf$$ {뭷#ZM;w5k0Ga"LnJ"̚XQӱ`81.[n"1̩͛)~cE+FP:֭[Şѣr0Ś)ż]"~#"''g...vJHH`I_\\\Q(dN2(yĉ~Z6ZXXg2+pذaa3fPq=6zJ",ĖW^;w.z{{c*Y'[\Ÿ|xw...LLP7}jBbٳӦMsss8GFF?~*`\Kơ 4i"W~hM?(܉K<ˆQ_ȍհa۷ܹs>gg礤$/KTo Dgk׮ŠaSӏkׯ/,RMOO 0QƥڵkMŠ+PZZ 322x|.[ީS'^5' >}:988x߾}'O|q6(dF2JVxxv/x ~(dɒ{/QGc5''_ [HX('e~dmJiu(}}}TMNNNҩ>}G>xɓ=<<6n_UUEd Y'9'7qkcc#[n@ƒ[~*++E4i([cbb3;;۸0))) J⡤)9p@1G3uTΖ-[84:m>}deeQEʕ+E'6MPG$?P.^zS5[xW н{wXT칦ٮ^$an߾}墍1|O;]>KP^X)mڴ)***..G˻uV)))(b o/Wfap}T̙31G4u^URP2,,LFƎK}6uqnj2dܸqf fACr˖- =6DС\65y {~~>:tcǎra~;wX;pƍ墱 4o JX6WA y^JI'\v7WEơdQQJ6hנ O>|___ѣG1W\ߺc2;*=;_7h<\'E@R5({=DȐYkz04;Wݸqܥdkk Dz~GUz@lަ <|lٲ寍S^=Kƞ>}:;;PJ*))ElѢ\/hz/ݻ.^uPCy怆D=4qUV---aw̛7QÇܟ4N8]FǏgZX<2Lr[.1,6%Cxyye[v6lwj*|֭[◁|lٲo߾DăCI%%%A5k<rcǎVM0aɒ%Zfff¯%Zw7%۷o/Tuݹsc'>yd=4C()RSRM.l 7/aD۰i>!)5 wuɵwwパ:u˼;w ݪdF2[666ҷ{="ZwBCC)))999;ʌ; n94h 7VϞ=M8qʕG$~7 p@+Fvb|r" R@߹sgݺu#7$+wȼ1ӦM#=ݼySP<8%1 iii,?2jUIIɌdPڵk W?յv۷tΜ9#ʫݔ#9+++" N2e#F|gDb[nR۷///O?E&=ŅiY8߸uJI X!`ֈv{L"ؼݣG&+J[XX,xb?~yݪ[N%O<m(AӁe ./&P1g5rɳf{{N. tt% v#sm>߽{C=$Bpqz.uEFFi|\={hѢE|Orgm۶;/R, x7ot,oRBo; JJJf'{n"Vc1z6m"`bb"%z%o޼9`pN"HJJ7|,NJJzGbzxxh:vς #""pU5>_zqmvbGmԨYYSqW+ݽ{wqy?mڴJJѣGVVOǯ+0P"ڷ0ru(d^U˖-зo߫W $8EGGS!/]TXP '~i &L4i"MKK/ްa/55߽{+733-;w:u* ^xAnlgΜ0d28K?ĆG3/Æ q*Ż >:%%%%3Vyyѣk OGmkΟ?MUzS#PG1 jӦX|~zw0)ğ9s1MKK#CM13k׮>}UXE0v]t}dԩü3f'۷tmE8\<1I, %yX~MI%%%-ӽ{w]~}JG,7ܜ9s@$U5{ll  Da'fpp0,[bhݡk=ǧzJ"#[XXpBaaaf;Lb{qmUUU?p@PM6%7ܲBkz#P۶mmN:ts /~(z*jQRR2+Jh֬…QO!wAm۶izFPy~ŤIf7n:e qa3p)gQP"dffN6LJhug-̀hCDv%$$hz-+0mܸ 5x`SvI̠ɓ'322%Q%qddeiii԰aCqQ0{-7֓O>Irƶ}\\\.^p5jf"H'''X;p|r a͎;fooG򕕕eeeAc;UU=&C_LV߼S+VCfγhNS**C u038ϊN#"21=y`zxk]٬"rte˖LmiqZ 6"vl9sf6t===NJ$H8<Aml10I"///KVzG(S}ԫW͊+O`x"W~o_Iۿ?!C#G޶jʾ о}{ܹsAۭ[p;c_+VTtX)Ǐ1 5cʔ)\k~[O"EXةS'2ˁѣG@m fÙL$v}yJɦM^zU5d_%֭[#v P(\;B,SS!!! %+ 5^{5jn޼^߻wÇ_d֭/}6l]6{}Lmun*U쨭e18vz͛g;z޽0 Csf>z`wn R23s[]\\|||2ÇoW^%?sEdvKJJ"ڵkŋf͚p?3UAb|}} ٷy;:ɓPvǭTRk׮~yzzN4k\~}d m'afNIM Ŋ;w>ME3g 9޸qֶNWWFYP!j~Ək.0Tu-wꄭ3f̠g+S sOV>>>s_hj fagٗ,Y2b)I[aȊO>ľzJ^zLv5fd NJ LmOb%/_^Mb;wxxLm BP(ѣG5C$L(޳gO6m<<<;t>}Z {@ 303%(< ] +djjժe_=k׎k֬۷߬Yo߮v#]jcZMOKjdeV ejt={?~<:00 )V@r^SN!۷oI2{իW#lsRRRnܸp60 sSQ_uFT7~eWO&Ma2BJUrWRvW_={,ܶmMɟ &=D[۶m_Nm>Yj˗#@PPЯ 2o6dK>|xbb"-^|{ѢE>}xyyۆ c0 s,SՇ}!ǎK.] """ 5r8tܨQ+W |V\s…MZ,uvv3fr85*UͣeI 3AM y… tT[իWsJ-[}_-\z5_BI2h0FϟߩSu>s.]! &"##aׄ 0Vyl޽ȥf͚+ ~O%v&J~w4~x5uV|rAwI5A_&'{|[7doEa͛7w/ҥˀFZ׭[=qDtt4KjJ!$ 30G4=pcM8MJII9r}L2ܸqCɓ'74 9pŋULP1ϟ?yh?m2%Fwر4:}tZhK?wmp D=fz4)"q㔎#1@өII{Ǐ;vL嫖f]~~BO>^@-Zdٙt- :ͭD??H'#0DDDDޭ[7%3Yf ˑ#GH3oI 3$W>@d!lDG $@DO/_OY"$ih]hlRmJOU $ 2\3(>!N(zNFl2>lذ^={P\5qF`ӡ< !#m׶mϞ=9DKॠm۶k;j,m50KbS릲XznLAyOH?(~~^ԃs8pڷAXXɓ'a@ψKك¢]]<Ќk׮E@嚴B=+VN1G3Eg:qDLL 0R|!p09sq='i װZJi7<!>͛7`U{qsB ĿK$dV-vڧO#|F{$ 305xH&_pԩS1, =,9}5ݻS?3@CD{xD~{פּ/zzEB Ȩ 6۷Dgx\nhb8r:ߟ|2`~K4ydC~j='L=Oo4fˑx{n:t1cƠR'M_u#F2dӽyRy@Uݙ6mڒ%KR<###/hnB+>>>B^ri|ph{!8M~٧-Zh߾=|Aݤ+[ni6eb0 3!LiIr~* o!MlѣG.]:u.ܹsn@ƏOh^3 }wHqm/xWƍC͛7O3Рqѝ;w0:k, 6 Nѓ={%je/a$Ats m۶JDj:\Bu5㮻՝@H<p' .@O<@.-&d^Xz `✎JB1OxҥXDQ (H 7j-Hpډ`۽{7Kdȣ<;֕S+8kqp=ɑNPg<#2!!J M6JƇ\R:Q`m۶E-_e2 987u ʔTL\sù taFKKK#`###UPE}^zɒ%*<^\@/^Ll'h# M@@x"%=?I!Tc(ũ1C4D]՞pV~tf̘ABS4SczWtrj !jm tVr  !>SS5e8 NYע.F J7*<)׳gJS@ @!;B'XJȃ]f94_4us }\,=(>8pr-Bmaa92%1׮]#EDDr&'A$.əQPڵk@m۶ dd!+ǬYS87$$ RLLLLьj.`D4! ?)Nʑt!#UP'UchZJ\آ{@Uw9Tz[¹\=wit $%%P:(јȑ#.}H uLp)y;}?$@P?Vs" 3̰|`2ZZZ*dJAM`YF86BV^EIV؊&`]h{=EZL(h 2ڵ 7o޼1 O {AҥKWb%ŹtJ6d30z: 'i8PWpAD.V(J|m?\8}0XW¢,[' X8Q? :@[8=][l ҰĜ[n S5S).X^mTg>C3QF|ޱc^zyzzvOt/R3qE%k@'pB:zU() 4f'4Sut'*0x:%&x;T R*11H:Bmb/99>ps.]hüZ0e؝r9A5r'H`yM7wnU.KBx+ :~|闯xA0~Pkw1QJj̞`뙹b*KW#:A3LW@6za)K~޺52C=Qհl1q׭[׽{իf6I-t0t԰4m-,dyM7|cǎs dҰ6ɓ'שSTR:yV"9,rqѧis{Tf\} 5̘C\r"J^}:zrM޳_7]2 6iySHɇ6J՞h@y2%## x/((iӦ+Vs1sN"˝xg9a3I3j;pYxqR_67ŋu/0СC,x}jamNsmEM6AóQ"ӵuD/k5:.7njժϫ5Qm$"1a(Iv/mC1cƠ(cccyRSRnf/7ߴ>eHJ.]v<{#(7IMo}}}]f֞u?-ӍOrveQiAAA֭۳goVTTիW{m22r7Sە+CZjVfK^pOg9TPxאlXwI>;íf ]i}رcpAޱEhy vq5jDKHHQ2DؔTt /y{{_ (J ,Y _=z􈈈J7bcc3Em>Hm2R?ZiSuo!NJv5 `?uŋVZZnQ2%9yȑlm+SlР?::ҥK$OPeYjj֭[6lXH8Id6a+srkrx rvY[$NIY7hmv̘1]QzʍCgϞ]X1X*2aZGvM2e޼yk׮ݻwoXXI3r8qڢE WW׬៚E${4jԨٳW;E&lP0,**je˖U9hm {KH'm#>F8sA[ %)>JmZc'"(&LPt?Tc ޏ[cfZz]111Buխ[7k|,' >Jfu᫼(}¾}?NHFi[ Fdy-5jdT4 D,P"*H eI{|MlCaKI(:˙`իWCJQԤI@d#;&"d˖-}||fΜjժ;v;v,::CJWZUi5hٺZ:^~Kl޼Y XdJrX7n8"oIT][HHm_~`aOJ.+J*P6-quuR(Cd9SH@kKumD䝔lѢ3rkedVxW@Is0:uT۾HGdSJV"M|9)9V9_ln|||}jF-pu.5UMMgJRDCeɒ%(̴iӊ/nCds-x" %yV*d Sn9I?Zj]v#F7mJl) ղeK5YTH/IW4ox`-57xgoIu{lQFvHwՠP``MJJ_ wuu-smޒ!2AK3Ԍdƍ۶m{LhѢ%$,JR"}Ҧ'"'ժהdIII¶CE況ּÇX"r0zA%?ܹsǎ[ϝ;Gg {5kAx$rH-MZرc~M3g\lٖ-[cjd -n򱓾r„ W^fQiۈdZ#)"sCV;$6_msغunݺ!y,ՈО={N<{@׬YS\9m Cڋ$AQY6msȐ!\ջw S/:߈DIʦEdRrÆ *TPj.IUQNȑ#Nt͛7{,o+]M/m֭+WViT^Yc$M4~6ɘmF2QKLmesgэkb,%J}fлAȾl娋ĸH \YX15:p@ٳg^F}1d~K.>fOD.Y9&R\P...?[jթS'1c/_ U{r$%|d*""],r`1(U&yu@8f,7Iw5+&y)[y$IZe"5h L[d6!+VlݺJw'Npuݻ7<<\w6Vc (Q,EPQyAKQ@ʕқh9<<̙sk?LJJ*zGݸ@k_k#W0Yf1xHCY*"-AE455Uiu֭S.[qoXC?)Ho2eʢE֮]k׮Ç_tݻlDnUՆPlcc Y(`zG6=\$}Ѧ K.`vZhh(d[=Kd=Mɔ~fRH1뱺-$ lscnjǷcǎ9|78y8֋k"jF VoQҁ]pVVVvvv/s[˅Vmp/13DyB;l0333ϒO䜜l@()PRaJJ< RTH貨r=6lثףGȷɓ'O:d4p3gB/ϙ3 ҩS'}}}DREZTmRVt6WDYA $t+FΝ;r_[_(z #zj"i0,zG9`Ю];x1[|ҥׯ88zyy;wڵk7vu???___…3g4p1!3!0!BAL3pJ7iU"O ^q_ӧOR7ڠAdis>i\_f͚4>BݻlE1%J*.L[n<%#e"lq&M>֭۹sC@gn݂ !!!&yysrr+n݊kvEJRizTHdFaȑ .Dҋ-ϬR=55sbaJ6 tF`4+`:GQKYikϞ="\r%H}_3?#PRbe{D]J BI)=Q?63d[[-[߿ƳC111O<7%&&/}1#g޹sNweK\B[Ju%ի'/C~ʕ{@ 1蜕m#HW +; CX={6V;;={CBHq>}U%J~*%_ 144)CJOJL?q%8z(T$ zg233~5;iiidDG!/.!?^z9OOO`Ä e˔ޖK-kvοˍ7pq(;;L5Selwuf8jj{633cp;vpqqy&| _.((Ȋq%dTTTVŞꔬ<`rm9s0$322y|QQQQ![rrrM3%%zÇʀ$Nv%PRR6(ٲeK^K*%y<#\N:=zȤtP p,---!,ۥ`&RtФ/^އKlJtKXXիUSSS\_Vc./&sB LX7n` d խ*ِeV 'w̗m :u*ҥKWFO()PRa-f\y-ld2UL뉚܋ &O H k/ >eIIaa! DKMM} d)D?DSLT&"jhk׮ݹs'N(FGGPݪ A Ct D==iaaBH>zy,T+%J*FIb;vȋd3RR#k|!?|ǏKNޅKt΄ԠF}6}E6;l0e#))VӢEٳg'''ڲOh)Kl޼Y]M|};Ŏ\"3٬P˖-g̘b*...---77W$J Tee ݻwd')=PZJ'`WֈH+A]\AAAL͡V/KKK58>s+quu|}F؍hiibŊ[:tJ6 @RXPBnU2eH$%W=|e+o!$ $׬Y!y9$p(&$"S@I( ~-H鶒SMI)BjTce۶mvxj[KYPʋʜgϞ! r劷}7o.0J$85޵kڵ … 2KnUkAFAov+E:t@(3g}c;DN:5qĺu~mv|I`4((H^mӭݻwCCηnƩBCvYOw H-\txD"?~z'@Homa =A ^UbDωC(!}$_TL>`=z1cƼy󬭭!$]]]O: 7^@IJI؟HniiYYJ㥄nrnm\kӦ rڐ~2WS\,u͛7ܹ###~K޽괌C&PRbḊ`*(C1q[$#:uZ|9/c=MLL < i':+++/ƫ_ o6od_h6DuyHEj">ii_oΗ"y8@t((GgU.]}9sUor̙7n@H>}T4:2%J*@l? ozR ŠBthiX,600Xp!"(YėsDx1Ȉ>ߤ$ OIqZ5Zh6o<ʌD;zWfҐ(֩S.ի׀ox|Puv&]BF@JTLA"ٸqccccIKKKI''cǎEGG?{ IEW$J T@l4i"oR5ZN!\1] QCjjݺu1V򚙙2—Bݎ663l0fwD׈ik PҾ}ݻͷ~;tP<ѣǍ7a9rÇ 2hР~ѣSNM ӷrSME+qRISS[[[ر7oބLLL^()PRJVTT Cᛛ@I+CPV&[nB*fsss!6ѫe"k9!=@eѣzyy߿ x_r5zDOsu-J__K.}O2e*SM6}tS͔5|3gܹsgNw0 XBΦsIqq\aݺu?O?tܹWlE&JJ T0D֭(#WBD4Fkkk#CCWt5Xv>Xݐ!CDZj0[|@>}4A y#?`wߠ=QxNhhhll,25")PRdu( aYYYO>wڕ/Q`) @|b444 K=VpI+W\51߾}!dGEEWzJj#m*1SҴk%a֤V"BDW5UmoҵgB ,ZDH) 4QNQ"{ /^q^]YZR&Jā .o #7 **X.--q'ɷ[XX 6ߪ@_/ZT_^MBHZ[[#svv>q =ŷfgg#2P֊dJcd~4'Q/XÓ)PVyyL|,{sE$Gv\Р217D/Pi-oeUd|W|ٳgLii'XąO. Hv0W8:j(CCCcǎ>>>H_S۷/j>//]! ! ŷAca^I)QktwwGиyÇZv򒵊 :tŋae(+QS5J6Wzp*.M:GI8a<###!!!<<֭[]eãF&P!Pݔm}=d%7uA vyժU&** ܱsG6m_,ŕ?/1@W+(`Ԕ,#UIaÆY䜜"Ĵf;޽{+Vm)dzL6o%C:usڈ柏/awԄb,쬕d󮬌'-- ׯ_%wڵ:A $ufOjj*[)yKYl۶-AOOjW]0CY{ݻ1UYXY(txr]Y۲eu{?էOBn߾_ׯ_JJ [䲬RRKKkliK%K67ٳrk+%ͻ"3g;v &|d SwF \C@UW!o ߂Gc3pkNNNK,ի2|DG$FSWBB%$ D:2֭Źs璒}}}H̝;wРASCZDӨ2}A*Fr{Ji?*%nj|Jk.^"ѣR+JJVYrY˃9!Njwӧ= PΟ?uָ;i4&(PE.uĈ?fܤֻ~Glܸ5k5j!!!۷GFn`?垞ׇ$WNJJDt ar"HKk:t'22 ޳'#==oać|D{+V;K.M6E@@((h7K4`499m9Kf%N߂=k.d.C D .@$FvĉHk9%e|!%d%P [l"NI)[^ d|'N‘]"NOOe%o cǎf͚[edd$߱(/_;0zjDz7j}>(Wi)Ɏ,F5E$JSK vعs޽z۷wFF۴i@N|i}A4=CYIDe\vssŋ 24iɴigFv;(kvKIڼyѣGO4Ĥ_~yƵ9!t[0WH2&&y&";By4VYhp1DZ#K1 ?ϣXfE J٨4h@.\iHi"6WpϾOLƍǏ|+/%1PLܘSJMIvm'NP&-hdWD/޸+m3)) !%f+TuE}T(n5vP-&b[ȑ#q9s@ eew((߿P?3"0@yf 6"?&[>V)7{… xYNNλvP"…  !/6XxJjhh0c%7 ˗nذV %Ñ7j %D%D#r&ZKdLԇK}m x݉Q?I-*l!:1H,/RΣ=UOڵ (kv+*QlVVV+WOP؂ MՀHCHuɒ%Fܲ])hSRR?~~m///777'''qڵCKlhוB:-1jժ`2!!!===//0au+,, I>3&M[W; "?*M.^lٲ͛666}Jڶm'g*D&g% # S^D|ﯳ @ ["##~QRR\QQcrRe( AZH{{{;;F+"UJ4Z\YdPcXױ@]v&&&HZzc,"*5ɖ~ +hkkkGadT{۷/?#7.**J)YRٵkWncU񈨫,&o۶ &IֲUp d7nDػgMsk5JU5[,l-|wltڹsib@*+@z䤥{]~… p6`eϯ{"ᩲVSOþZ;G@N"@e0TXa' kb0 klrvv.,,]YYʕ+[544{J$? &GxW=9ɇ]ۭ֭[߿PU\\\QCAI]]],d...ƿB+gP|]zIԡZ,ak0={2eʴSu/]wq/DxU[HH ٳgl%{Ǐ#:88oڴ :hРƍWLЈVG_ոΡ\91JMMe#zƌLQ2KƠwc. \ǿ9QMnddf{,3[RidY q$R2,%KedJ2=LҴq=>^Q#MB%W$ ʍ9rdnD^(hgh1eӧOdd˗!9~d$ruցY@dPPP7 xΜ98$|IXAOOo)j3o}N?\__i-3 ڵkt-[/m2LΞ=>Wu`<抠X?UtNfeeq dFo' %]\\-cǎ`A!&}(02phG?&T_XNLtuuMMLH+++ w ׏uw_SR-sml+99U`@am`*ݻw'9+1{+PKvyѣ?.m%d>G֭111999O>2%OZn]:0=zbWʬLԨo1o߾H!Dسcǎt_zKׯ7EEEHxG5zvW!#*aW'iy5HVNN6J㏞8P133|Auϟ?PB"ogy|Jo} I\: 9}t[3@ ņ͉"Aa})Ƙ1cdAw5*7:::pxYxO>PA {JL)&A믿İڞcǎaqm۶+KX%K {A&xF'VBFw4g͚lI: p*`l .]bZ`^,C@w=r޽Bn1aٹ:R#łXNWrRVaۗ Tc@Hz§cKb7 Vⳳz .}.ke2h 4_ص.ef:}45rl$"Pԁ˖-+o",U)_vMQe}؉"Mfkk D\'N덑B <%1`aPm/>>~ 5̕BGu(lo)** +* ]”)S:vBq׮]OGzQOo`b ܾ} Y9tu~R&;_~=r;Yn)%$d_cP-{ٳg).BŤ%`[FB{ 'EN} ylyDvB6b(dc&1u2=`e1J=e8x?IIIٳ~J~ ˬ]߾}uU|#bLMLR~~~ ..H0eV5ov}ɘagp ʵ`}7|y:u jSK PD/y)&r~rf'YT#?( A)ʬ,$qqqرcOt ܄kG"sΓ'O&X[[c߹mذ읽8D(|*-)!fUJ+8` Զm[.tu~}.ܴi PvS8I/ 27Lccc !_}Uy6rۭcG} "!Axٍ70/gΜA`p v^"@L pl-u^D4`1X#9(faHٕ%fۻz*"::Xر p ߦM&\ѳDɉ&xyy!1ttt\ aÆ! U JPRPM4ܾ}M3ڈjHwjj*bkg1Wǧh2dH||<ȴY+l\ ynfJ@bV4vŋCCCH>w&aڴipH]]]=<62O?uxpF?+R{exṼHGx(LR8k VJf䕓XΝ;7oLNN++`Cٳu~q PI%)łqFѩS*A7Kq [Dڀp|Q\T'N`-D9<+;X066>˗GlĔdLuJ$X+@(7m_dttttqqYl뽼 pb Js mĔW+$79===PT̝`#&+rkYV*|;GX%a200ʊ*ЏVlȓQQQ%WKK ۢ=񝻲! NFFFR#:3>8\ hkk{zz^tƍwRxh^R^@YPPw@zC8}v`bիVZfƍȓ'Ob{ˁgVO—/^%BH,͘1cÆ Wp$G!TZi׮݀Yf-X`׮] _|EFdӦM 6oތBYADIF- ޽;ޭѿxՓ)"\vC ĖA 9ER :>|>>}ŋ@$kd灰0xJb$''C {5*>6L@x%$'mu J+Jeqyj &":))2 ֯_/$b8'')ޅ ,4~m۶ݺu۷o׮]j<p2$vyxBE*|0P"n233mmmYFg3>RO}Ȝ! %EJE,+ye!L kW ϟ?X`+TE}U,s0w޼yXv+my릲B Jf, s @Di tM@qZnn:+$ .Ν;NբE CCACWWw„ `ӧO}}}/^ܯ_N:!a`Wܡ+:^Cn9s:Xb ;vFIR^.] .RDd3uT.5T*[|򅴒#kx»jٲ=|%tuݻ7 PZS)&춾+(# y<(ީY);e˖ӧ߫ R&j{7h0:?/e9Ҹq㐇d~~~ii R0CPrł% EEKJH8 #;vl /bVޮw.~CW쯼#!GΣFzьȏ"GGG[^*'%}"kW߁ ?~ M.(((Hu5SϏ  ytF@ӉԤ'PWW1b޽{ϝ;:RdPE@V-eBkm?G5`TP߰aO:*m .-e11۷oZ!|ή9ݻ˷iӦvp :(/n򘫏by!6qpC@ʒjI@ګV'1o@LK-BK»M&Bg}\RUhd,\N*ar X3J 3UWi&y|+vNz5lذC%K;b>+2O]_|Q\\Arlٳ9{'<㉀rFbW6kXfRFuT,b+u<%'|v2*e"A@F6ŏ ]D2JX೵hbƌ˖-Cc#Աa=z$ @n>QTЕGD5sclӧOI BB?]aa'U;0]Hd;i$d ATfJI FlH)Ƒ#Gd18^L)"/_AL!L@Cd=} ESiA$GpRM:w˗o۶ʕ+܂PR.X>KK6m(ҥŋ]񈈈:(+Hdhhhcc=0d%HwѣQ <\b7\gآjN򔔇~+3%[XX]8UxY:::\rǎO"##ܹÊ_^ZĪtYfv,1HcJ[qo߾cƎ]fMtt|&?ȡٳg<{>z>q yväEGGܒWwdSAe$R25J_FyAԍqSSSgggo׮]ׯ_Ά)EGCCC9)7226l2 .\ӧO"=i~)L k IIIILL aW<&:MԖ h)SvY Y('<ώ[f>888...-- +/)-;:0~x-֭[5: RIVܜ}ψxz'Y $,--N)Y;JZ[] !yHTh6kEEnܸ(>>^233;ʳ17mԲeK%#gGHC>f>E2UXPEɁ́a'v҅KAi,Q=By--ǏðUb$OQ2##k׮RQn$Wݪolٲm۶=z444vo>@ȑ#'Nם;wN4Iid֭з<ͅv]v vQWWW\vux^ǔ)S0,dvv<%kG]ayx#)$w"i +Jmݺ466 dAnݺo߾iӦ:g=wRV욗wK.EEE/Bw~l׮+!!B;ɮ()Sv455e[B:<dРASN.-,,UGGŋ  vv2;;1113gd(eQϻ>OdP`3^Wԫs5Va5 Jo'o+OI5$vn޽@S+|8 {ڴifUT]ʊ>|x-vAw#FPW'7~~~ iiiw)SFD_Å\NJ5S5kk/_|ON:bh8p _S5%H4i;97B_ ]%RezzzbbsX,% (G%W)w;HeŮﲓ<%yJֈ;vJuVBˮMD"&(00wy )5o޼d-49}4&࣭׻")8`K^t̙3Ǐ߿ aQjcǎvV)SF (Oi$<)U!GQ޽{O>+VxzzHyﹹ/_޲ea/CĵR B>ZX@J JݻwSRR7A̙3չH:DKxPְKYJ,,-6OI$d\|$B;-rtlO]t֭[aFEE]v ֭+"%`! ""@32++ƍG=x𠛛$ADg&j?b))WFj@ʋ]xJ>%۷gGYbӭ*D֢cǎ0g϶ =<<XAa!BPEalڴ `2@ 2(%EEE%>e\\@yȑ[ ϔ9݈SBԍ46ZLL RPf' JKK D<%yJVV*b*WS!͆64iҴSg̘8fPMM ܌~:] \:uj˖-0NNN.8`Djkk/ mЎR"a@ Go>OOOGي :ATȣW"k" Y 6 mCN2<%kDI|wùU[M@2 &L`aaamm=wܥKXbΜ9V KLLuփ$<63/QX5ɓ' R__ӂЭ]KIl@Eq+ ܿ]*yGEǢB,4e=ҡCl .  0)SzO>\duUDsuyD\̧K.fff@?dݻw?~<""v'O`ɪ cR H .C^TM6`>5GCs炂dw"Ҫh_r-ZBxJ>%hQUBO6EBfHk[*L&MbǶ]f͎;ϧNMII0>~! RXG={*#6 ,rss, Ӏk(%0Qfgg:$Q(7oތ,>{\v-666<<رcGiӦ+Wb_( 5#NcFǧDLjb)F&M:u4|pSSS8vnٳ/_|"~0<%yJVcNvϲ!,ֲDΪHKZO>1228q"\$h"]]]׮] žY`בwV:2!Je'~,Yы}eۿ}n %7jff&版 9tLXիDR/5,gE=z"zYN1ѿj%\qBԬY={5j)vԩS8# y}~dѣGj$OjSXʤ 6|ڐ#Y$pUd""JC`*34KE@"bS޽{1c` .\twZa7o,`{r \%j3~ Rlk)\޽!Ǐ/X޼R+)(KJ uضH.^Sy;vlܸf6m(ë !ZNtlp(epKcѾ}~FFƍ3,$v ~''UVt޽ȑ#p␾ԻwJw_SH Թ5w܉ݾ} 1n4L\Jbzdm#QX!HD8MMN:(Mh#n]brV???Vcd;XG2~ +u>}(d2y g۷/ocootҙ6W&ݥEϞ=Êddd$''ŝ;wpllٲeݺu?,6m^PݏDg5T"oTpLК7o\tȑ'N;>Ça*Ү\T̙3[n+W\8p uuuy:ӈ6] M/=" !u;v߄ؤI-ZteĈ&&&rw3gΜ3g2R||kȝo`` \dLL 6 6݋es z OG"*jW LIId;v쐧֣GѣbUCCE#*5Z*4>KD"Jo.P:kƼCPdD6ac!mQϩeZi"buEER4X6Pߒ<ﰿ{_=;e_5˪p?}\ɽ8fQ_œaǡicCXFh D:bBVƛoIM ػw}i P"9?<)8Kc1&&f偻K *MeFF-=@NdÆ Em|W|'JRniӦu-@Ek8}͒B,oI%9 ǙtEH@|ƷyݻwPy5jvtҤIq0^ÔR>* NrD?$qT8~#5 *I 6]ԙq8_9y5qd%~lj)>a"!###۴iݭ[+YRZo;^PD"1H׵MΪ$rH~6 ^ /CϏJB xjPI<ƫZWH ={i'?C<*} }qk4dѣaÆaP֭[<_Eh !NgYq> sR*;Gt昮k7OW173w*;<|O{81qtGP{eկ_?66汗oqgk/"$*zpFys}Q߈|N-DUYRƏuV%@% \pe]6u)**0.^5`-[҆ǘoFɓh]vx>d5X=Hc[#d,k.]5kV^=/=-ׯ{;v0cm09ef!6Ѓ@:q'CBs~y<_v-ZI[[CjE..)S< OBBAH^zhr-^{%(˫p ǩco1Q8C6gi8f1)ܬ]G  %.]ᄒ}-bh-A<-TPHKܬHl$ _|O eM7TR¨\aŊ^GUFm+?mRIE9QWY,^+MSCD1Z)}%%-mimplgNFgil-[4n뮃W\q VJf)r W1t.R~}*Cshb?aV|\􌲠* )/;bJDe^b|<5>v? dc_~>,JCmyHHbEeC dxAC C"8Hŧe |*I*aѳŋfL߈# L =@ JTEl-/I` t:H$5R jc9I$b?ej8ϛ"ROCĉ"}yժU8U.+0G/*+<&i&޽{éN:2ڢf͚5nܸaÆtuEԩsAZj 5k 7UNdd$֭-`:9A3̍3Y"LAކ*xZ8E@0!#/DRH ,LH~yWYP SϛGHNNFىS;ܴ^zE׺1C"W^uRIj2ayLL`Z)@9Lai͛7c>S-Z$rI_F)ź\MKX 0(`1``0,N"*r}BDǏe_ 2`L[o%(+[l(Qe!t#mS8L?Gkch@S$8p\0rDĘ;*$c˗$FE,Y_z+悎 d8̜9 `A=fbfI69ڸzj|IE&-|rrH3K:O"r ah0 'kbr_!d" fv1ի đY+_W[Z&EEݶ P^DN0@ >Bآ-"%2wl9SWS(PRDnw*HZxr(s %*(SyF,}:rD$$iIS`d(&bDACt%" HEe +EE`a h+ B( 5{l }ń be1>@bGjyQ6)AY@E AZD#b#"P۷K+$cW捉|K(6LЗ1Ϸrl'b)X#IBq&h rXgUB ryq ?鬡c^D1׬YÍǤfM@4C]QKCpPχ  1nb!#NJE eZ Eš -cfyYs`G}D?f@$:vϚK9 3Yx JݵkWxD` u)-[$ŎČrnÃeLKC$' Jw)BHud.rAYD, C:q0bʔ)OL2x_|I.ju &坚]̢PP.(ꊈ/Gb ڵm6XF+I59fsN~8+ʐQ`ْ!y=@o@e- A0^08. s!?)DE@Mq2` s*)! 4!P|*'Da{KH%rILr s$a}UY%ǘ;0pA+Iאd b,!(%EPRqh?F1K{,q܂q;v[ 30/e)<^1NOhK@ܞ%NJ^!!P SsBZ @TF⹐H#i >q`4i҄&>^1^t'T~\V_Yp~p%5L+ aR{ gV^ytJtVnL"Wh".+VYUVQp(#A1`GDbDsZ}/)p@Agj,0իW3•Ô$RD"!{ |dgǼ"4R ǜ29 `6  HVTneAw):6n$Dd;9$($=.X p~A4 Fqk=8DP -.Yee j2flD[K*B$x"p)nG$⢢p87iIH뮻PxCFh tD kժEc5jdo]jx@.æn׮]PZ+m͗#;riKz 8KrTd o@K_fB2D 5 R`ַ~,B.y(YT,-출#pI;@r4龩Fp`HP3ײ_J J"ScA=ԦNLlL.M>v=$0S% 0AR  th,!hr [1ŋeҹs frA~##9sᲸYn!tܝR) 0e*5m0N\`p2%k5tU D7ݺuY[իO1sd`Ə8g 24 P;ru/ Y aE1ۇ0ɛ+ T "`]'9B>6X[=pcŹ\p5j(b\TWQ%3 Gt>@L=R y+Bەj)eDj;s'ACeRg祑./u]06F80z)ce GNUq/`IVB@AIJ(2_Dv&_"J h(+-  99s\J -j-\RYʫ(#˪C0ӳ s]\%IIIƍCFjӇ q2d}7*f͚։u҅(DPo^:XsȰ 8ϒKn!($;PO,.7)"7YE=1HWMAK1, \qM,"zMQYSH,hET~E"#uQw0ÓWֱ.|/J=c JIe)WA `%Y+3#ZVA$ dX4T^E21`R!Lj\u6"M jUF!/*`H&PiL*hk9wtSpH'֘*M\؀&M .:u:'*yWUɢ`B'- 2UEj&Ȣ\Fإ!oP"߻E \GVPSpGYJe >ree6B.qS)cQHX ,D1' DLV4n.)0̔ d]P+ML! 8hȚ MXYdT,a jZp 'feB,,fx)GŰ-'t;v42ӦMRʴ_,z0Jz7WC`Z-[6{lU|i3csL) Cُi.#gzTx9 ǾjZYQ  uq Ť _5'o `ovtJ̙SZY3g= ,WmڴYdI~s~&L˪A(BXY}fgSV,)S`ݐL#gJS!M Zf+# uyV< ROT oOċ?9/{Gd_i6fY,DȑIIIͰyu=~ժUuA!!!!-Zx}DiؙRFe8edp6"?ނX~Qv"i`~`:B>( >RN2v)q7xZFEGG"ںurHdJhBQFnJ1A27/"y)nKRWM-'ߺYݺu1cݿLIIi۶m*U^. ūzUWU%Ge}h5 Bq~p!d_/?.5kl߾9{xX{\=ϸqN8Q9i׮ BP($/KӦMyB{OܹsK@Ξ3gNhhh*ٸqM6I?^֡fffN4iڵ B8@wZnM6yʔBM%m(׽'N LLL,G &4'''? BPǏ߸q#Zqԩ_K鋢YV= V֭[/M BP-ȑ#gϞ]1^7%%eРAh_*Y~}h駴4BP\@dggO:nݺk׮ VTյk׈r=zIt BqA#٧Oz\إuii&};jof͞5˽?^:P( l~aFFFyl2 1b}箾rÇ.Zx BPThǴroIII[e]Ȼ5jٓS~ለr$'KBP(ӧ:,]܊sɸ~xsϤIQɼ<BP'RSS;w`m޼IOO0aBÆ J0B^waaaݺu+BP(*ׯ6lرc.\XnݠA4011qϞ=Ç\.I&?eĉ>N:7nYP( %ԩSFEG3vرcvSMFFơC?^tYuӦM׭;uPP(*3ft뮐jժ% BqI";;={^~͚5{衇rrr4 BĀD3/(Pڵm۶Hi-[h/P(K ;vܹsgD[7l؀w BP\bسg-[+J* D^^ /СCGj4 Bpkժ՚5kT( c BPX߿С7pCll BP^3xॗ^Zl~P( `ǎɇ=q BP{ٳc&NHOO׀( B!8s̆ FtRIBP(T2##ĉYYYBP( BP( BP( BP( BP( BP( BP( BP( BP(ؽ{m4 BPBzzȑ#z) BP(n9sfʕ^{ƍ5 BPC :y$Q( "##cᩩ* BPK7wiUIBP( BP( BP( BZJ endstream endobj 1 0 obj <> endobj 2 0 obj <>stream h[nF}W*/@QNܢEѴ<}`(f#('q\weiKN$e grկW(.Fѫ(G%W(A`X`pLcяBty4 `b^~@|GuA&?"$"F s HH |~>ҟ֟ R* EG!kQ&EPsofn H1`&ͳ?T8R? ϠU #$>3rIy8DeNhK+UZi; dj+e #RumlS4Q {0B@m &U?gT5nI1* N˘ j[b9&-DJ m~\N0:7tFTUZM.u(DRu0۬Y}w f7stmlZz.uR,ڔ BtUA |=&Nm_P6E,\$ĥ rmTđĆ(eT}|0uLKfc ΅sjd"_*;G; U;BmKb(=xP8tG>VqyHㆴBo牧>Q.CqLj'9o##Y> )ms߮N6ڋU|eQ}$MS4' L$Z#\wX'Ǫ F†ӛhmR<,nqSrgP__5k9;c[hA]os&pӻ[Husa/Exwǩ^0*[]m'8ohCv!c,e}sA:xXddore ܣxb-2)mx[zD7ኞ٫ԛu&r_L1 <K;to]͒u]E="`OOMWms!:Y½Mj'F jl jC:ht6 >ue?V;+,>stream h221Q0Pw/ .HLNq-̀2Avv%%% `C9T-?(b`b` Mls(BʶaF'D釤V$, endstream endobj 4 0 obj <> endobj 5 0 obj <>stream h[َ6}WQ*`IHд1ЇM;jmɕ4fdhui',^8KγWQ9̾_̞-$@b=C(@N2e (C } !$-\ B#7MVHΟ1O<9`y4_EHe:c[KU@@Rx`ϵ~F(@H@0 0$26ۭ9 Pŋ0voigc4IF-~͢ b TܾSw/Y'? 豂EE7@ƽ-Ub({>ozFvM g׹WEϼXwEz| I:g@W\OS:fo9QAn*]Hgw^oNikL"U[ӕ[YHH<,X+R1`jGƆ:-\:K6lQI4{Uן"n-bFm#;\ӻ/iq^HxdAYۜ] bh^݋y1:k7qp*+<_{V' %T}x #`#>;$N2zW42%LE oLI6yX w3ٚ1X{">:GSh.#;(2Ds,-ynsŌVV9\hCN=ɶY!5Yd>^aS2Qi,_3@2T4ɏoJ-RQRe$LƲ2?We3#pza)AJc,EՎc2RqXaf$^Oj+o2йZc-FԶa>2U/K&΂vaƍ 6 ? (1j8NdqT>2:Q֫dֹNAAXO7("vODH@!sNwS/;e&K&^ˑXEGHSt C~'M^0WM9aK=蘋NxYs/okcjhSV8{6 PiWd#T>jg~stv'#>%)?^%XɓdgLxHS7z#L_O%TƐfqYGslFt;d\j6A$9c vMn_w{M~oG B#}kS= ɉC2:!xw3a@{-RW#{!>򇸥:3wW{<7-FWڹ$~;ډ}qbѰno8r{<(CS*#2Vg+#e$ endstream endobj 6 0 obj <>stream h221U0Pw/ .HLNq-̀2Avv%%% `C9T-?(b`b2(6a SK\CR+Jb  endstream endobj 7 0 obj <> endobj 8 0 obj <>stream h޼[ms_O-1a+28Ӫ;N6Q 0eFw q c/}YW3R_ bR3;`Vk02ٻ's}(#<_y<<տ7WOx&[Hb抓J_๠sD|>?r2Kg]J%$>f4Tv]<{Z,O'Yoqy\J]ke1oՇH#iu\}QF(䠗3႓R#MVR\ `CUrќasFPGX`>A\*C%/?śuGI#lT|&h߲rY&h|ƒЙTcw~1ISLj7Đ,]e,7i!I2X(m*޾SR[MhŸ}n97HID& )?#κl9Y+^a|f {6m qN#=@igl&)J=xqnKt/6ԅFe#-79g9Zǔ(Un#gE$BaQcCA gCrAZ I(b, 3q땎Rhc/  bӣPiEy0!x$6~^Xq%} ?!6J6egc}]g/B:d,&M PI"jmƛt  KYҊ;+*R4PkPBVQ%ZcfcLRFs)]1^d.Vz:On;K^bw#,!^_ ?O8Ξ3_ur_eF|`gG#p8A)VN~>Yjt !ls|g8V} .)#BPrLi6 !gg:zrss>g/\ jvŠ L[!l|;#2*)Y=*  iޅy73D'ɩ+T=r }1DItt#qQX+X~y*8&fgRa.nt^v(Cu=ZT ӝ+B0DOxL.y/ey۝Sڲul0FKG_[PHD0ߛHK:5X{U:@Vu=^SM|t_-C"ϵw#IeUG1Б2ḻ!h?0#)";S˶.pW@T9$Ԫ8EU*pL|4Glҭ+XͩG"xêu["2˫.YA:7*sȞy Yv6U1v9teQ=-F[Ce'­11 ﲴxm4:3$/#<q^P8<]F<} {_R,UFKs7iMQgm;V0ʧy1Y?RAzcZoq6=$axБL0@N<"zMLc3A攞1O9OruYtPzP,Ӛl\5 Y(gU(? =r&.@H]EbĿ4Nœ"v6Vt;pܪC:lb]v\a],U)P3'ir7CU?gD~}շoF0mڽ`vlNBVjQ>4EF- ޕ@ǣ8*_Z)sQУV!v,!6w6q:mڿ2'L͂ǸDGۭue6l"N{x3kf{#Nlso5QvcQ[6N6fUό_kѯ;V93- wT4=tcMB: WUB7e2)\ςa'&|_jOeZWBohn\Z T>Y8tAEFMEo])o^[5ud@,0CU4!9Ӌcfj+,z>թۏg{UMw]O0ճA5?G2hb'{>e `γ[7pE&g*Fuj.g%3l iv`,9qq ]ҾnK vlw] 4TTedX'M۰|'b48PM} )Bl5$߭fB鳒X/4$R[<&``i@D : endstream endobj 9 0 obj <>stream h[ `MRG[Rk_}Z#𨐈*5+VZ4󚢉,*ȧ+}7eJ3EyYřz(A,bvF曩ffT5yۿfSM ďø1,VfU\D'zRK-)IE|2lװx9p[&PM}U]teG}dыZkZkR*03j?Z_˵T~+Mh!¯!5J؆^c>/: /` 8'~~0{>F?_AN3-Zє=_&{b$dw|K ˞UO\PT^? 4oە'0uEB4Et".9X;sLj}&3 ހCX$|mwC\iYb(濪 CBX ȯc_jS8:7\Y7T2^ 7x2%"<@,BL>bl/ŽBaW1[ׄ\`<x~po}۶TlѪ <Q/ :%G`ڗkJ15QGZ@ꧡ. @ DL< $J' mab -[󰽀Uؑw Twq@R,_A'e'~:DdUkg),z±߼AhDʘ$Vix.OsihJoqe ^ Rǯ@<@X %@UbV]yqk> X|MuiviM:d#Ps'_10 8ڬOFT@4Naii@2\O ԧhTCY6-%p[P^<\1z4r,^ W>xtĐQWRqR 3tKOg›N^'|ZY$?zm*A#f!b٤MhY$lVPT-°(d6VuoԿ^<_(Y-;W<$X>FOij,z_9?م륦|~?RRRٳΖ b^g0FH˾3{zػ?k nt _;1l)Z>dg#gkZfbrPgϗ/\ 5J}`)5Y~p1.vO`_G&-~ࡣ'MKIIٳ|ONk28.Ld(Rskbb~޽lWeܻ5_O^y a)DjN1%`~ͳu{<炴j${M)dB*uTw!IF_׃qXSߝϱ%vuڦkbRBȬ͛';\9}_E=l^Y<D"hf%2bю-"zmQ񭆭,~YwxA@^mjƎb헋x:6ILj$$>$Q%b/%80^-I?z|dܺ^,-20Q€2.]9Ù\SYf2*$;Ppj"t$I!ƱjVj^MZY40l0v0N 4~t WDmCčZg}U.͙e`0λVN>2Fty~YI­E>>rfTG48fLI7՗AĐZ\{Y۽:).>Tv#difdc'O+R/]y^rQo4HT NG_6>>3p /9CĩnJyOmEepYa7rfGl.> \{ț^jlItZOB@ZCX?Ԫ~= 3OQ([hԡ}]wҥ[K;v#=xGj:[(k8`@ş S1A7Lx b+fb59M#Db+JXmA`> !{MlP*S9ϢyV+x Ci+F垈E " eHNɬߵI“*ҥM1VfٙJok4Y.vooFg +oWϚ럋|"8rQ٨Yb4i~Γ8Bo?a2у{["Šm.iӕ|[ ӫ~/֗f;<ٰ*CuX@d[9V,>|VfqhUb_9}{e8r{ G`j I3bP/`I>r2`M<b7t^XVۭ<ؤzLE}RYLJvUZ9+DW Bjo1cI>B,_鰴K~FQִ<4i΋YJV؈>L 7۲5VEi%4wU[ƞ8ݣjdU8Hd9kgcE`.f! KK^viZFf7 eB8jE{%G0O25G79vW_E-SSJȩʘko*am=Q&3{?\G`!K$y`p2^TVH:-Zn>9X^ɀL [#\Mղ- ^~֬$iYّOx''pa1 "g!b38ȬL~ha/&l PU[PWI<7<2ERMϽ9WV["1QYS1Kl~!3 &aLHpFK)?3q zaDQ}=cɩuGlQC:IYO{WtFGh99sׇmC  ,·>P5YxIiѢ-7"e{Y??ԛv+ŢBk vc f}սYhuZrlqvm~hm܈"0~%Ա]lFL&{"t5ImqY \rDT(;莗KѣT;x.$+;_Ȅ6ml< [q Wb(稖+5zq87½e*S}:^ ;d0ӲhB*o$%&&$&#!FBbJOR+]ܳƹ> x|>c)FϳHUIm!9 ]_~(蹺6/(v~|s2??#\xBj)[1dszG sfH!]9D[l'%EvGџͲt&6ĞX5Cd<AC+s{~,w$?J`i^Q|/j-Yy9f_.%EDnuKk ",-<Jn]xx͒{0z8GJ 9ܓ3*Ș ۡq"$^\VG4h}]fC{zݞ[6\ްۼ4BJ,f}Ϧ^AAibP8 NCz2lv[hwbپCm*|8E^(,V:tW}fRws/ b_/Q!$s)r7'Uܚ=\7sg2(C^‰grfA_*Z&1Nf*5и &dz9-ٟpuo|12~N9霗U!bt9əiMFU&Be~XD3W~n#Fecڅ)r8Ip,~1J7r}3 J/ήH]O=O0ϸfSMYǘAm\\5Zhӿߐ/.ؽs?tlAT'̞/~}q^6갘0n u}WD^ԋTWQ3vlV)XNcjwѵi`YwP1cDH/}d?32oqEXs ȁ]Botnd=y疜9s[۩(`ޑ)Dlq ^>A&##K`6_OHmޖd4b5ipA{f+ NBq$wjڸ~Q'|w?Uy` ޓ/`Z{^ˆ ГR0–E:\l=V7gdK B ǟzz=;k%3$eٽOFkXB9Iv +Qo 'Qg&>**-mcכK &=AW'|{9uYQO7.o&$Y-{n]9;1Iò 1?_)^}s~p\"-] 5q++GHZPTje݃bN܉Fd*(HWjVgĘJy 3emYW&OA rØjl Lǥ~VA1o<"Dzb`}lC̘ dsj0ZwfqtN:WYQur3W"%7 v|)S:a<=xz 1sNAa Kba&&Ϳ `ػh٢@тxDד{(^f 8y/[{-+їI1ʈUV\ȶ`AP괥}rg$tD[QҀVY*^¼B.(]X9R"-iXO߶Tl.a!Cٍыvǚ*#Br۬DDY=J\\ ᣫ^n\P -ZT\VW*,w1q9a ]aQ;7jѼ|,#:(_SϫbX3% AN-ԗI pc;j/vndذq6e5;~YneRIfqؙ Y`+dl4@Wlu46ub|y]#4/*=z=^lq"j( Ǭi8w:οtm:ʵlYOjuשV~z"T{fC[t7xVǽ\.g812 igd ,  E-w4_omghӺy _.NdyZouu0ʲaRm}2eGZ֞2Wb}21%QJh֋/f.}Ǎc< CbP5hfh䉩b*MlXb=Ft! [㱾wKWme#m"_\g?%9(R5UG/MqS[.\mG-96jܪ%)<#<~B\?'/ tŕDT,t Gs$:Em%TlCCEtf;6;{ܴ9~_T )9Src oTD)fY Zt dѤl׮}b.}LHL{n%f՚ ~=\^1KQ`~@-Y׷l H嚚R0y}P!c{Ḡ'\[FϬXI@r';Fʑ-FJr᷿ծ$B'8r 㾻ù6ג "{3fe5d=ʗ\KJʪvSc._:o̳)g5N>䍤ADx8j%A-Ch81=F޽"UZiUbklJiG:QYtFتq IldbdHkVP2e&%qE!>WXa-f\#,別"ֵ[y #Ye^s^3o[23}vܔԛ_/9;wHZOqV'F=ٶmY09:I L3z%4cqQnG_F8 ͎ ޻Քb%;#">TIuqL9H dC*2]#ѳ^]V#`8"r.xGU6툡Eq]cy.P˗ߥ-C MOǓ~`VWf\hDy6޽E9r&/3:{md,v/VUy?j]*=6jr\#HcQ@PRR+ 1$vP0 ETLE "$d#dY6063g̛}߽w'Ջ?VJjyأ~lU@ܒ{7r둅TXStXyvh8uC^SɌ浲:۪wn7X=?qPρP"'~ƤFN ye j|~Cn+&[6>fd5$.1hB9"yBIIONRevkLG*sKd@}]-7yַzuK̨rgY,ꊤd4,y ߑ]9xv򏫐X5~ ۫W}p#8]el?޸l$6h=2q[x畅D";g+ZVg[cE#n`̈́e9/?sp7yU_v,,,ȼ3bydUiVKY2v|t_;S\ɔKTL;?]5xz I7e R㖈dGELoT_BѪ?z/G/d+^:ַGO/66do4 CeMW9rd]s:v0j6 g%yF4X=lݴq]GXYRĿ?ñػI7EFĤmUhҤ{jz*}o9!gk*8^t]Àz^M ҈;sNҬ,$6Ґ[-C.CP"𺄂ѽvD\DuT&y}Ghh&6䄴"uڻ!ind!j:M|}>pHpZb4 c zRh)&ERJO\g6\>D~5MԜ,AI/12O#@=t`V/h*}3X-x Co!ڇ/%Cy[-p',]O>%t3ͧ_=k BR* s !1.IJ8̰ Ɓ2roc|1lE6Οi!* J IhXrMp7\@anƧS[Bx]_eIm:^>vUtcRWTJ,s:fy]AkK0ӅT%de[5.lpcr°̃oh̝M/(v B&t ,:]@Zts9*/) X=>-x6H6۵1{gСOdه.ʚ޷QѲ5w+!! endstream endobj 10 0 obj <>stream h[XW>?~DAD!XEtP`b7QBI]5$h-11+H/K]fw?eX2>ޝ){f)G//pBX򡌽;=x\2-ڰ{^o4[涎;o=i8ש?Z=tNׯyNƓ [*KqrYb2͛;3GdRP*~,no8th⬯e +̺66B!p+-9`Aol`ac?iyТJI@K4 Md2X&x[YꜥRtj >1W[(:u̩sz j 5|uw=uxP]ԡ4{Z]ñB+rȭ͐U !GXfm{9XC]7~ۯbr|Lc.Ac WLs\[`qt[1H9ǔ!tRs6x;tO=߸ӵXg9hA|z ]Gz=H]@Vpr+ [ 9]aQmAU b|~-hby  ć+kCBTk64qt;If״ *Gt/n:@2^o=&v+CR޻v!A/NcBXI0i-_ ;-sgz.Y+V2zx AI#niӈa wA}Й JPzC˜[H^n w!$~yp߇q0Cl̄YB#=eU$w+W>`C*\ ]*K)@]n{!*&Nh mG!hTAI;&"jbl'#e אϳH c SG t,ƌpw T cQb5fPE]׀F!tuGp"4 هt H 7=vzA(VhW̲a!_54G&񰜸-C0ёbpR/Zݯ\ f(&9>?j:@z_h4c^L 5jՠ:㇏A+[)hA %RS+~v=+\)g)Z("hK ~Na#dI rK*v~S[YNO)-@B@oM(c'&;apŘ^ @ y;#{<[ZL ҇ X=`A[ S!N w*~(mzA#6goc3u{`uK#hįshi'0É"8ruHM.1dWӠ=`"4aI1nʚd ^U4@VT6mfgH25UD9f@Ͼ:u6ZFK͌?0ꡩ/tX/_1þ[pN!+'D5J9A%E}G4'&&&ʈ!ʖC*[jAD%ɓ_Yڌ5p` RKw ޟ kv{oYgdVmNLJKؙ1o'ު 4s/ @?03&ZM͚O 1 nso{KXGX!|D2;.63/.+dA 4okXgyF)!>={i'w<@8)vvxt?:3mmio3|PK'K˱-m؏{s)L8Lv|]<T.y8FIR_͚Q=!}A6ÀcTPDO?(-xێMNzl`3k+w8*q8ägaSN}E*kf5k4 <+0:' >+$e RǬ8ZO,#Z0kL#iy5hXi>h %j}f 0#ӫC*6n@ Nm'޻6Sf6RWJd[]h?fZ!ςuH'x6S"q2za"a;r!td$?Do;O._*W`9#b}Z/ڀ8m`PY@ڏ,큼X%x{/C񼛏V|մ2*x$<2$R斜IF/I:EJD_.3 nHT? @wW~#4\L S pb޿0u|S%q\W^~\J8\j恶Odr4w1m"S"؇! 6sbAJY׵/)a,{^>t~Hk?4r C- yN ?S3kΞ3lqe_d>R3[ٍ8mx;*'w 6EL&* cwQ aZKOq~yj' 9+_=YR4@S:"cCք.NNC^vjr<@jW6[穡Qmy?{=ݏ1e4A'C-xB/vi0as7SWg7V`$c'sEUX%r -jjUYG㋁+!B!v4Bl)l/|݉cbU8ybgm  }&;B^wX1?S{PP.E+%4 ç={|KSH!\N5[741\8! v4}7ဃٹh^))a>pXkhc!QDQFP_ Cô6vcB$9B8Yw<[yQrÂׇJ Y%DA/WqL ͻ鉂 _=<͗ "0eTCr.`sOAEF$#BОlaI.=>?Vh|Byץ͘+EY!cw?! .H[Eu\8x=Y|atw@8fAh1쬆 WOW 0R)_;l`7$N&t7H@Ǟt_uB(EgЄ%qTH%s(:g5=xX@ڟ%+ _.>y2_2t+#'Rb۫aG9D_M\>+p#"@kfA==dH/H od΀c_ tZўmUjfzJoy2[bKFCdոrueL~1?6_^V1c يe<ʓy)ƾa.ai^֕doH 헣?^'fzOmܖ򔼑Ѫߎ.Go9)x\zmAK-4o ?Zdu#r aTFkxekuy= `M5쪂"-$)8,tWQXɳdb}q u⾆`hH&Ɩ<R!Y𷆗=*(ޛŲzv*VUM)i%*C[dzC U=޲vtґ9k  Ja[wa?5:WLs3^F"^MuhzÐ;"-c_ED%*߶L2ELm-r nOQe ]5kХB 3ol.DqupP &^^X])).&AYd77! v*0aSs+F>ZU=zHPbt׈YEI^qHY~Ƴ6뾣o'@K28DSpl?`tUTzu8M!6-!>׈lury+=gqa='Lv4kUh~袡EX4c9s: ?~TLV:"Uv7oްӓ|!əM EӠKECYg_tm AQ#[WdvIM9}hy ĔC$%-=̋M|ye;nي&\Do k7?,jdDO}vv Gi[w9tLk7\-pxJ"wG%Y$Bۋh6cgƾC`$@/\R%5MBbZuM~ζцZmyy}ڻ(s1Ƀp͆oj %ʖê oIh'ݙ0и=BZ蹎xw2zsj>NQnbŊ%C#Akп<*) l$3[wO~7ra9P(&o$OM-''}CHDC/&C:kɨ*uE3˦6?zhmSV"bUFebjWFthx夸QBøG$[iH'YkqޤLNsSbep%Xf1)f,R λDUQPQTyh HtͶ+tȉ^N~FЋqs=61Uia97ČWٿIܓtm:wS=8O&ߝKZ\wOX[]3'D?k>#DO X~ c'oۦ"VJ|6(]nK/,J6k;B䋏&XBUڳv}eyr;~ub…R۳4ڏY9+W,^z@'ƃG8z)`2xzڦfa$i9tUEѴ] PAȰ÷ǻrp >KLNn顊f_`H)IWOH/3>yAwOch{s.b{cU[%f*+ˋ*j + JK*ʪ& J;*i7){&KP kcHG TLݎ7_Gf>yAtqVYE޸@ o_SLbbs,.JVSZvܵO8R*7;y[5Я:ِ&#A[~[fp}ߦD&zf3B|ߘ8Qwțw i;E9ZSf޼mJ87P=$ `௼YAm%eET;dJ6֫,w'R)b! cv7Ќ?@ @<] yq:Ӱ.+lKzrk7yv>"QX, Tk+:r,uœm;mVdJ)7[2e \UCC#VW޿:| XHaj:}? 9-aKϼC.Iyp骔Q5</`{1qCP>o`߲VhUMĜ`8q:!F@VB- o:he$% ]t"8n(.ƥM,>SqK^l#~X)Y /u(E֢_L#TmظyG+z Yl oNOD5| `_S|{^daiV` `lf'X'oDkUblnV˧T)[>4Zŗa&=JD^V[s>^u )tUӆ Ջ5GmdMNpJavvʳ9Domߐ-o<-AOo!fd򋼥-L|}:^$ E ~Wu/vEv[ɫϲz]#抨fzدAP7`SvX%80S`\,ƴ__P6|'j~zM붆:ܓgH{gk1 iioIIdЉ~vvGA63M)uߴ ꛌ?.! jպT)I1c=`MLA!qO&w(&W(9 kdSFpHb{6q0. )(2nf ڗHZ䧮nm tmT+)VtBO|ga =p丌ow5‰' ?OMѓȚ"ջ+.wZ ]\$Bk//4P{xإk#c!JfZ֖?JP2<&&[tqCk,{1$)rwGq;bFh\` ٘ |G-Awr3ꕣ'YI=0)2&hٶWo`=dI`H5ֱ khl9QFP79kK?VUŏZF=}fi,LEq#aD5Ip]f\P!!Mq4|RPdٷ{s&S| ~̝s9)LAY9i7nX {t*(80x)Jua9wI=%'z `gO6 ( C1aͯu|f;!9 N<СZv+n}y1/1ݐDpN8v^rE/֊,\Zc#cŜVz2 `$fo04\s9=ȹy6^[f{L ~f9nQ6. sȣuNOXj(!`RY3>\+9l=^ctB?p!4M\{}H"lo9pL;+Өߟr+.X&vAC<2Yrwq.};(LeP=JZ#*?~fNHCNQ٪1F;aNN'\ru?^YeG?&чs> 6}7ӟn]}}`"ܡG{JhGJ-SNR_qp*kb![CMAMldн~Xq%"5 !@T`a& NePq Bz m~oe܍2`1®O^B0ыz(n}wcx𘀶и=`fJUհ>uܸB1\-IqYt}fk:弑łAћ[-碯=AMHy4evrF쬉418ora \ݫ|7.\a6+FX6#US3 HQb(r.nҵa|֮mLm CRklMKOrx,މH¹݀%$l&5+^45~ /Ѽ$efff ZukG7{DAZv4%d߅L0ՂN#V` ;SPo200aل@! b:h[OvsRl# vXb} IϒJ2"tN!+a N?(Qms?|p2M+?p?ja mzG NC8D;AKtAzbFb95E&)hmBztB8E|1-m; h2fXw<2v5}+VrBVdX6Au|gn+z>(ƫ3iSYy?sZlP \@&6g25 z [w|RlHSЅ]g hI1]Y l+]rB^,ʷޮךyF gߴs,.*29S:54<OZEGx\d>R,.iCcAfǩ?3Open4QSu+ B_ kK- rՐ]F `WYѭUwz3TB1@ !:2k 0D.Su&W "@ %Z goޥºh\Zu ESEhV .|Qq:H0mdaW%d>|#r ^9,_~Ҿ=o cvќ &^f9c^vKd"y'vuY|`р?rY8(?7uQhDS kd+5 tH뾃U9*Ⱥ {j }Е`נOfxuT0r-k8pUV{.dllYbD'sl'2Z+>iwQ 6Rd-_X xYHP")r.! !J+Ayұ' AYr"y{ƶv ըjbG8&,((@M4ă&,>( &NF^<缶TK4)䧳MbY4LYA.Jj-/[Agg!DWrXW+aO-pwȮ =a\5J&əpl^SHR qa+@-Ջ~qZ)\Lm4"6bWh=N|> o#G <_< _@B $LkA>l1A&gî:AF1l:OBLLZΠ2Lv.qw p1x=bQK&7-%q~тZuyzN09DhPZcyU^ڱ3wDu=`d|#ŕK@4n&ɣ~Av$CWǠ\aQĻ,9+6=K$ĀģJ|/7au >h@rr]ϿC#0E!7F{OB_׊/ w+.JZ(zRAb1再3P }/9.99m:dfYEg.8xp"q@HH!vR\:o;;mٲ¥5J+%ejҲJeqf4O3x )ŷb iMx Jo;j9z|/H@M9;qt(ՠ2^V~CǍ81h g<\4mi#Mx|\}cХO܁q`bk@oNw/;^LBCii`}/=Sߤ?P݆< @kbNz;Lj[/7 BS#S +.zQgkܹ.8 "=Ӱ|x$"BR_V}Q[-;837>(3'LT\t/àyRA->͓2? `h0~3|Bkі&C?>8[mT{ xkoMlxܑvc=e'i4ˊ̿f!j0g{ }p:+LIaV?.9G*b#޽S4װ qe,K V {7ZSxA@78 ħlFOhgܯ N.M: ?Suqѳ)D`9qf}f{olbRZyE 8ԴaJ)r@*̘NycO:l6'+4 oܾOрᠥJS4Cb{WFgq:@KI 1B>2nFxi<0/Ȩ{%g.];=c_ڶԍ҄Ԅ-wرӿ]UUUC'g 00/ endstream endobj 11 0 obj <>stream h4A0E27(TtBX&6 k T{g&_ h_{.ʧcrVЛ0SR@q4 ]AY'AEޒU85q4l8tlt[`zft8V/wWm> endobj 13 0 obj <>stream h[[o~ׯ#&pQHvE H]TI HmH:<ݎzw!:(Tk8"x\#0n^kZ`e|tJx| c9,BCXc~-lN8֒1- x֢leik)pl~C7($qͫV]BRgYE#ѶB?0XϏI^S9x25 6u؆0buimayA"_)a8ΔbUZ-W&Z}"B*Y%՘%$}}CBHPdKPIqC*'H%:(j2Wf+ @K(cDB)|Ρ   pBMzz7tOiC! (DRg<_݃&FBڇ[ժV*FKC[[{qL(ۼ >6r\)c`-khs &#ɠLv5,Dh TXXcOTH*-풷X!8q6[␹RnQLή %(dL'f(QAїA8kIxDSr;MJFgqnN9-?Lsz0ippcћ5Zǰo3.ηJW` tcdi>G6LI)MZ,b9 ʋݔC1qZ<%i^P8Ԏ铕eldCRiVMD(]e5i$()<,:r*K?tJ"‡/_sטUBccm@Xo;cs S 6 nw#J&Y~ɢ9s5aׁT~gotP3 #ւCFQvV4ϸg֪-:gAe3p/%)q8hIC@qXCw9-.B&igD_Cfj5JQPy]M]!aEބaU}}.d3"x ~X+մȨ8{m.Mf] jFO2!OfeN 5VBCZZv$^}nk&"aNHY/Oh5J aw)RGZ׉W# 5tӿaD!qf*/zH|u9dȽ以İV'HZ!fcw)7ͽHoDm6}&,4.='8eY\Zs)yl' ;~K`ӡc3ljMד'ᚑGQooAx4f-{-XֵF\#taFT.!WBqS+x^j>ZRc3Gc 0`Rm}x{xmyΏwqvB/$)/~.mFYOn}HD%æUz4aޛ4I aiH7B!ىJf(߲!"RUxcP=ű# o  y/e<گ-)ʺ#9#,+2µYk;:ܿ\\Ǡb{";k1}ӬTEuI:T !k9؈R;ͪ^RwRUC[t=1NlҪȚd%I DZTٮ w4mƽavcs? 7?cg4N炴Nʺ #Ohإ0)~w8I|}qXq$Y<'3W w@N XYWf KOwwlpn ~´awk!ߙq8A༲'ӐYm.3f%Š 5bv;H0胴'0.>C_W7L!tbfBC4^9@y#SWyehͧAݞ=3^\讑Y7B+%8[=#AѧEi{{[rӛ[RV'N ,*k 95%>AN4_84}wh"QH̿Un~]&uΟ!#Zm3 ^~tS)ꓑ>ZǬ; D|=} ]nT*@cfϸНk$O"dW"j>6V ܃ cm3v7Ft#==62q,節$3hxD=$ͣuV0y5^i\~*UZ~$x>NM{j? < C`τ(R\iOIPJOWj{0󲬙k#H![;=(wWT:zq(9\T}i\&lbޖY$^e_ʸ endstream endobj 14 0 obj <>stream h4 @X\Ń10?ߒ ^Hٟ{@sY&O2y20%;[E4 &| UlM'jۖ}s}ߣչ[ ,W endstream endobj 15 0 obj <> endobj 16 0 obj <>stream h[[q~_A$J*^}>ojqCQ#f)Q&=@@)shĥ/_wos}-wb?QgP>흿xR_|ǿ|OwC|"Db)^Tݟy|<~:\>G} uA(Vc/{T|~}jdz8^D4b"67}._2p ï<"|5U:Ka'u:M^|x\=?k_1,xe@Okⲙx\X{Y?jeXEdV ^PvX kK ZI ^H%"g[P7}G7IMȐXo4iQU}yQHO,tѫ%/XOlVVLCwCV:4"zSB|onS2y8_o)J 0|vPD;JV~8i,7єX[Ci";Mw$>%Hjh`q+( ⦃ݥ}Ve85II (fvfsޏNZK_KĄ:1.1!KPV#vP=PQg}bz'qU ۛ.) O93l`N}0Fr u|㚏hCl.(P䣻;ٸjMnt!o_d:jQ2"&i}U!c:8)g_jDl 2\tz|M\0˯sbV?{U:U"[7Jz͹˸C=`6ޗ ѷꛤ a#Fdz(c*LDpmt71l/q'wQ8@W_( t!?eeDl$Kޭ5`j} 5Ck-+dH8;TI7E~s1 uVz<:\g z(+pUf5Ȗ Mbhq8dvW85ZW0&X9N/WՍ%WG.ʤwϠvu )n_;yd_9}i([XνKM~$ (4o6 sF@pt寸W7Cȿڦ2d<נPcBl. .1xt2lЬ|kY}Idz"hsw*Iw1C FCJr^PڃGnS=&828y@uy]t C'l"M o~`(7 +)ojxx`3oUa:3eRg- pңzB'DgUT=,UX6i;KVTh67;z'Xb3 _G@ isUB^A)|̓V"JM5;-ӏiuۄw4 `9%z3 cʂt08`br'GE"2 cEIf@3LQEqYQ"L ST8Ve޹(m'^վUYpB?._~B/Q~И]]$ _<}: ٻHH5I [xVo g_.16uĎvR7YG6 Ad C6)5Krܺ=Ԟ)ߵ8RQ|宆rѷ\v#k& uy|iJ\[(@}͠7@%f@﫾N͘U;nTx.+bluGH;n."k $ʊ'$y ƍz.EJMZ(Vt$2p9/Ea9|_m'أ%)K&oynOq$& ζlMLi0\*6_Zmu& r jXEkMf;c+p~Nad}euV$~3Pa|pԻ1U y]@+ɎGMȿۡhc|%OSL (ߪ tj;y檊D*o,۴x9Dm0 Kmy%Z'hRvu1Yz?z5}l.rEV[ƞ[U%[yƏQnĂ/FA4i>޻-+l|/Y}:g}/)e=6N˰s\$-H]WDXt$'TځI&~_t²PP\/r"o@;4sO^&0Af(K:AUš"簾8ooϭ_QC1͇ѩY}l7.zFؑtw)auv&&bjC A@P ј/oQdw 4]裳Iw:#Q!Լ7Nҟ]_Aę%zb((ncOh> y)"Or,'CvY=rC̪&[20 1<'A`y xe=]XVll :7'xp훟S}Lbŕb=9W^W}h[(Dd:CF>?iOI3%*Q>Ø(u zVIlAUr` n9_1Xn"JȪcU.t~h5kq0m$Ͷ5QlV۔]M@x1AZ}tNs;Rğ2 /{%aIC:AO0fZ ttbvVd,Ol5aU- {Un4[kC b)X1uB5vmc.iZs jj[ӋXpY5²e|3uﳝh1ܩh@#Os| h8jor8rnerA)ʤϰ#]3E;mJTxE\tkX(''!|vwxxfp;FG1@KsyvN;v 1l<$e`rՀ=UnL0`JڠTvP*w8Nro35d?CDU%|b8(CBUcuePQ&EۘO!y ,"6G%D(S7SIlڠe4uSP[]%(4|:qRﺊ4A7jY@l>z4)9ԼUՑ+~_I@Pwx4GGB>A5q|U7iJ'vRcd JNznrL&刃ًfLP@2:*'1t>0m+AO[eQZIp|``AvPZ=:^Tv?tV횇]R~˸ ?DmxjygHUfy.wlqG)F#*H@D(YSxѹ=)$.kVJ' lpAg&D[eS[Ns@;5͍S{7 y PN)UW̌Üd:ᓃ}ɅEjλE #&"j"ЩܥG':-%= g4Tc\4*9w%VygnxTΟAJ>J*< Pl]S+yY'.~ 6g+F9q'L:Lm3XLdx|d̚s?=AL endstream endobj 17 0 obj <>stream h4 _exk4B_N-v3߰Ku@ߋ!mYn h5sbzhQ.\L)s:D,|mâ l wzGuE} 0U,] endstream endobj 18 0 obj <> endobj 19 0 obj <>stream h[[~_a/rVěDEdZ)4NӇIQxm͌4l~FCEAvgG!yޣc}wwdVw7( _E0⫄|pwQpǻߠU'bWCU~Fd|~[ǫ] I_q+U+n& !+NC |Z:?#4DHUp(\,&H֠\& ^MrmWESzCC8dAwـPd!!|s#_%)R)~U8Jw{o۠y"az4`io(ʩFƮv`"He1Љ4`CA-j5Z!)R:KSGuj-- BsYB:mOZkCp]36!m^taaX&vXj/S쬟TOͶ$1yT*STB YcnWʣaD/ r-€ %J\oX![]&7h?֎R5O-;#쨓 $P 9d2vn߶SE[#P3m6'yY~ =':\%o̔ G'r'f@J&Ĝ%}f2ͻOOmI~<֩"GL[%ȥ&y%u4yzЅjkX _5#N!DCʪ _gUj$FBvEǂSo R aY $m!KeU/e2B)1K %񒧐7C)JbB,(m@piIoNbʼDpOn$ - kHU c>N]d؏l Aʺ|hS[ >nssJ9K7m׍ I)QIN:HE ЁBۖqV "j1Q86p& rm$NMj%'ϑcTL>몗as U|:FT+88y*q̽8^gFr޿,*H8s_j`<9v;2 Pw?JB)-,~X#PW,o򔇲*0VPk+2\y}JiҺI 3w42Śπhdqn0ʣiA#^50KY} TGK0sLX¡WQwzڝ/wo9ܠo( ABYJ bʓ 4ft a,qP[9ėM ʠp7AZ7CnV?gHpـwM++BxYΚ<M"q <0GS/OWQ<3_CdֺMk|ҙ ڲuV-6'6c+={mqiw8~A5 H<厘/}ҍcKpP@h#F"XQ!eXYDgE1Xލ XM_iF|wqjT>_EI$:DǔJcF$߿>_^ş}n0!@+Z/2?Ъ`-aԢGؿ+ >K]:)ZmDQ,ήHsjxغAKx9gC&!K>uE7do[%VZZwvsgp|T?]/ՆmE6?N EgtsXecl%m6Hi+93Q'%e ~US S+[N?~L ;}c?zd Z#hf^ˑ_a+Uh$b 9bP9="v_VS;H(ҳ1ڎah[t6z.I4NA%u }Kj,^Sq=PNESN[sFe %A8!BzfǗ3-zǾ l#C dq?_e1>r[{"=~x~v!+s=ZcMUy|?/Q{{kWE[vFb<7JEc }\[^n+;/fΣs>d31(aؤ+ :sSݡN3?s:7Z]p]nNbIw66SOe?kC¤+Drr)c[<ۥEmZHL ʘ̀@ ݍq!jj~<426)ZXAfWVDp6?{8u־PNﴼ2/Dg}_-;m>EˡMPz O}"JǴj g,)MZ&(~>Ef,*zEu NzyV;QJvKCn͇ R&kAWXH.$&D=\Fs 5+h88țnvfj5(H9$$ 2N{TRrqд ~$$6R-ަ Nءqݷs%f_]Y&qO݁"` 9lUBd*^F't8>~S| bT+wzKIƚ1zzVWZu'92k4(_?m}\зM"}lm5dӋК<~$,3e {-nu'wA{:J0IGEw`aL6z8Ɓ"3[j$Ft@k Nޝ8툭'. q}`/Yf,syy l1{k s6E Y4I s)r|}Y2G`3^#QXe<>K/v "hY+ ._D8$ e1?5D{y{av۷nUJ{hw}|! [J?CKK;ǎۘ@W)l/p fvui30ⱗkh8L^r$|(uocyN&7#B>wUZ?:C )j.Uٵ̈́$}=I.Fk!@izmaM0<@pf펪>(N 9zx~Q#>2>~n1G YfyDZxG endstream endobj 20 0 obj <>stream h4A E27@DIVݚta; !@֊G˟GL%4l^ΉAŬ^Y Ar-AuM(汲fn P6[oW>."B_x,4 endstream endobj 21 0 obj <> endobj 22 0 obj <>stream h[ms䶑_1h \js{Ma8^)?9CbFkwlӍoo?|{wG7xsp}O7_&dp_ӍyTbOww7MQ%pL62o6OPM\m<z2ŦpIȤ'F0O ^՟Pa,& '^Z [^-L=pO}A,v-( Pw_'+]B&GK^UiR…N Z㤞 o(A!>7wɃ ڈ<&uDc\<'e5pYMF4USaXE5bdcAI%1eR}3|C@6R#}ʫ&=EːQʬ -c C; R9/n H8ucܓqic|\K[imdKfBU9*PeU@Q}H4<$NXFY0[{rs=3/ǴLvcIc24QϿɑ:X5j}+!]С,,>',O\%s跽Y?"USAݷIv-L" 9WX=wH(OhrNI"Nj9w46$ԥ.ʫ LTLye.[TcR ›XN;v25qOaLpC"M7=n_᳇IGE:.OЃ ʹ E8M~:/UTV<*N ~$"$ FzI !VaT{V9-W |&Ӿ|g4 H3PO%KeɫE8%?ǖe+8kvI 55Z 'ᐥz&詒͛ L"9o1Jo Z#< ]E KC 8IYkbp%xr5(:Kf;piFb[(&aՒeWbxK%*cm8UJ&Ncj`[:"c-o{s嘔)4ԙZA!X^&XP7 )gA>)nl< \BI֯Mu8o;捩X9Ao!9H̊n)8,TX.4L[4U4QjzB )M$M2h,Ӗt 4A_!"%:Zk~(Ҽn(ҜVv +6 0@no _8 \,Z.y=ܚ5:ql#  s\awQy ypީ1$*E2á,L@Ӡ`x3)N+ \,sa R~+QT7~vfoGކ J"Ԅ?~ ]T2f4,2+&Y Y%i-rK[TeRV+/>=&:FV]bY&M `M T]Ixicm +F稢FU'hHZԯ{-uKA7 Kส UHru\XoTmN787Fxkmd-7ç` ~ǟbꯏ?|ת 8M6j*tDw$ӇƳĠо_mhwbX}tp]ͦ U0mdGS;l ";5б-'TDHy8$SY*VÒPCl:ʼ?3lFgХaK M?/?};<졶`31cy2Cs<ٝ?7*,e!$ڦ[oآpX93;S9|[\>BbFCsV4vQט"Lx\ ņew[m~yA*:)5AY D.YOTiY#!%CNifm~£dAǟc'1:HRd~͠=n4sLd"?CLPAk)P§>htsy3}td[YejLJc>7ѧN~'stHLކE ubbgPCȀ_VCmjMKX4|et֝lʠ9A}x([Sb~JE4N5S#6>Uwwَ)p"RGU-80@;mh-8>i+\L {n󐶓583*B +}򪺾休qYj%Sk$Џ}qIU]^.Y;0 fztYiz4*,C१"'6>ex3pʤakU t܆C*JT##|mE=6сE ʌXڌ[ pH<s0/9c-y,g@Z9ՠm攪R)Bjllmc&ʽ'Or2lq *'C5h3~Dc/}M^_r7V)[fW\U : ׫G݃6kaCavHiV0%i|xFMŢ2S K̖/44{CZr1>mՁSn`:&Y^WЂ_iit. l˶$XA)!e܃"F %]=-~\=Rz%[h/|+lf36avN͋:,%J !4IPzŀ[i|zjYGwdZY-ٕ ;{kʼΊ6եX;g{izx}5-ϩ W{qq7V/ )bl<*L s&(}0Μ Xwv)~yL6n.>]);KPDXrp&,\N HP[ݧ3˭ ۑc32Yy"/oǀMJ]4C= XcW>6O9Hɢte rHPh*e[k6x6+eҴfkjfq{=ͺOAF[ecG3@xK6'&<ǑɠZ{3 q)CTFOIL;.n"7PMmsbm"31]8X9cPO4'vi߮Dϩਂ+VXBr҆hG0]pk#eq{t `kmm&1%2%wr97xn̴?:Cq[8e`2[2YP9]ww7+ endstream endobj 23 0 obj <>stream h< EM֨U*Qʐϯp{-Aq.G-7Z@o+=6 endstream endobj 24 0 obj <> endobj 25 0 obj <>stream h޴[mo_Tmﻀar)Qq(~%VD]qŝ.Z$$p,h3<3dNF8Z?.pk_)I |"g1|]$IBoYܭ[hRH`̋cڶ'mN \+%*:m NA"FD!-"L7\g9ec# A/b&@TS_X@ 31ߞ+hYb^\NQ{KWTZt+U}Czm (psQ"+3^'#3Y:[|N]gcp^[|0ªY:ǃcR~ Hhrmmvl;"pƺ2ETDJ(=*zncS/9ØwۼN% P9MY 6{\d3u 0d ߲crF'O}xvA܆WY˗"g4>^،+cݜ)tdK~.0TN'6?|+0DCm& ;vS^b "fYV:(66$sFQvdѦ졇(!Nqd ĩHٻHrY[T^"RmC#L<~|9ڟOٵk $TCsP-9b)&'asmNwm)e]ƕϹ%Oq˱;L0\HHY&*L~pӥ2[4Vgkbb@TT[4f˦B[eZ:̡f+iinj H#ˆbr˺#ZڽVn\v}cׄβ]߲Cg9A舍fyU*jNLWw_&nɣXU86x-3^Httr=$%9ZQah(>)X}ƣҿS4n\m.\V=+^a8:#ڷ+K$L";HR7~oaya!fi0ݖ0k$L_TVzz7qP#>QlY,鶚 nV3&PKW-fe\k e]T&CLer MJhW,%웍F@ЪR؍,ظWE)i^hku˦, 5 Yg,l n[6nYxj-nbB,nQm6toΗ.t9,fRS~~oqceREW{huڀBeYeG!NuFfQ*%UJ+%dJx ^_b[2P!C$mAls~*8J$䗒&<8G ݽ+0$º6X?j\$28+WNBUYUop:*ML2ldg_+NS&+h~`5?,ۛt>Psn{K!^{a^3 3x{s{UEUEL-ɵg.aPr8`J#nf[@e3=PӅ3-8Z[h SjRs/gh"y26Xә6֨8|gs#“ү{6M<~)gjƕ+Y說ak.dO19 b˯9l4Zg%ubTtYq%ъ؃l*%k 0v endstream endobj 26 0 obj <>stream h4= M(U*U!ǏЃ (S&8*kypV椨x.S"9+Rɚmے=ۑۃUF=K,Ir;K .< endstream endobj 27 0 obj <> endobj 28 0 obj <>stream h޴[koF_AxP[k2H'q^[EPċ@Uh[YrE9vv}po"nIJ.yy}Sz|l>g W@qpo=LcM?'$x_HB}&ώ,1 D ?'Dr=TZ$i922 {?o/G(A $BޒDh_MfpV!T҄Sw`j);#A.[U2J}tGI %Wt. Bk| wә@,\MgH_yƫeY) Ba3J:EI-Y4k`Rv! $H3iYUU;\c @3r:c@.#4\WuFtRMQjUR#Y8+J9da0x= Y Zo6v" UԂRRRʼnI1,uNEPXȌ"\Ny8(+C\ӛ=I/65"Уd@$|JJ8ź#ZgW5F39T>,ê.:RNI.jlƦot.WqՈ z)\AѴ/x9#A Kde38t@e!]#H`g;.vf5 ء w==D_2\7 0b_׺"sV{/옲O/hbxrtTW)rnWQ:3(_$^_םACT9`Fap\- x SI͗0fqە^:>i76ַRW/:8l|,[c BF=0?0|v|~t|6Ż[YuVϛK6ލǂ-D>Й  $OrymC]t|lѡaiHcЮQ+ L;7wnzXbQOTnN<93ayӇOxQ\};5j981߹&f.m[cGG+z)JĶ7KA<̫Em9{7J Ut%t![P4uh$QRvBݏjpcŪf.f|^JM"+ !XӾjΠiI#4m;9 3~;o.WnvD XIWe8V5jmG,feVE^7z_2Lg|5l-2m/ܡ]ů*wW@N%†iOH6U:o_+B5C)4RxO63hx5ACOX'zZ.Z7:RRQ݁& |]cw-YY9s}*A(WŮ<޾l^K_YoFLKTjfo#fyo/ɷG9h,q-f(}RYW~j?/+BA;Qج貫k8}oe?Dnߞ2/O?K endstream endobj 29 0 obj <>stream h4; Eѭ(31:wH;n1P@Ӱ6v׶t<TfkYpTFǩT D*V:$V*[Mv 6t\ ̇Wk?f)k endstream endobj 30 0 obj <> endobj 31 0 obj <>stream h[Ys~ׯ``ʄ1'^٫-r$&-9 IIᱲ3Ӄ` @`(moe`W~wz~j>'4ߝ$ԟ1 )Y0  |~34I'a'La}$S |͎OOx&GH";cKNBO#>Agwgn>BQ4 #* @T !4P3bw? ,'PMK@ ]! !zFsDA[  zup2 T}οt|⭦3{"MVj, ~(-E WBMi"}iCbuTq)3&%SQk$)p?IjUkУGœxm^}izİVmJ4ԅQ̒d$Q>Ta2Jpn\du!FNi{0)- 0Ա˷m1Qc*,IdM+J8ہkIB 㑛E֊u)}8З|2/^O)D NeD~!/@Xy x;{-1+Ezi;m:x%t_ǔE@5ݭmgC6u4o*Hh4-7j_,v\_e4~D\Ef&|,FFC W j?y}S`&7Zf&ůFF8`X^2"@U#F"D/T~_qdkJcPJc=zfҦzǫ˷'G^N.{w(OͼMe3E !p¦hŻ&nx/k+G (, Ge2,&~/o-OO~Xx9y}y!V+>ٶ$S'` ,*mmBq$?¹t' s:oubE!bDm#2hN?hR@$ :06Ћd^N""6EH$ ! xXf$!":S|'ĆT[:n2Mg[L%Moc-X~@8[wٺ&Nƫ[>/rRy3- hTFm: Yh@Z"AIO [ޛ3UV{70xwlOsWev%ZF}ZȒ][lR'= %-ʄ<LHe /W`̚Ʌ, ]%~2FBFG'QhP X5̛Ub3NhU^~|#(2@a8Q'1mgFnDG$\R zF\ _mlSN ˥kLzJ])0 Ś]%50 uܼۃUYƮs0AFBl Q7PEC~XY]e_`xpy.by;`X1wD鈄.Cg4ۤsj%R|= BPD)ѴKjMAM~h`k$r#O_}|-]wU}meHHBͪM%K{(rF_Zu4ao`3Ëw\60^7=%8\ZQ =Z$.]_r_,Zqo, Пgh>I#/m֜zOkPF}U4|ۮraM}5Ѱ\LI2ef?-NИyކE:ߕ;c=ގwXeuj݋_K1~O ~uQл|ꇫU)՛W '4XwU@tU-fJ:Nn%61U}$ ob2-ʆH՚p.e<}i-.ۛELLT{ɻv-$&dօ=;FB̍w}wm*7+n2ט1bI*8295$QK.ӭg )lනakeԒ>~V qx8Bg٘g2,!rӒNThmeG, ~)s LXB!ޕ.$ +GH%8,N[.$LMݔ4xf$3Q{Dz{e^W3QkOCۓ z}m:p_ՔSE݋ ?,ʯSFDOAꔰnoG3{^FӱCBJ1bzGNF"G0x ;~gemֻwWaP 9^JSk^[C=Cߑ8άx2v냜wtQdn)\AJbr^SKP^dE$kUN$53ĝ֏U'KVv7RPSjEϠh6"kIX"VCXwBr6xUMGМj SNO]-1wxyLhWe~9<ƛjD?P@hs MQGd,3{egKqk5&7v"ʱ\]+D[kJ6 dЯ\U)|ዽKqCH\n78-Ҍ2]|{gb{U1ǚyUKgqŦFe̊,I{9DiItIځ2xZ{u[7Z%>cH}U*yKu`7y 1\6ãK5wDVe^S"2Ad#*yQZ;G, endstream endobj 32 0 obj <>stream h<1 0 8m[RTC_nw:dzQ]˻q_\AO#T5|):bXPYĿ N2ja,-GbZnJW?`}4G endstream endobj 33 0 obj <> endobj 34 0 obj <>stream hr]_K`m3keוi]HbʋJPVXJ3D =8{?ɗ䇫+2AJN"|,DP2/' {5y:1"W'9A O8“KNdc#b??JdNB C1 EHNa1TO$  2}9FhRp\$"D% N & ~'ɃQJDf1"01 BuX2u͆*!Q_i &@ɋYU q%^?Lg,$j: yLu!'3J*)M(afk)-[ϸ/t: S얷tFC|Ш^~EŲq~LPupݭcM,$HOH4SI {$Idā(^>IEl8Ⴘ!Trr@>]71CRv9q}eQI25^=&6z8d .Kvda#!% [2P671jDEXx2XqC@)܁V>٥ ˬf!waKΘ~'1 -(Ĕ t.`ӽ rC*ީ:gLv%wjn-ŽptKvXn41"xAF6/"8:‘UsnͻT*㳿wt?~>% MvzkBP> kWMT$``2h> Ro#K&p){iZ11}WNPp:H d|@!~|qCE{c<|;g~+b5{q_ηtoi3@)8"֒=˳7 "p G|K@צU?|(!y>Y>0RXy;kCMQ1:SGP-~)2?LXYNlcAh䅙,\c3HGIӡɒ<@odHR|nd|j6!Rj"׭@) [ /P;©\cG$[:}?*~!NL0KN&f^5䁉J0o51EXʵjnUHC0>}x}]) .ni㄃ I{t2Zi {+ݚ)魮Bܘj o͚oMf o~saWװ bXOGtOԆT(k6$a?[Rlvu\)٣W#+YvzL TG5q; 8$̐a))Oф\JPTS5єK-:^7JeT0of-?_^-/#.Գj1@6h24OHْ--'hQjVq![\vDžlu<$[\76H.qT<>fRq7.^yiy*EYKkDIR9qδiruW5R9 8iuHNKt|0 O}@@>nJɤUwMX֗$-ΨX{w@%|jѳʍ{aQ2NC iNvXK2|Ajh)cN$H~JAagQO1$J0t Z~̧"$A8gIhW_+3 nF%cTj!B:Z8Z8E8 !pdcX^!zϟSmZuF \0C`S27hV .0QZesVMOLܜx`y䲐sҨ.3W5śT 8%"V+nG"Ob6v4?jNfU_eDcT7yz{ մ q%}R!s/v\V+)}-βHP.]j-w 7nxSzG2ɃqJ[f""UwaS#>ܡ0!Od>%ԙKA" X3)o^(;[/nm`/AZA9;=?<|"jÙՎR2mK ֙3W_U^n:sA`#@)DBM8z9 >QX^F-XHQ1g_1bzG1XAwYTPڷ!@TO2|g5_~)XcY up@MaĩWy4~h֡ak&57jUȈ~_Q %n)S[5qw̦l9ҷ*9d?ӫf Q -1ݣQHEoF۲_30dBl~ >&guq 9..fzyθ27kS!W~].wIߪJ>;;CqHtLN9"D_G8xf ]C"h;"0GqQMy pCZU4cGwu \ TpJNi\J!tCOk\h-+BoȗoF7[ȧߴ$ξkw? X8noJR69}`٨jW$vRPQ9+w$Q|T K )M/sݚ ,dmӐD9Y ){;:kk`q]DˬƹJH=C5W-WN g]yܧwc"z4ӦOنڑ%N[ro)}16$IEJ yUCgô7>|Bh )^'j-/uܬn?dgfbFbHsomP>vG(-P4_!hkm{`VxjX)%P>YsNRKH nzk:=:HiDpͤb0$9؁͍Clsv:'4th9K sWNɓ7jG6fnwX^q T;+pu< %^_?_ٳA ps7n]Z/'GyhD¸b *FM? Rhtِ}ZxsDu|:PP*nJB%Y}>vY%Q3q ,j&Z:7F9UaII"3ىĪՑ+f雋oor{>stream h, E?ʌ@\*]%ݢA-2 ~~Op;ۏ0"%]ҝ{feWnaZJd<5s;ۜ.vRX! endstream endobj 36 0 obj <> endobj 37 0 obj <>stream h޼[s tD.I3jm2]Ox ђ ~ę.u}_ޡszłlt\G3S?qGø wl/3Xʿ\.iߋhsOGx6?$Ňbugt0Gg2`KN<*|>CaOnBB<A 㺈J!,Dl^ 5o 3s[e^TӒ#Ս.~tRhNPz֤GC\NR-MV $4V;d(R'ZyHcN9eS߷}Y}e.Љ[N)<@&`kf+DZ!$ d()3) D [yq5ʯʇ_r8spCu88X:#2`UR89d,.YWO ipuYg;PTe1 줠{ჵm{6)櫒KK]\/.LsoQ/.9#-j^0^N"iq*nOC=IV#3/|w<>IL?I77Oooo._vG\ˬ*4;"2vG_/LyƣsX9 QKAg 7(ԟPA*}O҈e#kXji(y`'uTtUEs(9cJ;Pu,AT(U4`3آ 6XZjҨGʧ+);ߢWS(m/4jI*(FQz<<= hUV?Y7*LdGŗ>18GȊMcVMQFq \̾sD?ez+y6sjx'FWR8KvM޺df:uFa- jKΰ%m\oRAwnu9sb&ClTu-`N&PL (Fx/ϧv&o̪5Ɂ_jGȯuɓgisA@| >:gOx<4CNE A茔РtW*]2cf/Ћ7ܾTS68b*֍j,`3kk˓TF8tkC\nMXOQl`(So۝4n K<*Vmy4VlCT0q#rb:u5L  [p崑 ~gݶČi7KԞc;U["zhScjm-1i/rEC( ~?>n-gYĉL-|r;M:du =p١'&0 /k͊y }> <"#65A $kΦI'g=qTg)hg$ۦ USU?o}(,x@) a3T񎇇'DYꙞ8">XFL10=l=6B0V9 >ɲ}b\&bܪ*MgF 2Ib+d|i4;Сj+(}bI9=Uai50Lѷl+q3,c -$K)[u=n {._گ)̪A0Y*5LjFQ6.g}8Bԗ['U ZݽzhM&} $…v 1Ziŝ l8ϗi*D4א87V%j.nuɱ;Mp˽ Ej`(-6Լ(~wpǮw۩ho0D#_-FA5ڻ#6ʓv i1u$e =ޑohFk|6J#͒"4]^8iPbom96 4m9lPBV^|yg֟?=op7O1r-363ֶkE)Fm6bz, 7;hXqՃCXVj Qu_-ْ`7e4 ?R4izI{B{sOZq53݅j4AB~Bu,_"k3m`V-w3XV} O6睡kWɖ,\*U@P\pY\_W endstream endobj 38 0 obj <>stream h41 E0"E,m5*lU(bJzk$0Ӥ]QOZmʒ4~ǜhB[A-rRxE+e;{fyp`GSZoWb4I endstream endobj 39 0 obj <> endobj 40 0 obj <>stream h[mo_o%}npBƱ.Ap( Dlu#QHpg_H\Rʗԇm3n wgξHJb)OʼnRbY<zy9{$ n3Jp~k6? i7;,vALx`&-`X1̕&)"1S?OgI ǒ*8IUFF2jw &;.IR}]=j^\}6!)\c5 BuYB))@CnwZ\X֕oOф$\EY?}rcK7' c 1AxX7v1&wOmC ʤBI2w*k1:ZV ia?90+)ĭesC9ύxʶ98I!%*a $J'02&4ao)JX4>5|]db75%3Ξ" 첖~8Z>rRF}"Yo g>$ޠ~VzGN`)!3Ŧ_"db{A<r"f.`QvCK˶Nə$J44vВX (H6L 83,`2+x-4$LB(\: 2/ R6SJh1wms/K{9`XLME& fW&@|;x,Lj4|=:Oc򜯝K;~/U0NlCi1&|I JÊ~+2k78ǐG!i>jr f$Wc:oQ-}@r+GHMD&ZI:V; C4PpY=G瘜"8 !%n?HHb0bq 3a8%f Iv)_K9_fڼ8 FHC6[\;ZهlBv璆nB6x7X҃bE }pI2{#XEfc>Q)X"*TRZ.u)˪2Dr 0FD :b,R~Bp|WDxkF-{?~Qb~qDE\/ߟCٔWF4Nn-9ZW%ɥ瑈 Hs j丿z@aIEOgИiM1KwܝhxMҸrLo^2}u>.WË3./tMIUQbV#&:iWe TI5A03rgRs󍑫![ʺӅyx#a^k;P8'ԂWIfd2@4脄BCRh|ڏLչA'u{1>Exw>{ xsfS:=!(=+F~?/Sy!J(!cXDbBcguTh؎h4{E\u"Sj@ͥ|Aiޯ?UU@)X;$K*vDNALO>HJǎ:?T(|gI,hNfy΂f柲b/ j[mO@]QD,dEu\*د|v _0..1kO5:6:b=b/PL fnizYGǵvAdRʃ@ Vt*l N?wqF@Ѷ2NM Rӣ MR !!B&P5 =u&o endstream endobj 41 0 obj <>stream h410 E e)5PU l/A=7$pY@'z4H4)1jZ<Ʈ`@0Mm}ɖsXl9j'M а/ endstream endobj 42 0 obj <> endobj 43 0 obj <>stream h[m۶~B/:Ch3]7um}3N$*"wA/ (.3]Lqg}ʛ׷7ޒߠ$b?7DRb&=Kϓ$!_O7hߧ8³|Nu >۔b 4E(Q9Iʨ!ОE]e .zs,&fyu9g"#Y#o "RvKVaVhsz yc+7Iu#}6! SAb1FIKt <7P)bqH1-z7In wS؆. r&1L( WhcWC?v rL4lB(!}ѡ&igFl7$E 'չX/AaLiRəMi7GkT- :@-\Ήho Q6Bn9]Tt/vE a$:>8)QNy";0pq.$ފr&0Xy6g`Ӈ]gD)/ &Wn!v `p_n9 jt2-X!MzK#|RZư7W[+uҾ-iGtѪW :I IաXNM(͈)3NN(SFP(V&{vh &,mx832_L:<9AM6mU-4BeM3<`i,Ja(stWL] g::6@TEvXx>Ypxte?!Lx(FʒTW }LR--թL/Q׽[2Ly1*a4A{AҎjM9Vr\D1wѥ]\2#YC1Vre!D yi\B#XL1u1-:%$HKMϫL r{~5PWry,nVr.`K|E+*ՊWzG]`i@֍XE83^1/&x6/ #MXd3Qꌾ7*QR>( L RV`տAb1mpԻ PmH4X᥸;Mʩ隸NNQ~b&׺@3L%rf:1ggLila<$63u 3N$*Wap .Clᦩ UrU`WjWzZnZ;m|Ԑշ]Lt ~ )^cIKRA1`3*%eX 5&oO}UgPktt2ϝtZÔ*յѼ3@k˳SXRX)m6{piN{0ڲj(%lޚ5؝ Ⓧ@ՙv5B2Pz5wGHftܩ˓ tڙWZDKtK_O׋nU<  wqp} { íu(*bYA`f`<+C8(KHjcN42dQ7=sα%}! ID.`܏}ɾ%bVE=@)Hq| |p)ў2UIK L[4 qIsE4~* #̂.t48Vaa;UMK^Xu4$yfi3Ǒ2UB\trtiY( BLa(K_^7="fb{TfbwMRk&CS,h:8F7XzohmVv6Юpc (=uog[D\sj۫Qo 2>! $AE7}_R!{ij'.iji⢇~-{w>e rpMm}0a&Kg94j0d%*h?ԓUnpϪO}XIm/r}R]K#ʩ<*:-+w }6ghZ"^t5S]T|S1eޡ=5j6~!C>\4Qp?5IKCkt>ƭ7mݕ}`C~W8F&{.[ ӠI:ŕE}ىxu(bL~;iw&\]gg#7.dX 9zԏgzӿKyo4D4_ a m/> ֨ч \CI]'MmNs5 endstream endobj 44 0 obj <>stream h4ͱ W aNWsc،\>n_7i:b(Gws~T>!S k⸌DZHY.AShنؖhؓUqk)߸`H+ endstream endobj 45 0 obj <> endobj 46 0 obj <>stream hZێS MuܢE봰^8e.cI܊T}qF9 ^YC~W?mWo[d{"`>iNHH WV8۝i-Ƙ}ynϊ$E+CIhN_%G5lzoV2U b~(NNq%(nȄ0$w !$JPdU^! JDAz B wj`\E#+!M8u63Es״ FK7XH(M怰tWI-@ѽ>cq4_ϴ a|jka33qY,(XT[pD1M'%d=DBɂF\X}yYޢ9(U ib4{Q| !\ ֨HŗR/kF 7wu0o}J0K}*E웗kCʖ*-j?%7|tgXآ3ᄀ6L\{__R'P R9P**^S&QZ5kiG:UkBQҎRH$=g$ƭuC9AGՃK9Rs 8k1n;, ;Fo-Qfs 40 pAʗ]ͭ0]6' [ Ax"APl[ 2,3&Pnn|.@s:ߝi&mMo!bEk˚ 5/Mv|?7 Up8^# !f4T 1{z/n8z|</=(=S=5j&SfR"5\ϩ}] 9q&ӰPx@gz>stream h4M  ,K7t-"E͢7^nc}8C~t<Tc*r*M.SFTEFrEn%Ye oE1abοi 0"& endstream endobj 48 0 obj <> endobj 49 0 obj <>stream h޴[[㶱~_Zč \8zWe3ìD*$s4i&noV_no%+}AQ(UFɊS8Wo#0dK%z[0KN8aW EB$d7y!BB8áp0_P$ۿlBy6OwepP^ J1Ub߂CU>NdA3m9jrXoXaBzR#A"0B<Eph"NbҪ0EGc%M!Ą@ Ym Rv^s3\z8}B!cCIH\oP|Owo&V⌅RH3=8 2!Eز^ox>-ONj&h+S1$! HmM+[ϙRo;YX[qMngp?ee /9a|0OUt9M^T'^QG~JOHf+,Lǩ&"^6}>}RƆsZ4SC]8ކF!Z7(2֎HPyʋG0.cLwKEnUф%!-ox9w~b.|xRu[A k5OS8J( ԇL&$A{z#Q[i[$$&q($7I=AIJ |<2.2w@l~B" Ɉ>IF:X]2"8Pzϲ.E2VNi}hR3( XbKә%ǘ2]M1|{psoqwo,y*"}q J4ަ##.WP[8 s?| )T`?Z:߻o$j,J|Ω0/yCH'VCs<7L sZwzžw1DX-a8 ` gξJĸ1 zY:M3^,]uBXq{:S._OiopEoX*F3&|[s&]%,:^Enx˕ob2Stf +MYٹdL`C)hD /&#:5 }olJsS K~Ny" EQגsuf}'˽K/FREya0l𽼞 )^FP)Rd<(!+ /X#:[ ;XtWu[3E}6%BO7v %piOms`$  mn>ax{;T YBAj 0.׮M$MK.5(NUaϴTUE/k5(X |2) 7>x$<#Lp!9 FgޯEDxh/"p )M}?oWOpE?*`[uRWMf5#ZZwy}yǓcHeb@P48ju)̜eӗ0ā# y$ؐ=GU?_R>ֱꙹ 3$e[Q9CXa8Hg<j6 1], m @FtCy.ϵ8h18jV\uR3Kwk \XNm GM Ky$z]nj]1]*3JɊ$!! vkl]k11r9j|jde_V/K̾K;dwra\iv# j6 <ۡ'?4Q!ЎYm{Aұٽ=f e 瓢QHכֲK/H8cP ܯy]dE6k6 $u@sI%1LøQ}ݹDluvږ}撰Pv b+ 6~8y*M튡bZkHYL顐4V\mJ!jUTx(Yo}9u1z1V!HLuLN2 " N-WE/:{NGKxZӢ8ȽXmmL1^} jt^+QFlu 2Lp1D%A+-^%۲}?mv#X2rJ 扼fuzt]vU^ΑċUk"+nSģƢQ25ă8ֹ*k5$E2OG۸!AdthXgZs[=ڥTvmhƥ(4U D- lO2+b٠/q'm !YC~.E);c Y6%''nv*rq:L6+iZ ..$w~DZCBΪVsZY[-`[~LorP^J ʑ83z{P9C^XEΔ׿~-f&!}]չl'%8zrTWJyo";^A1%şE[״>JRy\,*wgMYAb^qoT!fv5U@+,<]4>&2H`FBŒ:0ghБX9 jMe3;.K43J~cb\~\CBO3 +7Q>tk/ʩ]D,D$ϒON&,w8̓jK>m DưCza}n{WZb1 `^иbAb4دDAsV|Qgu>yۤmO 'ǧF4&1եl0d:!'ئ1LERadol$CH]kٚ0Lh{X2'?iW].S;\pzWΣj6"rS<t們ڋXH)*wybryg\IJp-(1|kVN WYxo]e R hUi_ ;C57sھMaώ k%(3C$3UO`cfox|V-WQ/LRڷ|;|I&}vˋ^ A\#L)?$w>CJ4eE* ݠr^m$gFK8Z΄,Iސ4b98[.eO!u~X͍,г}_r@3^L^3HA.#$VՊF>amj$rkM^SPk%`Ҫ:'pR]Ks.[q2_Uy%vdHX]CJ;1#!$1>stream h41 E@"CU%J=5lg[V (Sxl{gA{f A> endobj 52 0 obj <>stream h޼[ms_̈0зǑ\7t:(B ww@@D>[4}<{\-Pr7@e><> fJr _:Xvf ]x-_v?m?iO&ᗠYڜ1'3Iz'?#3R%}J9pZ>A.?[J≷*Ra/ЏQÁcPz%|Rx˿7hrXTSͿ>G@r?Hf R0Ark |B8ڞ.dI!65߮)bbgsJ &-bZf?dͯ-!RƊu.En[79M}cxc i3>ě34K}l&i"F1_H_xO:\K£gis}yI:)"4 ORP›lmҀX -+F`Q1` pS{o~{]r]_M*އv_8bC%X傫PsKSX܉ѿHg)oZ N5'R*iS]8ö@md Y+|URj{+,ðe7,T$oJA.PHHf0 %,$ 9{3 93 <0F'5:Lio:%p^ T\^3 Hq8pԁ [o4x|!대0] 5zU$"c*iE=*oH/+̺߳ɫ_~Z=9==0SjJқu#a}D+NC[ez?f}*8Rtܯ{As+GhiuRw^0/^*y ѱb7;Ԍ,)4땜89Y(t Ib.y}͋>y Cj-'I /PSM~TdRN ;Eޗˋo_^{v%vWzyМ;I g$>{Ű/Y*)CH?z\q cFoqt`.9>0oz@ ] vXYR#/FwoXl>Y5p-@tNQ %Sy_^Wo[62 q,!M{=**/S7RwYmnKR#{rŽء҅C7yjX'NEaMd ) $sl3z HE1Q&ӷ1Ąƻ \4BIFKAڤ?1s}Xtx7X61Ǎ6m 2wv6}tAERz4^7E x|[am[ٶţ`B1!{+[pb"rcdKZ":J7ZXv4{ {.OV{!^:G`NFVطb ay6[;)EBȓBSU 7[i:m9 f݁̌9y|"iM4ݚ4g:;J?jH(Ha[)p1%#Ɔ>ZB+bϕ-=T$VC/\ԎXGqqvsR:M~wuGv`0à#@ *(Tb0d,P;%Hq׺(Z{R{~n7άOUΏ톣~Ts/P$N/ O""ĭ@~BfL􋨗'JHFwEBƨD@@tt.0 (yBٛPZ=ЋW,X >u0]8{KdFoOE;A%ԞVF:#[Vmp<6ّ 7+r*r 7SA&uu^u jjTژ뼘I_LfaD}*@DI,BRCXh#Y*}aR&@n8%' _bAo~|yu*ŇCͳ뷗?yUK^;*4a9^O=!NϦ* erNx79eH;l @EJ>Ӥ~rlrFΔͰկk>Q8]66PچCz?r蘍f٬XS}/g`TٰfD豜 P: YоeG#dDZDzDnu;swc$AU`A`p %c&AYSMLrPN %ӛha_PTigNR)z׳s|kU#4cx"z+mt~{e$\#-#('L"ol wb{S{ }WIn8Y #MSnuPz}C'*XX]MR }k Ck6Lv֓7sHsQh|M&n[K2t3fW؂PtYo95e~>!I N4hc9@>J WeU}9R:n0$Dvcʫ̾(MhQ!wT\MCu,zSK=,tDS)rǼcO }vx9l9@ʵiY)ChZ`eꆎɨ~]`&Jp&U _;zlAE Rjɖ&vF.V@hӪ_I\zP?eW^Å«wۋ̄wϵI]T F R+ V5bĘueƭT!] ` M +lrn^K[平==c =pO{fӁkIАLl7}B9ֽ"U~js/ۯte݄/6XYt @SH')NM9Xz N$ǻSi02T耛2KBL`쾣 Jln>% 1#/ݮ4w~$hㄇ y1'S "\ͱS$4&qඵrKݾvj\&m*<a',3uȆuqV`8vjN״>A-!T#WR&dT0C&۔ Yfjd4ƈ7e1s;yVC[bA]װc\3dVww4I2VWB^f(z_@ li:ݞxYfkM-)8kq:#= 15Π>U>2G"y]I:9)bL#2"P\5Wg H5OX`pհiv3`s6 endstream endobj 53 0 obj <>stream h4 F_征e  nawm;Bqж gƣ@jEe1 /NwLeJ.$ [TҐPK:"֙B9z\܏7c>& endstream endobj 54 0 obj <> endobj 55 0 obj <>stream h[{۶_Je,xcrngV'}uElߗg_):gLO@.wb},&?'OshaD(7ɒTFG||%MS&"](q&?$%Xxr^hYD I KAQ' s͉*84Qb#'hPmD+Д 0M\;XѼśMi 5gལ1 Y%H93uD + BPOh5({=Dٽ!T$j Ƅ}l !g)ƋC`?_5^Mg:w{)֣{D /-v)$1^hWZ;?9O%hl93LD8Ur Jpx"iPPlwnQ᤬/UCYVFj tgkJ ʢÝmp/!MVD`P4?o+[ )%L4Au=>-=~*i8 |_)!p@&4oא]OH=žU8o߬,~[g^ F2:dM&0)%4q#z}- ~Y V6MD/t V(,PQ+6("$bƣb|TZM̳[Aܕ*2X0enp,u?-dե"Mt/,lm8@q/靈}pS; 0+ר|z}?C?hPлBNEȭ.<">G?lr! ALu!Kusm-D/tl%+ȭD-WHc+c+8QhZqyn58  ]D_r܅/es@oZ3T 1) ӏ M2 es>@aX" {C\C Y5@J }`DUPPjCA|1{Yl5ڃ&ɠlcs.SžVhbF@4G-H&xjtŨT(jfߝZƌhЄtluEZ]׾jlu.Pl%=,8o-T&/QfIEEtpu5x=[\eQ3CQnq&# o{*BB9`mĕsq*umyGu{^1nhb%bzt;zb}vQ85gh17*Y$HZfD{pnBP:p tO n*du̪JY;j6v?p褽r{xٕ P$j jKy"  i9GG&_BJTo˳Uۋ˗?6]njAݫ_)W¿gN9+1J6N3%s93ҽ~KRu$Vffb=N2 u][!,g]4b̕I&!pMT eLDD > >j0r  "&QX)kLsEZG:xk3R^M@(%BK~Vjk}JUIk (Çbj7HF4wM9v+s|GJ솯JlnnGMrao_]:{q˗?zzK؆abԀHM>~7/>5VUZjyX2?<{^j\~B\$Kj~q5ū.G{$7 KnOBbWwބ-P+2]('Lls:g0\zOs4ZǧqHyC+NOpe'|68MΧ3=zsc̠cġ[:RqٟnptxOpla; 9[߫E'"%@#$ S[esPYZ8w4]1⭦kMǵSַVέ%u]>ӊ i %tkӺ-ʖbY_>3N[ez 6N_볫7?|"Zva4.M~bI0& ]{j Sbxd k tXT}Aݢn `GS?kvW+ֵ.қA"MYVTܫYJ$y "?B2$Q7}S@""?n QR ?dYf:zb) }<͔o{&ffdf_a.gIqeטW;i]g:ybUOo] ={yi!eAăJ)Y>dn8c~*|R|>stream Adobed     $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$IJI2bJJ]$VŲ8Lܫ* $km@e$E0xnZ[MɆlpc9zt˗w֝Ctvc~U:m5$8:%L2z+fE4853F3Ŭm!pӇ4DCS$HTAKI)I$JRI$I$$I)I$JRI&IJA&Ép@0>$ |:}4V-}-/"@%}_*lᕰ nqĩ1b3;JMQ2js][sA׀Kt&Re)ZCY 7IqO0=;$).;2\fN0x-ߔ+î^-w&iєH5[ݑUFi7߯Ĉ[a~U_C/K}<oWSe6K9CH$s)3<׬vb4ys}}R8=%;nY 0}֣~knt|`-p@ovO-e.khmb}7q Q3BTqsX.bfA#P:FmW-=A+)1I$$I)I$JRI$ISik>yR YlwKA yxD\|U6zUn i$r4 ZwŧFؘk ~3\f ˉΨ}SU[N+[X07d@WnUu,~cQ$Dy9T$@`g1 Y)*?Zl^4> `|2E^=G-jv5ZyZ]ć4&`dmDs,àSq%$sH }'Z[$G +N=5mn2ä*2[^C sɖ{mТ%cmij !pQ9{el&㼉ģS˅Bfn۴3=uۆsx.4h@@wK}Vuuݛh!&CߢpI{s菚ثt<׎k\e08@#ad)鑴a@%9g,8sK=O@z̬č >@zUq{nv6qMm#΀z:uSv[ﲾ xҹ]q[N*Bط706:Gw]C,kk젴 |bLlM.x"߳Γ8k+!5x>KbS_Q8AyBs>fdrCs{-ES6xl:41r:HIeg6U%T>IuIZ!E.dR$JRI$IR>Ժuoi w?"$xO;z=T+dǴa] ]-@<~@! ⲾՙGV~-֑s@xGՌ|dTSÁl!ZLs&:~}}Y3-gyMw  t9WmV~,ydZ-su)>y#a %O+kq^=[$B?UQs7Cx{= np48Gкf}F{KHs@?,& __0!g^ѓ ׆ήDxHZOwFŎLC\Cl`nirWVu4^E̝9[Mk10ZG3cDF&G&pg໤aպR"\xs ' _lpi #h]CZhX"a\_0k䖴{|d|ea!^~chmyk~xtpcH;`2@ ,{tpC,f0Qu6L ytb8=@i0øiz~k^ﵮk[\Fb&psos=sO]D[iaWN>+p\LY"鱍pi0I$$I)d$:I)S2Ks\5tuޗ~:eLvk,ZL̍4]:kk :La1{AeqQ4NmwYy{Z47 j@uښ4y3Ϊ̲Ƅqφx+uc< +h!F꾥j magF;C+cM>a.;K@>5M\zehhiq9-ԾuLn s.D'D[־a`<[..i~omۨ}uZtq>IAH{nMݍ>TL|k2v%"D4sVio%w_ItjkE>7Rd 4'' 6UXC2pmcu`  ɇ M&1cX?I¨}o/.DT{lmKH r@1 {=;G=^2H>C%`"{}7Rm4\d=fÀ-tYwn.:i*<4VZ A 5'eRwulLkc-0\⹗Z^cl>h`kA[ WM$MaRI$I$$I)eֱz>-r*ȫhmY$4Gr<5SdaĹ&|uD9Xqiedp dv;IWz՜ޯsGqX@;?'h6呸mp\ƪrD@F1x1ˌty>uMmfitlW. kKA&OS2p%pEKffMv8 L81ςiNE gE9@"4gEꬤkk\KtW;[c7p 8[װ2]uc@x;:W]p"7φ> L2njccg#u nkw8D"c˕܈=x@sY{`XHxVΪKuiNb$i7Zs1Mس]BkǤL~~+V0IkVKi<~K c3X| @t5Ϯ^ݗNnq4w(V!<$5MkE?i˨8~*dwֻF fS2 c 2`F,^uLpeLgƆ"ǘz;Ȯ1s ԅgYKsɍ84 x36`mw uЏbnjxvQ` H̉P^WS4t;}Y|T.N3E n:j|tWeI$I%,$R'L?^= сX'(Ixh eqW2r"I9s:ïqq[0>瓴O}2\LI3̆\f;ulŪv4:WC.ُ0v:Gy{h4%_Op0MN>AN_2@:~vcO&w is%kc|.cMiVK#U:Mqk/lfwOS_9n2,!VPTe[Xa%9='lZ+ۑU=QK7'݇u?^)̏aۤpqج |ʲj18=Y"ß%}qCd\"KO?JKmte(g"8pf]v415.lLĀ$k>[s6:Ղ8l#O2u,keF#Y[Z8?4cTEGq qũ_G ٽLD#E>q0;{4m\Κ}_ը"C]}e~SeLkuq(bDW:.NUI$ jcIEϿdT@vd#McQEKsas]ht2zI';զ[ƮӔ^r y 1Ҳ{ -VA . :ZX8{9ӮsKGz s|isьs(j:I)'I$I%)$IJP#SI%9w[ GAec*9x |΋Qr#ZֈJo`<.uɘi tZ|mAYY8c:G u l OgcG\.'pDp(3~i2b8e5kkYSl|N%zmiA`#N"u pφA9H>=)qpu?7P]VetS$i~6iTۘ`B l~]NsAuNDwCF&Km8]@Iu<^r#d>5[zYoX,#P} j> iߎ{Ӷ ?*gTl164"2Usmno:N'E(.I."AMW&5fq׃ W;FUm'h`G`]¤g5a Htu+_Rs j`NJHd2憿(otJM}N!GD<Վ2 >q%P2k/asQ0 hz=yh'S>9$t Bck2]{F M seWm.G^6^Cϸw6D.4OS ise"$$RI$I$$I)I$JY:I$( Jrr]TV!!7P@uG)2}͞Gc:*UksuyKNKvcA'"6>|wxi! >0"QҘXXp0z:0Cu vZ ,#PDr =3S!vX>O)?VF6cMO'k҇1X@\ܩ3t{<16:툐>$*ޅWH:" 5FeygVe4{GLrOXdŦ\޹VERu{8NBmͯ>vj~Uznv{ź:4a=}T ~k]},2{xvԋ[simY+EF4vR[ (ts$$JRd$$I)I$JRI$I$$I)I$JY:I$WQ]>>!ddَuaݾ~kqAcZ O jyB̡d0>r<g<w]Y|UfH6 QxՌ_Ff>B_WWuOёVt;m˔K]uW4>$A5zo.~Eni2 hr䉽'Ua1>stream h> endobj 59 0 obj <>stream h[[۶~_R&Nf'Ɨ4N'WvhɭDROVk:<8\hv E #1) ǫhv,ՏW|wW7WB =x-/_2aD+zg,$0dSl̮抓P3DB r3J(BT h+2"՛|S$[XO84֏QCJ1O(Z\=u)mj[ .}A6E(`=-X}Ko lKNY*2#Rr'[)W4?{ f.;I8'!tgIÁU E\Ee%ĸGwvbn>igY)P/7>>DB0RzDZ2 lA$>V C qA=i6n<5]iO*;LI5HVMɳ>a$4\lm7'c+̆'^:1]YD>n} =v. c@v鷶MA!@6RAQ57e5ceqNG!wQ>AgNJr ]|Ntf}ts‘U_֥|xpוZjQ8LBgDx! )^ :A$a eR)!`cI4Q;~\/IY^:zE4u&u}@"#YɦaEC\^SW?.eM;X5d+о(ҥMn a}Ik]~(r)+)&TgusyN> (gY >V YԌ 9Z"h{RZus5_j-Ԫx|=[$"{R0_ȰssՅiv]nɒ"ѳ!yeG |Ԕ4Y>Xqr.+׳##o/8TCD#vGƥvhag7)"m޼{*+AObbǧmPXvEj7dhvIZnF 1j]Tzl2Qyw9pSjF9E:%& x/׶9?{|]HbHm $cw>:QqB@~[O(v&}Hh2isp|Fcɋ_8OL9R<(o;h#g9 dr9RpeGu V<)͐r+ ?] 5Bzל Ls\bCy$D'*h|h \XL5tGc'mN~q(i-ebr^{pKPtċ5fKSRYI R]<9ѨBĎ+'ח|nM-@/c y%uA131s} ì)OjL&O[w}mƻ^$F'8#a,I@wusk%[XSY4/R6KʡP}[2ƴLaڔ"Tz;_8t_CJw tWo@@;^]۳ڬ.S|U?tpse@V/$T͡x:V!Hzi 7I5CjCQ-hتLDbǘ[ WQ\idkހEY `G o5C s\b i>'Cjzuݴ9ez +v}x9vd1|lOT4E;N I:Q)<ju:ii0Zئ;5kKNvNT~>դ.ؓМw$IFg5Â\DE)OMNխ*/%!a(Wt/[gFK\P. r%D9:C@:T|WV~mj9U'Z@בqU9'1cjN4<$zl B:Kj{SոLr}챎!1uD;$&>}!6@'A52*O|jدuĸE]'c9$]sD^5 XnMuʷk˷35dKO)ZYP/HP48tG-#^ iͨ3"<R{>[g!QgL~ux^\O4 endstream endobj 60 0 obj <>stream h41 0 E8M[RTC_2@àS[isqyƨƓD+2'KxY[@mm_Y`c67@r-z1\Nz`. endstream endobj 61 0 obj <> endobj 62 0 obj <>stream h[s0#^pﻤLwT3ӦCSĘ"U#} 8HuDžn{ٌ&8] id^)2H\qw%73[_epLRD`L͋"?we ?݊dMg\0Vv>DN$HD1E)gn9ec B,<PS4|tr2Uz"H1.8b0WNr5i>y;[%j9ddS- k2b_yf 0 ,wVOkB\L\x5v&!쓾$D5B΄NIOXq"-.8*V)Kh | af'v3JD=8 "2XV7N/D&Guҫ`CdLYx\YSF:_ uҫCƙ[Mc}"fLDJAcM+aJw6!s6+ St_?~{}dafM8ܓ_0D&TXWTV rgOƙ.M)%,$S}Gfqw0(G'IvR8(Qrl9ܳlʣEg<s1Z_2q.5$q|W,?F# WƷ@Ԥg荚w/|^,m7@R^Nejr(c[a@% = t<@\<ӻn \$Ӫ~Bvy4X yƀTr2tjc.}ݵ}jc(7 ݻjHxeApu2㯑Ď2&!i7@њbd5uܸQ$Э4P)Dc GDFAv>Ehmv2U}ۨ:|s[zSt uJkDl33~rֱ^I) ?sێ  :/ Poz;iy~w{&?t,i[ubay6(a8pw-v HvxDL<AO[lSnkAQyI^aצR۬jcENXOĦm=g%~w&6gJ_i@W&͋Yu )Az=ʑwB5M0N̉a;LsGiGAҐ#b:7&p @,3LL ?uH:k֪/d/׵0@) ^rP-vPQb053%ukbhdq}jROCo7CezfJY+fJYZ((dxx&\l @5ш:%#e΂!xzId-8/r4"*p)U'=u 8ޤϓo//w??<6=1o9>rT1\~}Aᘧ CZN~}D Fr_.^޽ٯ?YwqlKJY=6QnOl CB[hm"͵֕p% zN=Yr '/d0 TcQ?tjy]ݝmnC T Buf2]gWyf򮖅=tbя1t|{Spv k###tX} 1U$z cg}ǎ 2A s ] o75N=duṶZiL@ c?G#,G"¢.T"rK*- 0a!`o뇲+7=Kӛoe%`W@z6t֋nXLAh}Cן_ ~w-Fb`0.T}Pﷄ_k!UKL"A\[(t?wؽ# qohS22cMV,3-sjE[G'`֖YS(9m rLOy>y!)bb31JnPWdN}|˹J "(2R!#a`\z𧞹-gY:J=AW^p(U{9d*ʸv뇌{ZLy?t}S[be`,Ku:p3ub 0/'X˺AAF,B-6M{mEݼsn'PѧmxBONV ?>u;%!Sv7ГwhuinC9P@K?oE/a sSx;Dp= UtyPc~X OKrq!_d|^l>IVء! , N;bϘX'G&>)u\n /4g 6U86`X P@T1o6jĠf=纽:,1:bvBAXj2b8Qw=7:y}_!Ws`8H+eG( elR-D<u7s&]a gc+8j>stream h41 0 ؎M[RTC_N:aս|mU~;.tiZh KfE . endstream endobj 64 0 obj <> endobj 65 0 obj <>stream h[rSp|fBE'nڤqmd:r/ r{ D`IH->,ի-b"+%\O-|.\!=x"[ZGp;ʉJr%S}$ Nڣ)}J8jx\ |/Wwbb'{uA712اPTq:,T"~Ejrd6}jsR+ #bC+lp-ɡn$+$Wm0u n';#0TK[bĊ?s0Ӹ .$(*k ;եqM^|Ct6_ו*ȌsdlVMz N4)٘+lmyXZN81/֩C8s%xeGrDUqPRNǦC#rI [ƅ6a쒡0HXPS‰8[V)OcԨasRޡ){!N %flca Yɢ26G}Q@THuv(;35% 1-&=QIB=>Ck<ēluVX"TOM3;t"F]R?!Ozck{=ڑ2X'c2+tUcs=BnScɸ IbYO޿] (V^!֠Vae0T.ޓo B)UcaVsPz)Gڳ!K@밞feB;U(D\-)d. _ǗP.ˬ̐*bHC@A8?'=[r'W5{"Ҥg8/}y7SzfKg#e$6WS,GбD YzBG+y\66\L<#G<#j\]tx4Bդ$@.]<~e 4ܵŇ%|{Cܘ ӣ\kf#Ғ:nDjphk^ q #]ZIR Fs@S@ ZqzscA_a^6@ 7fFBb##/q/zNcB#)CneFIqi}r_Ĩmxˑu ]:NQb"JFa7nې`ٸR|~Jv^Y?93es:gԩa$uewj5x)ݲjԦRS)1dawld:-]O4(Wt?,ټ:lȲ 3@fDio[ts|l_mWѪC#a/n"F#c:}2w:SfqqO^%g9]\ `dK ȕֹBO+v.%zMl[*i0H:nBJ]:{d;d2NUw{Ӕ%NǀZqՃr1]p. =)(vj;Opg~V>fԪ~V_O~'Y;ܢ7`Z3PD][.wLсs{}Pzk )VI ]֪7`)f3 @&wȿflJ|ythrge1ur(d2$|s*X>btuWx+V/nvX!ŸÈƝ?/q8O];ߘy囑"Pem^wC׫뻥XK(7Uғ҇ m*d dR>ljqJ9B{s]eO(KΠ&K7{|2_4=q-K/O ΏiX-w-j=˅+Af*j.?:1ٱUjiQ;BO7TҨq2o;# Yd9gQ$BrQ,\vR#{3waV>W{ﰋؐi뺉n0$d8܇yJb}b` IVYut3M~g?i%eHhO}bg.ѩmy畓WMݟy8CXÁCӃɶS}ʝZniTM&h&,^dASadjЗx>m6iW3}kصC;򬲰:J]6Av ҙz!UVT؉ށnWh:W"HUC\ {|;s}NӰ YZm%qa߬~jJLYNJ& T8,o_3Q3z[uMU+|ds#H[f[@wg^3(D]m헫zz*`>OÑj+RBϪ3xM3ðh(7%r/PNXuU +aS}`ҪpE׽K ~~ۂ^CҚ/ Ϙ;EvMu"'s]fdrM!u!Qpf\Q}9QvKX_O endstream endobj 66 0 obj <>stream h,A 0E27IdVb.D+N`v8Q=˷xGnz_4Gک9j.^T~2%u<,`Ff/A^ZiSkR)_ `,& endstream endobj 67 0 obj <> endobj 68 0 obj <>stream h[[sܸ~ׯ`p\.qSZ{eYƑImyg(PplߟHh=)d{.^.~XHD1O$Y@P18o1\ EpT??{QL+և "1ˆLCPdpX/AH@("S__OgF%I /8FT bP$2NOH V.[V G jV+Thq,b R_hr\5TSK! ? al(;*N^Y$Xe\cH JN#[Ќ~pX-"A 4kÓ]fUQN퓡Wl$=ZФ`#xrVm~8!ܭ #~ ifx@${KK0;I|^]*/CakbJ=!C(mQdIeVb%+}F̃;O xutyik8,I E&AGᏮYU d"Gev!" 8HJK ^Zh7>~1S`K+1m^x;^y{/e)\CU/~۳y+}щćGc~cH<<}z!&p6R2%9R;x9J&{Ebo?>65RGPA2^ŗ[HU:N$RW?PPU#6~Kyzɨs.+!$!xYBI+{Y+pVī@ڵ-'ʦQ U6yf^-L-wݐcxV]` !y8nܐ;9gHg֦7pc'3+|meV}36Knv"j ~f 3I?N| \[DdczN9-T;Rĥɐu;}M0߉o?lJ@u?ﳃSGc8Eo )>:(njAL?ׅjon[gSn*ѱW>U&ss„y4sz(g;VnC!=)b^2_ۖ#mDNˆO1>R *ȯ<ѧy2F'Ktl#p >G9R? =wRI'Bu:p / '{6M;=Q`/rdD Xt{?΍\Y*88D =Ⱦ(:UYVSxu2*e4DPi} ~? T5도a)QMi GG˵4Pwyd O}Ѽ": nlL\4XgҺ>rۋظ(½.{ ;wD>V Ψt )|cG9}Id4g9LV!mj]vF8ӄi4f^U Annî>\:ѓI6VޠSė~)Ce5ζO\f Ť6N &r;^!ƓbjtƔN$lʈ8b =z[p_[th'9OCJ&V5AdB D<*DoYs\K/scUjkxSF6Jߊ147 сP/wAP_n=!Ovk9c6jl +3"}bgCLSn #7f2i$ǭ#8AEܰp G~$a:i"ljjm32&O[2WPI`K/|c≮| 1xS?"Uќi'9P;/{iLRgsvg,g/0Jz闆Ҟ[k*ڈ47BO vIXw !|:g@.v#MjnmKږOxOiA|rR2lnp }UtB;A_$&S5;,! __]^AM 5Kq ֤ ;MLECAHUZw PWzW C~:׏ JSWGҵfYo;tDHW6 0Դǯ/Ҡw?_Y=?z˻eC]R|&6 ,[<\~~@~py/ˤ~XT?Py~E@7wX sxS`Sy(PY2b'}3;0GS,CUS7;EjeQ'`g {ݪ}RM+k2xV5(żQ?O֓(RvƂ (Vx5`# @FvW\lJotxrʡBKIz&MR5˕ՐRR|!q!ZFsВ/dq "`Au3 @b'KCBR"v2MAh 665Csf$f"4㘲hTb),5c=R^ggΔg$3 Okx\ў$Mo>,dĺXD'e 6eHC"6O:(!nsMXF2[*R" ?,1 5綈`Q@R$FGȍP4/g!C̊ TĐ64G딑@DuF!hV&( 8o?cv?\_ Nus4 c,~o^z?^iR2QIMWuߞ~>ӟ,_L(X13ʯ׵BA4A1ӗ1lu]&yuh?ymB g*BZg Ox$N;ǩ5>pZ-`'z=vŁ|s":G [kS? 'Dne)}0Yu(0&bB09^ 89—ΏLJy=G+ 3bEiRe$^Z*P l6CUo?q٩YJlPo&F8z J/o !r%ɤ?A E9%1򤜆DGC٪++CJXu`|Uh\ńz:PVhU,YCZHvS*JUw1 #g^^X f#ZqyJBqX[U.)z1f($nҞ<8sXoF}/^jJ(vbx㥋 )ȋ}Y5iN5'<ڎ pɌ(qAlE#9Ž\o . #BگdjR:쟜ph/*f7DtX$Q4F=wky01EpBx^c/=DB2{9~Pf4I}=fMjCGfKCdb02< FP93LmDyڒlcm<ƠC^dfRK~[.Jxg*>fe}g\fK};1  86M{eՃq@mܻd$Ďz~П"t,J1ۢ4 AWJy=- /:r=,l!=Y#_g(h}Y ee OZ4 +~dINԬAo>TV8Ņ5 0Eǐ'OKP^TЄ rCrd+-(p8TTۧKvs=0dijpdl]ҳ 8HNGE3]1#RѾk@nkxG (̶Q'$9dk ڡ׼/]QύvI(TvRGNf0 m{B(usU-'vV"79u(qmae9;@H#'\][.`?螶{`1$e돆ҭ}D 3x@)nSi8 qy C~YW]f:'C?Id 2!;{kzleq/RR iALqp|fVV}Qm2<%m;Kc{ų`EχaY}F*z u|PMTV7ı{Y:9cVL}& O⪹';cz§1p-ƿ\N|@w4Lԇ"=1@ʨ/kLq >? iDFb!X@pukEvl#zx?LQȗ^>E",G7)j-7d>oߧ9.^?WX$Gs qT| gwJL߄Ԋ^j<ƝBY Gx{gGXzO7A{\!q}7~g:x2@+C]B!aRpuy[s.Yӳ `Un->Ijت(Kqg^%5%1Eѽ&I-+O<|TiT7`^X5*[fG?gfV5wvڕgWyd[Z;/Sb?vmmJ怗`eۢm =CºP=[uyxoE`DS!f]( .=R;]dy޵ Tu ھG9uj}̃qDG~%<`?'@F mDaLOws3"J6>x&`r|݈rs&Bs5=Oeu_p&,'Kqw2;۵r|0AjM#ip>v/IMӢJruz(Py Wyfs'*-ǣhƆK$SCG֮\(Ft/'(aU`Ms'k &&a\n2 #ᤩKB)1i[,ɂ$6o,N&wEDiRgc*o*&'d|$cޢ $,Z_>G{E>l6wew-J'Q[h I \m)Kz Pf`;h5HvkXӭR;aҔؗG`]Ծ%P 2!8Tq+Oe<^x[v68uZ(5,%0 K_n̓z c-P=XxjP*m׹ [M>,bZ.ӛ//TvbD96j[gfTZգOvp4Ԩ]?sL"-9_ae/ZqstpϜ"Ӑ "Gss+KuB$ !نLl_݇\5/׶؊bsŦ"P:颹5|0t7]bob`֏ϫz;EfGӫ-Ӎ~dJCh^Ϩl5x0:D޷(㗞\0/HMj^K0Ժ8^8җkg uXOMzc0-!@u9v= p&@*?$&#ںq(4DQH\T;ڼȷ6ܜ!&2LȽ  Oܛ endstream endobj 72 0 obj <>stream h41 E27@M FmdSx|{~Fj /n!ɩTfkEhTFWr1 q'>z_@|,Rdy *̊dM9qs1}E_ko) endstream endobj 73 0 obj <> endobj 74 0 obj <>stream hZr۸SܱLw3dv2tN.%:$"Z(R %Yȏ;8Ы|bv1{XF%81HLLRb;#WXٗ?fBٿf4"\',REsf>ǘXxPѪ0'@,4K JMTv3ɔDQ~w/_r)MHKa & K1<n]8cKcʖ{Y'JG=4`Ƅb){M<( Ҍ$|zSkQ3Qqr9ט&9hv}}(o<$ǔvFQZ2'|WspkY=0f8Co:]zNJ1`\JzO(FHkA|;lǠKm)pL9ɴ=ʇPXCe#F-]0C" 1z[/ 6?LXvV>dEDqv}T?V1$.Tư1+ D\cO!SR'Qo& 9ՓsQf(Ä%ͧ`)(z(wiQR ,sA|NN6\XX,=(!hl3't7*s~ M]f{I*Fãlw*Ru2AFU C1xj(amзA0S*GS+ufUJNfQ$+Ǹ;4oN|cjJ%ё/[R9I.ʇp)ec!Ƀzc"5a5?! ummfNU)|Uwڊ# Nfel)0XzU]"dH[0bFڠ+{E >pn ֛P݊)I2 ϥ_*SN;*CW]}#Q&RRC~,쯡@pekS]A 1`Ճv~!DT (zs|4MMPcR hS{6ha=McFPg-^EK:jysqyM,o8W:7u4 "J)u6kD{{ qٮHe3WʼSwS-'1.@a M9CZiA~rJnX6AL 2L؞rzi&1PBAR"peP<ɩcass_;Fq=N}(+Yg+ 8Te!!ex{s÷o qʑ ĽnGݜ!XJWX㯿O!Ͽ}wfgU~tA7,?୸*V3od',$n %)̥I079i/K%vޥON̵s sm0/8d;Oݯ_K]UEC! c~{HH;4BGHvKh)ًnNWo|v 4B_WRm}ׯ8k2h5DKh(*`K>Y=u펎A67,-},*N 8]KR7P-ƁYSG_w,Ř.*yv&-x\.*;PƵ=9DeKF\tE)> '%,Wn6h !P٫L૩lczPct'@O endstream endobj 75 0 obj <>stream h41 ` AX&kTتQV(Tfٲ:Gu-r}r#u?iR-s8)SS x.^Dk.Cdi7f'l|[LO&I~ /U endstream endobj 76 0 obj <> endobj 77 0 obj <>stream h޼ks; 8ܨ؉ʹN&! 5_!H+^wcIցݽ}?^#wx[P )fA{e!<[䗧0$_wv6C^#=?ٿԯO{ H/ XbQb/_f sIDEc/"3B"A%@,CD%>s^A|rgyЅN*0 e]8Paƀ$sR/?%!`xEzSpE oF|^\Ď_'KPHbśk@- H7YS%6@"R?g 4 ~8*ۀp4ηIMB*_LAH ? 8&h7.-$īIqhuL!6LƴR?ɔ*O(j.y`PH膋Fz (>Ѕ4B"bH[ -I0Bądw,UJP!U9 b36d cT폩Ny[)mKjs12i%'AEN(W\|ڟ XpmpHI/5:,50żĴOqDIWYMku/x@FȉZm!XH7$;x<^"ZXp}Vf`S(ס`z!/|AA|V@mS3klDdjP9?`Ǻ;0oQNXZC|c.m+ +:K^sƻ݁{]_I}_I>#!!5b݉w~H:WSϧRrPCC5Wu]4+j.<G3Q&aPlq^!uNXoq"ZO>JvD8K(Ϣ'p]+ISI$`Cc? T:rȟ7!4A¯|}>|":OgC>%$ F:iE.g^qC)!5Btz@2F?SNջuP5F: JJC!̢S8dAuY/V.TV1cT|LRrT,n&ZfU?:}}H*lSzAn+Q#߬b5O&{0DH6I=aV@1ȍ>,}VIED4:7T(}S#ZWeU[ѨI&$=6 5# \BzBxf(g#wr5edn`ZM\LɥtJ'T^t,'1fOr"ںg=rVwߐ_21Wl0Oq8[}z, >stream Adobed     $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;; "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TT:V`;6:5foxIM4A%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R;V.w'-)+mkmRI$LI̪'8jYђeЖJs7EfMOJ9iG,2IWɶhY1Vr`IWtrεݳ9nfBCR'0.EWGWX5Y}LpVzEA^$tI%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJ\N[O[WD߯6RQRIJI$RҪd5ljEɻfHUzcV1~I$"I:H$3+'Oj;G{O$4ᱱزC,Nͮ(ywlarWKa`'uVd>Pq>ڀJlցWbV%N8JԴ0+u.EyՏsOе rNwh8r =5¬#ܲ?DboCج}2zx=vJ0+nQ ;]EAo6QTRI$I%)$$'XCu'ח]41,:8Tu?@XS[[vSs<kN=A4O]=?lRsS/峼@@azpOa*Ų궛hi/Y Ibѫيfڪ$Y9~k #>_,ju5tPNŶUXnƾc1 |aF 3,ϴ9Đ ;u\Q;I .;{ AYuu+kǹǐI- BxuVu|kq޵/[1^E'fE.+;?{zN"ꆠ[i|;b}///UY^Ii~iZ}%DžG q)nEqV;Y8ue$#)AuƧz]3z{c/;X=5WUUOKUhCnd{s"Dc?H5$Nk$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R;V.w'-)+mkmS 1Ȭաb,mO>$Jk:I&$t\Qs`Jm:^]*y4M y,m-5StZV¶L`2p !2dHSIFBw:Np9Qmo>?kNOP WvݎxO\ޣӜ+ΨA+KUOcgkpes)$]n%o-&S$I)I$JRI>0znFHlV<^k'B&RȀ>OF^6NB[8̈́;k •S{Yb\xrWGL/ƲF%(4GI6XoyZ;+Goj܊_sk x,M6W{qk`ϊ]gnMϯkyd;g;yly1DuCWO\O[).JΡԳGK~ыڟ9 ΋kvtc,{8i#/+,p┣w\ D>GZx:kր\8B0v7څxn#tT%tLq 9&3X>xhFtY:Njnz^rhch< HSv]UYiEղ[{,6ۃ1In.t #^7S1lef\,881[p?bKǴ=k#%n1 Ah _`U2Cr\6RI$$I)I$JRI$I$$I)I$JRI$I$.w'-\N[O[RSW~)(~)$f*Jaj,V2Y I$D0:I BBI:i cXW>Vc]q6䇟msi.k6jnʘhpRN1jNƊL,ԪcZnǵO3=}WfRVKT]\x8+EG84XR)D!>{zNwXp[ [u$kzsY?6֗þ q)_Ce=ƻFW=:]B@5Y}Lw[!o-&"@L%.mUY0r`*u`pYBf-,Vxeux?GΣnMO7%O"r}m{xB]r6d'̣[=ԝոZ|Bޅ[_GOITe!hz1JޏnvcׂK~?ҳ-7dc2]#R+"2D(PdP9[ck>j[F;u0CX"xL֯Df=5-QjJ?BEαq?e$8e9 YV+e RtlݑvO^5'h$e/rWPml ` cD5IF$I)I$JRI$I$$I)I$JRI$I$$I)Kij;VԔ6߀J56߀I)TϠߊ!:|'IFCRI'@I$4KˁWǦ˿t+_>](i^UF#)$1k)2dEpPYT.Ck,\ާ; X(LWY#. ֌'0@^?r%Ӻ{rY|+PGsjȫZ2|H3K]mӺqVGYZLf&+eRM " =8kG?:=B^E^vcc}S ۮ#3q>ɒZݲ"8ӕzxW'^2,Jzo ]ըM?Fj~g@r;mGzY_Wsqr>= c"8*u?Zp!d=n{C9|Nʣ445@8HDޥI$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)Kij;VԔ6߀J56߀I)TV?QkI& a 9rIԿ-,c7֒ts_Ve&ҽϴ^UjĀꤝ%KtM1\h$oՖL{츟븹XV'.p?Ҩ:n-?SLjCe/j$)&A%u 5e՛-n/TymˣHC\!pAM2ݼBu ,^??V M4 ПꄭvWJ\oZ7uNV-p`!;0f/Y8蜚?u>o=Yt3WEUA(h9rJ{Os<~z=8kqn֪wcèzY?6֏X72_n_]\Duu IK"ڮ |EAn'I0)RI$I%)B۪emlo.qSXYSl}-mp867S@O$`M Zͬޭs[D:KcgvUX8b|&ͥ-DXXt 4}gcXf9wYe1łCCF2w~&dܿCCv)]ױή,m~ EOO鹶_m$XZZ@= d[Z7;-tyX=>8JϬ~#W+żcmh0`hcuݙIɶl<Jnga8Aҏ.I$*I$RI$I%)$IJI$RI$I%)$IJ\N[O[WD߯6RQRIH2jW%RNG?sI&N:a M!xhu܏t| *qT]gq֟ }p3ѝ@Y6WHӿZ*k3LGT$(UiI$uU|' Uƴ~hY]_Skp ~%k>21$ˆQ!%A,KrM6#}^nBP yvjgcgP/vݮGY*=C^W6wGR湰jɫKߣ wcO 7t˝szN"HZ5 wĎ1e7/)ևgGW=zY Ym`+6 :t NsZT,|j͗Vܪ6uK/&gg^+oÂj:t/?Fn_/#SA}{,m8~-W1(R+^wO2SSD ry,p#@NHbZA 8$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$}յtKijJz o~E%o~E$ M.T%h\?DR@h't)!N. I/oQ˲[,+?|jbYah+AS>zb;$% 1)8L*\Ecb:Ǹ~FMHխ{1l))H&BcEpXPtIJl:UˣV9V ?GM5T͎+Sv~gSYW6)̯OMGt#lBRG` ^Oaw.2ܜg:+78.n&f&s?і<~Q`muS;,htwaweLz7?A՝m >g6Og ,k ӑSsص`06HeEvߺ%[&1+1!C2D^x;':EcKCZ5$ ngSW>zk=Bmo;#=Ϭiw6;z{1!tY[uqAbuiLnְ an߈KIm".G=uzzUѡ"?BݜQvϤ?53qa3va>> 4 @*@Q[jpCLC~k@8pRNbRI$I$$m; cD%a8dٗב_KA dW2zϮ>Mu]c>[ǺOWK~{Go$|ޱU4kZ Ug%fkTX7#0EM#W$]rouωGG2?.u u,e6K$LF ˧8Ѥjٯe{ImqV]||'˘2.ĦgNƽά>Qq"&M,5s5w 瓙5P$ބQGwI`d~rxtiklݹ:jOg([d=Š8hDe5@q '=KozuxmnW@ٍyɆx뎁7ƿbI%TI$.w'-\N[O[RSW~)(~)$/ՎB<..>p|ISԦA:a I.;IuWU#7!o9Gr|U ̰>Ad$KٰSJ\+g;꿿 m;Gղcy4D LjYd}GP%Sv)S~tk[*# |u]Kctfl;i^x4,ϫ4~ &km=KgPqjaHH=; MuJGIؔ2=:CF^U0(W~*Rw k*GB < wض[Td*=Ou: 9U sH !Fs`4Ge6vu,rX'rpٍOk)U ,wM!];bse^uO##-szwC2>E'/ nNf3'M%KDEfզ&tvɬIRp'O0rިc~O?ݏS]RIeMjwuj%ԻGժ&&DX9d?ʃzEZ:MpT> n^udjȨ}&;IGQ mo?և>&p1G?0cw/Z>wc ۮ] bl$Ne[цߴ^4qAn@7]Jf6emRe `Y:as~$@,oWe ;7VzѮO)+j^}$Kh.gJ]9eyi3`.'5Mr}E,K 'Vu9r"H<7: 4|5d|FC7st*Y]8uB!s Y$1OV¶}A&-Xxb"ZNO\\ /r]\"}񺿁[&>HH2"D>*}^"Ůa̱{R6Q~edu- f6LNjC:WU! e;][lsx¿Kq\ȕa$f:Ē4#M5  U+-)w$JRK|15ũDgu /~.6Xk]Ԫ+~mu ,IRI$$I)Kij;VԔ6߀J56߀I)K1GYKrǦ'Ŋ@R)ˆNHU2PɳDZ)7z=2`Ĉ .P[i"q}osUm^Oƪ#eLEZ7) I7JY_Z2ߥp7kBc Ml$xsD C&?xk:cXֈ A$65/qI',^[q7%=Ç\G),ʶA-~W![lSUtʪhmlhCLxɒw\tR,YN-ǧ֐JGZz5zNMYڏgc>V 8XçK~BfAd[!FQTP @$ ό9^^1O?[n*srqga-(TH i|Ց^ץkQȉ%وpF P鵓a;c]t*}7gGd\ȤErc!]]:uVxz.c1=7x@JR4!?Bgj^, <,K7t+ѵ_MW:/Z:5dTvCs;/84:8!auGVŵhIѷ7/r~S'..g\z`֗9$Աq7;s+g'UV qSQ{'v|WhW Vj\GގC2xG]/ӌ@=F㛛Y&V}wֆ0p=lkB龲u =UP?CL}Oa5sars*O69 ?Lɼ+,n~GY{K4h=,C+hkG6Bnʖ6OY1Ƶtxznc+ek\ {a{ǿZml+6!@XDD&BaE(R'VY ZqlD"ƣ&QeO8H+ ?>p$X#'xOP wvCr[,kmJ ʒJRI$I$$I)I$JRI$I$$I)I$JRI$I$.w'-\N[O[RSW~)(~)$*Y䮪柏 Y-4IYi.0NW 'Zios s>^wR>AĨr#_kIji):dRBGY27dXVM{l&?}Y㸏uwqJc @u;]־Pv-ԟ ^Ƕc5 %eY³9,ϵ긝Si|4>`)8Mr~czoi;o{q#~Mj^=,֎,xx:s'[ )hN'DD() 0V @$ '$tUgC7!8("8WMz=GZN(N)P/wgo?zM[Wvw_A.rCP?ge`-?b9ݗҸځ>~Io:M밎w§VN6[px .zc22hqgй;$2l?$:㱦ݿS*v>CMY۫v*re-st?͞tOPn܂9̓yP~/bёס(8U7tQ/h5]YuwqTr0Vyty ác?pq;]\Au:77wW}&9n`!mF2I$$I)I$JRI$I$$I)I$JRI$߯6s_9om?mIOA_mȤ_mȤ-#)$#%;5pj(I' (9Y-&[Y|\v|**['~>0#&G2"QY`掐eII7$\~^ұiJXM֏#cԭCA'@9BOW~_, Ĭ[ac}TiwKS?6;gOLbccei,W-<̖bb[ ?Xϧqɷf| ?GT))p`HgD@(S8 ZqeF77'(NSr,PQP\S b M 0(PQXsq1*5^r=k`^]k+?kp4qķǺ܅cZ斸4 OǒXx !1.?M"VQMX<纾j;C[Jd\鵬WmyB,=Ov<'&̊2U?6]z?S{?Gs4}&9rȑU21[O)7wK1`es}L}[Y }&;-poPAIDRI I$RI$I%)$IJI$RI$I%)s_9om?m]~rڒIFI%)$IN~cb|D+y.*3q %' NXnn,{?y~\_-i@ 揬 QO(2Ne'1y᠓CprzzU宼TX̑d=9?Qu?"o?ank, !X "1@qdN_̴cU~ր^Z1h?VBo >;~Li$W A0R 3Ep&E(89 C(2#0e7'G!82`nBr# a,X n(N*3XqCqRqBqL0eGk[c 75<p4n,kk||HWC=FwL >0AՇR6;[ X[x!P`nc'&Z cJq薒fGth$I&t^H9c.a]\7&Z~z n@sۥ;G0/5їNUB]2q2LG潟/+g۟,y>/MU`(`ޥ~YsVvJg l$ $$I)I$JRI$I$$I)I$JR~rں%}յ%=ͷ?"ͷ?"JRI$g Nf)I NdzIT2b]wyȱq'zCK95%ܖ=nFnU:G2ڝGY_YeWTYɲLbCU2~$IU Gֆ4K+[Ki[iMAAS SHeJ (!`-;ޛN*.zz )҄Rs DP\w8!: <bBsЂ&X'9 D{^`!9na ,!9:PJa9 I(Nraz; 2iՇwi"`hr 3>QZ-N҇bwP~ӭ9]7_6x+}J0Ӭ U9f`n8rGqü LTn)gbP?6/ު,a;eЃ^r/X17Ys4^]o.y6ї'mI轿> {tj3n*Wd+ j;-nR~u Ea%eI$)$IJI$RI$I%)$IJ\N[O[WD߯6RQRIJI$RHYV 9eݷ㪗 Ԏკ{z8YqQW֋6tL9*sTnHiqܫ4W[ZeXBFOrJIOS $eu~Aܲ}_6;~/01 '.֊`1}ZaoH}<>ǹ*?X.5>Tߍh%bZiVư|& z<ܲ:AgU'ZOz.:vՒO}  _9LTHfL }w&ޖ鷥؄Rs LW/C/P/P/M1df^/d'BbÍЄ)(( $m ؂+rL1,%ۀUuu1X4IqL!2ڶ0JȾ؊=:AdS_^Ptk]#˝Ponf_`z\:#Cr#b7fecu?E*$}qh?˲ұlҶ.F{SM ؈ɓ<~u8ucsݫĕ'HV\5FuԷ11mv˛ovzg߬Xc]I-۪?I+KHRlv~S9Xl"?d`es_W~b|QmGmOcV7 A$I%)$IJI$RI$}յtKijJz o~E%o~E$I%)R .+INH,.sV֧nĠsvUb<.?n.;6չU,܆4 nS+tJ-Ð(+/W!%hnYW|0$5 :ӽ\ȷ!s_-pkox_ \95'Œn_U^<"Kdڲ3:]gI h앰0PC!!0)‰z, ށ-6z[wޗ fJ^^^^02, YR!(f^^(&.P.P/P/L1^"̹ACV5LwZqW+lbJ0sFGtX>/fc*@2R}1ʻi=3(\?է  ,C̴E]㕑j[V$\(X")g'9AQe {^w9 &hsPUABsBafe?e׷\3^-챺[KĈS-v˙~SߓO+(Uv\߬X_[Qk4Wdo0A(t)BI$I%)$IJ\N[O[WD߯6RQRIJI$R^$):hy 3Sݗx>gkiZ}S0~.!nKrҤۓAܟr\)Ywq.cenw @lV3H[\eW9+0N :͘G}8ƣFm9RX+`8ILc{n>{zENkC=u[C4 b[; NOՙrrrri82,AEd.Q%F`"T Mc[wyrNNJ" \#XI$RI$I%)s_9om?m]~rڒIFI%)$IJI$S,O\'IwU{w_Xt4p(l鴟V!?9.!JpV4RR SH\GP!qZ7ٲ' 3$ke3Nn\aE~?CM.vlwrn 'Pz݋^cd-Mƪh>A4GP?t~,bx OdSʉGzp0M> ރ-pےިLQ7͙qUOڹ:`bok7SIӯalFz԰ֹ> U#5yozcEs5߾yM"Ga^ yw\m0vmP7u˾t4y68@WEӌ?f;4hn9ֻ5'Iވ{yeʖwUֻTs&J"^rmn֎ÅG7ccdߐx8|B:Q c7~jݴVO.:\uL .r~8KkP5GR<{V;lrrye{싔 KKLYW.Q.Q.P.M1^"ȹ@1r)2.P.KT(ǁL!$"@HJ22o1IAjs3,ʱi[Tr!8q=~;G 'RM Gc;1?]˧?V&O1ӱ?`T©̍6γQ vPpЯZ2ss> Xgh׊eavIkJXL#6!%,šP%)$IJI$RI$}յtKijJz o~E%o~E$I%)$INk/9+۱+lmhp[117G?I}X#蜻|; H yC8* 0'܁ jcS<K{e| uEChʯiq@GI؈?$]js^ -=z(&26g]uN A@cd %QQmn@ޅ~n6;w]kY:@Όt93K+'^A rXϐ:L}PןMW:]`ۀػFk!][/F%GZU]T2 8kD={d4 bc8ʷr}l)l(9%ʶVn6-f̋~H,@jtl*G xl\| =K5jmHC4ExNFA}Ο( 2vwP24mPQd}vy'N×Vk矙V=v}G>w?%%"ȹ@1*"rrbTIL!x J;>u(a5w)J#PR{. 1n3{8҅~K4-/PzL5PK'f+Kp>~I#M?^9jt2C6xQJЯ ('w+7=),Zz`tz)߼VXKF?%jP; Ԕ#r6Za+Uu֫13i4'Vh I$JRI$I$$I)I$JR~rں%}յ%=ͷ?"ͷ?"JRI$I$n(m,VZ.ϱKrt+?M>` CʞA'K>{Z>.{Y ,ˢzuN<6w }b+6=5ʵV-U>ਛ>˹?~8W~- cl8R2k+K\;"~郋O;H1 P=n3UQ!G}VqH<:k09YޖjGyEףT^#',YS@y};~˜K80-{1s[x:܃--E6ې&ucK֎I0}6U,6Z7d[WK<"R /6JV(8?o_4$N^?u\gJg3R 䎐rzeT6VЯvPcTMm*Uc@I[HE IR$I$$I)I$JRI$I$$I)I$JR~rں%}յ%=ͷ?"ͷ?"JRI$QqSBulhL[W'[e9rHpA\lܟr)Vr՟Kk~+~m<`~ṮGcLWBS~IS5r@O66aC?\FCq| KަH6A1E8r};Mn)w$^`JFѳX;kou 㗇<6&>3bA<%X3ڜ:~6jűgC9?(r(:3H^|q7<3OU=JtĤK}L)kj~CԐ*u\Jƻճ+*G6F GVϛ#^2XyӴ#^2 r4c[Pn ^f?p\mHc><2bYȟk6 {[*uS<9rz(`ݩU|(h=godz`\ȇ=ˣovf8PϪquܷʦxIfv^R=L!,|*w~5Da'ۏ@wGFTc˘7=JjV@![Q]q>(">P N 06Cy&8ν:©L}'ԫ'n;X(gWn*) T|7?i9uӧ^y{q- [.Meqޘ @ iVq*cQG{ozqzv>3C)0y T9p 9b6p>Z~Sn]HlSXi[PQd; R2E`)u!'NJRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)Kij;VԔ6߀J56߀I)I$JR򏯹֛Z7{bW&HCvhgZ?CRI '= EΔE@E$i4=(KklO};k6 Z|8#!wk`wilw*K]k$| xyc oE>kz?֗,䑹 ɢ? rZkc]31Vk> 5xv> 8~:a³ PmEw5Zg[_?F4V9\:O_NKiFm*t9 cKxJxB* i~o;*披?~Aux= lԫ*Y~!k s}[;Z@SIQIܤd|P$$I)^f%} ZZ~abttΤhԻ25Gb?#:p0!UfŐ)T' tt'Uz~[2k8py*vR$( I$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$}յtKijJz o~E%o~E$I%<׺oK.k=6s>/:CZ׷/[w ̐a3\uFx8ȃ!u}MK{`=lܲ*^nDȞU˯x~KFX3Я x+U[m@"BJk;)Xk<:@jbt,A ܕh#)$I$ RI$I$$I)ItSH>Y.g}!`dJ̺}7 5ÐA0IBQT,G_+d!!URq%[:mG[[7QswtD@A1I@Pn607yp tУLP~O/cbcMEd]\v I&I(25P6߻cZ$TIwIC/q>2Xk PmOu]&IU (~GKIigQY3a9Db$p l,pp[u,|0۹ϵjw0B1I=IPe^bёX5Z%<qVr%R%[?35:*%p`,an[!AhJ-ppARI$}յtK#WK<21 8;R))կR\mٺn;oOJzD7^7ݷI$(nd[`nnI%;fN) qooO7ݷI$;^7ݷI$I/[`nnS$[`nnI%="KI/[`nnS$[`nnM%="KI/[`nnS$[`nnM%="KM/[`nnS$[`nnM%=\=kwmb*F5ztv&YF/MmJ\YN1:<=Pz z0أeܚ _lRnΝ+t՗80} tmO7cq:`om{Rx qU m[천z.s)l<$<$>jM'e>l ˜`bVݍf'L{| ?_͇~l! ?Z^oaexiư ՆH| ޞGBm,em˩]K͓T@o B~6qն>I;O7cq:`h-?pxAm]+V;z.DGE๡XcG~a5i>͞7g2N%Ϻ鍝L[h 3 I$VK﵅p3<<8;C]?^?>SFO4O)67\-ҙqi$3s^Xd#Zw hS5a4`jꗱ8\?oqooL, ^-I($eA$km SOG7S f6hqku Գ !%|>hk[8HJA_DF/Lӏۧ8 k3b_r0OGYs{olWs~:W$Nw}°?~[?K/LmN=r'ז+_W+O!sKC U{qz~AۈYS?Exǀ4U+?^^'L`=Z^yHJsYL4cEDpқ:lgMcrN;0c2F0~No-͛]׍g|}%im^'Lh?Rf϶8}1w$[h'N3FQHPo)Xh8 v>SPɪ0x:kn?a;|XNZyol礚﯍hcq:`h m97oϥqƥ]lַ@W7l:Xӷq;w{I+dI%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%? endstream endobj 79 0 obj <>stream h22P0Pw/ .HLNq-̀2Avv%%% `C9T-?(b519 &P meٖP!Ԓh7Ԋ}TXd  vvX/v endstream endobj 80 0 obj <> endobj 81 0 obj <>stream h[ms۸_';ptu\ڋswVthHKJwA@EP!{g")]˳[ݗ1p4 pc?)I X'i$I;ހXx[0P1u$:b RkEАa}j* ªV!Ut@12ڹ|>o"-W4+5jfyMT- /yͻnu [ qU[w حTFN9br*2QrtW @[즽m+]ev2c= QD0&I3̙i#T8YOOXVDu)OJf=uAMs7Ewשj[l"}`@%iѡ$=|,KVv՟MWÔC>JXv!ў`HW%%'\6vq~ɪB\VҀ:\А":Ϟ‘tvˊgݎ_>J]c! M3RJdHm7ډ7EVmѦ:h:sr P|;n+iIlͩpnG<,6ӎT`-iEf#S`A>#i\zG<$!]?01h7X!x`Cu5ΉrmϬ;x ;x"3ZYTt=O?ܼҗ}*b~f4i:ٵH|QJD%H f 4'C:v4PCv܆F97lY8TްAÎ]?bB=ʡQqGWxNjօKV#ݺ~]6&䡭rj,}J= $hB\qdt/Ik#5h(c]ݴ#HΛ`$e[r.mgU=@j5~"}rWd|q14㑎3hhǝm|pa^zyuS֏n $TTZ!d؎ V yY$54"{M^G(at9N3okC¹dI"j =rbs#U¨t_ҷaCo*q[> %s247LřymAʝŁ{O'ml{n\of31fU\uF'z-Sϙu?ݟ3֊8_Ym9nHH℥頜DWe"YՔ^Ӝ#nbrh7Gy8!~"/_0]A6Ѯ2#0$ک8y竅WsKt5Fe>wf lNZ.{K3Z'U$NCס7 MBUp؅EȋY6Ɔ]' g<񛎁98as%*|Ì; W8 lGxPuW( qάrBW'1?D Ŏ,%BTS Ɛ@4FLo{!% endstream endobj 82 0 obj <>stream h4 F_征 * nQwm;Rj(mYxkC%6890q**1H{N!*~UfI37 / 0ۏ̇Wc>"& endstream endobj 83 0 obj <> endobj 84 0 obj <>stream h;ے㶱 _:utAhai ,8ghJK|w Vʸ H0a^&׸p.$N]Hɣ7v06jx-;[0lږ8"iy\…LR,Z ||￟+ty o19/uŸCDG=E 5?;ЊB0Z*/qsn8~󡋨΢t(*h?c1m7~9u1JleqA9>E.e}c{bӄ}r%@ΧZNFmWn+Y\*X!1&xFr%XCZ iaќaw8"cX>mίJyp7s,[d,1H&rLxz@>2 L+bGcIi,v|:- M8F5|ӸBCjD7Lw_j&mJֵ\)[y>Vğ0˞羧etE'=oIJ=GJ$jחj7[W|Wa'3Q2}_Xu2mh> :&dWu@!]E^08*SmlI>'4q5AM TBJVW4\}IhNH8gQndv|CqXI=ttJh`mt66kLT$EYtahN(Y9W৸ĎeJ5YB_4XT>2XIWIV-œ HEI6~*Y>'TG%M81c *r+?!^8pm]1C~:'O:.D 7eÆALNeZƣS={_kJ7 Uh_|o~M]бZJ""U^K;`B9 =|A6Rcq]uƼ%)(M9?Z\Րc+@y/Lc j2!|]bN^7&&'<+:t]kag[k,[1CkbG23f\֭m_aֆҁkRڻg+@WX@zSw<к@.'otyBePo㕱Tr4mO8ǘXמv)"]+5MΏ9iL7eO)ggml",/l촛^)Zx4DCۘxF}у*F:/8t6&Mhgݜ3O0q}vnΉH6,+m:g+\sXwú`W46xzŠʁ[Y33c~Ī s=S.usOtj| όy8";=?}:ٗ^gKL +!H]./9O 9T\Dw N$ vp6Qba8IbkFe8rvzJ 9߱=VYBV*ܛO\m K|(9Wtxss9?{~MhVON%iP RGNxg븂\%6"H%x}fE:W>ThB1K?{6N"pwtGuLh;piPy"t7b6kOt=̯f_~.HHհ"I~a\k!d,{Rć; ?wwdL3ۆ{fzQ:{+/2я^qG6O_E޼MM V t᜜ilRf jj[LRmĿwb|KS)9嗸f.z5m^⌘j m3d gx<ƒf}_' > O)@݇G o&\Y(nP?:ͨ#5p.[X,ayY4%Z4h"vDb. ;xws1oN=r! 25 X([ea}~9 ̡.<-ׄ]xzvOޏ:H}C: %kD$ROZ _Z˰k}aTQ|5:R`bT “f6EPy_B\0oaT_BV1X qp0Bsą;kP*`!K3bt:CXI$CW #T(R.!K @h- \ 7DDn 1!/D @HB bo#uMT?aD Bj '<=BT8E1Hq t0[BQ.!E x#yb4k F.}$ 'F @c}U$2+(_ q)@ؠVm!r=+ C@2D΀a559H`'_"I}j m%هnEjzAYxzЫiѣN%rTK<$!5%\a9F5ZRv]aj0o5+0~؀~ T1Z3!E $X"[縢eF lR ?+@e[c (o*4ÁFktLǛx:^+!0|3_/J,'|)X%^Ov{ ./otzSZxb^b0,>]?8 I/~~KWmOV[Ď%`15%$' ('Ԝ3^ 䪔( :NށDUsTsZzwZG.{n^G68y/;Ɇ !xEWɓy4I <0 O. z; }bk0+BAH; #W'd9 g`xER0"#i-~EmCcfr9l`xl՟jQx5Nf;]ia>gVB{'jD5"(g%hA%HoKûq}QHq@wPCP003 hŝh'`g'5e) :AxPi^!gg ñ6?2~`b!z(w90Hiȃ#Rְi8M{9kkB4)uQ 8 mV @@1I A~(hp (21Rs-jkfCCmk1?A[`p/I5(Z8 Ŕ 9߸^/|hQ0¾I0!fsLJLkL\[ȬrKZM>lм[>(m hTubY<(u C%]Vʁ!3Jŋ磽! _j]gs{7_sl^@)PK, ĊM|#,QPCY?-Ig?F/M\~ ‹Ê.%{z})FSo>= eSDifC(Ӡ2mDstM adS,OS0U d|w^s NZKb?m>2"<`LA]ҨA< endstream endobj 85 0 obj <>stream www̻ endstream endobj 86 0 obj <>stream 333UUUwww"""DDDfff endstream endobj 87 0 obj <>stream www̻ endstream endobj 88 0 obj <>stream hzyxTǕ[wo֭ւ$X-Z@ & ^ ,HXs 'lj4B$f9~N $Lzy1;#NƏ;u2o}.Vխs,% `PhőGZ)H ;[=e+Oa 5{MW.F8/VCB/2 Ո@xVpk b V l6Η~u/8TaZGfP$q:vQ+ cdJqu ;`mX/ws@ 8_z׌ϿrXg:߿!a+d"55Zs6 hDXo&CUhful !d| OL^+&?`JV~9٫ax|3xb珟H;#o:9qHͳNxx>b4_ŹCJk cӥ8D8F|yૠNx b<#dOA%Hq*1ODL!@* "%3d2 M14ۚNM3F!5054kdG&Vm0;E5["~1iwf Imn#1{N+&:avnF0@*+v~=3{G*A3S~70|IqBg!2LMG&)\2Y013]izB7v˜^5=;~QVE&oB+Y?G܏= 43=)!uǐ1tpC0T WIzj':OUUbgmSc1?UuJV{8L~W¬)jzL^Sr)+Fᖬ.Ze=sq[ 7XX2>poķq1С+%8/~ b/ eψ`+腗 X Zix{?%,ʌŝm}v+4K(kCZK5fvvy8ΰȨ!_/#Is]㡙Ɉ]cS\B2+4YҚj4wV;hJtaJЊB'P.!v;]4Ȣ T:::3;OyL%B+PЙ=4_y7h #`uh{h`?#;KHg,UA337h >#QC3viYBz#MiY{+UGHASNIBOJiRO̢^C=4G5'ܠ=u:uTPJm*UTj8J-j2&U9JQQJynR aM VQx{ EI֒HhVᛅ~H Zk,8 NZW_-+~%ӯyog$jr'FeP0-O^v ^H,Fȧ$oK4ˏkJ./k C,ЕJP)$jZo..6K"CB|H Y"~Qe>x'$MG#I޹ u˽UImn7$+<}8`@#9u6FRKYetA|(~tR Zu0URQ&Ƕ=1Jnެ6lᮮiPo{Qy>M&s(9xL.U.j\>ԥxDb&19Oyy!Yzܰrq{w/{V x'O^,99w, KEnCnwnޙa1"Qr0lqK& X elXgJrؖqـa<`$(u1L}X_r+3Iz86l~~u !JO_[+u<Ѱrf5i#ke UK޻~Ū̄($LVcLDy<1%M v^Lf=u<&lrl2Q1si >K%|2 Y C:L&u5'cBn< }€1l<`9GM1˘uD9v!ARn(7.pב%VXf7.1w&ʝJNC= >ӀcFG1iu̖"'(yDEv+Uk$xϕ/~x@.w;8>35/?-Gڸ%ʂӉ0S؍n'\/C)usPEH}7K]pCA)8CFaS}j.I2qY-KźSn@>? #d։Q31_ dįiB;bq$zGpdH>gq:S7-AswSV7P \7Mnӷl^ A0 AtQ􃆃փwRPꂖ5mA{tv^w b+ ]^k˶v:Ap@<,ú}6M}r~v(Q!*FE-QkTڢ#b)@b˼?9}OΜQe)",?;$I;%zP-!o0X jHVY^g9yWљ1 -g%:@rw! 4"ܠ9#= QlƔ\*3[ ; ;ma 0ݥg:ΰ;fNfN"dVE[xK8$S ˪Y^rAeƼW㵓B^ „Bd˵Yz܇i<6XM>S)rƲ,sBXȩWmzG-B"mboq8A8BrYI$.4`S 7j7~x~;}?3dH ɯ^) ڳ%3ob C? %zaQb;/HYዙ\kO)X]҇I6:(iT>GPM1ӟh+NgbN^s1 JW?fZfhHT4+m)dYB֐Rm ٺK"*Ncj&pr Izv1$%Q2ƍ(=GPNf8 A#BtW{ [o!aev>tz1_FSS5Ie as#p웗-b^"tb{͉QH 5<Ѵ:3òv{$O16q!f,MeeSoΛ, 9܀ز<4}84c ϥLq/7ͤ?M,qm29f(/)l4,4,q,V6Z#)ֳ̣1hp34a~8-6U*2JZgbI@A2zcNq`YEǦ;IB?DCceʜ5ǐc1bOo8% Fȼ,[⌀iKQ"݌1\ aIKjgZj{]\wWՋ$5{ ĸw7u'kБir  ^VR}O[6->EowiY%eF]nZF)j( QF̥Pb9\I40 TO#צ$ztM2!ٴ °,Z[w _Ibm2ҚP-łe]XvHjG"XKנ4sOGx$t.Ye(̨88~cIcFDtRSS;QV/ͮZv[Ցyc)yC&s{&Ƨjzm[]U?9;zCn!/&P]0gRe: K-,I'-3JTyrL)Üg/1 ӈvbaE80d.:7quxIn;T L RNVWj WOG7h4X*Cרi{S11G3/ KΨ+} MN`m~.'9.xG;{z\B s߽M\Ѝ$EvR ӛcw;.Z1姧ڄ8x1##IÉL>-8*yY/Y7` w5&)Od@<$o|yDȵ,UG>XJQK2}ĒE7H:v9nE,L卅/d,>O6Ip3 r4)g%x;f~YLU}j7bgsY(߻CV^@G@ъ7C'+|!b"$CΠҨ҈%JS) '";Mb#aY=+zBJRܸJdJ,cnt^C}+J2bRmrmEM)(v, % 0PvYЇ a \#lmXQ0h:˝j0qN/GoFOT.rb Z Y+#^v AOE<'fKxyYսOòˋx[[[Qbt/,f"^$CtFf~ D*lpǕPU]KaV __{̭Y5^հ`=4zxZ A? ،;~qK637YE: H 4"7,L<7;1wh,s>stream hZ{XT׵_a#*cX5bD8_ZLMnCCB1vHĚih: 5Kzkb4_˥0s>3Cuvg?ZZ{PX^Wr{ eæ_H Mvts5ˍ-O0'-M]ƞ~[[~5Kbq5 >ں}ޭ%ykӎM^?l *w^}ss>;s~ѲƏ{7{35GEda+ C5M85ʔ89J/G5?ʗp%`!G:.k޽@?BPY*29³SDpYsGCcPn:*MģEsG蝰W gTDO^lvXh=bX]S1HcvQ8`Px0pKV;~&5g5ѭ3|f@Hy//̩Y1а2 طr56vcn } tb=3?\ZZ{ G}p(=X!tB#>Z~>wp$`=wDZo`ݎrơ| gs#"}8,6BZ^ ;yrOa?Wʆ"rG ռX F"~,818HP3Vq!8Tt13+@^bz8kҡmyl4 ۠>F)t(\;|')Xdvv3#6r:f\-['luVpU2iA]Fَϧ!.+ 12 1Έ'! CpI"2vo 1B 0 q#D5/bɸjJ>k?Alڙ`x!+nF3kFWFD=0zYϡ AqN6li="b By1aaXE11rdq;c;D˽Q|>8ư ,;q/l3~N=(GGR|4L]%G($bLa5SBq|= h(,m(P*W#2,XLajܲ\ 3E~cDk4Y%k6M&2QX-XugEh3#ta0p !g*[Y "ӧ]B;.-}븎N\~R3~޲'} 7]weNG}ܨ,&YH\CpU}^ _i_&܈XuNbrL=)klj-M$S9/]ՙ{u@Qx;ZGTVUD#iynʽ?)(OtPk[hK<4eM6k^b.!@']naG+R7ѵ==XО˪%8X++AJVdż FT*qG<1zL'c$x=I]d˙&Z KbzLPTg-.O{;-? }e|/;>J`zwumկh7mEmЪlq:ѥS&/bNL0^Fnl6hRQ 5C }W^gxx-v~ye^|\i?)GՑvi=.!XwJ;oyWII߽D9ý$GIGnp|t&ּ$qQTN0Õ+o# %ILr $+4(IV&&[5)2;JkRhq. 3:LbS:pLIxxc=kNYi؊XSQs4%f-?w;u_rQh[:G&/Ҭ.$Iob8eyeMg7'N2yv[FAVeSy 2xE#`>?Sb@Ob>%Nc@H6Ejotܳ'qxg`cZT|-`zi9C::GC0R&tUWW33_:_7QOASIYx:'.Դ'q}bC7|_uB @id`l0Qƈ]<"ƹ (0U) rs+*rs!j-CS yP e< dމ8K/t#J)J4 z!9Ŗg)0k I 2k'.],|5FMȽr{91q$z8s9JbTL98ŪW%NS:y#NxTOofQG5}b5ݻf'i\{9{)ݿs":+V=G1%SLW2s71Mk EC25YabX`͋g jrPJǪԿ6/V*-k%9vLՏG2:xSn 9];wUB{^x2MM-^?R6A89AlT`J:vb`tFṥ1a!K<(~e@sͪf0GՕd^&5gK#tE }'N8=XT?6!ߖZ\-#x{K4&ZɞM-.ϕ-h9b?D\jfZz懱 RUv+Y)9gGuaبs95Senz6-TO#vՑ#>|ԧEthgx͗K%>o/ kѝտ⬳709;:T-%n"ik2*}چ[l?{ /\vmG7oXlAU^}߾oKo,Yt݀WlrQcB1"k @@xa0&fv1S]]؅<E rIB.hi9CB7{xmCȽ)FI_JR@@< ? g?IO|!_̗|M6?*_P6M;]t1nL?f3rHŨbؠ ݴ{w}9v7/s>|=WTh*&(K@//\$/fQeM9¼Y%@wK >O|R:ϝ/Lpt~)|ZƗ em8U r?纹+^+,4 CXnvK yE >{ ~aIS/PʟܼꭄETנ7X 7j_?><,ǟmM5KvAk0`&hf|ofA|E{z2thHX+ԅ"m `C18nH&6znS?n>n %U,ǂm[tS_ضegy=[v8*7lrcQ]\GySChܲyEv\_q?jGmm-zosh!BDQ[`+ľ(UKB>b;6#!a݄AقJ|ۢu;>-;ŧr݄{OlfwY"X B#wz6X3۹KW|v=ԛi̞w vUv4xJe6^ϖ"J*C>d 2V҂J@E.NpUg endstream endobj 90 0 obj <>stream P3 I endstream endobj 91 0 obj <>stream ۴קҳg;\2Vkr߳/٭4힄l ىCiNoz}}{Ny\w = endstream endobj 92 0 obj <>stream hf'B@  ."Z}=ܯm^ÉʉՆ@L~v|yyƙw = k? endstream endobj 93 0 obj <>stream k`۩ I endstream endobj 94 0 obj <>stream hr08`ڳ}dFSƶմ{8 ٛGk/߲pקKT,|xÇtpmUiDFeJax]^YEVRRNbJمGvGC?;e88k4[0[- E(+#f= I IMG endstream endobj 95 0 obj <>stream hWۯi>stream hf!F~Xzwt;p}zlijDe\bDL^[XcHTP MufJFC^?g<485)1k.P+ &"6o * I w* endstream endobj 97 0 obj <>stream hfgO9>n$Sϰ ]I¾ܼqtl Ւ)j$Z~|s yw = Ow= endstream endobj 98 0 obj <>stream h1 C1 Q[UL oaVĩx؟.G|2)F=SQQQQCdwUl"H$*Οn߸/<'bH$7/&AS endstream endobj 99 0 obj <>stream h10 DQY8sB3yn#~3BP(KIpkd6#sw ` B]XIԆ63òFmi('nJ6!^,e6higW ) B`-xl!6rxB +k% endstream endobj 100 0 obj <>stream hA D Ʋgb5D̟yf KB7)RbyVBl>stream hެTn0[Wqv/6@2d&H+ 4NO͛!%")p2$#4-L%F2(D914hʠGD%"D6A C@"nǣ|rg*̚j[pV,A 8h`a tX#N{l[|i">9󵽈gܮalC fF̃GO#Nl*Flq?~%\ZhY A'Bbh}}aB|zCBSϪ|G':(Mކ,=9Z<~ٲ 鸒O\tz9{ֺbΫUY"3go^=lk5-MmvW_N_5/:{@cYy?Ci7܈DcBR BDHB•х@M\C..z > endobj 103 0 obj <>stream h޼Ymo6_R7; -5mzغlYvR&)we[&Dr"Hlxsӗq'gٌ8-&8AZ oDqE36$X,3n'%IB=y>3*KMI/U>IPi-M`CC2UPgńa4L#EŐϝ2ցif '(I03FDG1*)*0`f$qNfKa/vnka;QXUx|nee:/YSiS4scLGmE'SzۆAtD:?T#NLXkP#D >‘_j7*;Ap.GLKzaۅƹFˣc}db {E 0ȿ"[Ky+svHTӡBw9aq ͕T@TH.:.}f̴VX0GџQ'̘PݘB=  Ń#0vƴHtSlOMkŇ k]Ȭ fusB$jJXώD$bp^< Ð{SNYS\E1C%VR:ni>ؗ^ۇ?+C,<ɎCں('8n?6P_&m+&j@ .bnzL>};(DCy$™F\cjjȐgÚf| G v1<{7Q[Ȼ[țʷWCU8+\~vmF@ԑ۽֤9r/{U 'dPZjڔed~7`Xasz:܀cmY}n#kmg^hJҿu7uh\rzSh6N:%J1||ha}G-`w,L n1l:|ppƆDdh6^O޾z3=gWoߴO;y]0 TʁW0 X֝2PZ8&Lڑ#hW޵}㭳 Vvxymǵ0a|LNОfg@4w8c͎fl w,I[Aw+oKvaK0*0mc?[ endstream endobj 104 0 obj <>stream h4K 0D7ȧh@Iv ĈOU=tABۊ.nh sbxhR6Wlbt!( mns1~J@s]0Pr9_i~bGCsy) endstream endobj 105 0 obj <> endobj 106 0 obj <>stream h޴[ms_|*aH;I;uN'#L"`Њ{w܂;Rig}+zqsChqB O[\/Xp\{+oq'wxy䛛߯^\qB{⅏b%RWȚzd/K../tr]1KM8 /o~m3B]pvC* }zB{yBB=,}ן.CBk[f4q1(,?u싸/w,?o~ɦ.lZv-:wS'kO5DFqWX^Xp̘?I}% :0# OPM",2'C[ɫ- RYUNv~DHpɕ??\w|>M>YT%y6\P+jz8J˳Y㓏p@&|2psx:rDX\˟IՐz8%~F'rNVfoD:Ue6wJmW^ ;Q*\Fģ6$O>)su\(BԊr˿F9!q}}m58n+M.H/Wӊ +P-pJlQKiĵxZ>xTe>9?}Zz!u˕X8nE*O;Oem j}/_4H+16y|xLsv!lL^0/3 QOT'bynҹ1ư@g@N|^hhMh-pC"cӦqw2 Z$!:je^hyR}H(cYs*H P9\_D#![E͂=+ٸR"0kq0`qHJsiQTO6 Io:͸'D'V78/61XTV>{juw#Gy @9_;m QErdQ,O$veT u}+ Q/uF28!Ʋ&I dHlowX/)ݵpWئ3?Tq8\Cfl~E.PN>;nzcy_Q׀3 ]ϖ"9qI%_8pi@~h#7MUsudr}ݝS3U2\KAV.Q]pgrs6*`$|]@TW˯?M)_kEmmJގ^Eh8 mH U ?]F=N=`î(ɨn&r93Gط9g޼| yMGP}˄x{ $JHB+Y~pf#P_fET[׳}00܊z)钆6@[YlY[W\hUR Pp\H"AZO"G#5 t-c. G8M:[4 Ss"Exf^~jq+yY:Q <,ɑ- vRj[oo {Lj6&|$}EL&HZ#l4CZcL NbjۃBJ'Z5j~ÿuΠ SL\қŽ%q9r} Ѫ1(B]ABA -TciX7 &MGCpLxN}"wMkwy ։vSVra\?CC>ziٿWri8]eh~wݶN|x6z Y1MUQ>羕[Y41T&r~:熙@ Y00&VI>b*:AH^|9~+e6GA7C z; B#5\e4{1cLP.t|lӱǜ\ٮ)^?S {>Vnw5n| PCK%"$tx"L3A7N5j3Д5! i;zOMM=| Jo"}i? s++ ܣLSg0ch$̴|-G YcE዗6]l@TTcm?09a?rY j I(};=`ӕM66·r$*`/FI g)LQ>6bu[O29cl"4`YI$eMw1LZ2O/]4 u#Q(,m QvdxU<3;}ڲn_'?M9I]6}=8# I9iK9ٶ|CPCatccf h|mDcɋQV7Ԋ ^}b$:96}y%0#`K0լ9_}VBY7_!RO*8>B7ٌ53)b hG3poTd@Vr((=OHݣL 4P{]+I=NtyklPBlPj@d3jr&]26H:v˕8_-a5'ͫH2ꅆ6`qբh75=:wWYd4b48YCɱ^$IxWtV(_p4:%z\,?Fv9] [FOZ7SaIe4Q={=C} oeT2߰ lfJ,Svg#8)$(1?(`ۅcj@@gBuʙIr`hRl2a#S]_:"8k0!oq 9 ]񢑣^ҭФi 4iP*$N6`OIJc8zk``4( V-SQ{lra7aCL~S5ۧqTΙI{xq& Tr*!y*#q{A/*3#UUl1.lɩO4V:?kxf4ϽJZNR&b{%6E {ʤmCK˸&)rZlul՗T6t"HGQ= 1&n"-ĸ~j,|z.r&BT[&x?avgT3.l%5CT'o,lWG 'bnpD]>-/hg9Et)y' ӠҚs_٬/$ ϛY-gdu98c$z i`a23;;h2{2/1qEmVhXajRf uI=|=1u/ ?(?m H/&@ZoĵK[ӼHvqU$k7(D.бR6q] ( ކ #D&u1˩~F QXsӖCdniUL'~CC(|J&g@K+g 85myש۩% 9xD{}95\7On>$#+7)0pk7|r!>+_@Vyo>Yl+8]ܰDX3q]q 7p}~4n)Q_AY5- endstream endobj 107 0 obj <>stream JFIF             @" U !1"AQ2a#3BRq4DSbrst$5Cc%6&TdU;!1AQaq"2B#3R5brs4$S ?tVU&$-S ZA:J@H(kqgW &cJgnFL/!#duQlw&p>E]vMBң P&<=(5PH:+ 5(+X&-k"3RS=2 tịf ue2<G %mVP)q'ػgp.u`dRӨY HI$ |` kAp+@jX&,^j]shq9h1LPEjVMYܸH@HߵY_ZHMDI +@ 6)E!d $$5[{P15kUnjX,X&,X&,X&,@4Pj?ߎFҟ.~ $K~?Mʯ<9ۯʗ* ] H\cNS:ەmahe/ֽ<ݍww q>-I0HQJAMN\]߆,˅721 G^>tk}6渾J|H'K)I%7i.յ{uSSqrF 'IT:#n2M¹8Bi۩XL xz `e=P}b,iw ѧcXe<|viÜǓ}T|,vO+>]i#rͥ5#)+V")N]Q s-":|GJbz<뗯KX- D"},S>[cmmo$k Z7}ՈhEo5Jwo۱wr04!2ѠA"TfGg3YFMŠtКFpUohNm.hɹ [|p59ʂt >4wcy96GC F Q[A 9wU62s"㺴{@1:X?-C[S~cj!OWN\ύ4͛~dKL;:T]sL#e|u5ٌr4qqӄ>\I棎ݬ/ t(|>Z&uvH|wjݪsVeǟ_e\ͿgOiV/Sb8lƀk=MV-r7P@nM[#8)+DN&by|'M˽Q'|a͞J! rI=ZC[fMCD^4o*5P{r0D^b! pc@KC;Bᷕ%*}nY8IPgüG{/Lcnj=3on6$%*1M@fտaqrW#]!*)iR{^l[c`/~ \t%'"mѕPrwvo2Vzd:ĝpRgW9.(9+-ds)T>2iO{EgOD -PVPRA[;j0vE9hH0f+1~=L37+&,ۻAh!Jh "Q 3* f{:>\ܷ͞T)3+=|v^i\]ZVFVom奲*+edNӐT9Mlxp[W=]{f;*_'˅XY.PoxTv?VrT>Ug(׏OSܭ-1rғ *AJ>GSܧ' _?5 5[lQEq3'}og?^%/Jtǯ?)MT=~\F)W5ѫsY2<].ԏ ^w 6o[8_ uP;kF ~M=v [[;[r&P4PJ)$$ [GƸ߳ZQ%95OŁq "WjMli"O@%C}φ~kow^|3j;g7~{ڪwu7ڪwu6WWo-ww2ԝn,KUiwcv[kH .سr\mkhX6H1.LEEdn!!j?GΖvZd&2 :0VS{ɤ?wڿm1keK[JRHJT{ilf[8t H+}ԗ70؄hRT?GMb-nZ qⓦovgmQsTlV{Q?[=͉aABÏPH Q7cI˴ZrcyբgB[e)|HQk'N"k3-c:Sffɍ#VC>[1+ Ht #RϕlWtP40% I#IDž3x6.mBX!JԹn{vL̥I&8[ٝ3ޒMtr 63'xO=hRB& !c'S'w8o-EuNJJ0IRt <{E%VH욟۟Bj?ҧg;[sI4j+KQ[כ 5E*E)Y^YrǾq3K+f!i (JdJF IMwQV 9۟kr@bJL@ u&vfɖ1꣧_ibZpu[vӧdڜ-]v34A+1M2OOiEKm±{Ɲ;(l<ͧJZ{U.Jg)VDž= 3~uS֊8˒xnVT)HǺXўyI}R:v^۲@rQKT0`$"uC`5فN-eI2F5"n.[ԒsZD)DuS0v{PgN&Fnz89y!XS9s]T.+A::()nZ˫RRjT`.V\+2Y==ԑEKZq4\+و"1v̸|ܻmĥE|F'ŸT[ŋ>*AHVֹr8˼N31t[RfUC@r\%FHl ,.1qI(*8I!DB@ EJQ 8]KIn6[qV)KRj&33]%٭E }tOZWkvWJ8-qk[p ú 5)9ݝkDr+ IVKvYmmr--T(JP x l9?03/|]=[Kܴ~9:m,RnMjjٮZNK_x&TI葥+= q2$zx{+J1>@*^D]h,JAOxΪǽ:+5nsfj#\Eq$-zѢT<TѠ'fEJ踴دAYABʉ&5늀Ìwm`,IYs A[a@bs|Zпc'DC V+ѕw؇=XZ0nL :Q2JgKeϞW2[sKJO\o8?Mj JQLBRn4RZluҒCTxú;)*vaG=RP9daҜ{?~q<KC2X&9F8`0e\ZTFSM[*2h" oP!;!߅҆>FSǨ>+cwll :”m :LMk{YB$@tV[/8˷ Iр ]knҷ\gHZR!I#i\bdk~Ɋ5EiݨVt~(_:Zi.%@!:b 7J-6ijSqpXQF(5*v=ٶلs N. @֘9 #Fm{K2CmoפfNR m  Ԟ ccfZ3Ի NH[hP2JHIThkL449u]}=ԓAb6P1!I$hSQ<iK/6Am- II znS ;M8HN(0JS$ :UyyrzKy6@Bqg*jd1ŚHg:#f_vQtVPZ`B I #MjmJy`m־*02Z8os~T:bD8II q@^p`|:!F$\qW3,yhl~0>4}".KMt@Tf'򨻄[5h=A=Z矽c3O1Sh[E*ygBU * I0M66虩`dDZ2)2}u%IK OƪHa.P$ K 綠b()S᧌PFET=uKv9b8klSFq.߲pw|sukW'<6}XG7Y<Դ RsI9O6Z1p,u񀜺&|zfWֈ'D$dPcS͍Є3r#44Xt 7{m"hqD:X `;RG|r@-lZIK &O Ys[iU4Z\~ߠiln[@- i)"5ےn3gEcx~񟤊íWciI>S=3{h(Jҡ)fWQQw0Fr ;3 #!%`OLOGݮܫ 3)t^6k_C9ЇLԍ=9ho~+Qݩ4Bo蚼8fwiZ^jvތi|;33R7I6[V,%mb$ Hң6h*ܷwgqy9ywI5gTjHĒ~:'쇳m )1$OZZSt!(@%@Bctε5pT.d8☃'I*L`tys^t/v㚘D1m&<ܦEV~n[gj_YY[PPPJ A5)kpmuٳ6#['g\1"f WnCM\6VBRGu:H|kLfÈq)絻5)Rb% #VY&8gr[lr.Is5eX2!:S`n <\F0&$N2_ik wycInYMi̳DL:!B}Kwx}Xrq/,jn .g&JLMUMMSiӴ">^:9:$ԯk-6?q4c/ZUi*+lBHfU-KJm^{gmGfߩ{Ե|+T*#Ƣm?msN=rIjMv;ylh8VRJD:j\--68bpCwM6H 8"Up!l~L"3gbϲHM{y11?7iVgvrRGU_ݾo˵\9;9Dq=*`[b%ԶRr8tpnΧ#ngAҨdAnC_k}.1l";0\+4G^>x|XZe8IKܽ=WuOO pwY-m,Q$!Q$Vx`DxasIqS׺yӧ6Gܵ5s:w|UK}{md9 !R19D ]ټ>s3ON?UG,O8fW a]>S֥#['I*QWUNiƞ]\VÖJN iR$ZT `A˟5d/|.vC[:xScmMmP JqWXk|xӛS~l––Kp8Y)P!@ұ ִ󖖸6F <ߖzզ.)IUӍ5*}J`wguy9yќwI4n 9A\BRI>5s7x,JhT:+$5YS 8ker ME8;tҡSC2R0[u1"cIda#YQL TոțD0ΣM$rYG=1_uvAs.)I%:#x3^+0[1M{^,S r6ԛ_ܕ\\oQOf" o?m[^.<3nv CZVn[u[.A:Պ)+*d$OwO }>[+|V⒞;V5ы7}X)I'VQmEZaAEoEZQoEZ@MmEXEmEZVq \+ҖP נ&W-E+),9YDtOhZC Tʀ|˺&8d0;dD ia"݉ĪF-kVUU֘Vp \k:WMjh񰷚\JIiӡVz]ܔ8kpu⍬J=L"1[ .ZVp B!iVP³mEZaYƶ-k KZPT(JR$NE3{YK&i1.ENrJĘ1>TUg}{hmt|U8.EkTڃZgYICn0ǛBD%(*1+ L/+H/v[l쮤/}yWɉug#Nh4,7!dt6/JF5Җq.-f93PLLOXi9*^[|P'Od;g?cghX7'-Z"88%䐶Jq@=sKu4WGl3^K bV;צBImi_G3gI5;Uo!ǎaZ1]ZVJ5UL,7-qS;_\~TF㺁 oRˎ}ӽ6F[\%ÊJ?CoR/-ZONyWU|g|s0{MS\.͕Τ\:ݭ qЖTV]PjdVJ_ \K7$YpjAlxȥ t#[[칬TR_Ŵ73kqtA[n6hPXQ 'M-q*'NJ~遺=( ˴]HC\Vx1C.5@-l!1CLJHs C Eʒq@ {齢!`>`+J"֪Uyvo RTP LhU#:U Ze $NQ>Zlf[`ɭ8ˢxVk&)+(H_/co# =v kڶ;cd(@g娋moI4(X*$fR) DbRSDabnޱiwv4sTRGIotU97< 2=Vn\o.-) ]՘! $ƮSz+Q!>lmldW&NAT=H`yg{:<1vV\3t8q w &N5]Z4 Wco64ph_/f]Pb4Z:4,=a*Cg{0ht+3H[Q ٸ-wadž> ˵5Mo ּj'67yQw{#<-%PU,IScln! nxAcGn>/&GiU @ =Gn⅕n,<B9^3n~ook}rl -n:\^H()#)_|ypys8q?m@_oʖ}!i>MNکq񘍲Ufueq˪Mػe,^(^ B ӃpwԺy7 p>yDRV1&mҴIٖBjH@t G"Kx&A)Gn6C]) @/7LQF1-~v4 OT}? و"퍵1]?Pxettw|\2kZcl9~q#f_P=NE-+-5a+6Vy|sG8eDdzy׮;;- !]Rziť-P4۪B\̑5i׺O7|ꊐAacB|\lݩt~R+aSwI!J#գsH=bɧ'_^*/ski9| ʚ}IRT Br!&{O׷ښv[\8 bGtM)2zZ׸Ri>9.əcMHJ u)9$aZOO2۔\>^ʕ쭖 F<1tZۛkr@bKLIJM_jS<EjJ E o}jlVZ}pgݒ/Dbcb "54 l6)/\@Nb% fFJTeDV ch:X$L"qhMR5+qXRi'Uc?k 4߯is}e9}g+,;"3/QI=g,l ӊJ[BdJ I$&ksoW.8ZX#q^e0=>?X)9W=Glx٩x*aoBA 1 PIۼ筤ͶFJ٘{캣W kKT!$9%E]T}bNӼmwho<2ǼQ>`u*&~(F6KSD7W.51dݲڸ.2LICe%MK 4͡K6/W Y0ԃ֧[ lV&O>$rwo6-*̎cʔO@+JiG=EJsǢ}#6:dԔe7wW6{(ٸԴIB[( Lj-.pj>ZV0szDB55N5Y4lʛB[Ql K#&.M9F^f=gI=+\!dɶxn fSǣyXRK 1DAetC/{^%_R7E{L %J&Ju tfqAK ~h5r?a2є" Dʎ9>UxC"f2g˒Ʈ#;q/[~ʨqm*^oZ@6N#&4*x^#^s9Hu8c9"~)Mry\dc@DFsVr3~#<ҙOO*s!Uw1ȋ**E`ڊ1 V"5@$EжZ ]GCf.e(BԊjP)'Yc5߰67)+eY$I'(Њiss_?(51Xc!K##$1:y;qi(t*nŦXO)0.|:|UMxYA.?M)+Շa xL*;-k>ڂI춹!*|'JV"44i.>(m%$ :)W4(N>3R> m<Vv[B4G}^ڠ8S$)PZ,|+%>/k_B++˭+S!ke)xSnf^gS}m3)R\K)X0RIPcCqd<[DqKnZt8B?- tjon&:'B TB"z_݅mJRsu j𹭠k;1䲜<'Fѭ+>~06Ny/1PNAJQ0DBct6pjJ[L'% ߘȿ֬n՚~0=ӛkJ\X ^u n?2%s)ils$ 6q B$sHjNߕw{Gǧ>sxusiK%ISHSVπZe}S;263g?+\㴣-{\쮓&B4֜IL4,OʓIN۰YuUO7ok 8nt{H˗>79돘hmRr JqJt<|NI tzilXLṛȴ<ț[ST$7H1zk9ή`i܈y`{u76jy,,0I 2bH8J6!Z-'-eI1n\=(6g&唰٘GI@#|i17eTgmϡVU3HXfh2 m1kRW)7lM}cJ/}L~-impZ7M>~F'곭7~&7wiE=+k1TҰ]t) `˜p3QO\gi۷b tk?%Dy}ϝcgԙםbsޱ{~`FD9]"#\nySyvӌbf+jٛX"t9ȧ˞7Tc:WRy#S}c%3 㒭B<_u٥7'+Waǿvu6l-QNrGAֹ4tR1Fkx_!m,BL )Dbc$+xvqsH^}2I=%w7uz4s&1di9k1I{ov_Ǒ36;`/7TV|BT؂z/h/DGi_mgwvvcx4'|#~~@5c*RrgԱӸ̅tULT+Z" 6S7_MڊXϫ>98by{jtܽ9c>ʖ/DzD |sfV챯ʙ](8uoiiqn0a 2R-*R%ZNƛ vG]G;^θ3aIp?Ry U3O>}UJ|n}:gE<^Fg>͆ϑWft'_Ze}U`?kR9suS=etOH=3elג,~ҏ"nD#ץa7vX,qۘI10&<([fPR)h:RYxrM}[=cl rݵ$T@1KAС'"(9 䃙"|npiJzdFnn<Ҽr b`O Yi 𛄘v;8H8T<6wz"`uѴJQ)#knaqyxLd L`WMiE@$,R^l0YmKmHH`>YK6A%%` `JtPUP-l{>gHƔfa2yFX!)*QVmdb+Ҋ. u-VT&alB|W6o-: I:]Vv{vY24c,@kM֏eaFTfdȂg_hw dfq,!Va6$OK6=2%»hBH;nE^bVUHF^[umr̳ei LI4E T'ĥI&5Hr,{V?7NJ*@7MݝM+&QT-$b@Җhq =DtֺN-ٻFDMtZ !-@4z*!76ؾX!N0*ēkvw>>l~pQR2KZӲ h R[bB`S%+ql[+o TX)ajg!Y+ 6kP͝i8P BBD*6hET)EQBEPQE!QEEQBEPQE!QEEQBEPQE!QEEQBEPQE!QEEQBEPQE! endstream endobj 108 0 obj <>stream JFIF @"P !1"AQ2aq#BRT3$Cbr4S%Dcs 3!1AQaq"2#3BR ?g^)ebم:HVJ»I3D0?>ǥ3Ǐ?G¥wiQ?Q8L?B0)Mp阳PXc7~|1e7Ѭ9 , U^ܵ53)MGoqx7-Y|2m=V t+NdϺ*âM/ {()ӆHĖfܒ~y痹3"(ebRCMq-, EC*B7f{=cE q+Ɯ2hwb UG.uJ4=Ŏ򍨃ZIY$AvǢxG- lUS?-|(m\A5 ~o(UZ]>?E"YfYX҅Kw"6<@<A\*ݕO^bM1S^BUyN[{zbTDnVq5]tnzSx$Q,BBȺ?a]=p7%~QfX%g'MGݓq+3gbiU4o^<0UAmw[`HYBrLԮ!zyyaK:#SoL}_ &xu6He<9R@^}p˕`%ӹ@}~~dw)ٞfAA%s= Yۤv?Ax3nQǗЌ䔯o]?#fTBr&#G˪cA8B} TS~]5sVOdؔw1{] qxr0j;Y5`?K y>fn>!\.q$N%WU=N-$M)U8\ઓ-Ԗ[/*ȾaJ{bgWHa.;~ŜVέoVhlɟ8|/OTv,B<>#DYLP1.m[ yݤLPkg^΀]X,fÆvoz/Įl*T+Eg6/?ǜ3qd*k,VMF@~82|JP.eI"ƠE++|F[9tqڵQ84\{{)M4Y@"%'}=I0GpW=SΝE ru5RD_fq2\sF;[(b@NfwVWq, !ҬڽN_$ Ѹ75)-A^״q.U!0mpj2m(J4>9KM"$\/7DD:wv]z %9@,O> u']HAG'~p S5AZdsH!Ry T( 8!YeY!@b/` p&!- HES*$GCWb^0Gzڏ Gyflpo{|8 a?؇ن{ChXٰnv+FU^(5/k"xur?5ʋL;aIVbEƣO& |҅4ď򭰋deϩ$c3 Upϰ>گsXW/JBUUح ,Y;?lKK%z$1DM$|*v?:<8l؃d8cəBA{|$rIZo_]T" dAۗ[jS>1ryC!t\q }?? gy0=#ŝuum!MYeQ=?""^!Z"9 :a%ە9禖4?,yBX,€AC! l?جlڪ"}1/vyXR W,"bZkխiᄸ -Md=7ٵ0n=EF dsNj1ƾDHʠl=v3đ?<[ҟtGmD(w? wNp݀z )DzAEJar @ p~\ _|ꂏaW)Nz׵yvO_C^J5T[G|rv{>Gppc?Pks"j(;³ Ie[Uh0>fWE1w4p5,`]a<6Zc_O\.e;;"ƶ N5# [bd☼NxZDnGeR5{1!zro 6a>~GUA\v`}lZi5ѯ^Q0yz VeeP;!(oBH;&iѺ _%VeM;w31'\|HTW%۩V #34reVda&rTj0)mk©HeCG}/8Tr"͋۱Î`2N">+m4TyRcꭧs)$v@C3kwGbP7VwY!Xؘ`7"M5aTbIzťJ f CfXO. }J8jNǣXHXƖqn'1J~Cq},\ UV A# 8^J @l AX5A&1-#wf>K?4NBQRM%8_ էccA,,y~v5Fٷ(M՘|֍;A!4qi4~:-*f& E %}p~[CuQa=ܝcIhnV0u8TƦ1w0 Aܬx\p)4gF(]Djc -s{Qu'gZdReh=U8|Y$.V cX쓤"}{U`y7 kyvIh0QC uZ$' 8܎RATfOЅ 8͗wt=LJh^aC8"S ] K m<8ײ#sLDA)Y!.l}\2`'6²e2i&X묑N[Ϧ6]@V ģ8yyccCF+F AˆVFk\MFKU|FYM2_mc "!auħ>:rvhZwf+( vb|꠽ L+IT\VN1ŃQm9S"9 GN`9q!Bdu >6A3hح__2b)U>"t3$`l]3˥2 l3op4' bmQP篢p,@.yy]1]?ץ8OE DuQE'`q2)^9]Yiw ڨw8ĵ䆰˾0KYd+7l NA45ow/yyyʄb6%#/T'B {V?Ga|ܒո'H+ȃ$Z Jn{Gguom %ĠP[jd>t*ct@U/p8D(M_lXWlͳ*:t ^^}};oY/k܈KX+<%O*vq&R:U*Mp.j0t֩(kU>oUZD*BiʅWqD8i>}$3|jlG) j cxzB%>z <\fpџP&0tgT.F,vZFr/q@#IO1- ;}VdcVGa_g!:iw=ն]h}>^']4PW{+J?bqUFiP<Ѡ,PkKRUk\ +cXyCx)b=LG!X 8x+>-Kse6+_HfuAilDr0̪"SPz DxuEҊ*3R>Pfgperl37.J]3{O`mu)Y!6u7V}*1~Jm2A"$HtĬK*HխTnw  y/#e#RIR J `;l1 %s1|L0 @mI? `g ) (䕑JG# O\dQqi*}@)G2!Jx.z<ΫDGO߱w 9x-DA4m{|5TeX-$ݲ5Z=fۜ+)Ϙ:"YI}B ٪#NhU(wP{`/m`wHIm$k\I0,-S|/nwi}YV+$r44O3:΅Ei k~4 41rΡKy) FZHPP-²9wImUF`(~itD |uF)-#y5$-0Ƃَ|؃GyCh\B*yګ6j}RfF|NHxeNWFktڻP8̊ ~JG֠lft4 zDØT]h^jX+▆"JB=0?- 'M{omto5Q;5J3־H:*5<ͱ G.tXIYK]md3 3S3&S$^_||"Fj0}7(NG!55i#Lhw^|>o()# Eb쑾 9,^O t2"@`!0LɩpcܰEeQ·wQ {^پʳY ZvG2QF1vFzݥ kY-ob%IEm cVzYCyQ v SxT_*K=Eݪ<e԰=(UXR1#Xuppf51hVdnNQ 1f~@a+:VV{"Ye_j /9-.25eR;GU0+yٛ#:Ft̕g`13AZ_eX~t ũt鷳$$ww^| . --&([+2ʨ(qJXқ6Yw<7%&;MT> fL)"C-Yza=AŖGM*{~<0ePy;AR2.T(oy{o_; 8P ׶`uI:tSŶh >oGtȯ>x/궦>Iv,J`0*>:p ֥Tć&24etKaGL`>ieG`qY5(ƚbGO9xqyBNrc^0AuXQf\92ux7D .7o :f6mbH>vF$V( .^`դmu ,ji.~e u#\jB5I:N(` .$(xٔW2NR@T߹rcVEd3w$U.F#Nr+><$I,HT../:ͅcā`OAu&F_EH{ eQBd?g5˷b|1gbAArjt3VS2G:| ˠEwv.57niT ߼)[cqB=9<; k9ghۛcȲ,E4#BwLc(Ģ+lg+X P,4ERqVZ`&{vRKLio &CFU#|`ٞf+|@2Ț7/ԓKU06zFuDy"]?jc0NX7GrY+avLe5] Jox|`oY" xg\9T:Nd JM}#VvC24ٱ2tjFz:M;6$qyDe39Q.VsHNRgY ɗG,=u¨Gn)K"ceeY2 $11"-`dV|>w3mӌq*0!)4Bd[Y =1x !i38(꡻Y#s$v.2 MVkNp>$ $q42 "ډ ^1 "e93NT ̾}f5h+fJq/ ̆F 5$e$ ܢ vyOriAyw)hӡ4t1 +ѻz3~Iu%+ mIz:;$?#ܩ-KG@x[Zd:O`Rԫ;r~C-6cYo#;I⹋OӰf A߰R6#ܫ']`>̦?2V >cب.[ؠ/z AK\`mkSP+}L,Y2.@(6%Z#709a߻I <7#p0e$P1Բ+Y ~-Ѝ Wg \C$A+*pJf5$nkwTBlܟկ0cMw=c+q]+*tC䜩lbLJ\m@LvLsNW6.5¸:NrZUeXtnw/,g:fbHV0%^j"iMacIxZ.ePÚNg9oO)HZ7_Mq)1%/O+dj;؎(?b/p9+88WVtΡƲ6^c0΂W{|7%XR^ j=˲<"MڼxPďEqʤe #V|yeχITKΤ\ӵizKXsr˱V%H5f.z AstQȪAj"FWd8̪xEsJF?"4*NBQeRѷWXZlxJ%+ q+ $I]ұyrM.]kt@[[*QDbjW*+̈#_HFf6bitu (*~1ɢP#pK\ܭ2b>ʰ |׎8,%Z-~'6uSCٚ/.[&Y i:K#2kQwܿ.gȪM~`̻v0+C=b{0 {abjҦ QԫU#³!FA &d邹O;Jʒ<8^-Z%Kz5/18LգI"쯨 w$4,v M!A6J9FyAI^"b GG9P۴aZ."qƎRA$9vE;3eC,IǠ9@,H(%,Q@ :z'T%zX, ,>%wömsQyC)?h_/?xTү R,ƚE esVah̅m,˂fX+g}lwp mRDf#@@ܝ5I9aL"dAF rvf,HR8$aUUl@.ʍuA{GK@ר}wfw!߉,m`\Cbd˔9v QYA#7^?|z7=)VַV^Ϡu}pf#D;7},5[$G3b6M򜽘@vwC2sb:I<\qeí_Hl>piPn߶-{*.z"25nR1רdMryMvշd\.ǦZr yZBҒ; '8 d P<{juITܰI;+SƆ7>ɏ  `;E}{ N70ϝ|.V=l 㶛U';o, n5z>׎^hX) ƣ7R1ΊW爚31!@?lGߓ9fJZ"YO/.c,Q+؟W',2LDj'>K-X0a۶ڡ=e4=KPSU; d(c2,J *׭w`$^"|0 vJO}lYc khܔL*7YPe#6K|kQ0Pa#lZ v2~i˪mK?Ba-g*┬c@6>FGFHm~=_3Dm09ŎC4Ss:n0gW[_=F!2j_;&bu\*|1&:anQ1ר~bX˚c%ZyϙCr\&UbEYPv^gQ IG0V4=gafm;v_f=N!ԚLN4S ލUiTpNW z:"-D޷=h8( #@7'd9ObI ? L8p˙sQI2`7ĴV8RS":~AF;鈗W%()Ӗ@vQOY{aN&Aԅ] Vruө%=ݒ9 "`|҂EPMo^+yQFRT5?,NZ6Q=&0T}sst{$@AWjuh y:Ehw+AE1)o+wW=Wr>X-9,:/aɬ!9^yXLκJsYֆ_CXѹHaw@^9GϚҀf]XE${0ڈz$bO\1吂Na~ߝ/Y%e←'׮6>=Vga[P;( G}(X]X}~QlT;8TI dnlb(9jB\%R17*,y}z˨)*/y.`ITm1뿶n,21:Uݱ]H(ͭLZS"Oni`jqٜޓb=o g4Df"Ď0s2M";, 7/2hŭ<eԫ6ӧ`c(.Vag uA"X4;|搰I4(&1[c(#S܋8J42B-4˧ҽO)oyCV*M.Vw: 7{ yNwu*KQJX ;bg˙Vf%G5l'PЈl!#m[e.ZE3w.̲~{6'#X ef3+I tmaK6N3+D"H~0˜ȑg "w, ݇s_2FQQUhI3‹dUs Z$eŔ-)]eBٜ]"ʈaɬцr.-XYئCȈQ. Ě9 2: 1_\Lrf=Y=Mjߞ#}gZȶp k2 5v611W^ld@ePw?caR|, B$DE vGb6`Uoc@xA5d*+/ޘ_sR1`f6ﺭH3|qğ*6tWq $cK-ٯ[>Lsq,~nstV_;Cx 6@q0E{aLp@mMTbt =UOf!:CD9/z_M鹦 ά5)}>b@7i-% Q1B!QPG|L\۶s14̍D;*LʬE(6pȠO|Gxl)Ur$d-\2[ki pg!QcLsC"e˾nT]Y y2Ču1iw[Ы yE3&J˦a!2fc`#l ("IbE8 99YvTESU(sQ>j\_-02.(TfqL;2L®usRKg!5e\cټ@8q2BLH$)3[{,wbYٙ1%,:QfXDhoTW@A8iJ'pKM#Ӭ3UmW쟮^-)yZ:)ED`L0+'gc:de&HV ZH%oUYU *QuIz1 /O_j3X죑WZ@8x>|lNm^ 1V;qZ腙s ۅIgа:QPU7SOc۶ ;G,ʄu#bAcD}CxijȲ-cw&p¹3wFW <(mR.Z4 !ߊ{\[VRõyʏ{-HUF7 c1aF2'97U`FI5ፘTw<:eVUHQhf]$}8ѳJ5*]eObTdr*xIr@x0lDVɉrhDB*HD IR0 n1Պ-B"e5#e^v`7'Sŗ:"ʷٔv0+7{6uƹ̳c;[ \)"b>a.nQomC.p)퀺zI Lz"dܟ+M"|#,ؤ- s`Wq赚0o] f1&ŽB%ΡUKfXH 1B~7cx󫬩?7:Q2U^BWz8w2Or/҉*,5J;i{})@Ucʠ:5V=c~xP{b9@H,U( E,~c qtՏSQf5߷o ͝QFđ}Gh@}`ɅܐO׶49i-Qb@ok] {~|e {Pw$7-T? Cq5 ocCI~c}G7ŐLdRh[= ?\90,,OS4^e1 Va&W|5q!pj݈XfAc C%v( aئ\O7 ̿j  䌳qL1LՋK/q /]bfcHWő6SqF1U?qk v^!#ִVZao/`Byc-qo Ӄ9)@A*ev1N:w1N 0ID#/8[x?3@B?o ӎA$9_-q[x?3@B?o ӎ[Aq3@Arv/Ÿٌ ?|f [x?G߻13e8l?7+ew1N c0f(+ew1N6yc-p_1FPe2f2߻3hf2߻(~c`Q!ٌ ?A3hdec[x?3bGc-pK"qcE4{ !%3q$c07q)}tΨ4v V"؁f3!#K+*lL Z j0J,fqN?Lp쪪P[PH7qx۠:YwGfy%f&!{iۈh'R!;aԷuZڮyb%1`N@իHi4RZ`M|"Q|fjˮ!EX GP SWzf/0^b@C'c$8\jwcum$XgV2̥u!|9^+tڰ"Sf/O]ơ]Fw!I7tMzՌiКC*ǨSg]q{N)RU??PY.k;~]"SfKweѶQD=XU w#`/#խWmu5MWs`vWd*EZ~m}AT[H*}f"y@df fb>ųyM!*ƚTE!>agFYFP7na9$A#HkBXx8B-֙a"]Ŧ^wfGTn L$BSұkV~Kyb6 YJ`oX6Eb|E:1%MO%tu܁n|!&QfHXOP( 64G|å 57 -]۵z̞?I23Ai+2&(J:L7T;!8p]1M2W=';GRAH#V#+sP,.њ D S:_VDNaD zYMc=0krJJh5ic9@=c.DiU,݆]TNwgP՗dW5lᶔui$e$2k2a=Rcf*PJW{k?ΡYbĈ Uw؅UcZΣk\[:esjYyʅa}A6yx<' yPF!e,mD!@߃xpZtkw1HQMf)uz^f'1+4hЮU&UݙER TmGD"ǭIWQ GU&8瓡$f o4UZY`$ Ԕo÷.s $tX",m$DͤY1P8*\(HcyXa{{9lXH4A!u}r@רnWA;쪅S,(Ӡ" kM2%>wBWȄJ p&I|'36c>RF"YmvNqx302YƘt,&9U@U7?x~1;Qn#*ef1U5GE`II&"Ҥ+èe5.[4wdK& ۙ5YG2f+ge[afc sdϡ U 1)l\֠|D$#92i `~)EY{ٸ\ɲcQIycz:4..-WÆ:BMrF`ku(PW"XS4+K  阱erCV wV'IR6vFXPڄ]iν،DOExYzfgЃ+\SFW.VB)[JUa:'ڒ20 fM(:w4,S1)|52g*zβфfDzKN GNIfeETAZ,cê^U i?.xh1vH4AIL7)zue7T!uC"Ut@V أHŖɮY :u~!E}'QI,1U,[j6dF "XYB(jv!H͑t+}D&M"I5u zYˬ!Kf$MwcS%,&e :YX'6evsK~ʨZo#{>,'N&DK*JÖJ4+EF`ÙHXq*-jt rX"5jd*JƢ̫IQ O+ #Fticml˫XZt{rPH]'g(q# v2+,6( vGDce,BQ(I #!t *fyKjl^.ژɤSa6߾#2ķ6&]Ho)Q.}2ICfY]qE D2gX`tf };cx!EykmkVJKKF^ N=Ue :˩ c*7?4 A$(^9"j1,6冞1p(Mw3Nim̆NQ~W澮KD!XtzV6T w7ĀU\vy!` b@GH&ҷ@n c\ =xLhzB̵&bh fLJHAG;N՘_ yvh^r˻'L9<$PŖ7)]'H`O~.l$4@$ ɺq/5e#Bk\5XMykSxh1G5ʭF]1 ɼFicc|^vadܓs":rB37Y  mN9եY2K..-.%<,Nބ<7e̲ đB_Lnɢ:( ?:!ɞ[7"rDym15a6:K. F]ARU@ʝ朥)Lbb l[ӐG.Te˽t7&Akx":~ q"`O=bBȭZl<;Xma#NKdmLV:ecq"5Y9VږE&"*[MQBR]A˻3C1y]#ps0V1ؑ\E"tyFe'(*H#::5y Ѧ]^s yUCB&. H#`C9lE,,k3H*Wk!GV*|mTo# SXPD .ц:t{.l(SC ]cDŔ(Ge%3ǒK]c2ĐB"@a%KR|([Hbe* Qk| (3sGUUHA$\E_p N? IO%i"_]WU4#ͼBc$԰2pi>^"2E #ZU麞x*Ga ?*k~]В70W5F'/D"y~RI#2!K.JFڱ'~X&@H٢B .;: G'XUXR#uUyuh/;apQr>XFhnC,]H A}5?*er(@HUI QjQm눎sFH:r0r.вJGn߾!|;(BtF Jma"o:̧U#GN 6-dr2WBB#F3SDX!tTxh L 2Eju&prwģx#GGa cy}f%U55DW鈩|o^&eoe2< "F`jCv6.CShUoT`c%N$JjFK\f(*2`& Kkܣ6X4idkml_Wta]% 5X`"9i>H+"i]RyVw:lE-gR [zAX<6<2L+'P~z54e4axLT7!obu`ðp'3 ^DXյڮ;wgg%fd'T @ wu xlNj>,\k͘*0&TQV6'rZ(GdzYeU֕Z0d65YV$9V^L+դ}7"fiQԇfC(նa$r{6+kxdUh$Yd[5A}jAHpk)Tn Gb jAc@ăNGcr.#݅+3 cBpWb/;e Kn4Cy=6;S.Oo%֬$G!Hf@MD7[|V]TY_dmMd:G:;"9C)}"K32v܃U+qOɨR!%jc*t☂7|DI<:t%R5m,Waܳ@'&e4frHEG'I}!F,-[\)GYLњڑnZ5*өNP_+zo3ɱV2X5,GP5i* g>-Ą(>]`5R=_7xW=YwffF.(vT!>ZAC96eeXQdI,hXi Cr-ϰnag2EtmndkD{kܑCfx挖*zqCrnʨu33ҤE3~Z_W A] tIOG6^B0H$3:ҫ|oB\$4*A$Hq_JwR or'rͦ!@YSg.E$XB|o@7mg^6by31qp՜Ǯ6eiA<YI2g nFʀ%ewcHRl7tR;plG௚GժR.&s@"Xp^\%3H" zA :T1Mǹ# $V[~_1,W` oiTeF&GRRa wމĝjܡbͭQ2JEԱ(7(帡vxՁaF@[ʬVؒtg!Y ^f$u"1,QVeAh$< Pb) If$w=Ʊ >dbd-U\.7!Y3A!`emb)qљђ4POd],mt/:)D%Pu?tM"ԂtJ6eObja(\2s!݂fCytVG@<#eL̊rS•CU53@GEtX!wҩ1K99ͮb)Y&2# e 8_F i$:/!&jI@m[R)դh㑑4(@C:RnUyf1kE2!',Et3cD`NReg:$K$l]6Q2AYL;Y߻ͮD>cSXjn@V6 nc.G-h,J,2]v@d :`ɌT,lnߚ&9x|uXJ ]P*72mm5IJet G) WQA^UU?VArlchQ\ /އWI= l*C8iץG=#m&"&{!ާR>f=0v &93i zs4$ZJJPZXѦ4xR"C$ F7$+$B.얡2.zaDNu6E%udղ!5IFT=4p?* v MԨf?Ɛ[vځœC|' " b)0A(D|Gy =y[f Tv/˃3)*H]WΰU ӽ]\4sX$HX6ը3 KdlWrNqV6m(K}LzK0!Sn-ϝ F0-Li uA1 83ȼvy32)>T Szŗ[cj K(Œ@uˍ% 7curWK4mu RS%) gQbQ)7a)!c1 4j5 &BjTZ[(5.]\TWcDt=jbMRk];ymTn,s'(섻(X3TB!rSptEK'&S&=33B(e&5t$$Q_d͘aGGW\,hk(}9NH5r@󲒑 2=;78/&F@Z(-Q4`jZʃ+`d"3]#q+g]#q}5(.-ÒhOw!dks.d9]]P  s'*嘒 ,kz20-VGM7MW.e H(!gp/aG;DTʫ3(N%.p:xUiu/iW,B@ѺUb~IHѪGS Yʡ Z[v+J)"cik*c Q^F.˱5I(hZpP|H-dv K%i,NCy3H2*!#DVR?MTEh6͸%ȴj.TJlұك6w6{<: v]YYoB2(HXu/&<̌kxNujZe/aX!Rz\!ʳGX4h(`/N0+AɀXШ>])=|Bƶ8C':JԍI(GRemmn |>6$OZ"L]=C<͵Sdi3N(<fT Wd(0|BT $tB 4 f!-daK^axጛAx0 X#o\_w+(0JI/1A(PPMIJj=ypQmJIj,/fRe9Qh+@Wp\ /DN<lOi5+ 2, GnC+JGf8ꇤiRXPwE3vʓa#5匆4] Qd-M1h+!dFcDX  РuA͜k G& ȩ;sy(UԶ]T4p̠IEX RS V3h̎욨EbH*67$ !$$aUVuJ'M%5A<&ACoUPƌݨƬSJc?9 GK\-N 3i Ճ\õ+2",eSHIv0~hIdumeKaTwٲ?)rl89KS+KE-{ 4ee 6P l^2NOe HUeԑa : hqauӣZQ"PHUk ˮxwݕ*Xh[L* -YaFl^^5Q6Q:JV@-ubԍ#K#XV**A)7c|= Li%cy ה;;Ff\1]}F RPt-"pXEꢖ}-Cw mҗwibňAР; h|+INT1H UeQ27ͩvvRf348\D69VK$إuklB UD؍RA)fV1Qo121LUd<<,Bԅ̳7SAFc]UWPA wx9 uF "u%GYhV}c+ $BS0G9P5Z8ArKE O_v'n6YGRI;>stream h4 0Ee I@ɦҕt!BAE?ߩ&sjMZ~)eI;nZ+pD} ,R@y9'"2r (ӭHvC&6,fv]N{"I\ϕ 04U7 endstream endobj 110 0 obj <> endobj 111 0 obj <>stream h[[sƕ~ׯ#Eh&)ّe%+3qly΀$" 00ۍn\3(nRDixx\Ͽ]U/~5@׷/F/R /B]< w'计}BoJɊƸn \~ \z|o))B9j(ZF(:55[9GixBYar*ә) 5<C:Y:yiYRLtI~I FR}_TX+?+Y͛6WĥN\oϚz,owPx!):tqܩgN4RUDޒMFTWǟDB<&_.o8 /'!>[]E5~,Rˆ2}qv!}fy.qڸHX n#wLN)7!9\hΛ w|`~g8{B͉,e-{aBC$.F^0 )yqc9dN('2 E&!)ƒvL|'Vڰ* ԥOZYjJQesIaQD*6<{9;uG31z>Oܺur+TR VQp$<ާ[ q~ 0˘_܎ X7xSwG*v ^Ro>Ο@:btP}:r)ϢC|c\ "BgN˰;;ȧԹw8Mոa#.X`"/oTd4"4~1j_OC<]/UzBL:M+UO|T%LE]cx!6ZkǞ/8"W4$ aXB#Z-N.#ٲZ<>I=Sju-@a&kTvXYO*@qLk!z<*%*.A1ߡdRiF$(KȮz\Sfgī@K] t;3#Y(FG>a@QQ=-]ue%SDoUSDQjݳbrlk2u2OW۝#FҲtշ8GflGt4ttPy~U0Y UVw-R%y3o]S? :M˓7vrڲgzds(4K&6?61d 0!~Pqͭ&»$!RB5<"cG4c{T9@ g̳sUMyCqy.ZO$/AHs *lfCZUe>ZkGϳ7<ċ V(7wy8ͳ6TuY<ɀlhExWa92.( x]-_Fr֑PW5o4YNEoPc(w2VцWIA'I 14>2TmSD{T97P1BY'q:E^dߘ>ϳA>T_-(2!;w-˼hnjӸt&&`Zy~2%cqmY+b;fuhن%*)o_Lo0?HV+굞s T Ax$o3+GP|H[s9T?Lˉa_MjC qE/`NeRZ|%>[ ފre=Tz3p$+{XђЊS˻8%nX %$ǃ4,>z005Z%6Scn]Ls]ڽSm5HV7rMRIy~y(Y37-袠5FF3,D7nal.vuet4u2ojp}ñ\2Дxvh +My چܚ"w(uP 60ǒ,%L@)˷!VWiﻜ?wǤF F0t{pYq/.gպF눔kWhCdj˽|bxx8bsTe6FyeLW;U hj!.} @A%"How Uځt Z'׆﹁8I #_ wjR& '(İ%97YG7rI #f=l|$vĹhH}g+.7rWW0`Nj5W(lQjc-#n5&ˎ^8>k xh vuCw HkӉI4)m{i4suYQd+M0df%B_3 $y1F8\^!AZ&?I$)u?M/y : $¯_ CF]'}v|b8ocSDEh秢o4?-8A5ld*D!oYOV"oT몉ۚ{Y̏!tQ'&7%GOjo`)DM, ቪ.d7J脟]2vC,0D[P?B0:X:pňt OSKpfSO' Uh/nxy:͕v\l?E+fbϜ1%_1!E3 DI*/vI`zDaK?&`+*BeP *qvL@mk[CJxEQIy(X-oxmYTij˚'tvέ{zw_oHV^g[G VmQB\`L,hZ>eMnzQ&աwb20(?N͓z;0mp1Xlqo0ePֺngB*ɒm\dh(nqꄓЂrO8f5l˚vo D *egT(VkNWM0&=| y"2K64Ak*nE:xH`#fhioږuCkeMJ5-Z{+O|6 hgUi/ _KX8eK<2CEEuko@"2 OA\Pa ˲% -+K ~6A* ,Es};ygX^x'&@_ϛ}J!̟q.. V%sA4Zs#&%6YWi0za6n7q*W05'&c[ҧ냵slde-Q%1j7YY㥊u! `IY;0o 1Ehc ivO{]>2槿I z{#L(V%I.".V"mP³4Ob4 NPup6nUJ Vu &kdf㊭l]/ɺIw2Rˣ+U?b-8P }׸fKnh~Y|` oH[38R]N:v=sjk& P!+k55O<{LN!fg̻#0J8Gln$y)hBn+!6< &I.&݂ ${;kw mvlQ;>mC#fvs"{[\]ts`xti8.41sy ~V=c;;ih(s.鎷ؚ]c9Ly_ԃI(ܽ T}Z^Za0vjH"np^`]ZꢤZ1אF8 ~~]RM)Y-ӾB AE֚`(.r;RSfÔk%qUԥJJ$X(#x5n?>cg޺L`4 b#& zNǮ+?SaOBL'8[ Y88UK*U1neqL?^s68RsLLi("TƨZ[[~ R UV+J%FMbdLod wCEDka5,`LFv%_˗o߂r ~[f-݁bNIu:3i>1hX}VUYU$g71Ud^հmOCSnȥi:vوYV oҺrOwNi~mCb9;%)8l|-d8e"U:龁k#' $%%|>;{<0V dLa J g+52̧ܿՕ|iUA~;ʷSK2n`2FDWP C͝t,xcɞwpǺ39uCZr 8UHKh0=CeTSWo^J!W\ݷo/o^#`W^$:}_͸ e. H[1oO),PRPN988K}>w^n E~Z!PZg @.,ނ7)q-[֮ +WnĐl߬T_56o^~}_6M7|w|fOF0sGӣgmmyY8f;3edu2;dEIZM& d#hc% ɏ^lSB=N+MZIA)6앧9A7AgT`: rٸ:|75 er[c!leT<ܕ~X!1Ϧjq:-Yo2;]dۚfz& L'*REJS ձ.0C/r׉`:y@D""MT%MWȜvhxv)y}[gTus&{Yk"=l;?5;!V5#sa#:[)qCdBLQ+c{(=feIC4^`&Miv lPuAU(HAhKP0[8;_RH (Lغ>}` 4Zwт]C7J[,NgO h\5Y8 0c H,mθ~6Fb7;OY~;Fcsw{^6R%DDi`% o.kw(s2X8PNT&5:1Yғaxl?QJC__qԀ:1_8L"Β,lu࡬c #* ֖~q %1ZUEwE[Ȱ_fyT΃̺bJX  OHߪY5F?x~qcr18: /6W~1۠/+1eVeԲU<ٔrNpnm?Rr>Ná$A h6?Aa'8A`%tNp4dw6,lBx2XGDj. ȳaZ !j&Cia42u]<@Xmd o%+Px"р=oqIS,5^=ʮ ׯʮ2I k: <dB')!nÚ>stream h20Q0Pw/ .HLNq-̀2Avv%%% `C9T-?(b`b` Mls(BʶaF'D釤V=$0 endstream endobj 113 0 obj <> endobj 114 0 obj <>stream h޴[[r~_TDs&'*Gs}NuA" @JJW?83e 1x ׯwhPwd67( E?Q) Ǜh Wr/QۛA|# ov*/B9D>u7zH~a"1E(a8Ih(N b3 B߄Q" x+WBx#>|zAʭ^J+I/63bL!/ a%d(N+KĘ1pҨE I!QrCr_)qYCf֐|[ߴ@\0NZ 6[KIƓ(dX}f)$z}wh]),"3]E7<>! hU!2. iP|u&i4>=$i41>=_pPowXތ f .Y6#(*=eQmF^Q)oKwc,<{+iP~1A3jp؇=s.\ TܐD39DJ)=kE6w%8L, xRz Cb8ˤJ'c2W;$'럷26[.r@WYw]^gŒ&G1_`"iṀ.^$w RIO C)~$`uJSt&33? I9)@OYU!2s[ZcVyvpM8& D?ثHc"fDs5bw[N\ns (HTesNnX2,cS1wR}24}_jrb,XО_si|' q<s%<[sܗoփڴtM|Ң/8Mt-z}v\S/+h][MRE|Te(9uLQ^MXԦcqhYa}0&HU_g6W&5:L,YQ&xw8#`ґ{N<)+>vnǬ8!Pm`M4yR@~ӑ5tdHٱԓf6et{LA$}TS{q 8JVp蛘uL&qI id.ř*͗wg^_yf6 e^%k;ZSt1O|!:mvE! |`]%4.I$ cvgUl?vu㷉PڷBUAV^4ta"Kgj\3?կI¼KB}tdW8PfoVL 9q, n@t%%*dy[+鍋b j{|Xj"q5YU KLP6Tzݮ 9.Yֽ&^& 6R#6J~p4O(jwht}06GazRnتK.qLĻZ[eHzJFg/]Q+N$(|iHH DmT<./Y\Z ?5*_ G[2$H3e~Jtlz(zɰVWwli@M l$"~tMnNB!ҽJE &1o!xvcǑ2ɩueE5&{7a2vxѩsh%ޙK9dÒC~zh4A22چbGr i瘡5 X'm!da!7DSH;qL}iY1ujJe~>:Y6P3S|'GD,CGha"e!jwMKX\ "[&=1mWp6ʊCn@T)$W±bb8G`*%~v8mh5IcqˤB#(GDMT BPޑh2oS)3\Үt0?OE|kh_7] {y9O3wJb'|6/q;;[&,sW!ooqP~|q KԨ62%zy Y3!]n?}~1AZun5r-V̨9"7`A6}uݐ!4O'5Akq1W~ 2\0q*GvXJov8eje)ϳ k.QeJ]ľ+v<0j![)Ѳa3ZʟN`92TrH8 nTUBp~{lتCttO.m;Qre7ce;ͤ$8~B]r!uz\:<[j)òkCudd ܓ҅{E .Y@EI_JtMt?jH+нtk % 1rY*,a tHc[BhS9t@[JmVm[L| e|O2ָH+G4_p{PS6 O& $ Z'ͷq! Βe.Kbvj)uHt`\ 9,;mwNL]o̥׷],צּMozBO UO}[˴0y$[ptY1s}|/UYM@FUL[88eyܚEhpJEz:|#F]"߸CyDe\ [S:RNna? uvy"˹3qgP"m[+F&nC\p*BU]V`w_ңUż1hIa6(ݲ,CΔzBj]p؋5ݻ @ :]Mh+'KuBm`ұܟg8K< T' ,*2E&!m8U0M-+U{ܥ}MJ X"8ndnӒM! Ǹ g\AU͉f;[[qod61?X#F\@[.JzChn૥~ypҼM|BsjRѣw@xnag.™԰⚥vO}Cmy Bd]9Kt >kv:t {]^pEߕEߵn!DĉkWrnoɹ&h3@q¬oZW[3'YSpP_P?&?-{gA!&h*busMNJ1S*1W -bFByU54ȶ Jn1fsBX߰x}c`!s볇 0\˪:?Iu+`b&P"]ݸM !)rsfñ^0lu̯j3^gV<,F4B!uTɌ.{]pueˬ0F>F"5]XP/滦7@4N pLѬ9(zsXm.|vGe@A5SY!`t(il7- 6fM5V*e΃!  o3`y2} V~i|O,Tl ;"d=!xϤWe/$ endstream endobj 115 0 obj <>stream h4̱ W7,!\*]#ݢ!-2l᫺ {63D{O#KAeQM/;blIE HC &ق,;oIqe/nJ} %& endstream endobj 116 0 obj <> endobj 117 0 obj <>stream hެZmoۺ_oWY À4Ν!pmeܢ~"KiKP46r9Il.XBi@02:}a(. p6 Ƙ5` ; *+CIh2_ӯa֔N&] BÇd7ihLC® !$JPd%c-!F#m$cHsdWg;(DKz3;!lDU%j@I9ajn#.|5 1nTgV"/BX yVׁ)4]揋]kliR(bD9_?GD#-M#1$I'yك%c&쑗Wޒ5*IW%Dؽ-pYm~4B%|7l[cs,Mhy} n4UJd!Κs[3v 4`u+}v>H%jh8߶c>:4 M R}5)F9MPSYE(M\&/ZŘhE/l8HHsv*b]bnp ñbZ% [l;j5"X]ėm`t*=rŚEs~#L] 9tfIsPfl^)Fi !Yf?xjۚ"v}$.JK?/% VVs`\<6.QQ}6*Hla׏=mJ7f| AOF. O Oy+ÉΆ97N 1Ӎ=6r:1ae?CÜ-bi-Z;;YEaK1شi9PTWg x' * b8+,R&8ÆYbO!&S.2Mדl<\$, ;Qy,ܼn&ӈ, "4Ix`~F>ረ3(+B-W3b4A=< n<81660xLaGQ<8Q~`^D~ŎAT]a I%UH>Nn?MƓI|͑ӸӉt.zg:ۛ˿/?&& uU/&lb&&D;:AƦ^{= ݏHr! "$=,\c˭ruʁu`E_ endstream endobj 118 0 obj <>stream h410 E4 e5PU8~mma0c}3}Hz y\4'H̜,NT2g:VBĠ57e){mЗYTh5}2\') endstream endobj 119 0 obj <> endobj 120 0 obj <>stream h޴;i㶕W[ԈM܀7*؝;͇IjK#Q-&:$5 Pvy PHbD$Nx0 Mǻ$x?m?wI_~Y  (Jwup? 6ED0& ؜ Eaq,hPLwwecI]$+"B#"j$P٧VV|evzVϵBqVh8"C SO}G+2;??]J>@rAYH K~e0~$,Bm `TʔABP)za+ي0]EKR֣e\J !/ (C\?7 "8 %:8I2/ٌz5^7c,!vl J,ɯH~g a3L6 d"yGλFԏ;sYPOdbC=2/hB (59' )yR'۬x9߆z\ sekB`U{oϯԹwC} rn2lKQcAq BLج*n$Ah Z/.|ڃ|sy>dh7h>ipFk:,'}X!}h|Y?vx%yBuE#,T~<-$!e<ӟO&nd֦1|cV>\&^|Iex0±ϼA[i[ZjS=V !v6mu$}٭%a%XiA8+8OV̖;B)S2 51g:Id>X l3驴e;MlΗ̳T$B+qB n p̼bʕCq| 4TB7yVŅ:Rh '\!MOq̅2ϳA6@d)l055+CIͱ|c(i=;k|:{5=F4)vQ`$fkio۟DPgAeM7qkN!"^M0z)' Җ|q hM)ފ2=Z5+ȋ7:^ 3H* +& 9fV*ϯ2تewŁʇao@d]ޞGZ(NL['>pWn,oL렰JY}\Yab]m2}Q '2 ̨Q޺0dq#ݴu·OpN@hXҹ0,ۊ2B ^ g*tGn sćR:)}{.+Sot3M!|?柖{=`M_`GЖxT-k(fafY8RÄ$ DHuҷԭ(hM$#fXuOoP4|˄:qn8†ѝtejNie@y5:Wwq宩ayn޻5˟H!WCOlӵ%CД遂W*P\ǵK|J\c 6 ?^JK}!̆jzYG/ b~NU(<9C1^:O𨖮?/֜C!kim<:;XK-}rL$Yԕ>Ed>á5;] {2iƫ˛7¸Nyo& ]ERy{:> }[VrSp臛A=םOlս7t;ld_.aAtţJMJbLכc ctCTkKÄX:gT @vJF'5L*].Ǒ8BŒh'ÿf [q=) M=MTC9_78. յ̆V;bAbH ~{loK sAq4-M6afyaM6G~j(%eP@5τ:̈jwah#zy i0c1ZN򤂺j m].He9Fh|;t 1`B16sС9Tu:玬ذ(Y70JcWt6QZWde6Hލ0O}yM97玴 E!1}>]vj0ā1ۧ3K2ԣo8FWRKi"K;p~yqMJ|0s6 |EMը䀴y~?FToQTy%L,jf~ҒN&ǿ\Tj$ 鬝htLRظеzQ1 IV7L-_5*>/ER1$;:cu ?H3v.I+H&d:SG߿IK3w#?񻯃9y Ӂ]`k$[pv0ӵC`v0 IcakF2yRCПG٪њLN]F2q7piRURM!!Q.joVLK+gyCk}HkM{ hMx :t/?E#=JTøv^:;ݛ:%>PP1Y5guc$S 5GGShL} Cty4THr~UtiLC3`2~RCjRyY B.>_B^3\/^A 7M9_J +UX&#MFmrsr:} $_iMx̹O܄Pm+.5hЩpOrSgMcg@/dI-klկ}a7ӡ> HD蜛a@u䩋} ug`Emcndm",8*Fyf$s+c}[wPDP6=H0x؃dV\^Ԙ=:?NF+k>ZAf{]<ԲWBV^B/Oigz]S{U(ɻ|/8 7>.}ёep1;gdvX{M)EA!9%bNq wޅNz=:SkFRyf yRwv<5Ho&ðy}?u vϩPa-&.!R|C2UJP+Vv@hfۮN0iqcy62ܸtFz)u,Fukjpb%x]Vа@j?&#֓?JE\`xx<̔FYn#$kÕjpf&?"(ve3 Ñ?=- v`] >stream h4A E27@:65]v: !<x3eG,fvNL7-v*f񒍩fN_29*,m m ++fSY3Ƽ#}E7m|,= endstream endobj 122 0 obj <> endobj 123 0 obj <>stream hr]_wLgN܉7RQLH@%@&ܳŅXRtx.oQ,.! n/P)$Y@P1ÍE,tU/7\ V](pa^ 3bWE>0b1MPdP, DPIH) 1,tFhR`8RTD_Dq&"$lk@Ljó7//p%ՕoӲ\eK}eb,[DL15740oW}Y E"LUytItF~oDBREUjRP9EaUY )4ƪ5XXpw=`Ԅ8ex̧7yff6 Zr]c惡Um:S 3p5a>V`kd>biC.֠&xa]}́x.LLFot$ExhFǼ瑣BX9F .o.T) lR5:1kP_^^>==E"2..>{,tqH Q6*K=#ʄ:ۼa'Q8|&hj㄁݈ʩ?;v b*EF}' : 2y&pOrCE!Q/ :`|oL3*{`0I&0;= TYm&* FƒoZ\ѨMDV>j`*GCxQ^`SGNdQ{c2ʡ9Q^|+)wq᏿:.[y+ V"-5&&@C 1"_'Z<̖d:R39.iXyҵQb?K2b-ItCÛ^|pX?a*{sTwyZ8ev]jPEq\$|\*픠J]nGUrQ--ǪJZ@~$yLϫN<+7kGB,kgy , :~UJ'"|{irz>tjUu5›l5,ϝyG/yL}jzŒN"|Pv\FC(A^튦+H~ꦝo@!JPzj!p,b8 ).̀Ì76Ӡ05 'y4U[ x TK `JOSF"1#R`qK; y|S \ kQPpBK5 uG;H[^ kɡUbᲙ3)t#঺lpDF창Q؀Q 0 0@>dq+'w,R=3ۿ1j_(Z腖ѵ8~Zܾp[fhs=mx ]{Cqz$nor(5|`? ʧntiPDFXֵy89KYLPNQ%](~Y0o]e}qVʇ|WG-8>;!6}rS6bUӍ2rl}pV7bzУ]EQ:gs37!c%1Jݭ(>QITvpʜ*t IcӴQtzJ έyb.SΤ8ɥ;9B.2mu`;vVu"TzH9ۀ#%ΓC ذYpm 5c5 rmjGweYS9.!p]f.,ҤGn76>K G<\C,N;Hz%nmo/S|OsL=hʫj(q!f -0xâ Of]w{ڙ)7AUNޞZCN9e::(W`ӑ s/YblcM[tJ'\ks{h1bOfNu5㷌tPLS1olE6(%ůn3=3ش<֐ӥQ5otnk&mbU={jK;SzvԾ8XnVXl !M@`t˶Z`csyNWy%"mG֪CI/`؆J;ĉ}^#S(ﲅ~AP"6wWX"- g!gqNHdgЛlonm/א~XOݴQt01 XuFSf7zBndw-y |gNče4tE#mXC,hإY )od5 کզBGrm(px; mTQc\e};!]ߦjҘXĺNϲelwoΥrP֟݌ھuG0Rg m.*Neu Ӷ,Rde~3(JrEQ=_hXy{nW !q$iPjz1l:MVN'?A6-u,>;߽o<ؒ5ķsK|{>x"E;V:J1_]L ٚ5|Tx1@v8Tc3jSS=]qwh{~"9XH9X!+xђHb>o' 0/RjP+sHCGY*H>$ }$l2)ӛ&w>v2(7/Ӣe8T9 >dsq9D4{8N=? SHA4l 7Ҭ)qWX/wD[ JȞꋰY̞.oRfwewY 9>UVHtv'875yddQ Lr!{q!VQiotCjh{~"H(HH}E>?} 9A;_mu~Lj%ZICtQwcO6H`݁9żnڸ2zC9huR-o'ޞJ<^*n8T Ou^ISKֆj$t[@#>8T1GV$L1ė7WWI7+{~B[H|t$&è[<+HǮK6B6{ ](d3~Sw<ߩ;8<±uiԬۅcu Z{ha^ endstream endobj 124 0 obj <>stream h41 0 E8džm[RTC@s4[#=W[@o> endobj 126 0 obj <>stream h[۸B@HEOmQnhzEQ$Ex]Kw(ROZ-{Kj4of8~yjE<䭶 Rx,S2"FOQ?xZ@^c=T20"Xx~SpoSx!!"$b-抓P`OPr緋y!BRz1áJzFJWB-gW/Kj,AkEDhe&ĘXv}l{ȃ% P2=d?WP9P])Va$$Y(H6%!' 9%oHPʵ){lQ7ET)aV"[f4P͓Myȿ6:\e?Es-Vymِ%(v,mLu0\8&?Ő1JHx_C8Ng< ~iR2B= 'ݜ(jC9Rr0$)N.e_EEuD| P`)BC"^CsO}x~:F׃稨3LoO٦:JB䍵M7K&o[w;`IͲ$gdTf80oќ纉j*(}ZZO`0\1>QYӱ nDWr3(CuC.In(!`qڎ(["? (1aGu3D$c髅"Hs:$9!RmЗy,*)lc(Nf2jSֻ!-3 G777Jv8QP,G@  Ym2'+FKd<9ܠl6e +&72H P%hFSj3@\{绘.ܬ_]ZI1c25}L^m?r)];X⧀5gp),'1;n=X4Lq}uQ&U=O,@ea>VlB}L2+ץ/!x~X|^(H1~W!{{_~ǻ>(39?!oSzp ydFQ8T_ l(]BnU Z/zimp}\&,Лdxf0C|w~-1Us;.qy{ 3㲚keK!x2OQ_<C}={!p~E3D sQ'Bɤ=he64Ъf(jXZGJ~2bjTρ (ѪmAzL;ȉi;M O{+ȝmbhNbj[GQgX &!N&*Ond2P@Q{Dg~gKŒEbnn')ZNף9UܽqIr Ei24d;}  3F)P!jly`~x{RM(v{}AIئ3Spݒ +^* D}>}zd<82{NT2φgP_yNH >_;n woZS~ q-~EE]GE S Րl8%C͝}U*t!UF3H{Zv߭/Pܦ :&&G5!YMׂ sZv|\b5{HD %!:߀%նT nz!q#1cK} jDvg+  endstream endobj 127 0 obj <>stream h410 EŠlB#,Tj{>oRt{h R)S\Z)c>5ֺE:@"j s+l0x>}UL- xx,0 endstream endobj 128 0 obj <> endobj 129 0 obj <>stream h;rƕ 1;:*{Njnk)q( `ȟnt ݀c X=W^E+}QU$U?$$$4oգv'x(n꿯*]3WFpJU~FD@pIH ?'V~!%s-a,%xcO5IXS׼e4#8g[QXA-PP0 0fĭT+F>%&IC)U/& /1%R29=lwx 701TR ,%~t*Č2F=H$rRNHa}8jkr8J~Ez8 AAowց`k|UngRG9!Ez8g;xCK g>dq,24^[1+(KAg?$I0c?ݘcghPFbnb&8HI Ac';q`K) ibɇx;¸F&$vӷJa rrp'ȏIft>Rp<Ȏ*9LǭU8vj !Sv M&X " ~oa)*& F$9Ν?-.r)ttxeY@y /oCy'3 z!FQXxRyGbӬ Kwnd@zBiFKOOud /o-iOsr=`̝0RbrQ b*xC t<vv ˙].`&;~8( SCBt+v8b89NK&ܻ;(VJ96QiXQoBᱨ ! U.rN pǭ(G…Y_H Jcj-iLExA9䒿o?|  E!xl: Q8XMw덨8t9ݤ&3/0SsiذT1٧YbE86&4a~TZj=>|NrKP]DT8'Q7)i5%DE}UkV!G{uy)p'_S=Kac!*f5W AAZXl ÇDjY#mv'w>  ܒRqݍnu!Gsf=hT d |. >Ljt7R..:G)rƇ*ya56D!R1}qD8#i}Κk ^ȋDŬ ^TyJ Fpۓ-K'}K[gyVmI E5_[T-?Dt-ŠM>?&+D_s)e Lv ڕSSY/6R.ڧvmg M0e2%4yBEtRlVp s/_(R=8HB@P "]\lK/,YAr /id8p<ˍU: ;r4-{#^Ͷ6vxfdecD`qbiI몴k+ :{)f|.Vx\Ev]d>iQ:C&TxE"RU¯GM٤aSQl9Ym9 >#܇yJ-]Rؽ'|$-ZbuSrˡⷬ e)ﭼ*ȟLwi#ҙnKh Jpc-ܤ~ nm{-K앩68p梷%A9>cCׁyJ5vN'GKz3gY̌?e8 >=˔Ih 25xQ1ЄFOSwYUSxJ lNS89]]cgvRzH?.Bs5A¢)&R/L^_:Bjs1UTou}Km"/qEʓXד|Zp\KQ6jICEbAa#m ˛]4H EQC X.#.^+ ȟ@yUe3 Ā坞ܽ-m:0rW"VVkO^]۶0l֚57"ThbxuW ɋ=`ڜfJ.knfة8>wz:׍,[3,|0ri~qR]剿V텞VM^|Qi>TԆKJ"}$Ta2N~>PFBڡStX'U>Vߟet-KW7ç z7!~H<QO/iˋ+젤{z{%sGP^V_d.^PPqp^""㧗"m?LJQD>Ş3:t sta܀:N_QC%=IȂcuڒap*2ϒ@5f/ʦTi6˔afw~@ˋlPu`geLF60T}1-e3]Nb|zzاF^S8lmx⢑n!V8-G k2qg|&ӭR2{yTmHmiL/cz,ǯFfc ̦k]Hںϖp bP /"KVM79Y޺n0d%ֺ+D|i[*08E 笴O\@^ҧaV=]ҽaGxoHcKHғp0׾v.sja[{ ? S_l:6ox>'@R_B͒ތ(t蝫鐨;im>Ki_%- 8=_+[EႫ̆u띨ץ”1qX!l$@ "s\to#`UM Snl|6!IF96.sg+0lo:^/)[cB[wgDöF"3)@pB(e(Y~w^[g{C̤AXP콎UQ$MӞW wyf1^`40`QI|-ʵ[>7xfQr aZd ـ{9dPv"4*ָSKY{0!偃V v=8+,L{P`ܟNW2}jq/}hn C<yn%J8tW΋. {.KtU6[fElIc/mA홮xz--} kmnrTXiH dSMreSwd: T`TC~6# 2 pˇ~Ϸ7@ $J({b̪Dj,. c+gՠBA"rFTl>Jv 'dW]՝Sߊ>HE⍂<+cj8 z1_ y cmGqWm2SԼoa'ogWV`"Z}ͽAaR`~e$2|Le`Aug^>m_G$E!3vRJmnp%02w{ n'/@pivD0z' Ҵ:%nAm[ y!k3Za7MOq<.G=U>BӢlKЎ2OLa#huވށzP*C-lwڼ0IFEpBjmqzyHÕgci<>stream h<; @1"E,m5*lU(bJzc$-Y{ Q\˻nz4GZ9*.|)) N v 946̮e;|:-{bXnHWh4[ endstream endobj 131 0 obj <> endobj 132 0 obj <>stream hr]_ހi3ck+8}IHBB JU"i?g.43u&]s/=/o>!nnP ^LYn<\=]! CǛ^\x̃{Z~sL۫!/^@B /1E{fp$188 D!0۫h8!!@PI}!`/Z 7_ !.8I䵖O$8nō-.Ƃ+k /ӧ>(< fЄF+T ysImcv7ǬC7fDL!+dnFW&wE x=.G8VH qLf8L0nJ& C P>,Q6? bN|?X@|?oHż Zmӡ@PC PY AGy/ & %Zk><)1/iSc f&!S$DJi{Hڞ !aNiR?W\0 o *R:NoܥC!⋿RfN"| [0 GzOn@BHY~JVkSr,,Y"2 %s|0|CPcNËHsQc *RO8+o P[.(p6<0NI87t)#23%fǫ+5t-Q"j JL@ W6ŗyૌ)қ;?}W߼ߪdLMjLM:֔ǖ" ߉T^]{|_cm?I| iRC2.d W7&!0-+PG;5 PJ D^P0lBMdcC&:3ɪHoͫ~S:}Ɛ5Q1fD"'bw_2xaDCAhBFzV٤Eq=4;k/޼7hBr<'Ȓ45<'c4@E[Ъnfzk|\?BhLWCd9%Og稻0 9XÅ^A9ySFP[zӡ߬$o{zS4|)( 7e7eUnpʛ=c´7/Lz)o:}A2pZ)ձ7h;xS*KVtRnLo,bRVWkn 2?8-+݃s<5s 奱VQS3A]@X1,h1߬gΝ)+S9p8_b3?9&+ XUo (vaAE"[Ʌ*qI`7E%2ݥIaHdz̉FG49 Se#8f;iQLM~q^%k !9jt:l4]i#Dą8 otqJ18aC$+/,yF,reRaD "$GX8!1{Q206k4)]0JrCd16TM>*|g:%}ҕtt"Lkg&M j'&|>mKxh 3y( f(d>i!Euj*$b["<ҁD дY{cyXa?d3'" A4\ރVRX^Qz|yBd_ D.oH{=v if; Vv51) cJ\($Ƭ} g$ ԣ48aSԺjC VC"ӒPz=r~Y3r_2o'{؝d;#k6Ij\b&"ʸ}QvX}AFkvҢ'bTy?.LcXudcOia~v"y^[kf`/QlC5wx#tM=΁BQ44)W ;S3wHdxCè},Qϊ}n,Fw6Mg0y~@i?״TX?G1wLe|3 |Lv脳XHEH0]t|+̷1l@o`4)2or+Z$aqWҔIi1seaQ,#`>,\ftͱHlNBu*rd䷳5p 2$h9ncv$r<3*%[Fv`T0Cbhh#!$1ph~0Hlϴe`W1lV 'H]f(Yf/52s¹ N"ˉiQNhԦ)K)+]BoFFF$viDϝWءr 0]ݑ}_:##hpA0522}{Qð;ba, ҧj.<_|q;Zb#>3f2څiXu7a7,o| 凬5`(q˶.u-N:t" ٮu/F(ey.չ-?G c~* E kF$W_]-~E aqk3X뾪?'s]:?Ѕ4? ˶* ,XZt ޙe4tk˫BQw9%CLܬ#re2>LNۊiH_JQf$$ƌyr .J`k"p2iKܘh~SdҔBjI[Zu0Nc AsSٜ\Ҡ2zmw/D^6;*]T2;5.e?_?wU)xHn4K4Ru163Pί(nʣ/x8cgW_ YfW_|_9T*Mz*fe__5ӣʬУξk6$On"AdK(:#+ gy}a:/ټ7(7{!:'>GXF</Sc m dԾ~aDȹRtiY`uNΛ&R.\'U(̴h6Sn wO2/y 2edjuA{f slhta ]^.!$a7171# &#@N oF^VWMWk ~%7ʬ|'.rW)1Y/ )v%iX8}9_:}R/?$VXv%Q(Ȓȴ©FܦC[X16[75e#{ML,\uT(aӖ?WCXS4j|s՘^ƔiSoɬ̑拝 Ũ0oA(=E endstream endobj 133 0 obj <>stream h4M  ,M7m%EwQ`g h[#GВl ^n8O{UQ\U${{\GË1g& endstream endobj 134 0 obj <> endobj 135 0 obj <>stream h[[sƑ~ׯ#q0W RV'&$]sr K4HJ3 .B:D6{||vKVh}CQUWXŔG׻h ow("߻w?ߡa6EoVu/O|;BC1!:;$I(J0+DB&?t?#4D(IV1aB ]EJ!{)ԆAIl<n#%D}|q_7 1 o$! nH(hl|p1 #Ex7IH" ^KP<TqZxX2ϠbLp9c'd{L;5JFQrT&E8eOl XL&(c%J%bL Ȥ/_@Ex(e_Nev>˼l8XymQ:B&›NהU/kn1[{\?yx̜b[pKI0o+@l.[*C7=!"<-8n}?fϯp' * hZj//tB,K-!A*$(!Sp yd^u2(`A56 `m.@ %Qs):)'<|O*%lʴ[I9RXO*4^tr,tNS9srDS{*\k7r DMapS!W"ǎ~ePSfK&uN^C4&Yc;E|/b$2@cprQң;7'aWYY7cDoN;yH_*jqO*ZR7;‰)MCy4'MW{}6-4)u==iu^b銪#_mbӨ4dgzL!_5.383V$HElaʉu\t2zF'BKo}(+ SC`KMŚMAih[5Ўgg IԫV:$K 1<]Fzmtnߖ J:}V:+"orlt*:̱tff6Mf5.QD O^z%ٻ4zۃ!x`F&(M.=IDu:+z"laK&C{\ lw,K좦cVlod-b.(Ӫa1$D۬]^C,T  B (9BbAF)',n]6B:c4FGD.uB Vf5ʱqM5~X3.=' # H<\"&SG5[Z;$&zqj#!fQV_Y@fΪɡ_@miD ̄ĀӈO׻ʷr^PU/i~;&gʴ*$+N%xՊȽY݁⻂AzX t<%HzSwŵ1Lji##I]sBtmW"g(YL4U`Z{%jIY3t`V<^"3cVl>g1'l]NDt3C6v!> oA6`{:&ުzL sW-:'g1|M$A,UK_i*td'VHx!52maqpF ~oΦzP:Ax!.z.1S=r&0eEߖx CKoτu0"5O8\l0h($ z ?@ 87<+8ӝ;qĨ"Nr+U9\j.0M*uP;Gۍh~4gbAHiOA-C*=q%4ְ>s: ,Eτ,A5[<ѥNt .1-QW3CX3%]0NK#i!hxO=^AMJ!:_+&1o)>MbjYh=f|EqԈ6нN{b2OJkh$=SeKTڂ._vx;#KGoG{V{cZk.] q㮮cW:lruq ͆~䃠:-VKktՒzTAgwrz&u(]BTcc.\$%ѹ+ޤc*ZF*m\ kI]rMǯC(,>/ˆ:V8;fi%.X#(l-tOzIc?֝B9ܫ5R.IL"8fVwt{ KKf&MO7ԵOEUeUAӶ:7⦧-&Espq;&aoU6Pm[t)7: -fS6p˩Lb5x~ %ȗŇKZ_bTOk.]&,ld>Ǜ?WZbG[R類4ׅҰHh c,(vB=؝7d:d!;cYv`t Cˡlڙk}ٝCDgC,cD+.*.4IBg꫾ ]Ŵ tp}ޕ;O/] кLy+aϩ7Llm^O{;3%tڙ׭4)}^!Ӑ.!{ky{ . : ܒQJgJ^I.UE}ђ&:oG@Ɖ*;;k2|95^SE*ؚ cjYSҮ}ަ#׆0U{uAY`RY+<\gS`=ܥF~#i \Gᯨ mf/Zj2 -`߭~q˸1n?mi s HEze;j1SpȵCrOl:8~,H]ÈZ-H-6/[_^=?Ŀڡz6Jg6_XvX&_BO-hn{Sf!D͂e]wSx^}čk`N#{I]X~ Yō!ACu<AM_Ky]{oio'..%RxF3#Oԑ8h۳fg:y/vH3 ~?|n>*R벆ݑR, P}Mz:>SQr/W^NMje^aZR48%hZ"U?{ꬩpI>4'wc>A cC g[VG'~#AM2+]\l3(qqFT"xDlbM_Uv i2Fwh 2#']h24S:p"6f'tԚ'3osŽD~LЂ endstream endobj 136 0 obj <>stream h4; 0D7g%&ݚH]HaGhya aĭ|m ~;2K[mf\))]P-h4'XH*ڱ!1(-)4,{%,R;Ȝ9 endstream endobj 137 0 obj <> endobj 138 0 obj <>stream h[Oh}$Zhۨ (wE}>oψPPi+x3˼(x[/ޮ$@~(A ՟$b"c"F*cy.pp?&(bb~]ŃMD$F,f~ M`+NM"IDL=J@0%TQuK^j#G׿O"SN I#VvP2sV)B+ga ${k}zHcvxc1J7KۥC>V#@q>p4D՘&g+,zB6Nè"t|"c1EJHѲT:bc#,bX$hsȪ!J70?Z,u1de= R'z:c/Sxx̖_oBTn d˃mJHi%iϼ6NaVp$R;.*Tw0OQia\++Ғ>'靝vVԚ(Q5:$k\_Wr%宝>V40eIVcJʏbgNWMӢdjK ֲ./hxZʳE$%SY W:Ῥ)A'E>O*7d$:C]c^{ǃ2U[<|` TSVH0&Mb~俱lńGOK(QS5Id {M1<@ qJNDV>_۹N`#W>{l`9'rxt+%$v+%P/!Kqp91nDZx.oA]t$:֔/>Nytꪔ>l[%?ѹĞYHdouK9sm$d'HmYsb+@2I+O):TSK6t!7AybђmBM8 ?:-aR7T{Z"p<>jW2͡y9U l,^-+]ߣ gU }:\bw(\ /­QuO;yL;&N&a %g5Jxladߖ 96؝YhA㼪dQtMK$D_{;ST Yp[*gw8fޣ=6S;qb0ˢʷጨǼZ,kWӼy<tC3^iHD Jɧ4ޕb;Pl,pǟttjJ!/ѩc> 94fnhLQewܤS (17i5i^L㓣KTQ3 o_ wo@}^Ń;gy5.|8\9 )d.Ap8dN[v71uq2OZ(=oY(ZStn&W~1|[_Ns\i@u U/:Әȫ`%52VJ@wH^R^SΆ[DyǛsN{CŔ2_ħ}CYT9N#DmaАkEv9zrܒ{-n=xu΋7NfâޝηnZY&Q e MnMAȫGV$6~OkZ('O%d뭽)1:.$ BH4TU"Ofe^mbp5[˱xs؍>%LƮQ:7\N2oRkO]^RD=ߐN㣓b)Y-7yLnVy>Dn=} ~?80I mE[Ō;nWfm߲^jE_y !zK ک@>stream h4 0De k K[J[A$҈݃ $y`# Ӥnpl{*s> endobj 141 0 obj <>stream h[[6v~_G25V*xNYwʕ[bHHu=8^CMz8|VLJdV(  ?#!_4 "8}^dH(0HJ)99}p8Tnʋ)DA^#3M|eE]g;>1ކ l+a:CLCH4 oL o5HZOFlj06Io_;)G rv@>YwHZ0d^ ,Ah&L&\q@KZ)׼{>j!hg>򨷴. ^QmBFFjd±CFcᄹh C4VWft[ĝąJܹ8eζcy HnUO;,F}I}`^"pt5ʡƖDB Z04JVkPYViN#b:_td@~Qʎ㻱<ͺwae/>:~ xר?Kz"|{  NPvzry^Ry4Z싷9WuyhnyH=B)JR)7_ |d7Ǒ[d2qN[Qm[O$q2y#YHؑQ^BMvӱ4am!7qچtgT4c a7w] E K˙{^!:*vA1+]@$cbɐ,cYh/jG|@-.j-p,ZNJ(VB'XS;袴?Upl,#L˟}^efBz(H= b#TPjZ%LT)8ݪҳ*u'&]L9Q*/ALb^%%v4[VE<<]{!idj#!qWrM"?^1a]JW Ǫ$]U}H5WXDK{ 8Bf CUVuvށy1=EV: Tu*|Dw ^q6䛗E:O=?I2$;{'&;70p%j&6;ؔ0U gyv_L8jM -=gr6<#tѱk^S_0{?쓉cugՐ/lMA|RIT`!vE( w 6\DzW:ey_@E$=r6HELw5FYcA"MYZe8NϥqW >X2tGXΠ\F|WLL1Yn_'TϢs b=S\#+d7S.&=k ]r4!Oey*eK`G^!.; iP;E4AEe0ZgS_3DagtrALmP=:)ȳyjg27H[!ٷpg@(!zr^KDijpYW䬻>NUNDlJ/(u`C{ZL$\yZ ʴӜV\.y Io/iˏ곦qjiƪƼȘ"- n\H[䜲g ┋?<PaK!wD&D#S8~x\HoO=;n -m0=dSN%dem% nkgyP@7l5| < h"k7w^&ذ!@P^%ZP TNCThYDN`o1tW $1?ҙTLCW@>9<ɍh>eJl@ޫU'*ECpI]TٻZQE\@Sd[=F `8 ܑnK }SH6sb"nϿZb`jar Xn$ e!7u L yz60؇Dh-1 $EEy (ِ:}P/iI s]uDnXUAVscOrvd$1b |*V%>nѶBp dz ^[xOD-hԖ&Cf!^Ze3駏]kR`znشtֶ敁Yu,:^?jkW4I(݁Cb+hSA;Yzqm)y^iS~ $CS%i)KFS4/{i=67OѹĖ e^7. |>ru ᤜb2ȅMhm{ҭtf> VVMZ|>`#\TNl15y@&E҃OG\Y#Y88(,$Q^c4\s?faM͢]n-| un6"o7pbkg7Q8Wplh14 `; [-Aj:W*z$ݻG6vɞ)I6{ 8@{vSZoSAbn|e=P)M޲3;t^ZY P]Pu|#,ѾA!_ =9VFTDneibnٚR4Q. C=y]4`|i̕4ΕްZT U2b(^?*ߛ؇vCo+|OGi%dUTr)#z/%wR 64?iԳu5/l`E]ilyx2S&ߒᥱ ra,FeW~<"}h  բ@$oNչ9> qrpmq?"Ŝ͐/f x󄠶 IԀs~!tYjU_ohiHҕ^,|a><7pګh}bAh@U9 kFѠ݀9ivF4KޡqDa ^*R$a='/d N_*mۈ LϮ.){mh%N'_#P*[܎Q$܀Ŵ9~v|#ʯ#QDާo}VL+}S;D\$'}EɻyMbKʽ/K泺@&6:tu}Ns 4l6SlV]@#[zc15|b=SGG<3=Éepb'5 1m HaZȃn+ŗ|)Aȸ9ԏ@!+Ka`[@[DCCI-rMUa'/DNj1ԘZ&Mv k 9EI@EKDm1O8b5%9Opv4;{ةm0br yR@{-MMFώ9mƆ6v4lgD+)ֈq=e:̴N\n-P1މ)rΌa"TA$r, %-]kL]x^!H3D 񒝈Ng罂S%yϧrUOL5 F65^ 8ֶް.2E1 $v2u J6(А c7h*wrjvІ{5{"a"3f\ [xjYlt Ty trj#V2čǼ12ZV &ljVNFil.bB[p5NS^wpĮﵐ'o笉?q&h-=zV %Qqb5<-{?#[! kIXZvӚ a1=AJ֬8YR/ A P岻>`|SN:^5Kmb {1OJ~^Lq3ˑ.ڗ1%--!=I@*MbbraR?3W2FHUP\ȉpGNj(L!#W=bq<ظq h겡vQE6SPwm* w%<3 G0Y ^8@X݃rH( '/[P^&Xi Uш>&=2!䦎oXbl]& " _(9]j204+6vbِ}.2n1`L7#1L [zA ;}'w t?]QP/@0]R+IZ8eep!HRXP1K!$ ?Qrc,!OU?`4bjDos.".(qj n eNa4>ӟ(>{_g^)F7?=>+*_ endstream endobj 142 0 obj <>stream h4; 07q' ib҉H:1[x|77,k4hn{m򔀺2#FK2ZɥJe'T(Hs:fMwحEL i5`) endstream endobj 143 0 obj <> endobj 144 0 obj <>stream h[Yv~_G %B KVn%ē<`H bP44dwvYK3_F{B;i _U‚0YŔ, ;w_% C/s;*VqW«5ORqo/զ^$ X-%zS1qNb ^%4H"?t:?#4@(MW1AJwA"QQkQB'D1e^oDD|c/c*>RVnU(`tY&:\@i*% )P@(Uz4 ܃rM}eS}og5WFD|Whq"?X|eMW>( %k.}KI8᩽_z^ٮ{I/qʼn e*?Us(|*V,p<ow8z:N%qQ&{;bn+$RvM zG1|АVDa53ΛzTw%% *r ]4Fwp)g&NEtHۜo3fv-:(IhDF1H|?h8pxSsl̅\h _YM-PlJH` r]„4GtĜuRH<$XF ؅RC5cP⁒0OӫJ)9mG84uD8tY{dO;HIyϓk8ʘI"hEhh̅Vx ۩`K]X:#`')0wӫ&l%~0Rw(DxkHc6N嫑Y6Mm"# ]Ewk͡,V7M[l5}hNI^0u8?!N=sĖ);hfWj&dfк]qq6A Fx<0M$X1& C-(E%VPZ$Bq@j#QD8x, |X_QȈ,`A6[T3q'QSxZTz"UjDaTJtHrxd!Ϗ Xe߬Vqx;S ֩yJ$vҩ,p:Vm i 򋥉ƥ]  i,nDY՚QbMg\`y8ke;Mǩ 2ʓ;_ޫMWcr >sJw (G^}`, weJYR^ZI*{Kp/ %)X 1E@S!S#| mZ΄/>ԕO՘y$4(܁4RIy:7-;@*=`8vY[*,i06OcP* Q|tOS9SfMndغs5Ci-"anƲQ=SGRQr].ݏips1k?FnVCk49M^ A,l_t{>W{?j~5:L߽7yT0I{* 4v-z<؉ZYT= "Max=yv?ޝwìҍt1®'mL'4EO"}Pq&!*,.?ȢiwRUW@ѝn[m81@͚g&9CDMVNͦ RI/̱|,qETrl:ײ33EC9r QˢCpaҵBA ~MVUkiYP8 qvdV$\F(ue;9ծɛx-jZPE[@6m\y N~rT<񵎕E ˲ )2#'^Ssyzˆo3UܶUt!dQЦ u85r#͋@=QmGHԻ5>F v=^гM{MRqf"nwy*l3}O5/b-arnz\qCRW,rK3f-fW0~4D 3F M%-f5\{:AWu3E)[e!Zm>K )4HO>ǠMhBؠN/{۪*t9O|43Ŏ& )6y%!M/:XOc~P̻B2M㩪㧣 񖱇7{JCtvE:ѐG V+j'QMȼU%bնsc/.p1ofʠHb_hТw)~B-'k4J2P]"b} bb]<("0c^pk ;M&/€rs8Mٰ}>Gi:5/1CVԒN>4]C=Յ9k 3/>~hi?L4%R:u1H;r}kA!v7g˱EsmnZXTeU5ӷ-ܭEeWM^,mԜ*FLjhR('|拔ݒ^[Y汽 8VAm(PPoU+[tZV1CQڌ޼Fgcb_Hh:lOp>om*̃/۷> .#/ܫg*%~PZvLe喕>?ŏyFwb1-oe׶}(n{Jw.md[7{'AW[MSo7墶 e.Ե0S~IGr]u(wZ~hVecXBjKCZ>sΌ %7{帗GOJf5N;@Gĉ9>~ {cJ,M[h],G7ZQIO5e;yTW] "FBZhLݖ[66mq :A%dX#f!Ztv:Z9UG#XQ5~jSIBX8SZe[0 Bm_D$%B,B Z.NeH˳q'?"!)B\,Re<}_[v-LR)uML P6 'Mނր'nuPBP[󭐅GYQnvm Zlp%ɯ%$1D7]DUyGX^D&:LTuB oF#;ͦcdjix5Zq3uι~|Pdpn+]sPs*X&VCabM; Q>_|7kqW'*/g˩τا[^k$18 Q4AB5ZkafG0܎p$dF@{ pt1OLD%~Ag#r#cFyΟN!k,=P?pELR3RB\X|ptH͚Lk4Bnus#bNSu<Թ~C&iosm 'ڢP *mIZS/'̅%8yYB6s)bgnt xc/W <@d\|Ƃ9䴴?ea/tyӧ(ےt,:n']N xO6Kc {f2昬lAoEeJVgن%vEG}xxxӫ<:\T]w(ŚN:c8W=9s\֐ڶ>b8(;IL"cV9Z;L@x:̋gjTVgBNi3orQ vB=}of"Z_|tܪP9)1BVsr}z$˶43oϖj}F]>qf˩vnX.|Xᐜ ƩT, L,~0~Qu+(G@k)7^2U/ E*9޼1}O U%)uvlW%gZbfZtqnfhJ?`na|se]2Z̢){%F}_ꒆ܊m_6tA.7tB#x#Wk{#jp! Uq3O57&G=~˿R]^UTytܯط-_|# q-Y$*94ҴcI/mDmbBk\$as$܃fJȚ_\W ,bvMŗVה/Op[`.8y֭eLehZnu\ Xww^8Ѝ ,6틷E14oP-@t9Օl[6o"ԀgV0BO6`f Q/mĘ~\&ci>fLdNGÎ.ouV :%ݦo'Ț=Y.܅1fo;&ӧmB3u[oSfK)sm|/J~d. j$ oV(,ß*(Aum~I %5Hc2a]#.(lf6F;1za,ht\@`|ihx:DN{!NM](A^Q0{S, OvMF Nvn׼">stream h4; 07q' ib҉H:1[x|77,2hц#v)ue6F/6eKN9Q5 cAe?+*q (ub?[OA8j'/) endstream endobj 146 0 obj <> endobj 147 0 obj <>stream h޼[[۸~УNm--Ex4\}IQWRH{I&3~;Ի z~#_60RDm$"&^՟Aec$l>7o`G\Al|$xwkD} N Q}(71 ' $ TeV2?@(e)Co@@UC L`޻9bK~ʊjJ0ByaoA 1?Tq#)-2 dYkr%JB*RhwY]TX ׈{"0@q㬼1P/m||V"1N I1Bz9_[E瓄%^kK4hL>*umqv]2|0C4z2' k[a ; Hs $TXxl2xU #+{HKàH1A$Μ "ȺTSI@0!t"@N;q.Ldal c5%)H1_re$V88O-*N-gљv:}UӇt$dU//uv>ʒ!v7q9;\3 ҿR^P3J+nyy:gU[i;Dv$tBbZD3eF?Yi>ZfVֹ+`4wOq!bUJD! *^VۊX9!*}vJR%<)F:=fKP";Îq5iq=9& fԧ`3SP֊Ulx W$.jx0ׂ?<,Qb1h OyD>0:Tg[Tx1ƛ+mJiHU(xRF*Q" 8[s] jbV px3;lȭ`U {N2{ϰqn )"7C3B^\gyt ))0jJy(d&7票ҋ3c+vJ'l0˙@)·Ygg9(ՐabkԽJ씞KP)1l"3QK`NԶ91#0u8 ,~nofq{3HSx|-W]f홇T_`'9,-<Ƨ%"ac.?BU؆)u`B :[Qi3y@O [jz԰M6wF|-1 K{\uHY.у |K̬zc$}!ť@%aڭPVCT6`N뙽éc&܏-3s)Z!=0sn]Ӵf˛DBdv[TM U:g_) ۱,WSP*nm|mޮn"̈́P1C,߈%LC4:g@yK3&ӢJ>1=F&Sk/zLJ{tc160Q<$SB,BdPÏ mU V(3kr0/Go03> {L( ovi_kuJ %/ս>stream h24S0Pw/ .HLNq2Avv%%% `C9T-?(b`b` Mls( ȶ- alK f|@Q~rpjI~~HjEI@P& endstream endobj 149 0 obj <> endobj 150 0 obj <>stream hޜZYs6~ׯǴӇ:iNXmyPVǖZQ_D2 \Ƿ 8~>}=[.9hQAOFbbKE`ӌ{ZݷOo!߳ٿ3kː ]l cLxSg7BaN`C,4C J ׻dYņ!#Ur,o~oSj-Ғa+=ÄP@̅XԵD .ϮV1{';U֌rpF̘+@UoBb1߭ vq|+$'@k!M=FVDͤ/*x>Dwc*L5D;en}wySܙѯO1",>yHrM̰9aF?JYLOUDV!! C[`SiUę#ŵr(\>2<A[m.2aulCUP!Ty=5iؘR|4eQ;SmNKʔKbY(ka@C-V`EaSbJOA9S \4Xzj_?忿9>; nV]spjnw鐡7{3*3f;=)3gdU JJXzjI* KR|RA"\|+p-3#+ŷc|'ؗ/zǯF~D1B!gY{A^lDmܾޚi1H"\ssQ{Qu y'vao]ii^<7P8W?hC;qD *O) );`[zOnt1l% zC7a$DDQ#rSy:n"+jy9yԘ)ɨJtf C ^N\Kzzp|*^ak:`pA{HNyxGYyaP6>@]Pa'Nv8sü ܁<b>nwqz!о3ƊQJnLܒ8לܟQ:i\v!\AÍrT _4TH`~Y>Q^orG1 _ׁB_b?W3S )@%`lF&%1r)'h>%;LO0[lG.l{Tr@yq[,VEnQ01 %p7!s [S~K7ˆ;5'#絧9''rJ]fuvx%☵ф&c l~|V^覭sgqG^Ĵ|4qi17N83ߟ; s|}sOX΅eiBjO/0|{h(/P>cޅAO/Ys` endstream endobj 151 0 obj <>stream h4M  ,M7m%EwQ`g h[#GВl ^n8O{UQ\U${{\GË1& endstream endobj 152 0 obj <> endobj 153 0 obj <>stream hZ[o~ׯ#XΝ3h` -i72ER+J5_36I|~O$zW-H_0uߔ@XE HH WV8zx^}1fn[}]{E<'Fhca_7:B BG QQ+A$))C#BA^! 7 b.֠!)Aܻ\yLԤC 7>wKcdcu؝/#9)N@?wO'W^6eMY'&pQ`Ɓx0b )dփ}*!QEĻZr4G׈K!.(B_b .knц"F6G}ҪJuCY)iUTA`S3TYfY@9WāCy$I08XnHDݓ<x 5_h\v"aj5KGRgٴwzb'tg)70YlU!dEb8"wٚkY>%%C [E]9Dlh boYz H1HώQĩs N؉kj .}7AV>ώayisLƔjPiD'SK_u> %lJlPhX)+d2BAVPKh{hrx4*#c CL_Po8DzvdgmOxa`<}>Aq  ,yʊ%5Ye4-&}Ù if }>+j6m,@X[WSyJ,C]d%@Z9a)R駊66AE_d9ѳ#T #Ç H2i ;4ӓ A/=8/tDp&\#qN]5˞r0d X}S:[NA3#0*)n >#\"]QWAbl^NTQU_M} oM&ؐaMQ9G>}7cv\!Ga.E:?<Pan7tfP28NwE1kƘ>uP&4CҐhg\6 5̀~r9ͮScf}s ݺñv} *XM"C9x5h~y#x׷-{.}sytwmE&wLz>72Ϡ,ԵE&,@#LɢvUmnݷ^ 2-lz+?ٱ 'E]o: A#|dIY1ס`.a]Ok$04a:,`=esp,f\F ﰷ)& 2Dx"^q*w "䲱+H"^vtE 3c'נˆcza͝1 69lTB) Zt{֘hƈ% j N?m=I͜c3ȅB4&WO4+Co]0veDU(~-ki"<*2AB6f ̒`T,lSU|m(·ܕ/f_g8F,t nu r>:,n$'ud7~Ot)b L̜W'(o:~ 躓k̀/$Lo]qξ4js[~-T U6jߘaUxQl)o[^ZN!--x\`78Ћ *L^p`-x^0xe3)6fF+F/&o;pQѹmD+#^Y5.0]✘\"6ﮈȘՇUW`1l endstream endobj 154 0 obj <>stream Adobed     $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;Q"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?R!#*샓PmI$%(bTҵ2I64)I% R$4N$+_g`esu=yμ4c`&Iog*=3kW`N/5xk`t,o $wA|Z5dx5VKzoNuD4pӈ]wBu8z~j$8襎HDBr&%- I%- JILM *bDВQ|g&!#J0fjAɒJrR_IIZ(IKtI%):I5srN"@RgRaMhC׫ƥֽ9LG'9W;Ӫuc#%tZH$|־u &}9kgI?qlk< `$fZt}*ﯽ%u ai@ni4z'IfW9.!ucӆ@'iI& vcj"{\VɹR 0?%{N4A,w}ϵA.$ǎf5$K5lG8xw5_Ah&@?JC[P{T׻RZO&y>(G,Zd_YX]BS#ӨZ伪-pЃЍGqmtYLْә_0ϩ"Tc>vӺG4pk-p宎 Gܞ&)$0)A&S $TG)*JFBb?܉ IHQ-EYLZ/ʒU$ T`JRp:JRt;no>d;5WH3ɚ8ƻ]JG4PKA,O,M6ܩh5%<~gEJ|4<-zYf; Ұu|V챭:is;YXq]2ˆ:nZwYk^dd>:/xM*cAf$/=S0 AЎLkY4R5:>ξ<%pX2' x?)'w zXIT9M,C¹׷b71 )dJcPh<$0I%0Sh4Ng(KPXR 'IJ$R$*x!}4u$%Tmds/˱۞J,GS2C:^DRݠ` c=2~E7YTsܲ=vMTku'.uAvJ4SV~YCq:%ḫ=<— tŖFC2I=3H>|Gm@ O) c:v xDD @>ӫlyxYl "D>>z|U\Ws_\ly$7ÃL"'J: "I&Cx${\=K[p1AFCF5Iw$ȈXO)Z+yvc4oln$۝{hRѫy@üuGZ=2oO`4$Gs[=#6ޟ6;d | c ޏxrXZlzdgFqdخt$+psyBz#4J0AR!/JbE8=Gފ$!@ _*jO.?"dt9NB@H$NCSN?*J_$@ΣuV9`BDdMKjIG)d8H~]e_Nmgjā?[F${rU<k ݳ> \b:wU3C'V >P\l+G/\5x8E==v>']Xs$o㠕b"%?24OC$AE6vΝ̈p"c}ځԦN dOV(|D#BdZ`'Obili%#CG Ecw$\Hzl8$"%&>׸AȂ~)Ja~ulr5P0 }0 HW/ s3H#ud[#љIn з褆AZ=D?m & [8Bjct?wv)TPR':V0!JQELaF$)$)JmE8M}>I)q~)G$>i)f}8֘X"L>Ti<0 ^^I:n`@PԲe5d;}N;e=L'ϕ=@*ugqʽ4΄+X>JuH SzS HqU^ZI@fg3䳝atF%_=X2Hl$?$j ;yN4#(M#[ 2uNBD2gsO?($%[ͺ :'7ϸh CD>ʘ0DvS:Ɖ\ u0mn+ZHhpoXU;Z}?#2v;uƒ,(\x쇠wG˓u@ZуKs-iU}7g*A{cuGO|BYWCDAZrqXK2q[:mP8[5dHu?"9Rr3/e3!AK;z7ֲj$|U|Ե'p:z{-(STX*pAƾ F%1)&!%1Rh"o l]:I)-d|R(U_'6A >P$eMʘ_c9$?_Kj$O^~Ljب7mݚ%3?MU7d*^i`"x7$5Y\PpK뵠 1{\dǏO܍$k@|usL@ Fבۈ<[sw8 ߼9 -f x: <p >2Xä;RC.hh2Fv7c;.<| GtGU'Fa v*{Iy>@ GpH`Z+-?gO ?ҟH[wDIG 'O\_k,]_L7ss|SܸNr}ޖD\9ď!u?c{+bhIR!h]o,Ge$'|(TU(T+a$I=j8MS'+1<I>w+7]v;Xt x)6sR&suvTM8>!еĬ=8e 644F=v\ҙ"Zos#VTn th22K%`ulI47PI0<V^c?|'DCy FU}Rsuj#F0"#]Ǘ>aE$iTFHcN8lO-&CshGAgtׇk{ssYFFاqִ}3TsMYQUtܺ9n$,1@RהЊ BxM撘8LBJc 'IRSuA1*ʙv"iLNr:Ss>j>%Cu"$ͺ(y)5䨒I kL|;BųB G!f\\aŀ Vk\$w2k1>*~X"WptgNЃJ: +iy$/1K]&#}gV/&"&yRg(oe<ƖrӢG G}vՉAN`k'dӕT~ uJ9`K{@lN+ak'[!|ETdݰy\'D% r͊&rz].W2A>Zpj~.k Oh v*7CFuPtq|ڭSlkGYTu[᧚ 6gϴj5DwvЎwYXd8$@1е+r?`El Y_sЀt~ ܾZ1INBqcB8 OCuL|(9pC$vwv:/^-#~xY8?Tb='V>?z[fUbi0g'.)@OIXaY1?LPGy~PZ9wBOd)WP C:iC++n~P]]dI|e!e]h&_ikI:9i& ӵuqԒ5;6S9o4#Cp P4J9kntEվͳ2`qy4 \ 8vUwr:˚cPtZ7V7{eUҒ+q2iy1 sD)lwc`I"$v1;k\ ))eg GWa?7{aJ63Ӵ<rfBxM3`&Ө+,~*| *UYgIJ7vGN$5@5N~Y qPIӝ5@b7`׿LȞ91$,{hR{$kv{)EX[\|;YI ϴ>| A <xgTz;!]WӉ[ʛiD-l#!Z/"efAS_X`,=)V,aV&$,4H e ԓG9j$HBrSaRVFva:8*oVrqg:OfIq:'>kXufgR|i `,ߤv|;-7P;*%f6qƣ}S3[QSrϹBc!1v^$5xYYvO$+=LεGt;$?>汧qůk?x_ߥm ̉ h44)?j:|i'Eê](}8&{7su6UN $88 O*UVƍ25l'˺xxJQx_I3i-CdQQ:<ova05lv %]45ZUO!F25xRL8V$wE ? 9WFn3:k:\-vDq#kH+U;M9< Œuh?8 `NxD{:kfO0DΟ$@A|O$Eki,|d9YZ,f@ -_W ywӟQ;aXdx,Mz/k\}C}E̾c OJ:8h|qWz<|!*EJ4߂Zk- ]tP%:;[.1~zlhR]\@٣̮{e֏^әK+GS=lӻdG[';RW2 C@f*,l<1:FKh%kHNi!?lY|}U˝-Wqvcyz3zk/a5č4+)cҿ gaY5)Mlgcbk#H'AV>-,sA]Ó>.VHJ$R ;-~P!$Aȿүw.:5,ijil}2JK^ƲY|a] q[sA'3*+-% . 6`I=>#US֘;n?#CߋwxK~ǟTAtL0H<Ƽz-28'Cʛf i'E(m#R~Fw)gx0Lr;Y=Qap hsB|İw4>EVcf]DהP˵58-f6C\ AyjÀ"l88wխFΘ>k{|ƫՇYv.w !R!B|F^⤎%YqstY,ys[SGFO S*F$U7'^d ? |Sln<ɀkkXgVl1ԗFZrH `j)N瀪'I?˜\x>/ h{!a 8~OdAqAn3 @:+?$h6X@IV둧s6"\D/RZ*~h<6ۧ3 6?NDZǔEvp[*/n&xDVsL:T2-Я DIΓ|T3XD~m^{OUrp蟸+~k|̱y:?p;H%FײrW}Z"ps4q[`tUs~ XlHs,,|IkG 66|X[ s ehs~X|'+kZ~q4~g2l@Pl@a>ٸ5qk܁ ;&F^ɆAN6M'8άiVyF;<[eDi<|U LB94v["ڪaxB9uʡNg_$ZnxiygF2fց4xhF5$s]8tOOUa1 h.2d>n[4i#,K21ź"WRqf A8GrUem^L ::0,cO\[[d@{TL!}[ #|WJXVwx@*\1$4T Yˣ 9<|ԃ^1LRMBalƾCPǎUFAj$a(Mű#Fik8{-p3acO,ӱ(9Dm=--Ƴqt!r}5Π܅uΙ+O-+=Y?A#^$ͲIHxpwNyv0DGq AL܉#[ y֑;w~#v m5>O x->`ak'c7vʳ^]m@o)xK1@t %a`eyxP/1s@7 jzwR{>$I19|1^ e"JTZz i 5|\CA۴Di$lrI'Bmb[c$IΉc Eݒƶ]<r9 u"kd&Z7)Ee { tjZ Z`" hۢ\3B{-giT o{_q iT`H٫zϪ7`>R?ݹy^q^365H O˝)M!T0*sT~RGv l԰]%*Fõd;uZd{a|ym<41bvs{v4~$rűAg:f!uq\I>J6ڍGܡEu8VFkn&a@;@8r xl@ rCvNQMe<!I#A5$ϗ qLHHR)\'p[CO ɯђ#?cd8*9X_a\8RQ :ʪ{}Fԯ5aZŹ4h^^u 2Zo Iƾ*l8 L\WZ||4G @Zw4BHh;&u4ŘKKt'B{J}A:OM;=cRo7ő$.81x8]Fҗ>@+"|teK;V͜YNrK͍(s:wԃɏW{'Y0Jsf^NrŠרZ$(:wm:l=8Sg'@XI#6qiI;r,>0v8&2ПjYKd\uCЫ{\O^CϼVߟrS-% O,`ಖ8nc-4Xߤ|q<6)FT9no^ ynըhӹ7Y %'IRY}`hm Fو UA&LH5.Ly,b S%!̚Ԁ^G  xåydƫd밑AԘ4- K{cR)-OޖڤG%wE >eTv+Vk?d7KF:{+~ ?wW Gܪj>rfùvѱ[Px:x*YMnwDZ|~\1ڝucw"c>ErXk#O%}k? q#hW76ݮ j9M>&tk]H>lqh:Ƈ9c 1ߢ"xt'B9 %knI[fcw?3ʍ÷VضҐs̐5' b#©䍣OEgd.9讗)Ys'@bWcb5 &=8匘M5e7GGsUk泺ޞ;as;8Co5s~d 2|gW WAU-pf8qލ:+AmCOtRno6 R_t8Gڙ`Bo ҥ$5|ȔW# S^ޛݷT8uV/Pdg>hgsy&xR_괁? zNdnַ /̌Hpl颟& .tvˁZ<ZǐNWmoqi?roa;f@1f16 "5Z] ~pKZ@,Y??e*1oʦ=@IDgO%}ZV[ yv1EVd:$Kdِe[f=י,2Z'^S蜸a(}e7E?+Η;em.WIܫ80^gM<}8ҺK^dy(d.|R99lwyѣW[Ӿմ l<|ռ qk+hkG+[Dsg<[X|Rbt+hmu4W%e 'B *C@q?iDOuLDL˅S;`|>'~qėih<>龞߲GܬCˋ-4k0bu\ƻW5k`nu?+g_ǻ71l25y|֎$Dz9#8y,ti68@ w|k]f\@L:>Y687Lq.L#vKLCӳ*4:6^vit8;tΤ gh f#ptݫ-s eknד=ht܆6HG:] iO$Qi \Hbjys\&t|f}\O:7wc fƃ+ti;xP([Z{}V2:/ .8sZ݃@8HF5{h::*V` A&$hT Ö$]d!p2t~u *9S,&FJp`vq:k1aA}Fpg?ަ"Fݎn?fnƜ'܄ֹ5trᕉq]WE]TˏYsGuTbK_}_6fQ4]&HĤN=:c}kSYyy:;3 6gNGC֡qmqUODz;*|{&H 6Kf_avG:@\]cahzՕCV^gm[|' >j@~f\y*Z., r9u5,Hǂ{]UmЂ7;gΒT4٘wgfHs5hyХpuaplT-ys>_vMyhNaX.s 6D:4n܈ 7 ' !m2[Ohxv\-;"#Yhq ahVFʥjo0e mh$w(fѐ$rg]|RV֩)%k?tO\Fc*uTuQZ\0Hˡj2:k(e7uSt~Z~17sx"feVIKU2u'X7o*x$b$+8E;PoBm F@A DZj?~6ZHG:uӖ9FgInp~>(zL tqyY}uєG.w XrIzISw짉gs<`(Qiab#ٓ 45X;N7WsNZ!?6'[x:)eY՝MB_kOuxxT7cWt ?˟X8nE4Ul|wh;'ׁ(v<2ИT4#챮o]+5R's'B-ߠIv?±6Z >fg`5e]OKZXg'̐:߳uzL Ρ r1^X Q lYC9Q_[W vXeUaߜO[M:y¥3b.- vDsJJk h`V쬂=j1Ԯ;šx1'x'-+t#axcIEn:B?ޢ,x$(=9_ft k[3XΠX7;_闹eO;.G0 өl~*NK'XHA4P@$[-qI58(My?VK:CfZV.?af5݌ka,Ь{V Ѝg6Yc+^ִɍޒY޸?[O@]u l4ȹbl1c%tX6 D⦌˾LcI%-]=p$`DkupPw5\'4QG˅DoVSP$w' X恷^ :t >%j17'Z`xXy,h]U{i!dTӸ(TH I&Q[JMti\!F-0F6CЍpVi>*!<2LyO{xU8aD{}ܡ:btʡet!l䦌Pu& OEέH: dGtfÜx'!jl#OEUiUᓸi<0+!5ee&D:u;K[%M YZ`n%c<,DfI;=NXW)uOU.{.h$'Y6ۚE8TٮZ=uNiq ╹}X {bu#I4 kN21=Koq~%[H+1'*3n /Dp>E2~1ބ-Sl7Q[~UGںѬ2~ńOerv9|w٥ +5OlkZG\4:B/) ѽ+~(-R*!/?XXT4{m>ht@o;W̔r{PՎR26X5cˤ1kyCȅg5-{~$wb=+v 1NJ.nKDfLxwk ]= 7v%ݦXx?f,eǷAr-i,zmgO+N%jc{\v>㤕F׊t Iil,̜w>}5u;l*6I- ܓ#^;m  G#B#f?]: 3K>O)q]-&|TsiYO.NjuXAFo6Aj2ϗd+ gU&<5= :`N%tFLKI$x Š|68::CVz8n ,lx NrƋ0?vAk8*2 j SG:iS*i./;#;"Y-m&gS]egʑ( ۼAnA;`ô׼YEZAd&,{@ hO UBUκú}Þז NPԎБM;O-IֺNCHxm-fⰾ|Kv&?]оk8jx3 &p9LDYk0xkAvW1ŷdn~Ƴ3Վ-8 zn; @" #}<[xt qmLHcCA0xH3hgwZ?,|jԩqNJ6[*Xpŵ>c(uXXGúٱݡ$k♚:Zh'O|;Kz=c9hNLJbMۚ L_I6a+Nؘ!'Ï[9[ߧܙk`<<>sVk+V/$I>wGBǂ{'Jڲݭ* r # )lZ[,HЈ<LAS?˷KL5ou1"HK t ]@?*e?aٸ9wUlөӕ5RԔiq:GL6i$ DʼؼYWgn%@ LB꺖Yt<;3r:eAu'W4v ?I[d7kS:r sc~] 'r/.=ћ|Oz=~2+ypAFQAYm̹ U5 9~*:!i<D4A wx{d yU%Ԯ7|cM=V*J3^x~D >E 'gu<+50|q L[ f[;Y>AxG25V+ԮWZ%tѪM):Dcu'v7Y`yMqv$pUL\`1уWioߪXDFLPKTD}c'!TW7?rALp| tN+W<z{uxrUέƟpy-f'O!C@$7S]kۡoZ[ xC7{mn#hl ^_P`s%g\Nݮgm;,nUA$O& ͚$V2I3@rsC}@IF:!uFLۃ2D&yh_V#MH60L|պ:29 <#hA@%t 33?Ku$i*u'XJƤs@\ \[ybtz۽LHYR.fuMl:qrOW5Kư9!.g^w;:Ϊ-p\A-\ĩ{'Ve/b4_$A4/wI$v<LHO54Ulq Uе{dX@Ej0ٳf@O\lZ;@ I\vEκ\g;Co5%BW;Oz?FuhS.! tna#O( d:֔&#Ǥ{n#R56[{h~*1߫ݩʹ⢢JrTJr\?O9j%wZ'qRَ{{e6l?ͿQ 0&ADF)5t8H ӯld{yfn4=sUK`U\؆eç#PhmX\GMӸS>x5he鹦AN3>OJ/=L vOn3؀Oܝ #t!P8=Y;Gj_P:7"25O'" y):X:&4Sh't;<`kEѨdˏ:4iW[.n !Fۚ#Yi !9<*n1\G{ѧO?`nk+Fjkxd8.;VNGޫ冾)$H[{ 9m-fNeM;,otG~B-6'Qت8FG L?I#qԍo@$p|3:GQݿSju<#p_*Ѩ<lg̦:wCh?oqޅX\㫤ΥaS~Ldц5Ɗ,=X9Yx;s Gn;>c`?ޅ(c}[hԓ EyhF'~e+4/<~qHPQ$HR$wI$>|S"K5N8BiJ~[Vu,&]QsFyTCZ-C^wVx?ޛ(ߚ׎=>[n?[}%y/H5V_Qב 00kÖLkЭV>Ac>atb+!>k}SU=+: eaV$}M{ƧI1~sTZ6#=5k>H% w˼+oN$q>jx!Iћ:uXk7tSv3_(DQB)nZ҉ |Ȁ{pӔ$&,B#nsHŠxc-OzFd(Ɏ4\}AЉêG柽U+.̣,W}1Heϒ]l:1y_.7g{_+}{!S]ֿԳW;A]*x]oO,p52툞zd/ovLJ@lzu7e_q#ĞlCvj`<:aIvjy!Yhc`-deDz(_G+'1 9tF~ׇLKg>Izrw!?5jABuչr=6plZᦿMά5-eΣ61*)7q@$s̬zF~*V:[kyamֺ6{w7{qXn7Vf ~9Fkuf2ZpkCY\Iw'O"WGNHxu ʿG$OPu;۩+n2<@{ɑpL 6W[۠Oo 'Lk'ʐK]:q-#r{eXh+idZgȩ55Xsǻ}ϟk:U=K:CAMJm80$@`|7Aw w>eit==]'> ;eK.<@ _xUa0 kbWP %G "(1vRO)Q%D1("dƮz6O?ڸ70DzQKiNZͮ2 Ç-l^J;&cX#&(]c2ƙl?5ec`' yY[ __|TG\$C&Ja4LTDVV! N$2oR$vU|!56g*ODFZ&П[t[x?/Y.||d{G2pA㧒Q;+F{ ډ]c:'NxQ{J=C\4?,huB''L "I6T BNY󢪒;21u䭶usࣳ9J>^_7$L)}3*W QG8ЌU{z3㏗crr_. ]J84Dr_Qb[ǝIn+`5uӎ>VX%CG+[ܗX6yVq`Te"M/%nTVhU15?/seb@R2Er@)?$ %H,boܮ=ۯY$&S-Q#RSO~)%vLwiNX[`$U~Ӈ.GE8Sͭ as_p-p]*2,olf_&w|rJ:PZCb-9k AV2ShߋfVUa8ap[1PxObL@]5Pq1Y̫Kk29i{Ο 3CG(!>4P'E:2'7HD l:; hZ`4VakKIYmȑɍO)v 3dmgGiE;6c_oNj?)-<=aS|KmGH:"FE/p'H^ZBi&-^ifx.[8Vj`ۣDs4.\ƗgՋ >+vpOZ;X; Ʉ[!ǣT8GV\eN@ULj<%]`:15hӟ?3eAH<|QS"~{SfbRRXmJA\gP"r:_ T4 "yB^&gk{(om<}/[$1qeh>4>{ƴpb(CN@7 g]do3*7Dk4. 'D,pqGHw>U?3;~+FhG*vY Fƪa$!썉*CW.'pz>miu.<bl!O 5O A慳vxw(\V#tyng&,iux= 'A3O+]{xޭQwY?ztqu:2%u]`41kq$wJ mSz(?S0FSL&O*3?{?ڸ{I?m\[?ޥv?/g4|'5(Ѣ [th q^K-~ƅy7=kpw+Nf#3h'Fa*xP#O~KsCDxB.Ű8viQO>Tm1昸'V -ν$s:kU6 FatP!ϊs#nơ ЧHU=f@l&{j-wVO- '4(MUD>0&a\ʾ+sG'լ :BxN:[0-|\x]n/:=+JSjqwf}e4Y| &?nP5E4Ou$`J,>}{ص+M9pH*`mS ))j?JQ<)IMHM@{J[ܢGގ <)؈oޒ8([i EnB,h#hlRR[Al->̌`x?4ོdE&u69䑢WD F| ) ݡJjwg? J'}^滵'}]5-8ҧ#ÑK?ے h;̖XrI7_K|6Q:HAg?-QOlVy{Sn=̟QwIk>.W*J* }X GU@o~$ 'Ǐhf5*EUCZ`5'AD3*a@~H'!&~rQ)"S☒Rror; T~Rg1vApr T { Q $"ƲS(!&Q{((RX\4>Slkw6ԩ$ˬ 4xۑA# !e컰LqBwޖ5YV>IQǷܡn=Viŭ^TVA4GhPhEhE, #TDT)(-S! tTL&'Db?SGkju6յrjsݤ29V7Sj7KQH#|TP!H@F#B $9Nim%1&6❍[#][<vqn]l[^܍T\:VF>"ìLGG:=*?oU<E ҫ&Q=/> =@{߈U_RֱG2yZmROCgXK 6wPuJZTԺۭ?!q@kELcysx(a#$˫Kf[Ztlx +͢DTVV"1$5 *#I#^C]%P<Hd˵pN]7)Ҋi8F`I!Qf? AL TGrIe:'QK|R4&2iI) ^Dn8 <|Rh(yJH4x4/I%>յs.yJl{1wyrI_Lp$F2P}9MyI>@JԐS0>stream h4 0De ƍрbx4 +PjSl~~7Խ̛MԵh+3>4Zqb$R H8 07)M*yT"T-Eܵ&Kִ|iX|ЊoQM\Nӫ~#P?լ: endstream endobj 156 0 obj <> endobj 157 0 obj <>stream h;koFv+RAp[dw"hQEQLHKR6;>g$"`JG>?7zpY%D3J)O;wY?1I燿?ZW+j_T~*̟ㄸOԃ~j[b/Y„RĪw sIJe,JX"1ӟşr2K PDI&"|Dm`X}}O塬.)t[^l01+-nWy] IF|)pw}v5iTleBPd1c戤aV6G, +aX@!k6crZ( M So8)Sb"կJ&$#N\6p7%9=Hb>Z.<5#?82ilo^ s0]VFeç7/{bXT2MDț)$,(V]1u0%Q^A8%:lJdPAHIYHtK@OM0 >ު5lx:/iVX*Uyi*-kmu$}yxmk ``]ǼyIqB2 m3C$AskScPRT_r!bG6CfQsg&?9RNI:{5<,e% .CL~C{4$}ƭ/4 #BZ +儥nwcyL 9܍ĆH/u4-Jz1NW^ BF(7M"&0o"( Bv` "($iM64Q8YahIH* *M'$r.Uttrco-go/u,׼母!TRکd#) ilr; yK"e4ʳ,@+8ɗk4>0N1Px6hI6\NE3e1ˌ0G+ki$p@2PG(/<[ b=ި  [U C,}$jbalF?a.Ul^1ƂvF|!m_Tg=%|o){r{T4粺+`Sl_u庵fZtX#`dTx1l_,)_G8ere󷼸jx'ۮ9oַ2@?{=D&IRgǫ.χDOUopK/D v̒\]*"=E=.-oZUFR|eѩx3)zR~{ugE=iH2b1Z_sH6(ed=+k1("fô&HƊ[5^3%{S~_lPQ<_%_w-baIi*azj=tFe!7n r>z.UEcƵ ;YET7!$` x >>t v稨t0rd&օtS," Vw}>[+\L }Nǖ#7N]uaF) "D]UijѽO[{ D ]ތ*S&aʦ8m`TmSm/%e4x,ڕ? fǨ_2EΎSoOE^ 3jYNo d8MvY)H؝D:+p\9j_ TڪiRzt`QZ*+*3v7۷?bEh/pWCupbjX8o9L޲}%)PQN_Fx[x L>NGM//qOwmt\,QSw6 tE1.FP^,E۵ʆ!3G1p^Ms=Y]37WWxAl4\DJ"U"g@O;쓃fYa¬3" p{q&JbcIu,r0{[^@nTuExGiǎLEl| _(ㄾ׿,-Vj?;ײz*qy41wZ z%X:-^=?DFbi,g~mR?SbT-9%oDŽtÉft ٞ=xo2Dn۞ SoBteXU :&tKoV؅ f}Lznj;a*XBW[6jr*UXaۤl^U/Q cng-\< K iz~\%09#:> R)C}0}.֪sO&LIܽg֤*6b1b>Y鿞tvRi7eFE?˽V~5VVGVG}n{R͉&wZ% TsU6R#[iZ@mNG}S=*ud*/PX;P;J\Y$ 6ه-fI:ZF!g)xNieθ/iw˴:6{[f* 2TP&\+ٚU^ e5ۯf=~wB<p9mpɥ>6E/`/}:f' -w$SMBjtEtg A޸AZbt8{SufwG]yx{0T6i4|ev ziA#1!!팧O|*; fxlOE{Uٹ$sI]p</FGy"߽JAިqdۘ&4 KYd{@RHT}馷a-k=*Tn:!17w]$+qJm{z$3rwBqAQ"hidh }=KYVosP{ft#9-zكdekpw68t:ó:0 nL~ttOZsM:?tL,<o0ǒ &|Y"<Sa.%&=e=N&Ri$>~m4z~0tC=ȰfbVS$M̰[v85h܈mUW`AchS)ʜvS}n9L!N #A4i豬%L~0A\鲿h=AsȉGX;m^z"YHj쎑sY #M ˋ81 zBK O >؞6qx~.I>stream h41 0 E8m[RTC_==>g\;OYlRPX˜?kPgU!] Vy씹ilb:_. endstream endobj 159 0 obj <> endobj 160 0 obj <>stream h[[6r~_|iJ`9Ğ9y[b6I͸)>nU*P`GǗ;ĜzHUILh"%/ǍOIx݇ǻ_XSWս|Sw>djԫ%c&^R [՛Trb3b8tPL_M'pJ 9$X t-B3F >p,|h`G=WI !VO Z lim$($ȗ |)z9IfM4j_kxhW=ܜ^L*!rc WiJ%c,`RR2한N6?)+-VhV",~Gh>I,7LY\UC:&(NN@2A@ `$H}ΩܚѺ(t'#iZ;ʑvP;KyΫJ|aMs9㇟VxrrwZaSn!Y*!x:ϔ݄ya¦(ft$,dK¦T~1LX{wg뿛mhnW@ cv^tPW?>*J ;T+g^\~0ÆSi0|Z M!*5w/HD"R2< w[%~ʳTИ$qJxж$D}47cMKzZ lU0,ޒ.gb6E޼Y <8M):SH6%Kzh6shKVyd=Nb _Èߚ ~&+&8qz|}EW_emxtf"4P f[zھȤkT,1A<;ؼ& A|JrʚB64?>g,oGf,sgtM0Ng50pÑ KqkM~Pkrr(A^8zK92&̛BAQ}G A}#/+STo&&5GQ ;0T!Qq>,r%ǽz,ڗ촆"+×QD_e *[ߧ{Lp 4u<#?[1?Y>222]W[$a'xHϮQrɡytn"F &]C-7qc٣E qc"܃E2 {ӖqNwk$ͧʝǿIv^,5퀲>Cޤ"kdqP}qϫMq) RNUSl>|t*Du$mWlv6&R~Pl%Yz :UUo>EM\^Z hPQ%[. @WqYaHs,}8~Pvu&X}Yd\yplOBXU6ct~]o2F16TȻ90j-2q-#Qq񝓬_NEk?ԪbKd_ϖ6GbhT]O{ C4S-t܇D\\PH[9 yTq}{#LSe-iRbrRhKlD萠WSDN_4QX$ _jZs 85nLn$g~m6k=ylO)n AM͞ ˞ gۖj_SJSoRLN-qT.:չSV thvN4D>\|ð]0BaSVIuL :8z}m_Jˋ@ز]|Ϋ!ZDnKA ҥfWXnh5f,unæ~-׼?zF5osR6}zOR`^6IO S1 *8a9f 6Jt-\mEFbH{MO | Q="@zuK09ZNv@e`vGD:s8vreŚGY";#"xvxsA}Qfθq oR2غʘ`נy>-Yru%~%i`b^鰑У&;'(f Bfr&_n?OI+Knem9of"ݠu }8nտ|E-}/GpC"@2?KVW-LC.dfvcFhƹ,{WEWs-jt=:jGOD-"@:fNHB[r K7Tゾizֲ-"|Ak4<ꮨOKkG(i2xlv}g؁,I`4:>6Mh? TG ^v37 x]+"7BxwNTFP'Hm'+3*,gbO|q7=9p Iv]]؀V!NDrنy= gvj{*ItYQڐeVUJBPH]8<іA_xIc'MmcWpJ Q,"}"tP%(Le>.%ꀼVBwN8B8Y74T_o?F9uՐ۟01-ñq1&Z40JHYL iiף88 {<2 c}7Xqr~)q9nQ 2=Miܼ Apgg [}B&`{=~M&HY[o2T^ζZ!k^ofz<O~aTvZ&1BVl[ 1 iBz t['t.^fǔm3J%'Hk夬nȉP¶}y7* h8fw7  ˫/pz'Bض9쀤?{zVJ`=zڞ{C0kUv`As[)GuH~jz 78;0@Fk/iv67(U9ܸjP>D].b*ZU,N +⑮_l?IıS2˨)=–U?rz尖5oJ: ӴSMAn(֤wO2-j;۽8M059VUiv.i5f_/ ì *.=I︆_hиMڸ-^^ie˦Kbw'+_cΙ%M2`f 1ā0v&~Cq^x ԓ 0ڮ̶{(aF*wkމw.zN&-%C0jSv.2_zOQB Qtza<Wr v* :K1e;X\o;`L}puS-u[yyV:a;T.y3ERX>!״ƶǼ3K yw>812ݑtf) $&}oiQ B޴ ~+&H[Agէcմ3OJx}];@ \LͲeU40)ŦM K$?z{k߉@u KDEmMWM7t endstream endobj 161 0 obj <>stream h! ;6i endstream endobj 162 0 obj <>stream hԛimY:g{}wCz7Izݝ!MI@"SHy@ETPEPq`J`ZX~Jvϓg Fj{g=$L&vlȻ_j~e(|Ǧ?: C^~.d2$3g'O|o'ߏb+2 ~S}<=~$O4vW'ֳ>~c鷿~7L?~0߿{;?O]? =9OI5&ɗ|:-lW'WW2w]g'W^W{\}v:|}2DVI9_NVz Bj6|S ?~Ʌ⌘w4ם;-s a3Ѕ|g;;@c3~6억\Z Oݬ'ۓO}Ꮭޞo҇>/O_y/޼=g?ylx2X/U{+᥵jxbe=Ye3vxZe7r*|\ /U.E\ /+\Xq;y{{#,7&qx#_?xݼ}tcU7N_(}0ɝ_܍>8?<˯~Vuo޾Åov/4O_y2kÿo7?0[<8[>4[o6om<2;|Mÿ7N{lw]4DʭS#(DPAykmg#(_A#(EPAʋwDP<3UwEPAyOt#(/"(_A`CAEP> o|8R"(|sEP>AD["(A'#(P>AwDP^wFP+AFP>AL"(Al"(?"(ʽ("'#(*?A3GP\GP~$AʏGP~"#(?AK_tFP~&"(WPzoDP~67#(+#('sA{A?܎|> AG_/EP~9O"(4"(A(We«2#' ~^-oj(=gV<1־VW}7Ceau _ZXg e:C)mLyOaO+}a~~ +K[go燲1N 7>_a(kkG=>gu;kna5X{6C< _e]C6W/szsr8 mk)Mot%Cn+'XLac`=s%q 偭꽮Ǻ73k{8D~i(O{z(7lLgK[9ޡ_H#k*]Z[[gxJi3Z{xB/7uB: 2872wJɡOW=;Ɂxgz}?޸Si; 2<5X.8/؛a꼍<}{cy;8ï1wcx&r*λ}Wlk(`jﳺD 28u: 8_SС}a"?Q|sm; a72Eȗky~E:!֔ٷ+Y3<3!%L_kr7xhG8R=-M6t ;Q6Ggri/L.=ka<'&;\81|=6ϻ û q=<'>D@g'oZ>3uoJ`-Ws<7]N~:KAEM?[xfAkήsZ>nLKþ KNk3_nYy!&7ނbk469٣F|,K|o0֨DFozrgI=3A5xtG&ޔeyB(5ZtsY[ϣuס٨#87?{֨763i/g!>=tamDvxYjxRoeE.ϙyiubi=o_iwx~H/C_v(O;2uy絾km}w.v;~&Ooel)o)|%IxS;!}ὓKwyÊ9V\fEv tNLvwuP*kPfElrOm)%p^ޥ\}Ɏx}f?,̖iu'*-D;ckϋs6Tocͩ=7f<769E]7]?M7~`iOlGMO>ovz~_9WVўG~`}O sh`y _3?Ao3goؾ;byXtxm7YUUG{tnƿ.6xy;ߕ7 ok<6o }bnpZ[^'=6k5tX ] 0s- ?0~a:7ʞc0C} ߝ7t{~lߎE?m@G* hY)lk?_6Q؇7oL1v/c3砱m_ga/r X=huqrڃ_C dEm;}q溄|+0v&"|x^ 3ulzr%eidG y_[k.m'!Ԡo=钱m̑򼝋v>NX[_M't^L ]uGNWQG};;1s؀ĺZztksQg _ -dza3s: @N;hY2-AgY\YBL+1>ʘ].mG>\< BQ'T"sf {+Y {Zfw yf W{pQu :0%`mk xr,3SFMN g >PUB;%ι֛{dg +2wy08AҮ3=xM TI7$]^x`xBӕ)3cV^tZ :1O׽Nh..KLuYAl೤ gO{gvZS^7A3\ J9k+{xv_Dl 6 :1`}+kϭOÜ:Hd3A0 ;eqfm:)a[9l4x~Nh-9p'kЃ6;uR!HEx?/oS7?ugsV2eo{][SlmhOuv6I Ję v{>8lpoÙ:gcLY -pq8aӰ8Zm nR算=檀CcN)cG[]C9y>tz1`قl?{%cuwo  |ߠR[X$lq绔[[&AO)=e{09,+K&kd쥬u_ZB7k>-qS۵B۵lx_%T9~B;a^-d9YeCMÝ%S>=h\k樻=);%q;2Ygpт9M厑Ot31yy}kZw*E]u>Ƙiٟtͱpki+Ǹ 9NSt2/ u|-p[(ta,N0i1@Ͻ1J^Yw'3MM'O8{JO;QSsYqU OmXl'ܨ7gr; þ[@fOXϙ[#6?]k@` sȰ:*~;و~rl-~6w_0[\mkМ8;sK3[1 T>}:}j^vF#ws.6\FR3۠{s~-YZ̬|~cyf薾.᪵)oؗ "Wns +s n__} 8]ts3N`%BcVދ>º hL-A9O}n+^ه?=~/컯y:^Ao]gx c]e?+ |kagD(_6JcgihPVlln6GMztjEY06SMB>VJt]]+2[9 ibvbp?YBs<:R>>}#Niu9qmv8/>1+8ǝ~j؍JlE#&=FB$OZc~VxVaZGwTS2FO\v/x\nkʷW^J] jlf.[&MH̗ <گ?}Z22ߘSO$``̀cߺxSwZ[Mk6>.sI. 2A߄H$?{-,{0nuEj(~I+*{pT&L5>6֫?nX`TvϞײ*A#yNeJԸU†MJ0pe!}HNXöW!V$Ӆ8Zu^ZܤoęLݿO-AꎠBsw$xP [{{]زcS{5s; =>W{9`]u#woGN}``/(NϽ9Uc 8sk̿0qޞww\V1m)U|_q;3:$"q#ط̷[ݜ8iH3v+x;Wĺo~kB:8}+}=Ci7cQJ{ߟ%y}XWº\prvs)WCo3@ow?S8 \K j0mw Wb*a a|-:U}<^U,0!6Vu¾J]mS .[D:߯ȉ6̧μ8ޣ3R*D:uZS^5:iaF4s{qoE75b!}<Y r&\l<# :+oސcmTs>U^!r˰Gl <(]UeR?o81JyG: Ur>(wgݻK=R֦zP.{ a#(Dmo12gtNlQo<Ԑm : wwS1?=Eaq۷ *ѱݦ%g3ɳcȽa__aTy=z!{98Yk U%x%s9ή!N8/Z(aql{q"ж OOΟy5ǂ2rrWe^S%h=XϡȴLL(_ Չ&tt!훋,uSz*}"S\8&ưSp]ߓ® {Z(_ܶmK)u6RƱ.6a^KB qʺ6-WYAw t2-ʚ{)׼(݊W]q=N@=0W{u Ƞ뱇ar~3֊~: mGcsх}׵c6oHA6^1bu^Q8wkx VN#zYC81 gy<~/buŵ_ gF w6a:};oq'2A\FRdr-Xsdޣ3kLJVZ4_C4rvJ 5>wv㙪o^+%Kߗע]ף1]pHwqcyϛYyn*]pmp6lw+ K{3u8\XXylgwԖ<$@6[+s YKfϩmH6=gg/Ku1m=X>[a7C0J֜ ۰oyr@,6zd|vsy ygM ɩa8SSW&y4U$Axs=w7V$M^Vl!?OYyCit8]=ݗ;p쥴 Y/Y& ֥ԇ}D󳰛Zް")XB&!KƗNY~>R\mbM>sLU Vj3ҳ29Wpfaw:AKFl9'uw`> :"wM>+`dmFZѹ;3ȸj)a=aG_DJ _O1G]~ۣa|ǯa<<0;u~ y)ׇq!ka';yzU/dr~1yÆW2Ǥd?Cl2p߾Qҧ c_c.UwcPZ 3mb>C,cy,IQ^1HV5ή6."fa7y39CLŶN_mX*,3i.ejjî?\i~.?6+}Ժn옷U6} Ęwkjm7]s'J]߃3Bv ׅ]?dn^ jDV*)iYּF7mi0I=_  'y?,ϻv&cs>G=4_s(Tʹ%tmJ;uyވyչo$ZE+K:nЁ]~"[m%"s7yu/gC^|h=E7Y2D{ƅu*!tta|זe5s%̪j.6IB-+P$F}; |iu)/No/]=1ye9+V{#I>t_ch!\nk"#7a7oy<]\Z UY~UwB{Jyh>:^Bs4ㇶߩm\g_.@}̽vO/<BdR soyo!auX=C5hW&CE' Vaׯɞ^PsXq,gQuIޥcS'㝱{[`\ ՠ|9NI?^8sf>UwP6)iΈGcj6Nęn4Eۘc7E'8?m"aS.1R2}{#߃[R~%ц~I#a.t>|k\TR#v%N^ۆt>馾 MTa|Sԧ@g8kUؽ}+sbS3'Ku y$#_̝aLN,c'a[%C}(a˰&avs{;'U% fa=ǩԫ ;qIQ.c#.ؠsqk2] B.|zMUwq rvƚ2ViZsOFvn/ov㕍WJW7!}L輍KxWT!rDh0RDz2}9:.-z-Ej٫6c5yR{[-0.O3F8=4[9~di73Ƙ \UB 9;ƌKe Q?pvG+{[ﰗa32+w9Km\A[^] kv]v&*W0ϔGas]jGߦ߯T_Fxs/}~IGr{ʕ:,76蓇ݜ*W;=O kKuya ^W{h{ȶnϜ綾!V'qU)*Gy]+9q4NJpS /|geжh?Nf1iMj*:42'C5Mؾ̼ Mm/nb zHͫk!+Nd2}?kNt]6qa3 >[mڳ x T&k{`̵B]/z\lA0'psS*1P0K*ɓWaw=0o OܣZ5{Eҧv} aCEo>Ż5d}UW~uvcO;9q&怡D3˻3L]@aF!)Z@b\~ Xz3[^{+ubOyWZi}a>2ߛt\іbzv:0ᘁI*uJu*/!O߫s.t}7Kvn֔ς}捜#u Jn;îߣ=/ [ƾM]b.ew5AD{}֢i^]'Oif?a/匑a erhwa7ߚw,g5,7|Zp)=҇q|0-î%ywˡe*mA]_y(q}d&L'1h_D=eag&VKlBjwf7^c62+?TԿYd/E{[;:G=s~h81úg:K9]P'V<q}dOLrؼuxneXy9avGkkm kSe;4Z|O$Iv~_7ʺ0+עqw]"kWaӄq'vo&PVgzkF,4&AdA ʦlQ\ w .b\ӝDM8'㌉19q$gr1d2cL$eWnF2IV/_}UsRr~m}+!ΖEx:o'U/K6!Smj[~'a;?{ :z2VVIIt`uy+8׏S>UZ7Ϧx-皋/zl:~ &+ZAcχ61TXcoB؜cVWroD֭ +)l~oձul|/]#~@5.ƯSVkSJԅWXkbkBlǽަe^wX!^'Cl ylw\g16}Ղp/!.cqd wzhe%]k.3gڎ{ؚ:fr;.|?o|\eDȵ\˹5a;q:f=Z>)T'L]eۘx|~-++K#KY!2RDY/V̛A?KX]JTr$k_yY彟P~%: Q#P~ww]d7,R+p)%iޒ6\4-9}. $cr-Mٔ+1)+oHr9Ң-N)mǽې(S1}1Z~= X-?w噳%6g^g0/>/[dc:o벱+~gm%vM:Na"Nk`W?V}̴|D.rCDyLyT!*tT;k˿Y>6b\*o{4KuFqsظj;TBFu2>ˑ:ZVegsR`q'ms|9!뫅qm1blc#|w-dAf3?@12"/a2Ζ+sY;o<^}y"e;bgbmnl>KSc$DlLq)q%D9}Ay_]Γ^z]53{3|' ͵u\gm9bc+o;Y>43֞ OQ_-?7(7sNtۜ-#[4}wL3[+ۤX%lw;nx r?;?#YO [PdҠI-I9o I~ZUb ճnBv6픋Ռ'yq_>#t!gc뚌#֖b|CYl(Ӥ^[G\JMY‚-?GmN ,j0"9 f} bɳ.f8xnu682 ?nN[? 9g=mr'1)flsJZo" fp]A֏s.LhY' S`^WhqARű=iϒwI` I z ƗbɅRܚH38AvvqqΕa릁^eB\.iF M#(P*Mtsf~jEjK# S0/w (A`>D>/!\leh!}xw398<߇.`.yOL!/ily̘>ϵf'̩=k&! ۵erDW"´nCOǁQơ3Qʜ2g`dt9#Y.cu13 p^ pyY¾ʗ9…Yw}IREHNĜ 츘ɓsy )y4kܝS^9qn.q2l%؆~y맓Lb˩N5w 3id"ta> (܍v|sj/ 璴 zx2:xC9 [֗s;u83/Ogdz qAsnaI=L\cٖm>?W\:]:m;ɏ甙z?e9~--1JGN//DP.!*4tˇ6 ^^rxY ,M'_#{Yh\ e/Sҟ3;49U71ܝ,3x3? ?}޳;MCN6{|rkۼ~;ўAfG=z<?&ǣ^ ~ܹ53S{^Xɏf.Spp,͠.\p롅?n6^dƁy?gdJέ0g@vmKl'˻^׋-0|^^|nX5Z[*̍}%rD"2 }?M_:)NA{3JZ8"1{/<'\w%8pm!1r_Y>,Kb,#%XUIaTZjw{r-?Yǹ!͎5՜㛸?QsR:Miʞ (#= 4:Al"2=4-Y~ͽ]ηtۼr_tf;"^]&N!B9抻ݾ Dq>N%9/g({M^|̒{L4:еix>Ѓ޹ܘFdO u-O{G.F^MX?d7,QtTd/c^+"lu tama#Q|.\`$xfɶX-S\E&WxkD'd=ǚP=%~c~BgcPcavV(2~Ǜ#/q|د%* Y?0?0ӹv|&0^{ _gTP[89B_?auϻ0ߕO0`.1Di|D`X=M />n:s(alY?zN3 s{9cнkCwmiteڭ<*)fmYy^8WFgsb.O8q&q^)G<~Oٶuua{=4V['HGӟxlb͌;+=p6T}39%DbO9oH p)X=e46 p?]Vc8Gݶnwܥ9P/3xUȱg\l[#ֶbtєdbl}gy[Sy?3pd연w$ {ÿUؿ ?[:¿v|Ao1Zx FKoCR coD>zǺo Ԅt+5(a {t3O PA>0G pkBޝ|k^^||QkF/lwC-ɚ痑'r|]c5Q|V!_)QOUyb~ W`#D|]=}|a+ ?!η*{y}ޕC_. /| a57P_GM>/{ h0#/$4|;?e~{4քsx2ʴ,W[(#~-ֲtnp?& sISA&6PřF{\V?^'^mˀ\_6ǾEZQ_>@w3 Ѿ_U8ivMPuwBswaܝy> =Qو.;h#Ztb"yqFn~慎c߇4x2%>\c> /viE\o` ||? gy܇W֘~ҙ3ygy0t3/y$Q~Z\ ~$8￿%89{;F=:ﶠ j̭:&I}. ׯGj߻/`LVC.VAޤ1s6qn4̧'nPϝ {ܟj\Ɲx zF jtimûC0..w:n.NoA"w ~?wחc:r}f+YL}k w <禚g;́LGܷS7Ss`"ȱ:jÞbqaSלxeߍLw,[5t+p<_8o]uAG(5跫m;R#¼QONN?{ zUCmwO;LV5LM ۓ~C^~s.׫qa;v?b*qful(o}4p.'ȈЃxF. b?{gl->|?}Y?#)KRٷ'b9 jľl!N +dzʳ 'ꦛ#mޱP%[iYbL8hjQyWb9Q=]Xaئ gpmf8JB_NY?]Xo]E{ 27݄²1dډJٰOqxr] wÝ0'ճS#ʻh^e…;QxX;zg&mys#R-(LY;+ͱ>jD9d\^\(_W[~[?ϋgm3神d9K6wM{׊=+f{fF23ig9/4 |ڗfQ+@/cZԜH3eoV_5_b.6+i_cVU_j֙_n֛h`4WDªA?j1Q9e ՗8<ǣcx<O<2y-\aӞ5؞^كg# iOΦN>s \p57o3L3ya\fo6Ufk#l2kz~?L3hdɌG Ec-Bf)d3 s'jv~tW  Y0Ћƥ\v3\RasTZkJmFzFlgn"w}iyYvQϝJ+)RoJ_-=QfhKffرƘKk.]ڼk۹}O9j.mra~tQi¯6Ҧ?z+zn(]\mVVAm׼;HôɲN\҉{n9dŵg|ޕpǾ:~O. endstream endobj 163 0 obj <>stream hTP1n0 -2QR %]<-j7"Ѯhy+v$#w<ׯ5i0B2~bpXg- :Lf#5uR4#Զ+AEv'訾 i8 E(b'Û/m瀠~{cYSPUmo[g5m[T♗z1s򸜾;C0?j endstream endobj 164 0 obj <>stream hdR]k@-cJw0qMM7td05ScQGt RJ}=瞹C)ġ\6q]<>2V+uS[ȖYFa3RO7umw@0>T/cʡ98LyBըE aH o ow,4XąRH*^$0vZ,mDJx]VlȾl򫜏ݲ6b[t(Nv=[d0 _Qv5L8R UGMQ B7o xwqM!Cc=Fbݏo3dFZ{VM]ּuMUi"lYzJ5Iea]䳘{kJ:NT ܦ#(ztlYqV3OK> endobj 166 0 obj <>stream hYݿ Gc:)(Ҥgt*l6&qctFQ{SeJm淟T~y{ܯ@ ? d^I@hxYq+~~!?VWZ/ߣz@o#O?r D+7w%0 !a#0+$qpS?*88" 8ѫ D9 "(>wp\ei[dJٱ a cyw͐:q`SyZ$Uv{x(V4ԓA1arE8(9&㸳)wHr$3h+6$]4FAHY(t=>CK D*8s)C Sp+y+(Y}aHR'9;\Cʏ1'J|:qcQt 'IAFJp|袍)9$yMOtbAN(Ŭ|3D-`皟i~A=>zS[sŰPdҦqc˪8oRy)s%؀ռ>g!0 0t69:xWv}MjA{ 5a J]^^7y2S$ש"#N/ICHRWNqR]it`{O&ڃ̓JBXls+OTQ:,qcb8"~Iع/W"꾾Mx.;4|}kCqH3V/WIF1f]G:0kH:>*BINa(\`Aɴ 6#?Oq/{ Q~cltrSwAn/U%^Gȃ9hSatp}fkP9җh<|#7cBMBf6+7f!Ac$AeT#(a~I':Dꦈ#/k ?0tMxN7ќ aNZz _<'Fӕv"ñEDȉ7K"eaKE$O5@Έ_79_YE3|E?!i+)9/CZ \1| ʏfճ.%YyÐ鵅J\J#\/|Y# .*+8`a&OE@wC`̢+3/\КSgbWE|Agz߶w2|~=[In"7+'A8TOM$#&"=A%Ob@ G@줓MW7Z RJCF\ ;_,('^l bpʡqGoSl^I[W7'M2$GzӂjKPհ`҉b&{M9*RJ O&Zjh'PC翬i@- 7ݍc˧e `b3Tׂf9Z:K>C+=䚫`JRs_/rL&˦6 ]r$@:b/OFsE42޴!M4t]徢^I"weSߐdtQjPKy~("F^$~Qo'bUyb'nٸ}'ݣ `^M7W4f{.±"u8@k2M}O$d[]3qӼ}3RRdɗ]>\s@4y<5 ".D6 ^r 8RyMuFÈ.8`M S;FR|M 73۴4<l^r-*tgmPk}3YвB=U纹鰅E*"Ի@aa/"̥T\lQ ڭ܏4oto i1 2|FX+l*N\N:s?  "+zqmٜKV͍C6p'Œk gi4Ð0lFQJ~Oá`~: ;R:||gv؞K')BORR|rQ8c{U7f d|t4lY =l\:T ߋ"])M/J\L>$WcbbӯۄH-j>$H#F:`F7˧66Hާ<vUxuäPe}Zr*eg#3қbjTS!+L[-3&͙a#lTon:*yxs<n;$Ҏ MeDk)9F։rG.蒴{=lWC.gjOY$^:!&ǯ-mC֔,ݸ aWo5fPA:fN.[,hA-޿tiJMapqtƱ:x<{Vzh ?+.H.L*۴aAq5p4/,&m}@j7P.2̫.5EwLWiyJ,ֲh'FzHEi|6eclDvKo6;# z^F]?NR91(e}du)]15Ӵ9qUY -1qi/I:cM1S~T!횫GPVaodpvı8B,w4X !cqvUIW}TFG@M7t.rPӏgf+g3;M>;\F*#g~F~ ±zC|qMڼcQE|-Ohkw֛[cۊB>_uZ, br;[Kw0>8bekJldBkBt)er3ԅS yԊ, u.T@_jgy,hny/:9|[sZLIXVxA zdC>ՂObdLq1x N]8֗ Wܕۖ^cČk(WnU7'&&zEگ~(6E?^EA%_V_ 'GHV< gۋՇG8fƣerSQYN, ]۾?{wѽF'hhTuK2r"0Lty|Pjȹz%B:Fpƀ,T>|% Fb;CALǔ:ri|WcZ2mZu:7Aw̫ߕ>߽F~ (;7[4-9Àt"B ?_oFhM*EsZ€:/Pgw}|7߾?ʊ`{)Wׯr"d.'~`8tikԉzO#vSw9$O(ikG4w?Ͻz$)ܦ~ÃD0EE1}ZnrX[[ 3\ҥuK/]VXmt)xq{C 7` ٢^@d`zG@/nsw9_'x!/ka>m9?)Ϫ endstream endobj 167 0 obj <>stream h4= 0 DOWAX {!($owm{Hǣ2#RR2ƓxU%Vl5?qw1՘O& endstream endobj 168 0 obj <> endobj 169 0 obj <>stream h[ms_`Fqo#;;̤P$$1&{$g":p޾w_|xXy Rx!,) Xл+/a.~xy~%"&/~K􏃐tOUy H/ X)BWÑS C$`4aBRz@R@_aS99|".^'WuWPO6A(OeѰ`,[W~ٜOlYld.bI (>J=wUL~^y_gf.9ǫOKE@q /2 Q]WCĬj@15|"j-'~n1kmO4fLnjE+:nxoolff9?+T!=~57qq%gCtpu(i㼛gxIF;^N;QT葘1A}ŸcXwu~#x`հyGOxn'8߀u Wi/ ӯs +HHRA@C1.s~8URQ| 8'-jb#Z~$@<}`Gh0p*)>q@liLڒ  B/SEhT^K(0d2Ȩ)VUBw/M@%}!+BY'D0?T!ah*f6g?/kz} z02JT ]a9FL>iq֥H"4IS|`Gn^A·Ӆ/ʯB'S:&ݞ`]:pN\ y_\rS{ oN4@yh9a'f4* D-@. `ݏ7o{Q 6Y@hyub୻J ^q]5C#'@ R˫Njۋ[UKO3 ru6?mȍwM ]7)V&AR,T:3ώ}Y0[og,.d X'4>ʁ+4QW-w[]iEbbQB+5ƪ#"GafB֌:˿ZcD}\6fX}L!kkki`ݱbFj_zuśKOK/kF {0a7Cf޾>/β4w6 qDDHX 59w"8ioPe:?yՒX*W[,wK2 ogOǣLip`g2*6ѥs|N h8:8Ц^qnݕI@kX~y@|hdD.L}| Kf/ϛU$)uYTt4NC#=oaPg!͊x}G\A'rvƜho\磜፵gBW3M˝, UMaWsHTW$jA2֛mͳ? ^1oБyoӬo5oS:ޙeB(NUYȽiM(_frFyFb$:NBa;϶4k6Өc&=J`>kjM iEvEp"< Y pP>sXӰ>gIH1fFNr/{˫35|ܔc%qz8_ejE!m1%(&NUh}k%A7Oe7BƷOwkZ20t*#?atKg}Z۹biuxַ#-S\qeԠB-fdN|:i fnjInǾ2Zj{(g;MhLvZkȶ:F'͵$*<)hjNǑ 2O/޽}{ov iѕu6&Mz u#HG*J|:g 1  y5/GTdÂIxHyd?%KvGaY,fHb|,)b2DiIRS9q{gC7ʼ9wQ O(X"R7K84`Zܯ#Y9BR$UcJ- ./ endstream endobj 170 0 obj <>stream h<= FKM֨U*Q!ǯ @0[=l˚ ,bޫSW3/K1Fu)vL^\qb\ͭ$5[ɮ1y _j*y4n endstream endobj 171 0 obj <> endobj 172 0 obj <>stream hP ,s@M. 2#J䐛tw#mrx^y Hz!_I"~yO/׋_K=x_D{+,wo!i?_dd^@B80`!I/ sQ 'iq?,3~BQ *E*"|.{EJ( |u@?_|b18'2S(@  ̘ठJa$%% 1||ޒ;^JOF/{ߥc5@E\`͈JAbӔ6@0 +nHJqJQ( P;(EB"8r'4PFۨ h4nD MIIB hqO[։awݤE;yr,I:[{[??v))q YU/㞥!FN*S'#{w3L ZM:@Fe1ʡ1͓yꖩʭ[%d=ƧF#h#: XD#1q7i hX: "'b<,_ (yXqjL>RVyNEGcF4* ǫՎ<}t^5#DwzT̮ 1T~m?B}o~~{>^P7[if5C>XYuiNEX٭g;o˕+O OJZQKfegunӋΩ\kHO>Iu{jOK;X 6ݭV&]+~ԠjM.&gxgE1U3j~KleRdܹڅbo7htJ&2Ga4fZzJ*F0?؍؈DN~JMᕞ՘r"K)"$vNM,Vꁇ'ylDysDkHyvn 8,9VlVbo+t=<\ ]<,WM­M)6m#ik`]`\x^㌹eM5̝‰I%!Xa+HP[v^*"h:Fiw9YY<"haNO@y7mjA4_>8w=4YXבe`Մ 5WHa!R}u&mպjGk!BcA567;GvI68;9!e="|n"8tsZC(Z`+~xj6nͭhgOr6ybp+7|p g$!-H̬yz2ҺX[p*gzpYfjl . 38k6 +ix>UZ,%ܿ[joZcNb]AgKh>'bElXh6bp}i/IUGB':yu:ut>~H9+V YyrئZy':ph菗ܲpF-6#xswc-Q.+DCWvNI10#G԰0:fmlĪZ"G,\Lo(CögҐ-lZ*oE]MJӾ\)YFWke qՠ\vNş[OXX`s/j_߿YZ"G;k{?vP19uPgZcu VZ_uCiVֱN.ew6FPl'G92䭉x$13V<OV9oN3!˧ uNVޕ<[%!qJ4~䜞seR( ۾'SYYpg,Bv T%>&vFt xRe{LWf]iD.anGbߛ@)w{vbt>4S;VMXo!"Fdǻ4_t+n!4o$˲ZJyF~<.oib?XS/6km 1ljsvrtF{ngF7*`WuK2-飓s.1ҁ=6`4׹jQqD0j[ӂ+3Mu9<'wJbVOMTFrE2`\1)ܹإ}y_VL#.5K|z9aQ+th0 PJ`ҫSL/׋/2m2/LU y]s2zTf흓Ѕcq <+ۃBU@guj@E*j= l=gDe]5IAGu8*7d'@eB\)&^/wY%%Y%%!~>LNPmִu1$8Y ng^wa䫲*OTeX.Iȑ_kYdSDt!  4oOEF=g: G9¿6a2Su2TҨG&GFF&?, (C5Qf9sv䘧5 meBs+UlK׌,n!,P2c~kiX@M_ TyL*o_<Gn?gX endstream endobj 173 0 obj <>stream hkPTi2+V6@P+B E+"P\DPhKbaChPrIHޙy3/66b^̋i'"H2'x9yFp/^nΝ;cbb333****..VeÇw%osXDJhh#G$yܹ newޕ?uV ׯ|^HUUU;v, 6f={|H)44%^:;;>Ledd@";;;~)ht:]ff& (Z-c*'%iii*fY3Baaa$3ھ};5>;F.qqpC2INNtVFMMM䕽HPp /nnnQΒF^Wkk+C8<[Lk^o| ^|i&66VYN>|(˹J޽[Rи,MMrss͛g\aɜ0fZvW2 eelllHHH[\{rIl /K.MKKzEhhy/EO``啢駟 S-<<<o>00@X`pp0=IOOwǖጲGPAMM s 6`/\΂̟?.^x1 V788H- m޼^0>؂`8|0} ̤7A3Ie`_nݢ'bJR't8aBuu5^ ]rG#M$P]pNGVTTD?ʢ;;w:,賳`YHsgt:^鿳˗/)~8>K ^)=`FFFHQx\t QW*(9$::;;7^"ITc ܾ}[knn=9ybS`-TWWScܽ{T@VDHRRXWVVb T`]/_$[ۛrdFW+7=Xk $aۅ[[[m6AV666'+{%akdd߅.]84!`00VIQMօ/eɓIS~͛o޸qBzz򖪪 eY> ڂ6|rTߎѤ$eMXXX;{޻wr5DrZ JWZ8R!qqqモic|||Ѽyz Y,Y%UTT`AA,GGG+[nt>)W崴4̎I*ɥABBr ?~LX ]#---cK[`vɑ$;Y! ߿伳<0$ƾ̼oFYDYxÆjE{jDX//e,h۫W0I^ : 3vV@3ȫw`ÆM@ÇՄ__ߋ/۷oy% 2ALfW/^01+A/ic9 iy\6^cW02tY`ASStJg2Clkk A^edd>}T@ ヂVn U+X"..*q^t:A)gRoW]ʫJcmy%3׎`hhh|?cǎ9xU̱ j"sf,88dcJJJ@MUUU$P?3SPP L33c5552<`~?ӥjK:t$T%t:WWWDL^r,T__y gZ.\HXő#G.^y\2_||<5c2LikkT|iiiyǏWWWG {+''';;3t:R|uJX2вeRSSSVVvҥ|WeMss3ߛ89sDرcbummm>>>JVɥO>jIEWe ]48x YdT-\xȑ#ӧ6l9}tiii䷲l)+o=\,2wNHHH}} x oooiCNNNLeϲM6=9MhȢ)]:ݻwԘަPc۶m%%%t۷ߺpMPdO"LZood7 ([<%@"33D2MJ:QAmmƮo~ \nnn_|Ed 'wܹ4#qdZss3u2eիWR"Kfmmm b׏Sn~̿maaa4]444K5ݹs8A{ӧO' |\8#{/\`Sfoߦ'#[ri2===Tj-[vqs:4¤snSl8qbѢE4z=4@CK,1'+d$MsJjs7t)ц-K6T{)Ss4Y=ٳfƜkYiii4yE^6O) Q'46 +'6[g1?+G0|jC۷o7窑2dVYZK1ڵ+>>S kIV^Mm@yٳS~+7]?iX)?c)o%UqSeAAAxcڜ`BB|^ a|3gJCQMxԆ N:%S&4?ǪU,)e˖,QMIIIxԆ 6lHLL4 'OH\mZڵkiD5xYrMBJ*Z响ͳ4"yewrZ [טqj_~r^r<9xBM 0w\ӁKskUΫ_zEEE޽{4jΞ=K:KmZYY@ZdPF,__˗/Ӕt48B_t nY^0Kj{&::R*j*))!ϧ6l-//oӦM>Lv^uҿ_-ɫLMxx 5ɘtŋԆ8qb˖-a9ȫ߾y_$hvaŽ=JSW]97FDDH:~^UW_WZׯb5S2W3jb>8!PVPPg:bbb2W:i֔-?fa^:tWCS!##W3*?K會QOU On֬YӔ~^ݻn:9~i^vlyG>Mނ hJpxGYW)㷞~a_iSu%a߼rȔ">K{?yeūT///QM2' 6T`-Xʴ&˖f_oqX}oeeej֭Y4"""HsPW_}6e^=xew㷞J>vB.Dɓ˗/,@֯_;K]K{ |8M;Uv-Ŏfʢe׮]d>*De!00pϞ=":: ~ߪԤj5E7ke<ݻWvb r*D}rfE^^KJJ gjر#$$d,kΜ9S>Snq7ɴaD}Oբ&$2qٳgi gS^~;;vZtС?|FGGkkkm&mtRi&ql#]vyxx{e7oޔq"3Q-r6$$$,YDi/-nذe˖۷K.ɿĢEd{y)'Ӝ9s"3R0*hkk[j%222ɓgff&''%%%ɲL!]&[?#%A ש[<H!S3U\\yxiii.\HTee}8ʕ+Ii ec#Ϟ=7&d0ȟQիWs NjT-r0'N?5g*ꪪy }3====  yf^f͚Ǐs*`իWI ~h5<5޽1@ ŋP\vmx}Fqv| ic9PK23v&[q^544gjU- :1W b===Մ(;5rZ)6nXWW744$+X\ldT?ZtiZZ$N 37ضm[ss^uy=~H*j, lڴӧǏ++WK,Q{ol˗/++n޼I8DrƊFFF(*d:OXWee%uBmm- c]` $2`-d-$%%Q]ueee-6Xu*S]]Mr]RvXQ@@bS͔`vvA۷oyN īWHuQo%RSSIt:J^O)77fҥKdʆ)<`FFFH:u+?? b•+;:q̙3 R9H :z(u#''İW^Qid#OFÇ&FJ8+WRdH R]]MYՑHSX$cȠ>Aԑ=9% (:;;Gƅwhݺud+**P )twwSgyf*Ν;'XPm :uQm6oLwRΝ1{Zkk+eٳgwg{\!\~HwQQQ3\[RR=e\v'OPp=n(o9sе]RPPWuV ̤Ο?Ovyoߦ˳Ԥų˗/){8#hϟׅp:z?B~~.g!BϝbbbpqqqY.;;w9z+ą pdSI=)\B;*p47oޤobBRt8;w+aB]]૯?bJ7nܠs3q- vT]]MĴ!좢އ8wj*,,a233DPӧqPDD( c0>L_U ҭ` CCC7oϟEuuww/^[hnnZZ[[S:,dz6PGZZ`aƲGP~k`` 88q9 +WYY横Ç菘C)pMMMtLL{CI1H wgg']/_\f =;UVV D֭[Aϝm8'[iYreyy^'j,!'ի>>>TzFDEEQ?]>| 2믿NHHZ!QXMMMIIIBCCKKKg퓉}}}۶m'2ΨQ[/\vGrrrMM<388X[[{+Vо /,,1А^...Y+ رcW^mkksɣL={VUU%<9<d~xݻ2E.t:{⋴49E"%00pϞ=qqqZ63g% ٳo9"ݻWH"e? endstream endobj 174 0 obj <>stream h4A 0E27 M+B1X#5߉1x y9rxK$s[Lr)02>> [ w5 V%qS ӾG]|݃/ƅh`!m/ endstream endobj 175 0 obj <> endobj 176 0 obj <>stream hޤYio7_A_VA>"k&A%="P"YlcW{ڻ[$97|\=-EWwɳł#J5HL Bb2! ~+[Bkb1{BߵeHQf.eϘ N s bI-(5h&)V!ʱt/'E{ LHKpBH:h8L]8=yEvӌK̙hƱM|I_e)Tl Ujvl]]cWH{cVVˬb~ԓ#$();5x_Gw~vl{Y Ww<0_pӯZ  *k*@.I=_ o  AF+ l`^]ĔQ3 9¢0CY0.Xh -W؅B]rEɁ8%Thʥd4 E(HZG4*j^nwo޽ǔіEsLEsL1=1I H : ^!H~nD<0X"fC$)&?>N-²GPFh/Pf1Hܺ";Y!]݇&K]u!!7m}GTiWWLV-[53س?[1vvEfR2wϷiLD :H\$Lc7aͦ1`) <^Sb]^Lkn9I˾n;v\@&J yY}xz m~-?6 g;fg-T#E"/9 3gIa oZ0:o}u@RVZ v޻Ջ7w:/Ցm^{j \{|@py$Z{VU3>6x OX1VowݺY$Թۉpj-V~RR #gS5|xs{h%j>ڊ`99udwz0\Ú Yk u_{ rgHRg.n/`5A endstream endobj 177 0 obj <>stream h260S0Pw/ .HLNq-A2Avv%%% `C9T-?(b`b` Mls( ȶ*(ON-pqI(0W! endstream endobj 178 0 obj <> endobj 179 0 obj <>stream h[sο2d<$q$7Q&[I؝ MA[tHJj=N&X_ ~bx`)W?Bqİw'_`_<]L~b]+C Ih1ov*6f <>b/  ,4(N.DPi5Q M ͑aH&~c %(21ThoA-FŹ]gOݲ9Qe9C۝]Ӱ%bLkY6Q_D)oK,|]CanF%stSNHKZm7w֊2嫟ct|w[OyQ$l|fy]ZmXNeGHhz}Wn`,gu.כ뎻P**_O *~Ǡ\nrLUӪ ;UB )_쳅Oi"s~,;*3[bP,CV-Ep~ͯbpgry(ΗfU^O/! ja3ݭgM?XgZ|`m(Q㢓*3&IJ{uҌ/i Nalc_N2{czz?rArzr$x+zf*JisF|>!w6%xU,԰/д4`Ȭґӑ0P:Œ%ŗt'y*iB>^n7 !!vtZ$DjJ)FNz;Za 0N]?ː #DI:@ Q̺7L1g`+Z4x!sK<4*Phe~~ XWoEܵYyZaf؏G{/ ~gO4HIJ,ao7=]tA|]EEigF1xL|z.8)5ړpwU:8i 0Qz{wp^/f7Nxw[4`âYT:2i]䆯 /ʲs'gVu0b l02A6è!M3,?Ν#iҝ轢 tkT_h3Kc|ٸu7Kt׹5:~9$fzp>]D0j?hGcAUn0s˽c(tx;z2E(wb$;/&֮ endstream endobj 180 0 obj <>stream h410 E$ӄH(K d: > endobj 182 0 obj <>stream h[Y~_! y; f}āc# ?,#qf Il^ݔȖHcGT㫣Gx,b& X?ܡ(Tro\B#x.Z<¿FxcEO}Z Px^/yraDO D!AbsckNU ICL:?#4DH`8TT B߅Q"`d kVPxFX#ܨ~3r_:1?ːs):9¡ Oi1 rBԄMưm`}=+ YsUH)<P&ţ6,xD"WfCJp&th}@ CP|pEyvd1t"[և|̟+ [Yėy,E61ŸQVp/1ت<`A\"Fvmi/S⯵p@ 4'6=<ݓ`BXm'MVӵ$ -L-xiDK@Vd K47λmMRMJDKҋL[4H|.Uxɧ: J;>bh"}xuOH /9>!%EhBOuJ*|x Y^'qMRV4(܃,C B$8^ v'HjOP$̸\B`If+kz]fi$A6j@Lԇ%TKwʃ.6 c83Yjb,28tT܇$bK Ol$)0faSV>FyCP<'fq c Qudv(1U(nFLJ1/'K]b5YTx 0Vx&9*&Ojrgօg:_M!S>hX|]e+Av(>Ntl#*#Ijc@TWr(SC% zx3e@'e;y==95AgN 9XdLs|&Q|+v78rSV5>8eܑ 3/8G$^3Hlj^WǦ+!Wt"ɝFA06P;>YP:> ) |&݀DCRVxk:]4;F?,u'`mDPBz~MϙN9"E寎/pfK%}tMy`j~Zߢؗiڅz78y_]UA/ | Δ4ϋ7)nãdkԶ7 66j̒kN}w8͗'O 瘑Ԯ=3?r)faOU7n[lZ5"V:<j YV!&V$E4aI/ʜ*SG}lgVl"S7:fQsOdNFϙwnJNbvMGț %mA=*{7zHHmirgV8D >BTϓs1mrŃC=*.>|8k(ncW1˕Tt1՞T_ eUоUqTxU`֩ iʋNᦺ &yĒj2|L<}cHL=0ARV 2Ĭ7\,BkJ;BjO$2!Ƞ %AvpP_MWCMti%"?14"JIk+,=/zYA\]}_|_U78v *4& :B nCX.4Q2bqc˨tޚlf !Ou߃c) ٺP'3u9z+ 4/m_,<-L)ydD<8Ւj\Y fshJ0_ 8 쳹Ai\:X}TɦL?1HC5NhHjvC݈pZ%vh#tqU 3\hp&IG?r10M '!<9:Pu@\&Kj=g`SLP;gvyϮШ1su>ѷmoҵ_A l6;:#DoqzN+]kqr[vm9]klnes^ofm_H-Ua{s :[NA\Z5vYu9f\S"9-SS{UzFu(ֹ/HAɁ4sr "}t3T^2k鵭(Νt!D}\ͭ GZ,B9\)>OZ1C^͔ 0rπ5CLF`Wѻ.>[WgG2nL֎;wt41+},VbY_mdRbxQC(CU+`AtAweP\_//5-@fnj߿/Zzwd/!'5i<|ܐ 2Hrx`㵄|O@zg*0O ć ~.Fکz{qůZRӇjP}:o 3o6v s S;|Z^EI =S`}+[Wm%h:tEzQ{]`nx]*`-rKEj!I>d">l!_Q.D=qyC~AJtO> y-o|iǴl>PmF(duֽkND`;Nj u\6 Gy=AiM8Gś v5Fϯѧߜ8@qAl4C}R_3sw0MY.]z5+ߛ}dաlwB|Nf"(9W* $MQc!*q.R!G?B !NboU[6EH@t(CF7*Q{Z(6(ztZ&W$ T%?L? i3I endstream endobj 183 0 obj <>stream hXLU h2DQXkR5>Z(Sa s]7FY1f#ilelLutMӍ4]޷9=F]7lg|~|=unazl7+F.r7Į=nl@V`ܻ`Yvt\=珯RV:z_Qno n[OSWf;;;cO(=//}Vdq7>l?~{~n>_Vݑ߬sЦ7`C`oZIj3&4MynB Qƈ,<;u K_F4a7ƬqZ#0Z0cf5no|zUJ[j:#!KΈY1u4;؇{0&]Xwgd݉vgv`ׇC&9y[lDy0ؖf-out5s'0qs;H4lrm )OXK/˥77lu':wUsdi_]p0 >/G~̅5כq|h#l]E1f7^5y6&XW\h}̞jQF:@s&bq8xMC>Yȶ1i.{ƭy!;'~8^0^I-Ιb &񠜧qv3/ƬKX%WPf `C;t [yOY#MVwFuM2c ykj>ci|iD!ӱ)qK֙ǍEy7e56Ҿ٠m_%23]m,ІSO^ 4cM۲IxVv@9ios=s_O(5'PؤaUkI;OW0[y}8}ywƏ$} fv}bo>밟N_e6G5\ ̿x"q"}T` I;&C~&=8I}``ε 鸫3=\ϩzTyj>'R"|M+sVuIWڏi_ѾM\8+11T&Ϣ~|vblp }Po3Guq.ս*SIծaOBkg_=cBpo*H/Zю(P{+mֹ_1bD7ttGUԹ~ز=?iH{Rͷò)+hoef{'TIU]I2ͮVn`UQ$ݞ5]}VVǥlXVxR垔x9O,0h/˝q)K! )qYd^JrZRl/%.h -Ńv~\XŃk kQ*qY3h/$9cp"gPr[ nYd/hErp۠lZdz2ߓyq9.so s=) ?.>OlO,O3.]L-CF?<(=yGa+l/V̵~{iՋӫyq[ >Jzþy(,1n7F$ 3KPq;3 bxFA S2RGswwx֣WEʠmLxGSyF$ xhw(Ee{ݪ޶tʕkʽh,, uCm]Q5q6u{piFkKjDBu-&[sFݐZZ;Cܮ2A1cR.tE*QXɱs\!JDЊ:QZh{ԫjTqJjvϊjIh%=ȟ- rTsoQRGZmɑ'eWϸ[Y䘞o-ڎ8ׅS:ͅ<Ӈu? sYwFηkn4e_Jѓ^'2z RU7A endstream endobj 184 0 obj <>stream hLQk0})TY6B ZH~IZsw=4 ,dm %Ʈe %z#G5A>ZdINNN~[T d_V7> endobj 186 0 obj <>stream h޴Yn6?PY٥mi ȉVvee^c#[Js!snы(∢h1|OZbQ($݈ѷ]h>(J>4 )>k oJ@x|0'B, J5W#ɔ$kF!ʱ_b L1( a& "b [P55!,^&aGѹUXbXi-sMEIC fxk+t6t5@#$pEX޽2~m,oD?:_Ờj`D `BRGnh`iF8% ?ݜ[UrKX-<幡<3@:y۳ӷӳ=hvEm(+04@XhK:r!9uC.9âfIva`(B d5U(Y2 PM. ]ϐ Qa^1YQr) B#T<0&|fk4_Yڢ$<Ǟ ]vκ.벓+vd=Czu\%M'wZ{JfL B.zmBU(08z;-i .y$h+:qqq4($Y t_ O^LDWG|jA9 X[Ws!{Nk[k5ؑ`I:r˟%tjoFG?6폢%|+.ZȟF%4;5,{Ij(b~RLŗ, 缲WhpK -Pmɥ }-_ T[!i{ 3?)ñH^KF=3L,yϳ4g(sMygB֣y%a5T lgbAFs~8={O`F!#E}IP^  n Fd<ch omA|- F= 5-W묃y$4j(*g'Ã0KLUz_4hh%A|ݲ/F̶]^ tQK+0;avA^v)l$rf̓尿a iیCݏHI*\W_^]'\ΤrMцcMi߄ENmÒN}:3Xoz p_{MBU^Ժ ]lHW>U gup0$x̖< 2D &Y8Y^u:jp`޲Krcթh=Cqw> {;lu}[/&a.EɃ wx՛\VmpUխ7" 3򮛂_ίΣ~X,nBKMcaw:/>xy}4P M@sW$1+cSSzjcS BBԯPaPMVzUdSb۳Ozrb*'5ՆBixȠ`'~lu endstream endobj 187 0 obj <>stream h41 0 EBSC6YCt[K!ǯ B n/y<'^9~Y9Ү-\ibBj vdʲEb rL.'c 0M. endstream endobj 188 0 obj <> endobj 189 0 obj <>stream h[rFvaJhlwJy"!1 hAp MrhP`ɺV҈9;i{@&)H?\Hr!(KOMx߯IӔݼ Z Px^,u~ouw{X I Ko"$Uy0ל&/IǛ?Y )  BJ-ÉZ&ISLc1Zٔ{ ڝ~"_!^ǁp"V':%SSP|u2"OEPu_p蹱?TDe e`}"ceǃNI`=x/&';RAu2 Ezp%MfڨhKpB JizJY& 3.J$d'q՝j!4{K{Ze*c0&%:ku 3xi+]I)iXtQB&܋0wUc>n\,:WI؏瘞`Q6k*h7&6)=U5,^Dx2vr%iJF5 fϳ$=_e5ڥ_I[q=[D<o)=VhJͤUA qc _k/a ApW5yT<4O${ %/Pat ]3GIq!K6!/ xyT2$jY헱Gq2Q{W9C@OBƌC\GHBؼ)|( $&k0 ??y^ZqM֌OyH|ǤA\]T5:j[1S KrvdT\l *pŌ ~fRs^$ рS첧<SU(Z YB+#K{EBYSx(ݲ?Ȧg!JB6_ɑămΉȄ4~22x䮌Le^T6E9{؎E!΄q^&R&8a ú`(sqq6QKQUE:n|Hخbj }V%=aJhp`zF8| G7"0zF=`ظ.f}DP ;,}S*;]]J|M1I c*sI-uk::x.V͸AC1QP|8uf@k6hZ<)CvZmSdRc4"s>sr[Xl%ױy<%r)࠺*+E\kqVۭ?jq U8-#Pn,1΋q bmpDF8/,Hr v-m3́Gؽnɣ;" :}{:Bמ;!y$+VA~i nH&o81c@6'XW1JѼͧxlȂ ;G"(=W*w\9;P^ůXϦꮎlgjdg& Zc[Ue!$f69ak]d"H]LjUba p WeG;yx) O}"kX۩Y2JRsIYnV&$7!;}o tNHob*x12 %esGW'd5Ы WLdlKʡELk;ڴ; :}($Tof.LaoD""^G(ށ7'nU1P['[@yBy(+7`sݨC<7'X8qP4אJW@9 u?oXe<3uE5 =bB/n : H&S~EF~l*Z@];q9xWmLq$yӑӠ,tz  mUI7ͦzSU'ozI 斫J7pPTN/- @I 6on7?%v|Ց98rn ƣv[!nx檀o8#D=S(huݾC6H;># fUZ\BD }z֏;vg^Dبk=VmR|fx(fkO*BdJD*E(C}04^Їza:-t {QO\"M &-b~} ށ( $oJD%甁9# #` Dsŵ >?SGu̝Ni$fxǻoހլ>_&Y>4тwoo|(x=b6{O o;)| iL'?St 1S<+Hn zJt;6G]]CW_RQ/>pA48{ f;|dgH `pHf},꽿n RPRDc!Y, 1;wm/SmpxoNnM;N : T89(e6[i.ea^1rX>tŤBrf ukA˷^ÇϮNH=RֺFhg%}YfoeLſF!8 _1}/թ+e^ƛɔvZ{ụR;6XΙ Ҿ•Z{^rifӭy$0EG e7y\mPMf7 fkh_LT)9p󪙘+L8tA! ۉ3v$ĸq_YK*R.A{ ]`M. Dq[#7t,k !eƗ \xSW ~6v׆ i3*/3CYDk3S/c &(=ko:gq͕E#.tcۯʿ Y2>L-"C c_֚uʼnĨ!"w6b]w܎ʼn[Wp,#,y]cC$JԇUs1=ѫ<~2+@`czpsJ:;wv8 |Oy:AH:81}@RW@wcfhX}SԿt '晗0La;}A毭:*릎:u^6/.mX̽bKY:<8ɔz]+RکȤ$c3}-YdNIh4Z{W*+Lɋ.]&j`ލ2EpЭ' tz^=V Hl*udֿTMp t0Tkm׸L7S'({DM~=DX0f{ٮ{ =lu "Cܫ4 >.6tt+${i6S> ]kbH Ô7] qxTS=Wqc$NnמUp{kAF3a%mbpa1_ Jϼ2lQc.zphߎY[n^ Wv ߫,̡@G% mx9w"e̮#rxȽkFmu}4@?OP  Hؠ>= z@IY=% u{`8C2/:3- Xd\d?T19cu֏B0Gr-iĠQ֏.#1x]^#4%,L! DŮ >z!ᜑky&RM" *!Ӻ߷[`P!T&oMftXkdͷv*?ydG^RcsXR0A8{=mWtf+:<'!&kI*=M(7$DoBwN(OJNGjzbEHhw2AW?7 d endstream endobj 190 0 obj <>stream hט|||vvvԱ~~~cccXXX[[[bbbnnnzzzsssppp{{{uuummmfffhhh߻ǯ}}}kkkTTTϪ빹Ы]]]ؠ˟ΨPPPƙqqqSSS\\\rrr```ݩdddRRRQQQeee濿aaaKKK򅅅xxxoooOOOѾ999555gggVVVYYYZZZtttwwwyyy^^^EEElllCCC(((III>>>888WWW<<>stream endstream endobj 192 0 obj <>stream endstream endobj 193 0 obj <>stream endstream endobj 194 0 obj <>stream h{_igrQA.+&jR%@"""@!:QV;*1f@'BWbj;];=]5۳3;;;J<yS9~>=y{~GQQj@apk E [@[\RZvkEye%_E  Ȕ7 dAK/\TW_{i}YYi. Wja_oiVUf=Ӗ\z홢k;wޖt+i,i.eSoBQA Ad *i5< Ri%tt^` o|2n F(k3-*uԊdy=]9]7wu-#YC-IJo]Pu~-Lz;ޮbvnSi>sfԖĹlO :hV1d, @0{Cf`~P)$/\52E_;Sw*B;Ϟꔷ/IxQjzknOx%-b.`hI!V`B}HNV̘R32L= "*e.Pu^[Y|h<ݟ h 7!h;wh;vxGs 9c؈^e$jk"W8w{e|ٱ7:W+7gR㎊6K:؀1%O8-ZX@ (㏮42]62&G= P_[7T8|i(hh׸i48}sӽx1ޮ1`*s"}ݐ:*5~ZF=TUm# =D,b:Єtި5! *v0 ct܅FkDNҫE@W0 *[ $o,MˠF-&%:. S̈{XΊԽCla#^UTEpJWQUv,䚭}`O,w[7ߺԕ˩S>*IO,Y^9HzLƮ{1"I6Լ:B0{Ddag4jKײM>S؎W-ڊʴ*@CoT2Gb[7?i°Lv?[ ϳvJxٰ/^o26^Y42~MKY};2 M%!M=*lʫ/{S}nL ?]ɿӟWVvO՟qVM ɲw#;?(^!Wx\_X{g7=>ի_o R0Ŕ\ax.հ&PWoWßU[Oޗnwnſ)Y Au{w%7?MPVH{5KK_ ޹'2 y|F Kq@mU|I0Zo, +;ѣnj0 ۝eb-UDpd;G/}^\UW{=wޕ ÞK%{?_K]2995gwT'_zf\"ܣۍ$[镑eWgt}xaFKcR纽 ^jnf5).Vymu炒1<2q* c3n"F4Kɵ>uu$Za/12~#k?\,Lnyzj#Q7%ͽ3>װV`>Q_ܮE$F ^^ L=J_u둼ך,YR{q| R}뜉"mm'ڤWyޕI0TYM)/GlU :M1 MbMh}Zc{ ^2^/ G|/9iD2R/x;d `$)t/>{taK^S\Xd}:?'/"jtUCvovVkhN$lw$+Wn>&]>5ஹwT|/\ חiاa9fGNrjS`zNs/|DiE fi:҈hZ]n燤Ϣ4ǃevkD64|_?(0vXDSȉvb!F{5udwꄽ ׅ3a``/,2).ml28mq9b-JAM3_T744TA\@\@c TbiŬ9?Lޚ@O*yAOF8{foPɡANbC+(Qݣج CnE>0*C)/09W|Aٟ`+YU;Hzi ]7Oʸ/[R`A NB(*hnR $]Jj|vĤnIHTWb⦭(zsٲ¶)}`B.ђ-&PIVm- j[ԴHo#w~V񼫰m/B٬PsRkjg#dxrveɸmBD '2V7Ojt'iM1ޞ@q8&&#;CC ^e"'tAt8,U'$SNIBU 08\n^+j64pj&s^-/~Ylc%A/v;hڈb>ZiX6See7xOY<(ç qғ MK ޽z;P!#ɡlJSYN@ y'chN탕|ɎA XlTw]~T!T%2s0^UؾP 7i ) N:ۤz}7۽ C 8 ~OtH8[|=A5^XvF6u^Y0)o_}8)c=nzPp[փ~CQw;^|>eFk.\\"v'SqJϴ L4g rL"W|3ضT>%BJwuJsMmnD<oJ2=xVڐZ@'v=Y(k>gB^4U3"F ' ۼ!5UP:bA?<"nՄi"wN^,8^6vTQR\Oh ~0y3k[MeE Ec澕AoAl >:"(a_,(nv?pä&;Re duR8G!#5l*|Q +8j lfC#\&);}[-)p /kEԑ8)/j %RұmA8L:C \D7{;v= 񫞜Z{~(nF A5d\1ʏ  Eܶ%AiWȎS1dKP}.%"EVc]?Ҏ÷c?ح"7ch쁁ɡr|#| JIM8Ġ7O<]ft&W}Xnwj'< 5<특MeUkHU`ؙ,T5{ "MlP挳\<&ؘ#S<=>$)9K0mo&ؽ!=8u%+XjvfndU|CN24_GƯUNĕMMwtXW lg HYQ3?R0asD,ؤ&0ܟH#%k,ɽ,Lf{c4whae#-3K[q҆p|":RF2c+||2 vٴ8RpmXe;+&{"},`ЃGˊpotxw%*ο%XQK^os9 1S YvcѶ/LTHQgrZv.%Ƒ\>&C;PVqYȑ`D#S!1gG41-\;*"oNA 2ll{wF̹B#S/so|=`Tܓl3nJ̛OG bpJEU/vǁ@t-q&{*ÖE`MZf33(Q`LQ$~O|[IR8ݩk6J x ewӤ|A3Tcjtg:@Sx14L>3VV2jX]T9jGz 2FQrlvjx(wN.@֭@Xkj(CVk"nRŌX:80L|8@eг̐ۄꪻ=PSjsT&ƞkV)|D9s$H1 þY֙^g":F؞gam%%`ad)uZRD.&c@+=F- w2v5Ygy;f3]CSVbZp˄<I.;AC cFAtV ut`s`Ϟuu1o7tZc+N c8$N;BtVG?ʘӎ(؈_̽G6ƍũUZT7%j X, *ߓQK@t F& !m;WLb^욯5VW|Vq8M[a߈rwA~qyVםx<2~kgk}ov3W[`FX}PWשܹ%|񝛳7u7޼SֳPq' \" ):Ms!kF Fcn]S,L|lV{kYHjܒ1FweO;Ngn_ ̽V#sIl[Fѽ1dp3)%ۙU崓TDh^*'uTW!(zlXwCsdMwTv0s hӭ @]eN2vg[Bw;kO7pE'R l],96;7;jBX4~h 1'ZObIY31U=[ZfN3EJkV6p@֫M*F۲ƋI :e_K2~v$ZQMqg hS>V4mdd( K\c}3ED`EEsS_unM*8+20!eã\7bcLzvduƗ1~WB^3%\dwr>U{Z %7sCSƁ*ſguB]%i"2Ngujæѣix߽[ `8ޝ sE:[XZtνM&IUb_ Ѷ+]>8aMcC%lZ_:~< M v rFYņ.ք%wkZgwB1WQz;i#fTrPڧ[ژ oFG$'-p_`bd~S] kQ2hbBqfM%YTʑ_Ubte@0u_v kƭ员偿TB[4w}&.:O3E|b&2 @#ͦs&]b'&LjDp</7 p/Ecmmq7|vu'ViE/PC|MгPkt5h ++k%{'2*TwWOX}0N'2 YbCN>EO{5_鑎KTԳ)c3_,U8.tXQd#jjӲZ5vJ gIB<%XjۺPEG)NS3~l8̮~ &v0wv^B63IjgB]ɉ **i`H#RMt'yz +5˩ CdŠg?%M.):wA1ԶSqp| l,/~I P*D5 kV*ýdK_/jr4=Ӈ>GFک {Xd~-f&eZc,`g2 LI`K3 j:OcH8rK\ TCQu hA0n]cernjl@5+}~e5qҲ]=1jKDpE=_6r<)޳_--O 3 -);9Ia%ז@ z}*OR,~`[jIWu1D:}ڊ] N( }I? gB0W=ooe{8rv蔍H@4- &gVHy.(%ll$B>nA]}gpԌ_ClPxv鷕΄`|$pn f HPY;Wwmf@ PV`pȘ1cEӣwͮ2|tl4<_;a/n@ gKNj6]gBiaأ#dMU.O: /bJ6eQ9o+3sZB7Yyqa'’-ւ{T'0#*[ͷ5. Dʡ8w}UQ>uu89P*,E/"TdBP"?s沟  5!ŝ}`MCGU#]5C{׷梀)E`Ȗ [j(>y(첋NODpS^D@P/r-!ğ8t[0+MTΆ! iV˞`n)eXzsKKPg3^ r :j@0\4 HEg@bLa*^106I&mL^tmnym/izIns@s>=}GGXl>RP].A]'HIzћͺk\+_~=$ l@ !ҡj[?r{uwTka;`7uv+w[x|?`4. E&0mAoaKx׏Ā w?[_ʚi^@KJpC{FHB+%瑦:3pX^)wY$%8sB Zt_fs@'SKF8|M)* 1f!00 =2+f)}ipL\ӥKRu IiOO)?6Fi{Kx .$V 7*v \s~ݞ;HlE0(){9U*Ҹw:aPݼq/Pͺ-1 ӣղicb 준9 /~l7qs APʃ[l8nv9Etl> V:CsDm*,ՠ_|鉙q󅔲n/E=T׆#l^o^&~a$,v)ȯkg-ʵ1uOe#` &XwO<\i%RTPH!=#̸n*bc36V.z{gW4miI`3_;{H6 A*'6 pAMwq!F[А@4 3ĆB 3tT>ǟ/8LNhI:we`EfXK ?R  P gy;σi-N64dSTEܼT`uӸꮔefVDI__G [%%L NS6~wV !NM)aXSІ! ?t[6oQfF: >}+3)( ;糌󇃪T-qV./)aMԴFtr7_z^_1D v]p9{CfKma0P,i$elzI<#Q_\]9J|RGE!wt[$ɚ JJi~驀Z &5#oނ9l}ǖh! [_#f&+l+7+rYt0Tzc>& 0j9Aٚ4HmzyۻۨQQ~-<۷6rB.K\"lAG[͌ȧVo8"$zML6wEBq*+ ƹ:bnn4X ĕV.Z+%0JIDp7B @'vӠE?s>o)7CGDCQ9k/`U+EA%T גmz+FB`m?}X?3䢎t%-8)~=Rge; -#g0z60 oVD0oxlj*j"$KʆZ+OFiɞ1.R{3K]al LW񗇄3McGˇUa?v [עi`$%YB~Z0.pkzs%`^wv;V{ dUaƻX% 00ol2HZv iDS40" =O$2[,4_ȥҊ,2He;ʔE䣣p&h=K&*l_8晴NkooC렂4;94FRi@KsI˻ 7n|J*#3w|-V2GgIz}^IE?Yn<5Cz_p~̶QW,[7aMp؜躳@"u}<չ;+Eٹ%ip$D0.G.1;= vVCaVu%U@m,e_Oyϕȥ4jxS ˆ%C[JU51uZh}<íAfi Eۜ%8n^38Zb{v_ ϔ;JbA >f' 0}x큥KԼ9\>=k{9,YP'C 8Є O@KJM1_k , E ͅkt-YvR-w/Njx`G]ry/|#/`kȍcKM ;'flrLQOΐ thmvcTیfNN[9/sjɕ)Q6`.dwwKFF` ٺ]2dwbU0v(k`2ՑUg5bjG)ШOJBgmG 3>VOŌ6,6nB;\GT-щ.f}kI` PFHg[Ba,urM̆a\k`` csw(DNP9%jǴ{n fgb$%O `w O|w}:F/SqlO-W3(nfvX~>/f{#T>8)0I@|.x3E`DVvV_VŎt>W2d"rn)]YdG˵)/ϟ$00U7 hSu['j-CdjXŷ33$^5^&AO[JgV76VK/,=Fi~M4N2K34{쩿/ 0Yݜ kj8Qʝ-DҎL4vG\,/|\]c%/q:Ko_ Y%govs,][a[>R HxUˍz[jU˖P*pė4O"Xkfe"Wr =򝢩2MpV)C`tnD6T`d}vH^aU qLyW`qE15&P^vmĨt&wfTGXW5}Ԑe4XپjMA4Ϝ+`k{;>Xamy%vuU$S-HM;~/w~r80hn?TY>ѧڽ/K@_|VfkI>"cU0 \(-!c+sAu??-@KFZ@Td晻M,փ+%w4ckF Ъ0I)VbrW7 Len{u._ЦͶ9nvօ7*FDGԥ5~qKb%sn75\==lK,щ$-.AW k6Ț)UاP￷6Na6ۺEԾzai҂/ƶLl;#C `HxWoj:ȗ$*Lw?)-|=!Uշ4^S<~[/rbѻHd6kϰLWͩ𥋐œ#MbZ {\ѣyÓBɎ9`|Tg^+iwDxn!$- 1 @>7-sm]MIȲy;W7jK$[N -aݩߍsׯuD=:nR˱:gisf1O08^/z `V^R?{h:zRR[L#ҠE߿w^8k;;;M,PغZ5}663=bNvNvSbdN5u+|vQ/ma]#S@aq,#v~,$-wE)( UJk2 1`#|ư??yɇzƍWnTL5쫞bI&VM&UpbU\S}swJ/5ٳc=_2B?Ef? Rpz-M5`}˜hT35U1+[!UQ֧3:w%Hcg^m#p?"Ax\gt} 9D7]d)a1o zpNfW㒌a!|Q]-% ;&L^ %NU\|@\|읊ҦT25539k077]j4 b.n8K]F}/?`4\`KK/x~]8uio(sU/?xzjȫ|{w\3TxS^244ִY~@w3|/~};[ ODK*{0vNWQ',28?R?v@̿$nH]!#U/W| s2:$Uby`)vqZBRIj71/jgsRD+L'V0]TUw1QS;Kܸm")i͙1]"7gʯ > *`kPR `= -ŝfGYG"kcLK]Ŷئe/m2֎K_eRU6Jv>J|w+\C%91cɹEFg]u# AAeS`U̧J,q0·b1rRɀ&$#yx18DFD:(u=hT^IL:lX>T6#8<.ׯ_~<O)hctVf#vwO-c_H{a]zJH[ƈ˶[0Q pu FkpƉ)g-Il4ȏB׫WB}XRMdÚiܑô=78Y.>{ | `wr>jL`ڲwhnG{rII!͂(`j7o) `h2 lPbseōz,Y,vy)=ad?WYP`IIZ8`}M JZ ~-h ~r:ۓ}{xѺm+c}z:UgO1 |q ,h7n.YߚuKۚ,cTp Cn+8`KYvNz9Efba÷eWCiX#QGb'[ Kg}j\KΛ TΚ(0CL2ݼN?q֑Q}ϏA̶^1W%ڵv`^J\]"\$ڑ5ȕB!1>Ϟ_fq/9YfCJwF eyk >AZ* K9i]@ ? aXae\aϏ _j_Ei r%}\QƲVX蠨 1GGrGH6 0'Sk '峷H#,Y7DqU6jP@'4ylO}co Y& 9|ZV2SPp0}ig*JpAC11lp{uQxWνh>EDÃskU gKM6&W%uNa×U %Ѣ VkC']ꌠ{1Lv z,)ɖz*;mbUXՀ0=T J{;;FdY__9([k'0G< 7` UY&4}Ffuy?$(+Q#CTLS `Y8lyAKslUC6=}N-9p*l+H#P'a\_G"k ؍P/8 pP@7L"GWV)3nB\ЀinU{xItw|8uV|w ؂[m/XZ%TT>oe5{:<' abUߤ<v~J2B7gx4vȂU996B`I.L ˽RL C_a6W\VQ6?&WpB sg0B)̈g ktJ\^6IU͢iʲ{VU.Kan*&"$0J)3%k XR-[~hVd58x>TsX0p=Us4͑*Nuj]EgId'tQ%⬇}fT j{ ª&7` !s+aFAUڡO =q wQW7ڷC8!$؞4׎:-R7$a 2&` rff-<ҳgI;HLuc /Oxʄ =In^lm,꡴1s6{ O Lgǡg4kx=ca6#Ymb?=.NΌ7@d&ɌNFgp p2E@A wrу0$vQAb슚iTqOvidkfӦ͞O'fmO{}uf/}}~ZT O ؚlSR갖Bw?贙5Œ­DZ@H]re;QPohd`yC yT.Ɏm+gl'*qpOgt)%;kr9CNM6/ @_ك ԟ7aW_qT8t5H5-a}L~0ܩHdœK›3 0o?_ ЇYmu:'6ߞ'R3DQo s7fA[eV4y z~|V冇] S"aGݝxfF#(.kR8坂TݷK7M!C/S dG]Ƀ >Q=vW~W^x}si^n}U2b~8-lzuE,kf UN mwIK0䎬|]r6TLG@pXh+PɃ2}??}8- vsA,5Dwg!ݖma'- [ Θh!(cpLT! HPXyg&LhKTBnN~RF&k]w=bP??0`r SJgdź{ Vf*Nj %Iz$>S `0F0?/~$dL<3ʗ|e#F!)q__$aE$f8+jMC)=S ,U$< h5+폟  m|_G Z=n 0?ӈ' F(4dw&$|ܳU`V&G+˙~VX+a9 ۫YӴPK¦ +Zf?b=;a(,Q5tVWbfU$i1T[a=<4̻W/?V 0|Vm]v7LSfrM#O@2j|XCQ}s <DPdf E}3  0lQR< 7~H:JC eb2>S#𸙪 \w1$vLRKRrtP̿Ւal}/^8۷;%4y+^F`b7`ªkZ4T#Wl{0&-Eԃw堼C#\A7]tlv,|ݱf)5ccK jGt#2/4V'Z1 .-)URGݻo4@!`k^o׳{?do;f~1w5Y{:^@?h?2Swoz~fgL6gw )gdO@?{2C5})?Zc<C6L _{C"1zC ^~TVPKZ+!zWig MߔEbC绂=*lu*%`ܮ99At۳Mkr L C_UҡHW>7]^۲1&#&#b$ȥ33y`/݉L?2, [U^#i}ut5yTE"uv.w/oW.V `?:)XT*K MHBxM6ۓvuGFe^X[fWNz|́c7յ[{%/$FvWy'Mz#e[SKLL?_P"`h}3s&7ͦ^V>I ΓAfqی lӋL|fCq y lKM}&FQ' K+LؗQ1Vu ގjN|X$/0ҝ?gz; j0-t$a.= S{Ce>z#+`BmY$wx)Y:.#x-.U~(a¯*= ټ#@^vHKڻA-#NFud5D]Zhf W]V,#ưtsM.*=̌ɿ|a~n~͎E*OB=,қ_=D NF:!YQP9=3Wt䵗ݻ]H0Nӝ|5R'=䱹NuKP 8O|jվnx5Ċ`"bb?/ڞNrD BHaJAv࢚lsRERי58ox`ۥWYM*W Frcge 03Öʐp̌ *Ji|n3=R۱}C vnWr鶓oxȀ]^6F2}2TpvtzL=&`<ދW[)8mضN;XmT#jѝmKXY:RllsA,pȀ5'f>d IE}dW˂Vkh:LWo?'pc|}WAETb,6W|=xO#϶  H O:{R@BbW΀` I-⮢)X 1l$Lf1;v){7-)XbMDfdrPU48#> Vo}؀F7Rzc ͠sδC]7$^W/8,wo=%m{HVuVES0UYť3PRT?d֧?.S;m`d܋RAʐjd5m鰴! %N3uXiiA%iWXvKҔQ jdNpVؽ33;wjvopT .q`0cc~*:ՅѺ[R'4WB#JPpϺ VZ 0lSsztw@@ln~JZfX|ةrĐJ`H?ӄ0荘# A<ߟtj-9&|߀yR'7@[=иR!#J 1wAe0ygnN#ZYLH,47FMkx7oK%`oBH4`02ᱷjn2MH~2Ov[gZwňu^o?v 7bm;Ņ5Ky5t}4&+~s}L|KU[HLNM}5z V3/ iy?OBK $-ޡ'3c~ *ձ#btVhfYii˝,L]ڂ89t$ 0V?JBp\rwL(b*h`0X҉7N<)r3q[~i-ȈO_jL5:P?ZtB/ W.?{=[qnȸk%,:`H}'0\ \ݛ?wŘթuqw>WON%_~ι>*ϑ& |b?Kb.^WO!Us{/b W??%e, v]C~> 0d갪.$M K I]3,E yΉ'XITX?Tq8J5ān|Y-30|)@s/!vc_?{ _'^~nn1{W>R5qY3>Ns^IHJV"p܌b չ8xGcNwU ^1Bh;TssQ_DN4/L4Mkލe/xZ#*`79Z5ʅz#*P7G%sZ™Y:rh Ewf%Y|yS64i9~AKwjL /X$}<';l9zFBbduGW(9$+:|YY\A"oklL;N쎄ëM>ACʿЮE!w՚&#LJ#8_x /}Ka )irlX/؇GG0@BRIP˦ A(e6a* 'R*loJP#bz!Pa;YzLc\;/,`tdEg]GH ruWl9cD5Yi-].JV?@5'4􄩛8䨮H|H㄁I0}^.ΰ7 |z;Yݰ56qDؽǶQ(3 E%G0?tÄ2-㉮ IT dUq4 3)`=ęXmؘݑ& ^_~vJݯ0_{Ϟ.q( `k_+Af~{/xy|r;سꪑeIb0ۓµҸ3{β^ yk\ღ$ub)>`8{>x'i9D9acqrk}S8;'jK"A"M D$IA{Tf,]Ӗ%S2loẊ8Y ^qDPܝt$Hd #ZRKfy$" Jd P4x[+L XIO5Q,}[`dJ`ɟugU8E# >GiҚkT^Uv]<=3@ +O@wA= `*du<ט c 0cNdʱ~0a==/[!sf8 Gtr\+qIPNBQUT2g?Dk 1Z&ڔ|B+.X8-ۈbMK l0@g {Ԡx 0 $7),'v抂_ϓlp%vgT.d(z*hY{N%y?p_OS-y nt͍=-U0./,Z9( **ߢ-N+<a:>EvP "oggIxY!mL`/N-1RU^!L~f$JLl\Qf\{^`%2X^dX3c&ꑤ,*/ tNmK%^y+ġXT Ҍ/ _ |O5(8p,x[5xn!q.u'I zͲ8? ]6[<+ZSep?g ]es˩Ջ] {~wul[$e<㈜>3>'qݽLg;[Kz2H F,+-g?#'[* #bdr'h dG VW٣ɼ@aqV{ S{Bqqw/`"^pi`&OI(5\ݚ0ؕeV.gs;[ɝથkjI{+=XV''0bwO[:\.\t4<}ja%{RpSF) ?F\ C0+]!VTvt8m`qR+˭VD`Htfe=WjM$]OoN78幒%ΔJ_˷d fS;7xnfh+@}CRܳ}j5qM?9L}pL 葯\kj71$?t3[2옍%T̶n]Mvxj}y^,~@{Jl"V FF BP?HШnlb4Z2=Ƀf f{}ʂ,^$?t[d-D=AžΕ(gĻl ߸B$gf 4|&InoJ]|Lb՜Pp,19˪1޲~c(BxZMy|ۮ%3-̕V=Y_ NYnuTԋ*?Jec )C 0l&ul5rX41תĻaȫ4u-wD[˼Mj Of@J昭tcXptNb}LXυ/v +/A\-߿Hu?>AOl PCd2b`ր;0a$)±c@ 3wJ%Ac!M,Ȥaw~q1ŢE1xL[{'AeVJS֧_CIz\(fKT7Ta? 0 9EWkh8ݸYFd?yf)C\bFu30XIh*m=ډ]ܰ) 0AB,g,:{R#a[Esjk[.ƤQπZ_ A' `0XQdX#856cVXNj]rvo/uJ[[G/op6cٍZ7nwd*@.W4CbRąo?RD82j|FNM61&L4Xђ- HY=hl*{hkbњ2d#olh3`7?^[tZ0z;H {]0FsVWv͒ue4w{̩8,yzw3DJ6gpr/HKyEHC<5HEIx¿GaE$qi^k7#lg3:kfz[ s ՞g@?[MWj*р5|Bk%0 `߾e17 w >_RsZ"(˛);+Ё 0S\He>pJze׶Q)iހۉ`ๆq,3񝇱L'qi$!Jds} knS˸L6 )|eϢ?VUMI/!`䎮~tNt-|+*r7P#@Y^x]++}Ԣ7ߟNHvcθ]{{Jכiݍ u2 !J"t ua9~ET] 0՞:Q^Qͤ3tw?mf0V4X}CMf6#1"(Szo}ڸZ C m' kiJ-zP:]@a^SO6rzNޟ$^g[p9 /ʆNJ8/M2ߖ2vyxrk-*"P`GW{o&0T?fd︷O˃u/I}m0[Ư~)$B-z uϱ:Ay-L0pQ7_Qk=r\葸kdIʼn)աΫRnb4\h9j&c{&cd8aB_ sNgv ,/^+EVO0^o*{-dd"̨ʛ&keM*zH5l0 XdSWNe&cbb=9#Φ_e]_CvȺ/]Spǧ+);-dDҒ"aﳽ7|KI&s>#wTsҧ.IbH\"v r9kZm4WqDDy^3à}~_ډ)Uvjw ]y:+7VMVSḓlDt;N.?}pUo~R. ~ݍ*gxϿ|h~>-_>XBMZ:F Kmq]O:#ڎvR yq\7 /ϛ nxGSK- l21e3=xZ0 QQrdfJ},OFc~oVOo\1t>$|S$Xj^3 `=jE1E  CZKt"nmͼXyCee,i5A,f3TԕئŃkv[ 'YYu' )Y]:w ҤTb_ DHZ*.P)hvK} \((.U<Ɵ$+ϴh}L߽)}jxe/?ѭ4ک 03Eaa .d лfM먐C> )Fq¹;>bu]z;]7:x#0Mxs$sQ'!u^?qvKy@_  ;a@ҾG[$+`m -S3*:BO%S9~ga`ƎR6ˢn-GMjob'++Ͻܕh7[Ï;zXP]j9HkJE̍-,,d睿ǯ;#U Nd7.gaW%Wѐ3{C^%r%D|X(l[&%O`C4zfErj j,d^WWRF'1q8>.G>|u|=qblsd:;cn{+]{S;^R1V|3^|gox&7{|T 'LWoք{8Q^,^`ϋ\UE22m/آ-: ̪+;@@ ] 㮽0Jxh˾g9~꡷.혞p-1S=29|O9'7=|E]k02n=W_~qɼSS fͨ 763M뒯O ;vn7ï9RKAPՒ1Uj~p sZ#<@HN=w4|m7-}/DwBxtwtCrvE!H,vZդPc`Y=Rg-&" jn18}|QZS-Tew(qO*zWgv9Z`̳}A0$M4]EF{jAu_gJ>}3Bӭo`Sw >tWIQ<ߵj'S;ltEaqgv^w#-0j>յ6%w #]YsN]z!Qه`6myxPPUWrh.ܤIuڜ2vJP~%k[=fH^ tl?;+6(||~ШDNi@ǽK[D .ɟbmFlTpI<5Nxuƻ[X [j.͕sՉ AL)ww&0RG>чO/U1j*=AK,ya9ˏ"BnVUdǬ/)xuu~>*ªZ*1;](5zqѶ( a%TUbv&V^0ÎJG pbFIh!oZڤ{F[Xƻ K~_l"1ySK[!0;?4WZ=]Dby숼QJB X $sS.tIڤڡQJXcY#y3;LᩝkNwat^lc ͯo߸dHF0@(=bޟ8-0@}%_mT8"/N+k9ONظj|(d\7ks~'yk7N^qU)18 t.X;;bB<t\, [EZBa65`Q9;]c8mLT{9 h?|}#0"Y ܛ}qr4?nY27@%ʶۑr3w_Cs?=_9H+2SM _/69` ѩO*g`c}#PnS;S]y/T 9&,*0,~y]N(8AS) |<-:8R`q?8$cǏbI} h])k3iMٶjvE4,Tl9̈!g *+n sS]iVC@K 3[$2M/yQȥ ߾q6ռMqx-iVDfZMfE㧏sU`0?ewv:8$:2k+))p:%>╫”“ }%bofnk4e5udoqkoWҌ1B`l$VϰZ)(@/ė_E7.,yo\23AB)u>1q+}:y U\X )$ jZ}Hru21V.&(| jEin\{ 4C#&0,tIpFd>4n1NUUK$e|~rj;>͇)8Xh!$sצ9I֣kC#NЙ]7:j>aH ףTqzjGx@\X`C\#9VC.A䬓[фNa6i'/o5ׇ"Зِn|aySizrRI ,0JsP5RM/ܬQm:su'ǗdM&tSfJ>u J"v1qN+Z}"R lY)c/wuZU0U/IjTB >Gf/s,Ymՙ*zܔ=Jd.1/%$?GԳ8Fe cʸbdk}uT%Z˝p.9\ܙʞ_}=sqpE[Ci )Bxo|)N\x>Ɖzlkz_E.% 'i**(N$lWy?BJT;@P6?s,i/Ѧd ]))(g) ]g Ļ /-U7PD\+Y^I^7ܞӟ~{n"C0FUEѹnAS#-Z CT|.jitν୥AzS%R LH Ʒt[p^aNMTu7h6i!*+bQl ģ/u &9[cJ qxe x",h}|1./ELr㸻FiKbl~.!KESp_Pݥ7{JZx @ů0l &0-R}p .cq l ͇f 9>.@Q@! ׭-EZH2y9 g6h>U| L줱4A bd]-vulmO:pI0g Vk.jB. u bA@c@`D]kvϘimp*+" $-=,0 ,n}߽"0,HMJx~h Lԇr-OUBqyE-0+bIOH+^2cr"m,T4{RoM`6E$[kpTj(KƦ%y{Bo!CdqMZ "qo[W7dFsp0N[$jpb "}MFv'>R[+ eK& ݻ:K&,([,I fth?=%0qt3%q-Iq*0S!U^eO >Ցuqq`xMS`H;@7[g|(0Z^׊>SA{OnY56p{X-$(@Fava/- ͣA \8L idDQi}s`D2kN[+e O1 4TOR2 A8 eg0I^= Z*kˆC g%*KڕR1UsVYE6Q#rN4J8}4ܲqy g1@ eApgO#8ԭ3P[M-gh 4M(Eix{0Ɋ:;4VbAPLr&FT MփŲsh1ixpI-3 iZ,mvr4N$|w9C F_*Q) h ʳqhr5Bz峗^)ѹTn hxs/C$OOO|چB hWg qbY=&$_~PZ MLz<>WXc'u܏J 0V%fRABKa9 8ye{}ZfR*-7d F/.lk,m>M l#%XϧCϖn➬'gC{ M /j`8 h)sk^~7{ⓢWW[vNz~D tm\ouVrNd KbV:bA gÙH9~!Yz߇BgFufM`PXR?&0wTz/(*Q^0O}Zh1w 6:fb`3 Ⱦ: endstream endobj 195 0 obj <>stream h40_eߠ,[MH/(D8H#bgO;Ld85߮ P fΩ&ta N1~/#خ]ĉH"HRukZ2\FE9ƾcZ?U ۨz~|W HW4C,0a H endstream endobj 196 0 obj <> endobj 197 0 obj <>stream h޼[폣RT)k/R۳TE~6}03xa*=<{^Os{^9 (t2?Ax8wA?q}rR]D;+Ld;I/YBKPBw syA#?NH;L>:?>?#G(Q0} qN/Z1xi A|ȷٹJ\~7MBR-{)1uݘ$~_LVR){;d'飡Θ:Fov( =z]RJM }#څ!`S8|.1/Ђjť/dSJpV/qv7Y !4`V ž(uQB8QI10?&%Et=Qa8ȱ./L=ع"$m(PTnq4o_4Bq NdTyo<=fN'fPLQl'4T>u]?jd[JVP9Au2! LDVne)gť*?|0rhm [FAm!^,,26.4Ԇ 鷕gHz>!YR~c%9c0vks?zx> n"WMﳪxK!Px_@_uǁ^}0nЯ4583iHX/Ԇpd`|gN_ݿM60Ӟ?Ѫqy#$C1,c + ,u͆d'4ԊP26jn.PMՓ}#M}|,FT!9zݹH󴡡]@ ?b 1`1 8e]MU6!fw۫^3%<8ma\xU32eԊ&(3<=Ixݳ3(m8!n[ne)lt65B]7=Ƈ",¶ a-VwjLuTFiYތ#j&cK .ZuypՀB@ZB2~6Ȧ[Vv mSk 9Ќx=bo{]'؂P>ͶeWYV6 3`${ulO`f66WԆQBUS0dέn./oiM[ΏT)xc$WB͹,{6:_z5H̶̬.i c@K!,T<6m}jboד$eL"lj' nMvFJ[2sy *dܬL/evSIꄇ>uX؍`WG]ߦ%ϙB^.X'u-9i+ޔG$ZY%y`u}+P9׵w]n98E LJIO I$%^hq1AAޝ1h'*1NÈ7 7ҌtͶ^aiIbWwdf"H" T^AD{*Ҽ6g4.6q%ᢞ٘؂u& GRqGRSs:*,RD{j|eV& ( 8dLU)26ؕ!ǒCkÿ4>lɱY|RI +'3 de䟋^pq+R*7eY@PXkȠ +-Jur [4~eu~ѓ'2 WϴP\xE.KQ* {> ""xsV 㡨83B+@&8}?Zj5rbqmR{lz}$_/UڨI;n$M<ߑYRNBf'S@ܺ6YM 6bNHpec 0ueb^٥ק:Y)1¹q,H9bbw \:?5X6xctT8nֻOif,ͭ*n^DZuNȋIegטWq[[w%#ޢΛn-$7> qn 1e Z~ /yzAj%1N@(״>?um)>TzGԦԙbi h1o۩_dPw 7fDsۯ+Lzk]e(z0Cfdp{VPy{k3,fM[_2f[ȏlM2ѼtD<<97q =Fޤ)O6YhG _o]m̰ռ+n;Sr"߼<&%6I5CQ^|3:|,H/6纩E!)H3B̬ r$ߙ)&[^M.WiLJlL'mq<ƒE8y3_[MUBy+vAUسT+NFp?j (C X=&ٴ8o_a쒫͋ v.NdPZrŴWz?o}\E""]R2olkoD .oo ~&lT6& BL E ב4ϑeIoi1k}HUr_JS endstream endobj 198 0 obj <>stream h4 F_征* nQwm;>kmYtkcaZ68y0s*1H2 $օ)l@ij'4& endstream endobj 199 0 obj <> endobj 200 0 obj <>stream hެZms6_}˵qZudꛌNk]e'ɥ @\2 e-yv R[>z=N9hz?[ -$#~ӹkB_#ז!E:u6/ [,Wh# %.ZPjP>_$SV!ʱtߏv LHKp@B1z읨S N߸-n8[|^a$r$@NJAZ/ Ph`b *4_i[)p ,`KXUHX ݠ04Jia14Br5Z&*3TU.{Oh;@}]@/^[1gg~R~RRI{{OIe$E Ҩ=z| $yZY{s*iu-V[8[׋_&-zqAI"f1 .P{Q}G/Bf :S~ToqC9N$@!ŏbu{ p ?|բ͉:V6(cnRջ۷W7a ˮbբ) USUi[}TX6U,$1=U2X!/4mXh5wxܸǽ9BW!O}#ːfwVgzs4g:ٜMfgC:ÂsXv7$O]=`Oxvf={U3TT)8m xAҍpǝn7tPvp,:ĮY49dmn\].HK{d>Ɇ`V>i{X}[}& TRb.MK\ ]'ZtJ{bòW(E܋ww7gӟ^쩁9,Ģ_ qʝQ7;η:BUkl{<`OIlwk kyk(ۗviqeޜ(Y_ B:}lh(f gtt7^|CB 5z\gbSQ~yͳr==~)/lۂ +vz ZlA[q_jw}8 ެkBX==o_?gzsV[TߜV(,Gz>q*WP50!O^vGbl@-^=.qs,"I~x=5r̓3)kҏv>NޛS~K3<_]pv'Vq'ojw. Jڹ|-{s[V*Ѭ.YMZ}sCs*w`q%lfH[q9ȝ/)R8^Li)9N>stream h,; 07q5"Htb!N-<n <t{3dy `k֪ANsiL&%`,ȢEa͒mj&G' endstream endobj 202 0 obj <> endobj 203 0 obj <>stream hޤZmo6_Ad_5a.nҦm,qQPxuLra}Ge[M.E#u|;ޝ(s>~#Jш?IKL4ʄRq!3ogkAW3Ð E31{BaN`B,pIG2ed`͐(D9oh/2ɰV`B"R{+j_¤Zv1Հt2ߗwoD{AVUe|p{7kY( T.{1-fL9zɊ%ie6Xe>NuӴI!lUt+Ck^F9`u1]1bhٔ^ӽx52Z, zW5BV[.|#S#,2W`z2PW 'YQys_ֱ Z ;~߇7|ٜMl4#vWLG\Flы{0ZSɥ0紸xd:ƖsU^lZO- 2$SLXg,9LeEâa2WRCegp0&23XA`k$L0WFS26ծ< v%cm6.@ 8K0P!-*~z}z؄ PB掁lC3 ٽE idUvےᛝIkIIkIlH߾og=L䥡vDF`h2Cu:]g TAX+14?-ĝ0qW%nMM3a-#o}A-W-̲2\G@F>=;9{<5EreHVۨ;mj+:aN(qY`ghG xZ"BK}}Y=DVDDT"[v o:X|j

Η7myezWdcmW"BkbzЀxj]qi<^A6TF/,¶z 6 D/B endstream endobj 204 0 obj <>stream h,; 07qcD4Z1B$-<n < h[ե3=ޏ嵀8&O;2yͥ2x A%5 hST†̍O:|UBhs`‘' endstream endobj 205 0 obj <> endobj 206 0 obj <>stream h޴Zo7]hkӼ@븎n6.ŞTZȒWcq]5d:Hj|KAx0%4?HL Bbx;?Ͻ !(#^ )Б}3zMטM O - bI-(5hq7I,-Jl2 Qsg_K.0edaB$ Y%u$Qp e=d6<-Ƴ#N1r /ѪjoȜF@=쮙Ō'҄QegEG՚>?G0ux6ۺNK~Z,g<Wɖ*uM.>grK5_ rVLBHcH/wb#Z`T|rPLb%h5.gT359\+mRMȓ/ $puuºzZޔ8؞bvN&[<զ )T4di6.{Q`U2E#̓Qc^T;ijnU}vvYLm@s9)GXt?/ؚ)W}O{Z,TB+\-:pb5Pe|y< SNQVYLP/SI4^ py*AGPj8u@_Aj[4UҺGBСaAV}M uFm+kV[4oȅ0rk P{kțTC Y;1Pž!үrVʮ⫱]W`r`xt4g2pri%INv'YB oR5pUs=-@یRj乔`+)"N.ΠW~bRq\JoD[]ؽ<ؘln8ύ<3Xvb9^`~j^JowP9HqOyy8,se?e8o|p^=͓d68kxqN˝]xyۃ)DZ{y.x%B~<}} DKQ#,E*5Ž$X kb[Éz֋sIFno}4!NU(U׍ݮ+g,Z2|sYTXw^ybM=\Ƚ+[a'E.V5D8qnԞx Y:o[U03g<=/-Q 7ưCi\6iitzh@Cc=z5@e8y?(7߄΢<8a/$J&Am83)o PeR`@w1h9d6\}iPUMz%q_8>^;$v]ؠ7 ŝ[mJOIyzHdzgɉ-8x/O=IIejͫ|H^<<7 __J?ɓPQg#P/kll-<Ö{Wm8ɺvzJj_ެ` endstream endobj 207 0 obj <>stream h,; 07qMD4Z1B$-<n < h[ե3=ޏ嵀8&O;2yͥ2x A%5 h0s-ltHQ/(' endstream endobj 208 0 obj <>stream hj` 01z؀ endstream endobj 209 0 obj <>stream h{ |Tsי: C2` I!,!$2@(("EJRnĪjKE,{oĴ~ߐy΅"$Q{y)ڙ5s(9D湫r&"3m%MHZKU1;}y2DA4l iP@{u3_٠2рs7ͮ?y_Y3NMvCySʎΙ=wƍ_,-S缞 #*Hv!I> D ٕJbY&4lYDzɓv肬f5e 5n<2F"Ĝ.5~#a&j*7-"rJCS"jP]nBfEa=o54tlG_aGNB?#$Z3=CIk.nC(mu4~# 9ShVs)6|#1i6@8I4 e#acMkvC6)4 w'jm] r>Dҭ4r{"71l('yڋ>N 1Hy3>"|FUQnStIGMUPvJ'OabuUBEQ#KF /.,34!Y ?~}z#5ǝԵsĎǵsDGEF86U%Q4!QK,k ZtkQcNN(sOcFK2eVju1ʣ]"MNwdMPYx+QG\x\dod;9ːq)%HLO%rdE++.9F9:j@QG5J`Neb> ĉo5!Mh 1]jG2۠AQ[izʠr#]o(L@jDJ$K@sĨ! "٣A86"z-oMo!膜skóլP{#d BS 41 -F5NE~MAR*.eUHBW@͖;lEul-z`&B[)*G| c^MadbXNc;jJ_;Zh>5VZ/*tkbDIK˚D t4*-g: TXl^y5VItc'ŁP.B5)^j ) VRs!|XsnKRj Ƒd<˔la 3rآ\bj!\3Y hg_ଌG.vjʔMbagqf*xyZӘGSіq7Mq=Cy>cr&VNsX: ;|oyYL͞i.}͐X(Vu&!}ȫ9}Rʮt;ہ (3N8!ԄlM |wc&27(0wZ XP\Fvq^6\;+(1RaY9Uww-rP Onԏ  ĐYm]F_~ʺ!h%7fniTt'U¦2V,>GDlΉ'+"yiEXXgd׈H ^aոl Â|lțv ^_`H*cS^cn}HrPyS_E9'*2C?l.JOc]|L~07ʀsn  ?6iq-VVZU:`rb e4@|*ҨBQԅH!*— `p*}iP˳׋opu-悟a]CzG)v=8A9J&ئ ܄ #4 T[&A@;K S5@8\?G`r#*&#~mzf1#|2?c@ޗIV!o34@  =ǔ(\`վ7w,[ϩjR:Ie\#k7*! Cw |~{nB5!@Z Oʦ=4X۱e+h*G,k!voz~U2sl<ߙ[P2s\>iߥP'']f 4^~~B>KiB|`=T'?$}iEPf*݇{|[QSN$ n%HnGocljagm6YܦowXeMkγp>9R!8OxnoAO?(gout-9{d$om6p9·PGq$}G]<OtӺ֊'P[O=+i AYϔc%㰖SZ*R%@M4I-:*L`}BC?d{6mlP;iaƢl<;(Ay]0ANJ$]ǀX"mOϻX7 YE[&18 @%67%6@xד)mGJEz5-ƔGLƠnxwѶ}<*v ?`)^NĹ LaOOei E(Gp~Eyo[]B/iMbY-1X;.3bk;mEz#|cPV"3\0xg-0f HV~}e[4IOF7GC@=F7Kw3jue ?gzmK}[xR{3~}6`>AeX-OҋT( -B K.'P{HLA_|!"Gih+]ZAXJ< Y6Ÿ肳qtlp(ÁT$KǀP]Mv0;u"ՐYߗ&os8Ԅbb&p;jl~q fp/okbm6u6y9MT>FnDN )ߦ^@L4c: G :Zz= 6'Vۗ23&i"3pI79o3{.M >x /n>𧻓K 'qy*7B6cSKʿocv2ܻ3[3%G:$;lvn[ ~"ppzI/lޭm&vRIGeȟ^t/Oo΃۲Dbӎ92g}Xm<kl~?-|^߷lf\gH3,-e2~mܫLw~10}dGP2YЦ]7.N-l•l\W9~V{6fm:vfx} -_ҋ9WCg{cqGtv+δBԋ4Dޅ;%*_46RJ/PrizJ_NOJ3( ]iq4><̆j'oeyr}+6iAFj#鐯y13뷶2[ak? =J{>1>|_A6n~ט;/KCOJ/ѓ(rvnنmا ngo kX[FC};<@4[hm=bfD8\sSvj337lcfAͶhm/'bLI__Q"h3V?5 Yd4&1r1r8)uϙlB3yxo hƈ{)PlUo>7sP uwX-ÆbQi3 LRC!I:yt`]r!%1e kc=xxmg{Nͧ)>?4׷VLl~ˑo{L.$ci 43ES#"8vJ_NJh]V mZòszha7#,\.iW3[p#_l87Uq/r vJ#H[`< ໠gC0=:h6 &ḛWW|Kgo1 a) kU–ve\]{ .6)[3ᯁ}&Y643najotepO_UϨ% k>ye}H<߁?vF=w 'e:' y xR&7" |w xϝI֓Iw"0x>xP~ʃg>ĿD;oG*|B;Yv<?R?(mJ`'0J? ?` {vx̬091D+!t`{)ِ?7w!9`&RٖE9&2Ovjz(2bV1{5RܞPu٦¿Q Xo&nOXG kgwNy~DcŶiT~Màᾊ}C02B0.&XM]O)Y]ƻ|JP )KQ{*͒zr ? =:0PO||G-Tzi[f 7T&O6o6{({'OF2yW|ݞmU]!{)8[m- bzz| u# }'26ߖtS^ceW_O k$N#_``<*LC:RmTq=/Lײ_`[.;6",[*{c+)[! 1am= z*ף44 ٠Q\Hj?ߵڲw@."tW~XIOӨ/:O#~yz$4 `rv2*MNFq{#hrZW s^;z~IƓ"ST3MUSi{Ǿ)Y=8\\ʚ~BzʯUb43E>|G)j4R2;Ǽ u}  CKաwB8r-.ͿM7hC=qrb[N9 [4-o2Z)Dˏ߇Y߆Ii: _AZ#"m.l]!3k.#}ډEˤ֓QvEdwdmQ^}Wy@ܯ ׏k^i!pV?# ֏H@* ]nGl[(E Ŋ_w?a?ܖ~lsղ1;ٽlη_g=g4%ҿvwVPx g˾X׻A (ƈ=q^L< 8\Ib^7S)|'O?#ςvt]iǾǓnGL"U)فjm[>Eh@@x)-YEPJA//y0ġ4 7MMh+m{4P9`k-T@t;||Yr>]aqnlc,WI ?3_ 撹-֐ ڷG50%{ aq478wo/_!`Y>xd4 xy XD琩f2WLȾ/ :`?6 v#LXCH1qf俁CUr};bg}*<_R;zBp!1MYi7MƚĈq&@MD!+˻ =vXv7@_bfxVlIbe%, yZo{pG+J%^k MJ7w.BZOM<_ &jRUV:{K *֢sm Ad ?y+tv@, Dy~,Q;7l W. \\\\, G}ίߪk{7JFhK屝ItOpnIItKο99 'ӏ]O8 G# #ڼ ꟑ$&##%$tLy1wLuq^]P\%{v;5wp*\!gyKg$-K۵qԜ},K?=`:"^g;+(l u"gz*f[5G7㡉W$TnG8#Ne/dD`igkD'2`-_ {q.rANXMCȷp39,[hJ誣Bʍe*Q_L FЛ(V I*J{N6QoH/C>Z0TKߴ%S۵fӶSď{6ܷ&q:F2rܷ͝-gb/ضц s[81yTqLtk $E*D*PS 5IB"u:8FtZ4E9$L`\_9YQPg1VҡF ,랃iXW1nVҰL%"!*+4d h˴yw}eJwlS~Iha *;0/122-_c^2> cx6=n`9=aƞD^yNkEF2"҆l#$MRcYRtya\_,J:\XbYLؑ^'&MGĘIUE7Raj hڷuTߺ"ASp޶[݋7'2BE'ҝRERBE%z%Q hT#Q:F4 ÈvƲN%EҸp_KW?DGmk: QbT_Yt_ǔ,X]U+\4RI4m1gp8$wTbqb^ H<8JjjH p[#sr;;P=Mn;+| C>BHLݦ&|ߤ׳zXVDRt,+q^`ƈTMmIaC0͒} έbX ygƜWgGslE1}Ank;K:;w*\ዕ)^-dG2o eyV[?c@f6cY "4ƅB"$¬ n FZCjuTv?b3+Y8= f>Kc *+"ԫZ@]a#cUG-_"ӻBHxfo~sa㓿8%} u69tL5;mx 꾲,XrHy N,@_eE7Dr!&:h- 5y4N+I2&t10 |S+0 ̩Ʀ@zEeYć5.S'PlL:teg*B.S /v}^x8,S|.KQKx ꍺtP6qN)V<f<0n ~̅7LxOM5ۂ^ Ư 6Xֆ (BS4RURAC$k 2ӮOAb3-6q'h?_Ӓʏ.NYhUYcӱٚXyr}/x*,TfTdʮGɱl*|( /+ e,*WJ/Ķu[3&6^S18Hu[Aǻ:!Y *ƑtCmm >RMO\R+,^/_c~_T o T០τZ]qV[mWѲQ}S1!;=TҏQ%/YK6>K6 W3qӁ8C/ @ Af) rJ<{c5,ov/CWUh-s H+#H: J.ӻeJ^{w;*V*HTk-ZTc)28NBF*Yx ip^[e dRTCh $5?r~R ocKXA7MǡYb68յxhOSp9\v611?GOzq Pyy7k N= 8:gVXDƲ:$%cY.yݬ0T'=ڃ8e 1&p&TG@10ynz K7ܔNo[(r$ 9zv@3}D!XeQxY,p2FIGa*JĈV)Dz*T"<cYh1G wc2rPɆYg9s&uC3gdK-豆9\*R"i>G*o .N3jUYݛ덇.)]ڻc=2ǖd_MjyT&^ umn.lg\~r7bd#:iAIwitlJq6g8g-DB#mpxX4[}!Փd-8|ӑk&sZYUV"=+]>_K]n[p0W>vyszEE䆁nݼ,/csZ녫e kzUOd+X.p7o`!I$i9!cYQ[rP$0Uyug|1 櫏6{l!d?p$ZTG\ci +hRluy$KG% K`n;}.V[@Dvai},[aZPd<4ͶҼgyw\O>SZBnWa %/ %SAr7]oj|N><墼 o_99\ ̵.I(vRe1tT]NJvPʈ^s%tmsۘ^ swws9Hr9jlગZԊt$|ě(3M/1/\AaHؾK|1UΊrA&# _viK=CU++wLKÙ!8|w(prbR_?G2X(D7C5D1bN gep2Y)Q *c3%lfXh{h7M솯;ElXa#$.@Grͫc{O:[sSٺhOqG kV O6}!f_ͭW2炭{xxwX!Ƴb)ː ) vdYs ,i3ͳb|0q0 VDҋـuDt&doúk>20tV/ /4uV;tҌj0UWޓNk`=}G{X?E;%`ZzJ`h@0V'J6/r:we)t|8 FiqZͭ;[HYWmNk6x|FݟV/ݿg#l\n(mY;p@ޅQZG$HrF$gE",B Ԉp,V^v*WV ;cqM5 Fn=ݞsH;!|MB~yX^)pSOn{poHK@7= ҾPo t-f齰}Gϼ}ےeͪ wPKE1"J 9FZHjK kjeHCQZF(G% %@3l6aQAQt.YF(pobp6fsB4*F',foݽ>wlç;;>#h>u募woq⛞R vهNbi/вe-y+IhgVBcYV5RtX h%yN^B%Qpr~bs).+^0IMļԾפBԻ-mKp瞣*rwնo^LUth4 ah + X\rc_&IR(5J#$FAH[Gt rA*M2Q]'l)ܴDhM͢`0zٳf<pHT"\i#]=p鿶Fd-L A=cM<Y''M>*R><%}I`|~}c.o>[ۚ>Sł=L.U[z<wT1,d%5džx @[3'`}/ImB0[,-/-N!\2K Ė\Լht/s28 _c̭NA%y4R,]r$3zv4 xYIb!A\& I| nB IƳ$Y"Ƴ!4٩R3U\jojtiŏ٣ j(dX|y—ܫ\P{Ieem |Σg%邈  FPxFUl<!a[)stskn[⚶J]zRU1fiQڼ8t@,NEӬ3ُbyS4VzNis!z{):Zs14*a8rg-[:]FdIGGxC=l7]c1 BSax~' ⚣⨗GI*xOvjpH79]V?pjQ 9{e WgGZr{Oԭ*ջ(%Dgܫjq9_{ᕳbNJ9]Zٶk"W4=1ꎐn`fgxmGS%QFVxcmJatf y} K1КWH^jVܾK#pAˍYT˩A(-GL&uDpZg]!npA_Pړ?e7}o2OY[ҬYQ~;+/Wm<{gK5&n7(OηXȢ?jf֒qcASrvlGɘU~ [tzg9XN8(N[4\=# /ra1\A~RB.ߴėV}mi ZtZΥf&/<*Xm %}.$>,/j5 %!H" F#@ Gr@x<乒bqgɳSQz{ ɦ$5$owҸVV7?NE HL0izZکdR`[6Xjp&K-^.oJ6ۭu?}ty֊Z p ah`2GI2?*::Ab$/իٳ:=+6LK\2,J1B?<`|ʹyYG{ѺT[ps߳}ؘD3 mVPs}Mʐ}EjpB6bU%CÒb_+cX+ϊ$ ԶiTjB+4t*._9?,'_í]1?|72R'tCvw0%4KK&/-eSE07^pfI6(TRd<+%FuZ WRJr='1%W!Bn4ub<'g/sq8/;o?DGbڝ6@FO-fd%."8X5ߚ)؝S8Nu`k&+5E&"<|P)P TG(`#e[<%-{*<˽lv6NrP([ gg}sP;j\S}*doSB&q;d)i)4;]j9Zһb5jt67<l#<z'l^om䳥{k=y0XNtp3yːާBA?5v@blB&'V`[H zWY̢&#W49G*_ %g/rs61_c0SAyV8Ă]Gw4Pݾ4s 5r[1wpWZ\݇ePVJMkjQZMZOH)F%2/OB⬀VhSq7>fXZ2U˿Z묄3>SOiL]z/kb|0͠ G g&nsD_#W 86`)dOvb)Jʔ$6d{ٷAnɭ̔FMȽ[DC/p?3%-tġ$:egN3߻o_[>*4?i̅y0jZ;e%pJe՘sȕccvXt!piMM"=r) .=}MXj)\O֫}}Bx9k5ok65=)c$IC bj b=@^v|cI*M O8 :s3~t=]&/>J&ګe5֝zMO΅'ėpU1d־yǡ/,v`+޹b] ~8vaٰgm@!}H@.)R| qN >{ 0N)Y90 C3%KaDAn Ae]A=^?r2| e.?.FcV'0G >W1p5F@ '-¢\ e$Z6V &8ǷmnķE|ǀ&?iYv Fkƭ!ݏ 6,=Vq` M`3nw5o¿7'q:|g7btpp{n.ہՍ؂m3?/슶qcq`l֖1nsW91~ۧq_d>HiGoh>cPۢ[=650thSSs®Ps#[7\-ܽy`4k 7mqlgvq990mqŻwrol&X}϶CGPԄ?XC0!g y+ow$KpߍجTˬwbk YW p&[gвy?J']ŗ҂W F[ endstream endobj 210 0 obj <>stream h{ xTU:cU EP@0L $d0i%QBdRpD j4 mĉޠ*"жԈ 6 s*T"-~U{(BOʞǐ௻j:>" HHy3/}BՊQn#tQGr]rTVLz%5U)'S1|Ȳ.3tA/տ__o޽zfftOwwKչSj)%&DG9*D}T#W`t*OۈwdlAItO;~v)CԾH5RaN{g(ߧXP3]0zM{sWѹؗ2 # k#.+ܠJӃFt5EEY!^L ]P4}3b(m릧\1,!0zk83~>.Gڒ*;.P8_RUn;Z;-:2dobKٯoD_iKސ}#\Qْ,L0ˢQ$Okԇd-+vy7%2O?,˂`m|ǝ 6KHf([_e$ab97イF 5TeZqxs\ZTla &b\2f5M.#1,4Ň3Q'ppV&q*t$Xؙa8NE#|5tD|VM]OPa眝)-2ԟ}n(\VvIlQʕn]e3o6 uD8D]6\M~ @ -"m֯n7V `V>J9.Dq_<-T :9pH^1U,3&2oq+> j]X⺎=Қ ҚIվmk&%_Tym E̩7GBBkONQ޵RUE5I$Ҝ4d+-1&#M E%Uփ>=`Vڀٞ|2dO~$FgF)N/uNwxq8|ԃ~?\Roa.r4AM7K0(ox4ʍdDH+D:a%rX3~zO[hX 80  洒Rb*˜r5y;%*M4\<0BBk|6WNQUQhyi^pzo'n'OGS ~BӉc^7ۑUAENuTBy@jgxڂǧ99O=gCd;ݧ j=AGhCv+}=Ppm(Ny0f(%0U~+G/->vpTn!#-iKOPr܂{|[#V[4z]I2cms*o1;uBemk p>ҩC<ⷠO W'oB {dhmp9PVGy44-DN 2N0{bx=YZ@i(A?i$Eeˈג8=/mڋT=Pty!M++nA(9^mpꅐAE Olyϖ݆ ]j8YXЖurZbWp~,?#)<8G؏(Y-uxŒUT/耻UkF=_.vHTpA>pS>iOBNrq2^wH_1P$hۃyȘ܎8N 1}>`1h!|Y}<,.*D%i4]Kn OZT(퀏AWFx B2-"-~.\BqNuN|c=-TQ/Ul {r=g'4 rz.gŭrreq RtՠyJ.rvNKEt 22g7e2`*0,dU@tαXi/cدjZaoȵ1_ѱ(C?JsqwT*8+AiHu_z ~}e:zS1I@ >zwV Mg[Yv8_]9>=<tVtLƳJ3;sݍ-:YkSx\{v!mJ/:O?3 CCDx\yvdy<}R{3K06K?)11=YdͶfl;3|yl~?{Mb^!E u(fžƖ^m ܫ,ӻPM]X}>^ԙ ɮC-v68]7.򿠏V[v¹lBWꌭmnt-0x ~v2ޢOY:Ü5Y^#m/o2W0S4L݆;9*x6Q1ʐORvmz)N/d s]mq,M ><$lCi#A]v9]p9@^inf[lKF6P? z W =~[[+:BбvcУ]'l`WAN67+||pyr?zDyTVl!,i!m:|ik4!lWS; c{|mm?Y_ = 38۲S06ZlѼnb_^1@E0Qgl8d46mc~GWNvxF ~βUMS{kAhRن⨆|Q`Lٲl(^6S4u0UFiүNx:xS.mb gφٵ1Uzmsg? F7F]ZɡXj~+\Z#dIc}(h(A}bD@iP&<*V]Js鶖7B68>-ByA/{Dl99<~hy!mA/Aj7NU>܋(<ʭ7&q& OT̳vRfL0uY}\aru#Rs@Lc<̧'@eBlf(0qrgoɧdsKrm٘m郐ζ6m939|vzׇŷXiyYe;wy}!/p^4R_3z+eWzf*&̾ TJG=MB>xnAǗ)w=hߣlx#݊8ێ?ny۶V篂.1K8^7>sWܤՙ?7tPX ~ȏ/̽Q̽n&a@"Pҽ- 9:>$z  +ڝP727 gWil_=GYg%յD[̽я`Lo <|ܫB[Һ`,=gn=NZy@`V -H~C3s,F0h=/0&hq6>vCs B,OĞyb|9hGøw7v> 9s)*\&aog#s s8j'!8~?ݣ @x9&`hc]Go{Owo0)J Gs\ggwxܰbq|jc_ȆfŻ9Cz=_;I8 arA1z_^~<>߻cΏ[ݽ=CIG^ ;:}hL!Dv {BF-.zeL;h=6*7=~wNuyaeTI#T⾊v>NaC%t- P&z5twK0C7*WLm=Af/30T7K)Q_[i1?.Prz?l Bo,Oo~meG[5_1,oгSM )Mȿ(Ys]۾!G7Q= c?H˲5Cv;)Er9iPkI$~Kո\C mTO> =/L ]Nm:E[**U_@+(qںs]6F`F5j Uhx~ _J5!{IBxWTbS͟Ọ*)_hAϨH^' */a/5?`OXg(k7 0eߏA[Pz >|` Rp;JAh}:h}W*;&`l2<;t[q13-gx{f-t=~8MX6]bAзa@+LօIǨ ߅ 0:bgZ߇Bk= k;eGQ4oߓ#;[m7߂NHsz x|Xyܩ\7)Ciз:C&Q'&ʐO 򇦩řՇ$aaۜ8;{ Nv9_Abe̗YkOXf]!;a{g 0?|B͝ĺ:iFEL4Nb_@ǑZh*u8s[<\? D?wi\ $18A1HE8m-gk=,QP&_D<'" mk!K(Y^:T`Ui0 qO8ϚVm{,S(OÜ&Q-@Z&N@G wBaL2M5{"lq 8v $Aqt ˋ9t~6Hm^K -'aC|>Z c']{1Mدk!㮥%!<2[wc T Yq;8>Qn*`0h pie`gOBae!1TVkbڠDw:YByk~Z͏Ci Yxx2L @u_}6cu dja@60ʶZJ֩*>J :<mx7Ǜ4X?c %x0<`C-&{y%n:"Z} k$xMs% kujQ&OȎΧ ?{1J ekl9D{3/X;<GY@>*PI^Ϳ>V@mҞJF@Pc(!H څ @\( DP@P@-JN '~-܃L /wpU.$? wp Q[^Z$U])B7wp wpwp+[.QfȒ2Lˀ[VyM I=( (Ӏ2`3xBz C.;_魷j8s3e:.΋LN2pf'fԯs+~-x+_JEOJwH=Xcp4v_&Ha?\]sR^Suq wdćg,ͽnOԻ2uuNٛxgAa_b PFI \nkAUewRͻtenkVIUF54%uHJA) SbS.H(Y)?Ir./O߫gBB {DŽc?؀Ro|_oBwO|OBZxwvQ1Z,Ir$T$1t!TQQЃQ&DPp!]UD],J5:ꞄmQP6)]^ƥ::ǥ$vmDAn"Lo^^yy=\yy)yIy yQyzGy'KFRUL.2K'M{0*k|_UH55MM65M2_ԉW$Q_usQ_޵]Ȟ`[]-䐑j`mXdŗTotURYcz.\HrFNMoDW) zW $ ' :p0Y' x)@c`k`}`] X)*2pc`E@e<0*w~UV-^; =(Q_@Wa LtSΔĻޭtкtOĿ'L<(e:xi|yh2xP{ 2d`vH13Xjގ!;1ӕ0"=G(Ⲻ. =3SIJNJ2 )k`bbri,띙?_zߞ~Ɠ3?=K4G&AvU(PHr( 4}p\֜)} m{;$H " " " " " " " " " " " " q /vʞ5 |*q]@U ӪswCvtEN,Bl ~ ( DA;wؙ6 {^ϐۑ[t9y ~y""KYڧ#t!Fnѵt ~y O>2i鐘zE[mdW+@f(PC,9hL4IbG_³@ܔ(~C7q 떐 AĜlh/>&aڅB~ k6Ю  aua;;^ƛjdՕB6)d5x,f_Y[˅+.OeDlXY',Qʩ0{X1 6!~ '-\:,0%mli6h[ k GEA:CQkRZBl-_iB;u\~Dg;'>]̗]M D endstream endobj 211 0 obj <>stream hTn wc:@hURrd菚;C}F:?`~;w p + NC#:fxmI8w~ жhax'odr/?ү1^qF@R`qd㫞xa>;X\6HON>stream h޴|Tϝ{7$C/ٸII%B . $Ф( *VTD !"]&v6!*?̜)w3gJ pJw˨נ lcuH~#FO|j SDqc&2FʉDcD {_!'jsHN6O#:5AE =d ]~HTIjQYՈlYF(]#{92kDξ#[ѣ+/ U6y" ʕNl3b.4ַ]61 !vq!B8DL&JRT{P |";KYe*o1˨ȱiӍ4^w}D[i7IOtNt aT4unp,L$㾷q"d>BE ,'O6XaF!=kWYkMTP~c=߲"7I@i=Bh'i=Y4г4s<-EZHh1Zs -|Ku,阗UZNo ZI]zuzބmAM;RHC=R5^z@inh3}HWc N;IS csȾ=Md]^wto~tJ@?"X Steߐ83Ay@ct.ċՌF<]?7*!Q (oe3F#HG> i.s}xX0)hr|uo{7kǺ巕R_MB<76;ǧߍqJ"_k&b7oa1Tnu+#߾ѿyA|S^;Tϐj%{Do>;oo֚WX; Ĝw~o+$3'*I,jt }z2b jtbG%F*VB+38O:O:jCJau°?C0rB04Əʩ%R0R-FYQި=\ QŎ)1*CV&(}ELJVըfiDhwupqbQpad6Fc6b45ֆ #֨.#H@L#HC4&%|_>`1Lm+M@x?ԝԏImow=wڥsڷk&ub-7kڤqjDYBوBK8,SpfP\mUؕAV 넨m4^gN,2 )KOT҈p&PB|3~rn0zp?+qzOk:@Tr8Ӫ IuzLg!i(//,4ŕGyagN4Nk3!\=cҲzpFFEyRtY^+e9:μ-luKt ,di3ezRu&W+x\i޺.)׌p9s/*:}$˖X1Iy+6~BPC_Thީ=Dzu=^bb*R1S13]Q2qCxpǡo ~CJM[O7),]CLP =z dfu;Bv[/-U˙ꯠ*ýCykR#zx+SbrykfFtGFy˝Q9E'\xb՛;bBn= pDDtPhrmDR bP" cRګ(DJvoHPY?PgZNjPjK+L`Q>cBP^Rwە0ջ)թGom{,7@` VnÅŢ;!Np] 9ᥭYO7+f[h7W,367k: 7/))wtZ W wBkȉQ娓ѩgr|tOr˘#/ɘ۽sfOjfdO^4rJRJNP%#GnL"cp,$ 3({"2˒L ACݦ9QUBWD2WbPWN7̕䭕_n).GL" PH){uBKõ877$ /t!k}>|z{mۆ27BW-HNT6Yf 0èS(nsoU龛(M4)ԃA.pSA !-"+68b%j4^ Kh'"9h>]CxjS=C@ PۖqSx7䊭ԚEP<ֆ L b y`0m4U՞Ěx|FH>VXwQq} <  'x@`(6x3xz8B|7MѶ{09%*Vu?w6 -}u }0tV lhɎ!ʎblfEGcZ1lÖ_}FYfMysjR|8Nb5)Le ׂASiMdZOednEHY9-7ݮ%<<Zs,*l~RYYy'I1RwiFP?ޭϑ j*HM._%wTps<_УhSY)-ʹK6&\qymY8%hf?I9`QY l\weo&I[ԋ-G 4 &bլ]Gؐdy蒡`-9x&`X!·`?F#0W@:ֲ2 y eO 6G#7*46'!a?DSl܃Oٓ{B{eAPFboC^Qs^2^-R6>򨹛oʘs3'Q~yVxv$+gy<婱uZtsPh ́As s0yֹ @{|@i1h,?yy=W%b<{tcRC`0 LTy$9ml0<Ÿ?\=/#|[>-2Tr$\F;|=9` { G}Ht΍t'Q`+O5q̀?́?c&9( >HnEkmR`i!ڼ@~*^,CQ(' nP7# Ȃ8~F %6eyƚFn^ҲkA`}p.\{-`)W̔_{'8(c":KA P2shܒj*VS6A/5SĻK~zk<洖jF^Q.XnSgJky%Okz*>v*!7_ϔL<q3TO^KܧQ /2Em@;ճ =X䳍FCUt"|* \ү0FeZ³ۣ;쭦^:+<+4vz_ -Y{ dWtqX^AYQ'1и&ר! }DyX@e! )!dpD>mtآTw#e $lMw5kꢚ  C#pxolٰ62oO]OɆWVX[m֝`__ Ǝ4LZ>X NAc݊1P_1w8 7_Bw*!'j y}J0`nX`^o{ {fmZO<([9nG3j}cޑ_yW~=Ty4~nkT}v4~ާ. A훈06yvz6_ >,S,b-l&U'u [\)勜S%4r8wƻ=8s͹mڀj]y~jg|t@]AV=gA\}O<3wَ5IyL_ѫU)h-c^~mJ=n/CjM|WE 3z@i-Uh`| c@[amW5)eT}frm <k }>e|"_Mj_|?U l)a WA룠[ i M,SRȮa}࣪YZl}\CպԮw4(wǶt }nL_Wza4ÚB~qWޏwAONtZ|d 0ȼioO͏>A{N VN-ŷoo j}U}PNFnj?[MUEbхl<uyws!t%J9XCBACWu:ݪv2I[ե; {._gͥnbLP6uSBO6jGruN 3'(ܱ20O9Cs:ks"gws5KE=M'& Dm$lQbhsHyŷy7lr+]֊Nq:=(:OԚZTz]]^*\WG[PЛz}Z?XS?.wOmFAc1"Mw^shi2S7uǿl52&ʃ`g@N7Rmr5z;M;mwʫf} O>6rpȖPE-'TI| [Xo~v{k;gwlaa. H: TXzog5b8|}n|b욧7hi-b#%vTgV\=|YO⩚fkh8kOюsT[;,Gy-(R V] ^~[3G`7 eRG^ }r}wVgڸ~- 9z92<qaX^Ql! vZE'Nb9`'5}`߯lG֜^T+FC0Sg ]D@7C[Rʍ)pKx=*]ԣ$y,ܛo7ԯܒzU;GýGW%QWoXd;[L3ٳs6Xޏ9|kL'8 H]anE:;%;)/`zWPg]I렼`mJ~Qyp0QրL.}{G 7U n7?|aKvN'k5: zᅠ{e]8^A_c/*"z~lo=Ewmk(]flC-ĉr8ꃳ/ p*]ey;.Y,Kz@6߮?KH7K>2K_<x;\ w!WkoX0avo40Q%Cfw\_z @Slˀ81 )jS_0Eݷ1\8 ;<ws[L`?٠ ;RG﷐d?%.WH_Qxo疐W`燱I0 G8+w n&LuP0BJ" *&k*ViP)rAX=ƀ~Dh}%cTw 0I<Ԟҹp'nOÁn{MzPۭ 7I%R7Ip{[?ui; m=ɺ7 7w)\Tu? c=wÞ-s[/͗dlm='T͠wI$|GQG5>q:k֥gك 5vv~%g% `e"9=5:PսAnؼٔ:Rb6%"pPE˨{~fS6u@> >WAST"ؔM9G\稀:~+Osy*׉hx7u.ba]bN-Aej'f )1/5> 7ÿw% U83֛:%6L>5PˏDcr:yVXR ?.{zO3};Ͽ?˾ [hU_~duލZ'ڿ#QK]~5}0N*}fTW !m葽g6GlSe۩=SAev1"\ [QZ}Uw!i5;׺:Ӣh&݁T*T2Q^](yQA[}ڪi4 ; p5eIzP)y,p{@V/Ⱥ ? FQwцU~7lzv VC<cMK!f[7NGjl)ї[X50OsK4& .( -â"2ս<+訹yGwtcHK,=&sPZbas|`,uuk/=+zPoR}zhTgUq㰼xQq̣[c\㨏x |IʂanL%Q&\}Gr $;Mɗ]hu? ƍ/Jϛ{N]/J83].R_ W;޽限tJ7kQwV..=ܛ |T6L2d&dYIH,duaTZA EZ[-E[ĭTlQ[[-WVk {lV?w<9<ϝ=xǩvo|imĻč`;õ+sޔ{Yp^˛I1h/pINB2jk#i)Hn"%T zd!M=qGO-!ȹwցD9,в j.2 EM' `E- Ȋǹʃc@KAfP TZ 7#%p@.TWGը ݌JT2J-EϋLT..) Ӡ3!; gX9* OFwmeTr wsq:>Q.)TxF`dh%{!*7S8 ujG@IO@c`y!C8>#8AЏAp?#z`hlzZhjAdIrmdg&iqF+37i$qF,ь>C% i{3ON%G!dޝ$u:@~[ c"YDR0/ Ah=Q [@_ j8nmD ~K1H}\ ؉Xo*\XCt#< B8aCX&aDAMYğo ^Gk#~x ⷈgA85W#CAC A܏vto޷W ߂ q9b~<щhG܋؆hCA+p1 O;CFt  BP!B! BBiD;^gG_! „0"t76"Ax=$i _"~x чd/A#.N5Ǜ! BP!oA$ÈvDE u@[Iq?C<8x6Lj!F w"@܆؅؍;bb#jU[=u%8:" ##b+QDQX ˆ|DA>DpQyC|+3_">A|B|}{?#E6o!B\D" |p!1!D|tῠG~1b/G!4W#C<֏{?EE܍؃xh4.č-!.EW@,G,C q b QEV "*Ո D9"hFLE4"!Q#xA#2>O"q "^188cF 1ā~-iPצAgu/M8 :+xtK/@Ort4c>УG@?0臠@?=(^xt?>н{@ ..Нn;陬xc|GtVDw3enGAD<ЯLp?6ĭ* -7!#d+bьhBLE4" S: aEXf a쇾$ =B"4u? bg?/OA> ?z {߁~z8(Kw@G w a!".C\q1b b1bC3EEBD"#>yq8JϠW8bD D< s7A'-|~Їx_<1G?D<⻈w"@܍?qb1111 @t!:vL DVACxBC;D#( @>zgлEЯA@zY3ApàCArO!E܃==^ķW[z7"n@\؂،ыq bb#jU z:Zĕ5++;QBT"*8 Q]XP"9B"$BFC#^ :-7@vC=p.G`WC;E[F2측iK-Mzފik6%۔`6i7QMW%*!nhIty깤g}=g࡞='z'YuOYE㖞[{(-O=;7M[`zv㟮%)v-h횵4lN՛kٵ3W6]XwEbuӪ'HeNNiM(.bŎP5+) hIJ—$.$qqxIbqxQbax~bAEļl8V+Jt}p-<-7-nJ45%f6SÍ)t2)ak["v^cJm f.3 _L.}&"AKר5-*@ŪNΪBRRܯاg(*>Q(} rE9=CP~Vȹ}ZÅ ;!ʈF6CF,\ʼ B)}dO#bȟ/K#AN$H%r}A=#&8 MtL/9o?m{eۻ' ɝsT}~n֎Dm~[Nۿ6Xnc6=Q77`]ϺP(.n=_i YϽ~Bu= c=N/vg\~gyr{Hzae*' '=#||"Si'TQSSdWWx$RX@\rJ =0UZZRUSű0qAX5UZMGTT<3}NggЍI/ٰN4"'G1󴄛ӍTbN_9>WxVfKMx1@|Yqi2a` CJhTmP'x`XSSG q!nn"#gЦ:GF*/,%| \iI)]cxHsT bғ2[vCJ֋h:KD\hRN2)F ZNBd5| NB;"J]vȣ>u aGO9wu*W t`U]\5`%>'#'g.h70#vZ3_t-xzhΏ?tjeݛ^;'zKX%KuY,m*Y5?>uqW,]K̭C̲k]ڟS;=b[RN$|ly2b$/ -<ϘNNTlphT$#C'0D-i;vknHvf*ùQcS˼-5E ES/D _(ً׭ڷ߶S}mqUm77hؽvJ`xlz]W= 𘿁qd!!Vdr: B5N(X:`_Nއua39;=uDixo K|doz%ܼ|תB=]^['8\Wnw{y÷Fܰ 愶7OlB^ ef8 t:P0&;2ĉ\/*OE78il?x?J10N/V褩"&r;Zijc yF*#KnPU|-Qjf}A>uB|~6[}~Vs9=GI!Ի2k\quu: 4h!n(ᚒ!Z4_s_e.8^OӍLm$wʥ@,?Php^1o>^-pr6R狕殼Z=%'`n(@"9G8Q 0JqVaY j% :var;F4H$[9% H gzor}ɬ&R &{3hL`xN\%R̺63ʞ׹pQNR9VKC.p#Kfr˙]-!Uw0n)mZ2щULX$RSnzc5:3=6r !mT方+">BlzkY+1"nfLT{ܖVqw#8}:Kvz;E$aY._9%b\sX{8_ˋʅ~Bw2X&=Q:;{ ,t٭MBKmE@Y@JN{R2[r!.Oʫ^6XXɫ1cvmʠb=v)h+9) }*%`ؔSCݵnMA$?`+0bJ:ZBPRݔwe<ސ*g}$c!%%.,e v72ˏ}*JlVnǓovWedͣzی+Quq~-E{.y6hxFvÅǬԩ EjdA# >_Q̔aQix|0kϤ `y l]T6GI)1*HK#X0\9Ϻ:^H6,o#E.]P(R͖ʺz"c+"D5D6R^(''ȋ|Iv l2(⏰y힄* 6Jg0Neahe:LO6䄹-suZ]1Ó+sܪ܎ӹK6Gw޼Rjr#w6N[t[4W.IC"'QKIGQkԔRyO^ݸbIj9qM-}PQ5D Ve§*ipyRJC' IXUzևS!(S#XR0+јYsV\5K"R$ϭꈕL+0x+fUz[oyՉr+bUqQ}Jbiަ-uĴ"OhZd/rxK#yik4r 8J[2mLCV.7@|mZ$D\SSI\!!TAr?IɤLs͚\>ӊN]g潔"[UʋkU]Q 8J~jj<& Mmk=i+1!6Oj0 zX'6JlPlQ8\|=]aU3HiEz=_@\D+2>2ڄjRvpvYRV9lK/C3'6;$Lj)"d^T\P@U^PZXi a.d,(T#>wS"N aiimC)a"ƈ:S)OeəM8Jrt{Mo؜W-[l*2YKr,3EjܥpUHQ#<,/T*j69:jnf:OW4aw9c !g`ܟNd7M4a"$)VF^!Mce^Vrs[v!iFQW H5ldpQߠ5m~FB[xNEܛ:(xŕj;ĽS*JdXqTk&{!)+\R)'WgjyVWL@ T"9Q{uU2_-(Rϕ]ZZ,FVT x;x &{NOrӒWmUNHW ̼-TM)ۥbM\jWs͸9v}SJTAmHEXm'{)\BAI<hFoN/Q<ժI6eEZ6C,[Z; Eby1ѯ~8D7lB :cB./aQE ՜}R2Hvbmtk0n ׇؒy J}@6~QLo<Pڎ[}//aJ*W\ZEW۹@ ك!zɓ(m,ɱDƠ#UrN= Z/[;R7Cf3KKs.α䚊mU^[Cu#Ǫ%*ŭq+Z5OVenFֳ@U0rC lM硡H:B#$gZ5?~>搂&BQ(lz# ae!Y-Bj*OP..wUTR`ͬY;-oiZ̻%|pYqj!ZQ;kcN[Qô5"-\Y-Q[ kNua*hLm-QEBR:QC[Bo_l(yvSy.N]fO}+XjPqȃ"$?k]BpPDnY[ʿbq.hQv \0Jlo]S=KԒDU(6Fa L(P-j/PΔdHǴj YJ,- ^(V<+^>D0T[&ZpnQ)!DnVQIV RQE䖞 |%/?Xh>ߞ"a,kt{tϟ Osjk~1T̗$R{M] LeszZ>Ʈ/k*fTd]3W٩ךu5FPbQ+ vl]ۖVΫ{:#:o!dӖn]M$']8F] FT5W6l^V0D.FvX;zgdp,y[ :~{S|/ڗ4c̋~nduL4U a,JBP;#nP}JC*kJ">VpgF*bFZwts,x1uh:Pjv%BJ2(kOUFi.2+It(INgJ8;)JJjƪ*gڬUVZY5 jI5VIX^i*xYnՆVb%޶ m(3m$if͚vCL0RUIU*Sq"Z-Ѝ/fp7+ӏbR|VM'%lֶΆA H2)`M$jMP[1*J-˩cum䷼z"]N@trt6M,9G D-uR)&o{$FImiI(0x$&a=k[#方3+p7eגFי/(äE _usΨ"/BpB;ű-G.bʠ+}EqE]°\eީǛNhbD qh Mn:rI1HyzMFې vf(ߜ;n1$]IK#O` r-0Ef&/Q);DzM7\U!1u +&: S6f5&S َ%=^s]9g;~ AvMwϛ-lQ9/-eaAL%yhus:L?F_B-:YO5ٷ\equØ`oYD{fTqlef|YBvG@/lƹ6ط8\=3=G\=i]#Ie·eY2eXeI e{߆³!dld섅uཀ .,Xdl^%I# Vf ٗj]5ٲ!eJg)K49<+3a,.$o^zS>g#mKKUzZ}=Q(X~R%RTzteHiYT iwu ;i_S M'Fr%s;BZ6ղBiM|`R$ ZΣ*"VE#VO+ǞnVAjX5c[nϤ&/kuť= Qr&E}bkn[ݻKm gJLƾ%FH5oBԛcJ`*LєuT#FHDŹwKkj0'5h% 0R[jnN<駢zgm*f{k(cP=C #[ar{k)jWq:ݟ+Z̡)hZ۸E*1dHv7M$Fwq;vM9k~Ve iV `ѸZtόʼL >ӪHG)oFQT]#H[F{AE5ZЭ8TpʉiPQK?Hw1:WZ/XED1BQ.@ő,xJJ+t,aZ3lr}ڕoP, V)6nffO?Zi~MBkP#_@KǥődQ*2IY$OFolKfjE*P=.CV_,=OT3I>ή:W̄?iU'|?C&Y+*Z&&lkꝄXL 34h >7g54yXz:U (ҰL)sU '4&MX %>D>~ shjUP4MHa&Jk=f(v GɴK<3[SVzDx^fJd1-Zlj鯱ʨ9l P?Lu'V5(xZkIws'7 MY퀞S[4NQgB.޴"m(iw3v&_~R۹0ZX=7ߑH|ojۂdM!LȬe`,ŝ.h2AK;_ڠ1WnH've]G=?h`KsYBtYm q,ڔxx^ }vWٴBVmsR,i̘>^Ґ'ENjm =ְӳ^8CEA*YfÕvN:Д.h(1/jr,-mK[4*7]@`?qAc<r5(;iEP(G['}6G͵B1>wv^ ^> kjNI\lB1ZrV./3C%T4uCoITxD*:ok#&-$?lbn <'c"1֨F>*KiHD @8:g̣cCg@&7={:{n{WǦfjl*d@+UȬ?Ra""Y L2b-Q\m"Et|qi֞_NΒ)Q|EljCc&N)#jU߹7qxu.su25jʢVR$KDWfIљMmw7| NԮ7vT*6.KcJNh׭5?/jG)q㴪{ZR {NӤ>]N=U98SuW7Rwmk q2fЊʄ eHU8Y4֣ȀZpzxxl8V˭x%ZȪ5aoPn Φ>WSgs&៿ۜ,e@I'ȳllپÛoJaي.ckvoQqUJdPEOmP-nXe25+Ρtft`Ⱥw|X.+EtNa &sE]Mhn4zn֕lE)'Wr!g@|cuB2|7‡Wڝ CDHlaWM G ja+ð!0}_E X$ QT8G  ǿ*Ful\2Π$]-CˋGܲQ>PUWGH^U`TbHI\ B-Su@|d @ @ @ @ @ @ @m"@BF옕p59 Njo. "AZdB6GTbWQ3Z"jmF[n@ףv=*A܃Wu|F^߄on|>@ד͟?kPE0 \(CU(2D+jCN uԋ *ԏG-!4v\ۋl.7DFz YճiN= هC!r 0YG}'S?zy굩_Njݩ>ϩˈBR@j";|_S4z}>F`KA؏Ӹ/#^|/E)M}%l9m?W,E$2c:AڗKK ]KSqHƽߛKcdÿ˥ $4J W.-to.-riz[RHu'#k(p;Cvĸ@V`<] yJf( CM7%r=;99Qt-qrwB_ ߔ/=p_6}UOFGv\42sdȎ+3<ڲunW}Ls;?d #pz=;_+U}Կp1: *oޠd{n|;7?nru.ey:C endstream endobj 213 0 obj <>stream hj`# endstream endobj 214 0 obj <>stream h޴|Tŷϝ{7$CqK!^, $ФH @4AP Ϳ4~3{7lBD^ȗ9SܙgΔAD!48Vv^JlY#G8~1ȀZwXJ\IX~껸jO/Q?;ٍRA jDa?"OT+ ʤ2M+U.^ /C߽=<2<0lxmƠ>P剋l3d7U|.GLJL&JRR4""/;Y%*o1KEȱiҭa4^CD[i}G`ʠSN_t a5*;L| Y֐I$jzK2"Dg ˼s{ y7묙 *̦(qޱwIhǩ7Ch8144i2ZyB/i:͠4\z^y Ji-Dk.ŐCx%ޠާ~[6BoiCw\r85 Hlw}/c(_vANEn/ ׷ɋs)#{O?3BG0#_!=B' <ח.GtN1dkT6J2pQ1׍bEUXAQרg41F*Bh =F0.^BQG/@FǗ{7?@^[6W>- or>9>GT'(M ]5n6!;؏R/КGĨvStѭ|t/T==_7Nz0Piv#Jl :R}v o֚Xvܗ9}u =']"VH OTӨy /U\ %:݀O+:|$TV4 fpȕt},aXAԉҩ' 4O/Zh]vԱCvm۴nղEJrRbfM4n԰Az5 eJ\,a3bR\-2 vj®L2'D- 83t2g HٷP_ʄF3bc).dsѭs:ӓ]n~DD 3BdpxZ쟓rC\I1o|jaFxC{Xƹ0Bc=<*%SQ.c%y,Ugْ̍0QxWL9<%'gd OuWٞWr M1\Μ˄ʻΞ)(ɴ%VTeR^̈́xP72mCF3s/)f e-]UDL~ Wꪔ wd 1h}_;=<:wVff縒}%ݓ OB)j"}f^bj鞚a2D_,v6O$P;fJ3%'#WAUsF#ͭ _S[S. ާ羌>}7Jv^ryE'\xB՛;,UoAl\qCw8gNdxB Jjʚ*<C:Q ȯ9X5_jUΔ (Դ+hVt=j ?G˅-RXNtWJ蔮M߶i޶GI!_|C_CX`n:lU(?ڙj w_^ڊn9a4[@Zda99 9R27VeZqDž뺦?>F=5vIIuS;&SӺo%}53XRF;7qD ZʔT UTt Du`eem`>Y_ >YtRhbg=s2rJO5UN7-%w```E(႞€Jp7*ҹA._uG`=j@Qm"▞Y5]uDrc D֞b(]RypD, :P矈g㮡>sZ}eA59\O!8jrn#}(gDk JPp$*QDgkHRţBB=DU'iF9n_uhFMig@ ~*VUL  ͢*Kr :ߗ?WC #B2v<멈),tTX99AEgWPh ^Kep 2X %nak[l"mPMe)Dn#k (Nu5IԙOuJpAh JA7xvGRY1,/N(MǨTA|Er^emwوF%Oh9,/wj m+?-嚻d9S ѧk葢f9TxnNp/ 2+^xrVj(Vp4 B^ 1\@ Xࡶ[*TjE1bMvSr))|_CJoci 0DkbEkZ!&Hۍ1|3шURR&ĺȇ! RS~6UreeW6>2C 1ZW aӯ>u,3&Nqt/ B.+ hM3RqU&õv0 gTAr+Y%zgR5~Va_mܿҍ(o$ApH6?SH)z|IIaS|pw@tjwhg4ļB W]|;v}<(/` XߢN -bh:k@ 3-41@314xVf[h1L4OS6XdA֘}y[I(;~DYTy^;]2,ԲWABy $>1ПwF0L`~--{e"-A}h3weAMw3쐫I 6XEy}/XL2A S]D!9g/xg/x(A[|Ko^Ryͷɛj\JTvS󦅶S55s='sa)ro.nкU[ލƈMz>"7>|sl.F!cy+z}u^7$q#VA*G[?A- 0.3A=Xj`4fwuR@+KVd0HzU3\zɼبH 5+ɧ!yߞISL)WƔ+{+ֈvߎ8@_Dxj8k(ղ=a}V;F1YϣȡQH? HV;Tx"Sc25;lJpk 憁sk.cQO~bՓʋ" X7{xhyHc7ţ40zNHDZ YeUIvnicy\X"PN2"ߌЭy71J*%TM!pxЪF̓ƷG8c6zڲ"C'!~ز TC$ʛ(h p 4U1R*hC9{ X=?RUUϗ@,P` {Q?773y|_($9_?*m c&vZ-fgi[MQl糃HV]EAO^S^A #r[(E7vKl<|%c^B6LF`<)c/ ˔4sHtoa G`L= f 14eғlCh;cS0'n79\vEos/\j csfĠhN8ߘW(j-ئ)HQ@&< fѢ(GPs~c3S:FZ }ʽqTMPUgTq>υ9Zb(8ֺ[ԎZ^Zk92< z?ĩi)"n*ј'KA:vcXI{أT·S[ 5{Q i/.?Wk gH#ăR! b+Fu؋ d\H6v<ׅRE>V+[G,ð98. J]Gm7]l[6 *ռ Ю| vz(x[n{ދ>(kNl7g"?@\51{6EKT:<;P9: %X!!ˡ:jyunEK2A[ՠh{0)ƚEl8~ka=";Lgk&6g/Qc/ e>}7aq̅>m6cQDjx/[YY*s|Uޓy7Y!g\ˉzzS7Oڶo3[`'cd^Ƣ϶R贙r [=kk#ϲZS-.5R1 QF/p9[Nѷpgz*p?o +r!~/?K;OxΓXڟsQ n{o9al3B9a ;{ s < ~3[}]E9RA(=n`taO5ԣYuiBu"97ȂފnPhU豽XGe=k;Q }ksUAaվàhG9D)C}Oꌰҥ yJ2>ᆼ!%`i#jk]j<55GGp#'K)*[6B(-fj)P|I9= ~ʼ"/_KyCyңl<0?#p79X/kvɣ9(<㨪w"T-(љR:9[06aڂo5J/{XSU暣$m[DA'+:7;j2̗`%?]JCyY@; hjzC; ܮ7|D1a50D=m>܊uW,l1ze<`.'DZSLk(a 5z[^W54k%d}i} q(i:5PwuYܳ`:?C{O6=7xZ~9Z϶Q]c<vy IbMvVſmi؉o#VxB^7SU^軦 lXraFQ]4=QYʊ,9Nr{lŰd0Z^Tߥm09jQgA#7P)c 19P_ֈb#Mt{MukoXcZkWR)5V;h4ҽfjAE;Tm戮`:X.b5lLYizx-Z(J?-{h{r 4Mej 8X稳4XO$zֹa`{MkmQα={{bUxL`+Bs:uzNtC!#, ?Q0Hܨ@~/ۀ<nQ?KC=Gým=P mܡ~m9mܡEz`\Vbnj3Le']fCmD<E skU"MoQymiy s[lƼ:Sk ^iOK=2xo3T)SBd0w>>5i(MzecT`J=_%yZ[8(oZ!1tr<֤,8 aw_95h}QVGS>W vl\Mٰ4`@zo!FKaoOP Gx1\7mABg-<.vWer Xb-yu*̏{77O¿%ŽoO_l.z4NYpq ͻwxU0߻sx "/=co? w=xyH{6}D%@ \ըۘo _^9'xo p,PW#{<(;tr| O?⿣O۹+!|LÊ 񞁛cAu0{꾐= ɚ{DgwwU3=A==V3p‘p D{.aäqvOڿ$΅;vp[UnR{}p^R0u<:%t[ǟnÛ{# sX'@=f/aH玳v؝ }nÓ}Zxl}_']`I=S4\ź}(w'.X#f o#nk]9].vY&_`3CSתNi u?P+.ס뙏P::RZRV(}suwo ºȇ!v*)z*Y>ePRoi:3:1tE,KRҾC: (O-tA3?CQ%Ƈfw:'z3UXX sj{yB'" ~9A̳j+sd]+B5 y\RwWs(VϬ'8jal|+w:%_S2/h;)iIwanq&Wߑ\gu7Nk5uZOuqA^S{+}ư:#LZ)ϓ+nbP*UJz^E{>vVT؅R{4x)iO;طŏgaeQ\C-t@$Ak($ 0nER֭[)i68aYjejYed2p?g>c?~=s3=<*>9{0<&k~Ouie^$mY n|JPt+?.?aC;1Ub~&Jr*_`Ina\% BN> XZ]7C++~g*g=yKK~F~nxOA }/G-W ިezQo2u\0B-mעuk]XkvE!( SFZav<^vh;߇)yu8 bFk0ǝKm k9u|۵0lT}wgp_zlkd뾄|#aL/~ϗۂkD$E8XA5h±V!^S{_s6\ Э .{.tD?Q}f ?eׄo!u~/i g{mo }c޸~`1qzcH-a H&do Љt$6b%I$$XO:ޘkx'c(!ɧ19D>$>9@%>C[d7yA^';v*y)`+i&/-veEl"^ˏkM}H:Mz4\3y@7H~#_'#@{O'c9H>$[y,an/d L9"OUE9DVE`ڝS^rI r#?]!82!Ѥ#G|F;F^%+eOY!ϐ ȃdy4K|2%sd6q:"Syud)%}yVtқ"SHTB"=HW҅t&I7^@pON_OGr@Γs,9C'w[ |ENɗ r3'I!W;Fd҉t$V)Lr y#g=|K!qFKNd?ǩCەk^N&'ɣCGa)'U pD4r!UJRArRFL!H_SNz^$I*ǧ'1@U.־|!#m6虳տ,'=7*#ϒ|k3d5yԂ.4}A_0=O/=.ڏBQ3z Sx z5xF֓'dcd9awpm, zr '\2&nRG\In""3I5$d &dH&x pb!fb"a$H!$9!:>DxY1 Nn](ڭ6(yʭz%>>^7{ޒ;_3_1̏/˝QBasJKOn9].s׹bq{Mܶ:#}[-f;ԜST\bpvv;睢pSN ;mrv˱9QNSʝ)gȊ`C,XbQ.vIBum|#mBT(eJLfڧ(%Id$eg2>N؋S*EBcH{r'OΞ*rk9pI$_Ԑt>:%6QMQM8 --q d n$ZccWn ȆH6!B8q< D, Rb9gi6X r\c-fu]ws,&GՔf LrIt9Sn9C Ja#ks!m!#w8}| 6Qp Blgŋ)F 3))yƶQĻVon m7Ұ \s"!+1)qUPڰ $nƧLv])))Wn&΍::?Ի@).w >ۿͥ>;E]SS_v_~?:Llux3 " ^LI " FFI(ntD.xSDmXmGt~_L;zЙpߡ3%FtmNviI"k;Q~}H}ғ$ӿ;[-r4ۖ]$vF؀дĴ䮃z !Ơn: Ժd6 PSq]//5d_&G/8*+#)Kbb2 1|M[b.,4њb ĨN~7 fa=neA(ߪFa6DamYb0mـ.r hF!C>![%ڲ$ڲ,۴ejˁBdòeT-x-:c%ƭM)T P#tۆa)oK K;M(¶ k{mϫ>S {T+Eu,~3SmU}Du7鏽X/őU}-WtȪiW:۰gmfݖY]m+sي]eaUSUY5e#2~V岕ꜥe3K3l5muS]nV3tVUˎQ )W:xL0&333mg\j& 'pH0M"q͉5~؆ [=s}B۰^  endstream endobj 215 0 obj <>stream hTP1n0 -2Hv3d񐴈DjJ: :<ܑr'{bޑeኃ#(Jĭ[u2E=T4"/uES ?";/!AA]^IvK@(׾Խ)hi@Ro ;ڛj7>stream hj`e endstream endobj 217 0 obj <>stream h޴`TS7 -@ذ$ !Z("\@b rQEDݬ `G, {g]6KTwg̜wfΒFD j;xXZ-(7g;_~DZ#";jb>cQt͛-D&?jD#}IVV+( &M=Kg=i׌+ZDހ{¹ō{=pGDƺw݆h 0/EQJ=JjK/Ez n_&祁nrzHOuF[r=8?7*zhEЯZ Э*}C/tV#ͥi-Ofk:U3M3w wD(y{gqj9#6ر/ov9np뷉kS5SL3ZKh>]O h!-n%t;b;ZJ^ZNtO+z5*L2T oZGcM$؇Og-= G+b G䧧ʹ[К/ϿLeK?tyLF;uEoЛo;!zޣ>cG3:@_Wt Ƨ5b}K!qxszT!~E(:t\[![hlGzuzܢ 'О%P$▣WuQ∺!U]R-!y%m鶇r=_au-5õǡkO88E r틴?<0:CM At$t}D':)?A?c<~|Nuo3h ::rCJt͠S4cZhqZ5VCOPH B>ZZC-fc-Ik%kMBhʹ S6mjZ- חiZg+|Znk+5PM3Q_JyzUcnj52;byC8 }r23zyyݺvܩcZ֭44mRNbc\IHVٞ/gzm-ܞBxyʩ.ܕc#Ĉ3=Sw[=n,{62ϋ,Ow\^ftT#9)'e}Z;ۗ3gRivA+dNi݊cbq+_sOqּ&/1W)م}CYҏ2e^>;y'2V[KOE-{B$*5KKolk>y'+҃rnx$**;%$KjBxP6ϗ,rt*÷8n7%)=eO/![!uGPOhoΤE֭P_ !3R MZ8ԓ6KEzzi_X,!Kx28<ܢ &$*N6JKrgdqE^<j|Ut{@L4JjvwD_d_z>/㝐/Zkn,(S"b#'wDz/Z 聀x4tjR>p)}E!fMLO?QDU&+W<r vFyr=*Cr C۩ R^nB;ޝSZY\TZ^Z]0o|gG,PV(WѺƞr$<][2lw lY^݂@Յp%'nI'Z,CM!6k$~۬_|O~OA#՟*p/I4%i>ӓ|gqτ _'C.t ̅1&x0NCy)Qh,ݛg7ywdt`c Ƿx\(~m"J?_4rV9 FL##C۠ep[z'nhvJ7J/i'M 1) Fh}\q(8Q&ciL"LhN$@eVEA'cۈWJqs6ŢDaUvOnCQEm"43#(Ʌ`_~9},|<]x}]PFcyaZAtLJ܂MQ-[&KKU+ZH)ѼvY{3%xe}Off.m/kы| 0o2 +$8BeWp/36!Mwqdb]ܔHh*4 (MA&=JYH2CuͅTfwv$4o !fxv ܧ(.+y/R+ZFbNd9Gb|@IB>sXw;f*1ަUa.p( njԭh ڂ^ʿ"*VAduDw MAo0 Lÿ>H0ADdaBZWHn5G̺TbE*|J#C}@Bk(S;侞ADsrtDZFb{wSOE_O3W=캯kvuqsAȥ_ j`ov}M7F"x#_)@jϰ?f%(k,5@?OD>,4s5fsZj;s @g0LM5 =L1؇:W8>Kj/1 i}W%I=㬐:wdWd? J28nC,EzMGЏ)ъaS=W)h~q"[xSxc[x7"iC Cpwu _NIgQh7}uޥF*Egi6k8`'L' 菠%[Euw5Ƴ[Z1kW7 `| 0A. S$#`:X"oӍ&p3`QF[kP 8зguA MSQCC,ezPi"@/:BjU^qf e*3PK!ŜB`^ `R|o<;5D1o۩y j|jϡ0f~ ͋b.q:%2yy K3TGIT38ҕd|$烰zen}B3̯WTCi2ʍ36`yd4쑻<@zgh,ǕCㇱ}.$ "ٓƛ(8[SB؀@]i&ۺތ& d{Τd{^6*0qQO3$leEQRvu bB|q-nkؚe cgqn``\O!ҋ~шȾ~NA{( my޽a e ?A!R6>p+ S=ڻ!/ GyhGy6"{̧G/Kdf)5FƨG3qiuFoĸ℘zWb íoaMnlT,T́sļ&cwZֳ܏jr3/dsy&\Oͮ 1vŽR[;y :I?X^Lm;lƿl  0xP`b}1ZQ6d* 3o8JmlruULRWqGTP M0u'ѷAֈ] U;Ĝig`<dS'sm9<ͱעs=-Si9kV8>b=~(x|PV`_yIU%zUSi/"t(ݩΛ_t\s`?C14s5 xk* 60Vhz@g' 8GGO/>$ng=Y)ޘEa =A]uGҪ %;_mX>X'8bLfk:1wuk<|mԦF 5M`7j>-j|a"a̿c\!4F7D51Bw!mgA\eB9H7UbhA_}_Ԗ-AuO'9؏(5~ h{R[ 9' !xHLꘚGL'+!0~7tK0k4A/}WK׾$5&]TMj~I4\ rP [*E K0?A,z̆琤!VBsp=u$ߋ˽t>bt!;|l¼D[&QMs<0ff#LS>Ig{ab=[/,֞bwk)sTՕx_>qxQ?׷Z~;YqsAy\8'nu&k4uiWsq^rmAڮQ|99b?SZ5qؖX bou;k~ϐK>8~9_q  L]x.̋YByBGP&f "OEO9@YWga{{`ZXהke<{mkMXc}eB]5S{boÞ{b@C9& ́(L?)>BϦTyKtb^ǚPU׹`Aruq50o:SEj/:[fpa WQ9[uw_ nKyxs&ȳ9"I |Uߋwg5kp"kF;Yعd DQh_ІKԍiVOczS3lW{[g7o|~f.ƭ\N礼8T{Ђ"|Wó@5C8}*ܗ ߛ=6=(yם2C5qѷi>s x91f4?% ӕ;&b%첷)l2`X>]x[G+Ώ0YTbC7n E峞l[\|qZ/"[wA%Qw=|رJ\^>]%gr2 mlGOE͵lQg53PqbSM({Tly/e4\{b=3P"qft򜌌ίr뿶Xknb%ǪvX C ;S, #Z('< ;#$$= F>wsV5ag~yz ?ߓ{ys:"'XG8PeD#=Hzdo kJv^*>V|>v%ww` $>51/O`5;92`3"NI_Ce|?_1c*K֙ejyXku\cM[NR|OLmўׁUT_3J{Yt~zB{Y9~Bϩ&<08SűDc5ZSu,c :%raw]֠5GuNWSmfMwF')W_YKSѿ,|? r?c6esP67vyi.5)OCS, wP- 3W먃8;ն9gC秿SOCQ?0O^4Z1v׹<i4ż7G~`_P^}J_m m\!l,׹|?X_[Ic{v=aV3KԵ ۯ+3TװF$3d\lX'VDb^YeBH_hJ$og@"//Q*rEErUqzn( hUT*U@YalEIm[rG_CE5a- ɳ!Wf;N>.ijч9n*Hяw~0q8=4S\8pN0~ޟ{;:D#r-/{\PӰFI { "T_k8̹ڿ?S}j܍ ̞ y)l 6ØӖa.#wa3' kC0xJ/d vk(pjg l Jڰ~g?0p?m1g 2W9ܡ4:Ǖ;_G/fiaSq}5c^kf֮;pOշi~ގu `kA`wi#%0L׿n*ïcߝZNG@p kf`MQ<ĚXvR0553Pܣ3.0a{3)Wse9VT|0N`++3)#CߢS1A\v~)7ip(`2(?A;6ogDa:;$5+_mUq}Mĺj)XfoAuP\hZ&=pp@X?з`G+ڿb/fTfr.fbHCE=`'hy%0_Ceer.j u>½>lWdۂm(Ke$Laox?F}6ρ<gRM]< ~W~N1D8ÚL|'g9tjnN=lf'jኧqVdkS80v<%e6BVL=zȷ q$-~ެ3oL^{Ƹ6-YhY ښ:hCq+W:SpQޒn9'۵J"loRN~c&'{bN,.RJ5܊g[vZ~GrHv.PyaX]~S6^wR'Yځш5B񽡙ɐca]r0̓ЮCECS ~(wv4H|(/9-] UȰ5K +0.C( U )_u'm%o#kr<5kus'a9C A}+ϡ/UgLnhD+kx~x9kg%/ߟK>4̥K;>s(bFST~KWV>E:UfWN1:{60vC_ ^6:W Aw7et eG5oܮx~=FvBCD\ 6-42 F=~}~"ƭ#48||G#AxO`(e.B߸}M|\L #%[v0_ҽQƁ<[5=vܘ-?CATїйz"NlV٭_6l ^Zp\0# }i'To+kpnPgFb-KN]WMP׮ S\`o)1P=f7`$sVfYO}"L*ssN s.X"bb#ؠ/h裘=@GWBg{HUo(s8WD ?(̫XFc:82gb|ϭE+%a EL0WvHqXX Oa*cmU*Tb*vD0PhAڊ̹gq]TP<ح֯_B#pEV}߷b]T{mTD#/kΧ9g)1EX(.f_Dw-66Il'Oj9r7]r'9qc,߱e9r[Ch7:q-W _A|9gSvge,|,ﱼ˲eb7;,oŷ}cu,`βe+˫+,/K,/e3,ϱ< ,~rvSF!O,9,,Y,,,YYzdKwn,]BtfґK{v,bhmJc6,YZdKsKXRYRCxDn ̞n&,I,Y$4diRKK]CCmR%Kuj,q,,1,ќg=md1XthKKY3,Y`]V;%H;ɞ ,'X~b81Xg(a-!: AB,_2!_ X`ܟ ̟e?'>98Y>`y3{ӽ˲enwXtoqo:o?!'7ΥƙmeyY^byz g~~YgFOY>X䬟`8F w!<; :c̃:8ed)1&GBLl0>SFΓñs0IA@=:M = miBIhi MI>N4Ӯ~~oǚ(z6W ƹg(e/졔)e7̝{2w'->̓6mC4 e>@)૖+fRBK;8A?σx____`x{Qm$x<0f[DJ7l1K76fq/8B$_ЪZ*R'KZE V& cuINt;ii*i i2)7hR6iJ%YHf)M1hR)A2MVj?=.=M~ .ؖcEpJ Z[~-^jF*"R H.R>i&.zq$idY.c@e=vVVFZD*%-$- 'ܤ9bl,XZd'RHɤ$R")4fȥ~[IY 7n SJS*T prp+άi>?ӗ0G k~}cH=çK %z }aWJ4<|矊_>F1c|Ȧl!>stream hTP1n0 -2Hv3d񐴈DjJ: :<ܑr'{bޑeኃ#(Jĭ[u2E=T4"/uکWl ڗ_ i~qDb/YD% k_lA4 TJ^u͏f~WHy33'髑l>|j9Mrj endstream endobj 219 0 obj <>stream h޴`TS7 B %7, %HoBHDJ(ФsP-b EE^ &6`G,\ETa]6KTw79SϜ93̜%j22h靪j=>IE%S2YDƭ:HCdL-o37yb\:kuyh"6h: mn_ry(7vWqxɜ)%ׁhHQ{0ϓE1j3J,jCCz]n_d&p}А^/yMA^ܫyI[aߍqnW{az&OhqTHK}K?I4HkV16M7 7D(ijlq;G7wڵ(AM߂ޏN7v7JcՊSBsrZ@ i]Ii -knt#b)oS9LЭti%Vt'nֺaROz6&~zpoDoG'>~>>>_~UP%=NOrm-= }=O/Ћh-hmʏ}B?)^W5No۴vҮW>zޥ>#M{SK/hz3?FOs7֗5}GSIT!Hb訦IrpŭJjՎz:zx nnm'.5E `jnH}?8\ínKp>/Ӿ*Um\Oר<YD~MTHIk^VjӲdo0:FM~Z;:>:#c3}}~q:SSQ!094M :05K1hZhuTwFH| aʧ@kDk%al%kh)Zˈ/B|Z+- KT)Ӟ#:jWmZ:׺h]ZOܽQi& 4NXC*L?nQ#G6tȅy ?_ ճGn];o:-9MK[V\lǶ0 i.Ǘ[ 4+GQGa qB[=fbN!131oӾ7 y7kc.xGum)Gm8RR›dZ7zsf#ZqY)qQE\-\UBkWSz^kmFjN|NvRJJ,W xT^\f[nK7'¶}F9ee7 e,<%ΗhCfy#7Vj[vPxߑ}\;5(%?b& %pYnڜA,K*)#mA@/-F9dY($ЗMS?I`Dov}/ i'Mc-RΖzdd"}֜_TՐJ }^n#*,0+MHrys / uvMz3u.G 1 S<5pNadϩ^RJ WO)V%|ۥ;Txء_O2 |}RNn>^Dh5 N50) EHIn@LD^ IE\6ޜ)ͭr\"s`(Hś ?(/n& }S|>~~6kվy#}yc^2K{+@)9,ܶIfUv  Fq>7C CinQ ^\n"7[VY6"#$pZ/7hroO*E|lcOfO[_-9 lYQJ]ӳ 3 *Z! VWg_d8bTg2PSy()F6g_?4Rib 9uA1Xo9p}`n>hփZ_`1mI F#aT }cSY^LSzѺNB3m\Kmņ9M"^`P|oHCdwrm4`/CXmϧ| kNsa}u(%JzyǸ.%a,j>P4qg12񞎠 (7j؀1R%qGn!SL 郝ŠW#oƫ0/$SvxL'y;4KFH7'kݍ[OJ?Ǹs 柅ad.<6G]Jݕ>ZlUU]EMv<_m !E*w(!臹iVbTi7 `f*(KFxΕwn ʱմ\9P1_A+?g\E\dN#f:bnZD1<唚~e0VN^N/ΫVyߋA. 7_OBhƿx(`]gU};5C3HYoF"4gOh Q \2ч#uo\xc'K(g'Ž^XKHrЃ9|g]V5HGGO,}?l5>FyG*yv7i1#m^ByHw9tӋMF??x;vúY+ 7m}QoqmP;C%Ӻr=G&Ut@K0ҽ>06H'{x!FuN`;L; [nO14~Z iܕNTj}[=>[Q{4_[: sr1lNw_n\3"KMp~P z/b~hzP_)G_szM ?5 FBkL`\TxCOg/>$g=U@14K#`?릚 Xe5iKw_mX>X78ObL}@f5]n\GĈF"޳@*c-E_pw!Qa106.ٜyҼ&$ؘU ޅx>0ќ`w}#DNFۉj,b)0Z9鷡q_7 ziޓY~R1YXN6©G Fd% )Hp/~=15jhj-˄K_gPxhuF]JG}E~6{2WqZ1;3Z*b; Sb X̥@.Pd+^8sD lW4Z'G.,?=]nG=vO}ʿ7ӱ#hc5ƳSnFX[4ǘ0Wg }*7v^zkj_מ;k(sИTӓ6x_>|xQk?׷~;줹qW%o4Dd\':{5zsZj%<ܧ'ߋ˫>90uG#`>u>Uόsm\xs2Xw 3 ᳉\}CAhĊ¼, %D't`*7Cq|9AAyA|"{ٸ6~u{=V3oG}fۄ57[Am%I)w/7fٲ7{X75on.Eg$}:Gi < "ż5akگ>؃69{՞n nxsg/9dsD퓲 ߏ Ͽ ʳ/ws bhۨ+F*lC1` 훇R3VZwu8q|Q'N+ Vp2nquLh_6roVdžd;ƨ{Wq8 u=oBr=c$is觫wMx-첷(l20D=٫`nϏ0YTjJטn 9[\|)q=)C_(CSJcn{8kcz'8̍mj9geĵ?0ܳΫb:kP!zB*AX>չ 1ʍ'lxӵgؾTao(y3u2{P2">B&juNFV_GZ{37dc ,8cl:ἷr#K#eCgZds q`sN:kg\qg~=:׻x=ԞqBu}sC\+nEuP3~Kag0z`?!ߓ9_x3v!@<5_GS9q+P} X3)A19Fjv5MF l8BGh!H4E <{g|t(ƿ ͬm0ӼxƱ'seGƣ6sMc {<ч> tN޷+QCs ۇy-󮧋?,CZ)~FϜ>O0>U.>^12 q~|68z>!ˡú栝`cי3Wrwy.TM^kL䳽M[s3>}3uЯD{^&|g|<>ųΒs>!%藟Qw](]y`8ԧǾTOўxRCk!ϓǘ p%4;B_C v6!<}='.D@sm ?B\˃Y6ؔf#( =`֣|}>u7Q5 U禳+ j[ߨVI#P1'Nq;Kz1Zb@O#^(^oz1ޯ_FV\^&'lDԹ:EkǰO>Ir? КX_[MB{N0>s\>c=׽fz>C{ 1/nA"!aOƼ:˂ >kj4o=gBk"/OQ rI>I5qzn=?)PhMT+D06^Τ6.jG_KS[JY+33cӝ}Cy~.GgǑD QHBϑ9uG0|xQky"s!M%=˪8L_Tkx̹0옕WRݔf}ՙ'@0v=w`3 ڧ)gwcޓ2\^̪WPQyva=JsOp(HGZ:piTqҾ?]ϚY3q})obk{pgmqY~ކuֶೞW,(zFjp(?n/CߝZӃ{nG`{=dn03Nn X9> 4Xs ~ ~h V։pWE {] K]NO6 d;VLB*0vp';GE9aߧ5*>Z`\ f纙頡K!\ :a{9.9=bFu{ v۪u=9R qn.u@]pb@&{>ZX?`Gث?lTsf8lhCEE=`'hio0_Ffj.j `"=Į8-"M)[4Kwp}kxk(tc>bojwu`OctzU ھDmnƓ@q|VdP<Y;Q2K hVמAc[8+q}XBu3oA.{6XbY: 8q/.ו )xkxoI}RZ}ocsڷ(SߘeϚޔgͥ<#5/F^xglwxƌA?)[g_ ( ^7]ƋNs^5 \rQ )_'m5E D#59g=Myn *Qo^x߆ЗP!Yג3; jjg*ao;'о_ <EB]tZWɍv#E6"!tԣ2~꼲A_?yG=g:U8j$< }-⽄QQlt0>7ϝWteW6ox~Ɯ=o`cD?C9.c-|{KLPO:5Eq 7;#qod ei0fZ#|o}e.f1\-/ _oW]|^@hnN^:zVҵ +%WU >tq7[UwE/H=[õWq0$#^:#)7;/vY~?fFC^28ftajFvѶ9,`'""0 No*DD'":'O 7SqBb_ U\6 ..]wDQUe~r{(Jo(S#%}T]ܥ<EUFc{7+uZut˜c{j-(ZuRtYq02H{ iLt92eX?CF8ťbBQ}\4. \ N= }WBP U;\B[m\"[.={UGm.Qp_Qe4,BUwx"q.|Ʒwzg3F/\]B*blLn 2Q_%q,ȏ"?|/1DFA"_L|%}"_VESȿ+[C|.ȧqXdG"| {"#Kdb"o)}Cb.]5WE^yYdV-"/I/ ϋ<'3"EyJI'Dl yygȣ"lyXdce!DKDy@~S'NdȽ"kDKSU"t+EnY!rȭ",YK$R&rrIpH"׉\+rMeR"D,Y,rȕ"D,Bd"DHeͺBf)2Cd4KEL,2IdHH%"DƋ+2Fiw_bDF)2B$_d0"CD.,2Hd\l,L""D\ GH/MzBzt&UHgN"tTbhM:.Dڋi+rH"犤V6 i%lee^#,BHH3"MD$4;4;4"DD-/RK$N$V-b". 9)rB"jiGW_D~IGD9"rX;oE9$rPw2Zde":Ⱦ/EL̂21Ws*s V&B>#d[#CEޓޕt)Cm$ݛ"K᷋&{21$xYnMJU2"ȋ"/jXQCЃk%K#K'r=nr]$^o%-K_%WLЍE@ȕ7 /]?_tݨ~%еAkF@WW}ErU+'Swjs/t=9ŮQ!Ao| pMcG<:aC_<pu7.;n UM7n4h1rѧ7!uŨ//bNhۨVBBhń."t!̈́. TGvTPP5*BIB*%GXO RRR¤S ?0~/-o {G !^/q qS0GO٧'ZM6l tZKh ՄV"4Hh%ZFh)%J %!.#TJ(L(DP1 !?!/! !C&DoAO/ jq}jۛm{_8'Ssclρ=^޶;}فiv~7jۙδb'hI5Y?}֑WA#sBHumޑGh=OJ# Um٭[RolVw4\5W܊jjƶ [Kچ[ {a7 O- ˕]E:FO! 9zjᆏDw0Em\8?1y֧E֦DVWEC+#+,O/,M/GȢt߁EBhtt;"mm6jA5=I '|*V;8-79-6JmzQ M^,.M-OX$j-hjVDE&'Lz]}BM=zVcӣZV1j>g4*RުV‚*=J&%%(#VA 6=*>P.7o+Sr 1TE!J9 V1#% 84w˦:8H]wߏ_EJ;W,=DQ7.;D;-'WۇK>Xyp/` 5/ mٶm{x[^C۠eW\?|6L#EFV= h&6!?߶/!D?ϼjIlc^d(B4p ){ P?:RP&{NiTD WбfkVJo`ie7q򗯿/' STW'4/jSщW&c֭W2TD` HʊףŶdU;iFki9żq3GrK0.ҟ(Rwv{V [ e$`ٛg;fa|^:Duj rtRAK; r{}Rl&]VUq5wY&3v?$b:ɾ # 7I/MBMuyǧ~+8WzJdTƀz8Tz)7W.8BFe´$̍T6ɮLX'%:4h5'\{8e>>4Hc`ls$>K</dނ[b@ YE2ɼ=K剔gd}QT7폾Mu=/μ^uۮuݣtKME7}|s%Ø`L !kpEPuE"լYJQR݁2ErQPw҂tVAxT*`kܒ\֞vX65r'RdԵr5>V3F0^ "&t Sd+L`&._a-3N2@bAdqVt CVef^Iu4 8|ZtSc"zc UQ]R^ E!fR;M"NlI<@N0DHiORHm+ $J>,19sYlUd B*ҠiO#F֘ݮ6:(>J߅*]7Cǔ"7c=T(e T^= ~`Ӂ) ؠ 8-90%`E*Jr,E+kV_t kj/mybzԓ34x~=~s5-6Y8_״ ?FJ˒I02]-{w?yhDg+{Fяs3JƟU_Y沌{yW.r{ L5? Qqg0q hW(@0Pf켓ҙNzKHqi8^h䇹cQO;&RnP('UDiHg(to,0ùQ)srqf1Y6%ڜѷs XiA>N$d9O3#>t +f2&(vt? ufC^*(mP%M), ^&Ń.ВQThRai񂂌T1s:r,rZ_0|ĖT0z+IfW>?\+ qx\'24 c&peǡ.ܼzWa)!s#B9靠Pbhqza_9sp%Yx(UzKw=I_GEQ#^:8\Ɋ&4E& ɿQ]/RO)!ƧT(K% Gy:s=[y<1W!V8P$˾i񔙥RÂa?{֘l>(0-W}wYW—S;J3-;I;sEnˬ^E7D2Sê+ֶ, )28F~ EQ.,[ ݜ,2bdV5r W:tM/U͗_YboN#zLBIꦠl=]7.eyk O=~'~폏. Kv!AGv6~hobmy$-ݠ-IԂ%2;hK.{FK➦&7p8S}~*9"rFxZLQ'wYV]⨲#*gˉn*&(? eZ!kIKUX'FtT"%)sCU^7oZ$UnuUck7Ydeo^&R aCg cԗ6ܽX#U.vB p>}ԫL^6&oADRwZiaNbeT \t&-l1{GLЏ( GcI9f:J,ie3dQz5cV ik.+g\c9 ?sl4Af,xu?j,sh' 7mx`&z籫Z/ʘd/70-xz==<#v5Td[A'o |7ќOlppՠ/w<+>Z ވv; *g9Degd[XqddqЇCe%ڪ}\uxm)ָ+{p.I˂eJ#iT j-KCzǮL.ԕYB_]-$+~tIDgs'ҫ! _%+ݬ$[RqSP:l)UAtO(vT6qc gj= sLk4^UiE}$ CN9xOKK[//)Μ҆%,DYLOn3״i5%kDo.< P\36\Ig~ֲ ޻{;yUlrM}x3}jC堍 ]^*ݹtx}<-iewS})1مmDfXxU.}xmqJ\5@E[|&k;QYPy{5MnFsx5/mnT(]w\-KPmYi)l(UtVE*hcUZm q|pvXPuKrh 1d?=fg,)J#*%\,*(߱rþeʼn]UΟLK/ KZ*d'^:@a~ӵɊ*/菫=UXn #`èdc]w +q,97S+m/ԙT7b5,ˮf؃,h8Ib[JJnn.$sJ~D ^24R ~h^,5nL$c&ߴ65o|Cʚۛw]Z۰ ܿ!bUlABS'#&Τ-FQ2u޳٫[G*`? k2uSr)C۲b  WB~nr%X3O\GX[Qm:J72?<8.9~![`\ -2cC8qܡآIi׽sQX%g^LV k}Qp1Grׯ(JK1Ȗ<5hEgkS=ꘌv$:^`\TǛ?)q2S?aL 4Zm0f>k 6kQ3|C0+^zh,L5;a8|U$؄oVtP3]R36S?C3=ӁI1 @" ~ޔzr*[QBER|%#"04:H*&{O0yCu#>aY*n2Dkk^.䥙z-ᔫ\\%:oS08D/C|G2(j4ҏӫ hRv rj"9E<%oRQ=v^Kbk+sBm_)=5Qh7Dev 4m:l7OIB Fs5+#,#WrQ=)X4BgSgwBp92{kH֧=QĺjۻjSz-zzC1*7O~0XP<2N]6Vjݦ$Nh  gƐFs9kʱ4SH\րٱq_L&I4ު:f$Hm4ƬUR+ O R"JhW)Dه)bl?h5R9x^t ۶갿p:MToCGq裝د[P M ee]3ڏ̔9SL9)Q}zf ̔}p#  _2 ra9i=I_d%[t~\[\hZxf syhco)\7uu=m`tXN8!?Z46|(؄,i e9AO2|]bıT,HX[[[ rut>;c9Yne;neV46c@Cj iz캎/k;0~ep_gxpYafncrvNrL?kzL1;= |R PhZ,%.'d΅ѵ8=-LwuER5kԮ+r/sq~q}ѝ8ż 8{Ƽa.{s)8{ A vE}j"9DQ-Z̼4ݢ[cNe<-iӷGQpmKb--- Kq̝eɍz].4N A 3?qyhybmKsY՜rp!~ ZU^Y}% O0)}r#@oqBe`jN31ކjYdVH-w"V'W42񦀚9@vMoGo#x6BEުJf"(W 5N](稾6_3l/WtSuCzR]02@Hu<"MgQOCrvm_T̆R 8*k.{J_hP .ͣիwRa̒iw!TYzJU֖ oOLsƼmeARr+%A,sHLƏǵQe&_gOn\aQQV;/nlZ^p?<'/DjELJvFu;z.~HbH`俙v\&3@ZpEybr^%ueAҞni'EhTr٪T= HVԫ^. f㮾{aI!XSSyfG@O7d Z0^kq{NJ~ 㞏jQ)-Մy¡ViXFS7Nh횘BV3>1R`Aj4nw(y%j&, ݬyE%ʘ&8s˱S.yPSiI4̪} z8\ M?(Q?bS0 MZ%Q<(r~sg%AC;_Θír%kg5-d{Pg.%Bub?#^bs3Dtx'V":1a3e/v̴l ɜPSpܮ<'ՕVSqQ1kԢb*~C[L5VmAo9SfcO!ǟ^mD 0xQw]_yJ|`;;[BABτ'3ECvv(#١gQ-W0#ga\osg֊ssX}npnFsx ^'oD(dφ%0碴PφsgG<#<(6b{ω[JOyGyGyGyGyGyGyGyGyGyGyFe=bDRR³~, QQ)yj@-h>DK2 hY@SjJCY)'ULR˩A|hFz+ ԓ=ZZ蹙iBqQl񮺰4/ȣ>1Fqa&I&L[teQԍ".*AtcQ\\όRpo=1,{e]LN<2Y² endstream endobj 220 0 obj <>stream hTP=o0 +<ꐀNW=p"} Wu-?=[\޴wd'?A3qlF@&rLdžzU%GNAEv4$P~~%CAA]^ӋzD?[BŦ-NAdMB ?Y|kY=k7>stream h8ktSǙ+]?1r][~ ڒ-KG"Y`/Ⱥ4DWir tM6Wr6Miޞv@̓%d`Z88曙I t(yaMG.͗{H:(vmPy2?׺]~@rlZ_؎# M=no\Zyz+ȴfZf(76ʬ^H;wvo u9T ?@HD8B8fG%3Q$ T4ϊ:lWccdD^Њ`rfG @{'|ڇ=m8?ȃKpΐ"haun Mv|GBNr"@̆Jm9KcTbx` 埑rH x?ÿCX #H>~ uvYcgRr>Nkj^0:h# = О~318eud ҧYf!sq6 O|I2Tm!d`~a18 RCk#:ӳbؐpvb:H3f{'a8?XvFBRERD~H~@"E--%RX11?eKʱCckڽXK5Oĕyz`=tV;l l*,_ßKp>='I9ت,#ݤl%$Fΐ]@ 66M{h4Jҋ?1Jd[߲%;{Sa:m#*A*\Dlb@<2klUi- 6M>|qUЊ;`'vzC ø_&O.|cq3)!s%u%;I? a4arg93\C}.Kw}a:+1D&[\NzA({;blVB(lI9p^#ValxZxɐf1,0 1A.Kcp^('De&~*$:Bv B p `tZnJ?I ^77k$- tQ1Fg#SMҧq+ 0B+!G YI V*䎲 [J!C<[Mi|'\"+1Qjrt,>'3Q|taEM:q | >ކ3-Xo~r>4kɍnSS]kUeE;̟7wNYiI;yrmfdgeȘ>--Ք2uJrRbd4J_V,YRy%-*~*u3y -[fiMXlkITd5"U^8~+tZי)Ș!;3JSm;/XԅK!dR ;JfT3Q JVN5KqT NG+)VI]PiVAUS, aTCj|:_oInQZ* xT u3w1+O62ge*Z3}>}i^?\*2F{}^Ő2 BKe5AU6ãٶ!mvaW159/MpS,5YSR56:5%N$OMtJ7甫ig,A3*8rޅ!,G3||\56Ur9W<"?ʇLCS$'{ 7ibQ1b:GIqoڕnXۀ o6A32j*8/Cs ,>ffj鿩p+OMWS4g{J2E׻܊kZ uy&q ]RyYS4Zܔ'9MV<3蛺%fpW"׫&ޗh6N1*Wn4Jdj?)0Ä| 'FoUFzLxCRBlyd.Rɜ ;H%]3d׵.`.nct\fe_C)i Қ7J^_y|gD8\OA@Z`8,6T*QA(ACCq4/CPF|v"3k kvi{-\C,΁|?_L]n}+/7GV^rBub!c hӀ/z1F C\ccp/4Jpg! 2ğ!\@=pnb6Zyib;9lטlK$hp .(e|Z5pWp!TšRt <wJ2Ӳ-Q%j \L&uťy P}FxcD㢽91h{ı55iթoՓiq5d$='ԍ҈.piDfR^,:,9i?m%~B{3fYN/,`;ǁzZ 9T␣ߠvN7r mvp4G&{f!("siC qxqGl5|Q j}c4)Ÿcf2gޗ ȳwdgNA{ppT~22<WPԂekV@3҆i`Z<dFhUn3% A1N0 AYRaytͺb`n]aBua>stream hj`@ 0@ endstream endobj 223 0 obj <>stream hTP=o0 +<ꐀvA,Vb =8  wlyh^r{bޑeᄃ#(Jĭ[u2E=Ti8E^u-!A'!H5Xd_˶k endstream endobj 224 0 obj <>stream hX}tTյϙ2 IcaLJ7|&Hx2ZfUV, 7mp^5|Oki[>mҥ3]vUj[;NcVl~9f@R$*xi X77uwO?N2;wH'wlFDÑً\ -0ds~)׵" ƯI[ۛYD_wnV~GF[xwk HBx?ho!]I!]~Y~)dq A&|j졿υBXۡ5A4ZjmeRܲ/{p߳cE˲oD( &0r >7|?ϟ됷VD‡1E4!nz3tA܅4HŐ^ 6aeb~م:e2`gYس fr"d#ke,Dq.#KALS3Z+08PdGj̍鬶;lZjey!_UU)$(oAԭڣ ʥѕslBn=X/a:BqbNHoX4k[ŶA8zΐCl=^bږVtoW?O8DC!5JQA>"?.!0ŴV*CToS{!}Cۥݯ}Y{T{YDWmj:Rڵ!iz2F}@&YŪX5 ,vNvtGO'1v ~ڒʳyto)a~%"eHYҵ_lnKEi*([yy\~;IU+!-JWUÉP&TkU2yzXV_W/kYZRj Z֭ƵrGw *]>C~ZL EIi2ijSVG;:"3A2&=@)Ri1-YW(SXeKKK |fr. 53?;+s^F+mCTE8:dy!SnP(0 iT=;4BV1;҇"}vo:{ ߪ۾)P7hC9`u,E hn8 Kvtx+-Cج 6ZP;3S-\U eRbQ3SX0JWzhnZRI3SN, Zj&*FJ^JJ4D>AaB jJk$.wٖpҢ.Pq>rOf~d8)Z%YfeuX2b,#vwG=ؠF)MsS3噾=q>ME0[V,Qۏo Jn>NB b"Q5DxdkD?4^ 0,^ s^e@rq,$QVz)}D8߲*Ld̩.PF4VˣYNШ~E4HKb@ 4> *_!bv|xѾJ[zy!GlxtB^R`},Pkh`j.IYdKZ>BgO;%gCOؘlLQǖ^"5IYԤ/CF`NmX o;iS6M߱6=najl`z*lTfZV٤$$|7.!, ]`8 @];M'lzҦ6=ac6UTnӍ6IID>u5` x8N+ ai#ӱujǵCZߪ7kQVu"Яկ9zg.};u]WuY:Ψ9Ou 0SEVyܞ`Ejn'g9;߽xWayapK+g9v,rJ|I=[/I/M{ɯoɓLJg/L&hݯq--YI{z$ )cw M NNi:g${$c1ϩ㒪r|WѺ˗'WPup(G>stream hj`@@ endstream endobj 226 0 obj <>stream h޴ \UEg{pL2/^E\eQTTpI 2\SQrMb?f֓ZbRe wsX>|g̜93@RqJڭQ?l^W ܗZyL"=ю>H"2*vlD* :!.iAhPvր۵x/rOtk 6z![oT,gݑDk>CaYs?yWW]gijUٮθxWuJNG B块/dY[$̈́xP7*2{k Cn/d4pLsw> ]iTՕѠ>Z_/.ٯ fe;vKKwek|AFH,!%șlg&!`ptr Q|#>?3ά˙3!4f!N O㪑23Ǒ@e8ӳ3d/9]uϠPUz V*'|s{m?G:  p$]"]*({]#] !O2b kvQ\>!$4#*Xu2j| ['VL-+TSVʮ'ma'dwvDr!cFd/Vu(ّvf81bɶV۩SJt(I+2[!"` !nU* v(v9;u˗; Ɂ//m K̚ݢb3| ݜ YNG#!?k_9Ù8 -=*D55ِI֮A}= ̔mf^ۂLK4.ҷ9bIʀCdN!bT*FJi+3eL7e1J&IU1;y&cP~f Ks!s)Иߙl'RmmRnЪhh9'g:1Oa@SfE.tl"-=jAtWFH^ q{W^,Y.N쟁aI]C9+HPሇoЁ<\yYh 5]niɂeWt6Q&>KFMI(,l${yԼQ3hmwP7RS)QVX$_wk + 'iԶgdW(;4ZQ.}UIlRRsO+A˝oԤyO5ti:$0Jp]lG6lS"M㨵yO-K?kbWvĮ@GIIN M Bp2 ,h0'_v66!{mjˊ(ږfULrk .h|, l.nP M&' xu*g"_=acBDhj-(zy7J4މFؾ7P\lOO0GA[q8Or%y]2,H#iϢ|2` >G-[/+y] pw|:e|_w+8=Sp"Br+ w1OG]k$|L"rӢEK ؍:Ϗ~ /*<P:6;D7Ϡ|)Rou'efk{o w;8rqf \~1ڷ|H'otN_?X9q9 ;@v\(IKGE-oڿ[P=;^G+ Q]Zm5U5lUF {nUXw$B?uC8vh(j\P4G*c ׏b^;L|hi,Kzr)&-0(=`t[ao ֦rVs= 0mtjn{ҍnQE0X`GTs{Y>}bJ[1F.sgocyʒyޱ9ƣM{'`#{ȫ5!% 3 Uk%僚xAs Ϲ>c|7ϙ.Z1 $JCy~?{NՍğ|%t^ÞN!֒?B"} {Ϯ@OSi~>8٫ˮ=)JSkG{(cS=x> jl֓u<_z?rf![&)M7S;C5[mGA״K/R^oWmoN#-wD$PG_OX;dQ ƀwYCKNJ={~|\gݗxH3Dž 8)dp)}\wٿ V׺o!-ZGro-E!n_8<_ih t1[]b̪7)`u71nԀS[,s+~R1o? }C`l:?5υV}f`(0{kIyTNctJwR$Ls"KTgẉֹg'eȻ;}Pꌐx7}X}= T3jx4hl/GvƽЪ#;~c=E22{:F~1 ;b*m1"ʋQ blGo^Y&X[kWtsnr~| KX 1 XkyNA]ϏkUsu&yS 9(þ 9j  b<H9K\_^0W gu5 E|s}g"=U\}(gO޷O xOn]<xǔbo 0&BX9:bqtTSͨ-z i;hp][_nAm.>n1vC F\_2c8L#c43>>%[]U Cg?ɽrш^{Ҧݑi]==ʦD+}lkˮV6z|&]~d=Jl/@\OCثBizYw򟣧PNjӑn/Nh';v?iHt!g"M ;} зfںbl/<gf[N%7uM>z1+4k\Mpmˠ[2ĮcP_Wm;HPߑ u'B)/ }$ ַ*u1>ұ2)TL'Bi5mFD.ٖLYGse6ji'w򟣦tIi،hX FB?OY6X&ϲ_uЃq0Pg3hvVfk -[^ h'h9o'E3A/C*^z#n"} V5ψѾЂ,%lb^WZZZ¢#P{4Uܑo] x^&BǞzjBnZp7oY?A|+9&Iya c`;cLWl78|-х⪾DJ6!= ӅIi<ӭLxzJ_F>g)s9o3(/#Ao\0ZqNw0~w^(.Dadq@L3ހGu,[VZ[ r1'o` aGt07\q`%.t<]fA~\ơ?/6+`؁p/㤦j$#JȣxWl2O%S+ \7uZT;my1Kl̎g!\W{"@_*DUx%$#?>GܿxlJAg_!RG rwCI9V~ n\aޑa˜=sv_9Giu"[#Aopb.1|>O_\WsA/b>y=^۫a>i$6AfGx ³./% ~W@:HS^k$@aā$kԤd=oMu߯>}<; i<{0 `GBgxRw̳y =W6ޥY[);4P"bAynb_v>ZG']Cyo{.#y JFRGsޢNl&-Ί!'K2fǢWq]p {Q 0!ޝMt9 $n5h/: lw0d=`zqǚ}c_͍݋@ +}F} +: fX O.| on6q31pYaţϚ7)z[ȳK񲉺g/ZIj?^{j]ձ%Kd[e[ϵc;TbNE.;!$!$PBrRZJ %B[+}M-}mP }= o5}yGj73cFFϞ7;$!_MЯ5(e拒64Q$XW.rlj/ _&0yf%=(qႴG8?C؋ =U<aaG]؎pnؖv/lE؂a9FTaz:iW` jU+V ,GH!"t#t!t"t ,KK];BB+B Mig `Q h@G6@BmAFBDAHgV $J3%^1BB =,Uz^B!JrQA%}^ N;\δ@#{VeZ&A@tGСLA!Nۻ FP8>00>@x4{@{xoi[/ mT-7Q8ŸGT{#5TW~2Kir~P/~2_D ?EE~~GxeG ciX.w*SO"|[O <((|$! DN<p?*r07E:w5Up—DiF-nM[6lܒl|7#܄p#qҖ 3?yzУAF ,*reڒ\v9zeAOU(#\p`:?>O؇ڲa} <v"@]َ>\miK9`+–Y#sfF!mQ:6m&m `u|`UF_6y}i XȈ z=GEKشa-@6JR$2 SPn8CH@zNC]Ho 9_!MHgHߐ~ 5o! ^@zK~ W~*n H?"A B  )H?~YHwH#1>_}䩧ғҷmҷ'bqHAzTGJhڽÐ4iP }4 .H_~P;,}eHwB; 6HB"W  =ٯJ7ot#n`I׳Hcocoe$k ]FJg GSGRS NqqpClT LHO]0?Yl q\:x_g޷w}>q^'}}}voj054<;N 2H`8;:Ƞ / {RRJm[5mxkjKŦMs*66TOXZ;&bejTE_j_^ћJ z*R]ee->ܖjXj^Z\ќjc." J%o(rWo;)y4Ev|~~۞-/Yo}$[ 1 zEҢM\ۜa]#bqYKEYoB4I^H˓ ^SzBCqN˔uʼnf=/2œCĐYI:8B5\AQ3F^pT+-R3qDmTw u'r{Wk Օ'U}Ģ涮cǰw wO߉;m'…\L~Pk E{ڡ {w_~*X7?{3FoGc[0Z!I0c*,-:. Duu=c-ő_1$)"7"p^XK/NO᱗_7L8nL&c"\ d Rs D</%J RHԒ)JfrKUdDŽ8$5^ $άq/-Y5&,cêZRU64tL>L2zEѡ)Fx&luC>XDFtkw9VMP*NknU&VGD1`Mjʰ,5MTkX0QS?z f, bz8L\E-+m4Wx^ r`-fy\˜I6T8j3&cغk֤њ;q<6Vcc7@Q[\ԟ+*RHH#a >*@pxҼ5 Tqcpݾ<;K\Oޅ?U#:uh5xY^M:H9$zJbF9a.z(V]=_zbDbe-(Q!\BEa)*rU و,*%a'3%ƅdlOTYd&uߗL`F@2}2`rjV$"-nW25xl> ĉ\ޟXVs{[^Z=aXkuU[^ZcCOm/$$䵫}5]'~۳j"tr946u`ع%5vcQ"urPFqK{,ˏ3ǒHzٌЪ%KYBnDRu@guAys{U W}w=]ǒXm8и}~woˑa*Km 7[[nk<< V9phݳ_IH946-+5vdnBT2"k|rA4 T0~zwœV~ypᦱԟ잇M Y]ؕGӬ qn?PoUVVݷ@4Q-p;x,#p4>>m ŧVz#ieա $ G1Ϳ8$!X/3#]J4IjIJek ;7p=Sd%6[qbsX0,v,6*fhiR$z|$X 1]Fbjy e/ zØ`yBBrˉt"VLN /+9%#EHG$i5P#MN>x[KNCYe;D~rW[3?Z C5͐dzX3|<cQ13ɨal&c!.g ].#K(KgXX,0nP1W2bz~)ɗq(Ed R1HYDQS$f>1XlY_eom?$5.;՚/yW<7Ōj7qܲ5Gn1/fIɪEGOx;h|? P9k86HwWv˜-7C,Ɵs,c$LL6w{U\9;Ksؼ&9812Hbᅉ}vH[m8'fфAӔ!&3}Mzj4k$I}kZ IX m:=^1g7S@6}6/mѩ7ˡ5Alְ rN}ݠ+##24pJi)S~tΘ>+ܳ,L09QC.ĭ^++-:pz7ZvP|=})/K2FQSĜgΓ'q:mJvV/[ aWPp4UaA͞n z{XP% pStU4[(C+s SrJQ:CX*s)U̲ $Dh`aõnM3'> 5\ (Z3k'V_8-ڿڋ1ܬX"U2ě긣pZ DB3!٬]FwuMf79#;TICn[j%@185Nifb x"$"bn<6e=3E{ 5siϔ΋(ju篯o4_\gxrۼ{Cm&iP M{䞯Z'T {y_ol酷ysbPwA[tM) C]Qєk 5!5£8jҨպ.\74:#d;>bϟC2P08s=߲-`310%ޓ5wז,ɗ,Pbp֖oc1q[ܶtZAG1V}my^͹RpPxcCp6T;xצ%F5uZ O#3P^Tl nH>]%:ޛ -Z/XT^]qնji4)cC0sL6Ƥ6gYivN5yT<>QƸ3lF )-D7Jd"Z~ef Vϒ,'417 av=,Znky-"1/+Z8_T ?!p熙ugl^æZSln~b^JxvA_9MZĤ=X[wC8wi_~agzg<ufWyÂ0kUY kkYs8M=/S}/C_>'83UݮQT1zeg8ofD=͋)Si=ۺc&":m_?O;ubj9>NX( 2ۭŜ$ݪlsL`bT23| t0߹ts,`v" ~gYCm5x"КJo xAN̙v_*g $hkjϯeufZU=Va#Ggwm5ng!0pUQ` ,%<ՄiBDN;ZߓuKiY<q}xQ>y Àѝ @0c5UZ-)1Qiv5XT,9<Xj :4ˑ{k*EKV V2njܝoJkvЇMM! cەj yzV5`͗lGIWeL FLP`9?juYu՞Yy0S!1:)3!ʜiOQ/\RY/,gC>/zʣ%F"(%4)*CӚ˫sYwm/'V_r3 nGEox,w6W:kM E[ l.'ʰ+R AåK4Nz;vrnV/d0s ٪YfvP=xPEIUyk#_d­en\f DwSڹ{kpvoW{m_CE,^z$ d\dWPohrx|2 5vV.\yA(rLzƺ nѺ- "$ofVʵ0bQ-8kmՓ/-K5{ -s}muyRiSKT`IW LllZRܽ} [߰$ ꅒ;)I(L3Jd_zH%xقUN$"AЖ8ҪY: Sb"x񬙵i:Z3 y r0.3'|Wpv>g@Vh(5n*鿼?^|m{ZiiBrxiֹiI4ZvhV6saoM7\6ЕopTcTqKa.X}F =C_-K*E[* h_[SZ0.YR̖1%lgk&;٧W]2L<{ %._90S}pSbTYcqњ|'Ysaϯli3hyWNms!Eq_D}e(켠#쳲&Jm&ت |mu*2jkKzv(.{jv_n}z9W_JѦrog@ʓigYyL٘F8zs%˧2;uOg- h|BgT*X&t*[6;d\fy*yeҡf;ND.kwݘ3=ǒ(/+XFb@r[t 3ay{(O2{(s<*`׏OrŞ50//Vڋ/ h'O);'8~g!hFVpk"&1+SN>8Ye3^MLy™]C?d8u𿀬,2X0Nf1Q9*2đU+ܙoB_ zGkCvivς$ V1Ƿ,g >bE"i§֊BPXZ֘k[UrcPl+m?28O]~TVV*YiբV|fAהXߪLA0tIu|;ʜø6[z 7ޕ^p;+SR^ݳJ{ML20bˁ՗"RcU0Jء,v8AJGbzLurykSG9A7m7;!keWً):l6/et;g 6ÜH%4$`d퇌WZ[* Xf+D a:AؾUvn_hflŢbYoF#x{0/}m;KJ]}wyh%΅uXFviGql Z.!9-VPll"=i?¸t-~j1/_,t_kgk ~U"oȰLնk{&\"w'shFR)D35N $Ќ?_O GX__*; {"ZI}NncCВ˲S³9ڳ+1W3qu&'&T,ӼREaVk bfHZ]$h|Ӫ&(Ι3֕ƣoY";ZJxLj8=/yl Ta8̞vX&,.(x:((DZ(Qe[%XvH#)6%iis(_}v'uNԭ-}x%M̼{3oLE1wRlX^OQz`::9ts[V 91g`Y<\Os'vzvE+8S\tn:H% cq̸es6hw&/L%D>~PnKܩgRV%0 ymZtYO[P͆R_}(I]K2=rz|g*(tGB15h÷l!\–2fx6P NN[g6nfl!I Cm%+97˪ǟX'y].A5aK1c`+,A3 l҉sL롟w<~/e)z_;ꔴT/?Kyx"!%ͥdn6H0fx'RL- OH\Jd֦76 k'Dq@4r$  ׶+oH8n C(f7_n"CkzA.uQDKyF(.1aiYjcRt>S= E 4gNC!;!O#8B̠4 !g? bwa#|dQi|%#ǏB>E2v).$e qVԑE VJ9,!pIC]`V 4tfKq2.򋖛8)C6uz#BΌDpMOx? "KΨX䫸 TkㄑūER<V,YS%@TV\xRWCGvZtN%7 N< -ScHFaUYȃ󄳍kNz6lTWI%?d\'K,#!Ҳ'͒F(a %/3_z͟V3 |2S-2qh0⑌NmsUY -5CL<;hќɞ"~3b8g K_74j0kh8PY1Ws;9&h5ƧbEO ٪'ٳvf82qIi(KC|y֋7dx%XڃO@nJ _AcW}_.\3X&yIN[2Rv^Taj˄qoaǑ zF4t$ё/ ;?hYXkvxar5a;ط:d9$cy|['%wM9.ӈ~[1_'ל8#r]d4\ 0r`>/bdMd# qZ4<>DIǸB* [[3ȡ"Q[8k4fq[cV#<qXy{СmurN|R|A|!jb/? -@f0P%VCQʫݮy6,/D4z^Y[)70LvIdrb^CwG"n6|$&< X#>=i>=NCo $\qT5KH%( 7ႂh"o5U@! 7-mA09 v߯%@ UA5%Q VH# ^ -zrUַC{/M/\Լ[sUh#\<R 3ЩE'6&hoNR4́$5ŬI:y(Lk]]S0J4OIO=t($aH 1b%BYEAy K&uŝRb gs3=R2i\L ״^;,qҭp IF/RA2$}.)TW_ PwWDl`lv3`uwk;ʣ?D rAlkJE@ݍ 9E#%ԕjʮ!MecĚ+MYlg=]eoF| S CkWwڙsIqq:\4O^}ѾJ-T5&bMkβǻ6qm;kZάkhk9hV\7PzKl_`G8sn.PlǶ)VE=fYm!EE@vly ʆCMkTcϮ + w-х\l.*ۀUy5g 8.%D,e㿫# EkghsOL+U{nJO$nR[6bwoۦ#+g~Om_@LP^s֣C֥u#58R1r=K7Q~hthOv?G VA"qF6y Zw UyWߛhoR}l1oˆ)EmHQCH.# p̊bl6چ s.E1LRVEDC$+9#DVЖ'zsd1:bsdp驄0VxLrl@P ƚqrJe6+8QMԺTSR9Y 7Za+{oO~< pj,@&k'{h3"v֥ \Вm+C\kɞ ja17@C&Ɲ$c|Ѽ$\z"D< .q{vNda&G&?x|zg 땁}!Ypѫi$8Ly/Iwu\7Kvj>_9sOi\Grme]<;{c!,Wő]PεGn!Y=^rmr!T2}寏hiFu|qKZ'G|K>h >^,3|FQ}sW#T j=ս>hJW9xϥFiFiFiFiFiFiFiFiFiFiFi@m "A aNrCO׮wAwEM??^{Bf$!r,Fy-EPCAYmEQ?گaN6aGJoxxw@7s[_>B϶/,qRS=^FK4 Ũ 5^T7jPƑFԄQ p uh%Z:ԅ֢ ^UځvеhD{ڋ#:GGW3ŭdNMA ]Pr95/Z5Լ{^ͣ{LCv2!+qI(b9^zmSoL~ꭩޙXC2@ =Nѯh cLb6b'He& ܂;oc; |ϗ*>(3QK$&4i_2@,fQnUW߉oM1r$2L2M’LSJH' @[( 0|?`\o @jș5_h@xJkP2@FwR qVO?.ޢhSt/\w}l@ (+RzQj )Pj;G+ m/i][38p@~$z<3y Wz}{w)C;99d>萑dNIɿLOAf hBfF"=-ݦeBN64w2v%5Xtnէ`A endstream endobj 227 0 obj <>stream hTPn =up'CT] מ;NrȐ/T0z~ymKL z-f27Ju&mhfx˔pl|)]W=?wH:ϯ̴s?8O @)3~G~W䊫mz8Emj!Q$LU|kb{xmZ*ݪJnDzV1<!_šm endstream endobj 228 0 obj <>stream h޴ \UEg{PL2/^E\@YDsS} z,1\ӺXY.V>K)fι by~x33ߙ3g3 Q&{4nǙ-!1!Wa# Q*CMۈWCٙyx>" Ot_ µTg8ATmΫD" #r\Q%%Ubp%2Xd4C 6]~f2#v~RBCFn_c,q|QI-Bאf>$Pʣ4^:Mi|h9tN=NVQ"qK\vی>U(]qm䯞>WHb2,"d=}_쯹r-QԕR'ޔFݩH$J~42h Lʢ!M9h'h  \IІch,%1h"Mg,)z;I&ӳh)^w-L`:Τh͆+ zXT_?hz}Χ -_X"+N^C)Wa-V\q7!ڃѶ ]Zukt>Fge窿9;Ѷ+8=včGS}WK^NF2z|Lf%[p-ݲwYE+t[/\ޠ&z\P@oӻ6o7+'MSO蠒o׊١}BG}Ha켯8Ja||Bb}mj9p:NQQ3>:OE 2RŨ}OZjϔIݻ%t9SǸؘ"۵mӺc-hѸQauj;kլT) 6CLθt+4ݥ:;uj( 2|.Dq%Ӹ*d(*2LM:P Nc')14'( j1uōΏMA~L ?\a-<,,U .^'6c+1)56&8$$M(ZE*/G,3q4ؗ@^~spFTC<6?9WpW=gޤPLWgL+܉̺${_:NG B᝗/dX[$fBO(JȲEp%a LQ\,]Syb;CdWŦ[㲫:6@:ECʖnFf3&lTWT gK~r8hJN691a\ؔ_ZzO@U]`ԢO5ti %.#[bD)A9egRWxj+yxo5\ Pex"uԧw0rRJ.QG품N. H+SGN@?L% %([Tew.dK@~:@JJ?oHb&gpN<&;<ϠgJ1 _mӚcK>fJ/z J*E2d [9j,-O@'lcD= AsJ䟢6RMmmoSq] KM?;}V~m5AJݥ -ciu~qKZ pqB˵\JipiO8A&4Mv"n?AW#4g3E֒a)Dl,X W"? ם2U@ !dKA&^WuJ ymw80Dɗɼ.`7gxyl#X_˕"A`H| Ci0#%A 7Yq %w{ī"utcJp'4S_po0;1z6&s 6 nnûy) 멍h/F&Nk!-񱹖?QsZ܇J7-nM)j=Vl;9 0Z\C7պ0iUp ׍TZ<+"k@1Vw z[M%jy7R145LT|&rN`w5AO;' #C,gh4"3ZcΨ8c=yKfU_G01C{XmQ1&e՟ 3} >+r|t[6#ġ${nR[ߋ7m)Sob=Ngzt/%pV:`,0x 0خQajk@zXϠ\{95R܆\F+3WI=))'C 'وtR`<X8K'Y*]һ^o -P D;NK@/>Ze9Ymq٘Aߗ@y裋`*(/gʶ`"XB|vσHXߢ PU dBITގVEyցl8ei6NYl8ˢhYHw!H7~G^Lhޖ?n`M26X7mdD%?/Ic#A} 弪M] o|­9+]ګg-ZߙJ2zN u_q]5ļv$gG?]/O/7;VscEzEq|.#,mRq4*?1R?57PX`d`:pZ(PoY>>~M O(.l֊T ԰ʷ,!]lM.1+`]; ރ;Nhc$lscl8Nl *@VxmʖAMX8ⱶtƘ߰$ҡg9cmfɔі?A7LHMCX9^E <`D!`l+4xJP_|}.ïeShCYbhڀxtA-}f\AlYDvY7 L[&S^* 7,-{E9%-mCsjH|\(5j5~PO<!ZZ^DMۗb'S'p')Y_Oi|J9֗PWl@ [-G%v;Yntt,qmo의x:`]W_T_ k` hf)Hz ~+_cl$ҞE>)S(0SbM{Tڱ6۲&{v@>ʻ`Zchk_Qj6z>Ї.>v[>ǣ1쀾;K`gv6,袿I,6A#^^s.a@3 bn_ TUp>2ga >K!,= ^x= pw|1ܺ楃|1_w+8=S~Eפּ<w5۠UZW0O$(` }~x|q9p eס.K(Vv$ʳ-. D^@lb/}e9![a;N Jh? +ݤC,wV}\[JW ; .rt ࢖|W_ (<- (Bn^:4~R>}ކ[M ֢P*-CX7#mF­Ež{$n~ D[OX"7moB# qn N71HF/i`m,`5=#БoOQJN(HwaU uvT+5ݗ+;KܷXha?Y\3iz bQH~@4Л wqTm`duBn,ૠSnآ"m\D y=lx>{ve}j A|)Ɓ^w_v=.Oڞ2_+>G;vH;gF̞KbVa]l6=dBdRXԽZegoqE`gB\~EPK~m_C ;ܑ:@EE\}Q 'L0{b XtwM-RzY䀁w-[> pq_*K.!3,yO,|qޭgtZ_뾁g7FnrɽqwLCcW?q}cV헼A7!IAw{XϤI8{6+%aeY:P=?!.?B=1! ]sp?YJw{{Tgs.P^O:ݰIΠ". k.v{@ObQ+Q`YPxz9c Oj%XR;@uԷO `KFޙX.`UkyE[E˻1A~e{21=/ԥM #M?:z={MVJZ֖]lL:ѻu+xZl6Wh ;Oon4V?GOiߣg >6>`)'.6 kw&d(B$~~"c}49d5c{eХ>6 "}15w>ɮoi3> BC~Pu ߶4~Ś[/M 9;` 5 }inq 8Pk|tQG`>qV.QR:V8Ś$5Ͱ-h%R)kumBPsL.=6m`;/@;CVmyBOWhnQ5`ttDe,[^suuV=fki5oN}=*Et |kջB?$m:ǖIu_m <1}xmX|Mh{c^'F]ȢލƥAz) Er-]?)GYPwߖOu½?)_eq[;׆{RnpˢD90J`Gk)AY {'mQb&x3uiXkS_mWVi3ZE0 /!*ӪVQQOkiD_JPn(=D*KȷVw&`"qUJG<%yssbEӅN)<ݭtxJ_F>g)8o36^F>y` Y`$L0eP\0,=1H2㠘f!%k J " cOt;&2A.˖a 0 7\1`F\90m̆C3~^l2*zM>`=I-yoHDUG%l$"*ȧyG nߨ7ػsb F{ίׄП*D5W]’B{B_x_#)({=ٿƼwg@pzܿ'{r߻U0_ Www52{aϜ=@%{b((!0Y1 _|^_lW|xi&͐^l yO_ 8BZ!'=C%#;>z xHY7(MM䗤@:Ϲ1 sPEy{Q4Hy.[IԢ} kY=eghA,F= _F;tЫzPo?a# AԆ/(Cޅm%Qy~p%HvyY[@]3ا] oyV{>G\꾴܃7jʻwϿQꎞ̻꿄=V]uB9|r GfcG1d+u/2Vݍ E_<-uuQ{[vr߇'E1Րw %z9?uyLD~zo"-){xw55Xw7͔zYz}QDP#{A"fўPcxʇTcXo+ϟлé>""?2MKo,.H#I&4cV;w _.: ~F(ւR5)̸A=0j)CuM}*i:sDdF輱k n[=Y;'{%&^}i%@S:4\oLjbz89$Ӱaցe=i@]%mN(*q0o4#;oy7/eZEOﲙ8h7O[(Ȼv2챦^d@dztc ┭']^E F]G]z\C=>v'H+9c'hps=ZWӕ+|s|5%ցlc#U?Ji^@V@E$zһe&-A%oypk^Hy'6.Z  쐉`!leC@zwӷ9Hq7}ls-h 4,W -^6,:;2|=Ad#v ~ `-e~ Ò}m%iO"HqȻx# ^siW]>(< 7n+ V#~:m>މ=y ps@)`v,zG5 M q([ ݙDZ Ͼ`H0t9܍oE"}9  w.Vw>@{1iţ(OdEYmVUr;ȧVf5nF9&<< x&Eo[x=syf)^2QXK4)Z~{3o7fzr߁UD@|}nv%Kf[W@J]F.x) llT BB\Bz=!J1HH/J 9~יwsw5|ooIf`Aߥzw^ͨ;T` ̹=Y-Ynq 8g`CDA-a5qJyxbhÂVg@ ϜD4b 4P`)Ԃ%8",`>9@UTrPfb&f3@)` ɠ{3@{J` ƃq`,fѸF`89 b]y bC܇uCpn0NE@0 N:H dYD2"TsNvK6YE0ЃdVNxZhQa&B/8 N$bvO O~. OrD 8w- 0xƺA7.lǺ.>nwmN nG6p+ n7ܹ\˝u5YO\͝ UH\ p1w热yXp.3:A?bgbY<Wلg`8t`X˝3YX;Kp(a/+Ah+@hR~-;GM;6 ޭ Dw-E;XLb!wl&p;} ܞE]Os>]A%ǼP.2,$f((NSBB-Q,6m񇲈nOLjbmq`,FssPb&Fph(;X-F\% Ŗ|0[N& 32љ|JS>ߣKyr$mnޢI9@yjQ^B((/RR^e*=I'hM 1-3HGæ!nʃƕR1$=` K#.Nsr;tQKr7%Fptatat;yatS7SnHr=:ʵk(Wr(W&]N^Fr b}t~tuT?Y5@:K&y|FlAOuʆN,\|3ѯbk5jjyxkɫbQYuD#QQ!JB~TYFUƈñB塍zlWHHd!AݻgGȓ$C&kp.wm2`In5ɍz!V/ʵ%b"&H^诖Īy\㯒X<_!W*2,ygKRy<-6Uʓų k7Ceo`VyIG<]=U%]J[҄4=mCi*KT1:xh~[mTksͬ &X F$^LWAS8%8Yr vvԦr>fo-b鵈 [̒Yzͪ`TbLbkR&įx*h1HQh(3`d*+L*]|S s%$ yjWڭ,ҕ/t ?*4[\`vA8vA,rVTcyV6)+s3vmA >bjѰCM8K|bo8Bhb|6bq"#?}]5&iX&9lW+ǥWz4ȼyL>Ҩ*<&[GPQC-:|hO;sz@Oyy-ۖ,jM~Q#GV8A1>stream hj`'P`  ( endstream endobj 230 0 obj <>stream h{y|ղ:=2adA’@HBP`@edPq(T[@ETD".((dVw0p~ vou4$Q&<0m޶MK9.v]$L*M&21sRRaD}osꈦO!;QeťG޸S(C9ajw yMGOۣ''9X:>G`tbc^@~ē{L?zYך;q@Mx_&;󷈲B"IQ7oFNmVrJhcdթh.GHF@.z?]*v,vIz# Gh %$-?r Sb?0? _gREKBZt ? _DE4/ C ҭRkv!\-t'Jm5LҟTvWPV̢G4Cjv&l7$K|Bwu\pUt@dP)j~}'a~żݴ -D]$a,~Ai0qfam2l‚Ay}oӻWYoֵKFNi;o6)׷Ne͚z$7jU^b: jDGEF9*DRU3ʨUdDz=n#ߩ)Ź<ܩ)T5v߿2 {e~,t2us <}KyI]B1g$% z# }ݥFl\A UhTg^(ZXxFnFvE3IzYWRQ8٩4L\ҋ"dF)ڐjRB_4*8ۑAN(ONHhiѥ1=ehJEltk@AeDx', 2TN3PĸJ)dȜN290|q(#sQlbj_FBC2V##b+W"odxX#A%)rr7Ows画}xExzy/㗖2<و *XeāFEMޥrG[6V!I"HD}9ԆrFu)I N{m>Z{ŋ?kDM`~hei(nbf(oQfװ^9!rOΥ qfWMJ2y9ϗM,.E&#RyOړed曄9@م6N0qLQvaa5Hj8-Ю}\Mڎms r]f 9DIsR"RN1`(rpNo7ѵ +Q{|Ubp;㫌)r_"cq[T.u2gs둗k0CM.{?(U7uS_&:ynO\ShrXQIPv_zL nϕVXi5l(З`͙^:1J~<ʭd eBeF3y+% |p(XgqFQ)k}(xBq)䗕=~C|>{[VC@Ht%FYZ~Oח<ؠX_\t]<\ }?QFhn?5@kzylJ!caXcv%1 c P`N_J_*Ee?9[h2H?~0; |h_WzJ<~yIe*S>Qc4p=/[8}vE@g 5c.kzVR܊$Of /z ؅g;xt`MXOT x^ "p@)/7(3b`#9wYK# JL#xҌi^R_NL2`U$hemT户@kKe `rOQF%El!Zh1AJu NP` LUF-*4MI(rxP> ej |zH e.=\D{.R}5RTA<x:M5[>gu u8cx<{J+SSC4AOTM4PM;(OkH0X* gR?$u+M~ƘOguHS e,O '#CY;8~.\ڿD=>.2ml ݳ0>,w?YN;)-ܶ lrb ׾żBj_c@By`Z@yG7BUSYC7X:y:LP/a]n>N#/3|yݞX_Chðγ~<1X O95SXZXk\{+חy&^Bs}5A>zњdGg佅f[ׯx4 45v~[vi^ 7>@է<E"uUq]: ٲlGöK}'׿. Zm촿l:j kx}q~5t_ATc>НV;1:ݬ I[,?>)wgr qǣUי y3[~-uJ8yG)8,eiYQߠ_^Ӗy/Z}CW~<@>l|,Q 멭C/X6o_ }OBfw{N<(?T^Tߊ'R[y`ڼacY9W|'^yFw 8Q#ƴ{vGޥs68C}Oڛ6 Xs喱cq/Y("neH|wP _+/=Ch[bi:yh0}aW#집+ bPy5sC@7:O'/AeEІ\D1(d4+}1g{66_?;~`0F{N?p?(/ty%ŨKܭnBWb9O9oQNLLv.۟{ f"ς|~lLJQwhUTK=۳dF,ۅvX>^ e[}^:DrX.dI?ȑݐiD:!~oW3@vr>+t9@}ls/\9a㯢n8~cU{kȅ7!oޥ:Ru"88di`>t(@Kkp"y bz&Ac7?vrJH=զ s9gic[cjwD/,_zV},p9 t50Uɫ8W7B7IiT*SR-_(oXF:,hRIq-cY2ʜC0e5uԠ*[aCKC.Ys-zk?M;M\}ƙA۠ Ԕ1E,w<&87S0/upFůίinX;Z\r_rY#V Jgi^EO Q0F9sG@}'M7ZjJ }5o%hT֐Vϣw갏hr5s=)-4g:0wGim@{BԷ}zA}Џh ó_A 9ak:8;p;MsY#;4Z)WsCy70F'H[rtwjFM>+kƵj!Zdp|W3I~O 9lYOu&wO%"w wAvܝ@ ;rGs-~jVrn(g= ,@z@6@O +-t1G/=şǛ2~;?ӏϾ{}/9׾,h=eg86[G`[߮#?u:?p>Smqjl?C{:~P)Q)dKe92.aރvShK.=ނ5qCkjkKM9ՃLkjvvY[Yw 2N:RidY1ml\*Rv*xF-OmQ7ߗ=Eؓ'gfٹ[O(OyGM797euah17C](lEd߁:!^>Yc#?sYw=^t߭j !:yR%;ʹ,[#pv^N6Dv*߇&;WӞMh:u+l1h3_-LW;GFk_Z}5%hU m易g sڨPy8DP\\R!_&`+Q^}o!>\[@8Pc% 2 ˘'%~;}FvQ+ٰADTOO;9Z smDTcogP'Baۑ )#,| "_C1Q|ib(| {:QC㻜Z.ƻ#-:hl' $/Q?v *y?=/Zߎߍ_C7dƚb-~LI[mRhڋ+ )+%GW{EDBMb:dUo]vħ` ;yrX>kJ-Q$r6UO9}R% AR~/SjOZKv;5{d4^v)"5RVg?ڴU+FrP/a,xa:%A1d~7 h+rBH!IZi&c, ʗvW7ޯ Y\0A$bY//@3zZ ; z?oS[#j"{ߤC4EvLqJFR锴HTɽX"9[p?! @gq{Hh8nE3Qc~x  mt2/]aV; c6})Cx7!@90 t*0Nnǁ`fqhC:A[hmi633h;7iROj#. t/N[̧ 8+d;fڇ΀sqO%8#6*djC8v||t]dMtbbv)LWJMSF$j6nݡMj޸{S/r3oJHuoLdOji[-,+^쉕N'N ažai PBia .Ӟ2lg Ӟ)gt@,ϽOh9sF{rW2hDU^SA\UiqGt:UU*!EF&q_-Jw}D_{U>S$^\ul7¥rocCkY#<9叶п16@R` p?ZtsMWVLrP8"ԅBun  T1S)ӏSN8r"`l y/\Kƈ9ۨBcgn}* {]aLouZP$" HT%`_ Bz}BBbV7rOqUbv؍HpNu-sT<' ȗSM4 WX0Ƙ;N _ +>MuGա/o;w_}g)הjUu~ձ {*dRi[a~0^l]l:o/:yU#Mg?39JED!bTA "B=\k%"d1[NfuYey^ϩi76q'΍/ qܪp?u4 ҂]-DQأSAFLKdy|>ZЅ e&l)-8 y 6ts##nsE-jB S)eR ֊mc@ U? gx?>˩ܞW$TZH!@H([uJ̉%x ZTJW0<󮂹,WFH{bǕ*U۶\_83W8KV)Xhӵ6&)45 Icc@بF)g1X-S)׀|{*4U"Y̫U= zFa|]?"1ȓ $YД2E~Ux*EHL1Qܽ+QۛoZ޴my7bú6Ko:չ֛yuR:*Rk;;"*kp,r="Q6:( |QZ 0 >z 6#@FAY8M1Z/ge]a$a\,#,zIn+ $"D2l`!çyEۇ'VmO[I7koJE+":=vzaW``κ=˦w,yݮͭےC{nvmmLoeK!mc; C=($B4;d K3) q'8Bid%6OA6[8J& S$ GP;qe4X#vZҺo{"qxw }=̶UqP _<623g&edۙ;o}G1r/A=̕@XI h1Nډ'8ZS+ P V5iN\ksH a6G-Eih3lJ:D$1W :աS@S[[Nrm+w.XG/jT6\!^-Df#Io/XM`@KQa+Iq&"/`8@4]Ǥ! RH .ė[reqg,̜<"QtB3+aEG3$^Q>a73Lek59PJ!IINt .QvpP]  ?@V~abd^:8t]m& !` J*f3)][Geq4D$NcIU[B^@V/μVx 1D4>I /\՜\G(%3"MkNo:>O1wHv1 /rC +U$ZYqرRIGP$> 5^u**# ΋ƴoJ-x%Zq9M_˨{vm1%,]К@!̚csh\;8&u>~|iAa VB{: #3ؽxxdEא4WF ̲&թ\bnÃgе9胭ʐd̽YIZ|~W}kfRb%.9- P0**E:)#.ۧ9D.LePr%RvuNk.3 'Ca$[p7*ke,h%`-rlzf! |" SjC쒶ΘJ>LגNߟc>oRX JLGrr(A4Ei'T4 IA^D2usR-CͳO2 ] [_yS.j[eꔭ~vGr JcIk"]s~]ĵ]La{+% Gw` ܻ3o>`k .fO/9[Ty@/ɯa<ԕ8 * TvFJvG]qtpY-ڒr@0 y4&9| Dϯausgc}U>4p=EH8_z$y+7hvaEC"-WlHIcz:yJʼٓYY./mĩ}#iW*T*1H!*, HNA ZF#7H-k8fgPH=͙lG ~y5O9Tsi\ t#arYeI*|ֱzݑy 0#'= "2P9f&s" N;%7YX0m`7 `Hh91x ! ( b"6Z`8s_}ABKE)B4 R"~ 钢_HVpT9$@sڇНΊAM؈T`jVJ^[ˇ$Yq(E)JQ2/oR(E)JQR(E)JQR(E)JQR(E)JQR(E)JQR(FEeBJ^//a%R [ʂ:ap' c8LL/$(/Q Z@X V~0]+ș$hgV3v0o3s/e9$B|={~ "!G6&x<צq\[/"E1\+\Mz@eM2B^k@kq c#3 ƱlX na$~|dF0,h;ň:|n A|w_~0 6#CA9"W1ʟY&a9W璽g|*]ȌFlX9­~7?sf0ZfۍNzÏh<6:>em9:?14:fw`Wmnb]98>8gp ܜjYh46J1ӟa~vlp;1?08?%g [>stream hTP1n0 :HQ0$6EvW$S-}%Iہ$x᎔ؐO 9fg<^6mݚh"Ln)P)]ځ>stream h{{Mus> q9Fedf0&b fFCFDJ1)!~)TGTD)IQEyxEs>{^c{}ol$Q&:\?$c~͖1ٝEL$5!ݣ&2vNBJ*A9ۦ:ޗD}?AkMC.`߅(f1[V|GOQƗPT1}&cK,'"{\o!r¤ ;|:Q.!uiVhhtFI~9FVzdIMd q)蜪ӥ i'8N9 I|zR,y'i#VXiV>b┌\b Rԣ+9m_$*Y8@I7JkڅsFR/&?Q(wzfR/t!zu_h,D)<˗iy|N'Q~>Z \CDvNNy2M[3nR;bf3ZLy3o#-p]^~}dg6WݻuҹSjk:\>mZjinެiWF $׏t蚪%KFbVaQVĺȁJsSנyF*L+2tIJ_y˝c_Rf/L~ !80)eȭ(/qOrY\240)-BY൨r܊RsI3JتFYWQQ8٩4L\֋"dF)!7hUp#i1Ѳ cz$/ *.7{.+}8p)lݪ+WͲو>a>^WV;wp+x wq)\jq8E I\ڋZ+]賱Y\T dCܝQ[ QJs;\@L>6^ѡ{XO]n .z ̌K JB7P }wItn ck#2H WeJ / M׽p,YŽZ"p:ɕL~q I(m4ӻf6cUaVKdDղŋ dTi,"'CP gUx==ɐ==$Y4=彍Oob~/3+`CK*%Ent/$o @yX/n/Seyni $FJK@>f>c]dy\ }ZsE)E8OG8[0 CX^QY5HHԃb7F[!Xjk wYrjr.;n]g G\(*o-X#-j2vr-[r7Ք {m@*'-e9M:瑦B[P-{&'{p:$tL*]0F@p:/Flu x9i[,J44+0i~~i˧X~Re[֗XQTm@7- ]~xF\/t}1Zi-4U}tZ4dqV'mӺ8&w\ϕ@ܞKhuE{O/s}(R" G$11x,<֡0<<6CRTe5 RKKC/OR|+>bJM|N}X|Ci&D{Tmg+.S,s)UVnc]0 %؟Fk0g_#r#`C;DcGd̄xRh!)ʇ4^QVTJ6 c P|EGb}uxee_#| 4Otޖ{!;6fcqO#,u-FiUlRz.1=lmh(/OZ^g=p eo`sX-}5V] s ౼X<<1 J1;aO$ANL=w_:.=Z$W2WF"ϛ_DtRJg{E=h,aG*ocCx)¡ ꮞ8/?3x}^ |0Fm ciw1uN \+jCg\]ށ57uS/٪߁p%TPQ>@/P͐~xTѵÖfKX۠O/ |hgpj0ls:ϵx!ւxZ?im0ֲ 63*ezg\_-q'yoY>9)o+^:M}a2o>9x W-Rs;?A ko J^2M9 EߤzJ':鸉d m}e[JxC~jkj&a jyF%i&_2c8eHɧRF9Bn}Hw;G9$E(?Vbހ#8逇*iIQjQ6_⽍VSc|Jg!c***鰙*tV`p<HE3&x<@T][m z#_;y(?Ns @;WP7 DgjpC;]YW=@C`PcIC4HFkQ7)vk+_u= .uR]`,0 <,`{ז:3`) ktF*[ z_esAaܿYu9!.+ˮd"Y8/,IWhQ rѹ^^{H g+یQ{QLԓ&Ћt@?~KE ·zV)r4h,/UVA^%7?(a?*2}yPJaIVfH"9 GJ~:.Y^  ]:xW`{K@ ]z_?5x8Lt#6k7cϞ8>n:EO)@)ƒw}8 ^Ox r?m>ϵ0j?ܮPvz~p;?Y5h'4SoS>QVh1 PvlOmYv a?#^#_nq5svڟ 6g_ m8.m6/A1OtZ̥h/lyy3Kֻ#81j{L_ -]t?:cߏAݲȴ]ѭDRw;2QRuzX2OxKbePN_3բl?g rqi;3t];Imyw?ut(6g-\÷/T>ǠGN3`'/7(okLw-l18++~899 gv :bL;8״;/}ٴQj(m\{*7T/D<5X6q#F9仕:|ϦOR]}ohxrhM[wS7!&+E+e?f\)#MnB:G]>y>Nˏ--<6b,y@ۥ\`>۳Aߴ riàg6?wA}@@AyA_5;˫)F}PU\.u yȡ!~Uϔte`)Ŵs#N6-{`eRrڿ_C4]zA؞ C705FQ.6)"u^/]6x KB,O#r쇬/ {u8Ww ]7c۟~No>2z*떈31VE\x -j) 21C0.ȓ&w":@З).CE\xka/d6L?}L:7~?T`=u>M܅CBDЬYA=ǤM1ǷQ$du|wEZ>B^jXY|= lyɔ-AjcʑS!/3#2myX}2v^|$GL9 e?b"M'-׏ gBz?xXm' Pm^1v;u;Ox7ΔTݨ9We;lh8%kNMoO]'v5z|o86iѢkP_@]ywebs+u RYjx_u(yu?@ i@4E{TyZ3q7mw}3g=W"&^6OaMim<~ 6)'Bs-8g;SڒLs֪w (z?YE&Q>cڵ ,gm{qX'ye.n('~,GMc=Iԕ; !oüw#W BEn bP p|Woo3]QJ㉺q%w:zR=$ԍ+S ';!+;A;NB} /FȒ+q w@NGY w;Cܝ=ʹv5 +F9PX|r܈FiW}T ^ /Ҁ6`z٘f壧OMHgM6kKQMO͌\w6ַh HmOi2>f[w<ЙN 'cE i #pG>=)X{N ~=ԕ?Gr9:K?F Gaa>tMizО|ʹ:Ri}J s|yaM-|NN\ {+NӴچiBG*3mc0| :mqKe|WNɠ""?{,;r4VTawtslX_sthEVtH2jHc:> y>O>uw}ޏ#yqV[K0XݪքȚǺ+]L;ϲ2ldCdߩ}h(m"s5Y< }03hy@Y7v6Fy_.k1Z5`8UlkZcN>LAIr!s=J|qƈz􉿅sJlW−C͕,7'/O󯐗W0O]^([þ:kgJ7*QaކLsDz'z_SOϳn|#)ב C1wOmXkFg㤎XwwuP?Y:\dXS۠ib=QsfȅS8׆&Ng$c؞Q:QljjUK+AQ^+6=w9u^!R(Vrěq^QD$ddCVo %>V+E}[JYS*g$ߴxS쓗S=y/d4}yzPS{_¶3'鿗ⵛLA֨)߷S<ЦJC1ƔxcǓ!=$ T$󻼉tFnBw('Ἴ)tk2r8|qyxRD94dI"ƻ 2hEOSr+oQ-D(@δ^|tɷ.y})Nh C*a"jkr@$g y 8/ɐݥh7{oA5Dҕ!TL:+C0 ߂fl.@{,æ3sϰ~![?v`,p+PjBtNy,R~6?p6fc:麃vq&dО6Z`Lw$|soW;vcs(48X>lX(,rs-0es33|:[ɤ}5X_cExxLn,[R1djR.= =>''5m)sĝ8߻X䙴\V 9\&N~.-~r@87tI!iVV ~]P0&܁l|Σ=78[؋+<:kYTVbN+U〉~SU?%9:j[ȵJ= /D5:P2P0Dz;vN`\ ̳Wt_i8 Љ ]/@ݭM'U:^>~阺_,a-]n!>_ʏԣz&^p8WWAO=j牲}{S  6|Ft hx17ٰxoBawiwX.40UHSGţ|+s8?'Sـ@^}0GD;;q[͚x&ch<+]'6nt{iY w./0c?HR23yL}aٛL +M,YKbҫũ6o^-EfZzR&.]cyrleҺJYwݚy-//yk޹s~XWruMH쒐9!SBLjBdDŽk JJ]P-gfLj&mvR۳{Dv:Sg^Iޘ薞fͣcEM`-,<=&^dXxDpF**4;Iԕ1y1ruleTdeAسt1aDtaEʈ;1al JQRtf\Kjh0*Nj~m X <!Ee֓3eh2E;Y+#1#!#.#&#,CP2(cPjdQ^Ao:ͫVFGo6hDa$=P!/PV qYGVK8zk+Iy/ze_g7-2:r`I"3:6\KOɔٷgsFg=9Rl6cv9FrN/B(+|;JF UaA 9kdQg(6{ze#vjԖu-t=щ:e`2](56UNmі~|xoھ}){SMt~P {nSP/^*^ uSSܩEt%c39!/e|~8v[ b,؈8 ʏҔ%Ҧ4,!,i;aKfNzᤉx!BxՃW!A0bAfg6M NYvg$;t5YcLcei\KffPҶut9Gw==7FӃL?{m|khn<>06|/|?8|yY6AAAAAAAAAAAAAt[,c')הZ!ZVTzHQF:CY@O}?6t*1[~=j'v%Oz';S|.7EMaPW@:J~iز/_R!s|w'`WR0FJKPހ9 |w8S/S̙]Bg ex qd?z?{oarf:M||Vןg׏_v&Wy . endstream endobj 233 0 obj <>stream hj`C) endstream endobj 234 0 obj <>stream h{ xT{ι$aH3a $!!2! a D4aE$ bU,E1 RV05ڢ uPu*{0l|1{}߳yh ^:*3y8s|*~Ot8"6g9C!r3ʙ~JiMdt,Z 㩓O:4CDk5k*HG?Sg՟f QqW͚8Ht gUM4a5Gwk֞@ %YHBd+H'Ni Od:5 u5Wy(%FWvi3OKXW {"H4M^K}wڊULdW!; #9?l(@iu;=C4<NhԔn`/F~*-`^TDNkmG1:B]DSH5D}O-|z(ʄ4ԼlE][GXGs'!54DN/'O(ivVkΠ~^g%p]J7o즫7џ4FQүi18S=&NԟxDo欻́ZnxVG *ZF7ޠ-c=}l~[ ]G7bއLiκVzh-Md%ճ&=!la4?XvrpF߰,A 'oE 'ѽt^ҿXWXsy KY40_KA>F}ۉR`The3C+.aHv%[V:6{<_!BEK;()ڣ^?[+-g-Y'~X$k'4'\eV, +,j|.Fh37DsbFgkkZѮjWt^Ohca|lp y\;iڽ"el+~뢵ogc/W;_)wX&fE_bßbW+R26deE=g|nJWBc"&7zO, ?R_}=;篐O;›a=2ƗPvMCA{_̺״tL8[ :+x $kOk wVGmPJnHaXSK{r{NIA_aN-.@q;bc3iglqpZkvVrV}wrr{T0t@rBG$TdXDTWՄKU&[CK|;k%Є&Ə+fi ƣOyQxb~푱ɢ4 mQ"(#EյEx)duE!d;dMʐPjj L!%ܦMpyj)d;[Pv]]tzLF΄fVlo;x"K%$G!D8)MKv%H B0B1յ } @W-a}zzx;$|K)gIDCvĕgF:$@}4};o&:?%E M'`Dф03*BZ;1-G˘NLcj?$4-CNNbI牞lŗ򗌨,V}[Rvϊ1v1+~L2@pZu1x 5/ɼrdX7eiCIu.7& aPBuMI2"m M;4i5`XK*kkcO+-jkי &} =\V;_g]*ZZFLe}19 gG ţ*$`<ϯX# U(2Pz|Un>yOhTOcNu Kp84+,?))#ZX(8&Os~:CkPWm6],hG]TW;}<&㑮J7f?Ht-dx9۠-gls`-C^ w<99fpG4 P|?4lCOw=0s"◨9<2?ɓuX@ jrq@V$d-rȹ)燜jc>9+q6F1klSh1HF6]V9gdrn9PwrNEPVkPέ*群"ڐ멿V_;TP(ף\uSP1˾P/F n6 ҺXA{֫5[:wS:RݵQtu6գ/;iiL׷-w$$6?MS{V'|ExXtu550ofiAi[\ZwFٙ |;hzF1A %d5(zΝ9uY\5+@J67sk㼼:o#gogXeO8MB#2C(gՏp?b>;5u#ȶOzy $JH~a ԉЇ)Hi7fKqyVam-R4F2:%Ȝ!@U1~;(ETBn>}upw@z`.l9$>e#/q /4Q}i#Pv@4@3^Ts|kCl<,*^#a5N\$d=g l=Ϳ`ߘ{%kR/Ko@|jK-DgG( 9: 2OeEcB][\`|+>/ Tž}@G94rF0G-M:Wa Qa6yTs%-@C/`址^=4GŠ5'nBZDPc=pU'~z+$,[Gqʹ k@ p|(Z@Ǡ7=r}ksp{_B,z^ Qg/q߈{bD_ڔҎH徭Xv9:P~{FJ:z#Roh=$tː=ߢ}JT5P<wG[i+} ?eD`'0kD'>W4^l Ҟt 0;^k@.){X}/S4ZmδRTp:;tElX,czʕg |6]-A?l!'>C&,YOI}e*>44 ׾7nSuKbQ-j;ϥYXSF~2*jr1fnj>>gWNtgŪNivN $ȗ"c"uBdEs6|*ʺ9#=yg#>>JD*5JͻѼ8uaN~z[}/iL{9ug5*(*D;lTw[͐V;d9$h/<Vw^fY{3=3U=_:X;#4 y~$*d5N)/ISw ܞkX07֘A3EP ;0.RvF߆%x3ISWΧ{ vym!uFI,ž'kYn2"t)ƫu]q8ܨG$`^Dy&ؐvy+9oQ#?+if4.i vxh \ҁ@qt\ᝢN>U?h q~ w<âa|@>}<}K0Sm]9->ϼ gV! "Shxem[e+oV݊?N(۪O- i}a 语'ZmT9yn`DQ h sp_z]iK%ҍ]^j%]u5d~;DMA~ jW؇*EXc dCH{OLFi}P:6f?GvxkRVD3߯=9[}}w0gg{'sbOgٝ{YXgrhOT3F;V+$&|ߺ%egmߟd(9`@cJ}g(;l6^ % ]x_W/Y;@|ޟ$\?٘u:~wNN8jx߀l*%o9{f빳$̙/WmTީ$`69c71ΘXo ]=PR_B%瞵L<ֻi{MsT "K{ދO[`-yGJKw@F~ފ{lo=VC$D7gT&`mom?y{N nu!^φ.ĝuSEi#_* ghR`)[NmFor"},l1߫}=B[ RWookPaD50̋hD 1 poEп#X!`3܃@?݈4y X`_XSAKAQ440+[ NWI:_ 00tY{N_SitSkue}B9Z%5ØzC־EQrQ 386 n^K仞^tJ(*!rξ2fd3[%۬lzfYdr96D;Ի2[Hk!]np?ʵ"K, M+\Tˬ=y5{#VKomEAB2.N /O~qwGݷ\ t-N~Q{?ڶZu)<2RvMoW=dy8?8 &sRdSԙE-u#ڰ%X ꊶ֖?|ۖQwYglҖU^|0ʖCA%|@ۂ9[^ʲ,w$mc$@5(B~&p߶M˳m@4Wo}"짶Ξ]z%k "|9_q^?zO r:yӳ9C,3]Ma&CsYkk=gYӋ}^%s4}$ϺT1N3m/T4>g>+h & +,J'(ٸGMMMCIȿ)wE{Owܼ(Ucn0a}8F@ &]:дnf6m(۩3yp8b.fd΋ C0ur-x Mf4X4;QfJe&Mo&0 Xh­!bNwXE-A} oz?n'=O] su*n y*VVG2P\j :Ӣ讛)~5F7juQFts7n& Q44bCyH3%f7>.CUo]l>q=1\!x1ɮ').j/&VNDЦ6i'ɻbɻڴ(Rk*&MH@3{0`S|>_ZVK|Jdp,j/K A*Y#b|1Y11,1_,+2E(UB3î=@=Vm CFq8b7teFQc,0V ['|qYqq6-F|`WU*t×K}T/.G(+c@k48yd2MѷG=.]tЧU 5tPC+h׏@srYwŶ"J*@Gxk *NdEgTߴSZEk.dTyhkPt*JBFƕY{x${؍‘2XPј:$Id]A&lJ6T%4PXC+3om}AR D1IеDQI&U(A$m Pc9L\XQH1)jj95H|MьjcR'=R=Qۤ~vwnMj4mzA3Zj[崌a7ƦYc]b꣬.WrTt ,}cG.RC=C]]/YӖ)08o[LUVT:*RNebNeEpuodaj*ujʥRh}]w޽}`>4WA¦c*W:йMCCc!ajj=pCK"oU}"kx&s]S 2?;lTھa_4?n 6x1E /yzD":WC!+nMAD_MVXE((,tsCIGluo~4mfr}*nٳ?97c1ܣE)w vnA18C '8?DMBg `E y>~pܕGfE]]U]yǙdȸ?q_`V) |-0UkJ@„OSDt\0+In8r&D" ك\+$'SiP(vwJuT\u 2%ty ىKԦW+kz)WW"YWl&vm0G!2/zɯ3Rou3/{P}J ,| E8K|8MFɱ1K +ҐD"at2FR{5F[~a 4~G'z=`scQ Lt:/~cWsKy-;C# g/r`rX>x\;.F,%")b+~9?1q$`nEeRgH[\HtUTXDE7ob0)CiFäDU1 EFdƪ*UUxN[E?T[ m蜬{'Sۣ?>s`-ͩʍᦻEmlػϼ+ &\|!YL_0{L"z )+s]pR\t|h^Ćb0Hd (e( z3`\AMJ~^ؚi4'RQ2-'+9BVHl,Z5a Dk8w9{dڑ NWkիMn(>-}*l->{Ȗ`~ḹ[ ;M]TVnT0\_,_~ͯm?̛Ku묰DWב%.2'XĹDf_.UR|XZ*ם"PbgdzH5.ΛyByL5=T=WMQnZGuK-Ũ\ ~NE,@/~+,>#iȱZ}C5lMG-٘m-%^r͋/7b0äLBm&FCX7LZJYtZCTu:'0؛u蜬ݹ[ŢIU-&mtvo3{ybv?-^xvmF͏?sO?Vtm]J׵¶l'qvSeӂN"qDġJ8 lobY"k|@9^'B,a̍&2X"x?w#b2$r8-+bZb|_8ITtDWLh3A,.![-G3V$\3OL4"!__=Cƿ)'|ړC,+朧>>xe=G %v(&:,A"@mmuRr8CLP rTh8<`{zqNmpxVj aZxƒ@z@(W inV E:$iBC&KtTZ 5F&E.$t1}K f 5q|WkܑOϐ73; C^WD a?SUn ;`M3@{ps( VBRG2G8 V"c"aqCM!u~/L,F&/GÓ3-{W%{//,oy8ғx P.lP&y_^rvSrw ,΍k4/qQ 4hРA 4hРA 4hРA 4hРA 4hРA 4hРA[P0,1#Do &3IH,[* ;+< `VUJ !ge먓a!] J.y\%7>}xQMp!s"#_E;sn'6üI(hCPx9^D~.xy&PF!0HðWt$򬎡|LAMwe?R"}HJ,-ɨe" mn@YvOMN݉Dq#171K%k{FFSI7Oik 6ē[&{oU dȪHK195|@Nq _a|u&\7g);G7g~¶/QV^xw?uEqש{p w@тݿIEzuYśgޙ箦V>/ٺV 0C endstream endobj 235 0 obj <>stream hT=o w~V \tj%C?Ԥ9pRCB. cڧֻ0%BጣPIΤ=n3<:'Z?hsrNM;q ,cjn' (O: _?_#j,Q$GFZGVG<>stream h{ xT{ι$aH@fd Ȅ,$IDM$ bU,E1 RDVDmѿZ*hm]p s ðic{=KQ -$AY#3[.}@ys}YODwLG: {"ԫok'o6yÃ=L2{MC@ bO6k,}ˈzz{hWViƣD+P'?kDKOk\lG$DOtrheb#MLsf*F4|gԗ5dTiȽZ*k'Mn/^D"=!;3̣%?j(@kh ֝BPjDi5K h 8Q}68.TBY<)J>sRES>=F{l$e]Yj^n.-,Ip}H-3-)fЋI9#46cJjZ]՚3Y \Ӎ[Qj=k#G'dkZQ&NԟxLó}L_4pi4h9=x7,dm>BJz |Fo3m=;66J6]t \sٕ e! j\-Ig =D!z8qg]{c-qM^S%ͦyt=Y}B_xR7'UN4m/E({)f{l|ell go"$^jt싒( i,M ܊^nk: bB;x_? 8\O[1 !`shJh._ybKj?e:m>Xoso Ƃvutzf}5]G6/h#mCu;} 6OGu]Ƕg~{}+#~]x/y㷚obX ^7d%Zkm7/5bXd}=|Qޒ`UEtʵKh:0UϿb'Hl¯}6HS,>eR -Sﬞ"6f+=7^T!:֬> _ q55XygȴBHWY6{!n'%|HEW/qvʦ%|s!9'z62Y emEYXZR}F70VVud2w)~JUnU*em4_zptt}V EhK-h2w9=5:nK"s)Uh*4@3ݡW1zv)d /GcK!ȣkK1joBvש5ƣ#Fh1Ea܊EhwE 77^M̫!y&ٳMݥRD8}QpQssY^=/=+[FzZ.;R}ޤ]ҶMB-b{DG] (_T uia!LUd3SrJDʠ2ؔr('#W}rx9 Ч}rTn+l;bվPѼi(ngLt?rtF:팎3PNfSަNNnj/( ]/-@I!??!D4U5!#?RReq4:$Cb|E-X^_~Gxl-l;'wB&oE@Qum*^!,C]|qEy-F>'w2z/V;Ӯ6D#nLk.k"*؎蛉ONӻ>H -^n}4!i!^-c֣eB'){|8=K됻SظX'[%#%+}ؖ:g_gi`?XoDe =P/^]6Z旋D^axPE5,=dYZP?+ U[ߊ䟙ge @aUqJ'HPj*@'3Ran'zn9aaTay@- e`XHc觹?S!r nQ@5 TlA/tC" 5!!  @90 Gp,ÁXN\WxyPG`~͡d+ꀴϛe37| x۠L9r٘mH1nG. ~aQOÚS<H Ɓ @7 ]< :4(7Ў[%Hޔ!yC?I9c֚ħ6"Z/reZeKޒ&|Vlnk_>@7aa"2ںSIF_1j=)9:'}$mʿVoJJg]݁la̷q 81~>aw6w6e۲K8} P-Rj[-=RϏm٪r5 z[G-w K.47Ab[ɠBH" ky1fmuN*AR42LRÏr䲜{GϨз_K)rTWP+5Niv3 uY1BlO}$Guǘ)")KvJ,~@#x3+] >ogXeO8T&WM3|#܏N-d/i'p^^A(C1od{ցWDChvx" +em#(:%Ȝ)@U1;(YTBn>cupwDz`l$>e#/q; /t}i#Pv=@4@3^Ts+|kC|#lsW5h,C!Q,] `|9m6wrm1b\"Pz@7'= w:蟀g@w~Ez`-YϹá'{^m {%!ZQ+I!vS 󻋵Bq >\ȵ+ JՆ Qs.tә'ߣ#Br##z1?EUpV -H aG拠6:&`F)u)hk;kh\dZ} ȵ+.{BaKXg;K}Ae˔:4ϡk6#Yr4k#|eo F=xO؜cQͩlz+$$ւ.9وpzD~'Z+o2N=E[6ZO.0`|< S_ gYe{@ pEO2> u)sC|K}CCg3_:{sP5v\pPOT8`KM)hiJYڏMTۊmiX,W:o{`7e+q@Mg"  ͥ^̃pB=-Ӏ7NsdY2"::Щ6"pp,).m]~SD l W+ie\1;#_쏰K$Ί=Ǟi=uK!Ӷӆuܴl?ƨ0]R /`qU}ݏ}xaNqroS8J[nc9o}C+e);Y\˽'#\F{/J{ҵ+D hxyƦi3>zcJSNLhm9>K7R]Aeȳ!c 3orΏ]SP(W}39t|4 dy>%ѬҀ\ޤ̾*ѥZ՘?swKFhc(STW{sw36;nQ9C*u;+VcuL}'tM ۇ|<&^'>қsp]~>ۆo5_EY:g;lQHQMgRgfȶ8u'?-ҾӴLY1>Gwq}uF =NA Ϭ4V {l-Q<tcË}<}gK0Sm]Í9-9 ϼgV! '"h|em[e+oSVݪ}v*g" n>Ul^P?N]VׂJGӐ{A|  ր<78%yָ4 {Z.;Z< *嵨K\U@woA=FkPv }ߟB_!ȊH?~@Bf>kQ9dԡa۟S!o~i*+$ן>2z"w>ڰ2p6as$#˻-OƯqϰwovr0q*6Mu۶NIg p2 l4gPyF K^y%= /c=n0$v2UVQC~:;5uul,'!CWΙo .S;7Ծ@aôd(I8B?mdYP.֮!$3ጻ3θ8v:/~_M۽s[xN,r=wx!J xֶ)Y| H8sbi$w@d~) C<M1@zzm5]|3a Rh^QRRz#u|[2]$mo[ bp;?c|G=Cf~i`,%! zp >.1h0 hfaV>tpt4 Q` <2,U٣PT e}L9Z%zC־EQrQ ų86 n^ 仞^tJ(*!rξ:j?d3[%۬lzfYdr96@;Ի2[Hk!]ip.k%K4 Mm5$}=/{ kOjjo!(5"wWtw{qާD۸;#[.vW>bAj%AFѶ5X)HVk l~R9%#1YD%of9m7 j=C, uƽ2-[.e6 $,jͮЎ-j(eTW巶`>=:3d{UB'%uH[u]~ Vz)˖}]#נJlNPb6aX/Ε޾=Rp;{w땬);w|{=ˁ>1N<|v5 ]e=Xho}g(O/B\zy`fʹX4;QfJe&?L`60[>S~1:"2Z.(0h;Ї nO]k{~IkU6(%yjVcVG2H\j :ˢ[jn[0`nB;i[i2|4f>F%KA}so}]m(}c*ZuQ &O0;)1CSv]!{i_TdD6i'ɻɻu(Rk.&H)@u)޽brSw_ h t-?- A9HajF(_TVT0,J-BxEJfCo o1cB1 1b`2' gdĄ6jJcX151 cD\/&+&S{]lcb1A>j7VƸ >qP٨P\% ?| 8GAub.bX2 jX)#ӟ1m= ha> *(׉˲CşPiOwnHeT1Leܼ`G|U.Uف]foJ.\n K&-ӟ쒹Io&mCzpV5tCEoLݮlE;$]wIޱyt @@L  h|^l+2\txT|v ߠK3:oҼ!U@߮R[*WW{W+w;v nr7Ӱ)NC_M+YwHX;B%T2j`wZI,$.|'cwUK*ʠʼn=X剒_&R_ۑGʐ͍ؖТOQ9>7iv)Yڡ"-fРq{|va^#IEvp g7T4%(Gluɨ#ۥ U vvh%z >ϪDSRP*xRxL7ئ({ v᭵yn!(O׮-!nSWCeu{cn0?qFd@L41јh4ĘA6V?`zosλ{wm2Μlٙs-gAECn?kLK>v7IC18 *1Ԇ1Y֫&S =quhRJAX}O?ip RL\i_=ήbOXM/KNMEocWlue&Wp'{J\ k"FD~F,Bdv/dr*lʩQQ!lMp|?{ acpJ),#&k?j(-_)KhYZ+J9Դx =B9iؽm7Fn;__|/ ^#~Z@r8dp8gp8p8p8p8p82dfFE*>xHMEQnu$zh B59WPERK߂:AUt. :6b6-QleQgufDz" ? m^o@l(uź#;?hZ،rA[{R>stream hj`@ &Q@` endstream endobj 238 0 obj <>stream hZiO+[(iR MMMCx ,( [vNp Eˮ..e%,L T{f=0S`.ܣ pݤf;jcN`d&v20C)Lj4Pơ 0ՂSA3_+ôQ,t3E!0#PiΌU f1!c@5xLl--Af=M-s<`=ؒӖ 9Gtс9p9FUF:1ykX4(X h viY4q%hg9,&8f9JOeAi0֢y ~`aBpC%}[7KN'y:~}utzɰ25 ϧl~ЛMNfw|2ُe/k"ldj?n'_WSd(ydgK-croՑw(U7GkvGsÛ'dzdp0Og!! :>i@$9*[9Z7 ?d  q[o 1U̧m2ti+;~0޼`BuEk[zq=,MfK,Ҭ3g+oN3Q¤q H@ڽLwJ ^B"{վ&sWA/6K E i?X-%IJt6rX1dsM,lzИ aSiɰ)_y4! !R 9\ZBwfauB{:K/MFMen:m⚵l&L[.lA]-rMȉ j (;y/ Kur".uV&||0͒nl[&7RTDTLI}Ȑ[oS/Dk(!wEk'5,.SlEgUu8{fmo[X`گ_a@C 9W `_uYwz^/ |`R"|:9Gry~yk2-f8{AݚNRmb '_.rfT"k\认U~N-eSm,"D3\Y&sI%M(:7c& \5tDgAG9Mdsj,p͵0|x_ڥ(W^J^[f?0H딪x^k婘BɃSi;!fF^*Gvܿ?,A~s1_ncm>=6IΦs>_g!WqA18ou,Y޺Q.̀SaiJ-11+WOqBf")[x1g=Miu4$Ki?I.>I*([ Xɿ(c1ojf*0lizrҵ^ʓ_Nj~f3T bG&і*:0-3yHEA)i}ؘ8 vE 0>u^wͬ0!897=QpiR,8QLv">:/J8/v_|VVLk1:t&ݢ,a_:lzr9S62%} FCt/- endstream endobj 239 0 obj <>stream h263S0P063W02P+-(ł] k endstream endobj 240 0 obj <>stream PScript5.dll Version 5.2.2 2014-01-03T19:06:04+01:00 2014-01-03T19:06:04+01:00 Acrobat Distiller 9.5.5 (Windows) application/pdf uuid:4c0d58f6-e234-4934-b88c-12cd70e80871 uuid:353bc7ee-ffdd-4c15-a0c3-a2f919b07b73 endstream endobj 241 0 obj <>stream hޜn0 D`( t݊j]ڢI}e߹k4}<)G$9&&ѮCǓb[%n7ݽ]@jLEy:^~릉nX @f34Zpg^;2 XɁt dۑC`=ǰ*h(651TnKfxin xYNG;N^e&8 upOnVBmIw;ƴ튴. endstream endobj 242 0 obj <>stream h|̱ 0Ẅ́BrQbAZZŚ`yׯC' uۍDB CZ9 #4bSo7[bu/\R_?)m$ډkd!FOP), > ^Ȧ 04 endstream endobj 243 0 obj <>/Filter/FlateDecode/ID[<5949DD023FB32B489B2B96024FF283BC>]/Info 375 0 R/Length 633/Root 377 0 R/Size 376/Type/XRef/W[1 3 1]>>stream hKHTQ34CbH)ȊL6=B&A-Z(1 ZDm"hUm\DAHdhRكAQ Nq6ws=g=HWqV͐"1]MTԬnh1BHvxQg!+EBFծB!$W#솼Q,<]>V]lǗU9&KL^xLp^2:ſ #B#*c~LHbsF_l=D&jy=VV9m;*YFwZ@ݭhᛚ~_Zg]7,g&nL;ӝRb2@ƅծ>دAUb降 ɵ븾.Y=4&p[#ynfB~f g n&.P/^A~u3d ~X52b4{sՄ' y w]|ْeNZ>*7jxQH*1[tz*\Ym1f]/K:$K++.]n \h]v~S~v5G?42ﺫVsLsȔ4A͐xw}) endstream endobj startxref 116 %%EOF lcms2-2.6/doc/src.zip0000755002406300000240000145530012311617072014021 0ustar mariamausersPKo>GL:LittleCMS2.2 API.rtf]ݓ6w|slw*&n%\U(kL\_ HH5CJkHǸj(Nv>O^uFmp|ڲOALn~ț>{C&dx6}J_56uݿx_MĎ.}U&ENxX?_Ǥ(Բ1ml~0۴~N_o$HY]OIfo,ɿyypGܥՐ=$ R!@uy" Rx̚N EB2x|p)sJ=O7i~66i !u--2X+I .a5j0E,*2JPjoEOØoY~?u+#B:U8GTgR9zkCI>OƊ_8~o1F/7)$zd`$Gr??Jp¬(~?葋訧q\NӼnߞ a~@-z,f_ml1(Ms*9Dm}¤KN:2-Cـ0<=cvtV %-ӭvǝЁvU4F5 7i&%TCnsYeŮeLc I$w]7fS:աM]Dtt+S2! 0eپ]T`i^ZҺnՙf{ urd l-%AMjnȶr >R=E23 hKh1qgwB.:1Gߟ;V>ؓ{|zVWHtуCMIqdRM,2Oj5^WJ-bZ뜄AJmO!E@9߈u AY/r3{p\=e]x>sW(9,+`;6R]ȇF> JSVr4ǚNjӒ M/xm2ŷUɶ_ιPx4=m;M)! hO^n?@/҃bm*¡t t%ۺqllk>`s !{c,ȑ]0__෈#{|}' O'G* lMyiofBݬҺO|mXP?MA'05aj VAmr,t]4CpZ{`ֶhm=3vų#z''Q  i(uPmevN_* 'ؑpX<%3nHX%$alt.B t"s]jlM;E ]] y'=|F4QeBWQ".#ȚAA- J]+28ŻCQ@w $u+<0jyQ\x?]!Gqx&oPu+$Kq=(A'&L7N&&I7NM™Ȇہc ǦSolfdq064'(764PbT*!u͊ WkZtjd&|F"ߌnDKgx23GpgΨTVԨF61*J9ǤҝiTF5tIQ9nTFT a'HH|VdY#QD]|$:@hCDg]ɸWDh"}Ȑ\y yc ➜vd6dHTV=y4!sLj,ݙF%ZoTCJ=F%QYiT2j7*9F5uI<˨$JGy]R20ޏuvM?q5d`-< !=OG`+(Q΀*[Q#Y-7GXԀVΠ 0#uz8  `{Ok 8!0fP?…%=SN)>""HH l_ =Z> 1 s? `邈@s !ĕpN}9,"Vj@4&K's+%,á_M]T-5W8D9O9oMwVTcpLz=.죩7ծǼ=ncwwhw\}.2Nss=BFŪ{]֓A8^LwMÂT1KZg,ނ́ $TXɬb#)U! X;8B|b& ue d_\Zm kpK:QH?D'T\zeݢɐ29\ȻnE7D ƃ*{4Z(c Lm'P΄ Pi"4v+›F+XWq7/N^o*?IcGy&dRW )M+?엌_{(\Uig܊L&Y"T?4t^eK-cp!/" , "_ElSyއ\ŰaGy fJ ] gp\K,\#V=`>z=Yp~>8@^2B)ZBIR!# 9D} Er8=0 ུUpm¢LWf/)-ȳmrl@ǓeƒSHx͋MUcU4?=[nN}N8 >z9;bBM% ,:ݱjǖ4MଢۦmvLEZ@dfw_gU2}c\Vb lSqFVLN)[0fFQY(2u9TPϏ܈. }Z# 7(\C>\؝vHb îxlaVXA.ޯ>b+$ y:ؒ@dYHkh"3UY~{;9gt/ꍦYgt~YTWoZW,wL\F׻m;3W"YT=Eyr?&]ZJWݛWxQf@UG?\JwxG:em$*^6:I'&(ody4a!w}EmzB8t"Eҷ'i]*otW.gWv;y[ m41sm&}q]tnN OI|`g/W-ЛpQ38vw$3%3{3GF:@ .!g[_QU8#{ yrmM˩ GRSebEZ b :K=v FAAہאcq(#rLHA1Pܓ/nL&g&!GOLF,s]h-U|Pk;~z+X~RAɹm$cS@<д!4%tmP+UqIӸm);Syۆ= پnoê})VǼYGO%?6f*`{@R9gq9m:uy+Oq%b}#`')cH44 }*Ū3U}UU!l B mvƨIN%'ƎdvYYrX2C͠ 5/'R_.vFtH1˦t9ҳ!g8Yc<'Ly1)/94b A+};^+{[qy>Fw^}//YMyR\uB˴̊ ?C${YOS[f96EgH5k>$ۚM7 ҍ;[`0fw4ъ<.({|7^ZonP3lS& @z} Gqn L_Ш8'R ;xJ6]E)_P7R!׎N5$qm^قbdBu(rGloAlP?.iؽW\]w({A cһ5XjM^wQ whn ]ot}fjtA &_QuR} Gy \>o02@6fy/@2TGaJ^QOHS=GembI.-&DA+OS 7}/<N2dSk6>dӿWZ7 =#=ec4i!~^9NyFSJkҕGDS@ee;เS(E1ЦFZs" >鰄X%dň r|Ʋ^nq2QE=r7|uF-׳C"g+no^Y0?DW9K3Y]ȑJ,"GAn< ǎ"ȾbakO],4:Yvq٢g]e-Ȫ,xadBO]-DQمǕs ESk[PͲ(BA&@9LZMFo䮯fm s,LY4zey ]ݵr? {‡=.ZHK(/V'{'vg]Ƒ57b{]a3g"$cԐ5 DRRqbJO>H5p=0ۘ G o{0O)1{ڨJߎmhnQWyGK :ucqEt}Ț%"I$j˫&]5TsjqTCRԢ[YPEE,pLؗRs{D1KP%MULM1!Ɋ%*2vUžK ɬR{H ]NNK[HTB_r A$"<B2DV;`Y[!!LDſUd5w" Q,CV@T)k;$GQQCH&8+br)"[@Bd]67dQU$QIs"8%^6юB١cv聨 v kmHYƮ$owE}.CCuUEM+\GBf8`W2yIi-ܚMԕ/ǰD#0UjH?đ~]dpwߛ%j]vo5$CN?2A{ cThfY<͟V\m(!1٥e7EL>:]nMvYV 1jފ+- na ^նe,a ^dOt^5ÿCy5يBW{WD&T4^9Cc5+ciRk@*ĝp{iR߉WfVa*y֧\1t"9Ro[Xq9YnJiW\ 2:\qi.kre*RO[2e˱޲cjIbjaMS7 SLM9K]]e0a Ndm;ZF"*-!N^ZSV4WU¿dJEzNI ߆ :kLp!b/\ZD a)aʦVpsT%EE/ӜtfWiq #ǩ|I[Ym y`B'W X1E8N8Y)4S5]9=z{4nTPGE~$[dX~[d97U*:]IvHV >MZqVnT*[$+[ ||sB Nl<{_mvl|؎JYd/)bA#LLY_JO+YDߙg*.Ց _gZ8n,+OR+,w T(K ~V(\vqhԥuI_Pm-j/PUNj3@W)b| oAtvM>ԅĩkD?q vvށːF6γNyG"w.P@R04 W,b&J fRTEѤED#?]78kΞӢnTHQ*a LUz&}I$'E0grr k$UZbR'tt5)E hL'B%Tz T"h--B?ԓtML: Ĝ{eBHu~ KN{hB+L -6$bj{5ST駆(ڠ~7 bRG`),Z~R4Mxf 00XD ^eCե 77ZEShYU-A{ʦLUN,we*b2F]"K2JLA0‘ YVbLV`eUWdVLSRt*;\~m\(k ,궬!T\cefMdDQfU-M=zS4ha Ye]ge45VT=DŽjMV6:]$橡1a t 50`ҹsde@\a4 f $Uh.Դ SdK02> dQe*=clvѲ oh"iY1qpe$eP Cc&'i|$) vi~]h@$egɤ lA3EEeØE3h}0^L%2hQ~ER=P"6Š,@Uj) Ӳ%βfҾ l֬h@ V,'Q663Fee &)FO6a4[P6TO61FZxc>]ceUReCe&"wͰ-б1?S2J[$`u0Ѡ)geD5-+-Bi*8hi%i2:4SE@_P6D: ~iTlTQMYiXPh/F{&z%5;3.s35dPD:O@HVV o5 4\G5|m` TV>E+jZu7HUQAeFC KLv?H0XBTaeӠ[5qʺBɑ ,S W-T@ 2r$2/ay-&PN5SCH&ey@K{d]f8(Y-e0Ӳ"R̈́ұ+(jŠhtvhA&ӞBX#wfj -G Jce3m)F%X!2TBM{@ =6&k A=^"3i-ti)1T2EEz:K0h{t_hvt=M\4ٯcu k0IFO|PW'eEʆA9 xZ hX#bǢeMMT=aDar0τUCx2c2+S{ ei&FХ FHgAXu EZ%1S1("CEe`:%(˖>K /`VpH[~!,-}*ЋfLJ(*i٢,0Ev?e`A,V6e&= ⳁl(CmTzzupUBٔ( R2#*+[`bKe} xDMjf` ~1$Ƙ &<Ԃ\Ltb-@TE* ahUVÖ`Qejm`A]$DdeYoHjhy̟7 KEg {]fo!R TeB,TYtTf3?tʖAmA%YTKpθ :ޖ($#(+ҫ3 FQRYP A dp3`]@☗ e&*%(zBGq&H Fb" 0mXaI%,vXJͰ7pa@S.A;-er/N|Ez[Yy{!NYTL/ȊHJAbƞ|6zx463'&`M/@thhm$5bzodP{90HNl[©lzHڧO3Tn#`703,4^8>9I%UvdGI/TCeѲh$Up GM8{4q r*\Ada.Ȉ @y\¨rz3[4 00) 0v0(5^@LdLdE^JA$xd% yf =@d.H`%}<[Kkb/@4T^)bl !m/  ^+63 /hHRpMAJUF\(^,\ # cMx\UJ/L^l26W[ U>&fcnh'Q Zz(^|*ӉlTՁg#M/ 8ٸ),0Zju ^k))p 0  .#zL)Cl ѯ6TpXA]j<]ZG\pA!)]QËE) YMq#H@'YD /PiNk&8\jfPSJsKYlC4ҦO%DqG\ݒȰ5]E1DtNא p"i~{Z0&c)Y달y3r=Mhϡp+g)MW;;%ii,5%;WuWPJ8S{O]׵`vپ8!|;;vWӇ=*ЦH7@UFR0ѪO9),C˵}Dл}."ܕb%;;@tֶ q8o +Ϗ\/R8^/YʝA,Kx/rΝ_`%)<m{p0I4v8 '"0-hIiFJ8vB9SoEp?Co?/|]0SA4]~;%h=w/|~=>w]psx 0,t@F7/g"0 `t`{мA*: c>ހ^O> 38H3ʾ] uq-)X[]4|C74 buB"hn{,\weh=;84i.^$  t9^<= P~5\@!oélxCDF] PM6o{&)݀ {1sRj{Inހ^z;rv\]!Ͽ٤bh-hbkw܆ A? 9.Jv<E^DO BmB' 812Xs;{f-/a #g-܃ 0Cnv}P-Ky9=E~_ƂYM6`Šw1'),;aS@yeBXR۞ [5!ooJnCs.˩r d2 .z i|Z}8D{Tۇ&ML;yB`EupF׷[;I=rPh R @*q?m 8ӏVM E?X1_< \%:tyY@[ݭq*2ƿDv4bMȸݭg`Lby%wJH9}PI|%]'<͋|ڹyX;0qo87=F~s"nw]$_蚦;?Z<y ևKzIz[۟;欄O@ZƟxAs99u:ҧ '7گ uZ!˜߁H6/#_N~# =. |L'4P$oӑcY-|ן^?I"F^w}dfH\ՊT$k[ Vb-P|Hؔ,eX>ϙ~Y-1ӃЀrl@`@ |e4%5xbvbuzuw5^9ۻs/YQ;o\e4a 'nm̓>IDcim0~0W+ϣ|wc9 AiOJsXf,d vԇ喜Ca:Yxo|fVtRNe0ּs&0e g} >t Ԏ_Pc Ȳӑaib&nI%?8D*F-b'\y)H5͂SD*!&@d٥ D>am (L=O EB4 9_VؐF> 'Ai3WڃɱM.vNj4iqf(L?@ GdH޺+\k82iSq6Hx&jUkWmkڜ9Ӓ"ysӰZh|qoU;*؅XB%02@ư#o=(m] ]) ޝ + %{@îS xW7[*jxM |dqrPd=qT> fS==/ڵlcMetJCJ2\y@Ac avt+ IΔJ:Ep|l8~oN. ͇+a: ?Iϕ?AɄIx,ܸ^#&9 OoT reM0+OyiӍe{/uCspHUV۽3s ?tHb{Xd8H(0``@P6dɎm" qn9a-I7&m:-q&I:m _hN.:Ml4qZ.ajfW`ao3(QD*k6k'{͕uRY-o»_hc{xp9lo5T kGbrhu9eh؅ -AԞ:gf訏:Z+LoV9tl|g9*;5CM ?wԶY=gx(#J<zC_j qp{a~‘SKˆRjppQC55zC 7Ԙ\zV7 D U )JM6.KdիUM-\9jJo`"kޟ>3L^ O*N)ZѧyyѪ'ۀxxh ^8kN4LѰE.~pg׫wH't =У%ҰjǸtSn~.o\O!TNӯW<3af-]'&CLI]W*X_{4?DY~z]4NCd=H/E}~s&aҬ!,Nޑdm֣iz^H_Urp `y.ݦ.KʈaE˯ݙ>eƤB/pg g XqQ?/cb/Y"a1 :u,C!p9#L^}~QE͡JÅ4V5m\eƈ9LϺmn۔ؾ}LFi ysA5K!'fqb5kfD6qƾ}**y!6M'P& E٫g(Ѱ\ M;z#+fmm婍{(_&ؑdg6]\Gt@LϺ)m:di'f#<όz3k4_O7sR柼g6>?zvyZO23C! y} f榚erNsGW}SS2KU1s>S08ff)ay#v?bhlݴcr{ =/54uC0I;yK2OR ; R)mRݓ@!T֍a2W>sTܦ܂< M*ԙ5ꉙs1A ; "?0 m?I0_LLWWכgMlqzb9;n7^y/{ZyoM7ԅdƸ3g:?tmڏ1uX֝py.4`zXVxO K+xjG+Om؃ $1Xt/{at^%v_I녍f;?r7Qc)"hQ~ğv9f^HZwciAE:%ɐ̉g.ZGRw?~TA;cwMOyR<ѷĦ{r kgy)玁A:n Hʖu<,`osoӟ*h 0 a{:EtA4neܷgF* >]>?~,X;EeK171E7/%9hwg-nʇ1&*w)LTB{=7A'zg*q!fx*GH/#=&r Fi0 4G 4Ҁ'+/۞/ߝ GXپ}zRG ߥHNVp'%)']~*aO CK |Goo ’ċuMqh!1GuLBި \ofNE6;<%ۼ\lu=Q ;Œ?;ahƹx;8;x[=BFlE~Bq2z%WAp[w&#`<ׇ/4",,7?fpaH Et",#u"-LD-Ӆ .];˺̠w]eNs`07^ i{ ̬+&f~a3v4W@fsjҟYWoy;*8I;ϴv=X\7QUsu s)-Yz̶;~sd[`[rW?6+ϑj/TE^,M O5:Srӓ4zf!R UMe%}E4Ő56wKf()6OQ,(T2132e胋>REfV:Κ`Cs9X;ژVFgtҽf4K|/HaN޹;;(UzYz򪡆θu_SJs#_lYQ)tM5x.<d5QlkTGJ>KNesEaUrY[2ucLջulF  peYxsm?&%sZ։o JP.ern= 9τk?v" v m4\\6hPO{N#Vτw< `On=?#SSוm RgF5IȢ$ vX5[Oҁ{.CC2HXt֒JZ5Y>̾<;>4nou/ ZM6N:U5MI̚}+NG3uTZk[|:q ^UB/ȊX^/L_#U_6>96pX>))< !Hs=!p7*ES?jd+t5~娂;ϐm7HR{VYcot!K"Ro1-꧄Ov;a}-1v,BENfs&A6B#gG 9d{![GNE_2{ Ka~̿֫mgWLZTmZXyЁfe]"l'psF{p'6ۉXRxmhRx6=`{M?~H*RJx(A" C uݐڞ Yώ+ɯõF ,hFq]ZXѯi~ҍ"ǟ\ČbBw!Am;AfRCTS+Wv6t3$JW%]>Q*u}֮+x}c/s3͉6k'ݳW5i3rgk~':rJZj[gm>v%ͿonQou(SXN##\9[ۑE2UkaTF ᧏?/&1G#i#ܣF xb&r.k*hJ:5%RV+<ρKk<=4M6(:"XaϓR$0,U;x2< XxjS35+Տ|U]7@مg[:$䒦1cRcQ5Z˺eꇧY)j OƢni|yÇOi'3VEiL)X`^ V뭫HΛG1u߱0ֻTЪ5jjգb깍q4al`0~>d!'1};]؋'xX`'}uíF ݯXȿo{s?v@cLk&ȸ"Xo+۟c:-~8i( gAy ],EK/'X wv.(AS2%R:MF24 b"<Ӈ7o_y}͋zD |PrQ%A^aCg/<o-dȆa'>ĸ]Yӱc: t#Jx8zXGXJ Rgyrhs_}}c.cv0ũMji\,/_|r?yC8_YXOY&Ix._!fѯlؑ;' xs)>#p:V4˾|TP0ZM?qO0ca+FAGAJLsJ|PIHYa=͗^|ΞHRs1MEl<𗒂ˇ;*͠ӌ] F67q9!%z伙gq,f'SçWx"UB ]z@90ӵY4LF~|!vz 2q gU*OUv5#۳؞q9KL5|0-C D׎~:s H a(\z_[兟yS̤p]ՕաNR(+(`H@Q OMsr eC!9Cf|-+r ,ÙRTS YBjG#tgC_ϕOUeIE٘?/5D)X UXxz99L -u͔-0FNg:+{n;+;(z :R:?ZK+=b2b+rT(^$+7=Uػ]0bKӧ$k=όjS#}6߾fo SkdEuv=p {Oǂdanv0ގ]|.^9 |]4j[:|vcjfX1hBn1jQz72aHsJ-3[Z*̧r[V[2r+\amcYh:l)VD> sg:bj[p,ZBƛM? Vh)ެqG.y-$Me5/?~y,62ȫ5x&!Z#ON4·+\͔YSxVf5x(]?4YRmnbZ{w,7OfiJf..=K9! .B1n|8 4`Tڋ:r+ɆL3clKd,ܽG[+Zw*m8څ\kFio[ Ce>.KT9OKLz.qSSIevDd枢I)XG}ͱ"|*-~42EC=ɁX>;=jngz~C7d=!Eɪ"6k%'d|JEӶaUSI:RM=pC69 `-ݐᗖaaٿ⁡G-Uo xQ_c dK*kz [?(cY /m;RA BKtt*Grt*[3p* R bk#2 O&Ք!'ykU̲ X;H@d]ڕ?hUs2;Y+ BJ'f,"E¹q j]L{&ۻlХ2\W~l߬fN٩=%IeOέN'ۻ2["WpJx\;|0¤LV SkzIJ*c UvL,.CЄ\COzCQ@Npˆ3pK&9q2=mdYpɾ}jzE4 If'wf#:Ԧoo{3r9A-qHy-䢨}p9ұl8 C#OXN( }F^Hg#'}uEe L&! #͒2*M4"XIr\]j:q LO78exy5nآ,W;5F4^XWyÑd9:u;Ajx\_".!g̓Ct>9._Ngu=LgG󙻕{m:CZ#RHXxo7|UY, f 6T6KZWϪ9gGߎT| %>`~~r%v5Y7 sOBsu>srcc`D[m됛':.xďp/j VV װi r3Vr@SJG}dMX{jgE^~_}Wܛ(tSAЉ#5k\q?hVa\/Oܙ o4NR91y\*?K"}ɘu! xd1J9N3wʽ6 !m)u{Cmb>1?^fG ZW90\K ت]#4U83k :Vb 5cOׯ_^`ǼX6~<#H9~/3%&2=o∘KվGJYt\nkpp9l\nɁkՓ>ߋgpCKO.h3馢zӺبGFڝbv'U L2pvC 4L}\/oW~IJ3Lmώ;O)5l4Ylk I\ѬX`nՑH`i.>ou0n;< 8q:0Xo`#Fb8E _g7 Y)- G'Jب椸g›o?n=PMRͦO.epτ{p~a9ܶ1ݡ4aNf콆2[y_1f>(X "&ԍyl:%w p[]o C_KӥpnX$E1ϯ/}tӋWb`5W%E,A4r<K8Hw'7-?T@ɸ=rEl*)Oeq L,x@ez"WRW֙QݦWt:]. ~n2K@/X:W6m[%ۖ Dڸc*Z)fn+: s0ژr⠝2X+Mg/Jc jipF=u<`AWN~KT~$I7 YxqpZ~zGzQQ1Gt 8ҥqj gw=a V+Ǐ2v+\z񵒻9*K1Bl "&e)_ r*vbr8l*W[uE+pl2@pʚc'&c~ Y$qɲ*Y;kW.6'q\Y!c&}* )2T6jiKg02qNE6dPh jNv-a wn؄+0.UG$ʓNT|?:=NO++63Y(2ݢA]b'b }ÆT4#dVOtd'URUQMν5߸ߝYuNGCГťKS_|Cd8Zڌ1Sy9m$ds[P[s:y 3SKXyxs>Oِ1r,'3[gv3{ SƎ uS(k%Hq%} uoo%RV !ǹzGH'Ht2{Zr toAhg6GoGmc=F<2S1"]M9tpPoidxjDhuq]:*b/<N]֡Jum/ESgөoIt;>@|&_ߐc3u-(ɂk WpzjǹȏICJ'|H>8"|1i0{pd` }U ųF::: ~ GvnUiУgWdŧGqǩO履WќZq`i%W8Xw6F2DQIh^pQJ~8AW5gJ,7cJwC4%1#@'l}=?*GН wdTɓ8ޖSl{[D#ܛ:u{j=:KM!`YtktÛ뷯;r~%]T!&{V![XY mmקC vihOm87#1Rb)m1.Cͧ?wԴǍ`{'h 0h"q0? y.`,`s8ĭaq Vؚa'{hWlUVؒuN|qGTƽBEŇM>a\-[vVr6+QA;v/݉>mEi=P7Ù uFx#_ pSc/{tx5 ֗9< 4UͧWO6KE8(9OM MQ!)sx&I=;d?tI<S7!̻p>ܭaP  'X'JX1.yBrǨZ=xM\xɍfɩ xH#`g6f5|I; yTk|q _,ΆYAo>DScT>7n޿xՇ>|÷2"{cz̨?n4Wfy_h #TcEy"j?s"g[#JO?G_X DE9hP|kQ_&x^4w)zFK]kOz Eo `aTL*Rׄ}=]mV `)z[X5%dqx7KؒJr<xq+݋$,kz5,c1NtO2wǩf o Y(q[є:0R-S4fb}#ꊽ2*~5shi OM/޿sK/TAxHĄoQ-i3#h# }:HdđDQ/o9qᚥ.?vZ=%maNŌqJ1t-+ęhͧhdsFW-np)Ȗ"윤3uA'?OMp84$,]ĸ4SC kG~O Z!KSvtF$R2v~QQY)NXmNﺤ+^JyS kɞG+m8[VFo+?ocs*o?)A6C܈}/QES5M?޺q9ջ@!׃+DoǛ{ lMtȸbbg6VֲMh@s]r:S()Ђ Bi#-~#}wHCG+_BXny{J/џ;>y #Ba`бϴUlA(Z T кK؅x& ĵ EyBWNwL.\3ЌVLBHSA@_@#ϜKv.a*峓H1#2X`7882aB21/kT is4i$!{%T v,ɿ~7_fxZ*xSTق|ym?%xXgtswh0ռ[Lzˬ)aS@1{XA ţ055,a)g OlxU>Týz(\_AU=ʘs#\U*k*[k·]T<_4/Yզ=\ՀRqQ9At]]EFvW #KgN$8c'BB >#AݜɅp)Q? ؆'{BBrFH(y&Qz<~kElxFf!$t@Iq납$ÿ;]J!t()O"09L#E#9*P#Ӯ<롕Pt cx ;mw2=֗y@$ʣ?9&l蚮4)p@/QSKn>lm͋N\Ii%+x+?cԹOs4l, ! |j'\3QҀ-?7& Fkc{N 7rKt#%܃H TY{H~8w)J/J6a. o!rQm 6 a%QʯiRb@6~昞 c>W^e JV[dh@}#ñ~LPfte]TƙITԦRRFtGš/L,77krq=_eg?74?5C1rC}#7ސ|N#𬂕K>6nzQrVA.GHHV[o/#8#n߅;77 |VzA 8f?$  7I&@)ކ \k#&e&s;ڿ[(n0Uk' $k65]"W? ;`Ǜ5)[pVؑ߯C'X{`RAlCi;agG!=bRtp7Y7uI;kxoN19LFl#uE͸~U'R} $UO;I]5#, ĶQEEܵc0-`޺u\-nlWE H,GnPEq==C0o) Wwɶ MP!)xQ͠nQtdj͚Z)8wԛpfn7YF0|ҁ42.q5~Wm ;Ż9_"bFh9:z7Gɫġx 9O/~ӻU]'b .6uQ.yfpn-s{-Ph4Y:}~ TM5]5myɿfZ:`s>j7Kh< InI"k;sx8c*#Eפ5u 63T|8 '&Ry^=T[}M t?ܕL5ܮWب{ &'S#"'V͜D3@*>Qih 9 ^npM(A5m-  gO? cs($]`)Cg;{;tئ hy{CL#<8qS0ax.}4q n>#;cE~MA O.s(1-6N!;h?`ǫ.U9#OjE+8H' Sضö+Y.U1!YԠk*Qk;Ny՚ӊfXnVvǁ6xunԦta ԥGP\W%Gx͡,:Jtա#NAeErܜfvm'ǖ U1Ly de@m'gxcPMrcPn 厎} + j)#Ɓ#-U ۍY%.p-;8=&ZkZ&q CkǽZi*cF&To 9crS 5y4pǞ'U$ʠ_ᱼtz -vOّQM824xF7aueK*W#u L r IPAlYv4O(mp#EvwBvvp$O,s&Q7k-'[ՈO,YB4|n[xpw7t |*pmDǴx婕AdG% ~.3/}2]@ˠ̞ā+2wzn@Zة6hy)9>/(rgӾ"+{|"#֓S]}\jXbwD+S/8P; mkdٞNJ=\5-eVr׸Zw7xi1>X[U1 C5UI^dV|:jLB^uc[XysҴn;-'rN 7 An4y%)9d^|r2)i4w?#q/n:uذɨL.Ds!-6 ʁy07#mQTg%D"3_'-?N?9 (crbƲ?~`gyz|}=*):uɵ9Z$7J6p.:iƞ%G.&w'{+bTYաh+GUXgi9hbIj&S@Jl\d??k ,~4sxrţ_QSebq|@ce^?1(OaIg {+8%nF7}G,ݳ8aq03wNH ;}<}hٵS@Į1hvo[݌}4X:ߗ&Y*e{w=8 N@ luV7p*ϰխ_U'=A}4].ӥ7'qLмok=, ^~ 0]:ai~~qEG9ΤC -wvpgaiuH.5w-62QK9 Sc=Ƿ7c36KEW_/SF;[ p<ϧ.yh= TK?߭Rު ;zv0zM^.l5zǯ+T{DGm9'73߬Lyky ~q8M7p1+'3 DT˧"x gZۮ?/쀥YGu4hwU'?tŃ`6᠈D6lv0 cy$ʉmx#fN ceُelIW&y'^л#Glw@?K3f'NgpI9<~xt5ߍQC"Z1knDA[u$ZrRm38nί\߁#zdHO2cJ9"|F8>C 6A3v@2 )[=Ecw!|iw\~ЗyPC8?[OCžc$|wkmZ_]`>Σc,pykmZs_??y7矯/|ɑ#iH&#G"p$‘Zٗ_/O EW'pzs{}r=3$ϊ Tpt\HRv q5< #1>Ƙf _[0f+tzu q?ETuyྮ J/H.$Wyhfض9#U9k_C{+ay<[κ7p뙙Κ\Әo+ȭx05 x#2WG93#,}v֯W?%♶Rhm͌*@rw`1Ժ[;\Fde{rHmrf]:ɕpk/WghhH%}uZ<&B7`zlz'$3V"1/5.6Kb,jw䌵oqELg ٘ `!bÏL٭!'uYb Ve>lzAud!< AN'\t@  1+6 &>D5Dl~~EafsA0CPTzh cI𵞌X5jV^}uy꫉ 3gnDwJSkL&I nqUAVZBM+D賱2|=:Q'gn8O0$푫J- I7X?_E p:&h#gws棅K"|4oɯH& 9$K(eҝDǺ/;VqF/ =MW_G chfwOa(xomI u17`a՘?=D)PF*Z!ԗ˲shR5sRE9 h=2h!.O5V$d XM2.3K"g]ӵxj9P9+"k',CEѬ'İFMG`C $gd.@ BrkIn&?,=deV9ЬXW~iW]M}:Aud ȁE㈇R6z],Ȗ݆ U2''/QSrrR.sYIOB6@jheMmg XqkhGθ\ (_q:*8:oy2` $s^E>s'Mq/`8<|0ۺےBD:8f)۵ 4p"hMEY@~(߰j;N?7@)hSEeaϞ_]&]fݫ*ñ(Ꝟ[slNjPI|2!WIJ."/`'nTMwTB8r õ#ūBy |4K4=keF=L~W@577]om:hHh%ӐG7 $9+=Ay\dw=Zh' !g;Ys-o]0,rS Jh_o+#~xsKGu!AKzyQKm)É&VbKl䑬ټu|zA zҙxf 4jؐ,Q 4VIFu4-\ nbL߼bP2e& 4S pCm]z!l*i: }>|}f_smB5;D7eHޗMKvBP {- 8  !+M2 K},'N^z&4EoߢIm*rqH E@$cTTlTrGޒI+rH&MרIblõO3'HdyG7sx]^RX  0vgS:*eaJ`NG ^&TWaq@uϸ&]e#ΦPXS.354>3ݫa,G<2jTXEBtg!FAR?&pv,"@vOÅ7uX 'x#Yrh,Akz֝' ; 6zX0[7#ow|G*dbSu{-M.&Xs)aΆ]^ұbF{Qڱ:Qc<{~KbLxPBJ"sg`^ ٜxоt2dn2^ved-Ġ|lU.2%4iW#m,+=Q0烛"u{'5v@Án(ɿqRB^-Ò}㸇]}* 6*S@,Zpp.889iZ$%1/#! @I*1(qD;\#܎|"䷙^ #hw!0RNzoŝPgi/L#;s@Gq[^tĕo(}&HG<yem"Ci@FʓO#VS{!`VV] !r T x,8XV߀CLdpe6$ERs@ Bw& aQp-GC͖Ki-OHh>Pj 爐O4!-ȇYMe`/j3U6{,TȊOOVvrL)|F皲F %g}6͹9g5 Y@E`t)\|)9v <蝠uafx*JX3g=چo5sG=Ù~|jK"+0^DzҲt~Xb06WcʙiQ7697W_V[_"sMfn_ O-8rKnEIC} t:"J}y EʷIe'ކ`6|5! +[[yCp):}!M!Ee Hv:-V^ljd->b![]l![zh ]OK?,ā-Iȳ9|7`p<{gؐt5u#%$hMs Lq?MITV#,XX,^0@k'8 p-7ׯ_%y= sHE0'DN@|-e5NαXF"C ɍuSۅ4~ 8:+KߙySLtFGgK/ ΁rek*q97g eT(?lJO7 K Mݝ>@3֑77\yCUq6GXN4[]<5raGE84m]LLM{z !K^v,\9A13=gCR7*6"5F>a7c\ "s3y18w6F #;XLL.qiyZuD>yzEU^}s J_Gjpt^~Dzḫ+:ALt@a˽b2Q淶 V`A2C Q䔝YOOrMe X pLq.$ݸ[p?-S@|TQ<ڸf8\4+XvTVamn!BSPPK:OCDPzt-0ƝWldPFf E!>1B{rEHODa.YN^6T7dT]\鈊I򂀇SmPz]_jqfDOʬwEcX-"E:?n}/6N%xXr;cT1~e u2҆]#v+s|x2ӖxX_ gr[!xa-t [^iů地ً;|vk2E$?nL3r"H.cWOE|*癩 ۮ?/F쀑_5vy3Ӷk]0tɭJʵ>h: cnl!a[ؚ5<\XsaYmo$Yj0Il'+O[ ~]vrZsaa}gmAh`@ fCAmȽmNWpf_'/}{j~ZlN>$ǯCȹؑyoLrWGEό捎ks񏨅odOH7HE6ь/SzKtgV8QNJDHDњ\E~Oͦ"rh&H'EDћ߮9T4uF4>6&Q"Jm]qPjA R <]khb=V ro)%:HGtэ-[Xy:%>.'3|n1>Ä9H (K{chQK}I^' DoȻ)?@LNNױIŕloPMTROUl \A E,go}c TDΦcah0nG '3V݆d?W J KuW\76>Ws4*Rj⡰P]P\P"8"8ōM7BBD5m =yA7ʑ0Z::mu2L.aTΡFa6;uÈvpBZ2ri&4 tMka<õI@yGo,P6tEzَ{Mknm`7tC%5?,bM0ObsbYX/qW4/) KKyP"Xw 9f 6X:Hz,*19A`Kc~oG͜+F.34ّfO*y2T&r 00x̺UkqO>{P Yjk4eۅ=7?K=b'8X=\ x e2FK^OWtzWqB J/sy61d1PlaȲ65&T8m ?~lPeYůUZT=|O ̲q"dCxzꢆ=16Hvbduo=".o;h.BlCmX R P%o(8`|Zd ;HBXJ9m_zL.@RvM#Y6C;i=ߒI @r= &dn 9 nd3!*lFv+%A{&0T5,88ZmZNX* 1j.y3ϻ|n\)Ur0v 7_@ :'NY"2D1e@3J()mv^>DOud[Ĩs< :bFy1j6@]1}ZYb):s?XTUp-53muv55+'68ְ{VlԎRZQGlKW٧?8aO^ۡi!Z$>pO琈w,dwkK`)'G(eu2ʀm8z[R1Dl:o6 n#vp4H΢/zBEgO?KXEW6&"_^'_ǟ~%=k|_9da9\7O8܈M9=s€0%%)| 4+t<&v h*x">Ťoo;v}g:#"y+x/N\d>ǦjivJ-h' gyKKڊxǷ *eXG :bS/p*hm]\#rwx6H~m79(ͩpr1Ϸ#hmpIA?'',/u:kz^ȾW"{bBfl'7٧~6Xl@Xba\ Y~[M g4b\e#_XƱ^ZfO0fZsH"465Cex@WtjŠoz/i^зb|0_Hwo -!-4twP4rC=6cl5mKm)!c: {!3a% )]^Xh<92{j+~ԩ2Y1T{7%>n=¼3o^헏h0p¸@ɝC_8lФEHGtBҩZc6sV<ryvMj[M@9t?b •9ANR>&d7?,Z@ljPf*@T8%f:PȇtTfdՓ>kmBOb?Bq?$'#0?zWOPa5M8D8D8&[*ͮ]h2]RIWE D-7is>o*"'a?d|WHt#䮜R݇[E Z3‚")aOtWEvowUզ뿥P03TT54ւ3QyߜG$&Eޣ.w9:,}h(͗G W@ճ7e 9Lk<t~fm#;p S j^Н113#>?[*wyA3YSM""0+{ª^b|r} C>8|mR-%lZ)Q rE 5 )Ldsrxsolv\keb!23萊3/ EM5/V=9aM験0́zRm@Nd-bH֞nԣ Qlj۟ՇJ{EbҴrWK0?\J8SNDNraΟuAY$xm%Z ]i >fA ;5|޴!]^5sYdRLt IDr֖8ظ4Ưȗ.G&AvUҽd9Ev5QTu4Ro\_}7o>yYLqww^?Gt_[DH6G؋瘇0;`W &Ǐ9gE^6c;aOɟ7N?̦<7 Bb!=еD{/+km2-vpmC'AFS1;Ia 0n_PLd__N%RBUdt3Ü`_-W5lM KIMAHy,׊vd-9-ɨզK~P0B:г}7uѪ忈ʧ%W:忺2|XS.o!w(FcU '3^2 ]JOp@Uo~ݘ 0f~NC7?~;觅aa׵tYMF1z#Qkxs߶sڵ48r(#&٠nڝ4w5V,45"3%;2Mcou)m *0]4Л/lg2 d<况y4+/N0wp9a[1$pn޹f|j<.VUV4]sWX|&Yq1n^"5҉Z l( ń} h4ƚdy0`klb̅묐+}$+Y:6jl3Tp\/qWSvqHGL8HD&6eXRnd`CΈUA.Q<ܘ9iϡOD ZSyLZM1r9+ :&]S~g+"oBzk̚lxA)/ ;=-4;e#is4gCJ'G@SA2OSHo2z 0$Ro $&J\ U.ptX; Pa c7}b]r׆px0ݰH: 7jmLkjdqnz3ךbg6n_.l=#2{畹 DG%DuhDe_ F/lbb25fgc,kSc"Oefkg˲_5Ϫ?k04E1nMVrmx!jV`n=>WDdoOɟoPu9t3Rh:fӿFDa o91c:ІAسhDH0$Rאr3"R@bP;ƸLDjR~wY0%fTؓ.ԛ4~Tʮ j4~3 g'Ζ ۼ7m$MU'7U+<w%E~V2:a\yCUѕ%xGe9%](: M̰rLjZzdXMg&#@#`?0=BƋumH41ډpؓ ^Pj rIq~"OgD^]\kkczF5N{6>:H: QȝMȣ#9o'W{Dq<;A9QpvFʌboZҝz۱5 fٖzPXRĞpz=w\{9i[Z"mA<0|n-Kfv%PA=9+\]:rf[Z`Tӑ!y@ZcGI٘=\T'dD>A ("K视gyвXs6FI}|۠O׀S0y(s{`ۘf,-Y;n0ȵ@ܘop{:Vvv uR< g1Zmq?/BiT%6 0h{305v(E&9.ICf$*5=ӽ7ŏu`t۴Mp7BضcK:"vzDD1u&$c2meïG6p`4逥 ܸO>toؖGՏRJzD¶xDQs_0@T3Z UM4.$:p: Drb@Zy]pN:͛_gɝs+*Xm_-Adpk3o8ڤ~bX9u2RF#)$}pk:P`5i9_D<]!'OUtoAkN̖D5׿b2^CnL*8MWƯzn~Mwj֗մ j* ڐ#.0w`1הx&pMO\5@Wd]!a?$P^ ?AmI7M/ 5<ʗh΅/hhc,h4F&82)#'}sv [D5$NL* (ioSű?[@knpQ9;ȓO@&\/J2!1mԙ u4L6Ӥ T*gn/`wλ`H[]P2׺2;e5eeHo,΂hOּ{&}9)H#m&},p "ft7q4)rL`^V'Ė& wG$͓Vq4 8|p d`*Sau8FQbx42#䧓L?[: Z1-A؉Nҡ a\?o_:&CŒ{òII`+> 3VKg0[nG* Mz3U@W$~. *uhP3gϪGoDWhTogT<ƲeStyA°UMzGȷ;gw ӛÖxmij:鍦Ya_M°̴>:r6[!=rҸm%oEB{&XhiGjPr0(֭DA鎍)~jEtGUR+A36*Zߍ's}od xnIMᮼqkf4`Q!RvR8R)U{z#S[^POnFj. &. ﵼDV\7(2);^|{H[4-S4g)*DFʛQEB';YYq!ۤ=# 2@ !3 -~*rKqť!&G/uupBA#*:(ob=]\3׼#zw Lhx( C79+s`ZK`!Y06|y8桻:BH ފn ` E%J^F9.SC20pÀ@%ӻ+l%6>M/.KǞ5+XK-'3,jS35M=юݑ% ?Z8[ 3g}X3GY!-~XԼI;ZbR?,j@Evʗ=@'(r-Y4gɀZP2m% Zz{[*Ȥ0=`51! ӏ\1R ȇH }تݩ@Uex!UwJENƍC'A7N3lW<037ʪʏGw^F@. A&g+Vδ~ `Yqg*޸T6-hKAu۝dr'&[O̲{=;R&:Z~k*?%ŬѬ`(Ht{8әqRkAWQ6f.I³m+Lٳ?wےkh|Z,U -dt߃k7eu5>]Q)E` 'He#j0sϷV5%5~HGvHmZn|z4NwLژk/X0;ǵ.p)NOUz1LU.n0`to{nRq`(OƓT]&4DGy3Z]3*Cxk]VxxKkpn7gY@ oy%n\ٔ1 d"|儙~u]`NQ;:0ߢB%5᧦1= N_8Rty2W=^OWtzLӽ\HqTz~\(:<;tWUPx;cΡ:@ˠ`oj=s54c~ޮtG:AצO=-z*dO-!kk"MGj/Ez?DPTUy!z*bc`ޟ~>V5:XJF9yLwJ-XP{q j\mu%Y5抓Ŀg%6/t}c==#E?M3&W- ע`-Ά,lMgU;=Xk-8=2-nUccv?ܭZmW>}?἗8箹AxL}sq~_}9;Rj5JAH$7,h6M|җ561d_ 6֜PA Rư#|A.]ߡ4vnFʱ}AQq]`2~4~ThTvUTKݝ,J60tL N+:{(Sqz[B:Y22LCxxEi׽\@j !to#u8-8kS gAhis-jAGİ oeʓnl5H:FO a{hk!#憀h+@Y7ɨ!LF4GO7Aj=4:A(aѕa{~ >(i2iI%{[q_WL֜=fOEXE(!R椣0k H J.9  ͈ )vԒy6D6dڹ&=d \-Hlemc"hs +s{-fGE4g&5g-9 STdTBͶ3Q/0liF\y,t I\65wmIHk<=#2fG e%J 8 LNLIp#QI[gP ɴ;cMA#e4rq?Y63H󺽖^ @?w_aYcaΎDCHZP uqvN[]KP߰Pe3gI Z-r>$7\zhI*h>}"ɒ[;  YW"̘-kgCRa}}hjy>+̔DM =p2Y=$^- &{dg)"%|ΝE-78]voP:` Mv ϫA=xo0@7S;^z@ho ٺvAA -ZQt,jvXT'n!IQIP_I߶G] CgNx@>XE+7ZN@YFHtP齫)0>x~A-TLv8iVb- X V&Bb Ů9.0v~W]~%Vli$?JR@0iڍ6ŏp!2}9G/0'6^+X yo^S~d-R:[c7:I3)Jw-X ?DL*XGW"x '5{  "^kiAĪx~sEmjx"#Z 𖦡K YYfj-Ќ,A0eQ:63$X47&gۏ q DEϞ H63e=S@1O:WdEO׏ 0p̤  %?-^BoJx ϘygM! :ت *&<jw`-*&01zu]YI͠Rq*d3G٤[5m^[X,JfON^apVl<jwٙIl"12r<<08Ze9l-rY{y{5X꣒pUvwKGZJׅ:S'aBR#;`m7?p/Ȟ # ٸ#‘aԴuI:@wbÿܳ#+#LI-tr<`BNYCʈ,cΗj{V =X ¾qOa~k@ЖR7cB!#o5zC֓7lk6O9M=ٳ.ގd{Wo{!O_OVo|ϘUqit{Qy"WnL3uaY2(1LMajYK&6Nk%f<^tg8.Ƈ7|ǃ!@c==2d{+L w gp ;.vgot?8#2h9.hd>\R[ZK]"UJk9# /17siǙlY?RMܣ1]Ϝ*o -Cq-?D7YHF!2#1Sa|Ҙe+I{? Ɵ"Iu^WX+?jлZ IKn7;'ɭhU^2"ME=+'ש*M5[fYK)tXyI{BHC*EjFPC:KE,&r)sye@C?ۻM:!J"_pP.)KiA)pn4O?~we<| 1lNU37m(YȑY&,M`(d;+hdj -G  8xp"MemYaAr>tq<Ȅ*5PL(F#ȀI9j#Ƈ4A/ hpX=l?ޫPxҔ#EVt$ad` 40knC(uB+gu䉣>uI:)H`O q%n"ac(nԍ]5LjǤM`v$kx4[ܴ]; {VwhpJK~Z3,iг(id;>'KV;=,.FO2%OmG@2谬qwOӰ]LjݔL' a#vV|QH4]FO&ynңGm޴R5Mյ!d^ʳqxoT~qP̥`7l0T] Hx{kf"n}۹jMC) >9;<ۺnp<<ްf~m<-8$< M ɟm2[c[~2Nw&JJh=׿r8-h۷3@JK/%ʳ|6&Up֋;|vk.{+б:(7tDVF<5qsO]q4,md?؎= a۰JlI)~]D":o؋4U)0/=&ӴQ) #e aR& tыTEȚ#-x 3::}{q8or8:q?1M&@cF^vĝV9[( ^*^p2ٕgDVœ)'(Nw  Frsv8ZKuvaQTyS]0k|%KGa130UpG_+3zeOהxv סׂ]P\ڇp:YK u/4 9I]ƒX&bUX5;ܻb{JNj^$#'(b#'WGJ='X˺=ٷ(˲}ꌠQlW8'auWҨLHv͙iݛԣQ?vRpKWRJL l zyd!|.kR!9.#s59=U\{C&JVF@ <]b`حh栳"3U\W%k"st ?}[ ]ނpe?V&h[-,g6f<9G zNZϩ~z@&ej"AFT[Ȗe AeƵV`uJPȼi?(/v3Unp9*߾?" afyf o@tu7KFl2=8=o~)WwWEk&4bﮠ ?*lO4a2z\QtUjr ΈAy4(mo0ДL m:: ~~9j5ᗐ^"Oeͥy%/Xs~|gtҖdңWs@`CuROSW@6#&R Ɋ+$>:spql}b9W6Q؝5E>RuU? =1,7[?!uʞL?nk#s:t/|gy/z􆫵/a;p{Á o(!4ށ7kj(:Í+aKP*p g60Mw ?ZogD?zjcX',;߄+lj+Ԅ+PB \s=PWHiw8PC;m`X9^o"v2v*6~‚6QQ8DCd&;p9^qilf}v36'QM} lE?W3C^ƥae vn .y{^a3.%GP:<䐘SnС088ATP iB$K[ƶʧ.Mg="%;ǑKoxq!g~=-: u\d۽˛y/b]eS7\o䒎 rڬq  Q ԹG,m [eE~m: bᢺV,\Vl.R)ێjj6YqnH/!A.1@_Es$HGx3 4,Yceyh]|@ Ih}Bzc#23gnWDy9B-pIC.mJᜥz8_k|2 ]l(KmuƱ>Z8ahh1( OB2jXKD,:K]]҃ވJwmٷ2(RBK! \>2J=#D)I=q-#E:/tsOH8 /;|&x| C2 (ņB %ε" +(OaA+kc6^O+4 ?n]p{AiG`yf0tzjq"/=JXi:A @^&p%/ Hm.L%c15mlm3WϜ\zW{aw]ݟ^|Y/ܗ7]^}>horöfL\ S^UP#VW|C\a a1fX[ӇC`P2eʓdFHn }a Dj ݾ!I66X LJwd?̱Eó23MAsD,b/;fPp?rgl<Ưls^bT;wq4Cx>e@ 9κ?C-I$3ʀ9d 'zZ2 p< OԕXKSF𼡟G{xm btlc_x.yn;@]vne_nۭ= vGÑnnWnW]veٗ;pM\xkH>h> vx\x[qZx5xW8^}i`CQ"nw4Mw|;P]vne_^݉nkݫomՅnW]vYnߵpҷpuQwG +,t~7OTUv:CUo.v8vcvnW]}i`Ck{qP݃x-n;nw݉p +.˾40݁=[=~~UwÉo{鏿 ۊU3Ky-td ۮ"‹Hx[rêiU +/40ށt"\C N׸V l K0w pUw=o|ov'[R-L/m|tfG[)p///t01V@kjv~-2__ [uq |íT8 ja:|t{6rt+NZ;ۯ BwjhI+T;7SkK H%F&3*m GS8gdvFW㰕5! ū^ d,&I;sn#Brhi4o")ABTlJx{5^jl<lRP%E&$~}E9y"4m÷OD.Fߎ?FYU},U9 x'e(xV`WFRk(M~DT_z®P~ٵ= 1Yخ8<,V3"SQ3aH߈ O,E__@zyǼߐc˾22ՖBΘ{x<` .V9'm{lG3ƬT.P,~Yے_CRu5؍ v=GȜ f(/\tdW?P +FZKa$"{1l=QN!+?5+(a"<5bTtJFL3SGlmun?U*hc܍ B,t؈`ŝߝw.D_R&G!|Xh1;qC3Dٍjj譩?L<|?>zsW߄YԪX+v;<3k-E~!ǂ0GVRygUdlbՕІh]'RO5}:Cpi)]Dl|dba! W_%a@!EXRSYi$Rx@$ZPbKI M0F`FuOj5dZav <-ؖn*s1'L ^H,1aWkZKD5ݛ/@?J-5*ʹij-E 7au.e6Jƕ v(I*oS^@PTNcU{hZ0a?ŽO+ & DuD.=d)&npndnb)֞%ӡ-EEt$={ΰGj鑣IVV"A$Lc=$17 ԁ[ jLFǸvwV)Mw!B.+܌0Zmh^m+,Y"pg> /VҸt. yAj1ʔ2XXku9m>WyQ&Zڻ//8Xb,mA未 k܅).iF°! aZ5)>[Ů.{Yr/n@$ж]3 QkE7@kN Ix{zw+55\9;׋4wʽ "X6g~S/++f ^t6#/饈>[<͛dho^anmAr$MtQ8Jl`bkl {,Rb*F婎J~J!\-KŚmr!Kd`F%Is}B_70=HtSxM#Jo81R³_5 HI_92T4gbS -G`xVǢZ=t`$( u gq4{=mH H rV{J54p ʩbADm~2bQEɼͅ9E#%E#R̻`i(Pu֍1('7(RɌL[O3KS?r45=Ҹ&/1>KDCX|A7HMirlQnIN۫07!C& Ie&1HcU{{]Lr{RNv7ݗۊx))Ot\$ա, t{zr:uXɒb4X3:LvH9h\lD+2gq6ֿrv djJY댃jLL#8(a[5G#N!$՞R aM>c‚r*xXpIۺdeAdB3}-=cP:dAA O8hTPVfIJV I@It`8+>ZRc~KٵE8!JCcwY19Mo(5V~p3Zc]M(fԃG%ES7Gp!yPƺaM0~ TNn3X柄)r̥XXbX3K8\i'@A>EM}=ch|ѐ&|68(Z yCE#{o[.ZdoRDK7[WPъZ;1/Î&VwXh}w;ArW%K)g FI6yAF[͍ Ք eDt @Rs# b憗a ➱'=5o<\kk44@.K:PF]޻9#T/s{//*4Q'!v_Ӈ$VotHS@ҡ_bxew7K>*.8)qkdq,5X3]T";K <])۪n=|3X38]uYs086yȜp^I`rrR I U7ZzƸY -й\ڡ $wc$1vE{:*?n?\\$z<`v03{A`TvTLJe/$p{l\&;/t FDyZ Zы$<;% 7S_W_92T4gbSǫ-ZG`hVǡZcZ.w=a[5GcsN!u$՞R aM>܀c‚r.xXp9I[F3m ?1&A@C t.i@it`8+W.`x+)%?$(!`C%y1^:Uq)5d~psZce9M)@ԃ,G%U;k(bX|c"`au߀IMEƳƼE-)khC *;eu>Ee/?2uͳl:P``Śl:aLشqy#zbnl#KB5n^IP2?Zs0XIy;5|x^NB \axP36lid+jX]QnQYAi>s] {aKSv= $,Jhk CQ&߷\߻eyYw*P]Q4q"EuF=G?w_RĵJ4|$[լ ǿl$J.D[oWnd |ZU36YӃnV=QvpcXb8Ckf8dZCٕ4A*r@u݆@e1y_LtUҝ Lkh {f&9a[-x5~5' 2L'h {f&2N 2y˾ܢ3I5j|\`o6T}g]"Gw%gLC&<6'L|ƧiirSKsTVGXs3H<$oAmi s\|a5 E>:3z;ʪ6Pvf<U*`Y Ś@u}ktL[Z4OeD5ddhOH:,''tً53 xr&x|'DQ>4rp(#5*R;1Qr{?"3j%QLN:ye4vŚs4(U1>Cp؀]{s5Xm | B6#(ʵ=Y/ޢ{o1e__KjKMsO,R"-OX\Fg2XG\ Zے_f>Ț*ŶV*vIBzM',:q}CTy"k&|u%H?z~] ;.ݤgT#.y*kL(p| As|aby\ D-[0@.p XjE,xkR,vm:V1oXvcGq>%ylN/׸ k{9eR2H+"Evɑ̹༆_1M'Aքp|5.g,i؂ A0uasܨ.}2a>Apr޷+@%pϒLg)`)oJ/ X zƗ2^QU22*Y-DApуŹ~u=M$ZTӍy%ܺ[oxh8'rVѵM%m8pΘ5=]2z :+ہ[kۿC()?"Y ,̂p:;9Y$6 P:i%(S-, 6t2(d T?s@fbEDLm\la$ڭ cJiilƼG}Z_`#h!1bhnc`λ@4Ody%?=FQ,Jf:ྤFm3.XdE>O>p>8[%<* JeJxvi[4ZC; R.V׆s`wwN=,bnQXm$y~AXafkHѬadd dGap; U hÉdZ0y?zQ>Q*TU]UX%2-LƜ:]w4iD³hIR…[jӍ|7ܠ)MTYf!o>^ܱiih" PZcx).&4&UI/LSչ9|E? M(*Y ~60 W)7ܐuJ0dbV([䨵UI@KcJP2MVS$ T,8%&0\F[e'mRi <^! ( P5{s3,-g$nGNd-V9.Cx~-(٬tb eVb5`<ʸj 4XLPjj ޲XZxJcSmJ6Ǫm%,¢mM1Y,|>tZŊF%Wzyҏo(M:7]fJlkЧ8D>G(ӊJT>t͙aSNb`ME Yś o*Rweѐ_Y@Lr K8Jq2)CQa9S:!B JMb)_ިrX0}`"IoSf"]TMCcPfۆޛ춠$`>؂a@dIF2"6+rs.7^vGC Eq޸x[^w\%TsC4.vكa9O?HU"Q9[P4p m6lHl(XU^=(q0PM8^ ]K|-:l[Bt;?~|=-+6P %4߉YIѣw<=nf:Z+Ŷ!Q}=EJX)b Оv͠զә'T黢H*+'OчEoXGONliidQP$}/Nk6d_o=1`.9: Pdu uNj.g.CYȭ@ jiUYud;ŏ@Nx?G |n #U |nX_w/s/Wjת]&5f Xan )l(Ckni#Id.|^Wge7 k,R~fM69 $=[q@q"*֓0GuBT\Ґ#Tz3Y'mW"fS)&bE)>h.# USICHi.7׃\#atw&Lf< cq9M]xiA?%b178b:a*H+XvQ)DN :2 t-DN)dy$j B:Spq(6v2 GshHSYMy%p!=Q*Nqv +Uܰċ,w'.xuҵ/5v1;zorA2sKZ ^z'/rL jUKtXr{ }d\`c a0 G#B[:DԳhzi&!*FA{T'J8ýҺm5<{v>,UZ(qg iI6}Ee$^]fj4MQK ]E^ ]VK~-:l[BX,N֒ u[=CltJI5Ux'YF FAg5 Y'VAXX[ ^m4vpg Ӧ˪[m''yb姈e{#͈o4X!N&MnWWb螱6ьIq=>LaXS#˥vW߅d+|#ܢ/@_% Lˮ,+@]v$m!e{?n#?76_778O6Z?E;;Koe!~oS)=bv>* [A'M {VH,ۗK;j=yǕ$OA4O<4~Q剪+gÒO?,\;h.Kf 6 +]X7"z_\W?*sta4g~SȶX %v[>,+MN&DUURgOdho 2Vg[ӏlcus BIFM5c7_Dz:1Hs;[1iQesᤠ'^͑aXEo0 Va `! 7MI`:tOJ`$m29@Mkf8dX\e}cqҚ t A层 bFsf`-*PT -eUԥqw|l)!.겆K{G]džc"]󪊅o= 5uϑgM!g{8t1N["u{B0b0~?<۞ `ec{c!8̦0nݞ `c%c8W0Wn#V0--a>00    [+}a}x] 5a{a>Aۃ1X%;8Se`b { 3;k p(<9@2 c)ÀùÀý0j-- ˹['5C7}8E11q=1qhaH:p`^꺡* ^20 <νǀۓb%`>,eG@a@a@a@aV[Ŏ(|o[\w x+s#L-{b➁m^nOIJ*^8-  ο  ?"zhu{05]:@w 1'0ΎƬ.L7ZX w ڷ'婡e{XZ````t;| 6Au'O7Nq[ '(2hXܺ=/uE_ ù[ŀ` `ܺ=1OYذϘggoIpq=1q`|[FX + .Τ&@[ + {xkzrP6]3>2'PΎ<.{eAj ܺ=1$O36@2HùȀHHHHf5]x7߸°-Cc+rdob2/L.{d>1V[h)g> ndE&d^%y]ȽCȱ{ XPbNPօYmM;Cuփ x8ڷk^PEtߡG8}{0 fp$W{P gGrp$p=0p(Lv7y&\u{Gr92 ' *鐽 @[[\2 + /վ=/u]W\<_-a g'rp"p=0p0|wcO%Ɯ8;KcE0 P[Jv~0000f5]xƺ `ue|ꭥƜ8;|K÷1`1,Xs-,ο,,fos?uE67ɭۃ!Y'fCW܍ɜ 9; hkc/mP놤6.pcK}P ~cNky`21`eV0*~\jj|̢K[2skuM|HjH2FԷ AI36"𰲐%>^GAIQ ^5.x6{%\\ I%6l- URti"g>Z|'IOJ+>|KD4bv)4cygϦh ,Uĺ1c6Cop^+%&[mFy+&>>͚PcR$Ͽ?܅).iZm l~eQjϝ!7_Lc]9m:hko݃#< a!+<זB#`-]-ga$l}˹' FEq)_+C+; K3X}vB%O ^XFn9IBAd.0'YŸ$fWR%Yg(xيm$6@iKxY\gFDg9י(ա#òXݢn>Qw#(14nFFa͐PB3&Xdw@ERs U] y\0LoM?G!hYX }mpV܋ :{i{"`^w7S\R.UUp\NrI4VD9\^s4z_/20fYzJtY@J4kfq=Ҭ;2kH2T [I,H:We̫D{/󂝌횓2Cd v2mix0qʼy"`e^]sRuyyq4<$e^`^Jkyq1i[s/e;kzNgpv0I$k ??ms1)qqfQ6cm.z%-פ2,kl2w?'&g҃(^4aD$l0;$MӫΝt7nt˥?`?.?PD "D>oa CD,L  ۟0=cap=0DX3 aq = !4'dd}bjedɲ*MJZGc[n 2L cXva7Kdlq}S`^C!jErs+pǰ ʮ*\vs 2p.G-ȸkU UwşW AޕCDҥ9!uU4#"y^Ɣ[P;Į"'mmtlGxd"Hߊ0#<5-e,o.@wf`2RΔ/М|qAjL+ױ)?I[9ԫzf~wTW)LjmJ :e8Ƽ ýh̽fy5-k6HS`^p U -k} {r+?y5ex ̋Eyݢ {WK3D_6C$u:KӒ:-l\/@nJnSLHX{OHHq=;ܫUsGUUdUVD&{ߊJrӦf_[EjxJkyBZ?mӆc{epz?p/D/{jNʽs/ p/Ζ 3gKk{qr/WKfܹ gKÅ{eGpD?p/D/R{jNʽ gKÅ{eGpT?p/Dz{羃|vKK=H[{mip}#g{5-k6HS^ծ9):D^܋}hՔ!2p/_^횓rC{a^x[.+;^pp/^ doKd{ڭ {kNʽ{mip/9^2p/^%58X/zjQ7w!7p/^- pOܫ)/Cd^,b3nZ5[=D f_4VD9$[w[kCT P՞heG$hq}-k@]sHKk킉&[)-M%i"-?9čc)~Ňzeg+p=P/D@3hb-g,;^9CCE>URpUp 7gGpn:&Bk Oժ9~+J2qeF+YڦF$}rn6+&rM`_|ؗ/8ؗ]`_ 싃E}5ӯAqtI_Yӵeg28?]||7͇;&rO `|Xv=~kJ 6ad戏kbLЯ_ٱ*.?ЯD"Iܕew_xֆ;DUsG]% !N_;e"V)_ʥ|!_? -9j՜0 `uUH{} +Bt"/.KǏ6/`_M/"`c_WK^s~S7p܋ʎ|^v{ 2p/Gӛw]sbƥfˣ_j>\Os]J6*'Mdj5΂Jzz^rFd^@Jkzq}S/خ9):BRԋB WSZԋ@8Xľבlul|dW՚~eGЯ~q}/W[1R~klЯ{ ιe"`_Z6(b_l}>/`_|m g e"`{e_lP c,`b.L,;^%&68X ZN]L`DnD` |)Ԟ9E;DQ&rڶ3ӫK<&rI _|Wv޽Kk|q&#`v߅/R#֞egkp=0D@+j٠w" =wڼKR"ZGZ#p\KNǏ6p-ZMyp-"`ZfLrc.sǶ "LA#. ӿdY&x~%m?c!c(ِ %{dv 2P2GJr0;10EW0 ;ĕC[x>ܷ}^Kȗ W| 2/qīeRuD/ԉ.լmjD#ɤ 9U3  8XS~8X8Z<8? k LT]}D?L_|Wv>~~jJ ~uὅW*j)xKaǿ‘ɤV}q45\Wv'Kk|qYO]g _$>Aҿn`u^K.?D"¾,'ղA]3 &nd__8-*ɲ@YX],j:-V&UKn%=fkJn=mvYv(~|g3&g)nzώGsL$},Epi6 ifdH!fgQ`bBk /G~ЪLdi&B'>0`X`(Dj&_ $MVu~(QpQP usݕVSSZO:v7nӻﮦw?2tN7T]o$%B'sv"OYhgԴ\j|n 5MqLJ_Jbf985 Fb2EL٫^ dMLı36"4te!{9[K T8 1˿ Q++;ƣf*@ URtd3-'҃+>|KDy~; ;*-UɄ{PF.; Q1 ؕr~#;yw|D0TYxx~#g+l>%*W Uu%SyYxL:PR4]O =9Soy\Z?g JȺ*KPJl!݃ xOHvvY@|]c·k񀿄_,q/`:@ *pӱ\G޼΂ŋ[ZB-7"mA 7k}e-XWap1acߚK$(:$|5= gz2:QTϱU_J(xH:z4lV;,y';iטFxjÅniegG5`i;8 Ej< aƨt0tk\x͋"0O7@*(b-k.'P.D!Z 6UݙZ&@P ̻;'/WorzdQC,D '#aG=>kѱhExha) Soox xsx;3Y ga!'x-l_ki֗jww0Pv#/OE_EA`9~j3l`Xqw`,wY=`<+MSʼn2:@!UTWqLtCYU1x+7 񡐯=wp|X6f>EܦTicUS73#9F/f̍T.NDei^B(v'%r1l7JBˮo?M&a9K`Ao^ +`3ivqֵ,0i $Gq Ο\4`+]ʕV&Xd B@(+GH`$KJ7a@##;VY6BB>IV[B8yqI.[{G  #}h$,Cz@nwVBFY C悩HEll}vy?xp~{[*Axy7/r0іf` x).&4&\ I/MSչ9"3h+/~cGEQ ~V;eKGXBZ3 =zb` \bq*_|\frd (&PIpk-iŐDǟ]-eL2RBVT%:s3̴J4/˴2>M3 &~ex哓XWwaV| м8h '7\qL=Ž?i>rn0= =Uk%ETUXFG'ӏXMΐjӠ.B'z60g\VtAGtu_*?\PTuC^ǑUѼBɨ B Ӧ'7=Q<%kGPƿ]?隍7zGԯbof8S7`ɮY|ruB',sԕekY:F{$olg7a1>wSAkH+cBĆ8O(^c+{&ɄՀ7nzyܔݑx4bȡyk~! gk&te-]LjG.N7D:<H'G{x^IFeC+賰uAnr@;54ᜯvw>=[ mVsY.LrȌo5ݳt䋓MۙNh0z)4sJYSTijjZ,=1zbſ +pdX|4Y, KTCe^;ktEٶ <˴ڕ;'4À% gFp9> 3\a!38553-Yۛ0&j}~xv [-3pa:\&#,VOd).t¢D8V u'0 ӏ%G-1:Z4^8o|#`%C:KҼr.IV4xF>&)\~)&d drq. y rrT%{,I{EH/{SfG{ |oqXܗ6Kص+;P[Nͫ1 Բi"H,sk|Kdq=q~@1v#qe(桱 |BvVCpEm |pNikp_GK,? >I݄F˴d ¢aYF:o\}X'ѝy{X_-wO#WhW0B!QԤS1YA&RP'~}Y{Pu+z 2F71Ÿt{ުn!GX9 )! ӏGnhib/ uB D}X 맔&hKmR}EXVk鹐%"bɕM+hh Ug0W,i*bٴU1H:7H1buO"1gMhYt=}kd#9B.%*5#'8|Iަ=;? r{l$'xt-!!޲rsB귬m=;N ={O6MQ"]qN҇ ] sUGpz<@:ŚHHg =w &@ꝰI<;d: d/d@=HN~!-[M*d }ҳm)lll?l/"23+07V(g)Jciehc)ܙs@b([Y^V-g#nФL< C˿fWS;nč/-9 URti"g>Z˰ D=b{b6܇oɟ]u?UVkZcuuMl+o`}wuY3yHRPg:(iLfEOhZsً53 \ٕ.^AM ΅5Z}(I]l6r6zцp0c I@wdk}w eAIul 9EYi.{f&;v{ kv3DY56qi}EXAxëmr~Z Q1]NPR{P4d @@Ś(?"zh`:بZ㷧4\Ѥ:== P14{[D`Pv4M?Gn({f&Mb|(>5k$UCݓpS|ʗXT7w9PU{XO=C Gi j[F/Qu?O.iH9~U-ەTZ2 4}kfpˠGc#iƚ~vH(5o˹/84Fio஄yԬd`,tw@)F@ ^I` @l$ ` 'kxOA ?D T?ׂ&$!>Kį' iL$E%i;I6GL7 @Xm$3Ixof ,AT&.7d}o: x `p]#f y HV&pv+ޮ-t;lTXo [-aE F= ,6"׼D m6<]l,{FŚbŦ.6+hφRoU{66{ؘΚ(ilhxbY=`iCd [;5` ΃IR)#kfK)\֥KJ]zİ-> ,G0ƤE4 $:m]ޞB\oҌ,'!V?CozKM>< 7oE5Pud7(7`7EyߚJz7yOn:ˈӮd5e,_[&>.>dBa!朞h!=kfx6+MCd(Y\FHR#YhhUX$ @~ZPS׾ ^I``A.fK1P$](|$q^lS da۰q6li2ub*!u> cv6.%yAj1ƣDSdU%2T(Y ܹ YS$]ҌwjöE/k V d,6M Y-ّ,J >xN)E|Fw[)lx Ld`"i~処 YV# &[1Xc:~jUw9I?=gycN&{6$,iPRES&bAWPbL66jU7vHvK0 h.Z\$% ~S%FL^WJGꔡ"^^\_x k=w#XbLxM8FNC?kṾ 2TġQˏ8du7wڦgWzOÏf0TġQ_? y>``Ś;jj TC"CEq+p y<Ś;fܻ3m9T ~<~Ow:_S{~:  ;z+!)Mvh(_3R w,0h =_WyW.}0\c zښa\^a=CpMcEMtx-A"},셥{adQʽc}/ Z!9 $ܛmPG5*qGxAHԈ؛ԩ eMTy[M5>b]Bz u~h{ z)>!Kݨ'^zRjG'v66e ITinߗ۾ 2ˀ//39-_47e{O`jGbp=n3@Uލ={sg<7~CHz>GEc#yb|ڮgV "4ww|XNit\Z LLgQCϽe {':(޾\v4.;Mx޾yY e5>srkG#>u2vE/附nP& ɃW`u :gU!UV y ``Ś4´qt2b6 @,^51XXkfkxnF r'_3nW.H%c \ރ\C*{f&7875 6۠YNxIfbg3G-7TjrS9fK.f{GdX3}'h`j"ǣ4 \EIjF;6ыkk^{ ?ұRV(G<8,@o9 kgF)d0U#D?2Ro^1F#E;xkh*lkj?m\KUPTM'}!J̝S}q<{gRDȢF/@%@kvȡ  }k /%wkosߙǂM񅂩C;M3SpP a;.vzXvIq_jlj9u"8y;t̞3 )_T"8SWۣU#PN'\!4LrLsLr^*2Ϲ|$"q64`y26~<y~f:tA Ӕ$A.dy}5aXC'ֵx⻝8ߝ]ߙg^w /񞖚S)o,Y@3"p~j|8~jXanSd|hx#گOGnA&U9 k Onq$b+c>8bsw|+EbUyy9++7*8;#S8yɳPnFI2ڑe|K ܼmHdWh^3^NZM=w<<ʰmua&(E[O/= :([؝[!);lO.a3] v#b/3;nW+KnQ a]egS0@+gI !,uHO&pF6Q&:yudH4RfڜwmF~m\PwPytAjnjXan'647tze=cX`aFF}v#R;`ʃhD7yCqdy0>䟚iQt  G==qɔG?p40iT#RRҺn##RFW^$5BJ,RY&Sh*; D'ٖɔG w2UO;8p2soHb}B{uG[q(x`9, b^tyU0.<7Go獳o>8*op ƞh]Mw5}pI+ZNm>05*09 ̭7mWOJɝq4/5:O\ioA- ^Wuk;n<_'Ti儖NҒ]~ })= 8.8HӼҰl(ơA*C"x^*UnᎺxʖ=z`B;|8TA3"o%UVp P-ݜ)h@BZ-v:`Z3!&BV뾑QX/@zx䊋<42cbZT7 FPbQ!qzx\9NoX\a$ /kǹn؂lyΥ;\iRlWv|4u@Mځ\čet^oG+%~ᾮ"^y5˫pS4OTݪ{ wn)'Z޻eRp A("ns=;t2mR9wڀNcByc gھ;N6pJˋ<6 ܈_YG!@rp[ȥM`=ۀ3Vo,{a( qTW=*eKo|k(۪ry)h9FTFq=EwVi^̽Y#/'xwSaTND95@^ _+Jd3믄(eVN3F?eTӅE { '̥a(NM M'cv<ٞ$K{)$wSy6F#{Q_()5qw'3{MFɶmjPjtVK|v1͛HNb\ %7ɵ-A!tC `yӯ6PjVnFʭ۸r`^K-T`ޱh77W" 8:qJ0| (Rs+ڀ+D(+07WlK K5/_oSpfr29w`QpTleFl\:ޣpDzUc5x}Pʱ ~(ڤKkd7LdnOPIk *6i}hGC}Hv^Eʊ~/>jisbA-;˭5*6.$ʂ?YzS>IGX$Z1_zXVlWd6+.6[2njDnHw^הopSW<5N|À[mw͍ʵ9PT㺸bנ~PL6+&QIMa$K$)Mw<') 6/jj(?2ˡd_3Th44um!~#/7rl޿Z6o%̈́PYg{gyAlZE{i)~b?VK[W>GSA.}U6qZSiuG邕>|Pe+K։alY(/krFO\/hXOKTT8CG .~{ڶp(h   PG/_]Vz% {S3@'/2x>]1)J}徻G{df}/´v^Ϥc R?? _s6rA ]v;gϥxt IP 6q' & ^'c^(mDÃ"" `d9[NqS4`FDޛ,a> |j|(8k3[qWT">x* e]||NǶޙO=>^ > ^8FI0\n~w—|;CA'Fqy^䊎T&>|K}K/v3gשK?1O{FqTp@`| (U9D X/ܽz?35앲 Ԣ?9_| (8k3[J$g>/u} o (IuI :}2#ew2J|m|I$ӘI}/_8kZ#'>/uO;{sh|;Zdx|Y/*?WE3z|>]=Ȁ20>Eœ^gwKjiZēfi#r".]8kX1)EO{ԥk{Sq}v1ߚ&DR=?=? F$Tm Z?)Ο;߅6q?D}Co R۸vBn OO.\jM~w—u;FӑZ|ۑ5֗7vO a9&Gr|T(. ePa| B\fA*D*@oSX|^sb\( S`4</\x6OVp6/iv0\6-B60r -"-=-⋫9JU<ܱ{ eIQŴ8~ !wpfJ =Ofc{>ө8fP7;o}4q ݻo>KAik3].< + ?s Y6vug叭՞u@p1Jkp.^nuY4x v_ѯfOÿ\,^bNjxՃ 0-XnWv@tjnScᗧ/g-=ƞhtPݞzv猴j/nY>Y`7Uk:P{W{>.h$݊B<uUo&`AljʵsvG&Tޓ d~ϡ.|%)))ɺę=#SVoBcL?dTM4:ĒT^Qs eD0 EXlӵ^ z_A^Ё3?B|Lٌwx }(R\KL.TׁdxӖ^ѵ~/a —,._#zsGj, RTUI;O>;|$[rMNn99ׯ~ VM׀_HB|N~giuO^l+9{RTqyIp7hAp1[!LdU\iU< #}EccP ^ B6Hdf=o6Ys22mϽD5Z +dB' 6Aoz (B:(!ƭgFAo߹ASƠϸ>^ oĢdNK?Yl"fK K[-.E`skF1W5[3p^3@y [}ql-E#VeG:vap&gr mRmeX :ܰ=ܐqJ;!4>p'#Glf,T8M ]=u[AqCBKD |ӘCGEi8s[2-7\Mgc2~[SEǷۆJ7HS ;+<O;;CGӻϷ?'F}~%\iLÄZ5_XS;ȷw/q}]Wmʼ7}ps{}zvaоRmBr7wM5o/Opi!f DhjjӫSǁd~S7xH4 CP }9 el1֦0cMVhu,#X[Bop`n}HGC| gckt>xF&ۧ$A9hlF3Oo Xig,@Z+Q .)jQ&;쨵&YvG{&7GKrnBi1Yjِ@cDpO=lP6/'2::0;;f!NFgtnfgv6X瘃tPaL-dT떰\ظVR:yrO%)CUdOW\Jjl>ɩ`oK*NN\_sXfI=JEdD`A4-#wO>%ePlQjH=ׁԝBIcæu43 ϖ.[z-[>!99@Ui(A#G*U J@xd*Qc`Jw ! Vk_PfɐYHf PfB2v(NlXD!QljE )(R@qKkx"ŃW)ZQ4= e 0): tʧ~`t:/Z6 V$ /(jյGq5(JQ"Z"j5xZ&@6=M:;%JRA!,Q0P)#T*j(Qjx9j٠F=tF$Q24J|15 j(U4ʧ?]Q>j jƨQRQ\QjdsꡋaM'S{Lܞ=snizZ-f[|c-[Zs-5QRptˁpnҴ[U<uK9ꖖkuKMlT8r'[4-ecgXsQniQFuK- SMFX[z[4-e--So u -5juKMlTl8ݢnnҴ[spG-[PnG[ n)Hjr42@ݲi)Cg^@݂u Pxtvց &O# ,:xeKSrO\T.\ZsT.5YrGj9SMFX\mMLŌ %K5xʥ&@6\ r9CsU<5w[SrO\T.\ZsT.5YR pˁ⹹ۚ2K|nrI=Gr7r *m \\OĔ\s5<9K9*kKMlVl9rGxv&gҏ\PrAR K\Z?}ށPhuޒgDZbۋ|cf=n:TN.ܛ` ÕGVt@Gg6&|U8Ҍ%>iI$Ά8u!vR2Vc#u:z/G8=eǩ~Ð}0 B @2Y iMذ#Fm4SSFhlR6^\mlψq@?fW{@9@+U7Y@s:6#p/Up5v¦f,wHꪩv=6k7n-;<eTGW_{?xΒa1&Vjt:a QTHK)'S29{ N5DgySgՋ ;ul)P =MB$'"ߦ#&|z%?Ys:L峾ܘ65\w3HgE;}-F♡v]u!'Uv0YeXs3 jƯ('ӹg?K\{L`8'?./jQT|YzPQ]w~R.:|;=Ro@5h<Ð~0xi> u:D{)7f7NÛ >oWWRDLjVv ZD/:^9i ;D5S oYT9A9Atnlo7{5:Vx)p,pl>D M5*MZAy7ɶy7ws컜lf% kEv^.  L+)H {)PRTRZ̒g`ud:bq lqk`mEsգrr(QH=*.NtaqRq8'eU6Skbo+Ef~+Kd}Y˼0NZ*X8.wSEC0>ׯ,LY?mT:7EIliE%F@׉`{awE[ְUYp_-.Sqͯ21k~Q+X+NpXLo-5}8Dںu:b&(c<_Qŕ +6%M/<]k-5:$^T8,\{1M\>BJKcI'89vt.IW{AwdQ߮OS/_ IlnA8pơMEϕ1M%mB=&W\&u*㍃L$7n^Mk)Kt4 IY)*RRRRd e|+nt*Ld*d*d*d*ASEն =,=#9 9 9 9 2u;Y^Xxj5KtP \F\2222d wN.ZgDX݈HXHXHXHXܛdmpAkˌDBBBƂLN3V6cEABA=b^`=d0d0d0d0@[f3CSAחW7!el]#퀹]Tz%%wr5{}Tg?~֯{J;nDԧ~KkDWNva &= ~ˍ?QZ_ɇ;221  >J{)^O0F1}+A` aF 6Sҫ?0..\]8҅ l5 0Ϭ$tE@ #HV|RJG.p1[Zs L-PQhϽ팶Xv)kd]"+++qre*j.Wul*&67sFbE.eewUO)ػ9yvKdbR:,H\'GF7^'?8.gG;kH 23tH.>̙?|5cϫj5SB̳["8ɟ~Ś\YYPwdc`L r%#(R@ᙶ5 ="njZ a!a뎄urn^ E?O4wϋOy~&f<9NLPy"B:cdɑ:3PzŬl׹# M;D\>:cdɑzA\qVv׳G\b,492\g{[\8+~D\G\G\G\4\8 bge>:cdɑ:a@8|S׹# M Y|}b%zoJ?"###PF" K8|S׹# Mף;D\MM7E\Zq1Xq=q=751q=k}u.B)D\MM7E\Zq1qס8|S׹# Mq:b盚o>:cdɑ:_Y\{q)@ 0=7E\Zq1(q0@zo|S׹# M1#::::e$:1=7E\Zq1(q0@zo|S׹# M1=7E\Zq1p1=7E\Zq1(q0@zo|S׹# M1=7E\Zq1pZ\q)@iqp=7c)z\&GY\ |>"gYhrd[\ |Sqqqq2p0@zo|S׹# M1}7E\Zq1pNA\qiM׳G\b,49N\1q=7c)z\&NJxo5b1q=k}u.B#u_8 b1q=k}u.Bu,.8ߔ~D\G\G\G\L\8 b0q=k}u.B#u?bhq1\Mo>:cdq:a`8ߔ~D\G\G\G\L\8 b0q=k}u.B#u?qp=7`)z\&ljY\ |"gYhrqp=7`)z\&G~|]8 b0q=k}u.Bu,.qM׳G\b,49V\8 BvS3ݏc$jqAdWȎ9Y#sQF'c,fqAdȎYY#sQF+c4bqAdȮ####CpF?"Ev#yȞ>";edɑ!5< "{7{Ȟ>")c&Ѷ' xFP+Mȝ4T ' *&iJv9Br#o  ΀` "{/옧Ȟ>";edɑ!?D~1S=k}Dv.“cC2Adc6"{\'lj쟯/ONo٥"զ8# x "LdOjȞ>";edɑ"{(e"{"W[\mDٹ(# OשڈR=M?####pF3DDڈY#sQF#G마r=b6"{\'G츟lqAdO䠪Ȟ>";edQ"{,e"{"UTDٹ(# OكSDvȞAU1=k}Dv.“#C/oqnqAdO䠪Ȟ>";ed1";B-.Z"~FdGdGdGd$dT=a*"{\'G츂 'rP5AEdZ28WPaDD*ȎȎȎ~9DD9Y#sQF# *ȞA0=k}Dv.“#Dv\A[\9"gEYxrȎ+@ "{"UTDٹ(# OqfqAdOjȞ>";ed ;!?97?C@9[| uIHڐ!ã%e5x,mk* ! ! UE!!߽|~{yWѭH`H^8ѫɑ!5DD[Z:"gEYxrdtDtH1-=k}Dt.“#CwQ--tX2DtDtDtDt>H@@ε '`gDtDtDtDtH@t2%jtH1=k}Dt.“#Ct2ε '^uL{EDZ2_.:"gEYxrdVFQs--4W\ѳGD碌,<92DWFQ,-艬Q5Z8ѫɑ!5SG.эD( ~@:"LDO3>":edɑ!U]&'rF EDZI$ϻ2ey1ix>.,O5Ѩke9Z]m Mqg}]2.mj{$8o7QB-y.QuRdR}ک;<,sBX>\P@ !i< *5^{ԑi"6gނ,-ㅳ AA0@ݍ#:y 'r GDZ2ϼYZ#gEYxrdgނ,-\}sѳGD碌,<92D3oADDY#sQF㙷 K "z"W\}Dѹ(# O [է8#[=\}Dѹ(# O [=\}Dѹ(# O 3o Ѭ'Dv^we˶*ƍҚcg fL~M3f#7"7~hjltV0.П@oO&Cfiۓ,;Mf7>yv۠DB4,f޹HH#" 5lfwVy{Omw6h5m>+WU#" ͻHH w6h5q4<\/&V׃\qu5kbt+SZe_ 0bXřɝ5ٌ>'S{6x#'P@[Y=_3dFy** U7{?w푷&PuƩ7SÔY{ϣf}ޝx_,JCQoEHkơ,)(nZ{ .9YAY~>ر.G6^o`C.Tr4^\{4;9(l4[sϞMdƪ߁TQ s1p[00ZB/[ՍM5c1k[X5KFnz9ލuϾTt9UVSRDВѭ5ypsfqX(l=_\^}ÔP\k.!)`S T3 g DY:QZvfD9ug! }3${$fm&ѐI$0Ivth$`|LL4 DG&$qLL~LL.&DĉEGVDH$H$ ɛn.2&sid^AF&o&9mGL <_՞##g 0~yEw US;횎&x̡4tSp,OxM3͞xG R y?GHGjCBF \_p\Ge۩3Ƿ:]y(¥M.s_sXO*!m%j_h:w>[-ڀ2X}~ˢ_vA)>qHIh}Ōb LFzPh+d`iwppV BBBB=fP9 `IMn6h}8ykhM1)ma ILqOV ZS"S{(?rq#JֈP! $ j4zfG`g"!i!,C.A&~ThOw g՞u`p Rj=YnN Yf_3T4Y<}q=k7DU5;Գ;guuդ1I_"bs/{TvDZOuFtk9CE67T|E/.zRg'&?Cw*}>+2X&k،( 8; z,G 0mDOֲBci4'%AY{Pr"sZUuU7*\5\l -7ntC˹e˵TWQSX/S|[]ٕ g.?\?8[|ɍv (QjݣvDC8q6V&.iӻ7?\Q][p ~6oܰЁ!#W׷.?mTFOTFIlqoЪB9жwyO*N>ej6v*v* {pS\|w7_w?s=Nι+k}~?V >3 `77F?Nv ]٠.2EhE{䤾!R> 'Pe<:UպCc-ZN4肚"/r#5:!s+&Ug_|9zMBaEfF5]2.^v2u4]e5sa}p J?ʐ_ʲڄ{x5!H-3.)Q9Yvx61tyi i/枮]W&o±jp=N~+TWDrm/vAo@fM^i9x/ZЉ1[`_ə3]YҜ9Մ5[EZ׌%-_Ӆ7u3Y(Pd>-K?- r~TS*k {2S  &d[W @Aꤷ%|?{$osdd,57$0%HkNau􍞑uz #go!,0YVAeߟzԏ[-mVK^^%lJ̶hȡfqSԡ ]u^% kUk6 XIM5=5pM29]y1oFb8zwX/֤߯o><ǫҡ~_JvNFЏpkP[,ï$sj=yr,o9\jEXljq@ߠdd:?Ս ݋k}KFaKrc1Ѯؚ hoS62X~fṰuȒ'aSjWٿdoiOh_ 3dg`E㌵d$xݛ)@LuVK:‘Or>:B§@`~t5 ;'O?^՝3K3;~g>{?g???RGv y$ߖ2J%2B,z gy0x<#_W G 7fm(}SFzF6K((9Lv5*jή)%xZ)3}muOuY:_m⪉t `Ix;hJѩ` ch`h:֤X{3c>|=M*)UgI#2DDZdY{[gQNv>Bq6w>ʡ ̢%:Vye0;ċ3FVa5G0]Uj7z}UKKz:+`H[_8n j0`<Ѝ?r&P7vzäkǙ*(f3d~itP~fn/B')Wd-N wGL.7-ztmoCVB7p@ͺ 6"^*m,-/Qel -T+#P};^6ǂtzM?q<׳`p[|+~R[VY\1@ŋ+jkTW=$ԍWAN.ZޮxW UA[)b{$iki W(V1ꔓTk@?ab $NuD:]2ĘX|Aޞ^ޞ?mպ}cR ?#neA躨R(J]+54q.B3=Tö+lh#D厪Cl˄x0A 7W0q K|sFZWWM;P~ۙaU|'H8"0 9hnpCkQD匜o Y~+[ ktF$3iZ풑5g9h{K٪~Ze[NrcR {=G\]D߱~ ^^ݜ^ݲi ga߬crxLxLCCCG.hME׌\l-3uCtdO8RоlL KG'%dq\%>rͶv3L7Bi!7" و\v3 !|Tޠ'^A.mr廰>ew;}?<ˆL~Jj̇bVkT]I)o&m.-,$@9̉;?"DIu:3᷆ߌw#O!Ìjיx Q>eٱC9I݈<`D31{hSX;Is;;o`3@Yx?uG@۹E61@hPKI|Zs# >;O7*\]в$pC!חg\;ZUtk>nUUܯ u1'/?\bE#:uud;}T7$٬Y,w-u)6U۹ͳe>Yv181~3OlȌ6\}tm, v+ڞg/5|)'vܦT=f)m{mߡs!mmBSqbn}~C6]7AmO9;:"ɡ5:cK:HlHlHlG%i$ k@ w N7 p㕲o*,:K2N!/μ4;Tٵ]SϛB5RqufJ|lqS-(]^Xlr꿾ϋˋM8З9cB&}2znBaՕjX!H ! *D~vQ'q5]B"U39LLzle}Z n(&`0@[q쀬N'5K|Ew焬U$;g Œ=_*ǥԨ9vamm7fT o-a}{1DHD!d!qGoJeỳò)U%O<󄯮=fP4#Y*ѹn?]~MG#Ble?#vohJ]:٫p.DƠۻϗW7xAQGjӅzmkvtžS&'`m0]||?rC_Pv5yyw`|5ԩ9i9S;F89<lɆss*o!kgyE&\C\{Kojn3yF:.5L¡&۟[h&"aaN4,G/ Kw[㒧 55OAꃎ*^A)w\D㛋7Cׂ3|9%5^8k 5Q|ƝwE<oTLj 7e֬f[q#*=. b`aOI%G#sNT;^kܼc*ơoߞ~9fh]b.˺м]Q ~.0" 1`GCpI[KWWs's?E' Da}~Lc_bh/O_\Zz=Ѻ@z?fA/q2gll /z*!NEJNoN__53:$fEnЈLC?Νq&zϟ?]{Y}bgwŃ3nv^a{w͇ 5ٍ _vz/6=$퓪O,2=%IJEz3[CuC.A&~ThBOwS g՞u@<<ۍ85PUu: wHꪩvϒ:MY? gYO9^n{١28h݀֍ek~v=J3ZkUWx` bLͺF'v!uI3H dayZ3Ι$|CgEM"J&` BӪz_O`Clw58pi{_|rcQ6 V˹*="vEy#~ɧ~OhNcN q$Z 2 BҠl}A>^^KgR6ڹ-b&`POqX D7eXk+ŚA=bƻ /ڡlPpXQ=y kh23x-" n=_}+W=[r{TiR۸Z6۵MokemkMf;0i onuŝ.zAKBsT,Ծ骆Fn'Ź-:TSg Wf3*Ċy#C,,׵{\:eҤxM[s6)׋-Jf x;pVR-rhU]LxEn/[VZd:.YGdN-xlcG@FvHE*P[BvPɱxB Vlxf6j! 1,M([^R&-(+mr"Qf5,jZc{Ȋąݝ*L}C.}AfoMDP/2&FNt%DtjK"'4blzSL䄚8AUq8n=$ GC ` B5[WjNCߔ5[֗Ėd]S|]A٩ .L`[E#ҧzzntHF @kJt56oãc [^Ǻ0:roF5;~5ᖨ4@߉2)*4ѓƞG"nM E$QlvhJkZďWr]g4<{L'g2ՑSqjnjءp[+X¯eknPHw8e̤ csѸzYʁԯ2񅐳54_;¢miBXK9q͋b+{f&mYSHCHѯ ߕBF~#E|g!| gɚ8x [Brpi#9L ,D014PC+Dq1)0(Q2oQ9wW23l$^[xU8e_[_&{Jn:d m*g ϓE T$V8z@d3^` /ՙͶMĥՂ|{XgUB< Hhǣ FuS}#Eu!1 ˠvBʋ8H9U i\MfT,ܒ$XjJȌKn *AL2l_LȲ~mc 5+:}{y|NZJm ٹ SnB`jLg:x1a{Nm=lftG#ߜf[J[6%~ xCNctY2"ctd$w̮S/6-)R`wi1_H~(2sMkuAF֜Mo{9G:.ԋyVlgSϛdl(Rwl:O?׀jTm# r6%u8#<9Vl[uml5<OG~[O1}A Khg?B^޹!СD:[䣻>5&4PH.2FmqrÅ8j%-{D˂@҃B),PdWOϔ;<9eRZ[Ёa=2->LX7FHoO֜;V f?~ѣ [ ױQS4/30ݡ L5<>vSf_`X;77{Q^AY2зQ0S׼R`]ۻ"gRكUޢEuS&xE[-tS8۷Ҟ:8jRO4=#Y&r)Q0GF:%G޷o,!RSE`iZ>u^_Ct7JFgM)kϞy3~ p'S$5w_FĂ:~_\Egv(' UX€ nؓՌ4X,io?]:N~яV.;b:"ikx³yQA;:gjlF+Mzc0k-ikeޤfEpR>f42꤭8!oD2£7lv z߽D˫P]OU) hAi%$HWG@B{ ڒHUiRIf-RuSɀ-SɀT)si 逭M40tDZGܷ7!SOćv4!0#bM: sX .,׿qmOhд}T;;~ +1u= GTM5vM36knBՌ+ Ioa>h52נ xLr~[Xz<[x5pd ak 4P !P$ŌI3vj*I!5[۔)qmi{nTpϭtu0 q!yLB$2{nuLB8$Z-Z=N``'go/γ- ?o^:d5Q|>g.d/YU##r: L>Xrp$j@W{{VylvCj4E ^}uFH{&4M{E? %F%m[Ggw}#$8b5$K o?ϛ"A(V)vēoޑn^τ ST9:-ۈyIÎ@ }n@ey 30ZBvcy9xD\yÿ(@:V՞Y`c$oR)7 0؟_ kH/ ו0/K_/ mWfnZ@-)؟UV3z/-޽R-Zz>^6ţ{TĵH%R6V +Ke] l2zf:Q\\38rnN7.R00? q#̻ c3E̘oOWږdDxWN2ϣ\WӭIT`G{ߺQ"^ |Bb6i[<0ʡd``7>"oCi3|r_va_Q2!HsM1/6^4>0lD'l̞/:3ڇcZ"#|XȝZ%P}~ t3`c[xgDE Z=Ak,l#@ﱸ)`yǣ?I /O&ҕcP5鿾{@j>yynݯ6IUXrT<۝_VNs\m[e`KwKg5zkrpOn}5/F5qlck؈Gb5'bmQ-Tl{=4tlwiG*z..|8E:~KMS_Šs 5&`FtTM`=` MpcOF8j#t}寏?T_g#LԻFbOeègN3>`*'4XaU\P}'P]|g|C56[Q (hw#~AJDt!R(6d>&Iݖoڍ>Mj9>Cr:ȵN!:~k{=]/):a\ߪQRyĔ T1Ef%@fa]!3F/md#Ȍ6E2yGdzPʣwLrretj@ZPSt|!7:1QWJ%᠂j [ېθ QX#cKN]`-:ouZ/Jt-`{ y ~@ivcB9>M9TMi-: /V bǡoNξ˲vTpvrV_0 ݩjutP(IjB5rN1;*,>\\~ F( wqFkmͫVW~r}l[:(pٔ%{8T7}-ޠaXjf,ʣW i{O*G21Ot nh8b5͏(OkɞȆ=ˡf|hHZ|ܑ6wUb,n\.wMmm7* c5;*&zQy UYŗaM/Wwafɣv.hٙ+7z+#ƕTrJ)H$%U 2`WW/z:fXI\|፮Eja|Sw:7g;`&Dħu t:"lS{UW1u*WVD<ߪj#e R5ɈW58vfנuV@Ժ y>^"z_"Jʆ]XVᬦ;75/\ \yQ)AUa0 M,?ի5tE*Vw/ڙ|n_ilP/Ӯ)7ۚG7l7wYV]G]alVQ-峕Ϊ$mr| y;g͗f)%0i ق'2o2(F8jX|e,jqܹor5.!tX~f > evN6Tj"LL{Q2\j[7 wf<`0Jed *"ŝ,y^[T({بUi?r6M2"I*UW|u;s.171\kqXHA~.{)ޓF| ySE,Y," قU\ :[|_U&M FQMQ Kس.o q/3xeDjo? 0<mudedf_-+2T<0DYWI՟@{>BJ g8]eSo, )@n7/ZN7}f&*SpKo~7m~z#g!7o)2ؾG~(Գ~Y}՞q׵7,x q#CD1q.noPsdM C1Qn0DϦOe dt/x'6lS)# Fm̡uUhon3Njyc;!%ocഠmَl0_wʒR/W"+6WȤK]gyo~"}oTz??_?~݋- -Ia/VabGC{[N ;E_-h[zRn &C7Mjw x [MEi>:ݮzԚI週tbU}}o` pau} L},0r$TPﷻ7+R?~jDZϝBX0ENG;Vȑ<+%9~pt^6OqlؽاXO䶄Zv>4 p=?R?Kf] jOuQ١aʎmH6)zi .m#zzLV_Q!8RWZpnqPkIqImWQX_Vݸurm~o:AAȆNǮ9H~: ɝx܏VCU= d^+\ ZMof^\قB+n_C:F:d"wD#eAE=wEݷ»ZrRM:qIP9Jgyټ:f z ʫg;Npa=AĤKZ>qjqeCkrs#Ї.0?BZm( q(<1%kyZ uazu]fq2ߍ`GByVU"ea?BFb |EBɴ"?2-V0蚳 1ј2dG7kLų[Z=9Uu=g2t/4 lr:, L/s>;!]WX~4Dk$iJG_$fs3wL}r0Ue)fzb{u+w/ S% v \5d2 Ty5Jn{˘ Byw}strZǣܨza@K`,,!l~!ʩG;yhJ,rycGuvn8 Zo,pE_zZjWm#O_qkVk(GitEMwXPqOOm^b -;-dX[omp%AȔˍKݗ26vD+Ai.$UY':uHB9F̣J_G*c )r[~YO ;idJTO9)<8 0d*$kteBI .P^䑦v]FtO1²Y(jqs-RwEV7͐-oC?( \D<K@tjfV\FG78:[:\}>~I*^²Dz,"WǷKS?oy83_ >iR,M˂ӊYʲK:E&SJf|E9ef|I h%_b>N4˝AK z]Ψ,f'WK76[:7 1)z0HOy]#i0Nza:+:ԝNz\6^s_-f_W})=j\._n+Fro =9SpWF%&=lR9=C{O?Qd*r ٧HTg%"9 ڱx=DTtXΉ&t&Dީi]c l.F-5Rukrx:֖w]!p9*vx%Rߕ47yฏ<N`G_D-AEI`}}t,,_} ٤w:pQ$TQtq[pfېv9-XۊMQiR%XqC`œ$߀63Im34=v?ٶز{TuWZWi,w%SOwVܸfU`~JJhGĐ;|]/dut%t'hJޓʦK17Z?ӛ vQ7Nn ӎD녬ɕ| 'v֟b}UO90¬nx8[2J6v ,8[iZ-hkYפMf LQ$h.Eib|~QgM -ox|]˻ j7TuC8q8ϋպ^Hjh{j/ofZUgrb!uК;c7wz3B5tϏQ6${k!LCBe-a:+[<ԝ-\[]kE[̾ [TX{v[<:yj*"<&pd0&}2ƍ1PƖ2E4WF-T)RՒo;#iozʳۺ}t3q':nutO!=dי&QbM6]cR#ZĠ88"'5XYXT(WP=YY=@ljӷFs(NlӵtTv2 ϲȍdu[љWG^m):^3/N졷d<^X^鼏啁y+f( gP>2.9|Иo6my6{wZ2~#>Js,϶}w~io Ƈ7HScb?C{~5 {"8h>醶[[!>VkJ `v{Mb']/b. \Fe5wax7KlvXl~gУSɺabւļiMPR *CW-4ō=rׂlX:ɥ&dv _[ Yj$=cXQ`P]q7j߉Ukxb::N:#:3{ ۯm6[[ƱX՞Y?r,?zQBmW,0:TWG7) IRuBưjLz)mfgKo晈g2,-lH϶Hwl~Bۣ|b͎=~iUE^=jGw=LˇH @bB8A*ͬdJ̔u$F))S9Y0&~7r̀u^C>C{qv6dO)^S4>zdm@L1m?!22[D@#=&:=gP^q}k壕S>;hM卺&کU8pHrS)DZI]EdҊH+""*ojEkEt$v]*"[+""ҊQTD AÀo@Rw>EQAGpW9r:H Et3T-EDo)kN:~:-u [ +PNU~i]*6#s62XP?܁"kn+DPƑ?{FBeQ2ޭ`˓>pW^k I9 ֵG9caT1QwLzw!eg& ]zcŗuI(#]Q5WnSrΣrKr-Lоڮ_ρwRλ@>SFX{gmZ&?_zw>-NQ{{~h͉J6Z&w^$s3W]Ǚ_8[ K3{FJ͊$J-.MSywSx˫yW? Y˲wÓ[hpcE cbߴlBT0,ʈ3 š DB'3e@9x__F$蜃t*h- <tH9zt#>X/.Lsr]~i30WF"|:z[w폻7K2?~yI،J,k.bv 1Pp?LÈǂ МЌL Wd)gl=3Mm<kt+thDxobL.^,kA7_W\T""ob^N_]+k5P__oBH,4xo֜LiKo J]/{꡵*K4. dӢ#`|ʐN!i{b9Gtgd9eөPꄬϗZXIsaKxV;ETtG=ΠsBKſ\,rƊZw1|H8{auFmi5R+XBPX=`#qxqX='Cah_<ʆ {(,$)5:^ o{WuM^f)޵:-wwø:vdM-PhE5T2"Z_Ӻ- C{rh I/䚟ak)&t.1-]t'ҩЫJ䅑. fte1"(Z.cQ=7NܪV#Q Yb#%3VHn 2kBдHe.!srqk5~`3b*;[v|G;zh唨UX+O[c-Wm3ì"цAo̕,ɜ4̬jTZTM Cxdx;we9oƿt~Iտ`2 ?ǔ6ƾ4U^;"9n@giW֨Drw. ;Fԯ|`,U>Dt~sS'ZvM_ɾQqg\=GFu:p|>"B%N0cV> =Ll+Rl.Doǻ>dx=ڮDs w Xqf*N|Dmf 5yR nB4 U`bt\klf/b ؒB#*\a[Ì^̊Kr\obfmN6Soʶgq~2*d* }iAK<رBHGF6u1Ǵ=?p -b#']ۀ[ gb;qf* slb,0ˊnK>lH~)l/7~Y,_7+㣸s#57`n_-/|~ۇ?K+~ҖYBnp-[W޾\, gDUE0|zK%1[_kh/aah6"ahɓ丮@ׂpZt%ÛW!q[r:`Wb*E3ږ rg/7tf*WMPP,z i9uHӓDLjɭWVrbnnXV/*;>)Ʌ2JGzzg:o,5Lnjijnx#9zk>xrk-0-5@\+~}\peMX]SQ7['*KoGV1Ͳcen_@uJ_Ka9DVCH:pk Jğ|=):*F@&V_K*):P%tdF<\]w}Cy@tY_(lӚȩfUnl}6B?e ]L.(V?l\zj6W%@# |I!eбiFG9gQGm&Al lg:.ںӦBOS5F.VBϴutmr?}VªjPٶjcǷeBuĨ }WzG-Ϸ=U#UixrFI Q~p`u>;D #75wma`ŀk P c,_+ۮm*8#u]I ¯?׶H,D:J~˕ME.{9&h#Gb& *sf5)f頀]~xEc,K`?QpY_6=:^,f\)f=]KkX>[=h'K5b6)z(u nW }ީSMt<ʖR^j9M3 71:>CS<䎭3ke[Lw)nff=\Œ}v;]DE X5}#"~"y+ (IU6t@hzèH*sC_[)kjUKiPjcJC`5mdj`4 c*im#+i'}`g2i"+~qOd۫2i祗GQL]¹>[&qS-n>Deiڷa(Eu!eS{==\Q#Zi3+b$28M6VT/xݟu7][y~5,"%.^~@ux;gPwV-鉃:\ N'(\*Jnܫ j.UK6n %w&ҵÈW0oX3IGOx-ŵKUOz=^K!ٲgwV笗hv}-;Or57VWF|1W_ %;&,q6KY}ak)ۀoQf V1C|~=Hٲ|.E&4 ϧ'W4 +z{/@FفXZrqibVh'X" !ԳaD¸sȎ o&&g88NɸCKm'qCO҈ {M wB/\0iĘײ9-}؊cK&Zk;idq;sĶi e6ib9xq]x/w97uqv-зxv祉&xw7榟o}? 4 !'twRX|b1ʼnZ$q>QA} B7w UT#hNd܍00p-0&a*`?01}w` pQ,{2|5]lִ}pXm|Ev 偰ǟ\ġm_ =;7 Bp'0uky.] z^}7 iȢ$Ei z1Y nG^biI:X/^juRW@ %7R; R4Ni>KK- aԢM.x"[0\6Zel.5/M>@6p"\jfR 4€0䅆a+[Ğ% 4 w'nM(:9@6+DArY{" 5pH.LLS@a9&',u!Z-aqH3,?б(3XɂÁX:Vw(e.zP!V_@V >=I:\DY!!ga`I0.cSX Q +c~7ܯ0 AG͑׀}h8;PJK=`1b= q`KYIC<8A%s2Xh`zV v8 (y;65}7aV {/]21q)&\A2f k 4Ia ՆY!V h90E`%#̡ ;H| ;u9a[RȔIaZQ+bLaƆ =L ,]?3cya1u:ƻlKݔ~8ID`vLqİl@5m/v#~ tyÈa9BW`ՄY C:ie .q` ċ,ذ&}>$ǰ#_m +'t E }W >Ǣ"S?`m&*!va&zQ0@Lf ma5xX`R"cAdôp|!x(2;XW&{4 آ!V`X{+c5V]uƣa՚ |hG7-&gEpP}/|\GrA`S),SPmXt1,+;cF ?bW6THsE (BD6a=,?\<:xVp]œ8"`,ip5@Ln;rLxCc1t4'DžvO8$L 4!ZpAF >7, ûr|&/C4^|ura'1>Rs!l6]2]BƬB"1$N=+Ff} YWkx8C}R 1&N.2&b01,ԁ`]J-thE1J5ʰ۰fP!%0S0nC崀=mFb +u20.Ƀ< b(dVhzXB0;r6n1x|3e68xCheE3XcfU̗v"./ SH6!t!4 D`XD;p36"2}h8zbKN  M|fk@:4jt* E d3Q6O<(zZ׋`c."r6 MlF6- ƈaC'a$0(`g)ÏXo38tfG @3;% !AD#Ԅ{ͣKӃt2GoAnciۘNfHAd@| &$c^9Q{N=ZaATAم`OehfE `} $ONa%do]9kY0&|_E j ,Mؼ2XBOšM ߡ\f!3ifJ31~ߍ+Zck3 U(NS]?a]SltsQƯg}$$kWtz2^\iz/O4ݹ:_ܮYnt߿qj:O,[:|2M17}W'W7TD]Q\4|˛w,Ì-=]ɇ~K[MkK<"0ǻkAi3>0 "T` :u'"( #\/b ._..YLI`߱"އftfjeJ`K}mc7,ɧ$On0c*qC񕕁>dS0ұ{7!d߸BݳEWhʄt}9@MaRWm9`%.#ӤCd4)?(lѐȿŞLyI;?e'ce'ceE>2BP8BP{r1FPCn8}nxXᶾJU< > ؍N`ƌ"1bJ!}q ;aadiDZXԡmͩ'zǍ0/'C@a!y A$)&1b "DJ|Z1!J(򸼘$($cs!&X͂mF (d/ *E%E!}4^X 9ɹ0-i8#gY$1'f˩ (mKY4sZz  &% }(GxlRJč0x{cxiš= @Y^B;$=vI/.FgSǵ!f< e E"/JLF 2͆˜BNePF sKxbȞxILF[|ˊ aXAA+PF@)$ RrÍB,3LL-WXT4Ja-K4iZ>>M.J(o9*-8Ȣ@)1,,PX 8 =9J1A\4R <KX1 3AA2傛#̱RJESA[j,gLF!,qcӁ1ĭ,R0"qH/fǂQ#%@t'] 2.) GF,:c !tD2T+!P Ȃ'.aXH8C<0n#nۄ:;71 ! #En-ʟ8#(f) Ǐ`dxxOJyqĥYX!M- 58?$H_ k!)2&2lR1IgXV"X j7`(g%|`Av黾i^4=X=% =[X 8%@a%Fd Q0e`RהVeQ|Ӆ$a6`P!YԌ`ICaAjzc Qx!ރKYXy$I|zITe$4:LdpmI`[p2c4Rhf0m9dh:>o#~e 4,4 "  xf6܋R&-BMQiA f0CK 1&`C%, ?4N}Vtq !ud'2H! Ҍ60f$Q: >Mܣt2 &p%F-@Zfc3*>D(x7!BA:JXR(/EX ǐ$7|Hn$D b4Y,+,{ A!xb ~Aav\/ J'pHX J3oP2+RD>'o,'>y8ɛw3anb: c>\!TRΕL3F@­H^(DG).`YᆹCSJRUS ȅ "p,S.2\ϔ eÁcSY% ++r>BaƷ0r?F ?[ jvX1<7lpو@ ()ÄL\xD xa!<…ChaB~0ld-Su+A)07LaKFb K k /j#DЅ aH# a.!>)B!& c(t"b XӸ,3C?1zXrĄŎqn\J68O ܅x4R)Y0Z .1`0Y™hJNǎaŞ CSP& wЃj0#\YX)"܉dU'Љ``Ms'؄Q&.!HՄZ88}tsϊ۰HSN`qߠ.5gZ 5X-.DeP9I@8ufw( B{$D(SٌJ0Hq/8.$KhE!| c+b)ul]I}EL?rһU|=":LEs?pihv8`0Ȍep ##xЕ, J!O%|ۗHsI_(o!XI)ZfnN(%TIx`=x{Du,‡)(Ijߛ0( L2!`~)lC]&$MAg 2GRXFFzWP }s7\y ''1m2XyYjn(œM>(yקſfJ{'0mR>b%kwiyh/UNzq4cTчzV>Un~D;ydYR\<>Jٔ,BEmNg,+0 JXePCdISfdi \92KC4g&}-gAV lBBuS Y"2a=d+@ӿwn&rX$\"D4H; 3EѣDS:if1g>+XrL@ kVks VdREM^0% @-d5`唩A e~h5fn'kiyLDĄ 7pzC&5I*6ȹITJԕyyE4S:r 7ƌS E}` zס 2-=̣O IZfݧy%vSgQKNȕ j{̧ϡ44#Ԥ|8DKA5wSɉ._nMS ]AX~jѼ!"TEWM!I_; iM.5Ѐn}3L"JN9(r&9B Za&ɱShXBRݣg[čTRnH,OK4<++DL<L"Zݎۑ]?TgIayՑrIrфR %iiR3=h4jF@M#i5@#h4FP4jF@M#i5@#h4׎U<vx%1?쬠4FP4jF@M#i5@#h4FP4jF@M#i5@#h4FP4jF@M#i5@#h4FP4jF@M#i5@#  wGPWa{:RmgTihХi5@#h4FP4jF@M#i5@#h4FP4jW%_>|%4'6`[F0 ͉M#֦@sbkFA9i М4QhNlm(4'6`[F0 ͉M#֦qbv}r_$;+n48E{j#G9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qB9qY!,wV0yu ~7\;YxȦhN)͉7@s"5LHN-+qܦ_:}[nk;K4CH\j-',\(mΒ#7 'i ТV~æG*ݭ% Fn*'kj&smho{sk]QM#8S9'nmN,H֡C!QJJ+h^% FnAN/ DyL<1"'nOA9Ӝ "ʪ*Zݪa9q&ոˤhcq+4!oyrmlʪ'zNկTUY`Gks3HM39^ZUݝbxEnUթ9|pmlcqeV\du'Nē>> ɉ3?v<.gf/ G[X -kW N|wksEC{N"56ipZa!flD'ooA{T roڧP𐇑kAmǑ8 Y CH+89vn2sXjO`;vb'tɅ;#lCZBʼnF{qD lD_N)HXdv`̲m`CqLܓ? 6ն -nEVs?#}9!8qo: 8~[z؇R'#?R;5'!8fzhF绾Y[dA@s="J3|LďIT&{ZΑ,  &iל\xI[; NvhkGsb#bXܪEBj#=Cf9>?: N3Ĭ1kB·^<)UpE,Y2ﳶ^2C't-'wOֲ+ oiN[JjR'u:v"q*d%9P  fA#8ON͍lr+qC7LSchn6+AϦ/'MxflKza Jyzm @M#x7L%D 5ljN4ÉYkKsbyaݯ.N4ƉEkK2/HKryǯc 4ʉEkKJDe9Awˑ} 4ΉY%sDb;AߦCc8~ ? ̀)gi xpXmY^Rm OI 9"-fp;^K8X מvg9k2{9͵D{tHYw?C'=qj;8rl/Mx*Pd@p븉#h0d{$'`Oyg-kttmvO+= =Ed>>֊I 0|+vNN :ќ,{9T3Pő+#'9}+I q*{AX?8N島;[=\ءr5<ʟ#JeY>8.ݛjE|ڔGR]uבY`ڼ ur!)ggo2Ջ }z03n8T{mٿYWA`>vm% L3ԀS)5 [>QÅ8\)q =èE@WJ℧S>0NA+bqQ@maxVw޻7cJoqW[N$iO9(١E5IwXCDv$XXXXϩƋ9]?܄ǖd DO_Bgw059 GɌ"Lf)t҇&:m<]DbB۩x 9ϵ1HV-ڮMګLiw0d3jJ03s)9gIe83Lڳ)d#?2+6|>Ęͧ02M 斱:'l'-ԩp Z1.b :w]aQEcٝ5Y4`T).)6Kw2 > B5m`&TmX`b6)#SeӘLjC:>e3x"[:ɜ|2 #Ӟ˜Y Sՙ--c͙ t1mDWX`MiM1avϞ̂Q3)/}PQ"D D (@A "@P"D D (@A "@P"D D (@A "@P"D D (@A "@P"D D (@A "@P"D D (@A "@P"D D (@A "@P"D D (@A » p D('PA?&"~ @MD@5j""DDPA?&"~ @MD@5j""DDPA?&"~ @MD@5j""DDPA?&"~ @MD@5j""DDPA?&"~ @MD@5j""DDPA?0M5ma 4 }kp ֆ릥2^mAYM-U[N5q ]Q!Bv6݁Wz!5DTèi4-)jP+txf2^mAU?Cu:{:+ʡƻBk- 6ɕ:whoHYJm«_z!5DT]vvNwoưx'2^mAyWa5$GV6-n "h"ժ+6WMh92^mAM<\ t[j"D?LSVK^h\}KgD{qyjb и< 5^h\}B/4.OA>CMl'q& @иP[ hg-B4j"!+kq/dи'k93-2g+J&BKdYڪAe {qy$XTFTFIVd6_rfVƽи<ZT,hBd9MT_Yy {qy$XC:9M}ټ^m]SGC^h\I-*Zhϔj.xW*MNv}׉8Lи'@R&M\&JR=;F,dq/4.OK-MxYMbh^N"ϰƽи<>8mF&Rһ4 hgv9&}؝B4gPzqى`/?~"]R#hl=b=^GCͯWjqvKc,SP]̑)jb|ƽи<,'HsbJfjb\B2ܧ}Vj96W`hMEP-\-=Pr'vGshrΩS2RLehуÕAUTJ/=}jgMJcfU]^9&jʐ!j" >5-MMul#*tnZ*Ĩ$26Wj|e6qe5qj|jOyY6j4zCRLpM&Ve@md3u4}DÜp2jCߊ>J)B(&E0qBQ&.^R OlO-Ǡ̰a c y0ML E>#yWvU"`c%g,d:Dn3 VS#{+ 1=4FиDbgmLx:3M3c>Z:N4FW h4 kĤ'{45zA PՌ=k~tq/4.OAC-jC[46Ah{Ȍ.NP3"!m @XĴ,as2fɽZIs:՘2M-B4֢5L6Nػe~FuebNi @XĴ#z;Io4 hEkb\vnd01'3V}`k'qOGRzP/qB'8diwQB4}jbRWe G8vN~u){qy!41)ਰ~M4͘cN4q/4.OA>9&FepTX?[ƽи<>!`<DB9?ƽи ~_Cᜟ {Ikc]r?S~(Ft[z@皗XՇ#cjLT}p4ܭelpd@ȱ>'M`QoS3'?{'_ c(?Y?C UpQ棝+]^nKk+#ѳw,bZRpOMGhf#38yut\$eA%9w'9Y"w EzgKMK~82s~d4r4dh44q?yե ,@P85 NMN"ywdP$'-g6gĽdU^nKy7;/Cc8! D,y9?E<"J/{M%DT؜>7cڦ dN **1,mʠ^tv.+,4yήҾ 9?\/y.&Wbpk/  yL < N'Z* 檭tQ2i"Jn]d Zz@t-uZ*Eu͋G4 h=QxnJ2^ xHcPs\c:UM^Mݕe/@51-vU 7<+M,'PA?&"~ @MD@5j""DDPA?&"~ @MD@5j""DDPA?&"~ @MD@5j""DD(seB^{2^mA%Z)/n "(D8ӢӕXj"Dۚ8gɨphVz!5ݖg@I5QI28Q)]ĞӠX*"rpɓD)CZ>_.DAvv֔ﺲ{!5D D (@A "@P"D D (@A "@P"D D (@A "@P"D D (@A "@P"D D (@A "@P"D D (@A "@P"D D (@A "h Ş2զb"LM`DhcE]E\je?~ Tre.tuɕr,?p溡TCnL? *"_9-Y|x{C^<ֳ[-s{$:4Õ,m gdzџo\dۧ_Os=vvs9'7yO5%k}{WA:ʕOfTW~u]3Bu0nxe+]ݘbZ 뛐VTrJfVd9+@3L\^6ܖ7,Hً^Z׾3gX2Eo}XjUu@V^ Sµy[/شi\F|ۢ~ڧ䜄7Mt qBpq='TÖ z[p $+]$+Y[>|Bs@K =_[/R7/z:hm38[6f}{'!&sg* yBf?*;'X@֡c#jNM|u"5n7c|\J>Ѵi^}aU?\3bAͶCEͺs ~NX7|ybeŌ߈e73ch hn4nFPnT4 ޻՗LKfZ&dauC*Mlb yјr(;C(t$S=o!$Z^A{w{lw;EN2[myS VZ;fyvAn"ԕV=§#+еYA|>pp8c\P1ڡkW]a]8v9,mw`2ԝ^,YHӌQ*=RH/WyM.w}p:U0tS 5X3a U1Z±s'1fI>#|>{O~l/Rթ_cg9+hs<3Dkjb:3-[U'DcfNż$׎.HQtZ=SSWD6& U'_L:ɢL?xGJtud[,c&ϠDs?*@[^ҍ"s3ub>Ak{_gnoGi-tpNS S"6 +S#ʬJOojVBl8bYdZA,׮I\AGՕOg[`mYvTuʏ:}+]rN'#E}H/ R6 +8%ڬ9ϩ3?қ،'f>KߨvZ~u[[B~Z[i׵lW3+Mg *S 4ųTMF}@>(@ εIrt] @ `FUvX*4nNXGīw'^{ܒKX~1 >5#Sc3! jqZITmjч,9%o`i"Q -5e~`yþ]C,EhU ٤~| j: [ouc[: 봪)91b_cLn=?Ο4ЖC#`IWS\8YLU=xVkYMOkd8҆>E ( U:8{+mX po߻qTGagT0N%tʄrE*zY%ȰsZh?w98ϋ۟Xy" g[d>Eo1^ WO^Yʧf.뱡61wAAң/]>l:Z.,T?-wgGPDWTwEyuWDWw岅]3b#[67uh'ScT2R僓ՙ[3PO|Y( {EU2b+P?Wg" /-_n Zmk[ÞKy `J5IUX'wNLQ+V**!}6KǍ5PSy; VcH= -gL|qvfqnOuSNmGb׮(1u`,:Os-za,>ɻ\_:[ؒmS9ASޖ)RS)GSM9r[ؔZ֔ov~IiѶwOc׌ěHz:#03ԔLLѲS&.x%IKZbv6fɭd'jherUYIXRdyDQTird49M<{}uuL|~["ZF$~LpN1Jڒ˟g6]HCRD*;zWw>㝦>̩m,cюAz>yN^*;Bg% M!sk RL;nPtm*e yiKB[Hɲ('NqD9*Hӌ(ɍmm_$TA[x*7F2l:MHݯ6K6! &*1^ly̽YNie;ZS}8tlӱnN& yBC,7d-f=/JѪrv*;mp$ZwPk-`@y)b@%1ʝy@ix![8C1^KH.5"Kͽ)$.%*O+斐_^0y.:L!3m2SN '3UЯ\$犞{lHm*Ȟ=xaZ"=%MM!P`J:a|UĘvN-z3czp>OOdKO񨩅QR}ڸ*~_|]]g{٣0~:g G[ ־} OF!~j@|{~Nh 1t@ [B|t[]ӲU|s|Y% ^a!{X:-  qHjho;K3q zӞﲈ:9IoltOeN􌠬x4F#b\!N}cc_SZlUϙ e) BKR4W 6;۽,b[ &e|x\>!~.l n7TKn+2męm팮 aP܃Zɫ^b%(|6/ -63jwy? ynF¢dK"\tb~Un9rnܞ>%o4q],o=0& fxc¢ {8-ņK(1S o/Z5-=zk*;u{W$&7t} .]VƤ1iDcBZȬ.22ވBnaP[E]&.Ʋ4vZ~ 6 U9i +J/q G^8)J/)gu C0 *OvV±H/#Me㴲7|R"7FsrY^]' rC f.ȒX4KhIz:N6LSⴿ8ѼfQ|4nsH^h3#$yrp rc9sL-slɃP̂ːGKSd! _5fm>ُW6 5&p[k߇Ly6K%_!4.DBR!! xƤ!7͑,0eVlA\0w.aA\*:Xfpv8 <%*q/Y' u{߱yC\D;YMTBHM;{y!'ęY8 /jnH#6ZܾF7Q>G}qLhڄ 5:B2FZI{5qIl_@ٙ$|d4` .ɂH)-ugw1QKjsi0z aft\|i¸@@ssJv[y_b9^}̑S.#wgI:1IU;ۮb^JSF\*vһ9)0\Bant \+n3`Svmb{kuɈ?mBQ:Y@-{j;-{gL, jDq~C9Ԅ) i-h&}}ϫXן[%gM)Uann/C61_:Mn;!^`t| WƗ x{Ύl֎5*gբdȍe#vƅWrc8<#ԧs:h_wg}j^utd {?Q4hh5r++*BqȾt?*Tqa1-pW12!&t%dii*M~M([i>[z|}ldgt]{lW͈lWMv]Bb#hxt@a*Skajyϭ7~pnE~m 1퐄 txrPqZ˻ B#=0{Pt\jl9U%ۄOn]©Zkr^)@9<K0KuYCZ7qՐtOc+J p=(gtb7d@|(z g,o;3K/tۛˁ;ʦT(ӱ4|p^“XQM^!j\xjCJ3И44&Es3ˆ]L;M`/䱬SkڬcKS~N.T0CqniPǺ 0pxCfdUs%xril 3 X+LРNJw0\1[ó);|?yGzoyo/wKE׉d5)kTIJ62b`0j@ BLヌhҞS5Y}= gi3ۊƬ1@0N" 3萅i0bYi01UFiW @0Jӏ@ES?Κ6mC ^h=krU).ǂ[V_-#-6QF`tE&g۪Oq~:udrVHn8Ҁr ӥ ja+kŶg^JNסхTicaZ;3;k#3,Y tI65^L"J#/de:~@_5eES]3FzfH< i;]ۭ:%̴nHh΀b0]F?,ى6BRaoX{;E^G!pnW :.ySD4T83j,{x(ydFJwS#_y߾lv־yfL˯\|B=Q_j'W 駆 c08+\c5F5Fu7 H9x^ }޲d<6KwAMxEKKM:M.=v 9K͘/,6IΫ/9v`$ھ&=־k=;Kc?^H#pl}<('/6eP\sX<\7m֞{c Rÿ< |%f6K8ImmCk,f831U*\<ʰCo?gIKۄt%BT.- h.|dPbB 뻙#\٬Ar+&'Fow 2 ] GƧVHtt DASĻ=zr?2iǍv;wq; ['1(_ 5BNӬ4sG,#$9k$g894:^:7CRX]4;uKm"~?XeV8qricU56g@Wŀ"di=U]C}1 #7, 0\cv9 v78qM_>ǛGUkx7yxdd{9;C\%srnM7f2$/ՊQsLsw+f"ўT1|Mo,|x lɈ&3Hnɠ*3VnW N5 Y۱E")=N.XPT"Sęˆ&H=~]Z͞GAm>8GksΓ##%k/n[9cݟh7czq_CÅHz)+MvHY.T^0?y;l>SƶgPDp=O{?W$>byɷ7֯ie4wB@*7Yӱ4+Qm9K%l/vj۾x̖[k4mwn)j"ELV%e `./HeYfc#Oj@q̹aͩ[vr.'{~И54fnKO Ӣ=@Cho`zj0|#f^3Ez#"ucRvАdMe|zq~սoZI.׳meu8&My_Ln)1i*.r&+|$`Copp$0kFD8j}Y:4z/2̚dɣYSO!kb1#pHXVFӨڍ7tgچvLΎD9ęEi{Y#ܚdԂg2wK]C{7@iCЄʚ[b*e5AU*MI_7i빴 H[Zǽ1br؇Ɣk~BYl/%HidMˬ3͜UILY j.M~o=H(,&qh$o a·7 $DDm*m`$0@ 3[1s&Po+ͨriX_77j)͚fsoᎳ6dU:}>o@F B*(Nȧ>Z#x45{ˑCB\,vRúxnQcjJlw,$9~M =ڹY܈̪ VHҞm֧R a`p| )7c>%VL$$;9Bg{Vh"f=㢶}I^.YbDbEP}H CFc 1™K#1Ry\#g7bfı#J>5R!~xpED]N[zj:1Tm<{əN I?2TEX}3]7谭CKj/Gn*M"K[r #\nL {Ф={xm{EK]+pfjtD^o0>lQRK]n}|Lo;ti&߶lFF1R7ՠblя17/޸g1/c=˃udY^>󽺜ۤÊ6AKB+ddCƔE x@ۖ~!& Ah9Њ.cG 4a6q+r p޾ Vu$DzZu2KI{'='=±,5EZ>`-mد\7x v;U:eآ͂%Glfn/ uujԬqIe6 U0W;CTUo aF|Uw4~�هw"6M= 3n]馌XgX/Ͼ UB 6 Ց>Z MA_mUS|p?_Nl].6u,>Dz%8{=d]$s7'@ٻPJC *WBuβyҙ g_`Geze~k@ʅ_qu 'X2m:#E2,T<8 u:\$p(PpNp6iQD e,=A$葐b:PKϛå~-]\x2L^CԸߤ=ɺkb2_8>4}f5]Hh{ڞiw JSm`I?a>vpTtKͺnf⦄T:=EC&cş#$||d OJy^Y w~.ej*#Xtp 8Et|nwژ*]%%e|P.x hĒIք=N@D˟E-)5?УG:h9<,׼_yvy^Z͞x)TtK5*)%?F9Aź&abOIp9cg6Yu` vj< 6U3^4Kٞ#_FLrc p'c|u|yAjhOc3aύm ڕouAMHuHu [L@ ؏ fG:S-i,hA,륄㔬J}6ieNq''\ E*{&ӋWa.,Hhf4#5)1(!4TCyL 5M#hFk7jJom!ߦ9Dׄ+:xGAì{nm1Hx Cm q^|8K'/I4Ujhc,3_ Xf7R5#byZidopPm&$T{MKFxZC8 kT\lYxTqlFR"'TA7OʌXN)AHs$ zQb_9N(xݫ6fBiWeGCˬ"x3y`VeM5(opt!ʶ%W>O_?rûKrK$N3,<&h Ɠ~Xa,|Zgj7CbY{|DTv``.?KR>⇷` "ɷ-PC 76$2ŞA:>.jTt(c]Gc'#&hE 1=SK1>[ͻx<;?6(iz M% oLC:S DLX+ͰDIF-m̎~I[{M#oFَ-i@1fxc9Lp%>ia<+*ؐ'Sv ZPи܍Z/˅',}W372SCU޻n }cynfց.=8tY&o@="+s]f,<~wpF_lDj=4xh|L;K* |J{"탏80gX3Y u/9Op{;<[Xm!m|鴬ʨ6VT>1DLw>M@d/7 ߲؋wo2Љ`?}9o~gg.#BNZɠoO߽ye֭ˎv[c0.-MC#߿}z{O_.p3V^ _dq%ZjGo?1+ϵj&A~,V~Ϧꁥʟzȶv {B`3Z5 v&pNt&;afJ۹IN qJLi)Zbj6ƥYYm/Q/ -1:*`4= ٙ0`F=Kɟ`f'̂aݹֻb֝d9ȏź`f]d54魘%v4hG4 ʳ3|-1:ĩVԪƪ\!Oݪ/VAyvVÇ˳Ț誷S>|4Fst:,M+F6sD|>J--:Zr-zc,߿Vl8chsH ʳo?vyVIʤ5I' n~\.7{Fk۝z֜c AG[>o+뻵U9}:ޘ˥Ԛe9v1,e S~s[s%:[I}uܸ3t稕+$hC$h,xgwEccRlyWo#ѳ3G'ȑxs}bL7Gh4qgjF'ɩQfy;,:H![tn6E6yWt,<[PײqGs#1̨+0QuZU&詬OpU' 7_2 m9l"M?8r!_nMBrN&&KhZ\+ye-kP^ڱh>r0YHeIk(|֕Sp۟?O WyvQ'<-'"ܞR&NH8!tx(yrx=yTOYm(l}d O>\ Ti՟V[wLq~}~+H 2S.H*4 h896SFg$HJ.PY[&<,u\z+ףF׮n̛,} gf$ߵpN^L]v1C5)2(q[(0 2yu+0oo߂CϢӟ:9AX5.|2o9΀ ^subԧ0L&S}F`P_>=Culr-t;VxKw,6dyM,3A`vp*DRIU%VmtYyQ c˕Jq x݀utzEk+3d/fF2W{ CzD;U*4(Ym 0$cI4 Yzgb k3㩖]2/kwpFnV7dnlu$q~Ʃ;lee25Z~Jj岯ahSm8bΧ7޽o?_~U3Psf߂@- ^ŻRߗ|Cz( =bu`D%2bwZev1 ?&K'tL,C V^ olFķIzd^Ox^;DziU&9OhϿrB CewuIL\hyM/SpuĨ-fm !W#ˣoN_'/CڷP٘-VfVlk3WwohȊy8*k@,߆159x[`mYv@ӧ>l|1@oRGg\(\{Bq)GKq溳AXDw33G"mJm;z7@&>'}e.LcI4 j4..om'dA516v}KlNCy׸9GLRg&vB}/Fn˻W6^OK >?Lo+ʋ;ksX9,mDZ8d-nnF;dh䮩 a`'4Q?@?JDPyhĒp+W;lTc~> Ͽru{몬x214߱QgQ[ D\ޭ@@ѵsg/jPFB\5j#2D\ -\eu.ɵmGC!˗\r彤ecUe8ҔP, $=WrQ,pW 19-%nXv@>?jXTN LQlO?1sUe#*|y.-o3pDje/Y#py7 Phܴf/H~AZj; )zTSQgQ[qo/~HYKB)27$;Dn%\;ycn쑔ڞ_AgwR=و|Jf˲ڷ2گLmӺN9j^Sۙ^U!􈗉:1!PpB8 no9.`XPx^kv ݕSTc6Wlāt%P$&GFlwS|M:d{VB? br* ?ĈapBݢYZDc#e{MΖ7?Xϝ%,s$Dfd.3uz6&;ŠUXB+/`Q:1DtH|z!F>UAC޿pyfjӰ{R<#n೦>EG)q>j[9i+Kۣ*r(:BKe톼A.liZLhq1: eNaᙈ:V!aĵC3=.iߏ{'BY{+gdZ}:^ĉX3yYN@[/cFFKlFlK3ӑ:QE q6WdI|Ӵ͠]py(yĄ煂쉓m^M~֔Lv)^SdyRi7}&y5K yQ$z#t8U=!Qz # *ڝEu%o}ꇩ}oW; =sWSLXz_IYR5kgEe0!ɃR"kRHEODWӡgbeO vUꦛkAxx?m?~Ahc AhS۵FH̙e'-ѿ:KϷ,rUzEMܮ+*yΙM!qdnBLP "V\z6Y8;h}'$y}B<o$rLq>!/6"MIdsJؑ1fI p}zus~kC8 hBmQWN]iK2جO6}@o)Agm oA/bdqlgYg}-rWZ͙r߻qԱq? =`0N%FU&k/W*zfU{[ M#.syqU};*X?yxPn/:}6lPr>wKrɫ0}5K_̍:FN޻n }cynfց. V6&,C]T]}^]a,рFo~wpF_ldkߴ]djJf" <̭?l\#@gA*0ƚx˳;|d)rs2o&ZycP}O6p'` c2 R(T+Ua91ap>G|ZIvjUu&~鸱jCC^Mށ].l Cީ??ԇt&8qqsQߵmKbx)kd+ q4OЈo@=胣GbrvZton?{.WعuR=z랆YwnG[or'?|=Gs^,9GKގ%|-ysh&kp ońS>F&<9p4|58C;g{td zs7 0r3MhBxdVaּTAGz0/K!jXE䜃Q=jIpFMb}T8`O&|1g.;mZs{NU]qWW7%?6.xWXP6 US2T~qVM zN}  #%:xeFЌD r̼D#L+>>Q?{g1ay[qNlaNvG.Җ[},sGg&Uy pN%ƏmQ@ 08V>VT) 4c/Yp@ua5%;SUY]˟ !_p8g>-Gar護 ad7;ђKX%-9Zr=49'\TWxsNzxbRW+NxR, iT0=ea$Gg]|Լyʟ~KUXU+ճ":ݧcvҝCND;UD|heަ3ָ8+PȌA.d_2\*E' /<WH34y!WI 5hԲ`Rk׭'S^QБ0gc^F,ӿNL;P)&݅GT a=7f8@Avx켗NQYdVS:E|umS:a5D ,"_ Gԝq,rE_ Y /t̼BnFNŞ]5*f"p<'DDYȝbö- #?5(DcXKx!kY;ϙv1{߶; zS@0V+xyS.'m"Os]1₪lj?Lm`0Qt' 1<>qL֮mrk.f0Q>7o_ܱOd~t ㇯d^BM#ftw >\I.p_Ą@b4?43G)c [o1!~liIՎ=ְDMrC5 Hx+g9%y 撆7=O_˹ 2ą vANel@c2s—f;a:lvejCgE SŴUQSeU/Gc5D5yY1 sv* 7*kpoz{jxlk4<㧼&ѿL5s ZqF|Jt|i1P>/eJ/n8VvT!|Jի %'&PZd8(1˫}Sx޸?1;[b@ɀp:hO',ʆ[98Oo{wFl6 u$I?y,FDY5\{d2Y881.b}sO1d ^#%2p9ڬUbUۤKd@bq(mҸ,ʵW?g-R'=ӓwm$f!y""t.k͞ ˟&ceECZBb% -Jn{%?" 0!{r/<#M gn|]qBvph.@"\'ҲqcmM}*2K_ݳ4WY5LE1zЊֳ9/(^RTs|oRm]vAMR0I:SI2ͮB*n⺴'f>Kߨ5tN?|n6`u;mD4kLIm*L%ӕJmҍ^vECڠoIs $뀾nzMVCO~_Lyڹzfh^gq~Y 7Iݤ-Цm{(*m؞LP/zG8Ly$ϋ,A r;s@f]}W/2]_.ի_VZ8fz/Wqٳ'StL;(y' >)7lS4$&%FP LS[7uyëwYo?Vf;3}v|{z>`og~Ⱥx5 V7?ן:S޺l=f@3}qp'iՂRO6c^b ƛ2oݜ[`tL<⢁ƄXю}b>s Q"o޼[{U&4}o}-.f=suھ}E1Nwsǜ:C8Q}n?򅒊lI']m\p ,pݿiB/gNJYlCFwſyf{igy2a6dBž3b{22&Q>.]oeu[f?slӠ9f! s5=ɍ\ĩBߧZkPq{+'UFRn~^3qw +trSTa LU8MTr^>4I+0ﻵ֖"zYH07EƟD@ L;kECN9&,YIYOw{oumPOڦ7nΓai&"~?x?+T:wr l _f>0QĻKox`%m|G3qeYT6e T \͌°D2_à֩m^<\sN\h3D*}> t8 _y?uy960?_ ^V*e-Wn5QӋ|YMjh!ON^uO^Tng]mpʇg{ 9)kg3*_'w]vi m"@ccl>Գ0yx?z C~iI|e7xwC*?k>Ϡw}`CN7ec v{gs}XK e E'zVop}ر!R'Na?kgM{=(/ ̦o jaKR[Z G1.F{<Ӽ } V13tρ'un=i.̓$泑/"iJy2Ͽ?{{y齻)j57f6oo4@Rݔ36|66n z83O|qr@2ooQ*Eng7T?^mdy~;zh`wp+I02>;Qw"66{'#>cV^ϕQ7`|܍~%.x]`?k;c1xajEnM9FSwLGsԭ{9 y}R$JFQyVl`-A^њטC0 r)AK.{1XGaA$[y@7e9/{mm6.Wv?_x@A\vY87Lх}*۹ښѳYUq ~Mپnݭ\h\tg**~/tG?ʇ+EaЈ(1BCq:ZWG(ʎ19)]xf7o15.ރ6m{F>BaMTŻyqQ),%b:PR"p#%(b2')/f&-+?b*C!@]Jŝ0@LiD3XC>"8# pÜH(!MRD\ 8"KTHq'Dq SL_рF(Z70x@E9W$бf*>y DJ1j|D1 H`]q(QED+$`LkP" &`8q@P <$%BHc`r"Τ*YX# Ɓc¨JaC_HRC$i\̔ K (@ Ĝ+#.O|P*XUï&AoRZ c$$q: J,"XPFIKiR'AEQ 0!R@A_iEDz ̤fGX.cVoe2Oh|l?p4b|XD,f>Yrcʰ~n6.`x׶ un$1y1 ^y:ŖcPn@hV:B9͔5ˠnU ,Ƀ D ȅt+ 2ԈUAU=BqT^(-kffe0ps<^t:^Tj!5̪hB Aك<,i^E VC\ͯݼ\2s)KiʙcgE-yzv6f39ļbY)iʛ_s5DžsQ`]n3^Uk4({lSA(y`ۏc!f+L&^۷3ctɕ멂cGuG@+lp!xt>w~@ͥ͝ l6`ceq^ $3TmuFK&;\Y{ UZ;GxМe+,vg V_߳nA)4/ hBRQzUo$UNJipq,% N+[ʱ!VXk~lVXf -/]4,ӤJKK34b+kW92FQizF5|gg.vƷXab,àqELXy `tذfy{Z 6 vڰ`sam]"6ݎc!թ! v;9YU+lX} xp:; ذ^p 66l܂Dtb `mÞ˂-ZÆ֜`Zn`<m/6PaٴJE]'زPTAqɢQS2il94O6\'_~y_da (ya'rǜnR9>Lfݹ~\dZݡ_br\/39ښ| ׋HҀ;~npw绍$H6v9Kv_Ll5Ʌ G%D֑}}+ŠhWG'H ϒrlNc}giҺ]FHt] ,r6^@ ր,#ZPkAG#ƻHhlqg.C֌ ֥@4~q:Mc=XYvd(NR8`r* ;gֱm]|#5k|Y9]}w.eqľ7k_ G]ߏMRzfS?Z875X9NJę+wqT"#mC$z7\ 2Fcy, 2/ Jz H3 b`s*1% XdA_ 8n2b) ,.e#"BI pLՈT@Ya3b8xn*AKeD"yȣ,Lqt(JԆb 49 Zc)ۨ &2 aje*fH$Y,Lm@M Ǣ-WBEA8t50 <ٖǤB%Z$ :iu%)1òj1hL1 "m 8읋@b=Ɗr)%h8fA.S ܃Z 2Gb|_P}rBg8/ YαeȾ }d M{@z昑\K/Զxؓ}r!9t`|L/tx^w=w<':=;.yZ5gmb .Mom}(uZL)Þ6m;k>}5Ӿiq nouIMvL}ۅ=/tE4X[Lt\.N{mհsJ6}!B@ C[ O6#8OqFN7 77>%XS:md{_HfӦv|9ޤN6aHr7iEm T#T´ 91 ݦB@IVPڗQk;&!\$TMz e>]@ ueU/JgALR76DŽ+CGRKKD<4-^ Ox iyj&`4<>:Mf? Yt.XG勬3H$kkl8^|9 >e+rI7ڽ/kY#:^ێY$eލpx{6ql/&N΋~k8N< jc8y6`l?ǒ6= PCZ 8,lG`{_<:˳N_ApwQZ]DpzNgG0TwQ$ 0=:';;n)]~›]L^'`$^5]P:/aПiwi#i|i#i|i㙆|,A_}!B@YVx0N=|׮Ic|>)6N'|lK'eA7,FN܅`,B# ].н?pf"Ib|&!vIiS6`A\_1,s0g`(ljn|o` ^k;0ϴoܽþZUmJ1>;EB1>@p&1>#Qå(EhBG{'Q>[)tCϑEO \HEc|b|f"X!ƧC0)Ӫ1>7b| g6suV9Ap~D7\AKSv7ҹ>UΖ ;O?gx!e_kh@&J⊴5bnY ʹ:wyoFX̼3j1>F ɀ,;&]b|n4 U~u8BV4;wYAiy! ` /kQӘ>DXƛ ?xz޿=_u/;}U?|=ӏ-Sx /ozߟB?ޟ|eh=ozYyn%3ߞ_jߞB\3B< R78/oOwSR6/ji^_ޟssͷuxF[Y׾P` O~40 |լ6胗g*>~ ox+YMuo꿿r)Zo} ؑ*c5L8弊)"r@,=pGW2u0)D]K)a#FJxTl-ϪwR9ǼI*圊A&%yᤗsu& rW1TTsy a:)QQ-=S8.ىuR Q%NKc,;le\N$Lk|'b"~6x[F' G~Jٹckp=? _ sū*YElaɁ<꼤.Sy欋:ͨ& U\A,):k>VÓqs ґʔM1la.FluD5q\>T#JК9*Y ^x|ޫlrp*C"9 e 0$*JīV4V^˦#N 6bI>JtFbCSMMz|(*'+QjFᣩ5(=ϹPEA'U Iߡ %4\H2iHJt6%g%MԤ9K~L rpȪ"|Z):g>(1>$lU3ANk*SVS(r@5]tv%R(q &eiUJ5bh iWZ2RaG+-d拌FTA%HfEhqb+jVԪTQ@f^BA ? h]MLMU6&|Ny:Fm!D5 S*Ra$%VCiT{`QFCi|h2P%M؍bxMdM6rT Hd A$M@I+=W(<&ãUQVMZwB'3( )U F%`R@M2a S5YBKJ )HXoE UU 2s.ҙ;[|Jp%4 H&c֡,* uɰ RzA VW!&ò@6gX1-Tp K(aG96DAՉ%(_;ߊ_oG/ŝ&_L'7;!'~XXk}%xՖd5h>|OGiw=iH}w:zt7]h7# o>=<<JѣmodhSɌ@x=']vj[Oʣ^`oARoYP:sS8vL04|"q b{̞_~T{oΟ~=8gawt•aqpƜ-\i8#4I-\LJ1gz W8LoJ]qp)Aegz W~LoJ*-\iXgz Wgz Wf3+0LoJS!%@V `KoQ BypG>={N-֡y Q'v&$ QIdQAr6TOEZ}rV~A_}!B@'D`Ԓ)f#XEpVWv+BV;k6 A$Ok 8 `[:xx? mY @VB0VB{h!mK4wAܿ(-ă]'^x]#oDiڜ%@-t%FC ._{s]u`;W`|nۯU"D(?)cFʱV\>ivk 7\7tƭ_[ɥ]ۓM;/ڏ͗ ?}7?>m+ %HJ5j\FJ??޹c! jkq|⿳{ܬ3K~oOhbuf_))>}X*|yŪ꼻p zaYs<ѽeVe9n7_vmޱV3f *}_SH]o/'ϯTooޯ7WgE^oxyޡh_mzji&W_˽(|Yp󪬄B ѯ3:ǝ2MOpJܯUgs Ϻc^ C޵L×B!5;:Qywo>ޟKwyJ/|_vt|D;~ [wo/z5Who| WRtU*X;m.-D%^& wK &$1cF{eәqfKf㩽KnC2LG\hEGK^iyun~w 3nwɭWm]r.sF'$sCkT_ObTkUdR:5 u OӍAeݝ*Q-|V_|1x˧zӀ"kѧNC=;`{a^5h†"َ]3m}[ֹok;tn>O]W!gIm V'{KVve_1>]>[ӷd}TYJ:y>;My J)F}jScժ%LOU%d[ţpvosWaM;OZ_)S}J_ɖo?:pmlM&&2xDR SE1S9sNRgm2"P$K--DVM,MX&Y5#gL(6z:c:3r2EhVƠ]O(symZ1:Ja'VuKp0`a(ԄB 2mOER"R$F`)D:3x7)MwA; j6Bh@]JYj UjE5,@GP^-%* 8P-G 7(8R\8MIV ,Ȓ`KE0x8&CG3GN1Z`,0efRL@QMѡj4?(`)h<Cx"G{Kt FmZuC.2QRf\BUqFPE1^nx-pXh/R;@la hEݢ)MNYKYzU7@=?딣/|uhJ (JM7H7 c7O}Q?Ku|Ņ*}UL%'gcx87xc{f6 39n芜1tCm:gos os mmm[탷9n1t+魃9n`pf6-C739niCùCos OjVE['K5=ӽXV]vizN`O`a99^;n?u `۵2:XV*-dz>8ͺo|1Y)QYs[qs]r~zRBռ?:U2h)i;ujkSoU2u\wjUȥuvJzթL%tBejTxV/];5)Z_{vVgU9+썁1#'O >4ȴrjWsd #mU0`׫^yrbի)q FFg!/PȾ`pz)fv:2 L1,/gΫpn2- F:[}0H:jAdp ] m̚z'2ʹMgdPܘA7v*6g+4z*].rl~~&4ꨅR{ RE-Xrg\<-qe)BZj>ƼU細M`<~֟jcɣ9m` SL]g[?ܭ&9MyZb-NԵZB5{c%#dz7&S]a+ʾㅕj``DЌs~9tm4ZE4 -kCQCksLuZ)(YZјmz 9r=}jn鷭uF[4GNI1;)z@ }89ǫtը W:%hgqvlam^:4G?9҃a׬urd^18be]R(C5?;sض,۶.ʚ VJ>nn\8҉?B0ɺ[g\C_l`˭^gtb 58fgv MdPcYe0۱`K qlNƵx3-L| ^g2 ^Z1ZtZndp+F` ocˀސgע/#338#1n9`fdN@g*t?`| Zt~A JFO 6Y!J:V=gT:]I G;'V[lJ [>wDyoZ۹p<!m0R}|$Fғ]ۉ vXElW!*PƽTLK~WGNmөU[Kܒ'ERnIUGUʨ[DRոOLd 'ODRոt1 u,ύ"jDື2ǒOELVSqcz齴IqwZ8I5+p7 T5FA\|6GT5fcЊ[08|c-T5:3=TKi{k.DRո #j6- fmIUy"j4IU"kځ fQ1A$)+Hs!؏5{ьX[3:~mHF, "=Iue*ʣ#ERUHFT5 $FyHDR!#ER`H 瀸A$U21r$U3 &#IU&q=:DR$.zq$CM=F'-L* &v;`I b8x'#vdp nIUNdp; ūS$UIGf# .=SWDRƠd0 @#`iT5d0"CER`t|7 &ёүb|R@ͩXf p jfo+X[3Yoma)/ fnB-N,ͮޞlyxY~l,mcyi$_ ƿ}#)w~Pʼnq#I >, }<;1fgU^J+nK*EhFw2 )Ft,5\T5c37wp>Lg9jVRyS>bc9VoL?^m梴OضrgO@fѭARyLsفO,O z-_ \:ղzn̟8_J?ZŦ>*5hzȏ{ݗOߧWhSbuicRZ^.>"minyĕ .yXPɬ,gJ0֎{0ҽW-?˅ҽ V!]m^a^r%`.r&HRՔ>ATE]bJ:& Wڪ"&%-aPX)LQHp,bl'%ύ0T<+ʥ#Y"\hPFdJolfe%11gΆlω8LWj[UwJYRมRc1Ø8KĨ e)JXJqBjOLʥpLWG-Fp Kicⶔ20D8 -2," !B\̤T6 Br#dFTDcYGN"TEz0MT@JAKz #)t(w^st2q4-h1ZGC{OxPI0i.g+B\B ŪP@tTjh*L ʘBɃ&>C0 vht)A<U 4Dz(+Qr!}R2$01ET 5f>R}LAb3 \hQ%31b @[%anfR6$K)Mks1 tXhJO})&C& 3hPi0}>xov@,9x{V%q@rJ°R#gnz,ǔT )hxH"%j7:NYd{)%܋$Yx%Jbd%q@ ay4$34J D-*t!aȐdð$Fn@[" fTR*ˏ57AbYCE( @$/;8FX7>FRT50 K)Pt¾lcN0B꥘氈Ki)R5IȎza `1W)3I:*%Le p-& X] b*2Q,…HϬ0{pm(0I0 TA|$NcLD`;6*j`-Ѓ ,8(ԤJRjZ {mPsT\3 cs;뺻?OdX>YuA =q@zA%%a0žlErs6m_9S7{ ,@\a7`MJ 2K#foƅ/O}e-!oM 5=#ئLBS8^#6PjUmى!/v[f%CsSD-LRl'CI8Q QS(s ﰈβ/Ҝyr?%G<\#O.ya/x'{ȸ%G/>ᒗ||C{ ^=|l༗|<%GƵ|ׅ^rTiB6M\nfnz m {ϻ܊}!~O4~tƶɞTGI_SK;3e z {),;Olsh75V'u*oS_o3:jܒM|;s6W5S_jS]գzIa&jR)ڄU~v9x| 7!xTIP9vbw΃n3EIiHȉAO=v!(Ukf FW#xkBꀸT]_KW`pꈠ9K* T<^A0G "8>16S)8t,™T%тNӷ-UZ>ۛ%`\jRƒ%UcXuڡTM:+xPo0+ G{NMuC>v[/;HfK~YVK[/|s=S+i@SPhiꟘyp# [btƶ~W L #y,W nB0h2\ucUFw`*B]UbÑ=Cεש ƥzjL"JaVN&F0S;mS#Y _y30 n?O`nXϧ7菊@46LnDd$Q̉VR⟯F.B͘rm~6 9n~ߠ;EoEϫf"4URߚة3/MJ@hmYO#UKh}F#L}}O8zGKo!(G)iT]  UH3 mߴMH"`AЋ鉠~W4RO:pfxzh F zZAomoJ@0Л= D :ɾOH7 z!hߐxt&;&{H}: x%9hF+G:qU._@1;͖+x0u@JG\Ck#e]셠G 4*NϗoBϗoB0(o+-]d<ҕwGtQh`7x4y H}i0Lt +Ron> H}wxx6T=Ź21{@pA=Gt0]ӔR{T~s9aR:.)3JiJK{%~)?nY~JXjy۟)%|: )Wfy +5uS? 55=.L?*jE Z ΖsZX}"l=gZO }~a3/g>-6~>r˘[/|Yvy/֛Ӈ ]@gzM\3?UI/b5|X=jbsޘv6oVϟ#W[D^f--NS|WU\mf3dƦ++WĘ/y笠y;波'1Qjfk+yaɬJM0n6 lkm'oX ,jP.)'D|1aEwMuΩQnZʹt+fO+\nL ؏uy@`;wX?;:qgKgÉKoUCuշ`ܗn=\9֥ݾs<Μ>}2q~zSk56eju'[s(2@x*r 8PftD?/ϟ6?,|a:yl n][m65_}R(v|xvs&vVY.>~s9+6w VB8/,{?=ũaV{s<*F{lXIDD#(0B&'e%KOIoP[ }h5:Lu J)Ju AzVfyNr)I(hF mr\$)&v&C0yl,,.Qc$JC)K##Hn'4t࣡.W9@3z <Tf 81P`AI)sƑ(%h!]P餹QhFҙs?1"1SjEGs"hh4̹C?IZ E4BH$BƋ9B kLc*"6$@91AhmѶVrd%BX5Nw4;7-cR[e.)nBH>Y #) Y]-Rc3nHN aP`.0`,S₶n2\D6& e"lApH6>BI nQp Ȭ>lB0: fiJ1Ary-H"BH4&i#ZH f+j .=yEtk+kpqm.ּ7< x|k?xkNzO5z-ܞ>Wk,,Z@4{,˄ϵt)ŒD{/G \v2:uZ[iwY Fh M;ձcʪUC{7=O2P_ | 'S2<Z* L޸7w-MkTOOIP#ގJP1Mrpfl%E/^SΌV-/+6 ZnjBg poAg=-8kyI*qp wI'k;#jwZ7SV]МY{_:wF.^q1T?8HO}8_ft3ԕ6A}fXR]d(4OPyr=:p,^pT?졞Qw'Z.#dX;3Ύt=gFpz"N>ze]9tqNFL]8tDȓiH(bt3['sfcL|fЗhD68C 7%}XV3Ӹ6϶ijTQᡒA%1-NApޒy*.y0[H?w?u.h<9hXޞ̑\(*H3dQLQ1 J/UC d^>v2;O&aS<+.Ugi'+ng0nwnQo"'pSxpZ T-Ev^սam:ظ7măk,[xOwsP;9( +{CqQuoH74ݪ{ܸ7ܒjQOսA{ FVXQaސn+hTU:IuoH8`0.4:ذ7ZaQu:ҫ 8ؠ7J7EVaސ~QrYVU4Ut'+T4{CVjE[>wޝCqQuoHJ]ASshK[sm-g SCY`-9H?֍S~NXp >?ǿ=R~gy|x{ ׷SE/a=5}7])dz?=*j#o/?'[5=T yzſ7~z3_s r˻?}{u_bɕ7/_~}}⟿>;&`592ac;m9V;^ĕ_?؏QKz|>?ok|}*Uz q 9?Sm޷{w^+ Kf-W|X}͇x_t^>>DҼ%a_뻃}3U^Vy}|ZaǛV[ 򼯃_0TKE(!^_ZDK6»]񋅘;"+T i=6h<oK?hR" əpz)] ^W"K Z/] {_Auǯ_;~7Q6(ig~Ig3nWeT]/rrED_ަ=x~< \}1dnawߪ s>|_|Ygˇ;| dRQCI%9%JSsFJ&N1fZ+f6Қ"̣&FZP[Gs0[x T&wq 4")!&mzIQ%s7'c&3Qi!=,)F&h"2+ =y&9ksQ:h3"s37BgEkIiN{p`MR$]*u)i]%t)!$Nm iy\ d k͜t M>+:]4'ZJH`IbP)@Ɋlp:eN *p%Q+!k VNVI,WXN3hؐ$8V RnR>) ^WMyIlq}Yg3:HE=#@+o@"pB$.dF7eP%)ᤒv@ID QJEei #Q QD- !8?ܕJ#,SF)a' $,2p9Fy2 cAl 6&́:&nՕ1YYF9T()zWpij\Ypw \XPK !s:Щgf!\)Se ,RЇ!{Q3ر@=Rp& "C u-nd֫`%€jx&gzB iK-L(Fp#S"K65L]WMe_I~,)MpЋ3n^[E/ՕcH/b z^i@lߎSzq"G/) ?M/s5Ņ3q'"s3ӑq0ywf_<;gsx<;1D{ĝ\Gy#h %}N^~W阩/'WK)K#R<9zET[\7h'{% A|]AE`{[TB5$P *B"QJ5R Y>QELhQ, ѽ& P5HhRȟ5ܲFSTM 5it2u }\nҫ+_P>| At^C!H\ %lv੼4Cn=mbХ]KH&`yAghJLkxyqb^7Z~[ C~ۺY܁HlyfKA"g>w2~Ӯ_5۾iꣷ{Rێ^kp.Z.,[\e._9s&3fwMJ"nݴ4gA4Ak]uR1lKQg&M^WjofEqx@-دw6sW2IF]ƽ>BPb\Xynds=fF:f]ߥz 4iEiKkx0|ճO u,q>mT3#3-js錳1oum#l r `;1jӠBz>|F5E&12^w:WPdxP^d K-ٛg醱wzF$F53KustaCLK !dlpY|>3kƷ=S^4&C'b'#H}Gzsuu9Iy:eiV7!؄AiNJ7RI&nnɄJw? ELX]e>[rѽͫ]#D=mw%[y[Eܖ辟G\E<G\E<G\Efd;,(oFVgd^G,b.ZVGd4w#:x<~%kkviqmEp<"]E†y,")8^uqxBq>'VV`L܈"xEK&eJl}KOFn6G0+m欚#ks[I)ްW_V>Hc0M}n݈M"RLhA0/ t= 6$ C  IPNr4`PJ~e,`,O>X3H+ L]d`)ffSd12FMn9\t7 uf !K˯sp/L!P\'jR@omcR#HFfqd xt1gq/U+2GmWA-*pĀkVh}%UVfмwVwY>OwYF40$7P =3\"&<)/d' C8 E"ES&UP09`*T[c4_Q2P8Il34F΃+M@.Doí7[ L8 &y %tRV*KvWpm~n^ae*+ *~N뼪Yuլ:믷?&gr?| `G+;"B|ey*Y~FM @(6~u0+tU+F.~r b,}(uObcr{vy]|2ܵȸv7~ke.i We+WurX~}}N}^ʹ\B%eQ8SW[=qS%{!fBzF_3ۤɻV=^Cߜ]A{EyC/\6?;r\ת|n7ms3+.QOq\a_Njf}ZƊ{v X4QEWuG d@7+Jdvyfe]@g^+rԲE-Wd9Fz,_E\ʆYyd%Wwhx7o,_ὲ||c+^(Wdg:1W`,_]|YxLd\"3WyC/1W)T,_^%Wsl+,_A<܀?fY"`T6B,_wkHoEwYDpw!h#jE)U,;Y y }Eq +x:=օcO!QS՗?_@Ѣ~}= n|z><&X=RY~Rǿ3y|g y|>1%_O/_N_^bhӷO6|d/_m/ObraG۶O\G֊j5y>ėok*n͡<}pD/A`YSL/캧>?SR -\ZiߧSzy?fK Դ3>wө\O/ݞN3KO)d>w=Y@/}p*{|z>WysptIsǴ-{'3g:?x gSJ)V쯄V 6\R[Lctn6|;CM 57܍^챖y2ؠ_ßP7O~kݑv;bݙOwV5mkj۬+*CCrȾ뚨ڦ{tm~Mm7t}?jK!%ՒC?Y>%b9`$qC:o_V)t!A_JBNMe0%%-5eiK)p2&$0?IɢJ1Jc3#hP((oIn^Pq ɫLZe[_c~aP[)则ԭw+UYӯQ\bPj*叔sKaP6-s!?*rlߙAmz{Bo_NC{BL0G(s&#v0  s`hPaL0G(o Σp=ށeEPzNYI&LZ6*6v~eEAk}|aN%lKN.,Wob-˰޵H#}?HO o 00fV̔TsST`SUr嘏6Lb/9 P 5(HꚴT=z?ق̐X>C)3#[^g=r+Z4to^&,R5w?ebOJYR3[J3u}9LG'9fZ/,ye94]KucQFؒXhg07Z[YkXMOz ƩG|+'oIw2}>fFA OkRg:<%{I1>f=a9ѵoNl2O|ϭPNٲ+U]<+ e!x~umifշ"?;-ǭxCto!6De{\;ָ #ɤxlr}(sc̜QP?c kǑ3cVXk酥hU֟}FB>>P>쎵NlEJO.ۀuV{B5#X^kै[)q?wzu`!VpE ֫bV~"BQcbVX9(ɡW+ںYAWzu?!֚bU98:}݁VA#ںXk]A{&>!:CpOZ'ZScgGת_}  8kk,OZ.>2W8ѻ|s=) 鸵ru,[j[- /?F.#]Uǿ__~~7~ 1cb3~|.[ˍ&cDk}9>hFϩaD{ v߫ć9ÈvFk hgp'Fcd_3KnwQqFO%2q疻mQqWo>2-] u5DssԽ2Ai"Ckf֞lM^ukwXk_!̂VXeL3 h;F0FUҍtI&ŤDLvS OwC-'{>y0;F ;ã^Q5 ~?XBˑ L`L!%I.xyHbZ*yfc^zZKqK ~rƩP2S4:J:tC>$LZ'T"yH%s+J1bAq'uFC<ЃFp˧R`( E Z[TlRJ|u4#h% Ag%.c! TS4F(A[K#N=b 4Th80 XY\Х;fZmC' ۉۗV792ǹ *jnu"deJ}',EpL#%n%ÕIPF4GGiyT#9I %9F^N#5( }&mܢkF(J')ؐt2ZEI@wH, PN~:#NKKK-!e&ރ'1=mBd^Âj'вr2 )K(*Jb+7fIKp0K`${2FOx\206`P5UAB˹0<9pZM(Bql #N\CBkHw`L( ^1M]W8  O8}$`b~P@@WQDŽr0Pe;uVDa'p,"%.r'4$;AҀ^0IH$ y468jN%KZ*PKdTWDIXȘ 08\/@Gg$%oaX+iJJtL(0ޅ@C)aY$)Hpeafi@F* ! "ȍd82ae~'!&VF0;#@Xn;o {2ݗۗ="C =2.zFiqZƟd4|[_ Lހ?[CKzn("a~+lTø!=uɌ3.B" XY#^BYFb+5+"?VֈWaFb+5+Dx*\Y#^Bg5+"ܙv 93oȌfv+5/ heFL!]3K-Ly4R񨜏钗\3k4!ӌ)]3k4":<:Y3wg/=P@ܼ-G xOA߉ȯ =!K_wd/UYݡj#EAp%#5+Vvg|lV)"F\͂zD@X})eG G_?-p^'fDLmj`6\+{ZnIYĔ&>WYȣ1=Da%rME.3?ݫd3VG;(K%~.g~9F{PZ~74 ?=6nͱr k=Zo;eht4lW@Qc|+gh܊ѧ3F9d|eQ azdɳ'E2`=?rM|9fԬۏ5/$3]KjμIW-)mb~XFh=|&Mw}r2az{1ZgJtI-3v,_gR%[f~m!_3W5eֳ n$zYgza2s]4v){ w`UVI#Y}2SI/.ڒٽsk>'v[ll_F:@);`xnCy?XoGu6-k,d'+s;Yn'qʣ ԯ<rMK9s[g:c7]wsZ{9ݜ^(vsZ s Q+ύܘz9w^xv/!xi7%/!8T sݜV#zan\h.y(e/unNk/ݜ~ͳ%9@ߞӰ$3:nNk/g{>8j7g/:}7mvsPFm%9`vsQOorv٠odi]xnN]i|m=nNk/gE/%lmpn ^8i7%u^9Rܙyk7%׉S6x]i0;vsZr7߿+<݁ðG͙q,5#!?eppw$S8U<yWiqv?j H¼G ]lާsy= ~BYMVmq GϩGwWSp|W/E47r3[=9dbm6{{U?na}tLL'AϏ 5bN823x F ˸/LHfeHvʞvd`G^}-q.3Mhb0Z4Vt+iz4<"SJxz%bC$: $oДUN1"N[O_AH`!t+Bt#PkJddhREbغMC*QS9&{Diڥ)ظ#/##uV4hb8^i ki-g pVId21.ИЪ`_a85*a8n_z&Zh*ԧ@ɈHP T_ʆL orn%e.ҁH.Ef9' MꤡR'JtBۗL) *:p4TV{UOl}oUU W%WJ).bUrZ[\*AUkm]rŪV++V%uu̝^r|_z~Uk&.܂T"q-Zs[~7~A$ "ŷ '"mw@ t4CDDrlZ& 1\lq,$.kqMrb^U$-W?H}(Bǡah{pEF+99?ml5}ʷcrVă[uhݜ]*Ƒp}.y\c\OdܘȸukF{.g0p%fB-8;G2{'Wk5TG&#xl̤"66IE> l^{^F6u+/#8Lxjm=đVڬpW&;]cq}əm燐%d!CȖ뭆|qC- 8eʙ [\w\RT9!W"Y;zwݾj\ﻢzHX2MyQw/M~;ZY[A(Q4g 3|Xkc=6}2ĶFAz ޠoޠgy?Aޠo]4Y>L7E ΁|Et\"y\;.^k9ϱ^v\}cqzxp;CB ?{O䶭wU?p?"^ˇ\$;k/3J4xj} (i4GF@7Mr%"O[yK0ɩ^鉦R0 H0׎bG:vS!.sxaHN8EקDD/B/`csiye30u82 xГ㧑҈afbL |s]X B!b<n 9NLǑO0v}ʉ|Ƒ 2h@|tF`sB|!R36y®w`dD9! es1e@ lGlӢHQA8. 䑻wpPDx່žv|&CYBVi0yH(\Ofg"Cj )l}?pr0gz@cLNt>yHd't#~ӳC2yYcL؎q6BǏe pD\FB;e. d=\ L|̹r8%|+\ԉ # (_h!BS8s "‘  F00 z"8]ߥk8t[$Gv TG8X0f1)X (Ƒ¾? 9YK(g L3:feZ&`X F 0Xn{a8%ӈ<IPԘ0#:X@ fDa˯0@38'dJ ]'APeqȋeF X 2အ8@q F4 P/Dq!)Ď`JA8`\H$r10ݐ0&󠁍#ϋn P> "{ Z:\TP '*TW#G;U?^ih.O{yz#o/^R$}+>#U+^]_{uWH|/KH{ۗ*ʭϓjT|6dޙφ,s;2bs{g>xagC9l93 Y kIQ~_[\OGll2-lj[(C *z)8 XDҬYZ~O}>Zcgyg" M{y7Ltf3a0[N䆹</룙ЯѮٜ3cHUсL1 V9cQ% 9cQ-o|Zm䤂@Us3bXJ sƢ.e挥Y3sҨgXwŜ4N1g,c9c)˙ @ٺ~|Y݄fl93$c(2;lO O<8%6뻾%zs`wr[YI' Wːr'rST[*WԤ5rDB*'GnBP$2fcZړK}U|\G[ij?HvlcgS# iRBVeDwև:y}&ˍ*>,<"r}v^;9n)6+I_Y)2${$S7I[kKm. ifiYnhHڷQ7LlЄ{YMᶚʧwJ\:\jgn$R.@nAyxvʨG- S:m7vZ*OFIeY+\8L6rg\Su]UJe; P烻@hgf 9.|Һ$m[{1=qkM)򉍉a(TqRBڲms> XF0&bV˅j'>Tݩ~}j,j` ׻Վ_CU\+5of^8l v'%::h!`n`~XΥGt]&_JW VwtOUnwЩmC{Xսۥ 6XԽV*i|2jHk^4ƬTU%6v,.8_oax[ GGdm1ѪW7S3K!`^!8;0! *ȃss\NK,O4' {M\f J bUxIh |b{.*`]i C"""injgCʳ'춇-MVfY[)gIC4L{^2n 1]8xA){XzwS{3-n-+`Fz˷v˞$,M)kְ`[cj|/vە1t: ^;+[v`d:V^Y"?~I~!vrg ި3. ps4m9@nRW#;qƬ~d삏Fv}26#;PTf{㌔KY B/,̮yOC% O=5.pyy2Ͱ=| Bnؕh^2\o8uO|HЭlOXɫa,p4vJ iHi/3:qpq}+l]I[cCG^GDSح@ )Up&]>ܯlcfjhLBL˺`ip/]ͺ}AqͱC ~S1iIŔ411rV Wzs, Ė-oZ-V]n 8ef􁃩uƬsHvJRVN7#ϵNUT] nvp'Šg2M#\.xa/02|^27=M"+)m['-H߶7r6T'gZ w1SF8R2- \rp>;$ 98.ARigTr%ACʗʕ0 bL;.{{d-QsH=vYPT~|>CnziRrgR1Z_YWuSeRrecb'׀aװ/;9SjzfZZz ӪJy]J3A*Q2OԪ{63yg.)uJ`q(i^⠺\f|ܡs="Ao+n5s] rLSHZ_mֽ`Jf)3C$֠Ǥv0EܲQX>Nv̰>;sMc1ƎZ% 5a.c‡= /I^Weqj(FGRsmntѹj8n)<  dX Py6)~2(ӣ)SZ*SjQߍ25T-s(+yuNv3aҔ{ԨNibEXz^z)C%} v@5RR_@;C5 s>JK7Ҽ؇R͇uRV&$H&@ETݬ ~|͹ d'Wj{,Riᗗt&{ݾ9^>K멌~|jxl|c.f/HC:ӛV&'z vo_=hq2T]S;Iw =Xjdb^kH7,uxXɴ lXL2Ǯ{խݩr]ciooJj>-ykVf$yϕ=գ9"XވqF<}G?~zw}{N>?QN.9Se~Eu^Y0NQCvF(Utbg-8Ϻf\K?b)h`LwWZl@-_JA^ƒ/Fլk:@73%W߯`8QQN5|ܑɭQ :: 0~=lIN%<6yMArbmy[A)}zγ au)s=uQ4gϹ$k9X uWxO lR޸u߸{7Rjc;syFw@T>Ha 8K ݨKS񫊮I'eC~ r^#ુ3ÖkzT])=OV9n:kt@.?AUv;8$y,4l`{mYƻ u\(W붮nw:{b_)Uݙ121rm%sLSyi=B_!y* g\K H52pRYgwNTu,)v}h>ܩu07͍rGFy*v{׎-!?|%z K_Ar/}8傳V%=29[T.'1JET^e(m61ӢݱRuV_\Y r:4~9&O8D{sv?/[4a'tĘ5&i#  ]`23wn#g铙.˂QOgBAߦ&b1c;ykew'*]Ғsww2~3,[,6@YrlL9la.-{z5s잰1Ǝ&HJIXfxhm^8Hg0炕<}Nlr٤o7Z@\MO`t6F*[[r?㖭@4l'Czt-E'?-V=X~7I%a3I`b]k4:lKUճP% HKOrYdB[7 ԩT\Xhܲ~_&+i<Lʮ?2ecySnMp{pEeR 7HJjRjZ+J"@i.vuL1XZ삋]p1CUڱ"4%L['J &S%hv-X1cSTK^pʨd:ŀ+BzjŽ[,Le% \K91A;,U%'2A;IK=N gH5ԢR^N*/aFSơbbwqjgsVCa8'!.-J٘1LJICv6~>FəaL"qJ"$A9Jwk)'P0֤|D8@u%U {4Ŝ[ @2$L[a4\B)Q$,W>Jy0hDQh%6sBP5KaL{F8q֬@g{Z)JvK/̕|<.9k:k0[F'o@G008Y2oL_g$䫥EŹ!\&Ł_^T_H9ed9L 8wU6S )j.7J(×-!'uQ<%Keٹ,)t>a bH jti 4yVf"Z-f/Tx}>;EAS8 ~>=u/nb.HRrLuT&,;V#85fɄy>exndhyL`}IYS^آ &7ﳊ"xSZ)(SnڼR6@O\q- [)[eH1ay_]wCћc+w|);&7b37c9yIx]aKPl# z 7O)}4ڝ^D~zީ01)f \ڊ#ϻ88v-ޮ]< Ӏk}}9HL0xCMѶxi{A@tj8}&ʼ&SLiw]X>$g E*%]\܏;K6ݖ@}yT+ ">Jgjm3d$*}8GYb8clק8` ;泡;_}8\f &_@"2"~E0y0{T>l'X_Kd=U`>.r(Kv3DZEJCD#ol]y/LG븢u]יgLW1GҵE;N+o{G:[_ !C>LWA;}M7 <1c/0N*YGwsIrg87F[в81i]C[:Jj?#y?l'7.t?7Q3׿n.3t\]WT1ʫz7L~e7,A$?l^k%8A1 ErG?10` QR PVj[ _%?r W# M7b4OBtߎEV}Q׋^AO 4,z_5i[}zXy+n[1Ft ߇V\U+PϠ؊3Zt*^Mm^ZŐƴxURNE7 쳯q*TsrZxvTo4MUJ1m5Hf4)^aoJ@SMc̴wkDaKT2] cܦY6AՑ>`GD"FqЈe (H EmpB|&RM &RR,&Zu-`P&V:XDK0 R"HL-<50S$ /Q*ZҥK{Q<܇21%$&U16y&Zpr39S`@a +\;_DӘ;#Q$tjSL{i,45ie 1qTt_q!آaUMe<}a8 /0>N8>2n?8>f~>;S~>;S ~ns^xV~_Q$g$b9Cύ,pP~v/3So/ (UE~q5&z Y{b- j/XlDQ>tͣC#h򝘯+G4p4&Fg  @|u6kA'="< Z 2zTCcEDEX r}BtCjxC 2dc_ξ:K>ܚyZtԨ5xښ%7!lW=oU|X#"}eػO{YKdD?V"?ogDȰ>1FT\5t:j%DHo̤z)5ԪWAϑ,0{^GAcߓ{6loq 8(qZ j.I"ŷ aPݏ3-,S]=F3x^3 54>ICt Z[cfG  *}XzБD|vɘ4&b=zz3mb7XgY,%uuctּ{P*{PY[ Wj>$wv\CEB腚Mʾ6폋uuoD\CUT[ 5Cu!oj?K-:Tg6֡:T:TƙϽV JZG5+4RS箘@HibĪ{{ >[[x[ђ1NY|,p<偢R&okql|w#|h4$TQei6~x8`b,[ ]hmvR_3Ŵico5O;@__딓;>xlξx?I&DNov_[R %ޮ"Hn,~V6ޖxgлx*9eK\okxN:d Zl-m ̎ ۡV v_ެqEl mv>;d=i4'3d7.6Îё{_ԭWخwH`.OFЎv=:|) 9Nn5܂)AP[СnBڢ듋۪vm:>)(˫B|]QoSk[^sk)o4MEz7]ϵ.RJ7y6\uϴ1ύ&ܼi"=dKTp/k| .Q^2EViu!|UVl|Uy=];g *?g#3tXCS~z3uJb& N)|&ʥb0Qig3>Y%  b)_k'zW%o~ֻdʬVλ)qD]Z{͏#ACk@O# (^\uW\8et5>[;îɓaa-a9@zr2+ D Ya2+ͬճ]a+ @;C+`oF0W g#Jv1U玩'i4"!#l4E<  i" bCUw sezq? $n(=:)z쟬b^ %/z(i~e!r`6eKC9ֳ)PW.V-7T:Z TPO6ٳc/k V\ W wfnL%q2ª6l~zZ`'ېYˬYo[]ֆ?GIϟJ1R/Hcyųrj{~io Ưv; !nb~ڽ]}"30l-l @}W~ܐ)KR߉Xm 48 =pbg\؄l^=Op2YqlqkcMDZHoՔyJXhx-2q'Q) C#Pk(d6qTJoZ 8XJRÔ\SqJX@ZP@')s)u֥AmFbѸ_–i+A҈@<|@YlLh]T {"Bsy@"' -qcGSYŞ3ir8&nO͹lI g\XZo1VYfA4e045JI` x{Ɩ/?Nx~xp88I 6dѭmV!ԲM*NwS䪵Vwlȃ]XY,lB1 3=:%^^˜8N ȵX& _0 KJ+a!אVO LiYGAAԹ`ܵ,z!ra/!:L`G@f!|p0e`Xn,q@ԈHh18VQl{zX1xl2n~lq@9,йɡ ֚xN|M`QFbҁQ:\/̘5toD*B$k@Q|ϳ( w==b=}!׍rqA2LyF-&Dpl qnoY2_pn3u锩̎Y[ÀO.~#\::s<:˶-w'<[G=_m'Ezegd3h=y6òZ*b_gjtBNǂd5 qSD33op"ft'!*'`ʟ$S<~M3?̠SYOW8[ͨCAfG$ J!i^=b;.ygz|Y)A᳛S^>|vsʋ_‡nNyK)/~ ሖNxK)/~ x ^\X&wUdZ2 DaS*,ۙOs"<[h?m -4E_gO̮N hAW^vY\E~y˘."hvCghV!řʙMLqbɘl;ͮ161? ?i`€>ڟ5W4}$( XO#|Nⓝ.w|Ɍ2K&1`nyN!c~8ۮs&} :>R~FȒ'T==MV>QL-;Hܣ#9ש#kBÙE,]qdV$*/>Xϟxt\VAnE1O.?AOwGCmu2 }umvSo7޲{mm00O7޺15zGO|Fބ_,;xXr>AԐmĜ藽r(fo9ŲIl[h-*{; Iz&٬L$>KM"U[9JLZ\ Z%JFeID*ˑ[M%gO Ͻb`Z<-H>>Ԃ*j.aZGXܴff[5{,{Q8"$`x˓FKyrEUoqu?-Ru_v!_w삗-S~d..OSUT9ǝHt.LDngM$^,v qMJ"bCkL Gq=Ј"#\݉Y|Y8rP`FtJA>vǒ@TpA] O߆$TbP`Qs,Yǽ1r O*<$}H:SbV 4U飦.Gc~ dh Y]TUnšfC?bH-瞩y -jиw6t ]Z?‚K5 mU@(?I%t caДD.6٧G%secp ڲ1\L٘l.&AlL6+1=dyPѝb (fcd/ds1i(gc4 -RW6& #\?]٘g<O,> a8į7Nu~ۻy{"% a»d[g8JM>怹3)/D:cm{ؽg#n/UBf}miQڢڪi|I].g]iQ՝^kkjp-cNQ7 lﵲ%;庭{~wm-aE7V9bXӟYh%l>Ŏ?6|ͷ;m) n姬k)Rܥwi0jY ] Ύ2h mΪY`MZlco*cZDIKcm7ըÚd: J]CjOP9`K$epK56& y-Ѣ!OCռǬa+~Jot }pEax|FdGo7[jxFc.>83SmIz`f%18u0Gd_t5b=L*LN]ۢ4房t 2E'Ә/p~i銯EܱͭQD-SP;y`ѝF@Ro3[tħ"L)V*ljEImU{)T4P{)ktPôZ}\IݲBTzlֲa~`hL2¥#\xGm@Z 1w>r-r' QA}F{ڥP{9ֈm0-7M*1@Zn$"oRMεmR2󦍓z㤶􋝑M'S;f`:C; \>Ch6\ԗ\<YHj9?>G]d!\n-s}^.W;Dֳykga`*un{]IJαT+Tvn\ɺiJg/Ppbg)~THxz`-2S'"T助ݣD N(c\#Ӛ}g׈m9)846[eF*9YD* -HI6*6]j”ӄ)}i"HYf7c*X|MJuf"( 9NHƠ*v؇Ц9ujHB9zm~Iϖ?:WB=2 uj $&%7PqPW{W9RHmAxMqʓObX=oZ!勳WH|ή]_CxԒ^Wx83g?wPԠtPP[y2gMł5ߤu4vZ_UkJ$eY[Izm6' }hwnx)A0t_paŷ<۶TCyQV:#fئg2Gmr(ՒmT4L \ӝj˨mTzW:Modn9d? Vmt mW!dvs!Շi {I.wgƖsTΨoW㲱0sاͳT$, ^=?XX){Ze٧B 'Ц)@|c<ўg󣡜6[p϶ѝTx;P,W/)p%m :ȃ.L RT!k"-L:>PGC ko~Ew 4Tz teeCn:RvA$R[$:ò͆uFTdJ31ba0sRBL~)VW^,[pՖq9L_|`is2 Jn V{Ϧ5N)՘;* ..QȆjș+ǵ+##:F.^vR#úNѶyZB~C*rpPK-=x2ZJX_·rViɧ?{oaW+™>7н0GN;P}e/8.gJxbA/#yϱtdc )a"%Tف _oE?aؚ#UEU$ @Ui4]DQ+ޙXJV,.ZfP9Hrl7-Uc>upAb;qki6kޘ$_$#zUWMn2sQ1u2R!Y:Ei=8ٖY}-r#!zFdٳ7_"*'$xˏ $1:+^~ aH0YWِH@<_䊖6䵫c=b3{y"r/C.ET+Axuђ ]l /_OE6AIǩ6~_鱗Ion>R/=_9x:ɤ5AAo>7c"Ish5xD{VR{fc4`/T[>"Nw[psr.Qd"oR-NM ^"k'$z4s#>=] Tw¿LRj^=>xt.Df $?ƖUjN:;P5ZA_A,aԪ2PÊn[=9zXZsi4ԫ% 4`Kpv2ObDyBGYޫڢVu(QVȞ }7n{SdI.Mn8;P5|[MBIkmhbh;|W /P̶pپܙ(W{WydAdZ]moGGv&iVX*˺ >\Uu)^Ŏ;X O#ŎzW<7[ޮ丬i LH*ߛK XĜǞf=gNl-fIHQzLpKkWOOkXK|KtzK%@(g]*1mQOpbfnY͝FŢVnxU9'dCU vN2PC*QFУTp--ކ?گ^_YF2xnT۩sqS%j TXH+a \ l )Fu ۤ\Scݞ;S}%˲id@ICs}/L坮;S }CD,xكTHj#)D*m(63Y۩Te h3}e֙ʋy{a`ݨ]UeJFjũZ$Dӆ~8nEj8g>JigTv|Y|屶dAP3KmXɦ.z__uؼR*h}E=>fov#\v.s&0eLmvT}]OWߗDu1ljW4&~\n /JrLE™tokMO6U5M=99l% j9^U.=՞ZvأeE[@̄J4ף1Œ"UT>_"6Ncۿ^t\RR[zv]!kr_ K=$P d@P]'%A|}64IyZsa+x&Ƨr(1Ӊ Hc_鈩<ՐQC6tO]\t!M]:i8bG-ckF67lg {3]f|g >Wgw-E|uw놞MօK◢ t' gn_q6=DW])8]99FDȿ$ 0r7Z[F)CnnÓB̜Yŧ]ݭyvlaSŖk9=(/?&ےCHuj%ѻtgvbУDz6呂h#>b&dȊ|)@D5 GEQpcv~mݖ 6IK?JDct7r϶]h^郩l~޻btoџe 'X٫/}^.Ӗ~ʤ0Й_G XJf-<\~\b~yzpli43}ҜqQw݃wf7OKPqp]>7|>9rӓuhf,eJe7 J{UAw,+pCui~UK<':yCgMi=SB*o3,11o i)eyn~GE vtWf#Vy_H8ö8e*UJ=+Ėe[ >vӂ*&nNR7ۂn~.Sy.#9.IOWW}ҥ+tRsX8i"IYd{~9ZLO9Lȵ sw 7tDᓖXcEZXIle 2L=p% K-CJsg7{϶Û1"e[,do(},UFiI)WSuQi8pv,[fËq͗bs5K=a,*M[e*]\q! "o8xN|/eؚ1I[GR}wӎ{'a"dž2[si2_Ur|+>})8'83[6_t>__{yiD~ UK UB ڦih5-KZGNcKjrمTQМdQT~4#@_ ASBb(ŨSwܮM*6wYJy>x>Q<"tg]]F{hϿ|k+{L֩h5Kuw(:ؿ:P ~#?_<8Li=z.mwBJ7w8a8Mj1P-fj#uO׮!$/Ͽq+Γt4 Ւ MO5=h ME=zBt^]H(U*lD:kk,K3$ XR/Z2$&+Z*4K<9s)Zd8y<)iʍ]AzXx7_l=h3y7 _|6/9 yvpXǗQz-89jܧJ^#.yL}*g3R|ȐdJ.cا Dv9v>R /7bl({?7dH^ OgNU_m*Y?.O ِ/[,P}#(׮ݲa_CcB9ll[fVKefgW4|!m 7oSWWR;_bM )n-Eh␦¢kS,2qB/u=Wɦ9j\Nam?HdjC3a k6,&W4/Z\B[JےmѾ2ߞh/XtO2sm7b+\TՋvΎʆ0>ѲlI$֥!qa(RlŶ4mUTe&#ʂ/Qތ vwyQz.K>OyEpJ*(:\B4lƆ$٭f%Ezݯ̏$QF1qljȢˑ-J)sj67dsϊ:i-l";HoYΧ'U8TCUj;N_nu8#ΩT=āJ]NAr2Sn6>aWoe|G,)ݧfwk7OA|)%y@mw vf|2a9c.]H!VPQ 1xBgJ 7-2IoNe|E4?v<\.pZ|l> 6 cO 7=<_jIA\e&^)4 :W\*[e_mO6cj~añAs5}]<wg9s|gbUBk$o"3{Ն Oby%:Pu0be&W9V5ʄax*GG#6p'zk5aƥ^8[+)[!W{M}gwEj}a=ڽhz=5S`C=g/̮yʽ@!zJ9PO+[ ]] ncHxo)oyGK/kiZ' --w ) /_]1\5{hf~u=x. ժ_4*sFcų#摮K%-aIrrYy\>s_+x9>Vo5`7ZO W33Tu {G>2E5*~! >O943 48OyJn  u#Ǫ+(my]Pu±" 2_J)+Wʧec (0dYmzzd/Ikv?T1iFC&qv!Y2oi4*@RfE&.iދ%,sM|fn9Vj)c]G[->HTwEwP:5 ܭ $#~ի5JNqd$Ne-A(|[B&xmϢS[ްBcMmB;cd Q \ȅl5 ,w;E[9hūvM0$/U ["Dž]NF)Sb~RMF)1)1tL.!]p:S+ɞwJ F1>wRx VwAŏ)Ѷaf;M? 3JSsV/ܥE%fKYn d %?BkGg#ͩ Ao({а &f6jvVJPzrv ,xeMVB3ݺUgiVTau5r2$F]:%Nq,([zػ@t]㑄jېjt9"r/S(|􍗏jZl<ȂRb.Ͷ))#SW ޱȑ@f^GMy+mIxDy[VfO;L{7G(4B%q2 +El/+w*Jpk|su$MfqYxu>hҶ4w:jRZ#v#ܞ!$#SuᵇZQ##'s4>G*Tv$UFrF)Qhn}fO%")*۾a8ךf ӣܥ%eˍƲ>,PJWb|0hl(`GIޱ61_{p1% d;>;O;/b bAA͗R 2_]2yoLZS:↚!t_.S[44]#Xa XfIXۤZvݶO.Zn7DQᱶvȈ-Xg w|[y%sYvj϶*K{9qxVF@ݠ mV<}{W4%!}2@Fz(cbRk#>].>VOcE&A8Q xӈ1tUG ̴@Qw <8C9}LswgPG|o;ItO% |C/{&' ʼncE U{zd i+&&bnljެ$XmX{Mzny8Ta>[@D荖k-' _+1+M^maX5|g5~.e_d^ǖ[w':O^:RH鯪*qNiϭ2iᐤ65U-A¤΃1ڿtE0ڨĶY̞ԆwQ-tעl\m3_c And!U'G,dZCwNXZ_x Z"5nTȜJkTMvF*F>=x|vOWO^\]Fj)qmvW8R4ftgnUw4;v4iG3Q>hG3;l{@jXhYr[׋yD6:e[1=iۊ5 jjŷ!\To,N5)'P!6rTdr"ďK%mkSRĂBzKL~D"VD|r' j"JW{yj32=S7nH6wDl=~/ZI{.zspde[vG⻖e<]k7*Z%e4(êjaԠYHz{÷_~J̗oͩ[ WRNSwݟQ7zf2AM ^@lWwR) lcA- v FnIxޑFN_88=z@Ĥ?r})|1ܮt+G`Z%mrm7 +v5Z'Cii~e׬}hfU?|fm hY {KQ&,l lz6zuܤP5ÚGEflf?rHjwB O`Q)J46ȏ*+S *PYdeԸ> q^-+=+~vSo`oChK!j6bQ]r3EQ"3h,aE[1UWdyMU14j%*&D"q 1\ɭ)q66=^ V-5uaVS_ հ\] nF&eeBBho%Ej44ܑgS(J2SԠv*3}5eKF(7}T/S])Ebv%B7Z9fW/((b^5-T+lrfOʌn޽xkU"_ܼcr=+ސ<]gxk9`'FZy )V)a?@pwrڦiڦdrit9QņvЋ۞>=*j4oED:vU 60,˃{}۫?>Y$>A8oE,ZWͣ-z㴉c.|ϟnxD~^os%ixr{ktTx7-镡i-=X.vԞݾlr =j+v5]1 ?q"[ 1#[>uRDҝ.pgDLJ{ ^Et+nZjU-=HGCmu??;9402eH7O+ mM\ٮCwOwrb{# ]YnxVnn<3dhȉ3<ϋ(6f2?mփ(Q;zȀ`٦e BaOVb96;D%vrna{7u˷LE ,^9w87u3[t7bv 7c0+4,{ ]܏'m?@ٱ9I`2=v1cfb>Pgz'aizCY1]nFnGsf,+NB7-)pX-+"8V'<@' ]e{<yIdFq:<<a&8;^腶kƄV\*t ]/O*DzW♐,l&w(I'ԭ9D^ s@ 900vA\u:$ѷ͓c!I=7M0t7 &` ϵ0ߌa6LG:龋v2 #G!VŖa̱е!N|? 1M׆@ȉCv^¼ '=# |Bg6@&:P1GA(: @MhRr l;rk2AX0t68t $$Y75\?~ -68fR}veσ51 [bHq&3> o;B%V6"hXlI VC-/qbر?Ѝc#}?݋̈y7?foDcFP04`Z;XZp3-@0(P P0vL/aYdm|%Y$蟍/A:T7-_Za1̛+(Bs9N@c0IA#tbz4#F1߃YNM62Oa5?(a6~endVsLtl|*aBW-XFF̡xa9*؉+y1& "ݞ>\ рFa~~`[C9 AggġB$S^Ǐ@d3>ŀ>B+؂$,?PQPЛkp!^p];_N(Xq:؅;atxU?bA pu YuXx!>;w. v'x!ASbCw`ya]f# cH2^QEF1Is {0(1|>)G(̋6hkK`$s Xc$7fzv:`lC F}R &^lxq)p2$˶MhDP؅ 0a ,"I(F#^cW,m4 ܎vM<$crr $`]:0A㸥=pVp`osH&)'ByXI< "쯇QJ 0~5$`ThL v6,:DV\ B0 `+Y>73-77YDö@ 3\ J!:c8́H'Kf Ex .>B8#,+5FD g2s^5v`('؆Kle@^XiM GsDŽ`@)҈l2vd& 0\ TZp [5\ o'0'^F?O< H&ʆqىNB_ʭa@/oաrY]l!ȊYX8b DKlay`FQaq1t$$e-D,(t PfA Q@J&FP }pA5<ghLsp"fHY]=%pVGXl8Q<ɕg1~FZ0 9 >X]!!B'D0&""p;נ\bl}ɓB#Hlg@op-04V@)s!q ]Jۂ>6z)XH62  /7s8rG+#JC d.gqd[h@=a|ݵaEb5PAMJ`D`$#촉5]Șga&+= -!F!h .qC##q؇-dR@"mF,C8.!ZC{dΧ%'t`["!UeHZ!BO&1@ D=?}HvN4ᄍNDց^E0CeS {! $p dƷ['+@7 1?",BX,dBlBhǐѯmAAz NsZoR-DCοw.pT"Ŵ`'.(V2sPN4ٞ߳0'39|NlYXѝ3BkY{ɪ=c՞kصg3N+!M ~*ߡ'>~rArӂo.6f;g"#{.9\AwvKiο4+< :w$+⫭v U׎af ^UK~'/gb//X/9 8m/x//ȶ٦ѩkx:X]]8]9'`]'=1qBxF*&4VH41M!=Rv_B1?@1v. 1:1^ܯf°w?*]R1C8f/F+JdI3;j@YK8fP#(?x/ʍ4,,S> 1J-kD,Fq ZYJcJXŌd) Kj$ESf@{E4LQGOp1Oňݧ,Zo~}g6?> =h/6]sM7[=rF>iئU4cن;ۑCx ZZB{-&6^7uZHuf=Lx eT~V0$xb}Jxnoj>~vE˟_5{Mԟe7yv5g{U/=%_9u_ V6|ZZw|',q-=m&Cai+ ]#~:V{quvЍ쾈Czg7;moF(h XeGH&lf"6h?V9Gzlfٿ"J8pbduH(L/ɀ@镋T,xSH]j\PRmXY@n_*.dG} +Lh Ή^!wzD.@QR\"/0끇vG;'^LittleCMS2.2 Plugin API.rtf}m6Tpn="x9T2=df/m2wjn!a6̙LIuK]XT+FxFLqE}fB*YaYrXIyN:yҴDzm]^ŲVM\kjU.\YUS.Y*M:*ʸm;9FY^3kٖpM\?~}.Ye.ґ]I/o˸'u@R {!2/ %i-?$Mĉ$RWOyʞ@q,"T*IsO#*nٯZ޹(Bc7!9ODO^TR,xSN$=w-S*@2xH ˗0~59n\Ei5 ylj 8D^ }o?6Z΃%~?Fhc;}bdr5̫d>k X 1 +hlMl \E58h kWpa[]^X15+LW6vgRReR ӑq ]F{R!0N[=r=.<{=g{CGK4HgH܋ʭk2Ϊ⩦Eo,jB+72c˼X&cb9hQKp)]럢j=^IhFdو>*3 ;:sEE-a;_!{2͸^*QmuGkgϛeTCva?DUA& {(hlwweU@W4}R5ޅPWe_/gnݡz;4de|+8BgMIJJE&?nMp"s8Jvu隧J-ɴ޸Θ ʱn {v)4v)5a2; 5FدwkUaiؒ{NC 9:۴1c;j% ռTs0.YÁIFZQ)25M4[+۴i-"n0 ݦpؙǘV Fdw~*>鵻1/:-hx%̹̰ӗ11y|؞j3UJkwd\4TTn.QCt*UjKU`¸D[+~4m77: Ucwa#o{1dt)dqEcNG"2NG~_Zwa:2:} +`h9)~/gD:T\R.TN_+~OVN/g*^7*usRuDD^T.Uwݕ{@zgh ͍3A'u`\=6_`O];[]?wlL>f^-gߝ.ηC7[i^Ta/Rɬp).D$NP{xE!N'iӑTb޽.dWPNbgUJ@-u "G,s܈JhSVTu+?8֊qZab$[AcQMݵ :㸊8HHԦz 0mD&G9@{D2Pjfn3\+$K[q&ٛ1IecgJ>\ɇ; ]gK3/av BGPvFC'2G<sCȣӾ2q 2Τg󙾰pt)#nw{nӊc\T6*"ڢ] aTntoUWy-/"[WLWRE[k>AM^ųwaY=qUXélF-K-f@VE}a^ؼzCbqW$Ky"۶ՕYXf5)_&PI^$2ąe?#˖JMo4CZ'plfK-uX6cRFꕇ򊪰}9FnLٽ#m?R=*fg5+Kq#9]2 2KC̟HG՝_Gԝ;ߖw? ^b2V3,S& qv8-E hb> UCB)0$g1M' W$pGK<ԩda?$*!JaUeFeRfX슫T__UMiޔ `Ri\8V>EA?r^, }Lq:.ҦϭYF'36Ju4OcI^v7jfR~̋r[JB 0G).bcG>\n%գ f,}ly5f2}k~TR$%mK6r`ȃ 0M׃^^E򦶾$}8i !gk1qݱE$_y!_ϫFc), h;^ҨD-EQGyO0~ŏz%ophaYKy $سXX j_kQ#LnK1d=pNN>9Ӆ0t]"/ƈK]½y.޽zK? .Ro-ZS1`;hr?$>$@Kf=˕2{gy&,-Ug'z$~8諪w6GDi68u8wLfLs$O=yo ?~tRUx)5u>za7tU*b~:))[+{5BV˶ql.,d~i}03\0iNMK^?{,КsۜU{UrC#;hRQ' wkφ<.4ǜ׏H'T8Osh:"UŚtm$ź\/;b*Y 7I'![xqhLI !/мhzN kaXBC6EKgΔNUnkky- axe,ہ5~Գ㊷',OP2(˷Ee[~kiH;uGsiۿBI'N_'z8V(Oc"eGO@t.=Y{%ߖw #}Ł;1}'xHyubK?J.2^O|͵8ʑudaPZ浀1c%?o'ҧ]}EG~ѸxS W9prޝ9D:w qy{i^/ה=rcra+?&}u~i kt8ԣA˸ҿFy&ṟDa!FfSc,Q ֌v$K 8v"S%:O)kW"˻K0U=\]?xnReog]B,Cn2z<>oVQY)RkaX%}BzUDw8ِy230r:wUv[ RZ $fӁkCU)=w<#|wR/`9y.w/~@Z/]^N~{0]z7^y-5kֶ׵ԴNVK']I϶ǝ2[(rڪ"jۅS,4tiSvݙ_p+ 2}f |w]3zqyuPKa/Ya!)a'A>F!A _.8w(ip? cpp#&f ˎO?ũ4E b)4ۚ_ +1];уRG"F}գr/5.%&Ӹ[H>No,0"$$[0cN>-a޶'\um||>ゕiM}0/F8$͘Y$icN3F:O#?4èi$Cy$5wD!uǎ9fX±|WJ3t$6 qЪaГsq4s9Mkir=3>CkDzQc9v&o=)G(3ų̏yQ֓Ƣ̨OtQܲlapqyɹئQϏ~F$˘WYH_id|e|~c 0RE>cZшyz{ahC*6 p,5q\Dc??PK7z6yе $XhF99;IF=_M9d܇SJOI2 e$t~8%d܇s[;Iazv?ΏI2J fp\WDܷ8|J&I`;IZ 01SVG@ Bbq8@6? OIqv^L/ 4wD&s#G!NÙdXH{NÉUv%;":@-hN`s;nniy4>S|·y;Ľ w"vqj1)b#,} =uq%h3fc Neaf-dP/u}c}1j'ߘY+lqm7zs׆u /u$o\sϜI5PG >]qs^{n:0IrtaX֞7pvMtYvHtY~x<ȜCԎƜóo2{eF-rzzdE505~x[0"/yL?5}1y޾) ^|mqKvv{9i#0m$:8G?2>cq K4e&l4\c4n,0F7e yqFN`3]s]cTq '3nW.ێ!l q\HtYŨ{ڹ3z_ԯ7kOH} y `ڊFa!C杛fK{X<#nk$p;4.@k3ZfaFG Ҷ ,&̷Į':53nASR5Ȁ4[Hf$4FxjAYvE LҼnhgЗݗfnަy:{M?fn,8 *ڒ+?57MobAO÷# ݐN j1xcxvxˡ n(͋e1:б-be۳rpw`y-C}>C R#nЬ|XŘ{n 9T!vx-jֹe&!ԞLd9h|F-Iep1_:@Yn ,ՃcuCdˢ,ϫnEi[PA׷YM>Wŀeʢ/M ф-LJ>Z &u=GAr}ƭz ZD^_ϫսu<YQН0]*Wep A\1kb)5:oۂ@:8"pJI yyaL )(UFvp SRe\ݿ]OZB"`ME>уFBy:W#xjσE H\T 90% F< Zqerrty'pT ?B=Kq#ՀjGjȄB:AN]K$>{/e{vhK.sո`CFC=>T5e0Ӷ8W1+T[<[}6g2ͳT,׶= T؊ pGrʼA =Lʁ0JGGYu=۲.{wT9 URpjO`4X9z,ʮteFѓ05;`.g `˾4ͱRP+\pe 'sp]LPKwphd:Mk^ w,akNjǵG`(WiF\X[.:8oi8e ->a Z+탐uuzP]AWi2a+ ˠ٭P%hz5JW`GX_uP"P#@ޔ=DU}zKp"-Reϖn v7e*ʰb)ys lu@0Sz2QBpG(ЏȠz%Uz0]7PQȅQ87OHRl*c~< yj,“W˘:s8_m+N dY:{wehB;PWl[J(WPB.GxP$Qe*"ubQˣIGAEX>mm1Ĕ>yZMyÛjRQ'Qr&_MOAUFn4W _EUDE0xV>> 9 Hܠ6b9eφlUv\GӃ\D''(vW ه PȎ.2~0m)]%?>ѲtTV'2B:@wUB2Gy{ YMBMz*mE7uУ^wا=ʎk*S֥߃Lx3W^Iq]%u@b,tMGi32$ sq+JTQAMKdu^gxz!wmX<4Yt!5_;}d:q}̓sfNS RÁ+5`GBpT uoȺX3{ST!P̲aPSMTL\w@zN V3*M %X3߂w84A4ӈ0:GEBUA 74o*LOĩsw"b=vhy#7HMW8Rt * YROO',r Q(xSAB AP`LW,И3xʪ6d7Hm#0]%fiAe$:F滮m 0r8[߈6P3`wz[W =нy0Q`!۱Y646u9ZKxӕ(o*p?S*Em0(tXAӡJ,nnĜDscyÐ|̗hЄ78MO41vSܚ7];hXƣbBxBS-,`з w!@¼լlXiΧ*.=0=RN2بF@` H~}*Ql:g|FU]p hc#d`Y#x&%=d6K֕ǼXHؽXGE v&m_Mq2"++V5~Ç(Mp>~KqFxK`c]&y/蝶e'lflB\yQ2m 8\UE /8+7=pXqa_m7tkyP}*wHN㊪ H 色eďold\DiLm:*,S%YLij*f*ZX}&FLV{eĸj{ Y-"ɫ RUA Qv6|Sdۢ*\D0H(\ >Hsi d{>BWj0Mޓ/j]UI7"iv%dXH~ ;L ǰ&rQt.\pE߷Q]GT7*"P+4 o~\."$T 4 *]H(XrG0o IR}S[NF7 *1gT6a#˙LlGwWDt5Hk)SH! QHT9V֧G#) #du}IaS|j h((-YZ1WOlQ"[o爑;PYgߪKPZv >ToQ#;L( )6~a Mbuq}lXݜp+ɲ aF˧b_KJ^J:$+ !7ސO0ۼ\H}qAtK$=/5GIxb'1+mual],sr K2;{~゚ C+tLG=FU<[4~11v׳kO>HP]x5@9o OMqh.\n嬀-ߩGMQ gU.:_n[Y2)-(EAO]6;;;[5W73Dd[4hLE)"l鱐de慺đJ:V ZqXYgq".ZJpA6aB=n9S+{ݼ`f0~߼>.Vxzw wxB^/MݭI`nOƪ|T_>03?kU.~~,ZWq}VpefKm 2ƗI_FP E=is6[k!Gl!jmguPJǏ:?۵ǞQ2uɎƉX?fD$t^XVZo\@W,o`Y!_$&HjlH^~Lt|VoY_8مN@4𶺏R/;q,C((^ kb |bSVZd'JZRVHXxLDP_˟_f {4Ȭs#) &#HQǎKzUݏϾ#F|Gv%=>>~=q*!ؔ#(;#IMY|ubЭD_L Qۋ:L酨2݀Iw"Sv\Lc\IBy][GFyrFZƋ/O 4Woڎ5h .VIW2=*[{p.g.gVʮy%f0uxs]ઔbeGwۣzzĬw%3ݗL :~vSƮI=f#̔kK2 xdn|%oɳ|9 |~{Ƒw<Sl&l' ,*"d˲2w5/idhxsSՇGmcyui⪿ë/4ףPW_[nRYBPQLjLF:4{v5uec>jz8?ۂkmd{U,q8K4eO^n(!t;-ټ]T(>x2dtU5 IbVdzCg+ vJ-q~ϾzsA뼟ť Ї ;2Jk{𞟤'I1mtZ]]x[ulOKNċ/˘s1[xC9p!zbkҟz' {0Y+!!B/] w L]eW[9j9=ie uL̇IGȻ2j7usYMOa3ƣzt~7|b&_lj\d'5+l)Put,`i*TTG=N';6Iش9[5nCl &MNәZPGfnn Ї˗;\=AKzJ 9rhNjKC\.b(*8b|~k:-bW¬E!,F5؊[?Y7A ?䶺rCwf̴|ȱavؠč}qC}qհIhJb5ء!qBcx'ht[9*s[*_7eFWt0 zǹST<{~0rM{TY+~t!:S8FY:xlɟO)}ˣG57qW L~ʶHCجHoBƚm?ß+7NWw8][+3^NPɻ4[zm kٹ|_0c۬|8<./~xGl|?9@Yw[y:CKBnċ4^.{+.vK74b`F̍*7ѷ@xX9%9aBwub\bŖC[q9qbo¯ڍZ-/?-v[NO%;5Ioo ohTz8h^|5?J-޼CXެl80 iRշp| m7R~BN/.zuL}suU8ȦEƹD(;!t_WշtzkiWovW=y Sΰe#G=;X#bTm+ޝ & M6-;uc$4V"+4ՏdEn d*GX]nBڭvno~[^k znzmw&:fvÊ[#ŏ~13+G8?m4tؾYalq.aqf1:}󻻣f-&Wߎap=GGo^[0!ڬ,8\qKOV!)Rfb<, pMtVeG/gq9p 0X HȞt TEEK<ӀQxH.IMZyx*H"mQiI#mJϰtF׭һ4 t 81[ O'M~T` Be}ɽDc?V\E%oN7i3Pfo`䯆d" 0>: 7w\»>-uĕP իaFW^b8fZ2^}q>]LU\ڹ%>v9Bތʧ1Ӥr^Tk7V䶚Ss^,?+7_uV c_l&N$Rn LUt|UyݺL8jꇺAQ}ߺ]&{4u2W܍q\a׃-r=M:t)~ه:|nT]O.Z*Wޢ/69zя nاs@,ZwG-j_=E.ۼotU=]QKeHV@}\ºU#tvR( @'HF.Oes +Q*0ۃt0(6 6cް[=F2b1"@#^QЭcI&?k<=rO)pաv_T%-T7FrKDR~a5AOgm:pn',ߋ#4S$z2ݧ_`ƴb+Kudȏ^~F1o]pO h4}s/gKz3rMg-/')}5 d3uYzNe\]VNf4K׃)+٧TpslL~T<ӊ'~]wnN{/iӤMF=}mM=mM]S~Q~P_Pc,}HH]__+Ճiu9)Sv;,7- +sի#Yi)S W/*7JݴeVɒU2.?e1_j7Nt`YCyQ݌&o]YZjaeNLq`9]ὦRnQ3[Qӌ<˗qBڗ߇j8{\_ 1-lۜ={ffwoۃ4oA0^FStp)ҥd0}WiY._goǯ_Fkkr&f\\RIxr;&`h|,yRtW4+.6}bTRپZ@x2q_s5Rv /^ױJHhp\l(J`,4&8ꈛW/DaBΫ7db*؜# -JUD ~;Kq.!ȔD[#CZf}~4:8^{˥(paA0AR Hl4&Ap?IFcޱT3Ǩ&2ʒSQ=\ltJYGo VjфIM js<&0gY(A$-*Lp6#颀uJ ,Ya xSa#:3ȖHiR1bhҌ RxQZ y*2N)P_1(P#*Ƙq#䌺PV2GŖ.id6z"F Mh 9dS.66`kC .la!"㘈. ӧE$%k8R+ U, : Ħ<-7e`[EAoR|%Bc>qmp)GR}6M^E [Xs]G<Ëh<-AIMH# 1hxq~frVdB䤞D7.yȳ8ЦO2Rơ@ (PhDs)K nf#@`_ 30 dj$>m]9H=y1x.ʱvPvIF4Λ5+utD` `Z7@Sd2X &MNkT-TqxLNË\@4XD (= (ȎjȈ H)x2VX5r!r!m+}F 't g$C<=pf *($V, NP`@*+l\IPn:%V0H1QDDDf=,qʓLSaFAv:7eEA9@ne!$!0B*!R{H}EpcЖ a%fZejCby¹G!  L'2U ÈL4#bü$gv-P:Z׆tK"E$`JycBr l]1 L@HDB"%2 @DɜDȥ&Va# e%,^DDMQF(x \-=h}IYR@+`V5 N4h•; "Ud|T)'doCAZ Qۄ!] 24a#C$"4}y(X{4l ,-fvPJR|i * cfdPPyHސr V)hy|7% 0DQ>P H$'S2D: #?c.bg.XAcH'_bmL"gP*`5R7D"}4I l&U`\-1yB/T@gEEDF %2i0 N%O85| AjYW < j@lDj]XWd&V7aJl W*[8c1/@މc8nւb}}ji Ql$8`L+p, [$ՠ` z"D ,>dSkRI8^ ^36ռZiӃk$/ 6싪4Be7 .@`"a\ RB Ue$(EcwzMxN+z7QhI3Aخ=Vg 0 UޡUXtUOE*QB1hFVIc.N``4 :(wl!X "Lcy^"UusbD.or|'Ř8 $0S msMT|$ Gmj[IU܁P03`tj`%ݪi4 ĔP* 0{c>Uߗ^XkyZ.4, Z`lDY KUJ5i:4!x@wS3fd%Хk vZ*ы02X)S,0vT y1Α9u[vIhE4+Іi*ɧIm5[ɋ@C@NMY#Ji `y&-)2*rAWM1q1_}qo0 jo`LuBtQkE-L8tAFӰQtWV33-|$H˦ix:!)6oS+D4srXj"8Nb#Ѷ^`KH &r>xP w؎F2V^!Ū`C,@|V;c eQw@"Pg*̍JXnDr4pNG zx?':*uå(fBZ<jD3/~OUזNX|m^vu Ya ܏Dn_K]aHcaO~`oA}Gl^N/&5\+iҌ\;=`SE'q,0 M9b̠eW:%a$ pzYFBģPUpoj2i*A,@k }YTJikcy;ƕ˅c}as@c (rAyKmLX[6^a@ysZJT}3á! }@Cv~%a3" xoRbtXnp/H -Gu@Uobpx'I DCɅĢ 3RЮnJpB5 vzY6t(e)a?sע~Ylx{RbE?9J^lBg@/T[$b8xQWN"F]r=Q?@!Nn0Iy|($)*&,Rcn<=.ЊZ)a3k1TAy+UBvF[#٘4? -F[mKA};rcA9m KW`as#'=x^} Rt!b^Iń*@ਫ7R&fljH`[@p;ס/1 i1Avx x;vv1@pcV?a˄˥̀6l,ŬkHm!P7(ePc#@am:D̙Y5lBr[9 I}X ЍУׅP6"ҟbkI+1fya-'ѱ5Z7s[WhnۀhDBU72>+B|P)mlNx-`h>/a/:+V_K'nA -qxO ~Ws+1F Dj pôJ*6\ֻlt F[Ũ*uƊX3 -'Tk)'C}<5bHuU? =U0yP<|0"xm ͬҘ^=%Cgh,kTǭE3">w_o Y%Hh,ܗFaA GӤ0W ĭ?R kxg.QH֒3.c5 .lCƥMcƨ'4<)h^!V-{W°X'Lt`46 ua VN:jjXp7FqbuC4Z f:R P@nW;؁@y_9[{s6+FXi'7KAV(ZuYo@v9uDEp#2#:Y2fv 8q nD:B./c20Tb)ϴԺװpX[1XWrY-f:U"Z\*  W,o9ݏL0`84Zt ¯pj<a 21Xؘk</t9 j$]>6tvE u4K aT{3q&ԡGUnŏQFFΓ;eDw_dļD>'pa4U߀MW<7#NCcB!Yzc7{ wn֒3@0RS6b댸6Yjff=WBvù\A.F8湹f'.dtd2LBBJkFٶ5JG2Z_h";о3{92ΡR$E0gIacclHȭ+L FZ}3(sSaV 8^A(nbϛFs?gL7!'f}&v eOʂJ-88bCά$D*Q,G hKmW5Œ%#-7sP\L7RzRH NM$54Pxk$j:0j,"uC`cy2M08~p "pbd[w(5_)Gd4/L/F!<*51ҴE55ҭc_ m5hAὪQ3TxA 3!l`N`W f☻lrd029̴j$S!jCgMkÊMᆠyT}~lβ lc+]\X3h}@FoYuwF(JnDMFGa>T45ldwsI[/Y7-ps{7;N`"oPń)!iX&D}t~D]F&)*pjS+/ o[ +QB&K=Ț\QH9}U !O7&ܨMG/H1"yhD<[1ED  cis0/QS̨7CD9A/; ѝMLK ujc®KڍBՈrA3/3C;LN^# Y"\[m=52 [aB]ZVE@&43oz':}GIG%C^BázOJ9˖^(Hi; d4k݌`iEҲbŃb#F]iQ<=A۔r\ibx48g5^wz'r,_˒ZȄ+򐕍mK" s#4J7l91 Siyشz!7Ve$y3D_:zAPzrPes!!X/Ng_ٛ+%Jl2<5]E@#g\Jn%[n9=k޴=9[Nvbloraaex*DVaaVmͿOQW#R1jAT`‰-2jyT;hr PfHͱʡJ lƒX< HcMmU!nCP[1 fA(GGmkJ S V"88nb07 \#w,ۺqϤI#[a1syT f `!IRuT0ZsfM) #82&DYٙsHlduCetilĬ?WV޺՝² יC6Fs+S(k'reU䑔v,&1͟&.0W C 5`mi/aNEJG龈6 g2]|m΄!9HԢ`'Nppm bflvUWzTZ3LrvvMi# fu oeJئX@3J XHԁ\H;sZ2 2mDqt!-u)B4oCQ, :Z70A/ѫNIFT&c 0;ul0*I !6@~WqHjI!H|Y%,YBY4-<4w2ٯV[b4Lf#9Uoc{>~@{~/@`Űȯz >]uۦ=;XY-A-P 5ZƎҷ vDLJRܻy½^V.6ְ]{n}mj̨]c |8fi$Pc0~0qԀ:-jta`kA.-R!\XZ|j2 ..)YKqKAP'k1K6Y~!xyz2Ѓ"xJ/1aP Jj@P=}RW:!1i%4X@p֬G` g]0>>A[  [ "e0\n K E'\>Q,V)cE䢢JZ,P~kE=d66-b0ĥEV} aVpF2]C5rA2Uz+9 r%PbMl%&VFBnѧ7 أFd}y^y@geTy(LV^7;3 )~M0צq "RV̵9MmRs_t!q.ź:_ ,oA'́f|X$U#{X}mtjM$SKMXVkBBVғ ?,88Џ04LXja3цSY^Ÿ1f21z[}%b?rq8֦( ^+mDk5C |+̑_nf2s7Ko&1&|Y8qeګZcG6cչӢ-J m vu/mz0n[g9ȼM+jS\DS+м1Wda40j -*L X'`cD;9Zthd;N)"4%vF*f|N,tmV51J%[f/IU̔u"V%kl6*dݪXU, y? FL-ĵFt cdlfwk  ^tha;{ע9b|=ʋRY`FZWpOi5FX /[4YWڕקo ntJʪ{d?t(k_ʼiR X-@[u+i[ce!:oeZ8XF-l kd#^RO#< -VE-MvjђG mKYrZWquNyA wm X{i̴Te?*uFlQI RF>Ea&-Fto[1= {E0qE l(ےzpsYmD6jt_wQZIBC ;l)ЃgF;;uvMZ-@u=.ɓe\-G%ip`"T@0SՎCɬG?n z4wkY](1EѩBLUha(`<ew=f*aƐ K 4D8KRڰ܌N+,# ۞ աAkI"%XϘ86vnhhxкӁE{lV䮥Y3cvXIi.qİZ_J)q̗E7]t9MGO+el4'gpXknPƺFH\CLvŜPB$O@4BM fLe֤ND;a@똴.I/904 @? zVX'R,Pf-9F,;6q0!-육KOVG2|;#{a7\x30e4'ڗg)kdͭ$+KmmBtI :KڏYX^2aO-j+g-{5jhٕ=w?;V0 Ob&s(4rLn촕+ٲb` jvo~U@J7:g.O 9+2PPdR9qsEwtZ>©5dIk?s!m *Ɓ0FgEUWoD:ɔܷFӳi{@&M-LguhKOm';jP7MY5Zl^ُs !|CYpRYEmO䒎LidCi4U/ԬlmN {2mf\'waY3|$8xA vOh,W҅K pIEfBy}D؈C3NѪ6m\m0Y\LjO36 r6YU@!8EM:O2M~+'uFLojl=D*v"^VX)[[é TԣYk[Y &m]GRz^J]plLkz T>f4Ye]6۲+[4Wwr09XPJvk q{SB<0{ݎ#C, dW}L ar=C0n$4),h3:N~6)1d+6npȶarlNo@_mLl0ADS k[ T2[`PF5lN{j3gҌIG37A !v$$n9Wvk6Uv(L3nhnKRYVF#CkS[X=bZ@ߊxQқl dq;E=v f,+E=ɰƍ6YxxM,ٚ}T[P>T!vs xQKe=E!6N.SZ;cM1E 6)zCј^Oni`OMѱe >:+l[¸q=`_;g'xĶo-9C;4ƒʭK"{ =J,So{f w> $+"2%QA `e^lQqdyx;nus0BZSRȍig/†AV $D[D|-SCHi*LmN4USgD?ܼScGtYnc6^3z}zfh98> HrM1gncDqıo}^TZ;{cAinQaZ<îaS}^fl{[؜cַ{k|@0sZv\6 @6郄)<3pNٮmCoeFƯl$e'Yoz3CB!M,@؈:qt0M.ƾ*{.h)*zÓȶrm[jl#y-Dgp6EȚz Q6tZY=F=6wF}7(|5,{fBZ]GNET"*0ѥnr2ۖn~ ¥,FwXE\l%WFv$7 O,syxTOP&{+w]hoc,CtFy5Akꌙ#B li0e7s͟Ek46VTbKéiS*9,Il-mS' `q-`0x@#kޘ fP쏵&oil-f iLG"<M-]Vc꫕IѮmn*Js hT4_fUS">T@hV\ ,-gSMH ("|A6#"ǭRт~gY=Poմ",UAl3D ^%Ccp)zl6Ң:Bj`IWM >U=@v7s|N/7XC3ͳ:v9KrIs)#>;=TXmR@QCq E3?M٪F}2ZmEc҆Bo]hPu:BXnZjuYJ3Ft^e%K u=X̠,ʳQh'O]Z 'pŦ=Kp.VS'@9Be2~,tCg2f8?5F}=X[rc2u3-AeȍYD 8F'q`g/ݘn,}^g]F;ĥfautZbXEsإQFYN2`VNfW vAi60Pe4Fi3 Ifv;Ka$AmZ=1Է6ʬcKj+z,Avuc`U 6[lvO.R/-ֈN[ sP*%H+YbLS؆2*΋;{ۧ,nCM|TA&cSUXUFAy)b;nPOvNjj4F`DoZnٙEO K8hS(ަUtrQeIKU=& vXw1͛R] 6DYYXaA :7 Ս1qvh1+P4X2#)5s"<*`@Q(l_4c3 Iv#,LtF8f2\6mnsUWcϺyӋ63op*f=شƘ@DU,ΜtB҉|O|wqݭv7:X5 @0)Vxp&:Έv$ЫflQ8jj6 ȵq֪2W!WGSJbNX~Zlz|;󝪈'RY_^vf#9f<Q[á+z,V\'h3yU6-%i ?#lԍ}nܒ "hu9ީ[|4^ڂ&5( 5,'-콎RٟNO~7{!^xxJ{OkqgQl t aa6s;>@ٜ$mbc(ik+F9Ɏ*9g "n{3F8blSjkpFjw[ hHNW>\ʮn%"9jsHjG?`tgpVrux 1cz@QbMA~)#aT&=IoؙUx}miXsT&,cG/<# n²CڻeDh}݈e;Sk:h鿶94ȯw5xp-\6<sLBͬ(^o,H8V|k3R*g &Rj\%'gJU#8CwB `b- q.)4^%4U[Y\kT`Xg l3WUqKSU,Řo,4]'t4-"B˨XmɵnYcUgSq?'??ƿ;?~m?q|O?qD.˲ن1>&??MJoV_9`Eoz;p.0aA߭8ncstQڲ8.*a\-?&ԩ $sL-Oi.Lx`!2[~o>Yn)p졨O>hbno_Ʀ|k~gu׽8S;_|m_7~eyTMƎ_?Ygužœ<+[urnS˿{mnSo?W_1ܛxnS˝(unS"?fݟ[~rp+s˯Zܟ[~rܟ[~^[~rB_1n|enS _1_1ܸWL-w_1_1^_1y++znSߟ[~r-ޟ[~r+s˯Zts˯ZM|enSqnS˝D|nS?N?-bj9hWL-wWL-7c+unS+s˯Z+AunS˭6?X,-bj9镹WL-g-bj9TxenS˹-bjs˯ZfzenS˱^[~r;>ޟ[~rp+s˯Zns˯ZUnV^,~"~e}|G*Ѝ?tVhuVx_[cǔm+gbW1i_':)3~3h9Tx3L_̾-F CnBUPaUkPPI|u g+>{:L%V;Bh*f%cRCւ^ gpz,׭):6=m0^]4Rt(#@,Njv7V,L W1MK*w>/q(PSCGyrS Z?-xEN~SF3~g}nLO;'o(aVVHOITQLwpgD*LjL*^0,*א^3z=L7/Z7g$kk/%;xk>k=~~oZPQRiNAcAbV=$;>gpzo<ʤ;tHxŖ*ېqU-ݴo;G;x; Ac[Z =Kfӝy(8/˹v<(??ޔm%7)+U ޺!mg z1ST$](>_LTC;RH>* M$.8^zڨOxNP3;x:/Q ~z\ evL~})N:[~>~R;ffvGš@ݽ'lS ^LMdV*PxY?Wvp:?MbG2$ƺEpBx)ZͅYrvԷo3uTp|GWLͽ`FRIg!\쐉K/~9݉O>Cן ~(uhn<Ҧ vGJ}7 U͓LkWr*,l(ECYB?3Gzz96:d2O65_ș.):zH>Rݓ&Z^W'/wtEG kd ̼̍RRI9k[kxc#2qTޢ8>[cT5J3GK@ ',i,;A=\r.E~ ~ge|Ngp>7-y N^B`Z*o کkTjqˌ )9e`ؽݔn `⛼G(g=cmIe߼I' aI9UyJ|+?vY8̻NkmG=p^Rsv.p 2#L|ehLdP/]M~/MVf*~>%>Q8^nVZg3xz;˻7& G'\AܪgyRwZc\P(Nɚm2'ڳV!@eK";Zo߃ϦąAV\5Tl iEM1\0g*MG>URdMrVϽަ½Qyh''|Q[BW6ٻ#5ZOg]&ם,g{ҡB;"7JqCg^j T?ЛL).meSF6iolRA(C!'jzB?3xϺGy{Y8i:#u{ VR"c_3#| 6F}w/+[-7W{q2'\;hN$v[brXf4M/F"8{ɱĂ:Z@rK[ZUye>Ѓ{9tu| hv*=d`ɮz 3A~Fr%vvNZe?ύMvvV2}dEly,kl|,Fcul+ߐU)е>ٞ{QWI | A3xd*u~}F=)džAyFycv(@yyբ#Bԩ9mZf u~ ]oQwO5p9\H&X567WUvM5w4d22.\b^::5'2fC?GW5;Nl1y'uMC;n>˷)\! 2:)ՍwzL;y>?c]a脨]lEqќNXM2UÝQߞ%TK5;4U1 Wh<,92s_W>AC =?Ѽs>sfƎT6F4T"C_KsFmoį? Z7DJ2bkr2eaē}JrTug[,S]eD=oevǹ1;:;ej;TnvRsD B.)uUBٽpu4U2Ye!ue:G½CVNe4\peL8|S!gE݁H]̻Etr=08I鏼WTn#=Gu7Qu[e9瑤=Lkvd˺&x#ڥaF 8恭n'q`=Yv(0!gH&oqG.oXIHJ%qTs!K!jCb^O}7{FN^Cr=q^,|Q{ݴNʲ[+U?O*f%yY=@Cč&A~ly;q*[K9ɶ*c)6a9(FyL9!U/;OLz/G1;"Z'0[ew*={!F?*fl;1g:L{*<3#v|d?{@=W?k? YO;x{>by[wd~zZ,>Fs2~){z,u2>ew} |﮷gS}46ةqu ׈7L];&s|X Lpo}uہO]F杼 l[/sF^@(&Wr;o8Rv`u]YM7O1׻zMV^9o)G4檼rG$7ji˯|b,jUƄ߃t؃e-u8uhGzdqj'P&{Kȑr}Wmc8e >ӯX룩Jۃ"Z"S ̸/H2e\ۜ,_#5+z1UݪsK&{i~ ]J_b_UCJCQIǿS|ψ| b=ߨݯ j@iz"NJF]Jwۏ[-|H^>;>noli 1taa[I{ל3j\I M4G3'<>>e]9o 9# :v ﳒo vO*D{%U{WS=a$Gn9u^Z[~[k6g9դ1#޼^Pְ/qV9]={ݗ>~Ob|pdvW"Sg8˷_YgQ|5F> eK$t@捬ܗݤ@XrS¼s vVd8<;Q (Lɛ~?is&~~[5cNÉD+?_?{¯~JnP@ qd$ i㦈Eӡ}L'Y% -̭wV|v;jsh-ɳ{>b]平vq3ƹ[!!4~Rs, F8(##vPG/ jFFX[SRYp7iH)sֺ>幷;qD>@hv,÷PݭHT(2䕩rZ!x̭:!m;0} ^wpxFJTe?0WH~\]快9w mn gKuQS5|9.o5w<|?_cqEh!{X/n"JpeݙˍW2EG-PH8;>i/4QD}==y?cEOc#pVDnt 3N[yB Y^KaԷJ=SG M_ڽ?s=^.{(XդGL-˸Lwt;0ij>Qs#r'wUJGQ=j"1#}a|zv3@\Iݤ XTjúeb[rt[:WڭZªaʶ{q^,|;ݶ ܥiS7 04NT:(z/(SyC2I;_Ί &O٣[uD1r'k2|dy3u {}{US(vÉ1%UV9GnED" {d|-) y={-hv8u^r> 7,^C H'ʯ9o?7#$fZO0hgk9j{Efǩ7'vSV g>HoZSGx`9II0?"\I{xƻG:=~EwȪ|CS?yo<:캽cCy=E@"53Fj:1enH(ݤPFp{^ߥRyd0tdL}:MR )ClS󤅪so21j(ױϏ^YJՃNٻ f9wxdr\'-u+2|⛌7y^HQ'vO,2ˑL?!.9dUr4y-|sx3:ƒ 2_d "P2 + ^ ڔOK`^qU=iցOx^ȷFV`wi)/娩1^Ztoy>:OVag4P9sȴ ͓ԋ MsY̴EoH.;,D?}=!=[٫_.u ^7;+HO:[mSY-Ke%dwdX<>{^<ㇴУP5Z&[eo Tvhn<𡵻m\#*n~}G>&QvOd{g~I7ׯ`(j7y5j#zx֡#'1Sg (숇Op?`*Ʊ۬&н;nr5qÎIOv{G2Oy ?Ok^31mIɺ>:RHT?y1ʑs'Py㛦zx*/>i.,GoBMfщ-{g½5A:QW<@zp+ ?F$4/X.fG=oRQ3k;:1M8_>񒔉=+";Rɴ(wrnYدUcEd0BLL-~#͡k[YPߨrPKX>2[GLQX4?Oz煛Fr(k}.k6H%nv*DsN;nTp8{L^gv>z%LzP~މv}c|i8r$s1gWgkK =SB7=7X)=(L-9.KyXwjrs^?[y >s" f}P9"rOI*/yg (td枳<:w>vYW3[XYU5}P_qLSbՂ]a;4}s ջ.{&:*Qhix9:47=Ӝm NQ/1uNDןE@iAy2#o8KV_z>?X|'A3G5K?藭ǜl+]W#҆Խ=@[,OPg;D5QAg13;|QgϺ+^qB6pgҞѣAnvǠ(@d)chiBJfu*8JCӎNBYi) I\fgLgVgTZf14pMmsQ[ yQPz'N!3\obZS.rF+랞O3 ebKR.=Mv)Jy|e-bO1\O s)q0V=9y%\m"3D8UǞ0 eH& 8nq1` y*3Odp3*J[x.}6y+?7=h _YępwqW[:Qۆ05Ԩx\+c)1hx`tgH.qL&S19NK)3Lߪ9>hO dͳg<-F<9yԞ yUqdf)`6Hu!u_)Z?dpڥ끐FJ|,w_TrZ/[3 µvT  =PKpWWd,n_'ږǠSǷ9{l'3_XnXZ8stKk㰓aKQB7>-17zğKۃ{{{}rc#5CT$Blap:Q,H-0қ9+Fien~ QlɐǠLwtʯ|e3Os4q)~b'I ' VN1˙f((h~zL ='6{89 (kwVQ H#~k"&G8`U?xl^c]٨:ki)(D>$\ @vR@<Жj:Ni?YD99F.RkcĩfbUo {}U٤^c)h,H돻gL3#b8gѷpv!Rr(O [-lb +g (PHW.=a3Ձ$9ʯ`A:-Eijq˙2- q$@NN"<5|H<> 1!䖐N5A[C) iSP-WH@2ڜ]QFأWh?$TtɡQUT c)h8CV{KXF}M\8Ƙ(;BM=:t vk18)pJ9^,>!~G<2`M)P0`8 i0OX\LAVYn P:>#e$"_K80Z;mPV, [p`uHe["yq<"t7e/*bpqE+Wԑ6͟5L9+~4.ڒx\!SYaod9ꍪc4R$Bfq1Bԓ?nCIa(ӱmT8V2 ͋p01/7ުKWi8Z`ĥO!c>HD$SMV!9i,U-MMуYMF!yH(;veq͎G(ŅÐVWj((>8zEaEhp1O[@Gg3ߺVuU 9_/"{bizHFW9Kb`;W`A)iiLDcuYh 'Wa]9%[ 4 #~h[B c䭣WY%9FeO.'=yюg9ܺEF<Ɵ.Erh-D@Chc1T"!CBFD:Kյ83ԫ4: {&(85AADҒYoP.j)e\bk4A[bPB}+rT &-1bI}(|%׆51%D#g X78S\(8 iuŅb!cxY;-X bhp=D%- IzP t KߒԤ.5NfI:6.fՍeYh<)-PE&ve&ǖ$MJ!fYb~:n#~9.lA%u7/;3r\)R')j#l`=@܎ik;!H6[B[@EqM2 Ng&l|:_i>,4Ba j i6fV50G=򫾃!+w,T m8[k] gZ,QQ8VqC$xi<硱'Is(&7D٨y'RM+CU@HAVJÍpG(MPpGkjKBƿJCuy bFۣ- `aȬd^܇~i}eLyrY(+.BK\o+9LG%F:&c٪0AjWŶQ/BEhq3Һ=ާՕfa|4ELaYW`X3FXv\^#0VQvv8| mIN '&uawY8<}-E19&eڦ {3fs7[ʽCa 0'{s;C,$˓r9e?p4iJOaꮨ/q&(]hm2yK!1 _Hv%=mE''!3=(7̈́1YD"gPp  }_)[ ^"$@"{"1u mٮmmfe-EHhU:Qq0i4{phyZm Hʜ+e/+mhmZ|mt ]lSd-Ҝ[D#]$x夓WZ4wN\g4hm,WppDETDc1|Ⱦ ٖ:OcYZmH9Z9ZUa vزSDMEV+yDu&Py%^9#f.yiz cxرN;, CZ]q`wѾ ΍e잫8A\ڍ/h%)*֘j17 37,N&Gii7;dmeH9|-AKcidX$;w:DǍuhqL1D4~+3F*[H9]'2?xhh~/BKÜf&&^W!Q#<[ToY{cv4-d 5=I~3['*-M0 YFT' FD8RoB IJ"Ԏ+G _g{R=@?VR !P,d!|1jU8Fik լ7:.-{D8=gئFzA]#Y8<-~^uEurdQ1kěO=f^( tzIծqG*pxyZ& -\R q7]Е9G4"Ŀa)JX¡}"Nʓ#&(85ABn8ѱJO#wW))JֲiMNDKsyo$Ğ4hd'[++ǟBaH+.. TǡyTLN4poےԜjg=ʯڨMS67y%wN4,40ɴJ|;r,ZF'#P^eds4uw "r$?H{#b^)&UTeGLKΰte:r<%$5^g4V~@@{Wf%(6Wwpv|cm!۟4(y>Ix#F:3ͩ'͖&ppGk1PIzD$yh '[4_K!Aʽ <?' pjl4t7~E<-f,aq&.kl|TP]\(8 iuŅb/?(y4;gt ~4ӌ1,Ո8) ]E]s${i }NSj {48Z OI%xpVtL\4Ntn[r;&~r (,(D!嬵Zt^8Exe!u5g"4Z6̊3|>X $&+ה5fG*M0{УI%pwDc-cLkJ0>b!eQ{i9 e=C AFebi)[qGfz₃ÐVW\(سxjfU睨pM^'SĄ-HstIt5o+j jOfe$xi.]|e͊ Ҁ&8}dTg|Zڔ8j5wȷ]p}_ۈ"?=I:=qEc[ei8D_cĠDhM-5es֕*Њo)>A9;%#X|4L\c/ֺy$1*_#=rhSۨ(yQ)9-D5_ɇ"^/M<6}Lz1,.q&(8XPēr+޽r?]}2::1MKlQL:a^wFg|ZQ&z۶B۾L(l G nόNfDc==ISk̚.謫Yx9{'D-PYhMPpX5ʶ&aff4ӥ9N(5X%;tgRie9+m F#,ECU)u CZ]qF[F6l)_S=dKJ6{0_YC~5`w}nK>E(kY?-yoLĴlH-e ep&C-*/I }i|=EOFq^^OgL>]YxcYr5MN$eΆn _8+h4v#΂.&Ŋx X^jPUntʶ%dH8bź<ۑbW0Zrmm%>}}/{BњRC>4'YΖL֘p%9(X@!Y ..B6Q>Y9imc@qaH+.@@͉W82ۚ53 X1i43[Ԯ=}з%JŨ>z oOZK3e`f/ >9QpYOI.0R%eۗ0 V1yp~#Ǭ2|̒–-ěS;/'qr qF[i)fǕs-T<(E}(si d]hȎ艈L28O8/(zhӫٌc\,њAAAcӱF͉= s]Raúr$[X犚Y1GbѓӺ frb~۫"aH+.X*)i4, qRARVs?!-X 5TGhٴzBkdLpfWKG6,+Y5θ'L7Er`4K)/Mt2x5 ƅ )fXȫnIJNX0xvʒsmGj;2YXFWji6y-DIZ]c2d5,hVp&f0(1&9B49 B$Er\i ŞؾdQ-#5Ә4`mQZaN=/,گaH+.좀}lhR3Wi#hȇH'6G#Ѻ\I9#$C1g83Rz6x<ә4,1[Yh1Z^4yFH3z-={ O/| .RH gC,eds zpgڳ,pkwt=rcjiv!F(-зA6H1n"=@9OUXQDQP2O(HpҘZZJvEFXÝ;rHӹ;ZpGkJCߓbLƌ'p PE~P1lIqjЁX # 24>+7u֧{,Bq+Vx@N:BAr"+|4 F{FD^^VR]۰Z39C]h_C1zF`7ӄp\qȺAcckiT4ΚVM[f^EW mnFrxsNX+IRv( yb(af|ˌHScXq{V^HPذ:#O,xd,",f. qIc 4:^|)OBFo51J^QꀚYa6%XU{k]8ZV`0=4FcwDje53KB^7b1%{ehoe+YyG)` K [s9'B#_csÐVW\(8nه9-t OU$H9J^Zw+I[G$YR"3Y(A-_=gNa%nYK+9>Ml'7"BDc 6F64Rpw6gǶD>mgy[T?1kx3p}_>qJׄ7^5]CZKe%'3'B˯A(Mts&CE_/KeM  Ix9`V%f{>(=PMa +ǣ@ jl22+w yd:$2b'! pY=꽒gI',陹lQl[Y8 iuŅ(`'mDR3XurxCƓ8C!!Ɗ-53h^gW~(;ٺ=g8{j{!=kid8ÚIM*=p /#Χ1Fj/О3+b)+ \(;=k]XQE|-ۙdlq\ZKs*D+mbi(yx(` 19ʨx`\D5`0Z#Lv3fe>li}NW\6<gvG{*88vD!_uG#,'αHD"ߣ&ґd#><'Ŷ(nCo.u;Z-.p - R;gxy%Qgl ͹4BsLE:OWrh^+>U怴 MG&)q6^-GR}:5 ~嬥Qrhm3kY:E)J`1W_P˂% ]EZ\. Fc1 D&o5B嬥uz≷i'Gs9ùS\I@x]B\Myq]8+-Ź }F /Lp/irG{R88Q!CO7DzDY_p+r]9q1a1eʖCkKi J#±^='@($-aH+.By"I92,XaUc)[;*ժA#y1}_veIQ(7v78Lg-m HڐnCedTC1>l<vڴ**1Ec|,ך)ҭc3=7E`*׻VWc4\jGQ^:+oe#=29AW5 OjQOx&ovsoǣL$?0qp 8d!p&WWeNŶ46Ac,G3FtY5Ȓw+yl+:0RV.p -2׊FmnB+mb#*6v,ct;$[.39݊|mȫk529F I|>dHFz}_-bgXIQ1B*5UTO彦benkL~3Z )*>"+n` ~2,S+[JQx\,tw0Օ'{lݸK~Y\=CsY~\ V d]$r KC>M!6MLU8!¡+rgȋ!c@&N֓k\&SspP&fb4 6Tf])1# \N44/S{<eF0a[`J,O@(d cػFZ9rՔBje+6'PyXم-*<+c0f<"=w"A 3ZJ@^Y>CUP+}#W~E-hɺaH+pL #?5yjǥyKy od>B#uUc?ڒ-L}G9ki^A|56Fyu-nf4hOFwYnk`O_Wa08.쯜o"\=8'jǬvVW4nj$n40Sr^Fv "UJnTq";y_UQ08ےZwjaYثk6?w]y A1D.^ /Ƽ  vB?%FݫZ}{,I _Gθ.嬥Օ)(1Ǽ#"Igg/XqIx#Jh2z1{KZ٪:XUh 員kn\+R_W`ҫ'APFWWFGHSh%M35"M%k<9⹻,P/ d(q4{CK >WΔDu.3u^4*g-)S}ƗY>۟@;95Arg_ mۀ$&E>$i]U9kiuQ(hr9UlmfVۮNov9o#Yr員`g}P?A}O'>gwfYuqÐVW\(8nyNp/ nHɿ>n*g-S@hc֭BX{U]9Hv9 3 arCL0SbuMg}Хڃ0:߯f>QpL;Q/W͊> bZ&0aI!x3^9[rIǛ* f`g׋tօsLUlT#&]-y0blfEYuڃ&M7w CNuE];H`=[\`9_5p/::zt \Ev|6Z%Y%(m]\Vt.0'zHmBx9Ywuǥ.]Z$+ĥBF+h>[e,&T`9U,i[Ta'^akس~ S]҉v'~nT|'xzsz; VwC:ov;DWx3+WɝRUKw7 YloI,nכf*\f2$w!h Xv ":-Ո8S >O|W?&#Go63NWwD=v2Z(;`niz/ [n7jy!NPk|yvoH5m׫[YUKuFqw1aw߁> rY:1]-o}9[ 9ιG[Z|Dnnv=Vg=.+y3Ӯ~z^T?;C .YIzN@ $huT6sLUDlQzٷ?݋уm<J 5)FJ|U UOCH1.wrǪӉal)ϊ<&d Q_/ײY<( CvxtlڃcQ3N=2Er;'xn;Nw`frmJ&ǝot3߮\=0dj@SixQSEQo㎮ >,gE dn}QWIm_{:(DG7F{օ;wyvu;dv'R:}FϝNnM n\WUwҰq/Y},{7b .Y%AV<3@P'l] -lZ+Ɂ,d2]l|;Qu\ow8d7ⷙ~^g "}`7vSoPW=pJڌXt^?IJ?& ^A2k5ܷz?={wyKfRixwK.P8=kO yh=67{Z)~]?)ToS 9:-OfT:O^΄ V |kDC$`MvRmp,68Ko .w> F3'Q20w r\h^#4%+ ɧf̢E7Uhԫ]-rtlHq ͍DH[>R͓v~uʇllN( W2Ki_U|EFoA7^zfSщ[g7 wE P%Ф=[+mۧI4KÊ$cO(4fZ=YjN3Z',)laO=ZG;mhxA)vw9Tft.Ǵ=z&.3QF2 ^=_8) 5G (Eܮ>}^T2^z%MiC32Sf6}`?͙ңFkO]ιfw|x1a#p)05J5{GaowD;{{5h\{@Rv`}ߥ;6GH ć̘˭z lnЗ"`_-)&όv@NII z{jގJl^m]~|~Lg㯃l!#m p]&$<4@wXL׎[2 m' O`B勓t:FґD^mVJ<5SqC0JJomWڏx4}?,:]V['v%FYM?-We 1m+^?C]e6m'72I\kV'mY:W&}2>@ke;QjhhhR^BGrmMg LMJPuhE^ ۉhjN.h8ulJ\V(1Av~sL\]/7x8twzmuIiwǴ&|uNiĪ&RQzT*TAgFΌ٣e.|q 21[tPeQ4Q50r5Ktg\Hu0c+'4H[Jh 1=<8n -hzI;-'vO|v IuB5mu=_U+tw+< :vJW=KtMp&&dPt|P Lz]VKX>*Y+M+`\wM/˗`o]BZ9S5!p]t&=U@ķҊ7!YR/R\|XK*[@%M&oitd+<]nrdR!Lӏ 7Fx ; Jx4\;\f &[ NHN-8 tօÏIv̒w4Nw)Y_xy{KۜZ;V%)fN37a% XdeL5}6+]G$Krޘ܅PgF! NG}\jڱze NІ͌nkx i2P푠׿]gZɸCj짿~)O}qFX#t1ځZJz -KH~wl\W5;t8C?!?ylm]|*8HJz6)^6B Wl貁+ō:eދR* #q%h`K%Y:?w ,ID w1zC\C~\(pD eG}udᜲŹV=;D锐ŗvDuF=pG593ϊrK;Й2⪠TG2꧞5uVrz^6]v2yVDq+ +jvbVԾClk$ZTRŻR|(s<wr r̪A!G=5-FVi\~/5k~XPeWNohP!Ңv,OQ)(\eξvzϳ4_+쁂6+%'a\9NOVNߔQ{:X D:׫'.YH!ikQeqzA%nBخՐ+;GGDztC u{nZ9r 5ByhVN3h ,ErH2rH .yo>;bTu(T>ٮWasO+OK@:1vH p?kR,_ (޾~J.=u&HV*uw5aRʙ*gΥ$0e,ϫ(v^X]#a";2cxsQ9X c xmn* 呬g^9T#93:N:oL(5TU񽧕w8@奒1s9ʉG^vOnMzrHpxsm(ܻWת2Zk˄_QG@(?Upn@ߍiG#/=qݽ=vOsM8H-g2/(xqšZ1ࠄ)\YSWu#md9穎dhQ!^bBU40 ۭ|2㘨=V|Ũ*6JSKj͡@db>F3dm"Ԝ:aTI(Ll0\u6:+:VMu7ϽvH ul!ӧ*\<'^1@eMSkG`L8O9ݥ똉)ѰFӠ残2zTEQ愀K~2 D'1,ee2uf< %Gz{4N74d"CMϒ4TPv c1s^<ߺ2U~ !C T:2h᧬?ɐm[F8ׇ _Y&ir4-+o~kq˅qVGe|J1vL޴\mjud #9A+qt-{Q/OiT 9r"GXWrPXM:!hr*u2Mq;w׫d?Ri@9y]S=~| 80'OHVdsaңJ7/M; 7jعٺ +Ƈn FW-x pu`6N?x.^GFv|ÇDOM2X $ ?IU+<{^\3Yz48L$9Hvήl#v.)0)R0ӢEIgƝoyо1f%x>L4>f/`+I؇ Vhf^$LcuXB ȇC7}LmP 4/Գ" ai6.Rv,Gt4 gFԯ0лӺrM7>]:@?vxט515`Dvo z;Wيp|JTGE #(+&M:LjD>:7m D׬rǚXe2ڱb(?EG|ynuiZ Rݍ*7FF<p#iǫL=K6ܜG˱@W>ctBk9'n`^;?m0i;uZ{ }ð;P]o5 -fbwnf-eU7N&y{'OLq8"ur*W4^idv iaύ87F{*a9;vVw=dJ!m .giz$?c 7/azzx\f0ODR j7{+Vx M'J1p?rXG딛qb7Jeg=;`+=S6wbuFR̋ 4؋%33ШXs|ld.r3'1r=7{5z@]㵺SEx:A_zۨ\_5Ka890pTlMrCRUAU~)C$532xL!o4DI:? {Nw~&6a"lqVPvBGeA%㻻<{!dZ:`7*JJH]N9kxt@v:qƥ{4. ]>ޮpKU r^~e@%iqqz1٣#:XdN\~Mo4ځhn{0,It׫4o_EZdy-t^{I:tGW J_(=t1qeUJ 0 [9|W;ںqՃBU-8=>-)ʔS̨*Aw؏z.Rţʂ>ʰ7ɇr8dU,>q9T-IUC'8TniYȦYx&r>TZ~Q y3_d1 ͺ7T\'w7QwtZeYMV)lNk|hef_榭㻞R/Q3dN+v:Ȼ~7VhN3׃o&0kx9?K0_@~/3sy2aE'EF&gFV15H]; r496ƭ'*}Fi]>lT\kG(50] OYS|> V# k(8>:JErju wh+8;زq\Na\ “+GBи4>+gu%?+guSSWިNݦo#MTFqA gnH~ZI-;G:y=S+=%u'ga8 eIWNĨڎ*Ana!a&|6]h7 K UC7qM4DVWξ&,>ҳϺJW;0798֗>RRVzZY靕O򟕕 *+ST&gDն,(*?8*4?+*gE%?+*gESST~IT2UR $YiTZg)eYi9+-4rVZߛG>-G57%#<",7CqkALs9 |ؓnҳҔk%>-g%p[z˧ln3S<3-A]:D;,6Mo,3= I<>1P5XpUV8X٨G_dO@٨#8lxI6;{p/uȩ7\frF 2'~i,bsPY*q6K=p̈ϝB͆>&M& 1:]_o HzxOڥ"48~%H8-AU=[\P5VVv;+QEP]G t]|7iz/ qXn7U?odְntE2ǿ #= H}%cJjl'b{[ONYUw=BO.u(ٳԵR; ^{n{x,yr%Ѯmk'unk(&(̪݇Y/ZCY@;i<ץZ|HTgAU]yjKs uYnsosغw8jJ2l2[Ӈ=tK`%@x.$ѹws2j6@J,KbKM0۬uglڡݜ N\\/I2VqY](*VZM~V'{!g>l0Ű|1h6ƹsڿrH~I2c>7f ømW0dJO}2 ->vu7ZNvy>f+E_"oc6㭎oh:KwRsTh QTs gkHRwU5}/m AxQk\JIrl\UR<_>D'‘MWiօ[Mυ9 NuDSYx昐mq%,:XW4[qOR3ۨm<S/tè_8^^E60Q*EժODV?ז_)$Tv싲A5]7P+tYf"+w{%r{ߑ%Uѭ}pcfmʹu O7{!,̇߬Vi_%-/vl}qz6&[vUHs'MOw1Ʊo뭶^{]c;(1SK:=䝉ۗ8\SEjK*Q)OyvgcY]n7u6eG=Sל)lc%JVB!SuBCGq-o)houH5<4o1IIdIh Me6BT`JkH}4X,q)$KHF)fB}bfM]2ANFcAubP=YA`>{VЪO,}6J#\a ͗i0Z+ 6SeL Alޤj^-pZ6i]xCBPrw71YGa#+ VA2UV)\~ePmMJiʁj@AjyUa;Y#&Kĸv$r[!*p~n{[%7[/co,9HOfIRe 'e@۽Eɪթ+GpC^Gkfd@Éܩ [c%Qޱ)ߤR<IZe޻R7s5pz!6MkaWM"IPҏj6} c\;;, 'uQelPtv3YQ@K\Binvo^; Ke=lt, xb+GxmGj6664h{n$-[Y{^?%h)*%}4̃y=7L{gv!UA]!)2ՓtKRUoՄOOp-1)hM]IFs5/}wV! :j%ތhRiIr`樵"]ydWD76%snr'Xl=:?v<.LlssKKnhR(Z#S^,7)^׺@SB]Yp) T4Jln-R;*^L'Fs`+D~S'HFz¥w߼}-xh-kwi ۫6±Yh.dQ-SlA9W(GI2|(dYbO^aLLfy3˕bC-&cu3.R[FlG4ոc(Cn!O|2*ZQ2^X_Xke /)6fi6qyZ #-G`VX,B82G>QOtLp 8FSp= <)=Vxl~*,hYJQ?s; O;x؋~˫^MV_Bm$HH:`6~ K> "`*~JΉH$ Zת^]R[۽faNi*.u#Vz-i+:8>\v{vrgaRs: TQKpS.+t2sc\S`#$QJYu06 kMo%rUngr,W@]lel@*~"e=LKF8n5$$MUt_(Da/o!$l `]guyCqlf89yK??62gHCgJgdU{X nqݫczv8X›aL9tOfkنu<2Oom&lkVdx}k>8!iwJ0~s2ql+%s$К|G (jajutI#u5i5ֽ1J3eɼ-4bYD?g<\u5V,"o\2"u$T[`N&л86@=쵣8V !/Ǜ͟1a9NgUZ;=~cS%W0Od.f柔$~G][k, 7I`2u!1N׳GSrG ^o}mCU~x7ﲬo29("ʻ_^~$ rVDENf? In#ur\eNwADIRtbim yP\C$V1]Y_ڶ.gRB{`SX4z$r{}B,?DXXQqtlSFVm`pÿc;H5nضRH]_Oo8 ͠Z[6ڭ g<ȤrG2;4.8r.vVrBρ/nO![OZZw&{wrJV1̹|q5w7e"^q|3;G%lr:NՌNxDݙ tܥgw ~ո%|g9U&U]ݺx]{nh7mXb#+PCQV%n ܤ9&Y ^8=dYXL$[V04 a-u4 R'da׹)BpW kXp؍GuuĴ2Qb=BξJʮQ=D5bܮ]xH\kS[c8 x0sF4/fmcJEʶ_g xо).췾P_~nހ×N' 60Wt̸Flfj~U6OY|Ҥ* \79$݃iCrS "8Ԕu%t)tЀ eR_ʱ͘=pjy;N'l۫ʎhׯI kG5i}6Sbc +*c?f PZ=x8v7\ů_ŋ/_NHKxOsRF 7D\Nt %(ʸCԟð0XsY>{M.{{u/mo+@WL֘:( #>7N'za(4 і^v{kZڤ yXK=z}OU`4Ág ;̴]<85xu>aL,P8yԵϼ-Hb2[Lہ ¯Ey%(2UcK/j} SvY.SɏQDmzxf b_DC.*j믮4DB7s#t;"!9,X^@\lΗ9=vQןC<DcZSh-kV?Tbe6_P ) YBA/_+4 \W?Z ݤۇ+e:\CCrs_7a>!<Π? <'p!9ƜFT8kܕs>HLCw(Hi64Ofw2\$.xE:-h!sqHvn^9ŗR׳Uh9:y<ϙdK_=|7`OgvO~CC'LuL~cr=[p^N:jw\$yFQu\}mr>ڈ Qˢl'E>rmO9=t_LN^_Sq͂X>΂)ppZZZvU+WB|K 9ԏJ~m+Eg#ȗ0Zm#f*`rde>)h>[cr]Y˄` 7Py,љvQ8t/8YxD"G3(_hf|b`Nu[iѧ3nvg Ӹk[euv R$fR_ m\v.!p52yyѮpi8Lb}x}24Ǟ(N]y|t]{~~}-u$sŒ'AQMϳ΄YkÌ"Qcɬ~Tx6-ldR8wJJ=Q\wjÂ'W|SH.d>m͡AE2PPfÏ kw7|gdfw\=ѯ~}q̫.< '8@(ȊNd=4V#69iQ҃Y0Ilϼ 5ҬX497߿OW?m;!-Uyg^sU[eˤ6~MH6KS;&ZU&A2Z~H/3Y>ǝ=y(c9%Aخ3#|0ud]^xS'x¾NjɺXAp7VOnV[(rY//[^OE]炅Dׅ5e%?h]MAmg+p?xvQ(]~=_7طbS;~Бb󶬻| >8;d~ {n\3*{㚓 V#aʵ|,u#T-C *Z'P6*S2_[bLqIy T=X6%x2 W_fMc|y gx[դs% V>&U tݖ ŏȸI@#Eq$rpBoprTn{\};☚V))>w U(kU Ngd(<(=Ez9/pUt121iDօsT+ܱ~sHIxU [d.1k{DT+\Aic2Ǹczaô(ş/I1+N]OD`Gq؀mq^[ݪ-OT^> cmWm}bjv(KDiDn7~SɎns> HXbN)?Ƥ-ԥVmRPR },keL~4Y(s}KxrQI'xie㑗Q:fwM5T^Xf?XC-i"f94v2\ڍϽdքwz2]};U4TS}@;Y LZ__.Fbܷ?HY ŖVtD jñn]Z9?RP3WEo|zސ؎41cVR_R7Sůh2"yK~{`J%9ė4wlŻ`ZO^ZzoQV KHCM W,ycF8 >lH5O.Vv/*I;-KdQ(˲dQMZK+3oF#B=IbD㑤/ٮ7x_t>G_ -ǹC ?YQURz%8zUv\,]&XUv ;\պ &64L>v7c^R>J4$D*CFk'>PQQn(э)Xsd>\5r+7rs˼JN[ikDێ3d!7:˪/oK[Cy*nf@ARLmI` 1 PDij^n7[:c+Y9?XNoPH_ޠ՝6 ~ ͮ}ՃBQ|#dl_6=mc)ǣuP[}uX>익{ClDT˹-@g]W'`ެB8MeZW%f1Ԫkb{y{n_o.^=8` m?rD/g~u|MM ` *A儥Zp$RX` RTW2IP)SR  ;Aj k ZsCdpbY{:"pU(i2 mR R FJbXJ@r*c%eq ͠`#pu Ol6 -(UQ7p ]AhĄ8API RTE@K Di#(aFBM84U$hB<8K *B Rc0 WVRk9NABbmšK*&*=`ЍqjJKk }V\ /C* O)1OREl D ľh1`h)X8SH`c 5Hl"UR&(RhA2EaAO0P *B )„hP[Sh@%tK!mh E`D!pB(jQ=3@ʀAjm=te&(EKf1TkW:eДD去>l{{խI4!(]]j 0F/yU4 ~yR<_q`^\S,pXK%E;A t h9 !RZoKSqq,cWR%yQˡ=[JI Zĉ^9r`+>Z8`k)WB-ۑu:d:76؟rCBKc~*)٢rD$1%v w ϣ ؠ "VʱBvTmdR#Ƶ%,JQ'MTwV[]#$)6FM^w8ݶ=E`:UmƒP[[kGVVn+*+s:ڶtd?n{o܌l޾,ZPmu_W8w94t vc[wtN'~8x07zlf gȍNΕX{3=63ZqphuhgȍwfԳ7zFQLc3N<בc3豙цN̍-88KntRclYѹQ%T/vdF/)7_zh+J;!7zڣ#rWfrǮvplӣ'V@ 8ՕlgڐyFۣIxk1YiHrC :tQiGߙaL/C!^sVUAY5KJcde9S#FYru6'۷Y.6y땲r2 #/ƫwd2m=8եgk57r4,/f ,]UyTTOg'eej 60bT#+ߎ C=7EN3=^nJ+ٺA!LΫ9f1z=#8 2NIe>5%lXWXVi7lj O~Fq[MN=9fN/! MߔTGw]O {񺒢Y?fJ#OWuTk ~ ^/o&xKٳipRӝ0mջnr = *Kp|g,[ވ |&mLј"#(C */ˁ뛁St^6j&3On? ڲvw56'e'(/R٬>PEu\U=V(v<Nx(aݗd/~y_j_lr ;Nq:-{ b3'-J/yB솗?>`tSͽNQ9Gix|MwCv]BÜlǣƿ!հa Єqƿs^H;?΂[yЍ"0|~ۇ/Lp[)͇^%O'Ǡa-b ݋M 5Ov?} Gp7_< ^,/M/1_~=[,.g6 hx|| | ГIs>8~\/!Rb%@ê|H5H yv+H^A g> wb(,t.:˾WE= i dt8e^ W<@z|*0`ໟ gHV$ k Ǟ< ydtπQxXW\0=4\|4x>˥^dW%6k GO@5L'5y+LcOgOyWX4~$ 8Ǟ?= ^w3f/R~o?ʦ" '{6} 9ԿIjL,o05>ASÇ]י}!lqj9A h%KMmj0 )7gq_~ٟucPWLb@,6Z~?}7b5BK nM ¼>8pCIRtzhThwXj,#s}L]9Les lzS G, ilOENvVA_4;1V}?p \RdLj&](I5=n٭EV=6ۿ*HI #Lj>l#bjs ͆~[xds::_~]3\]noCne|[4hCnn_w0.ugx{ˬ}5.^ ĿoO'CX[Z(`e1F/z/o~ѳo_tѠx_mkocq,><~C ^65g3U(XH^̧n`_ͣMd o%H{۝+iLU*tj4Ǫ]r&q4D9\f$[~3DpU;魉ֆXkqq3[p4c+:7NǑCۉR-cb#f#;6}lo Ρ3de/sZxzga`-!5Qk<+À!O" Uk NnK8;` LײUD=+EiəztN s< Hdvdi`挑s*+9^֒)X 4q]l l (ctMiڌ>2Nfڎf5n=UF׆;#P#j aehSBԬI;zZt;:akuU-Hvc|C2{&;EƢgZ$v2j3(o4(ÂQPTKms(vHE@m[EٟAJeVw啁 [AhTus牄1e1 aߥ}6=Pht9 ..b Ѵy/\>=0Ǵ(vj^e G>9gt ~GҺ8H^<#.H+OSm'$9;A^^*/_FK{)ŜRl,:ejL 8L7=c|0I2ɻZ@O*MX$ph*)'Sá7= ? 9v8?srZvѰE5R,Ԕl./8ҡq5U~<@a(nFoLCЊ"Vھ(UD.+6}"́TMEaZ|EbL-Ns?X1Lp(I~[d* 4]-T_Uu)Z:=:=9X+fGgղ"˹X$}*nHn`aor@,&80L;I Œ.6`7s*jXY4$b>d,Mz7%&!GK.Ke#EEeM{FE~2o/S"pUdMUҨ)va]sԤ*˶ժazAwQr8hcZg/S3kt} /} 1T[ɸYD,hv4py0U2[b0jX8eouWs mYF+9ǦY^&/M-kx]20HKXCHO >0MA6 {=naV<M7洗X{߰9)z{Yx GXGuxFˋE iUljvdOe8$WSݴ~:< Uu$mp+v׿]pF埖ъ.!}1vW( اOXɦ R'KWhH6W"D+&dئ~:{Wg %Hjv9gb]HxXm]%dT;\:cHQ#?n/C(O,{.V&Nkȥ 0G#vrqxzwU3wZKEIR'Xi#􁾹N҆xwU5ݔoGͥ&,_h1L{PHNX0F&CrrE;-jqwNrBy-.S]\{a@Z抇kr_}5[?Fʅ;9rE2= DHD}dnUS{,o;Clt 3ZXN~(᠋F.$׿=r.9‹@!/|>SB5ulswn4;d:Fo\- +!he ZAs< &h4ձcSk>/ tՂ ST)|o^:'=)Q,Lה~3Df-.<QH$xM=vΰR{#h@>*vҢ}D 8Ժ"EHd-b:@L)"@T7uX:KEF!JLԟr܄?@lcT7#5%HqfA$`kYჳK\:!'gjɑ wTHE=1zI(ɮ2Le,')QR+7-Cb,Xk*&%UG)lެTcA(B{i&55vJT~Bd?2%p}Lf.y9L+OS~ΙM{ A1v:ؒwu:؂+HVB 3Z|}7mmIsBw{c@s"^V~ȓ  nT;:9N=ڏm p´1( 1:IA'wG&}WsN > i[t:)y5gkY\ga+xi{+Al 4`USń^# l {=xh:\WBAvTiffdeJ#dK7rAnO CX Q׈z-}IHnCk&jXk7P2j] ZP\Tnʖ'224ݗtôn(ãk&t tr$ V\Uut6L*bSh?}JQbOuKw?%5%IVl =2~w;'_qO/HHPrd>)fd2Q4@Hd ݇D.Ӳ%&$uR')z11 '#VeD_t.'$3[l4eIVzȫ|.f.&u4nauFH"H-<= 6{r|> NѯF# wkO,@wguȴ.Q*[nh,^Mxu5^`߬=,=s 2^IR Q\3;̦}"*S*(2Mw;φw^,>^S<$O;yh|CU9[(GzUMM7L)E͒74gZX!ROf2Ã$8R!˕ HEp`eꄤ_]p1Z,'_!UǞ նEpZ-9!"_ŋjFX: ]WUvO*V Hw£bSr|)]2s*1˼$pIYri,&QPzMK#l虚"\ExULܹRF(qO"ʲ4X e[T ΂ Bk0f@r G@W5LF9-@Mm[hl2 xK&aeVl6'o%4Vۗjw̴Ő"ڌuֶ'H+7DWɄ6lRvy?_N%zq.m6zRSY[YcJ{|xie+R>О2=-n>{7Sh8U8cDe:kԞCֲS+IVsHiӈ0 ΐVIHO *,U !DMH͆ M:}b%Q)5iEu\%2:j;i* 8;܇K]{2A9Ap~s iM%G(6/7fPJ)bߒk1֪&F{oEQ:3vPn FrGnYU{{v1}3LOC܍,>h )h6Θgx;{VS6eWɰ=.dV1G١꣐b9 OtL'6fHfXUZm=!vKpF`!7-BfXmڜCP\ؐc΄> {c᱇POzކG}m]f$@@*JOZA@wPBo W>;:T S:u]b1suȀH&^6D %v=Zy2êBkW_mziJœ9~Vpr^߾OæŨ2c.DTCU[JORr,8MX` 6?tEy7xsu˫_BĒ$BMd{I9gXfX0 Wgy\+=E9-C?E6hir#xqԤ.-I6iEX0rLB1{6lInE%DRaWRzN SyN/^+L2 R \NR6%"/d&^,p|7b7BDw >ѭPĕƥZհ[j>w,si o!&]lu~^";W>}j#Kbxq bj[(xyDWhȴ[:U?_/&J*mAvGPhB~ ?#ObSF+0;2Ҳ–&/72õ%[LNʱL 3xtNT'i-HA\-sWBu\Wf̾W4`l vE\e:9Xfqg/t,Ud&GIr! z4Z3Zp*}!6br@zMz9OJS:X9Zb/7@j - g!!XܯWgI a/$(v**x'ReZEIf`u0J_"\kx 8iݫ"1>@`?8`<{V"}Y7e[>)00ds/VAܿ}6t/5&NCX6@4 [#>@kj:^qfT~̹JAlW)[>Ec)*-dmoݲ75J6ڤ KBólEB"ZxɒݹCt09۰‚Mfml125SQbUi,Dk)ȏ"&V={BojLP\kBΨED(_YhH@)r_4,5-*{`#NKh'4o@T)`M=j`B+nqMtM1+_c巚:U>[B^O`8(/I^>5k\ܬM_z Ogo%eʂ]IߧoҳUkQQ`ibBI7Tle1\ ^FO颏StB !с=l6, 9?#ϱ:}߯~ ig#ZܐR'H%żw ɑ/_`xPB @FcԤdջ#&fZ%UNVItm!#^x'9[ŽJxS]Y"& oJ2Xr/h-?=g$xѧח& O嵬>yXHiZ&MC=R\?WQޠ^!?!"!:_1anHPRd(4$/j1P GvA2mL+[9vb @S*FAh=țG>Nҷ0פj&:m`UonYQĸ ´264HVdW:ީrK,vfg{RKɢE+ na9FP٩7w`v%jI^9'Pdkj)B;><ҋɶL힊8C~zR~ЅLA(QNrqv>y>I2ZQ}$-\[(Ln@I7;djǯ5 _CqAN0cˎ &C\:?#),Z9(i34Zj$x'əCkMڪGcׇq=GG#kqsdruMM5z&sŚa_xo C'A jr(]gR944 .@,'O T([ R|t#*@CLC/_$neY5AJ^o1!uWEoʒK'^zJ{FJ(],xgALkq튭'OJn< {^dO' қ-nKsKh~p%hPN̳\ kJߦ~9_Ew, ;{vk,g6FM^ ITGHFH~B awآeK,n",4"""sS3}r覫~יAa[Fu% +I8i- 4UW E{ҿѫhz+Fl\c xC8]|.|-'a1"%^E:ɶ~% Qex `Od q{ MMϟڎ$͋`-0 H~X.It5rF~~+@p-,IT_>aE-.#4@z0y&c-ºDd$O!(S鹔c倎GZw+2ӪPuAvDasy܇}.V!+r@iHiS%:תVĐѿzsST:=7fE0+L!GY}ALQ`\ }Vh_d_0T ӓcvA$PWTxycus}8yiUQ{ l5MTLf7ObuS/Ի"SfH.^cO5NdDN1?IŋOqH' q T:DRd8 cSK<(;^1V  O3lkG&[t/Fo"N=vw'NJ؏%et9k:8z6 y(<]w5;IbY䑾iHb<V /7-UOyLE?¾[18ng{ۣ~rx r[[lCۦ#Y֭o!B xnTP{QP9g-{eSs/Y&'fZF]Gq4k*]&ੵR&';j}_te~hz+ ;eK ӝ/0a)\ ͵r52e?1ۨh&km! 3je 5T]5vnrTcQڨ*=PaW5rUӢ[VQƾKy۱x2U j{^&jG9e%F@M4פuwwiMysڮc r ޢ -<@x9b6Th]L& yx.SXo@$)O>efP:t;gfpC5tϥT[#Z8[7Y(C ;x[eHdNUꊣe0?OH}ܲˇ 2ˎz&.nH~htfr~y^[$hAԫr)0e5rI aH>O|.EKfUu([wώ|xN_/[|Z@HNb+~ia|*,;Y4$?=Cbմe&*+;_KBٲ%kFB+a43tb0IDye8We]i ϒs{ -He ҨB5Nٮmv [(VN3Q3%y2r65|&^ǀU4}v^A-T eMjy^f>^F2?H͐Bj'`@Ùm |؜cv`Fѥ[Cϼx$բd+k%<׫4Ywт>&( =)zL 2^/<_ىZ(y81-)NC/dVu Dc 5 U ۪c[-E@^VEhwrMS@uz=CNGq"KpW_XYY~K[ 5V4XiPr;i|;w!L s؆e(z] [fvc6'zZPM(wÒflelZw@3)nԉV ,7SL%k3TWR1Dب 6)pV ҊSX-$>(}*/ XkL$*ܬ,W<6=fmZCG\92[HZ@ Ђjq=iA 2Im{.2MH<;q lV6}AZ)^IT%0rNl׳a^?^͈,&)uCM~H歐B `DGoKi9Fs&gUcEf;)>4[EU5nzoV_Ցg;鮫8q'hl[UYq$\e{4_`tRRM{zm\E ; MkyICZyx8^i١< X|Sݗ ֍={hn=%dij+ %k67VCrkڦ{_uM/8P l8jPU`PG|:o|u/-}CO >#;,բ@[bk! UǚdHctwr4J~@-)ௗ䮸hf[Kڈ$yH&G[\-2YѱەmCuL֏re> JDTK{O0듵/3U+(Tjۘw4*}%w̻sW_y-B c} OHM'dS iHu4i;΋娚bh,o:m[Z6 [BN,UDc|%֢W̢9gXio];-O|># r)\t.Έ֤8Y*!ղg{~ 0=8I+p%pqP;7I/x+9J2`X!&M'ۈ|ꄗA酕zkF^+ y:iw#U!(vqk#OIϹJ֣T ؚX.ckCKi F"u 5>Qss)4D\$*bZMq(HD+vmꝜrb|٪턑$}S02,I_dhuWlĽ|r:J\[T|2'o&"i<2i, bbFݏ ԸԬ$'/ J(vC%28c"$CsS.ok}=}|~oEi=(OS=fQQ_{B*a׳hPkhH瓋W9_tPPMB."}m G C]+ ޢQ휻, G69&Y mϧuO󕘈R `}b:@l"xBjslWH_빴%qd g*y+յXVe4p=d.<.m}`<$5/Xz"e\/ށ'O9mCFw2~G";q85u‹/*vx,`7|2>t6^U>pt.Uu (DIz<;W܆#qN& ȱc#彴#2sNB"瀊 {} ]|Sr{_ܗF)(꫙|$,{M>ߡ+SQW32PBBKڧ,pL_?{^gx"XB0 y?YO˥}Z >oTdGWm5=Zl_W0jD}AN]%…3gXi;:G\Ѡp6C',w4/iі%7$h1.L*bt룰>jQP1*Q<*o%ʯ]MW"~^.V셬v^%F:vÒd@52x!۬ee2.#%ie^v.fiƍbY_HS7g"j sQ;5_Ծe5ߕԼ0Z]1u5˧cRb0ݲ^Ȱ 1:r]PZ/.Be^MOQTB[f*c"E+QhءgRH$ H'~픃l_;郆N}5B*o L7 {٪m -JzDp5|(ۜHLd&L0I,pL$l~;@MCHt |0K.djiV21R\U&ﰅ"eNG_Ll I,ǮY9d>Xe`"@'R[> 89@x:Q0 1e9jô% y6 jCrH:fUq]s-v΃{?6cyۊme ɂJO_@aƱߘB]aPI#UMF]! (1H.65Lvz(M3%ZBoe!mm;х'|00˓]zkA(fCo"OJE@QUKfP#X¬IZv.y ǰ{< D7[44:\r$KYR5^!ӈj !hQE #V& T&L  6KT>:ңW`ld2&? }$71;%hn5af4k.N ۱DthXAqo#%5#Lo<ױmߗխ"Ƞ~*RwHR-W+pjV|zuԜs3G023Wg #dlY2+_)4ۍwbb5cq t%~H&2IʨQTr.\M dȔ*;HnD-Xѣ?MHoD,ujZAfK;^cиG[\>8 US}dS(^4mqb͑tiBYa$" (l V׌ܚHذO{w{1Nv1Lzvv6 j\اpڨe 6d갫 >7Djfʨ_CٸO  Spk`1l ǰ@a, tkIcu1\ dv} j4Iy2k.qoOC{}\ho. |{20`bqGnnİm+'#cwD*>P y5;0ȠjZZ Lc4[ޝӃ aPe+zu^%螮!"[ܴ֪)E](9n*"]rD j5#ְ00䒘l\~> }Pqβ}̗˻gh/GIAF=e_1D?(Ϙmdx~^*ڍ̀FXw,7U0P$iF;:beCXMuEIxQ-w{=XAG5$ 7d `ؤx+xCU-marK<<rQsjbB%ϺV,hM hoV dCک{uqz,^78/B7UVqBn5ĄLF[:P1bޯ=o?/fde # C_i$`4L᝺Lږ[* }e>p{\oIFz(huN,PqI haP`:wtH#04˴U] aR! ^ㅷ XEw6`8--}Zmp<6̜`7E<1+~@D$x>95l*urbxZdboש v;v0Y@ Y}h r;9, xպn؇gЪ!׶ K?<Ȁga JnW͞pl06,ċHw&q$l.}gBLk&b]28nhP X!LND l+$@F*e]PiY((a2^~o⦉MQY^ED3KPз\o|[/CdUS릾=":DG(vz:s"}[i!F-VޮyhA1Hfĩ%$ >C= Iyy/V!4ly9C Z`7Pxm-&mZcj43Oc a2AКp c;,-6\<{[cCcVMzї(J޶%nV*Sp]~{AlW9}gtGxȞ z.ɓSb]{_=xo9ҡ`%  C3 |%$__1m{md(G=JmIw֥9JaIosޣ(%ߟg*Qz#Lz[(G-wWl0ķ=Q|{߿7o]yM*ÝvQG ?ՉɑEQdyjW0DPT}wCCqICi$DWo߽|~v3SqGI>$w3I|QS?Ev4CT&Q"\&u,/GY>NY__G4GI.lIh>C$%ʣ$ߥ$?{ݯWo`b z umKbʕ7p:>}dzI$ۅB%n_Y=Y]z{W~u=5QQ94WjYTTut6jS6*ܯJ`'xZC}| Zt2,ТuA䲤vD\iOEu}(1kH4Y}sZ|z6 ZW h%ӡ:BG)c/u\vT]E/__:Ff0l7Sn)S/* Ͱ:AR']5M6`QeOEq :@G`qfh7łU(/ 5&5=1=s9|2o-Wl] -g,T]gP›[ 1.9&V!nxqj~2_/+]wN`PE|8gqfs,Tz& KN K*Od.ntcW09"o0!wBS> sMA+ + Z~ޥwsejCQUᮯL\Mw[ /P\3mӲu;tsTQ2 ❖$\~).5{˛muY!m}G3.? /!9poxv*ѻew w_AT08t\<1R@гݙ;PUŘz2U_q0a3 KHRI&I8g{ĩ#*C|LS=c _F"tj<=d\^ś3sZ?%3jiE*wMuGE{&7jͮF3X:H He ~}'72R2]1]99.xwaw GpϬ*&y rvkb$'hU? >zˈ*Ez{<+`CWaûp"%k64^HA9"?%ūW'26Dߟ=MMsd:O0 nΰ*MýD#'=2sl& b"^aUb5!HF(">y1UK{0 =dVaJOLvaW(xⱕp.tB(Hf[<}#K ﰌ2IxS-".hzYJo*ZaS~WO~MUuÌޗnpovmfghA+[ZӺ-1n.n*Zh LG 15|D6]EqAtkZ [񨅍9l3l]ۯ/ژ#ޖ͉҆̾,>F4CIG ΅_vTP:dھ:4bEj`͚jN)Ec7 K1>>pcbps2-X"_.p/^u;^CC]`g:"=8[Fvq]P3x[='TDO\BV[(9Aw^"7ǝtO}oޯ#|Y}O~?[b s-#evidO*fhm \VZn6D7\6GsKg|6'Lvo:(}+/7ރ0ۄA/"D$Y7L Y6I< 1^ ueT牖KyL!3L۴l)ȶQD3Kd|zu}ҝ7j7ĸ۾u-8rooISx(@y>Lj&!6MocAspQ3._7&_.Li<-@@٘|.A3rXT>"qUs)b_  "6 -@)@0@۰Gaz>A?z4#@ޠ8[,HDxA\i)R 6ۭu+-5ijBT ŏn\?r^$MRVtHy*9k)z>Ɖ'jZӽqhi8Y++*r(V *뺞^YQUI&ňC7Fx EOP[ ha{~R'F9~t`~.mk8h'yHRd={  S5g9vkN+(+~W  @+ey1 0 r\( LJtx  [tGb^_w_o f2DX5] >ao7CdpϤVτ/%jq/cH0 0 +OW&ɜ)>V;WǬ@5PjFFe=!+1¥8\l5U?$z重ai, S]-͕wۜޏymS)`k s&{``wT9Wx9e$Se.Q=Wx10 ? 4{m}mΎl.s51l@e.wt"+^er|z7rҿ_\[VH3wutGo=17 mezA"56ne6OSݻpLvɩA%g:6)ԖӾz X{{B8 Ҹ~i旁( |B[ ,ϛ}Ɋ0־pN]uu2Ⱥ:fXB .tMQsO' \-lO2`e)ڔi҇w8;Emj(@w'}m`!5`E}OI6b[x"crŁ'WS½qL{mәc|RV@1)lBDh FuM Vhjr>4*Ld6 NZӂ~ɺ !)m=C!6y75A"C2_ϽTDP(dry, ڌ(tCH3Z)n7i S ^C.IRy~٪C .Uw_Lj-YmLKm@W8鿰$!Z~}LC[ @= GY 8cY0n؂τNe3O'>qJRhשI Oq?*c 4cG)?`B_UlcZˌt92=ڰ`8sM3 OSo1|G[>[ | G ݕO ְcXp-:n1$,âpkܰ-AtqWW#pG}#q#?0X|S!%G+KH"r&$}O6 U1ڶtQXnL)g6f ,\w^^B!9Lj9],x\6\.w~vro:X/'G@z:)vêH5:1P6 а̅0%̅a<BU`6vEnyuwnM1wk Lpû]/AC/Pwvlͽnj/"Hn |0=[>z'q#M}6{9I?Pд'>'[`~\UaWp>gߛU n~[eM"等g}{sC1{w@\L?+{쟩6v^H]G mUUcl753/k*FhJxxJ䀸aZ:e? Q{3=T5Y MͰ .ĵ1][T]srMCܯa0p _UMG@uwU[U7t+=Scfؚ6@lRO 3M5lKgSg1 uͦ3<Øخ̲l򝩥*纞`v@U5ӳ1TƎaC/1(efN[j~0T4 )&Gi(١oVMCǞ1OmɢOu])ixP|iaNCɵ-CfT{bMpji6gtSs}BS7qOfl6?gN`h9Va E`Js^'͢y4,t}G%X&GJXW,7}E',d i{׊q“?x㣲fb^5O+mT/b˞-WL#Mm']3♶I 0̉E<s 2 N:Ck5HqT t+k0>|0ZlqF`)i 3g!{8@O.KBc!w!,Ttjt'UmDQiWìg>Ί?Ǡߚy T?gdϣ}wf=Vde=gZj-TISX0)<_1Wߧc3a{Y"CDN5uH;0M#sg[+|Pi `MF g]iyG;m$MN{J?'I+ |cS }+ *{Q})w`/N (ծTˁ9gݶȷҿ U-mum ,O/O by,yoͳYaҖ_u-/bzMqHjvZÀ{ -%Laf#,dLWMձL0)<>L1Wv.Vn;`z*ؗŧWĚplfjʼ_}Z,Uhm;cU>Wҙ?v4ZM_>L%[Nݙ|jS1mMuAVQ6f`cia=տa2ɓ}ieɃS+W#}{Վy56iՌihe*ςC^sݗV:*a20qZ^La6ӪB e1m ^/͗A6v+m #g5G̘#޽oXQgcw$q+$v+y4M3 D2$9F0#:r:m(j-ƒL` kWBոu:PFȥj }49F ҕҕ*4k0;ZΆ\eetep铵܂;,D VZft]ys+k Z䋦~}>k@a<BU,GKp3&hsg1v,v 2}_zA ›_0ވ^Ht篖e |b9h< P )_߳t@l5uVMVgP6 o8!уW@ `<9a2 HΝLʫװ1F-U]/d['lR̥mw:fx=ſ`9S#Pm4,KdǪg)t pD l:ccڦ3t5 umϝji⫎ZZ`[{7@qYh8zھvTWPqLk63&GJ010q,/4˩(5/T|L<?5tӘ{Yfhj8 Cr}j9U-m{nhPW3qol< Pg?u47\m:gq0.L\PBS K9&I CWڪ2f:F_u20e3՜6UN0 C wb`*j{)n5SvU3 +l_5s3=uC}kAj*Srղ,  _sucnc>RjYSS 1ccM<89rMSrdNǪŝy2B<߆!&ųCSj.UVSL|Li3|Lik؅092va`>0vaLL]0va`؅žM"1Y>[8VmS͠g>8Lښ)N<?{h^% $WJ%qY3e*O<4ӄw<]=M_$=Y*=O'O2M <5'ȓODm)Md0sq˯V Z(?Q#Y(i(WmP,g  пO~U`%@F7u-; N>RoH&4e$G d8h_Lڶi TؘD4^$3I*?cTA$ZiH&0Y$3}UvyD2y{dhN"E`/xN#!5`H&1/uH&0 к!("ƠW7[drB,h|`W E23 $,V6FD%[YVOՃXq(6 NgXg2cκI,d7de,0دMD+b@(I_HbfTRF1,<6 #u1"mczJV*0{}{ \Ea0(Fad\LAԫSJR8iz$DSyPt *id"*Yc-Sbz<\Jwqk"Trm ,%JG1T[Ӻ送 );!s% 'D  q 5)vaxSOYS /\B:w&:QP7 ^C%P;/޷Hs4trpE@,i¶ :< xs5Q}8뺆ke ewwZvwwLneay=MzDnea,ѳ[hٴVzUG5#m];j?(4D)d筳7S ג^ٳR#Th*%G!X;|^Qq_} l뜣mvM b;mvMW ܗ]olX9Ҧ ovMoeN9/ٱ6]j벲mع%ל՜Ӕt|Luq4KiV%qu9 Ҏbˤ\n% I V"K3a3Wc .L%|%x(2H>%'h_9%*Pk\rOkh\26[rH2HHxf>U]ߪj=)T25UL~'# t5Ӑt=`鱶Φucm hxݔ'ڜ՛.IwL\tU= yăI7I.3 3%Ox[?t$h'2ѫ s,g 8QTSmyf*^Jh S*;YOԿ,pLRZ+O:&=F/]&I4rk,ϤLe&)fϰ$( XsVl/ke=5WۍSVܲ6.5R%TKikS?9ΛXssemeʚs/`칉bU`Ҟۥ+XsI7Ns%_ĚkȞkr]ݚf칭Y]ٚ+`D'Ys\њ+_Ϛ^W7LU LBE laBE̸ !d9Hޜ0d~G;8?<@n<$x"VnrM{߻Q:tEhP4:)=~~%<"LGWBH}WV8Ji7Oɥ,"4U.lOt_{y|s3_zF~矡֗{rzY<]5CW_]O2Q\'ף#P1RkEH1b-R 0lo,JosB<:MQ-հ3^džkヨrGK8->S!9XFz&%[+Oʈ.<ZY̥B(a }bݮdg5Kեv{5EoPjd@oI-3[8+.q}yCah-1%ޙ5oi.rd2*k?MZC}[uTr+O&n;l9y@-%ֵȎZ(;_45>uFnmN;]!@Nn eލE'H:V~z(;s@27'eRXzhHjZ!RLXY 4r*ӌ3SF׸_d`:_Xm *?2ЩMU\L~eu%QWǏaww._msA"ϙPwF}E86ZYξ~^;M? >nv/gڿ<}{x|ddK}zskTnn6F/n6F/*ltblBWeMTr4lg-)MgrYsWa[`8i#UޫrgkAjz[?ΨǏߝUgHY_8V)+ŕ* :IvDө; gX^+ge4g?-+[9ʮ1ҳx) : + ToUDQh#@_:hwhԊdRBIcJSFlfԥ TgԷ+zG7L Ýie[6SNڮfbJej*&KSpKؿO۳?8=c/+ka-i͆Afx),}_ ~5G dHv*n)cNlpp62 q /<>tA1:v K%3H~(106y lw%}j^3cu}춯~*}ʛW?}}zf;ھXg5FEnN/8.f6p_8G1MwLvx޼ $G1L* ZFkoEV_N1k'B._0xmYRN-jy;11|:خT 6 A[%gkҏ)Qd Ln 4h-ck\1Cml=vZf֋D)X[Jkb!NbRa9wP`o{^keT`:+"X[)R `M-֩@P&"k^Z<)! "du,4DBdNY-"TDQ22 X$,C.$y,ٴ:3:cE6ƤG)P>pMQ"PgrA.I!@ Sg Q9` iMHdX :qZGy QQG"R))9NB$<>Bf;+YHQm) F\ASŔƁrհ&8:/y1@RMYf#޵D@4spt&bMώ}G}=msEH%&%(#gP6Az.kwB<Ű ,?3R:}%e}n~kB8YM.a_RMa_#i մ;PMci ՔzrB5BhrBPz4hLn0XDuT*5NJMf>8!X9T*Փf<]92Y<_{0{"Bu:З~AT짟5iIsjtArrat{rМ'rB&)XFM/م)89XZ4_ʡ鯕n8Hb[s W~%Lޮj18 y48Nz%'n"r}/p^KT֣U=JlSR]?[ZIJ$4%XzIMkү!͑nꋙ2Sq =*[٣ζt ]Z6U*mAml3kaN=k)KG8C\f8 Y [֬ig.?ǫ66S/h?g{5?Y⠒\#&l^}̈́۫;d] Tt} %_d}խ2Oꀣ[Z(on|#98BAd5g[(õ\`[ eepq e82WP逃M,aZu2L=6PiFWPF05lh SaOVjVl.`{ZHˣgG'ggN0>y .3wywK$T*O:oy9'%:8Qwwxމk]qz3b\Kxz >u/`J[\2 l|\x.T-B^,`] OOO+E{LY#&՛S)r`8i>?>|YyN߾\O3ukE.b)_zNc,r m ^쾽WcVO*csK~Z VB!yz~?ߏwJq%,uFE*bF-C i}.}%C{׍iqΫRsS=9%9>ߧ˳Ã>=^tkfux(gեϸ:$w.*w黖.F["йGdpDmvwǴZ@]҅/]׌L!O^u\ ]Ark8D>=7TWwҶp_oD {@vэdAtW> Vl>3t\~2t;<(r^î>QO識3&ҪlOyjhǑ ri4Nu9kdpj:^KrpNഒ1.(Q*[2&XT_,a"St Ɗ^C 2AKIO)+S>SZɎ`_SrRSUq>H濦ڴR ;RZ$I) $U;SNJuqTP`J? )ʎcX+үSh6%ґ)~KRj.]+d=9;^;Tdo^zt=G,8FD9hcNj:qib+pS+}>c;\kU⤶;hL7JnYvGc4OqSέ#;-6UzKDy<;MRwfdOG]]]u.?ӷ4ss,P> ?y-~(?yZ,׆ky^_5}SCFy^J7|h >03C_\YG8uX ?jh~> uL61ڊub}XtvƳ}L]o,GIRί'6}$'vN[O/'}FJ/^ڮ0#}s8w>vkZ dVGF#n\ͯ8n:}ɷfu_w;>寫ӇD|jJw -g62mQ%_t}#YgEo,!}TNg=fk)U)59ơ|\z6o~_@n֛y6%p.o-.׷?3 /t*-Qeдw7׼|q"%/qКǭ60E#z_K0pO+A&.mR OI7Qb~D~&ۗx]=*ѓ'|_҂}m!uc1`adӢuB{w./h>ECȢI̾LF|0Nw#}` [-ɛWցSxưǨØƽa”cg>wvROeZxֿ~Rt2SFſg}_~(g (mKhX$ޟ]- U}yڗŇQH\_ڏN¥8f`?q<,!.GY9ˏ l{͢\eL}/^6:rquhۋ\$ eMuuٯ*ľ5}f7cldKE^/ٽO{broqqҍD25cTqW(ߗM"A=bRimŏ& sAƃwWFYBxĩ78>\}_u/trm`-)fq/9x|gBڹ:? "r=" =@W?/ސCgc.*~u_ 9V[jZ7hZKR[q$[R.9g\EY72|nAm╘0k_]/dxf Vȍ"ۑlۙh_iY=g]h\6ۍdwe0e1a=QƞtGt r]boB1H 5J+t~Q1)2af9!%!ғ)NC*45LӛRtN3֒{)YVU<4>W&ކͥl5ֹA8; c,aLj)1XrlFUKaC=N/6m؄YشS "@ HkG*iEk-b6QH )j*o~SM7Fdޫ:1$Zb41 noX y7bтe/!u@2nc,z;(FIEד6-jE\kФ#6P LɔP FSɛ Alj%JI|' J,xtB0vHdEu23|qŒ((G,왰:.ʬ$x@&|pb`tUɮXG;ӒwN D$S$LZJ.!љAEݏ[Bwժ\Qf<%2S:& $v(Fq̃ݨ!F534I-]/#H=(M#X "6{*D ϞEĪo>K䥨l$G-ŀ 8N +̘IhvB&Bį}#0^&HV"\c *#t:6?!".QaV®VDbKIʓ!<lv& aʈ=u3! gpP$-΃+1"!>" U^ T)94*IXpC\LS8Cɍɶ,N*P0H0gεr!Z b蜫58Pʠ"H=fLa48ad<.1IP P]Z1`QVr\%Za20Mai$Px_RANd܊=@_n \$I4&BfGDGpZC_ؘoFBH:dq}-:gmh簍Oaw`rI0u|!} )*CMb@OLyIT 5G8=6"h#|- 3[؞& ZIмuB (EqRrƳ; 섐2I5C'LL[^AEVL(Vfa7dTiHѹg-4@]%NC<-4H'88}H\ X3* A4$F)JD&&l|`'.@ȸmDJF:JyoL0mEJRK&Xd%µIm2%3Qʊ!\Wȭ9AjIX!i%{t ލ&FJvMD!J +D[qR_lglCJ-)Ã5 Ёl%W,vBv u")$!!%2 ˙A«zQI%LTD>rgB ='qtXR4;+i3/YL.CǑ$HL6sSz:<^;ixV}wmeί KI'TfӨ'-5@ڭRW%  \@d'b<Γ :;A S<"jp$lII1p@D!oS0p^L (B&iN=9G@I' RĀjcgȂ$NK*U)[xB?R=}<ֶ\}a+pw:/xo /}FuV8}ڷrF 0-ͪ˾C#}as巧F2ԘͷۮY%,i3ʟʟ!"SI_7=r`pӉZ$C ,ًU[v,".#Uz@aEV*8b 6,F~1%y6/#,x0* ^e-di3{|zؓyaG~>ۯv￱uۛf<ث{?_ф'~l܊vаU%5J 6k]0^A%4Wh;*DJb#DaPtm]}޲C`,#s\տP_5ϣ ׏8ur~:kӺtLO&Y܆,O>wnb6T)syMm,?SU EJJ`"Mr(].h-Lw>TV[q`?ʮl-~Rw(I-#z9_n^TQiw'|4&JOF-^CZ*WvPY%uӔ\57gˤ9_&52f:|rqFSMO)˅*RdI5-NɵQkK OJ' 'y ./eUI?!x2[A* ۚRiT:#ukm('YKÝ$ڭVfJ:nt%U>wgCZ+?j ͋[FJ3Qj?v4PdcPs /@]gHr{;\7i跈X ;x)JȺm&4]ЩZs\!PKp>eN{bLittleCMS2.2 tutorial.rtf\[s8~ުu5-yr8*UM$$!-k{xa"߹J&NI/Q6`t OgAToJ c0.T,t:fp2\aLZ >p'|Ղ|j&nҘ wM#zUB&T&w)Y i ҍ\gn>lyx86y|nM qKm08fR\ѝd.샥Nv uBT66T4+{="&3G0]t]'t}x|BQ~2vGIa܄q}|؍avxOAМ&'=&J aJ/\͐GbCzzP?Kd&RU]l <>by+x4ɣ$:<tM0k< uCz5[Cm~0LF.Ǔ[LƃkK`gLMj%EH`M~{~[,˾{>Z~|G}LObM&m"X;(6% XICx]FZ2Xns-ɔϲDFJ7Ib\[k Hcw>eD[!2zI'&o6%֪)vjEjMD_7X& Γ/MM5:OEjMI@,وb$X:UQ 6DMDO1[& KYb 6߯C:g5Z.H}P ADI 6@?ƨHd8qkH< xI`s~@7sb,4S=hnV٦l!9%+po_v~Y"! ?S&RVGj8~uQE;]v*1fve^$?`)isx m9غS񨛛AVN`=KCʬ\i5 l%?"SpV۶3#&|f۰-LuI>)V`nUկ ,$:7 @]РR;szxC}|".?5ܷ.MX$|J([o3oĽ`>Мt7n؛jI<O]xJ-"j|..D@H.(WL#WqH1;䛼]nOEfo4a,4Y{!i# u1Q6 etK(,V{DX/o@20nq6 F E=r2Me0<$Ei΅HW_Ň  w>Vthx4MPh JbG@C aK$}w./RK*E Kn,P>UKC-  gTg-$Թ[__'K)P-5,%.AuUAQ(-J&I&_sQybK4 xم_Xr}L0@ɍ{ELyA&-Baڔ n4@Z$qDU +-IYw(,' q%XH b5*+g=l#!xARNZm𔋤}&(Սłw Z5jiJJԇF/?&Z`FHa-6 VIĀ[v9R:Ex{%[iƂJ֐K 7R~xh{JϺSDqD Cg݄ԌyXAz'Շs9y~/:(߯>}9>\|W:B,K-15sh&s8EfM2'^ޙǏqr8ZI:ю,4넞&+`=䎘NMz,N1B,7 8Ԩ?KZ'ӫu¨O u!(Px䄔 ױ@utTQ[nCԣmJ(Ze}0 :+oӤCI|Sj!ʀ1kb:0N-^6Va=Zf K4|HP5ډV(6eF5sCJs8Ш!%\ј;xG{HNE\goF-G=opӨlѿh#Aָ:6Wʋgۚ譩q2S8 e؁ JaAEhI9\?D>AVWE!-\؉q/;ԠJ4ѐ,XƸJ 5@yDE9%<܂tnNlp9xEjTNDjÁcd%a!(h?# ^xQ- ؍ Cvloq{dzw#m>} = "*\^e$s;>oLJyE8>vx\wI5 Wɍ`yzԭcd!DWQIqڰCAq O׻Fi a]%GcFB%cT9s  k2: 뫳k:ƅeS6 Ҵ3{Ā={2t1<X\Hb9 鎗@`fBD0c%2n-` UזDkHU ڔqu SڡzTl@3j̵I5Lq\T30e^I퐘TԨB6čECrL vNzRlQ6NEMq ǓXv0AT P) ˂JRiu'c-f{,t֞TdymW*νq+`V$D p`F? A_爊peI ֠3.0z`XA<]„~@Im,95.בӍFo)q[="%C®\n oбlt8d>6+?.*~RH/^ ~K.4!ǢaM;*䶑^l+l +=]n}[Oi2ʂب%JHSDWz;O7//RT [dI6S Λ_! HnDUn ,z1h]"[ K%Q.aw)C9x|O@F?Ε0YW_ 򽔑VFMm! Rݵc96f xng"7ǙS&L(ظ?f/j)$8諼PbZ8-Dp٧>EQO5\3it}JTvo*ij8'kK|bp\BREa ѿ`>ӭk=*w4dJɾJ@_s+T]󇨑G7yt7o-rP/JMϗDBI06Z)}}t0FR.g^ʿmQwA]z!``SPQwO/Wih^+|®I9Ƿ1G!g 9?Wp.qU\8Q[ z?;!xSz(5D$ 7h^$j)> /T$\&INƎNh&OGYj9B){Ωcg*-AҀE/׊wr|JFÑr] T 􏙠t[D A8iZsE1}[xd5~?,e[c?O)-FW ĕYi*Z sPPc`Ba k"Ko;ZlN`U,#o"ufp[9R4.<ŮϮ%fKɠa`J9VPT3s]b+)ϥoD*yO͈e8T>M=͓2xSPWmi-! ĪVJZ ؑʲoI!d]sZR/=IkVUF*ղd2'pneyаq9pՁbN%56xq_ }*F1,u eoc]Hoz)/xHH⊷CR՚Eh0!;1'TU7Hkj뚕'97[~R^rϢsW;Ijb^6\AK$ m5uF%&O?~ Ġt_'`~lngDQ" W[D||۾r-_y3!y"bYB{xѫ-$=%367/iK}X3uf6kvfs; >Ya)dXd'aQsA5HwK_i.$]u<r$a`Yl<[$|`\'aeqgakvS6> ;wHbH,GB Fx(ycIap?gOjwٓ'웝V/p87`bv[w蛝 _s, И;ϫ,T)ۍuk!dNf+fgf#' $FLRŻW;qnۊvWo-2yxWd|\"O\Yf+6cY\fet;g:!ȓj[~_hK,37$B'Hiqsqp339[_"''5ɟN?4nA#z0y &7M `znOjW ZQӫ7ǟ^`k:=8m~:joN߷zͺaYuZj`%e(iCOqL'}%Ys1/RȆ~m ;OWSj.M/kI֏nIU75Ug}Sj% TA3>E58q91/{M+v E$px_bW,AO4ZKR\c%8m}U`'rK"i%I,L..ܮ 0}:q.otE$@dA4 `xEB;Ẻ>g q/7WN t;48w67G'(9 )V "E8DLo#k(!xPE2NIB$oG>gVV1E 89!ZyC]&eg}"~ %"q&?k#F2eP}u;{sBl!dP }luTFZol ;aawo/:}x}<|)!v2gxy8']q(9?%P=5*aAŎp4sB2v(WY Y앆85E@;y.<\+RdJ&0F>e}?I*B8@i~2l]A["^%U0$:iHJ|f$E|"o@ q^wcq7[!!^m '2M0%v]IҜ|<9mom>>9:<{sKtxpXSpsb}r..s>4F)ṛSv hiUUV[p"u$ωޘcJ /x!BNHrx˻cF~b姒+:t`"}-$}>魕'Q/GkO`;T ~M݋d/28߄8y^vZ;@\lK8&!WxhRyaq{N@< }Dž)#HUD?;yaṊ+ӘDbzTUS4d1iq 2Ԍ 9@4ohA|Ja S;tuZHpgn<ЉPǀ_o1J'*VvWDn4W!x"<^zV~q_RiLōNnSY76o XۥHjO?|w>;]G<ܘYCBqGqɛO/B]Kb֕/7ۥ:VBKR&hu:NAj~\Rt.Shk.c%aP7ۧ:ZA|D<2MNj6+I?Γ2K3 ǒ:q P({i>ĪO_Z—C@iF̒!%ݎ o\Ћji )1}FfPq0 hO:Z D!NgΣ MՃ&\˙ Q~ٶ} AzVFm|D9?ox{ob6 p PU_^ZdR y`*iy`1TPy67&@^ M&>z!hJ+I㻅1*B"\=.A.&m3> %jb%:S^wKȢb.8ܐSDffCA$`&d%$1+ xik oSt\BReElEW2(cƻRflf5W)4MQX~0Aڜrxm)p*/΂`Y+Ad~q?V#ى la0mRh b,Tw'p" dJ=ĩ{ * ('5#x礊| ul͎{_Ifvw}z}Ce:H,"rY` Imul0-Rݹ0o q<Ѳ-[cZÃ/(B9XgWo@e"  tJ_/n!7 b,5:C]ү=~m:9{IG:ʫz (]c:B{ӌtѦo (Cֱd$S,MG@ *yQbm4t?.#Lݪ%kpryRgt(|J+h,~VUBM"sJ\a]ѝ-A":5%(dxdҘ$ BA<-:fa{ 9mgsQpe\*BZټ禺u F Vb{D \rimSsrA*癚)%4ylaa 5rtPbco=<<:KǬjj /hXHfhzĠb2K4(>P$7xpI4?g9/qx/G]`0p:W8`sd@4:/ $ίؕ{ZeX`u="*DDYUk]vU^`44dpŲw T.> }nNN\\x\ͤ_ gq{ˊz$&j"X4HI=p暗25`kj3DUQ)urR^p;Fg-f&3L~]Ǽ HMkoS[ivW9hO9[' n]Ѽq->VU 8cs%3#ľNmF&&e'~]dD7YYAc\R>Mb:4`L% N1p/pejɧK=gF/hG{OED?jH $RJtIQ!;e1.`%&Ɨn}rR5λӠ09QIEOdg;pZ+{-\ȡúuonjrsxm(_ oIONF'bV۪+8!-3׵A)1qfX~ *Q]j `쁔a7G"Us}%Z[QŤA%e"v [(]r&Wؒ}mu7$~c{okm+p9_?$sK+wL.LkV WޑhO;?߾]Y>zud~]4..dWc ƊXR+|NH>voOe*FAC?߈| zG@2, Gt(W8H 3Owsx힜> z*U>q ґGa #4Ӣ2!EJU[RWI ;9ԗMm"<'+ ُb`s6͜+szf.(&&چ9%X܍}ğ \"j{,0DHe}W4~.l#"ʹ/%{igeDQ-2Ule^OJz.%^u[G2/sG^-ɴ?].Ml,I59) w;U_IfC7X FFl@MnMzȥO$1]G]+' T*e@~r[_Օʑ=<H#^P=笆,NF-6'j 深 FZ_&4p4v8W7blO&-ņvr>3H$Y@N(!v.u`ha, 1IڭJ[A*mJZZJ^^# " fO0QnqO*[ݒRvd>Ę`=(qΆs?zs%ZNhM M~v6 AܿdDfH53R=)Tx2C? ]3>_0NJJ)¹or4l~:6dC F+.!˃mRLSNE[>rLMRڪE \^ʒg0fԩv(?5Ep*r壑Ѻ%IfVLJ9=u:/ҟ?ݼA-{d$(pMBKxbɿcwG`[q iZ>;)DYCn53O(uR Ǒ{kL_v@ʇb#~$ ^~ rTOc§o uikpϩU nѻŮldyRqL-CK QI`xz\hΓU]38.—IgN(g9נF77~6McSؚm7,fBmDLF5%tjsK=)4,$K:EoDjށQԫmXD m-12cs&0nsd cq. EuNg+*:%u#erj9rF<"7"@I?;æ^Ƭ0W%tj(#8ar:b N?Mk?fY G|n(* =*rO.f%?ϽR=5VqGk45<[Iڛ+$㥅鹀Ϛa5,`j%":r[h1#)2[n-  : hkȁCX8"DO`4gN5pld2+\А7T Q)GlXG`AC`Vn98vsIAE' J4|0) +CCܑ8Cy2d&iE5"%|Kj%A@%Κs(|0WL0ɗv@7je&oWbiMAђ^,t e؅3i2Ir%n;.$J@B3l&xKr 綛hX*mƃpUH0a\rIPTd*FP=1lmhD5OKD/EJH&(~ZhO!dSC1ƴAWd*Kb3q2*`yS&Lzk!JCQoJql M7yk x_ UŸ͹'I"oy3܋81rqvڡ PƨU *˒]Z`P@dLky:&SBM@C|N,;_rJrJQ]ʘѭ&#Dh#tELzɴP ]n:NBd:"ɨTw=!ٳ nm~+GiZ(PwIZʏ3lɩy=1xE51}Rd L+Y,tz .w6i(cD+Rbi2+qt`86[0:Ĺ]Ed}Fd/hG}` H2Ӭ,; J:_}!bŋJ~s*ͩ7b߷W_&]m-:ķpϟ>ېH ]e*vO٢6={Ix^.3G t:>]J4|郻odA1Wzk"tbKC⎛1dkIDy5{};Oo,1|ekK2cRY{TQM9B@0ȶ$ͱQ ލIYK4/X+ >XW.1ȩTe º]8 x46Kݬs ڛQC-z3)q$/ d:bUVoNPЌqW! 8w4MY#JTU-s b:4电s^Æ?+|&tnW]0qY 8D7l!-90{Bc71U6ʘa%fahd+ bUAy͍Y$(ϡK`p!!3+FF֬dD8L}Jޑ+@ ҈Mp6**2%G;Rt)kQ0$*ÚEԜ$x'̡s$b6XfGvoߧ"͌sr-j(I^ZYKJ@x 'HkisQk3A>!ʃa|\)ԙFƷj<Ǿ,muHى2 RquGޙ)}J ݲr<5; Yen35)b2Nq[Ѩf3i908 x~/纼[ T?cbg/MǕLTXqz$el7*3L@0ǚB'93?OR\1n!TAO<2>Z%?IU(qDV'!ʓjD#-jm5G%+N"OtY*? gX2L6 h&%,F,I+tܣ$+cgǰ\SY̅Ku+D\:ӹ$Om=֬$,UF{ggݏouv>,1lKRO/,!%1C7L5SIn ۓqBzegvmC8_ۆ?]m ɤ{5wwHֽ;g.SLxr+a'S5ѿF$7CK})l^٨w'g[D1$d< K11^L/(Hq`GYt`4E5 *~4G`~$+lEe A{GUFbzX+viN N$.vH@*>*,]av5$aG1=|=xmH۽xJpp$#Sԛ :n|3g\~̳^$CI7ژ$c,㔫B{hs Rg+ޥN>A tӤ@FQkx  A 9# lq}ky1jr%*> w]9@X\^SI9>vcE @!RBLƝJ? ⃀( Z&Jik3g%zOp\SQTJ+{Cz.k` 4d'v Ǚf)D"y+@n\e?ړgSfB3߂frx k Kihb(hL&rL+5m Aj9#E-7LLp]{7ǭfxx@k& Rfo3j3,>UFB<#Dkyg,?gCO@F&ghj1[HMR.*%hjxZoLGF)*'D2cjKֶhmB ea>h7h'+.,Pw*(dh:B8NG!p\ri'&&gⲴErVmFM ;5T "8^>b@H!y552+ 37.Ƿ,~)aqg<0M\$-*/tXC1h`Rv&+Fj5ɽ?Ad /.Z .G \ˑL`5U)L5q"buI ^bsfl:=Ή6Ͽ"\ sXf'0%MpO%mFAb7ke$ʆ$Q6K:%|n5n?dFaVτ:,|3{ Mvu r&e^N=!˰.` Ta߰hLўL!4MR ]w=Gh\AbӰӋ O)'/$12Je} >暉$||,a68%?JbmS Jopgz+ :T6Wض^Bϟ[K5^I,;w|^dj;7 ,@NZV8͠ [W5j -vc)bуQ JLfMO4$*tRlPZ'ۻBHFH ں  @<8l&1ྉR"zЭڑq W\H ?)nFb 7eDGȈZif2.,;3 AvF5Xms=~24^F)WYw[Z(*EN--lJ(lDy_][f z>1, _NTV1k0PEz_DXǿ1ׂ ˔^Lhqq| v|AIt8E n(zw%W#Gxn9SȞz,dIhh:d)^&?k"P!D0(O)4L? Si(-H*}*g&ePz>p_-65iR+~p[|._>})2,I`Goz~{Em :ŏm5Gy'G']~c~. ]}TVm0W}%GdA٭~ߣ=><>~hm:̧N[Ð m駓W Xf9)#Ӕ i͉KKLFE`P2Cx0 5Go4kN}ï"Rc{cb{7%Y1 5!S'ґD tTJt4\$Qz)j7\HatB'ZY<֮]U\@:~&~tΛ CUp<բ]$bAE2 K!2+as,*bN$ϵ^-juR%]2v?iiGѮ4@e 7/2|qf(r :, MWH gT׌fȣTw5=ň-Kz$WNxG )~1],S"AZSCE!AnZE%.",q4b8v&`Z"TkV u[ 1睟3#Q=:bA.QR=raԾ QIu(CRQc~t)o>pp}R"H_PAN N½K 6Bt#|.M{'`^Wэ%bgD7<Qx~Oi& yt>2 ƒ6 i0 F,!x}ӎXV$o; ϤTe.]p"r sOy"lf~}6.Qj &}7& K]!j=t30Eϡ-noD:MsV;Ot;Y҂ '*Y"]$QaPjt3 4B=F^Dv)HwdKğ 2Ra{Z@|ZDE^gL]ڏ<@yW-Aw6BRD4MB5BbkD^ 65ĺJZe<I{$I."G[_n.-gn(B։;lt"FN4*S^4[>z։ǔm@q`JV!\q.G:,UFZ~q<3+] v"@%xN3-2@\R) q#q%A >"wHʤwwct*t'7HZ-5^~LbE<^ ԽSn`K9aD.5ϚIްBG> /P\Pbmج~ 7Sm+X+N?B>Uszywߓ1.7OwY͛b/X<F,P?& K0yIف? eƣ1eVy2Vg"DX=`:]ٯdtGc xVXѐy4+FVjT iQg$E]dy}8|$=أo3@[0 5TeA_4Kc'Ze 2H+*NWL!P.$vsؒA Zgo8MjzrX@aAcw9Gcv!6Oi)smXG1I6Ւ) "&U/D> ]ଗܤE`j0/+e%\/:gpKFq:0ꀙ>qnoVaw.;%D>Xb/nrlaxTne._KXtA@/NmK u1,rղGbCBFsd' Tq]Hn9Ϗv-} -L kHHCDc-fBn|5{GZgMsQp*-C"~T )Jʱ%K̨!ࠊ#'J_6fMN{ucأݕ;aϕQ @K@$,_jf5w$WH* X % JK8U|lA}X;`ԧjkrB^DsZIkSs -{@e% jp\\{!1l}~Nq7}k(.OJɥild>|v+ .r=njc"Q54eJqA4Wc$iTBYiBp)Gg 'Y9#t\3}OuшOL>*];Sx*ɗow4AtI8ɤ?%tyR;Ef|8 Ft>^f'%=5e(2W+r&D 4MGWrZhhQr󙦔rakz)<+H/O%6 'sTfywJk凎2Ns u.#qH af%ܛveMRy2A󥉱l(d4NkšuۥZ v $}6;mZ/؈(aQ[XWZZaH4{z-*s6qd+s_*ҀӢUdܐΟ*T+8N1{yCM_ѯMZy8Prc̕5l4C#%aXymMu/c|cV;,<꜎ XT.cW@%7HĀY{pB~}/ώ7l~Iљh,C8< σ7hȑ|Dh?$HfR|fA' 롤mT80ubW+\CicT·YUx:kb7Q3FVY2$m/y!vX6#|"Zo{bt7&ŷvgg`ؤpjF>X@VZFts%29 ,Bc-};JdAa;rD5VJ.C)V:_ 3uk3%(sW\,K%vm}+wind5ILR Uѹev"1א!n2 Io'wCa; ݡ8rL+ӏ;9'9 *mcZg)0Nxf3wߘU\|̲b)};ybV^1m׳o.<,8Z#MV:VY!m9W:z ą:c:Hc8*& ӱX&y|KQG*#F]fAL1Q3](Nb)m;墮&A .q喱n*ZaD#^ #%az7s-!=ądZ;[B7ޡ|+«&I3fi4AMn}\ ɮdjM)$țnLd c,PX<MJ7!F'ၶ.XK2G\1$؂%Ri[ٸD!% sdXq+Iv@*ӶxD0v}Dx[q7X%o~cbښTa!&!hPZT⧴}xppj#n+*{1敫g |nTrMt%o'Fac"6gW# $<43]2qo(ḆGHW"5.=K<<}DNqNOeQV3Q:6 b"gbG}t9ȸ΢o5CG?-8X 1lଣ9Sojw&x LlRt>jA(Rk0!4KE4!Il}:c{h*8Xߌ/?|`<".++ 2xuI^ԝ+7u >{VIP=q꺘DeԛXb}jWW_m\I )1u֕Y[k;0>@eFA+>`XqָBBZT m] 3`,^ň/h[ң]4Dm޹-[B#y:H"vOG]MkaTn'iBh۝):t Yi%4١[<#\J)sp! ݻZt[gğE{5Ev5Ҵ6+aLg0Xd'J)!N%_f?aUks8GŘZbUXR0Ƌ>L#kbDP~mfG󮽉# 7N*7ЬIMz3HUwo&_M2Tb(]`cШlrDj z\յa7[$ijK,Z$Y?mq"ҔFo$~Ӧ U_[@qG 0]zF͔9/b2`TalF'@?LʦJvwS[B۩L[G1xV f3T뼢!uWлR)֑<}ߕX4'C/|tk#%ZArJy:*^z_BuoՙZ|VS]27z2sK}yB}."A]U >Qf\\v T>gʣ;D)6*Lwf7E[' l_.I"J&QOx4Ndl`h\e.>/?:юJ'-bzc%UoȮWvKͺySmչ|k+?vټcE`Rp^۠,iZ =ٓuZԾV>O*pme-xK1"еKYHq+/}f̿߭n5zؗ4Y a94jTgM[}:}[xlӲ_6? Gb]3Ȁ|L=Nf 76^YEZ$m#W֌oՆA↭r]]{:cn_do? )t- fj5b>5k%m69^`r|K?fKuq#Օ9-GQdtwoB 闏Hz`\}3cjt;,:bZ>?Hp'ѫI#m_MOx,KDו%}IˋqsGwGjλi2JH$ c?z˼HΩ–TR=_a!TUʎ2\;9J@NBmk7$jYshW["g}h凤+96wi,}Oi$ B ^s)& V*+!e AQJ\Ĩ]*ʯw n (@$a cPVa}*%>>"^N㗎罗aTНfHȣ:fB4wDX()m8ӂӝ^R@4,V'#?bR#'ߨ-sa0y/Cv ϑF༎\1CtM8- UU*(D_cE&N~q}IiqM \ ϥ~FtQ4Ht^0<|lËVzUu]](+퇽Trp:2#-']m0X6ɇ|*Qۋ)c\'}9ԐO hY[*Xr.Ďs&cRj%Ȫޣg1j:򕋇rSP+MGlK&@D|0MON"%ipmsCX:lgB Z#8] r|K,$;fLˑ+S-a|AvYrǡB<# I]&p0Ht]@|lap7ucq*2RrT&ЏIO`;'9tItA}p? cM>s_qwL[wRIgk:bFk۔hbǰ$~A h06dsf7I bVSM%p#1,RNrWFΛ'aa7Ԉy)l *iMHŮ dWTe䥺7 +_fŏefyCtl4wg`nP=#Tv*a"N`̉ĸ"bQlKEQ("(ab1-jul;p̌rzX;oQJ* Í8+ $6=ԩ?rIYJ5IaVu 0;vSPRqD) "O}lcWdCEq#᦬UJAf7*h)!\",1!+"˖e FCc%miRܢϐ#+'+8%W3ˀ.!+ZD^}_s* jT3r:̐>21謹fjv+ƩhaӢH\4IM:ϝkMH?C,"z5IϹ 8˂*$Vtf/{oMlJ'sfwUp6I: F=k ^@B|tW#6/tCN㐏.Ly`^i5yUVb)% 9}=z;c. ~HZ߆K1bR.[@ 2bwCcŽyM"I b^r=u}" qpƯLra Wnbi-P᰻OVVkآݽӉ%vrX9X|JrUQ˧f7-*٦ ·h$i$ǧ$z7>ޙe)I +VmMl1tEuY4v!g=qyէPt\'Ɲs|7 fDXۻ.qf(,pa:w䬉͍alb!)%_O$>#&pt'TWX|&յgH{yR-ޯ~ۋs3 a$e5Cͼ/iУ=̅laç$ab4D d_ 8S;\ |CbxCsaTGK<N .sݻ8VEkX0Ul=D uz># v0|wA.!tq죬l7r)Bhv^e=myYb*0sX:oȕ70xp]CW2[$YUǹiTzsX&ϤTC yލH gYG SrsI)_9_Cۣ7ڰ}٘uꮰ˚,MKvֆCgxObo),_`.m u}:Y /_d=m8'P4щEsdB*4oBR2S8YV{BzdC9 6T"?dך;Iɠ%ڇc^ʃ`R FeP<%4pdsG#a7UyNqwfգ$hܑh28ݛvE./a0 /9L ҤX4N3a$MQ[&.M*ta{颀W0}Qk2h&--Ɉ B_ FR "멮:'Q I2IEX/E7a RbatDԣOOL]mA:g˧Ǻ20,ݚ7I ^ҨYZV~f&YN+?ݻA% ջ|=uv߶vǏ4png$7{\+ԂpҚsߔo@Y"˿7۵Voɕw~l~bQw WW7b CeJ p 7fBVTx^uK3 E)d)yO d }9,AT(iU3_Hu٥֩˺SɩD;[80$U1؏S%b-;UTa]Oa%eDG]dSt%F-=Ɉ!贞6IQ2ˋl9\AGc)mJ!NjF^pN?I<:}kpF8DڏV_S [ wzHuXcT(՘9 6LuaOQ]Hbyat ־K=N9.}*|PL_#V՘ٶSdpO-ae!pSR+d ]:59SsIr0eʗUˣ݃7?Ĺlᡱ w4Qh*Ru/2.ŮauZƥlUٯ9hE{@ eB+=TW|h~ŸϪ63 89FgԼGIF۴i8*OӇMX[ߐȊIH`@n \Xw6%M?!~;{tۏtvE.bɨy~NI=Nf69|eHA O9)'2^,H6N/3ɢ2j I%<#_>0I>(~־{3w(xwV|zq/ݼJ/DsJ/s] '+oiiud/_>/EiPO&c9z$4CE"KM=@B?'#w6ٌ1&&ۋCs( |R:JӼ\S.VޚZs)6&bP)B#z q| Pq;Q3:a%ځ uU`zoF/7֫_#suU\&/'VLy-R\:8%t3J6! *sh}f}EܓCxYՐ'F6}<ݙ9+;"K偺] M<;xNŊ{Ҍ^%יl jg|K Q؟n8FVݐq4;~|%δ1y<ĵn *_wMZP׆/?)$V7N?6OWج<:~Wydk7 rz+1D+A"|/Jd54/1ՔNƞ>G0r)1ğ!C/vyR EG11=? yu6AюwvTTXf njC0;[A4aub|4,($VGhq~Մf 6bUKQ[d6xɌ_8.w=xЇ .k{ փfJ;3ۜR ά-{BU>Kds\;F^F1Ibr0Y"g| ŝ:6}n9| KNGBҧvICSϤɾ||盞o|/fs}k)RIcd//6v/}AdCsvb/]!EKΥ\n6^Z-צf]`5,`K˯펚F_669}F|U-zsI`j.Qqn05Ŧ/Ws+buM}='ޅ3fW|%.;Ij:a;VQ" flbt-|9ߴNOf'%l9wr6J[ ψ|ù-FptP,UO_SLfmE]o_}nnPadaFaҳy'\2֕B}ԗ1䉏fC)zdqbaG;; W<\a~F Eu arzrldV@?-*\wO_漏990j@K=uJjp@/e>EiLQR҃U`Mɬ~Fȟfc6-_EmreFz0ԐgEL v5b7 W$L}VxH%b0ζ=)#XX?){ՙ҄s4GT A5ۊ㩅N ":2St,Tj%)g^.e=[Ĝ";/g)#}7tMĚLy#C^qRuʺ$?'d# A`ɀRDrTM<rݠku;r[&m ϠHu-'Zi?Pdلa_^}UD:79R%VVZ*XR;Ɵn9/#@pMFQHuq9d</՜$e #{_j=?jm yA'{c+%V ȯ̥}9v|F#h.w6>^URZƬh@8֘9)t?s^f>%Dyd:yٵ uB1}dv]yصQy*F5hyž/kGh;I޵>m~֌>$DC-YHj;bM*!dw_w8Hudr!^{,nǓi?qaŝPHV[x]nд9L0}P&<'MowmMcPr1 @E;ɨ7'EEZtmrC k`vh*dk3cS1 [K$ϱAHGh ;}C Emz~PC?1(ߏC>HyMgDc$;;K:V }≊{Dxc_ZTtN9 59M0{,I h̡}M 'Ajߔ!2%֑zܗ;OfiS0 b8,)6[3YMY7@~#9 MqڄJ* >$Lu07vC{~<3jQNCƁZMLB&>C~[rz;>#}]Ng ^y3M0|Τߥ 7tTr&ҊgeAC,ǜ4>W̓ߙ;na%6+T* IAwY!MGL7ʧFvL]8`}J\ar2sGo)m4S4}ir"'ה}؅ 7`xhrAxC/!*nwcF=jE5gӥ|>}˅wB<Vp]OղvbɣWO D!+J5΋m 5 -AMɔx5 r @h0NyhkEf"G%-KF5loŊA7D^Th1=u s(:wYP''_dlXNN?NmuK^.4-i^aI2-CófBIiqgk^_C*Bi}Z6R@d>%hU5.t.Z?k`3xfLZ2ΆhGrxn%+>~}GPe YrbEȽPCio~1z"l0I8l-8?lR;Nbo}:#>UOh$g)xh] _`|}t! ! zf3d4hx?TwU}Sz)VT+8HVl:! M9LEN٢(]0!H7g)JlQaf \%Wm_U?*ۉc ϋ (-X~0K?1WdnnΗwr<>8n,KoҔ֋9 F{{5[#'g{b!gYVIv'Kᑓjp@ďOT`O)y̖j3!Ѓ0ً5Z)N?#B\@"狿CA. W_=sr1ީqT9jOP-NFP0L{NoOLj0M>{J}O,Z֞QWnjF8i>Y6Yd}]n B)0ʐ͒aۗm=[+j"R`eO$˪O%O?]GL: LittleCMS2.2 API.rtfPKWo>^ ~LittleCMS2.2 Plugin API.rtfPKp>eN{b LittleCMS2.2 tutorial.rtfPKYlcms2-2.6/doc/LittleCMS2.6 API.pdf0000755002406300000240000361320212311617072015620 0ustar mariamausers%PDF-1.5 % 750 0 obj <> endobj 772 0 obj <>/Filter/FlateDecode/ID[<4417E458929EE44383813637961D92C5>]/Index[750 49]/Info 749 0 R/Length 104/Prev 987547/Root 751 0 R/Size 799/Type/XRef/W[1 3 1]>>stream hbbd```b`>"CA$C(hIC<̞n@d*\ cj0; Dj%" %  7Gl "300 hm endstream endobj startxref 0 %%EOF 798 0 obj <>stream hX}TSo"B$|\ ``.QqX&;x)b@zΝR.h' uVI-N'aR9vGiǰź?vޛܛF}}^.h ^ Cm @,w2.B<&<mNJAYI4Oilmq(v8/1?s412AѣCY3 d Yɗ5IKn>tef56G-4(jU!] }Z@~m*Ver=H]E}KT=1y$m3sHmAqXu(I<6gNV4(95>v?Sr.@my N] Ծ+69O{M](d7xWٕd{"<2,kf3gy Dzn,ma^CN/s]Lȱ!;Z\`3Xn6l+OhN}ݲ{Fཉ5o:U/{ꍃ\kKO<њU7?z<2*1*^5qNlTHoe򋙝Ҝ}&LfJmQё-~nCik\鬤fJszE;(Q_d `}U/1mP<֥7}:SK%rU,Z-:(WNjrhԅYT\+.S#KLtbL5M2ٰvئNޝO*\[|Ӽl bҾ!9Ivħv a4w1ɲ/Y/~WPf=(\MЊ`9taTޤy1PJ4%xïgYٵwv⶝E:umjsK knۼ铺lO*PRfyQþ' ldJ> endobj 752 0 obj <> endobj 753 0 obj <>stream hXNI~L"ӗ!%bv4&+c#{ mc3]תSRxOBk M #::"(BT)RPP!bh0X*`57zxCknD˜(a>%xߨUPG## k-G+< Niop<_ L]RO-U;G-ONT2,gNf$Lɬ,dP} !嘔ͻ~M[{[]՗M*>89gX%gloQ[O mګ ŗz8m  Uwfc!H]\7ܿ;fԊhe;ڃ:Y^}\~mR{M.Tx<;^n!0,:+ #0|U: ׹m0lRNjo[Gm=~;iӬA}EuZ:`Ŀ]grV`lG3"f"G̮ k j"(Q$CX9GyXP4E 9>=,;(jA,$"j)܉1aHB3׶L]4 HÀ q90d [>Jo8":>jnAnAnzKpf,*DBХGzɔNIi`-d6 ?~I,N6ݯ@SX'i@I@@GZ Ʌ{ pU5`q3$ܖY,u3JD+0F 0pat.ݽy-2iH{aZ{T.rf)޸[6<5 ߵBa }>S&e2.&ݪ 96{ \ǟ`إgns02Ėk JvËGpAgPޛVXk=?Xսwj-Gy&|u ᜞m .™9'ܟ:\y&\>9 ԍCBq0r1A$5D.@ *eTl IJ1Tt!cxs$1!ͱ?; L@PK H">YK:R&we]-*hYzɖ+,X_ Zc-gDWZ+u, xdHmKBg"^ʘb0$PDIr3R)fL#`0A \ؗz0r;D,Ma¯Ettpqbe%Hsn]^9]Kϥ=/tw>stream hTn wcO T)b.;N!o_Q۟c~^:w p ++NC#:fxmI8w~ жhah Y$秬<ϯk8O @)82~g^?q"q B+xPiIz?/uM;xVlZ)XfҥpeVl*cS12#;m~ endstream endobj 755 0 obj <>stream hTPj g҅Frɢ{Bb"_! qK;EL0Yg"~ኳup0V]/*a_.=׉u]'"9oG&3⢭އqd-'Y{v[~J-YY܂IYG}o endstream endobj 756 0 obj <>stream hޔTMo@ﯘdg!m"Q'/GԦ 4]kv޼Vb^ kA $?(Pp1?o-1 Q(PBBMݿϷ-[Wn?R1NVRJn8b#POߑ8IXqa)MJzuӍE1Z]2Él :(󠁇SV/0K->/RK+;A}(C<JrU5|J r{:Z|zSYSU]V}=#na& HցSYHNvJi4l3ylF%E h:fI ;hcM՞oN#`6? ^ ,_+M!>΍P7`FӋPXS7w ?,S endstream endobj 757 0 obj <>stream hTRN0+iT"A R3PA&Ҷ+*XDr0y(Z-ʊ&5* _eއ9i9ȍ.$~ُ endstream endobj 758 0 obj <>stream hTP=o [u*Cd臚;!@T0>_λ1%\JናHΤhfgq- Ώږ\mp3 w+Y$ˏk8O @)82~yE af,.Q$'VqR;=H>stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 760 0 obj <>stream hj` R(`0L endstream endobj 761 0 obj <>stream h޴[|UE>Bt DDPBI$B/KD*!Z0Kl6tQQ\e] w7弼>4Kw{hK-Z0con@GT͌9Wb?ě gDU%߷5p⹋/'X6g~A{]Egnq:#.-ٻ݇e .$:t!nBE9[KQvJZiIQd6vLӴ-L7*\*K3|>J  {Gvg=4OG^h]*n#ʧ`[i=HP^}vRiPS"{4 5܆PSWqc"t?osc{HDi R?i&zf6͡4O!n~!4 JTiZ !P2[NW ZIе21+dx9p]7sҬ5t#M֟3>Jim{pVN6c<ĸ!wѽcFmfd"9z=%zH5h[vѶRЯ ˱TH)U)=R[k[B[dkr.-=a=s = ,oѫv#CTmGjy8Sr7o.@TExOӴGw&Z_7v:g/+6.gf tOжԜX2cl?q "bdPā,#8SVE%~QX]''>VV :眵j*PW_raRX \OS~0rD9x|Й(F[l P/_c %e75ß%߶%T|? P9`L˯Up(8<"zGJp.|hOy5O3?%qKK+J$eGL/gd uum &jOJ.2XL u㳪L]qYZ!%> DR!{ (TT֙J u/U1mox=dfZU0(`UA _OB?X=B0Z1'1Oa@eQ%qYq=6 뎹߉tr(),? Ö Dz(.)Rd1/P/A P.53[ kWe:ăzf6&>QF"eN6@ *m*PWsitbJ;JDHͲ7Ի/Vt<;&P5֕:zQ#D]&TU$}Icf%yh?"_?%}J-o~q_sQXg0)4RQچR]ZTE5 I%cP>+w:yrG#inT2&ĺo 9Ta'QqqGۥX0UZhӀEN NL*L    ތtknr ?`M|R} w1V#,Wh Mt :xѕ;S/4H4H+Ŝ/M{&؅T̲QoiKP%}=@֗[iȷ朆/6J0Pq͂l 9 d々_cDdr7ZlT&k͏nAX.y~R@9E+x`WWHr,PpvJb@稓5K8o*Գ Y˵h`eᰶQg] k4tl hGӭd~Es1R70%hށw-1 (Ϙ~c* HḊ[U&9tG4@ꪷ3"tۀ]}R_ZQqRR`Vk7. V!u1̗'%3\b;=-eڶryKW2ʆ&4e/kpqByGg5m!`ݶmayBzXO=D8i4I 5Q)CkVnOPZж#x}FcDSCkr~X(UasE7E@B?b~'0r򘽩VWyƺI-  s݄"6d5Yv&ݢq-KD8P 廌F?wt:bܻ4O@ѴKK:f;y7(ӄ sx_ٍ^֎O,TN=Իv"q`-2ځO= |bQ7 |!;톁-tit.FaPg9hGzآmLax/˵M0Kaw cvlhG/3N\N2Ө4:7} |X oEu>Cb r`D&H302`Se`MSk"YOavsj13ðuk%@7 biMbss+`܍վTλ "<н lބ ~ 6}m06ͻEI*1v.*k4nbLϊۡ(,Yj]w)Z ei߃VK2O&z/]gUf/v#3P qC7u0VP'x}0zblZ8' @`vHsZwz~> Ts 1?xAOhg;;JL7D96gKq4q9)ȓN~FMWZM)ə`-uZjy1Nc$f0i>/ٹ {nxdx_X׫i tj »R1oeL<(jĚ)\<&-h$ہ%cFFc.O?nE(=w0FѴp0H]h0|a[- sy7Qg/"_!M[_zY܏4>=֗NbiwaF-S)$ }ڽy`n]@a{ x ػ/d},{NrʎtKTt$sTkPL§6[}p~D[`N͇'!ZOy/6 H_+}혇SPzh'XS(k@Mgoo{r)xl8PvQxU@yAhW_`!%;ye@.P$Mig s3egq~ |uᣊb"@3GuWÎX$}E" ?)}ڽ׵=rĞ`7k mo<z--|kFx=$Tx?\ D_a Kzxޛ{kmdXޓ8K"-xUq3'ʐcuEv\ t{n3Bv볿sA~T{' hZ.᳽=yz3x-(#Z}/}*W Q)QK˱c+l?WWi9ykO _]9ڗ0 QsD:Q{ lK_)~{}g| A98s7JB{̑|<qU5 87<0 MH)~}~<}s۰5꾌?s(l:̙G>mV-;5׆fٞ륞YJ'1^0~1taF7+ƌ\/7YK)m-MU2Jg7t~>Ny:W2Wb5ws+-$'>gs/eY͓Q`sěe3ٵG>4>|uoB`)ک$`VるɅ |GW}35D_ <}3U˳a=ĺn(3H/d|$oyO<"qtǙ O[s< _*p8[?w< 3N=0m-ęN rGqSC:y֥veҝrK#"ozW@Ϋbߛćg .ʖ8ے{pXr`C<% }yuq(K܍ B=f s`QcN()ݳ8ooI͟X3:^{86GX}!g}pi$#wW`)x|CXȪ{p X #L:, Ęok# pg.wT߅Y &@ PvwfPܡ2OGw}|e_{><(<=GBNw6꽂 Gr}ዋ&z B ?g|g;#r>>m>l̫3",ܞaD~hW31X[XwZ{(i@Yk%UxAvWvE]DMKk.Z,ߨ'ӐY z9X)[I ;uܫ ?ȧQqhs)ܨ@u m}yV{?F8Z={M}eLޒ%_ XȮs7x/uw3ٞJg-|`O&:w]TO{jIC=);uQ=rhyʝ^`[uzDylPvaDIP%W(țC3bOv?Y](_@Qz!wsXH ZciȦEFOBJ؞zҏ"u?XH1@R&ti[)쏚v#Q~ [Y}u`SUJ;;fbF>o.pyg};zzݠ*do!D kg}-y z2goloD />I|(k};zbP2'M[͡ >!4%j7۫_bQRsjsS:zOޠ8qCm&oH+ ̢Ny2y b=Mίϛ1}x1 =43s5w^禠Mb 2_L?QӘ=E^~Gx/;U>޿otSw!lU rC5-y4Ft CXXׄց}N񕸣iE`EπwDꓢʔwc}??E ׸OAqL/ nwм4"& >ٯ4g'zkˀDI:<jBR8垎j]Z5}"qF[ʹ\P]9_ݽYn"!t BJ7?iTm}>t|80jX&UaY _@j4nEU 4Njp_]y+O)W3%>Uq(RS(WI>TxDZN8kMT{Mh$-Ѕ5,Բ , K .TTED0 (l o Wywy;&wLn᜜'(ޤx8FG)PxF* B2K/R/Py~hp^=R즙bvm#!ˎf&g(Rz(`l[ȑm"ebDlk@ #r)~@Z@_*~.:WN@ňtEO уffV入V6(R (Rh(b](:S$Stʻԑ"L5h1'"Ruq1Qe2"R :Ȗ)Fў".4S(4@3hBGJ3Ch5`VTQq\&о WW'~}eE _ܗgJT-~ pc983pރwwȷ)cxN1E|1?#a_G5_5N_1ֈ/ŗU⋸{wA~x.|/# {}⳰va|'8 c24C?yӯ IH3ih4y{a[n" =FKlNfVΐk\URuJtKr5U*u MqMJIbibX*rMc8W$ 1RA`45R|Wt} O&  rxkuj, ŝ>$=s>r4Dh9guQVFȋ#wdn;|Rm{waq8̦|\]Y[/[5lfsYp1lMrh5iܦfhCQp19|ta )0 YnC\N 4z.]E]osͅcSRvYA^~&XSI'4s YM1_Ȇ5ōд>( hE5;ؐߛ+K E^2W}//ox43|D' nnanX F s>lu0f@-LiPPPPSn)PaLb( 0Ɓ0 ` Q0zȃ0PȅȆ, 0a~zC/ = ! R;tB :B$B8AxXhH CXf0aPV5 95h*\_~o2\o"SW\ο/ >O> ]xކ&#p^Ux^E8/p~x^n;alm C343 O c!X ^X pNn`9 `)+QQQQQQQQQ==c8=c8=c8=c8=c8=c8=c8=c8}}}}}WGG5]vcX>&cF|?߱ÞۏYnV0L;Qco5b+l9r,ň~iy .X=f© ܚ` *ܧg޽MBpW4={ #5'~+֌j %emCCȈ;YN405NхjB.}$$Y쎸>"aZ΄|bZ:`RfG͚0 u݀-ZC{աEXûdOjYfUֈi|-ӎxzˑD{>N3aKt e^̌ǣҢ#^g9CFz' ɽؗ5v#~Na|5>kQaFr_!JLHH"c &F7^c/nr÷ 3ᢖ)?=}>=BjZI|.9^LNFӷeJRT/U*RT*JRT*JRT*JRT*JRT*JRT*38j(A3z`fmm-mPulmX>-`Nc[[mm-ڻڡhDڸa,œtV>stream h޴ \UEg{pL2/^E2EAD3R} z,1\ӺXRYOjeK)fι by~x33ߙ33gf;3FDAGhSVB5H{|ا't"[f6H"rv~nȖHTҠ!3 Gԯ%Q2ҾD7!!Z[^{"\kQ?Dmy23C_<1;~ghƸTjS1,chֿR")ɑU<;"+{QB3 D ˏtF~1c?OѴ^ >XKdiT%ߟDzF=h:ͦNZJh-h/?q7R L6D$nU`QG2JX"ťRK"ؽVճA3H׊M%â G=5[%әR ^ԛҨ;uD  ʤE4S BCiȦ')(MceI8O}BKh9H+/אj)-C=K)ډ1uvaom}G4D:Jsmh[ONDl1VٞU;y"s>~%S{m/NeJ߻Sf:6+ق dl/c Z ^_C|u[6ЛzޥMx TQI f=uq` dq=>i=Sz$'%vеKNbc:oնMdV|EF ]YF /g:gՏuƥ;\a.=٩Svf@#Hw9 +HW%SF#evfhoJ-I ;bG1NOR*ciEOP~=L تc.-38?6=wpvoP  -jc[`9 źx،Ĥؘ4%*/ˮr:,GA=o 3xϹ*D:c\u'Wrwĺ"ȬKev:*x$Òj_#镯m&{xPYY[iT3!)QD˘={{ʘ,aUʭz2VxOvg'O/2lHbU,gc(:1Ulkտ]z8$IUm!3rQ(=c0."ӭ*QN=ю|?g2s!9maZVlO33.vgly scy8;{F&>2AUh]R7}ST'uk0):O+ԭh%eR*2S2~*}h<+ gnH<220S1tSdTu0mc잧秧ɏ+4g[r1g]άg{)(Snr;VEC9)?݉y *B4s(rc)\L P E`7jwFt;23d=g|^;>3 ֓!Ļ!rVHeoЁ<\yiYhjN.ln74dA+:oSu$Af6=5t"*3݁)9,LzX?Ċ$Zv@\Cd_h(?I=-ͬ =g%@(̧):usLWf0JvՎo>a?9GXy7vhw^;eXӠS.r`RV lJ/-p=Ѡ_ii^~A^BeSvқnW#mtz eb $zJ2_T( ?GvA Hd&(a )YbD(S2EmU>n+ y-z81!`Q/eD҈Ili^eդ$#TM"_#D\ygib4ni,^G|v֖\ w&%uoPNYYU1Hxͣ5@}-yOdz6@.YLi]>zd0 pg!ԑ.RG ;E +(f8}|dlx }/t&ʍ"f"~4iO4z#ː)Ez * ?"i:`*WR*CFjDy8j;B]LԳ`0hF3]6.FC԰M'^ KnScA9')yM ^Ծ4|Yȣ(A;NQq!A@?0C,Z{+&Qf>Ԁ={WEXERPlqE!ԭoEm* Jb(D NL'l4[7QI~&eTO?KwQۻpۗw -W" r|_^, +yt/,WR%Â; Qch kGkf_m-׆ZzWZNH{ƀuگ7)ڏq{4z_ԏMYKz`\ ϱ^T%+\-9@z_(yH結5 %_ &:ǃǽy<TP`-,U"^=t}&CM. 6Zcϊp/hC^}X_bS:}{&u,x{1kgv7UkϺgMUFXOmDk֚8^\c'ZTͭjr (\;6{ճ(\KDk}r yTP§W 6Rr^7RiIG0[?0鍑n%5(8քX /9|k ƩwNB^QvA'N=iE(g|߂:km͡^6S?W&-AW= l(|_JS>A9>cm0Cġ${nR[?7m7 Sob=Ngzt/%pfg3x50vٮPAekzPϠ\{95\܂TBˠ3I=2SR!Oч/p3ga8=?xzV1N fRa>^o MPDoN@/>Ze9Y-q٘F@9`2(/g6`<CvpXߢsP dBITޖVm~F}րl(fCI6"(>Jl8͢iHw "H7@^ .ڭOsoNX M? {r+6A ϋtXOz^ߦ.G>UUÈCګg-ZߙNzN:5v˜ >e]/oO/4owSˋ#pai+ @6$T1p3=F9>vP8 z`*[n" &87۬a} ?~5E ZVVB`ԇ>ðZ#1l;Kg`gv 6 %z6g${`АjN0PO \Zh @ ѭY vGf,lg)rc]c`>@ (~ q5/ [Q O,"$({tܕlVIj]D"-Z[~σ](0H3|aQpuС!k{CX x c xˮ <P-4dKjN~ȖَlG5#־]k':~tfvʡˡt Qp {SKWDwg<ϗ^7mڛ?HGB^uQ/YV8i$0X{|-.`~7ݝk |)<&b6*KܷXhni\3iz bQ(OכR&lkTFt UAء&Ylm}av7|.pЫ? #6iW=Q=By!E!vL6@]فrZëk!P|F:Tgܿb0sxY:Uû;9s֜נnc;hA1 $p.A6,_\:+; Ob~?clasI4R/Sx` T1)w֭sc=czc ~{|BÍ ઐs0=e|1V~\l53nQjCY;m/mx.k+UV{-g5^ns8KSkP!Q7P&`b:琿h+Oywq7B;=ُao'EkA/CJ^"n"}V/ OeҾ[KLX Qѿ%VZK PZtM!yiB(-ߺZ׽J+@_ˍQ=KޅjuݴTn4@IHZZ..gU']ԋ j2n^yfu`k./GS<7)7]O+mu71_Tz59KFyEzQω3Kd LBq8(p#]lȌbzį=sgܲ (V Nj kWl? @x=Ol V>"uHqѦpj02Y(^k7v'5U#yTB;b|*! Qcy7ڮS:ݭ9f1Gl̎jg"\WΝ{"@yp_݊e*@X<4FFx&ãw/| 9^iF A HG:d{ݼߧϓgyG!-gF'=C%xLw5}&@6 ȳyoPś/Itv;\s-~#管<7=<%#((\:[Im@+6M{"*-d4Lܡ^{_.z0[7ؤ1g@Hvbzo@ކ yWSD ¡b#۪;FlgynUb>ma޵zf]`ߚnUyޡK==p㩆{tPѓy7/|-U;lPg3 ߱\"P+~>ua~:.$F݋Uw#P1}Om]^V35 ~^|BH^`rS0@~ m9n&WݞRy*hx툻FR~y :侟NJ5{ 7QO=Zo CgSL1F\7P]-a8:k,CFON^I\hޗX~Td NCF4P*AooSC0q6DR'-R먫D?E#WUJ>FM20!(ivy[ ka~2DMOﲩo7O[ vɻv2챦^dkOdztc܋ℭ']QE7 H6(އz}N-1Î J{҉+WsB#)JfY/:m}} F" ¼#Ҽjx(٥wH;L" {%G#V,Jhk]~4x I`a,8o zI׻eA;hdkE `ߺ78\Xm>Baa@޹& A#n@<V#7&A8,ٷ_[(ŒT*ʿ4@ޅ[l:NB BAiq]]HSNU&^(ȫ i>'KfǢWQ]p{Q/ 0!ޝEt9 n6(/:`{`Y~Gh77v/5x) 8@bU(<)ALp<#Ýg[n]2fRt։ЁЎІa1B+B BsXqЀPqujjzRUaeIRt_ B1B=Gky1(jABAt_#d/'\p#2.`Glt͌`B:3"P%GX]Ʊ8 FP8>00?>B@x?c7wj6[r/FjG? ]{ !5T*+/#J UE#GjSt:{9Tg~?B-A!~0.H !p1j9"F8pAC8&7}wً0oݾ,v"@؎ }ߙ[3b` "2C3VrCƪ֣P庌ڌs53p @XXJ y<zz2pxw_Е1o,cn,ED a &ފfEb@SƤNƌdLi.cR!1US2cJ*3&%J3&U%*BzBJqJybQ0B!n~J>2>/t#N!HE+zO "3 '  'Pc( GPC~i>_p/u߃2$M~?S.U\y/(G{Q~H>+?A(#p>mBʷ^(Pnn ׹廸PAWV(@WB&(_f~]x\Zv| {EfjV*ɰ|1Y%/JN_8|8}(}0}4wv<_Ty>'(l3qR>{x_gݷw}>y^'}>>R7=Lcj:H`8;:Ƞ T=鳆wwmޙ/xfՖ-Ug oJ^1j}ukkVWJTWBU}p_;3ܝZ^K:ҝ%%U<>7)/ obz\G]OH);<_w;9vFsvBm^m,-'7ii_k ͈%پ.VEY$ZdL1sa4F㔑Ph 1e CIeyBIIF}bTn8B*\aq+F>p@jշE8zQfveGýҽ沣XzppbQQkG*t#G&OQOo=GÁLy@š {Ǻ?8gqR7}s,?!;]7?گi0 W#1 BP68ֆ1&|M"•śƻkx־ҳgK/ /SD7Mb5 EDeeEE2YZOJ'^"Bcdׄ8Onٵ,D.UO>Zi뺊,Fy,$dVͫn4vN>D2$i)Fl K>ZDzlKOeVKP.[,F7ɬa,f.R>q1,VgKZ U1(mXΣA?ZtRm,Ұ  C!BHx\<.Q1LK^ot:744S uk㶔ٖJ:xb4H$Icc&<)@q[R<a)"40@J ~*DX@xм- 1?WwOI.E2z^3Cג%QΠ%I;.XQ.E/*+KaY%A. K"dX\l 1ԧv ::HӥTb/ **D*-~oT5,(nee~[ǝJY;y߯{)u <,t~F9zy/kϞe۹զoXQV}Co}.~eYX\[ֽqⷽ'K7ۑCSPi/V9_R#&cr:5l/!Qb+fgR'K$u=mr@,%Zdr&+` ξwUcZ0q,IZhw 5Ė{{Qp<ܰʛni]~pEA0vN :y`gCmҨE;6-Tt,.[}(#< Oo@OQ?0G8zkMo2 /nasg2I69ry[;eU?)a :yH uMQiQso6Golr%+zB+RPn qlKY[~O(W(=PǜK'O&UsutX5Y-ECg> 8,rpbd`EK~o-DVh 5eLM81w$4NJRГ >diN:7ʼ䷫}}Sxt-xz۰v#.=`+G9ξjOiǫ/5:Dcw%d&+T9=})YЗef/O-IdV, ow0H1(ھy,ҿyU g̜󏓴UL|_/BLWynNɐ{OGsG3YM~+_Td)X+dYwu!^\ q,,NW]T[0VEkA_mpE 3FB}sS;KմLڵxʞPS:S~Y3%sU!uXxFV0.>3MFLticypM41N.&_#PD.t&[>}ynע1nWeY ʹW_9_#Hf,yyfQeSGY9δge[mv77W ;Tm_^gxz׺gCyP[;,䚥{Ԟo\@뾾oC=nj6Xv'eSz%EjVE7?غ s#\l.$ة8-|5l^)D#+=kS/O. US;6߹xc{g$_.߻d:UH V_ڶ~ _YkiyD@%X=8fz:} _KyUSj.f+ǼΦe<`ta;6LMgj&Lf=)`XS/T$uNWyY)vL Ԃڭrh=cړ/ S-ovXlx)NjW4'~9#r5|ikjKq&K|>$րU)w6/6UĚpu2ccГLSPWw{KF؈"/XPl2a>x\MN;?G!`jr@΍ˊ4r7AZ.ZWY^6t4D[/Z?xǦ╭f-uVMON3ܰ<^TQ\ؠo(~C#9" V% U.Z+\f:wLiv΢fYyvN7yd6}3lF -d׿Fd3Z5~uF Ȓ,ghwYn#:"};!6c;-}ıJ"k!D7 A4!e n?l9߾wsܦ;?wn5wvv:X48>z)Mw_//(\l fW7,lĊ@e p];/iP>!ϯiH |qVUîRI0zue˷s$n ޠ!4/rȠ{uG-v=Ej GOR˾j~=!sPa=[\a%!D_RZk> bay,jpBO0t/ c)T sJ*z->K Q90(Wx _[1DbPԥ "̬ (_B: TX(BqgfjVy-yAO%&eǟgd5?[X(1Ca[HZNG0'tzNXCTHNg([-U}{r&H%۽@Xq=4E="9\cufˉ"]5Qק\5VE1c!EX٬Fd3YhH!t:j4F{pzd`:U_&~iA[kϮd :Fcg/=abb\y!~I&.~wG{.kxa)WT 0 ^^S=W.ss >ȚZqnjgAz!;ꮹ /PYJX 䢰†\*U8@mJO۫0UA{\ocyJ,$CS _v~֬ Tܱxg}g>]60M%>m$!O.kikxۛ,">癉-KJzUaKkW䖂> ;_Z0(aPtAKZ(+"|2k2K_o׿xIqĸ:I&X6[vnZNi j4󴉘Iih$;/*~C[Q(-m*dQ[6ܳqJ3-]Y$ gNoc5p%+ gT9 k#M^Gbi5ɏo0o(%J[&ImJ __[z2/YRhĘ3ݾʮ ,$ϾuA0ɜD1/`zb&s1)YB-aDw+rg88aSu߮CQ$7B~]ܣ0f Bmz"8Oh4t%ejuZge_jmACYʢ6 IԐ;kmv9oy5 $Z{peu=:wburG<]V)MKR!Dq{Ll Bw# lń'hadONm{Ż yF!C+XSZJulmp#C1WbQl4#Y+QܮZI[8)I͉ ҕTg4׹س0$qJ@ SG7bGj06ٹ2PRA4޼Vo'9OZR|5Y'8tUj r:Leig.fy5ʪS8WsgS>=gz'?YQ^Ue@rt`yض{0Oz!ڨpZ<*0⋏J͑s0//7eq%{3Yxu ?&w1삣ǬHF즈*4`Xqd ;= =Q3y=ה@O7(zD..ՔTԪ芶cf:<JlOOǍNjL<5'D&h,ўW,gVo1ˢn P&$|҅ziz',ER±zI#0>;I|jsܛo۬^3Gϙـel̉ YvSϼSwT;1YV :>+KMzzV$*f'ҝ״VgnC~i|``tpwgv)_Y8pYDSX9Zs";K9}"rAd+п{ R6)_X/ p L0&r˚Sd}[=crF.`!V̩1KpY edTr6kE-(-+ݾ]JAf6T9-҇pc]F [Lծt5;32Yf+ՎAaHOԟJ;#Me6`RtE(q+i4JE{eƒouuvp̌wfթUdy/-3?_N0`',=Y=9)xn!#~)lM/S|i/绪Wf-tUn\ eUu#b+W_pwW:2xUJom}U˫gOз| ]?+|9_nmv+S|"n>j3wNem69̑Jt.elW^_& xfdMA yܢ/:PrQH\\}Wh4D{fK۸;ߛ`M$ &M((J$ʔ(QWR썏Y;>$8ݤqe٦-AdeFN&ncG8q"~3xo a0}{+Ykk'6QKQ⒈ Zhx}(jDk5oYG$2%',}iyˬTq1?I&v&~U}h`YͨĺwiBv]KmhL,qf{Gj玽%-RiKjމݡmóv4p-X|) ؞0%JU+H;\U\T?5eFKЙUu]W\)L,?$+W9?o7QVT],q\s kl56_Yܠ+g.ͬ^ꡆZZGgcjB+!_g4.癉T3 -AL0zȽ9B1+o8K-jWԺ&GnF G#W4{Ƒ7E=ygZRiqz eagc2t2f 7UI'33A-K mx]:ǎgte^Hr=py]-@Tfx|wYdZ|G8t=X\zRO.ՕqDL r S[$R gTLY0C7u9+9VO7cIe#H,0Uhׂs@N&.?~nWC*hW@w)=e 0U 1 ^7+U3SEFu4#9W@" cf!q[ \nަߺ1g##51kN=ax`4BL>ʞ=(;!dG~w '7](ꆵ 6[0K?&2AQ&I N0r'KE#H%o3d,iba! ɬZmoXMuD6Kf3%D:r;gxTWp1 ENp7Z'm<Rnz,L+e \:*\6tY]{P Ndh#ɺo}U4:. 2nOC8Q1G QtғxIsf+GM3w+|#wYFʃVHwӲ; #!  JRtH;Ktjvg=5n8T"~W@1zDs&k/oaih- O-v}f$$ ڈLWاryҟ-3_?e2r9; v3|f oE$kIK P<`ͫN*{(ڠ|I=wkdž/}s UꝃA-e H<`1uvfm!`ly"wo:tP`i%XDvF bSF*}&^=XnChC"Je| ',fdBe8'(%^Y,y2T^鳶%1Vܔ%M/MSV]zaB!RѪd) 6CjgM#vdMdz|} [v ;]$f(c%0[pA둝k:m_Pd ~G-Cs9@pw=BnrwVĚ*BE5b$rQ8 >§瀞TB߳W 3肏s_u.51^S# W{/w Q8;M4MwT:1TnYS4̙lYyP~H&6וl8=ʼnz>eGCK7]ز)(9LQ,Tl+ W2kX%}]+EfQ{|0m[~ݖ6`:T{"̡+G9zy,V,Y+rLbc1oƠ/x1xxU6s N6*U:nI OqtRC,.R8Иg^}X`Ѷu `pjBoՒn Y5"Ѭ7p>z|1nQbC.bI|l $:<) Zg>zB`EՑ|lmNj@ T_=K("T!zQ6ᰫ$'c e ݮ2 V)GtcZAp&)*U) ğ6LȻMؑ*!~XBbleuyGĵrlUeL8xv+s5nM32aܳe dEqT,?xߖ 7,];njh 9gx_eW{,7OXJ+}ݭn#?jm{L5vEj]cߢAfcG7x%=;%6^7\jS.e> ͘-&ĐyGJ 35Q~E+5J^=8b6>7 $qazNvB#^3O2Rk%խzɢƻӰ%hRb055PL' ŪpyQ'OXsXr 5O"ڍҼph__*IDͬjS3 wM2ٔ'b{6 ߱4Om]ku80rS;6xqms@tToO -5KwvYꆮv[+4 å:ֶ޹>\՞xךkW?Q5 z+=/xjM;Uk*ԋpܯZy6Wyeel(3\% ڽ>~˳ fY!k22S#39ݣ_>sķ:.۲-D*}]nAݶJft/t?r7zE-JƮjk7RDuYJ9.1H@6AMg@ȏjY =A|inR^HZ4'2H"ukxwyXgb]K H)/L,~&04?.:;_Qs͒Pcow)lm:HrU |#O,ZtNkӱ|QdWJ$ udW.uǒ6 >Bé)!JAw$Hb0µyKC 9L+ XA~$/KW9ˀ>12o ĭfǯag2_ g|f>,-}a?&X.o\Cn3+se( ,CQ,wQ5J_<]boQրPy|T?TKWWKQ75.E"hؘC9XRx?H(sp?z,e/}>Z'jmG{+>mt vX7Bf e+Z (yZk1W俑!'KѮo܀Bf$!;C(JP ]P#jEm׮Gv @g1p1X&nz 1<E|;2S~_Xwn 7CSQ^oBG ȉQfLDa.`6fԢGD]eh9ZJ i a k@;aFnt-C{8ڇ&YH}XC<2!A2H.7Y"%zRc;@Zq!Nn܏WC|y_姠+/oSv Ǚ6,Xȴ)h2mՙ6qJQzO|KQ~+&`2mJMA1f+z QzAnFAF'@v4xAǡg: = /٨&MWxv~7lQbTnpP*{}dѫ=Wf.NN!){6xQǽro趉;z['O 6yWuwȁ#ۣ-mѭ];3ރG O\=kd;'S7wt@eZmDdWiqWs0ӳɕ!Ғ1@7x-q4\QJMCboC鷯x򶋕+>stream h CAP~v`300pSB)g`060 R`0X6x@ : endstream endobj 764 0 obj <>stream hy|NaDC H A@0yRԠ"PQ*V *U_S jEA̹sbĶz7;kﵧ^{OJԭ<g(bYȶ[(NnM^!գayWsߒo6Kc*f|yn&d| M^jB}łe9zoi gegKA={A٪E4?TY`MQ`\ERe;6U1J5Vcqml9,+-'ϘIXF^oC b}dlJ՗(36iX9Y&L]J+b~fVJֺ=~cNc*90af-]ӳlzR?.CZnjʯk.ӭ|)Q&\͡ev*U`8YNo*Kvh4 5h{~[T˩}y*\-]0\ZTdJU%_5K >McJ~a ~j-ZWUZ5Y6'ͺ-.Ui=o<6ؕ;ُ9Z  uz~:'?hs)nwWaH?ԡ\鄦"|aw ,A"ƻC+ZYh~{E Ym|:=Nߥ?-Cp'T߭[""{mP ?rژxUm5NۜĊM]*G4`OOY0^ĢHD ش1Sv5l=|DDw"ja}E>1(1AR([$HY$b " 3p?Anpn,Z^M?Y4=TXԤE_sv5?<<|V}Uv a]1_S#nHR ؍fߵTI KJ1!"H0&DhN$,]Woړ eS"vvȭ(V0KҊټPnE[gx+f7 GVoxiHH2ݒ?fW juPVĭӚn>qTD 1[ҭv|o/7'{cY(R5cn6%?:%X:07ey\#2fPY|Pf ޯɌ.)ʭ~ S3NiiVWʑ>&2 oDZfyG }BX1lDqPb}k$U)OӶK炉E#|#}J`|-;JnlT0)\0!jwSSyyP^uiuٞhՌp(%\aE!?1-8RZ.d|/obAل)fBe14ޤ?sx?gO!)-gB"DZ$%Y\ęYis&ōgƝ q.qOfPTM(CeedRh^fR &&ᦡ|<Ί$eŷ";͊4۔gEZeM)KHJf^?mPq( .@QQ_ ?0qTS"A@Kqv,k)[]j/}R¨ߤihxo񨝑gUZzH##>?7mxQHɝB ّP?$e.aB ".iq3fZ?ѫp+0KYhòi),[)+-~ZFZ1чGy>Gmi?2yAju۲j#CaQ$/31y>23nu)fDžikRήp`Ä]ف J m(,z XKswho$Zk2+7[[g %%xcx) ω}^,MEa6<=hMqEui1ZQ Y9jCc|ܟ2G4')-Pl\ظAy#^T@Y‹GoA)쑑eF㦶3#I%?RgG? "lGUq8,Z4L  xbsB݊{׉ސzfIb1#"0M3KCXI8Vw:Q?-ި j\?R~AW&_8&_[)Hԡ)MFGT 3̈́=^4B3i$gpb g%3W2s< pO:?]:c*2[է2"SIr}vuuR?WRr-5P|U!u/ۘմwNkKJΖS}HcOjJ+rS.G_֍`ںb|r-wZlj~Z<J߫epZ:תYM1:_'d`9F>wz2.._^N7t٠hv:''t%;'h_l#e*cSalOu]6 c8|y o`?kSzqi*g\_tNO :kw&9+P/US {&ًt2y멶!ܾ]:?TGuat'?Z^|:hAJύ9m7oRm_C:m1ۄf `Sἡq a2]WǷO}]= ?p*3-Z,v~:( |f*tVD5yZΥsiۉقMFɖjiu~v1yN/adQ]O}}:Utv_9йp>+i7ׅF:fNo-ؼ.56@+Gk@Cox?^C0QN{h3< yT*vP^9:nݭ>Ջm.p%2V u _~T܇Ծ= &ՌS6xϝZa{V=W}:yk|Ih[y'췷2kgS^+?󑐟eҰ 2}nd8a13j{+Эjo{X}4an7jTjܱƟڨ[BgyO0p{3M.YfM w۟jyD\o=~ύ sݾ<>nt+7WaVN_inqJؚa Uiתqĩ/UIm}aGo}5'Kk።^IBwU~:5Z﫳}X#RN<=(*-d|1~8 ƀp߯XCE`&X y`M6 * ֵc,2>Ev:~{Q58Gjy9u ,>,t2tg cϹ;DykKqkԟ*> ]O3 ԏ; |H,^Μh?'Ng {*{{)ݝvlrp9ٿiWWOpc<벝xe29(eSo0\*M6z8)|c} 8QjmkuJ֟0edkt:Ӭi7z\M~|VKTbmRb)%W, t0o;UV'=zc49DGGMA{0tlP kt5ͨ/bw2 :jo 偔_#S,shlo;oiq\ N> bt(QM?G]Z)7eշqngf`\95e3z n k\<.ۗ1֐m5oc8gc.M'-V]mk;@a\yA|M2}OO8n(WX8`sI&J=jb'?yM+Tv&rk[VsoC!_#'ܿl k^3rrPC7ѿ rXwpNF<-uw{gE93;wq^u 5:[ZWb89՞=ۭ&r5vs< q:֧nփ8֛v}>D|y[ 69Cksf;m\˼ռ7WBwJ5`LB{e/{>{{S{Zt2zޔAF&DZ>ؖm7:ξb&"`9 Py1]l^p3cG}yc6V8j|Hڢ=.t~y|15DyJm% ]o`1]= t#4<-tȊ+?C`rޠT8438S3@Uܦ4qjH{x[> x\E?e{rO֋GNI?`1svP ܕJSp4D'CL xL(^su3X=:{@<;Kcu|j:]6yI} 8篱ica'>]D}L(X9s&Ko_}ל_kBnؤ&zY1$S>_ 4=~|y̱ѝ"` gѠN٬}CN:;{YRU}5'uk3c :V{~~90s:%YjC}Og1oZYc{ [ymJt y oz-tGS?G tzGJpW~Z~&wbY_PZ8Ss'>6[Λl>Sq&>|6YWG+,b_{fB"g󆞤JS`&/lb޳ Ps;>WIQt0^T?0G u[6{)xN79nǎ7,|v򔯡\:-uR^j!vIu[W@1wje?@ۑwi+a+Z7+5ڃ5~LWb&jF@iMsg5|qv=Jc~ q$)1g#ޤOo0yv"':9=*tisBMuӎ^NSt}sc1ނ1/R;wF_q(/Uuv&tXI~Yy'nf߰3'=c/Rjlz6Obkt4go'ז=MgBUyvz7@ٷU1Jw׎wd:5wrÆGh[70=y|#׀Q^]5w=^n_qqq:1o 1qŷ;P.ȹ"לj};-q}T/vooNr-wςwP؏>tPZ}Z1]8ctA ]ϐ᝘Ns[ Ct!_@шywa9Ϋ`'9 %"߷y!Z o:}57`^gLs*KtwX/l|]qpp70{W/!ah5■ۤJ7s˻Cn3W}=J2Ԑ[I$o Rv}1n_[w^w<.S5'iE?@+5ub޼!;N͓:Q.U`)THx+u-wyU@%1/BC"rU7-~"tҒ*{=D)|gxhI)~FV Cn,UJR>"u{w -|Г8')ƳyPgުp3TOz[`"ڣe0:A}:;kϹ']d2mi0G.U<9i3z^;;myRqofe@r*OM'ÎΛcř{zsvIѓPo_\"@#"νs'l}Hܼx[{iUm C qpnq>avĊvI 4Ș} J|9OU}\ά׋9bfksl'3ԋemS+k1ohݠabG u~M W'\~ 6F|eqGtw{uw+ zU@жڙ ߭^rǖijC~g"؟r*twN2M1H=@Njr5|g^3^{Y Q+/?SGJvCP;jhOn_꛴j=:~6uhk[lY{ȑZ}O2SžWRbN]ͺ*4>eba3q pfh]ӰW}emllk%14<)>E}ih)g a|e&T"h=bdk㓫͹^-vḆ;%^)/pX=Y[6|.geq i[K98Zj%l'~Ma;"q y;S_b<ݡa kiB3}*mM*A/~.l2AAXl}ޡ|5/|y>ry }K[~5o.Z{Ӽ]ay+ٖ+gin} ~ ܪuq-3oWo:G.ļ4ޡG+g]C>n zyF+ts3^z~=7_ R=S.~D|7 snNUzy u`,`&{~PN]8; k,]q>0yx {<V K`)wa4 leQ x7[m>+DkD<3&x;e9vnmbWj{Rd!M!6GpW;Zg9+Elpw[76\jU@WyT_V[W&{{h@߂~^J=^bJԝtӹ^"gF/!\B=Y{αnjui|=NA.y>zx(9&CzyXIةIesXnҫȍGo(O8F vESz(/4o.We:ܫNRev@=}rdoyo7 ' 㼥sܶug+ZonwrR2L?Csh]?qmP11X;.sFF$(O {i@zKEѓٔ/<9Xt:r`#HZ=m` `+x(ο zzmx/$skNoغ_<d V㰷dCk!)X]B eސ/KsY&aV!C]h%b4p=-fρ43l@y=?o +oo j6|?~lE{EڎX J)" j}ԭ7+U^ر/&Xgˮ~Ic=a>KDйw. I)Fi'0Mb" pTS8%LqD?h5 7iV: EACWwpJMf'T0CÚ33)ɫ\t6K6l ⱷ6,)]nsQN"np3hlsSg"p&™?.Nu\Ğ ҩMi/Doݿ\?&⪗ݛǽxsIEXAh/Rv-S(MG)ZyʳfQta&ʳ=Gy>yjgtGhdޔW>7Y|-grSM7"&FYଵ 9[ ;Xډ3)+DMu-@vrP-0QG9l{< 5Z)Cs0pɄD{ʿL{' $Kg̘;阺Ou7kq&+,F_^gTe.,G=uBy~ϐ)Z]Щk RS[Ur-AMgܰļ,5{r((^|u ;k8څ)gnYdRK^SL-ǜA8Xf(YʵK/F6mT~%SZvb?6Bgz)SPG\BN~Hox)yj렭iz?4L[9a[Tk[$5R_)4~qߚe4Z3Go}%xrgs !I0nMC|Wxb1hy,0`[\*,>r qͿ_w(GRj3)f/u})7JF,J)wI-oðvށsv*qXh4݈T~7zsb5 [LcwJ5{vZg~7w`ƞ9nt8g*EQO:{/✁ǿo}<]巾4v8rh6ͤ*xT0 tNƿ Wt\ Vn )4v$՚Szg3O{˂ =ׯa\SW8yŇxڐ<\ U dQfnX cF+F> A KJ_J7P:OA?=t=c(o8uI*/+%R;u7kVTM'*ڱR -q0~f8Ѓ[ p}RBX˥0NCVa=" YqaIk mޅL=wl V]!HNwZw!`;/oaryLvfRn]AD*xo)]|OȆ?CJ3!_wF C;uw-"URF;Tx #4\GthESshJztG b h [[G#>Ǵb/Q3׌!tB˛Kݱv)دQu4zfheT} M?f@52z䍵8lu֒FB!Z^6ذGD1:(;k_X5 *3M N7x?rŵr=d&9 ZeT#0q=?y/y|O3 @qyy+umO5Ol.!YB"/[/SyaA(cɇ5 F{`ˍ|>@[lYPVm+kCeW8jaaK󦭢)(@w]c}\Ehhk/Գ_h/w<ۛ2rC~ϕyp hc.% c ڄ2DߤFi'\ԃَ<9+|Nue.~{9L> nUG TLۈ:]Q4 Y?nڒ4sk4BwΦJ(#l>m3"\ a,u{wL1tĽ1xc>cï ݸs'̓SQ*R@*c`şkcRIoqwlu7lG# N?:P \W W =F0o@d.S 8 6ThY }; [uHZG]-*Xدmdy N!L *EGw~?ا7bՇ [%U6ĻiׅuO$fa܎;#4X <}? RKsmȥ ~76sc`|H}Cp9t7po4NE#l`6`{;_;n5t+DwBҩ:36 M#6x]~'_z F=ߥLI6' 1ۮʒ0?Q۷V _> ;"~g.yVuw0>&j4}*?p]1x"t .p6RP eօz'h3.GP-HY_[Q46)66G&7h?`k{ ]S %]/: %cc]g/N/~C~w(1i?M:fh oN=7NJB_PS4G o4*S>PlK/K]11'GPU e+lcM0-ݡ1J5=wqF}}(y-a3SyPj:(`NR(ˍ4TE]3参AE ʕ  x#<')]n Q<Ƶ5l쪠{ՔnRzX3>øwHsy 9Ss9s؛b,ׁ |>RNzr4 Vo('ە2cmъ{! _gE0[?%OЯ3N_g`r֣3XIql>m5n6"=xfʬ|[iBvP;A1fwp$ 4۷ܖf <[ݨ{ m9i2˔-#_̥!%#63U:@m(4}T̃at(|=I6rOC]E%.W)~gR<+3aڳBVUһ: y/y)iAG#gMHnx m }I34/#j,pžXK^r _On{t@P R'I]owݸn#U"p_Ǹ;GrT-(n uzTz}QCE5K[ߺk\nQ5>zx֥Z=$́Ѳ ~6sW]4?*A+4xZ )28il&eaby(LU׺(c AXAJZw{Iե#~SC=؋Ø;Ԯ LpnM/ tke&&~i XW'B_H[k:Z&0M?7CQqI(3uP=k+[5{y VTZc}͓Q]],|G' i;8?&,M,A]{J2fE :P-z5l!<ҕ&77Un_c\BY%:)S(ŠqP@ϨAy*a@WAX=b tzw{́A\ϳMbORCy,;=IpNa:Ay:ϸ#o:Y˩:Sjgn#e ^}{tjy%{{m!Rר-Saz~6=7M s\3=WMlz1=_9oz2=Lχ9ezN9jzgYbzglz'5=96=]MOiazLO3ozlbz ]~Aׅ{M p/ k^~%ܳ=#Op p{-a#ܷ[&C}C{[U wp wp XKXE}\h5jnpn{r/s$6HAO0 Ls  P K%h` (e$8s&dRQj2JMF(5&dBR:S:S:SȂЗn$Hf%&#F~^*Sv9yܝw9LRP2'9p]Q~ /_i`ír9p[/V{%_fba \,nHAO0 h%k@g2_ _<:+(YNt8&yxOHhԺnj3:ΨuF-Z/?hfz ADÍ>mZÖlV̖T $_g@a[fbYM ҿcK8{2C|6ClgdHFmșl9 (UQҰ(\&"^$&;ll )4y; Y!zAs!y=5d!/`.4H?Րm+$XRIf-.dЅXorЕެE^l( T7"*䧐^,9ƣCGQy GP YegF¼m?z-+34: k\w@ֵ27@z :A `\hnfFnȦȨ;gGXqO[Eڰdf?=-n KJUڐli(C ˆobƬ6$s"=`aPie6% cp` c#"!CQR} D8XI= _Jg<6!I_L{.AW 6/L2I)ML4<4G"H!;,Aߗ42:)1#+#Ⱥow×aIҞb$_"zR$Ҝ~f'&׈G82 66dͨ#}jo쿱Z7T;d\#cSB Ǧ }վabqb_lx7>*پhպU62d䑑rZ~(ΑqK^uk${g0{چMkk3^RxvE1(J[|>+-\T$q@"GQ"ytU$I V!-R}mZ@9!VhQ6mȯ7GjmN+H[&yyh> |49TJц:KM޲_jc(M7FzO-d4 kXBkԭP1bsŖ'+􊌊]%*T/y&T$Yt;KZEʹŧ5Mk0-6-:-*-"-,-$-0- /͖iW* ȦKH}ڗ$۳QK%%i@ĖE}KED@AsK墰x$egvܒyKge@.IU^_~TSQ'v7nةi%h7cş?Wz#WtC/JHGSPP-aA}Bylߗn3ӕc<Aݾu]]3И% .i]|>Fnbf 9RKN?{p\߀Ep_sCp'qp [ ,B @  d  6`jF'םל;8/9v^t^p~<<}{ra;ηeC7{[;8;9:KEǝ99:8g;G8{9s8;}?!l,PRcBq )S|wbxͽS"9Nߐ2KJ/v,?@ v$kKR˔vU;eJØh_fi"+ƴsX+-ilp0vQ-bJ[!kd~iQ -+w4yҷAAqM[6]76)b~D& ۵j Qg{Qh歝0VMQI4; Z ZV}X:VQ^ת Q_ F/t _-L Q(=9!8Oa @G )$!99? ៜ\{aYY'Av 8+zzߪznW[-Rk,ywɒ lx[`B,80@H3Ʉd㐘!!$"!' XnI6uJV{|ާOPMC)p3Af4~;]+[G_+K/sFcMK2wm3埜ZMa㸋wɪхax\봓U42\v(i'SY$̴W VB֯e.{&dٗ8IPѓ_4\6 qFOh?{[_>dݕ𝞅CG~dթbtcWmj)|]#toWg}0&:hIޗ Ej]/x,VTAGw8I5Zɪ ?8YMz< XIZ} 'U\Dj"c>g$Dk~)L +Yg }2,o΢eMkِQ*&(dJ ~i3{iS͔+_dn‘}XGOUx 3C'5kQ6r<fLVd58&C+Am96POfΌ4BA7$}a1j6ԛXc{Fk2(* yjh`f~C.p7hJQ䧍= P 5 uKqY {l y,EK 4XZ3CNfTH6zS*b2$W9i%co|IjʃqB~bF9L_p\&> ϏxẴ[zp7E_z!ؽ > |Ò7ڥBNA"F(VHഖ KHKkZx?\ V^WXplLxw;|[8}/UMQUTKK~}l@e41S)\ǥS>q;k=b2g F>ʬK,bz/PT:zAi)mHUnjdzsu`4&1# |WEw w1a^yrsO_=h<㖧6>vl~ˢmC{{jv ^)ٳiE;LJc̀ɝNJb=xja6d3z}(BuitMY*,'s@l9M\"](}NXT)nFbՖ&Qz%m eSܹzEзЮ3Dw(bx#('0D86(0+59/b s>ijbÁl}Y ̀ Oc}c`kqEM ;"Z\Z#ixl/;}}US9$/>N~k R)^JTjzQW;X;H*(vQT'R4;SDC;'D"PBN,@l]`i+MN `"Gg43*kCȿ$sugQH&b'Oˆ"2.]"D_a~s/E5@7c$uJR_&H0*K*wD N Òq`y-X0f,vB$7|Fxko;O3 u kq}ȃU<%+WWelե Ke7|2N~r[)u`K ,yA$}ηF*+(Re/dۜ)@E7ezN^*kFĖN!TOsvTdp$g)H}B TJZz 0z`j,-ST@Xlpt0.J7> e\Ts )$f5atmO&@8Y~$狣ZOo ^[BPݾU|E P  OVCr܃#5CVKNt ahl*06a,a$7`g٦&F?qpG̗:'RSOH04!z*R]BXn;nE5Dw+o buo&U!JI* ^".è9ɤ: ZrBT|q-1H% Y}Gv0̠\[7]B>#4vgyVa<#;w4 W4KQ|0%.mVk.Y˿j7F` ^sڗ2BKkj?}B+A֖IY&˸Pp2{4+Kd7i蕱&MovP ʹ65T1 ,~l)>Bᖅ*9'!uXW%FU)I&D%!m77C9Q(p(u;EJ>E|U[n8rcvRc4dwlm_ۮ/qeplQ0Wjp 8KYul"ݧ.?I8$1ʇ@L8I^Nꌣ}Nzn 'P c1.pN&cدARO]+_XjD#J( AKk3ulnphow["?|wtIzŽo}-lov3&'?nϲrǁ$HAda>Vi@>a{C3^= @a 2IyPq4a, Q\u ;1eGM 󍈴.ح}8N2-,Pa1ۑ]n麕/]ٽEV>%_h)O.<Ν,$,~;4ijJs5SXAb9Pcw ҀY(0]x+f8ΔBS,DzŖе!|^srDm$am^EL mIn>k C`))i,^UapEo]$ R(~ב~][?2g>| v)+ОO'K]`"K% @J9UUí?%(K{ޗ{zŘZ^wa .TsS9fY PDXNvfr!-R;#0/_Q|Q-Xx.#7 a涰bԥ[Ɔ61W`kؽ\^PcM)Y{ OC %Z0xu/4n;- ?&4jBR8?_I뿺7}ëw..Þ7}~%ph A!%Z#|7Qwd'0<9;H4"SUAF,ʐd2[(c8Z$DagS,ѯ3RrZ* jK"-6ZU2%~IO{zc}mӲlo ̱V8[5R ө}6~Îޟ/Nj0tbEc*I^qAEtK[) Tzu"G)Mqpte#LI+E4Y 52##7򧞿{{nlﮪ-AwݷgOf75TkK y}.osm]QN>P=oM35oHws6+fQ*ZEJ~D/CsriJf]b7NxbvK Q*Ei??Z}G?ZRɣ+<**<:o29s$O "BjTJ&'؅*[vY3|r):S>C ;*tT+!#d* :kdS 31G [(i>5"hDݗː,G2&Jѐ6jU{hCzV|B ֐6h8ZF=ʃ 3=v0FSl'"N\PMJ2[jP7}E|iȊd5F2(|mm&2lj m/gW:{tk>ĻGxFL?o051>ghg_D?KuLmi^?6:{ϟGR]D+ a5#$x$20_Ow}v›oE3F 1J($>pG8C,l,t ! D>lUͼB D1A%2iP5Lk.YPd9m OcRߺͥ]щdb]]ˋz( I$A@:usҹ,H< L1 ɿt0@^ex9x ¡u^53gK&ieSlb,ʑ?twHFpCQa`bNuhÒu>yyZіي%J] ]++ʏҮ.\+1$bǾGY]{e}&3df2Kf:I&ɐu&+Yd,$l$l .HJD&JPiVDPKhXnOkݣժ}; }}}~mgνsϹ\!Ww2|;½ͽ S(FpM~he1ቂn>0Z0J:}iK99sPr<}!W5}8Z&MOS1ES8MGi}&ITQIt'E-* ;(V"WiE )+W1V0:=C Ӵ8n3) u2p zAnK[˸qVh.ǔm2=ǸSXԱ$;j\Mq:J1 X< SGA$=j~$x:~D j@2rЫL9v"1/=K7^qmiU 5;7sq,K3MM#``l:#UH*RRU*KbrivH#^<ś/JG领gqɒh_7; 0[X䎓SYZM rxxzx%ݪI6 k5O}$ :)+uT#VORir942LlI)'|˿`&loDbj489N3K{]-۸GF2-X3: K{-kkpRxܴ{$a_ڌa0Hبg2ha'5kBf`jY7p$0OfʉNPY~%47f'V. #EkͫrIɚ9yg.?5smC=DPߥM~@4e胢evȃc`+?Zj VV[YȟZHح& 'ߨ&CmacP"Q;p+yl2 :A\ڷncYIFm vR \፶-7\1rɔF#^QD;<}˶_@풛sFcu?r ;e6V$Jf|GX*M$`Ϻ`Vޔw .Ly&UB~(:Qbl19(ǖyեovY]kl~o~kH&fK}g( 63{8:Oi;a˩^#8Id1.W觔Wz7YyC=PZGXe\"h$2I\Й%:0MitڈI *l7 f0,T|4dW'Ӆ~r/蝘#qt&dB%*~q3=ŭuk'VD[Jjf ]5 u6-)0#H=Lg#s?N·_0cUkZFyw5MY[lͼx2iIR݄xyia]+nroR^jS<ҐNk>"'pq1{`ݯ^ϽďY"O_z`AAE,rMy)-3*VbWCA]K{_DocQ|IסC݋gT=K,g\3<,_.G=UK zEiKC@a G`]"D/IH؁%5^+sgQW9Ldw*#`xpR}EvAbTi6uw'"()|l8T':FNY1xzш;8ch,i7;<]cuQIn1ܙfnWa%wF;Mkl*f'6d4 ۫jʡ r|>o B|cR#Q#D{Uīgt?D12@÷ dL>Љ6vRkɔdz¯Nc>s'-fTV|"`RF:1UV沴tmXlicN]WyzNE*kmKREY- ui]*kRJn 9㋘d~p$Oc*e 4d4W4'Xah^ejW:{EM.ʠ,IW*M\BQK2Rٳ)V*HN2+Ug7_ʦ0J$+ahB?|:̂8p?şǟHsJRE>MB g"y:k\#|L%MEGON=( ' Sa\nd]RwhNjDp{}3D XT10ƨX1Is:`UA-yk;M97)MoX]=?$ғ EFŗi%9NSq}JjD% mt /o6-L($8[p7T4e%%dmٲ,DeETRʵ :ƛ)jQZO1:|q 7#:f2oO0R,ZpƢ}:UL,1abt+~g~۬fz~ů7;uή\1z/ʧYzHͨ ;"GЗD8!b,u; M\%w< TI:WJvƩij4TE-뷤wm/_5(喀WSNf?&=rO06vTͤeGx2Fqt3*(%v|2oH&FըYSfv_|me?D,<KTYvi ™X*XӞ)}~GO_|YS{#%iF֩*uoxH"B?=AB+wDޤ;(%@$tOK裲,2tLdrF?yAni5$NF}QuBM1C]3 ?';tdE $!.2\GH^r3z!anBB 2&M Ks1BỲYE(1!" '@n B8z@gBJyTУ;JߊPF"@.loΜnn<4<+@8+E`BST T~x(?A?'J @ @(BN;Q"TxUTPRTm @ @#Pm+ 0(@S}5VN%@hljci5^ @ @Lj @ @ @ @}M# 0E2TXXY{ce1ڌ!T)\PXB*jfLXXYPP~c2C'{,@u6ԋzPõ (w+\* w Q\[^xz|ÓJtC8[I;KUwl%{rs?U*ƎfY7Pj\W1z.A|=әs m=}===2e+V؛vٛ::zugVVTUNVѺrIow_:}^{ciw_GoGcekr{si޽dVu3[;쭫@{;2Q%4e|OCSQ7ċq-_zo'(Qi8=2m`?(;&[%'[.%Jx3𻷗+YpJo[OC endstream endobj 765 0 obj <>stream hj` 01 endstream endobj 766 0 obj <>stream h޴[ M{ p<8F~d01f2c04`<n2i|׳!ބe܈RԉED]:"^}d#Cw*9h_D\c>4(=cAL,AS_cTE4XQ3]3BU<&fV Vwwb_(EiUDj~A=E|U7n64Iғ$>HP1t=A[ɔRz^dx#ZT*ߦP.M>cLbP@k 7y44F1'ZHCdh-- nĈ`&-Ai<-G|>WOnAK@S\Kz)EmNJkkBTR|mqKabWiTI:PcUв}"],uWS=~}5KNR;ow_r6Z۲EfM4n԰7~{&ԎwתYZո*c+UtT(qf\Z^0jZv_ؤWyv)ST1ˬ=RM{kM}1首.EfxOW ?ujiy.SM¿."3;]VJg IH|5 r+aޯDWMhRR ?mR(v! %٬@QcStT*Jl7 .DSIAz0OzPpO/XwKr*4GP:,U,IعH.NB9k0k.h3x5eEEĐis,$HN ՝>O=QO^z'F8,ֺfUXR.XX[CFƍ3*O+ 5@)$@QMtϏEMG|]"Zt$a.9{SM˻|xÓmbOAuʣ]^qc+//ÓQPRqgY EmJJ"fnniͳO諳.`q&>Fw>v,ʽ)ԙK H<3o܊w򺂣dwgC|LwM׈JeAviGPmR5 5򶺉Rd*REEIu)Dd&d|`B2OSh`jETiVZLb σE/2SM/.)̦#S+UT# J5<"Hoo"Ip^R#/.jsHЏ!yM#wcwANHdX(!)|hE:!h!n%2dq @lB "cV  Ї2=mLզ^Wt8$L^'F0_MBB[Lrc=X5Q+Aյ$B]v&Y'(," i$* 5BϷ/c; ÈҮ  PED3e㙄3(-[r یH\cC'_m9ehc3 mnװsؘB%&}!8Fg+XrFH$7n0Ш۹paRL.EXkMrr!#TaDda{-hoet"}(Q] 5CHkLF/zA[)}k~mӣ]m5t4Z?S@;]W 1>5c0`گ79oɃ??)H^!xv+^C<6j^&Ro)岗)G5⋵vMRo5w]E6u3P.Z+րzT"9W eoP9ue+ U.N.1[D29``.1պޘ!y3]̟/TQ3m>г^' ~XhH=$$V |!wIm u/?ok Z?5/?` beA1j6ЁG [J1Av@Dih2*-#h4?~b< Gg  EoOkO<Pu Yk` ^9 +?nw`HCWO&}Xm:/4y;*PDiY Y]zuϫS:6Κ)k=pZFپKRȗ7|eCiHF,'#A͵Q K{8pບHKN!wַ sX`u1o <x ᷀_lnA4~;sX?&Gt7t/Qcn5:(+Iwb/4xBmӎ Q*eD*UQߢm@)0O3mJhs){w4J{6>YG4^L00fEU~Whz՟bm͋@3A3x1DХ,6b?>_hOЮ~єR=X VܳyTEܛX{1Z8^?G^Gdzși,[E{&L#eh6wG+~Qw.2M׆WJ@ueap?6u~Zè a_P'q׻#m'Ӈ!ڜh/m!ijc(뗻BVᇤSȩ'd?Z]D[3TIʓ-( z Vo>=})wܐmnU^Q(-g]žܨT},C>\6X|XOG+GsQ>i>L1)r"k耣 tscҶEkM&4/^@#rd _Sr<)t@Wǿ J*+nlߩw |H'B/w+$A`xݎ:ݭl〝'6?,=n;NvZD?66#F[ŏ; 7ݻ [{=t$q QV=HT{SOuܧzh;F+pic?ZTz)4֫߃#%W#<{zYk6`}Ú{:gsV~zk#swǓqNBgzeiZπVuChˀEY.1OK9o5/~ukdo1`e32iW@Mav" GPT#?|K?Hb)Kf."8(#k\k k|V< Q< ھ"}o>7 8C|@?⍨4hs+y0o!:Z~Ekn [m&P/z^lt~ :$x}|>&H}V虽w4]2ji }wQ:u=[^*dџ(?)ji-OK}_4^O||9(D ZJ Щhs/s̄>YӷL2y(H"/#|jJ;OO},١]tD ]FMWcCZ ! muדzz,`/ނmA~oWwmlw&|j|s?V&CM-p+~D F W#~Qy /{qGH&w^Bocl鎃h/C6niwDݳA]3 D(j>C:]~}^>ZG >!l#= ٶuUOw}b$ڸD57oζGLWQ{ K{k4Ӱl=jW,nx7UR}yXԗlz7h^+ȵf\Hhv -l2⌦гZ}ZC˷G~LՍ - GZI,yS?>%gB}܈V%}x·,xDze_,%}%E0[K?~P'}E~Jl#V w"]goܡ=urv ; L4p"5PKݴX>>K9XjNzmԦu'h^50gFܩ/WWЄmsa>j~VA&/vTwiN6:G#M#}'baJQq 5ܴQV90C(< SI䠲n-( ٔ&v!OQs4s!ٴ*d!m 1Mf 'o#w Ecm:Fp^Mo)T~\u naw|7߅qθQF H5[Ww]_z} ;w#~JĝQߝ!A~ߍ]r '!wC][ȶmm A=6d[6ؐ(zSTuj'm[99 2>OqXoJt%㨁>L X&q ȫ?&i xMt@; xMj( z;Sϰ > ?o''ɟP@ywP{fަV^` ԚIG1xet} |xd2\Qf:C{&aoπ7)m8w&196&lq~1T|;lٹ5c> GTNͱI)A>premË;h 5@_Ged!t4´xi5xpZT| צBU4ђ(+m ;OYؤXadmMu!os^}mgC}L~ژ`0ؿfKf^21X~BhC;;:hI4O}+tSm5y`4xQoI^܁hb?QGti NC|aor! |zJԯi6hNCz!bQ1r6W4CJ3K8ݴ@>Ԫa]{C]+`5OP.UA{|[ȯiO⼭,%_rA[:*f{;uhoTI{Ch;-":F/8(&2,EuHo9h-uwTzG[|9CzF ߎA%;|Ρ-[F2-ZߍC(Cn"u1hlC;Ɵ?Q3ԩ{֌<~y!4~]mO4j@@>ykeOc}aO7Y=21>>e5&66z5ZTkG %oX!pA֔~%8OwƼ[ԕZ9Bg&`#M u? "ÕL9KY(%:OWfvu8V+5Jl6fMg:k+n:$do3W |T#"'k8z"mV?.=I/[YPfhN gS8K }}Ԡw\}@67Eߊo)]~2d/t᧠ BzPMs>0ihqc|J;h#v8RA{lq;h+hMrC8~4`CA[8x'w}ӯ+9*aޚea g%@"y}ޏ|O Ox|M#Ͼly45;.a'1>/vw㈫]k pΤiz{<D-fӡ'__=W I|*tL؅пP N_G 6k.Y)J~/:Cw,~T :п[ζ jG(PnyIgh(_:9kM7ڑߤ{ K>yr_i]SUs'L0~>jj[}0 Aŕ\玩Vu\)iU'egjƷM}$<ѝ h~ڽysŊH =z;|r/z/J dQNd+k'n|[Q?uJ)-SzS~TuʁJD')R\;k}t1S?zeޣ3sjutSR3+%m+i*}JvPU *tҊRDv76elLبbCMbYXj8'E)bP aEQ)+ R@E9h r $j*)#׽'=QQMꩉިڞ:"ݵHը !a4=5`EjRZaQYQPTyFǣ0 caQmmH>2;UQ(|DDqjU"`lFP%+b2 %M\;ٝ\3ٕl$dJ)/p AS)AiGY"7J[[M5ܸ<:.}- CAW           g%xI!JC<1i|DC%Ѝ5_[V`Zu_QF-|}(ou`4^yT`BlAࢯʆKc@ [6m ƲE cbX8k{H&6 /P6چ Ϩ#08)r?J#Ag`A-luzBsO#س _;$NC}r׷{AO8n)^ߪ>wݷt4'?\[ endstream endobj 767 0 obj <>stream hj`'P`  ( endstream endobj 768 0 obj <>stream h޴[ |E3C  C2@( @L @8 ȩ.^PrD@D\SAtA]QPUDaȢo^ǫWjI!0Kz׻E'_Dʗ@1Ejm *K$R+L~9RZ"% 3/E"=6lUknMZ_,ZTuz-D;P.A}s"oT2桩z^DmcF?8H}M;):.rR;_c ]xuW4!_ CYTMQ1&S]_cI+4L3]3U4<$pf${":=$lylGFL H "m]f_ů&抰tz4fQ$_TOS$߈YU);nN4I$O>P1>䑡2z^gdx ZPQMcFHO Q# ؟Z+_ߢE}zP_/ѓʦGj UZN= ~(=m.I E4\*h40=LOSƛr.ejڱ ){ܻO%RcJ h &Q1]ES 밇TMW_bw4֋Z0Aп O^nݻeu쒞9S{R:ONjww6[lѼY;i5r5u6_NZ5kTdTOLz~HOBO+ brĺ9۴(hfnU_FI]Ƚy){:-\݋=Mrc]IϏux8,^,DBzL^L))hA2{Ȳ]j1mEG- J\uby  A(SIP| YC FCzc3jſ`2xD${&! "`DXiUwMa;ruM-ِ VcA+Wmeh〙j3 m^9,9_lLr@LҪ a2v &a~*ɉ 4w+ZL%mDA4\=DKXv(߄ߤKZ@Or`(AZ 7R}5ѮLm<A XiAuǖ@@GLg TޚZ1 \!|n헛G[} 2yO$|< C/ׁ<9fr>yz)OkEyEUy/k2#TO^e#ܐz(SoMK>,p4y kJ=9{kl-*诒C@ ZQ ??FZs41o%@UEz zKO ͨ!x{/DSt@>r AGQF%AG^4')J:s'b+(J" @.WMZEc4Me?re{;wOבc h)u퉛zG;,l?JH6yYUH xyy x/8ӷF5 >QlICURF6*c`5P:Ω#i ob餖A_ocGɘl/|y{XfE|/z/F{\jo \WiR?@zw"~E0U  Áf\ѭ[AO_#> 8pW`>zx0߀VHw*kr5WQYYC^AԿ01#dNGh6dDiTKyveB'O(-u@P *h0w|kD}9`P_` aK5Gڠ@UT*/BO?eTO}f.cD)+X.m~z}?~Cy7{;'[qϊߧ[S-qobRhߕw4zYz-ћ!!g l [i!?Q%wZaySZ_ˤb7KIn=Yփq9ekOjԟ}F]}#_=<_'hsپh[lyɺO Y[rKO!riEBh!-R )O,d/{r"06[ }CɺfyQF$bT ׁ=EY@TYNG|\˝X,v| }jR>,)r 9k[鐭;tsҶdsj-9/R_=7[kD-V/'xR9/FBe6TVغSo4@A:O^$VܷBNh%k [LA8~@ɺ"i`Rt^]7?`4.#F5UR:Crǚ=)5b?kG:(c=rB:OXbiQf06-w4 Z 7y|9 ~f]+Xk T~Ƙ~l$YX{x/]4STJ]VOk-GPg!1j & %mOIl.wWÊxxP/"~Ri]G j-珢l]}" 3D9`[iӀ}P=&two+X9cg"+x'%aM᎟%h+Ky{0݊:ܩmlc'6?5n;vv,d"Y>­h#ݩl??}o@:E[(h։qwīd:S= p23hYjĊi4D@ 6)'1|!M?il'fmPN" 쁵JkD?1tI=G)5;)8'@uN#} Lz>;hKP< u?Cx0Qн_y&؂ ?gA~f:Jr#R,W> | `3~'l;Μ :67ϷǴ:̀tY{1^cA _򂣎w; >EHT$|D1yV)wY}9 ,fVeHC.f"z)UQCsp7/›[ H` 5T{x\;xAcb+u97I6h` `=_1mA?Mz <[9ID>+̾; %|cIA[E vn$}h:-xڤ.d1(ijk-OJ}_4I||(H mMvƓ@/@,[}Z< чmgEWDU{S:~Svh/vu._@~{6v@[]}m5ۋ>Up˻-o}c C!no3;nm|i?_v@XkZ}Ӧ{? ~#j=ӿ?~\hŅon潇#]`?lm77EtaN=hw;}"mcm-lٮi~oQg HA=z{F OZA,ѷOyF-zauSr&}9}<\ 7^wUc1]߀}u;-@D;8)&0vBw!k" Rҟ/b>_ w=7 hk{  }b>h竖{9u[V1]59OQ{Þ>/~YR8-` ;ٴTN+^Tv>(6髠{C u1},RJem,a:q?M)=ghodimo {k:(-)Vp ΖVEM/@C雗*-E> WvV'~m)٧®MUzݍNrZ|]>}UpK=:-_dn[>o/}nO_Y}_{ }%o|[ag,3} 8o8~2Tʽl.ZЉLuL?W @/XSYVp3 iot;IOCT WUpFSi)&"]#?!|XǺF&f#mTnNkXʖ>[KcY2JP/̌Rh:M"lzm!H?+?-GhFk;׮s7nSu^nڻ=8~Zͳ4p1Z^c\B?2YFغ籦&'hO+hq&gh-d2[zFE ;=F8F]uK>{KTh{{hM֖AL7 PvbղB2hZP[eD{oCkЖ ^oϐo 6rh ] 0C-gH'%] hFqw]Woۿ9neCa|q{ܑoߗ!{A~7E U!w_ { rwaݍ`މl#dSm Bl ծJu`(hv$`<  xfaY0ϫmh)do~ҏ3|Q.C 0&%ѴS4'[M[Ov:[vKL@';iDY7'#|HONz?ySIt:Sv?lYzA{n8d|t5L-AMS ;1zK?{MSp7M- rmjQMhJ[v*s}+#/'{|GoړRF6/WYʵAo.v² /Yxz}yWGӄ9dX Ji?円rh -ސ: 9$Ve3XGS=<)ga c IB߇hOCOy5eSpwVsc.j9\`j0.6ًܫGam WۀFCiJD ڷMEj5Tc(N[H= F @>F4Hŝ@c uavbij+u8o+Y4? <ǷT{N}P/(X O m^詍 Vzp_`݆gc/Á[[K&6!c ܆umjhoKأ%6P8HX ľKud?A7 i-g)mnmrvQFo7"zˑ8gɣUķcй|ߎi;dv<e+wcjL}ߐc!T{~h0_:;a u&z"ogna`z'm>8j4~EӭQ֝?`}uObɘY}6_SMhȮ'͆='|y~|Vi/Ն|߿&g|,yV%o9c|{TR:^;Ox%d9֖^J_#irWuqހ,Lz,|Ze}+CW8Mh߷߫7XcGoc&p\yWjSEU=jS^]NQ?ŹWP($3&o7ؿJ-H ,*D:*# H$>н AV؇] 2\`0 mh)*/Hu3}Ϳ!@@?+hbEZX$HA,ttF-QVɯWH߀W>$rnpلˇNOUn$#]aa|=ƢO!}hj_~O$0'ic('"0GmPAV-ȩ泔:x@ 6?Vu:}sNr3lWuV>Q@?}6y3L|ߞęԛC{(۟dj.T9eOk-R_ izM7['Kyמ ] ?"T5Jۯ(52>4ؖImi}i(ݶ4"E?۱)A2 p]H%6}jG`(^Oz҄/Lā~g`/w琶R;}ܖeWS$_SĻ>o*7A^-`-+N@SInjqϗĻ+uIU5LʹKsY/ӯ2+ ?fVN9Q_Æ@Fc Fw謻*yߋn`+iJV4[-}rJe([c})-ױx†?FghI ВԞXszzi@9ɠ5vBÓQwZ!b۶e=?y|zJА! a!aض dk%{FYRuǬn\kSjʅUw5j%QCt*C/.s(stw#{>>G A:JOJEvݒ+iޣHI(i&^@q/棃Gv*(2.:QmC[G6ZF<[)vPtŠp)ŠR8uR:rFa'hKD%©) VRGwm|Wx""[6Q F  "HՈjA!4=5` S!P:TyB'# a!CP4;'(tDFE8za1:aё`lQ %Z(b2 ) ))MR4JiLHINJH J1RX jx);/S]i.g\Okw'׀2E_:\g}4f,-kkI#YMƒmɒl H #0^,b#c1\LX$$Inyr㼄lF- [;ZLUwuuW=wa8yi-=M—~U{ӄ9M7w3 {]L-Nj[u d?U  ]BwmsũĬڌh1;k`W"fKZqqyU-iRxˑQ .Z]|ChQPB 6`H-ֆ$8QTTKD/Q!y! [@?53/џJPLjҒj]rR.-+KI*rtRBT1BAТv<&QgV2( G|uy?zog&V~=bK4 awS#0lDN>,";SOd6!&|+J`F"BE"Nj )ZMXOCXcH$k׬6ƨ!9;./ A7 5erg1/3 !.Dqs7i>zIaY?H䊓_ύ7/]E3ۺ$޾rC7XC7&{ q憎}/s7K xOGvծ*c~|E$íX $K[br]4TCc?a0F8Uh 4k C9 hA5Юdhv-F6(c? .d? jyn(qIyYnNVv {m]ɦbUճ6,.kmi<~?8t?{)s6uf޵7x{SjyZ[=0Z{j > ?[hy4eV̎2Z&MXۼFe]ͨ*ظ&)cV5R5:NՑsV:~L}biXb9?p";{rYazqN1ȫHqxU*i.4M&Y[jBմHڤ6)TEXl¦aZc1">",X$xGS36uVK/^dˌp _ ?&p4ABh&o?,aN{% ^ j3= jC'Vj>OVeZ!*ă]moHފ̅>pƊPyIΟx^H,i͌Ny*f27O ƈ n ~4M&Q\1$NP 1Wq?O.?i<]kXC&a21FM d4%,F0زыCTRv&UΘw+Mggt,n7K kqIw:)v>jiܑ=Xe(p+lϟ0ofƚ̪FM<̦ -fS6,71/FSMQ =L&/K&,*d)Ibkwz/ ٻ?e!}Ӵkuʤ02v i;MgxÜ}ԡZ?A鏌8gUF6Թz/c77h성QnIT! 96\Vmi0D2-,SBhMsl/̱>`1G9ߧbfKD'*@ 2Tw4 oe~Rm")fG !LHIc@z,X~W/낋<3'πzï Vk B֑ec\!RbQ")q蟏 ,ô^?/2БTKrFS'J"ǩ:9D!$d.Y݅i0y:b;f#_1C 14P*gg~0%dQ$}!]{`-X-G:fTiӓT']z/,/^IwI߱@ڎ,Շ]& 5ffCfjr[wvܖ l]nnu9T5logq˺ th++;S7]SzEyq׮;uɞ\L]TҺ$im 3L`5)>[>R)F4- F3FBrr06@)bF`#SV LfcIڙUj ["hNW3_ͮ} J;)N5Pr߳*CϺbidWWBs0L<7[^>pwj]nє Efbu&Oô/799jNI\HagC .fr JBܓ76?j=u{$^Ŭw׏Nҹuw8VnaeѼd}A}kI\)'ҕD}{;_xEJy-޸<~_YX8yͻpg9 @ AZ2$n-Ť`䲰J9ɚ`zz 7 8R Mr/g l0ݮ1& *%se]gWl]w݋+ļ%%,*jcLZ%Ӵt%u_7\Tc]_Αڍ<:rx7~ 9+*Uq8 @HaR:F[*mR9mʛw+)|L*v Fh>oBplbQ6h3>Ml NF8}UgɆz\VE/Z{x%;#q򵖔̿ .(+hXPӛNY tσ*S^s+VX*F"&y JXKFh^Kq5mČ?mi#`tխڀfR}Tz"3qP֤qS{K9.]Mךx+|ùڊ^ oEZK+Z҆Z9%a1ZDlh%%JQ&lZ34LaU6? ao5ZwμyEںLpOOxpw'76mM6=[طvɲ˄)rV5~gjWx@Dj| ރ P +-&kY,:h; |Ӕu~(x{s|nH 3H@+׳+737s@q<;6#ɄvK~VSӯkKF{_Nk 5Oe+'g7mE݀;QT㰜g=VTRjBNi0 !R6ڃ*vҚ4%q2}c17(ctp ]/NE9ϙu 1B?1g#y`(@ 0쳟X1K6o龭#ܲ{},ٞ7J /s LlHE9Qy(hknhNcs:e&T\?jVD~2#Lf !sݙx~&"rҌ( *tR@#thK`,X./1;M*J1;s83Wud{kQ(6?"]sG\,ԅ"MU7eS; ِLԿ^y T)pxOWSR##:cFBa),#PaRbR^KRXJ+{{fׁ?c AV 5t}^s8XXHsLL ^߾T"Լ8yjnP"@pcKBK,;EE%s#Rޜ0*A#y^UQ{a ۂ|gй\N[!vb"L*VFK*p WVa ?@iܳ䜱TRsi4걔F< \IS[uniOqPLI4*'V>ұ[\N,ek2Zuy*U .}wN՝=;d!,ՙf괣оUW .e&oA9/07?oЀ 'tFְ3,ͦɕ~1O9㙗o%kke^W]{LݱSg3$e <h 9tL}VG灍hcD93L'm湲OY萜$X*4;7:g~ޱxӪ\ڷ FӽG_Dn'vmXʟ3] ͙sXlH[q!k#;8F;ڄ!#A9R)R*iSt53}F 3D#Y[bmBӄo~#)-[,*D:I- B%s9E-ph'g?{[+ZNCghH(ԪI kYdOOO[&$RH-|2*hy!YXfPD8g~Wet퓝 BǷR9NIlv41&"er5Qˡ g@u^t&l)1 w”~1>F }TcZmcz:=\ύ$=tQgx4Ьo =c!>*Y"ϣz`]}ME;]Q(:{fo᪥"oU]%kfT?^::r>%yB@ ujJD*=*TmԴH_Z5clH˸ pY V_ǼfVFt|z)Gd BD [-j{{6LɼTw0Nnfv0 >ɮ#-'h!8/W !2c ,{%)*'VX~i$V8{z:,ϙfŮ~ Sⴕ"x' [08"8_j>92x%Dxuv4C_TO$"6LLݙV7-5 aą8A 'o  ׋BSlֈgFSd27ۇz?A *Bgfy*t$4;K{so1 LĀ  />{@ӿuu/t{\:)TOb=~siǁV/ 4n*ӋO|4)p*Fol &aJtG8\bd̴$Q O>J;!j !OzޅI¬bÐy> @>ܛ̂!v4a1wM|[_;2abmM5=w->|G{р]e˾*`s}gM7 iXBڍ^P6B RI4XkyN։y*f%5CB l=@ Vo^0zr*D2fɳ(LpY.ɼȬ zO{Aa˝D{#Pn絚5։Ԑo~UsV% s$3ĮP<<}pʡ5C@#._^ziN@o4@ڟi Z]ౡ ~cf-{N2Ӭ5QЌ{HYJo'^a#Sv)fvdw/@%2ޅw{w엳RHH֥Dŵ!=2 # +.݆ :nGw޻F@(:E#8jLO§9D0(*Aeh.jDQ ZV(v힜VlZU+۪ mFL+I) ܈'_!ʇm!Ge_OШB-wbb WHGpe>t=Z(F'{L +9ΕI$'_se 1ŕPpe܆Q $݀64 ¾z(gV@XoX h#`k wguJd Ŵt=:ev@nԶw?Ms?X;܍4l+{o/R[`F;6cPdZGvbI¾m:o5طmkQyoGk@oޞH!՘ wmYU4ks_?9}{] }=-]ۘ#3~Ʊbk lkwѵ' lc/н}.l ]Y\0ZdsGouXFlBx%%BExЦoUT~$B}Wǫ4n<ˢ*ʱ-9 endstream endobj 769 0 obj <>stream h޴[|UE>B U /d+&Kw|@.?}ίG$j쫋^}Ϲ0o{}BF#(O16.$js/h@yy7o#zu|~@zܼ9[&/ Ѩ/lEQoTQ ?aYAP| YvWr(\dmZl蘦i[1nqEY((z(HA=f;D@GMk4!hwܘ~OcyoCQ2G͛?x >|0)&dBObEi͕E UR ^jbZBKo>"q dx -ÿt5t ]/kBx37*X*jZC7DhyCC6Fjn[i3CmNR3"n 4;$8G ٗ5#/EA WX߲Po].~UXEHJQArmDO܂6(^""_ i?뙻dHH_`9~^^pvH'v G.< ·=WÙh|sJzÛ|Rʐ)=L"YڃR/ҟTez3kt^7%ސ!tަһF}k#ԀcMnJSN˙:e2Ʀ=jdÆ$' I0hU}.qIn:ķkۢiF׉zuKrvaE؟E^"7*v/W&NE)TʄPJ#7tKIY GInw!/Eq/`)KKsP^E!!ݻQEt]к`NF$f~Xiظ,!gH+u nJ7ܮM XyTj%h5ٟhra?)9ՏRdž`B'i'>T41MgNjʼnl؟@J3UGУkV18xS18s-%<#: WXOJR6.3ۚ\ѳ3D7gzU(|ȔYt@!F:WGr/47IUPO|.s?}2MYCR:$fN+ ͍Yˌ $dY-c?e.-"5'-G2X+K-(|)O.o4q/ӈ%N*+~0eCeũT)VɉDEN9笚J-*ٗ\VZ:}Qu(+_.t&*[C imMggʷGɸZ!WhC0Sk2 Ѿ(jF(ܯ $ 4axކ{LOb|)yݒҊɹDJbe]f^B<1wܓX7֥W$23n\fiCr*#.)QԚB+"QXdا`AX[*d`AR: J::[N%(FcMM皬,qQsJ7 L D uB?H)GFs#\?) L5PD;.3/'0&ٙ:]1;#n@.C%y4>S/°dxJK@G Gd* KdfȒ9&@UNY䷉O!:&!n4aYP? r}m 20\4ѱ:Du.A/xK'{Te&ώ E:u΀ApQ UI_Ť隣YDeI^Dׅߗ3G9.zE߭qWDžt6eF*v/եQϞAWTJ_2V c*2zSv9Κ5!MxPxblc'QYqqۥXL(r~8hR$*8 3mcNWi`%mfD^s k V=xE]/0 ~c(ߥ{F`}V:xƐW'&DA<gbkq3ޡwܹ !Cj6=Q`Ht1[Kjf5mLϪRn/Gm9C7@|w\NmUpkQm[agj(< u8{Ʌ}M~€z7k׼,vj#a-ÜڝΔᕲ/-hcu%_ls4xڛw}M3!<ۘl~),!+dOJ4>#cHm者yָּqϖebծ":fN8SH]`zn;0p B j~..;묎fʸ֪pC2oE;R5 |xi_>!CP@[F mk WK'1/e{]/l+l+bMSB6+{!7+-Ԟ{qZ2ma&jz+ CtFSo&<-h-ܪ׭r1*Rv'ףO;M45,W5Rz6w;)1;tX_$Jak $;k_O#(`0q1-'ً^q`P+}Ew`4ʲ0:ٍi)gOZe[4;}hӟƣݍL]FĻc:tG1]+ (+|xG c%o6QK̃0V1$`8HO (~tY?;0^u<[} 3"@^l~@#$˽Ov7n3 d'y.5s8jj O:4R;s"/4]j5$'Z\%@*NC'{PGZJO.aQit}Ua]@.yoJŏ&|Ml.f'`UQ7 LO!q4nN#mn^h@xXFm݊Q {8Gh\í ucǀ<&tXS;ϻQvgG> TSxH79l}iv?x8,X_:5ƧqHvRvLR7X{3}kFgZҺCۇ%IA`'p/p3bP Es@ 8Bئ! iI6̩נO'l᷆~7WtڝJ7'!7{ c~kE)mz`n8̫9~1Q{MDX=QhG:CQ@S|sCh(?*j*[y7?^''h\|>vszg}|)(y=\_߷ܯ)k}5ٳз7x=f9yiyl yj}{X<.๟]$aM {qfRGg[ܞbo3D s0u2@ʒziXg&jbJ:۩  'ʵ7օz>d r><ʾ>e,WŢ\ye3 o9N͹Ӂ&®Ajd'^A d ߚ^ 5:^WfX’a-f+^Zk;{r?d;#NH2^iD2X+CƲg-.b!bύvFn}v7Oj$Z-;Z%|~'\o9OeD4eO$b?4߫}i90lj*35>G 9{{͹oU3ɵpb᫫3Tr?jHGvjk q<sOb\_ b+2 9/|j?(xs0f*os7Q3Aykx;9b+ 揧i\Ghh6g{l&Iú7D=Hq u=}H;}=u棽GQQ) ϰۍQa `[bϣ6?s+S݊~Z~? FOœ؉z^G](M`7YH+Cy?PXCqv$pzj1a3Ө/(LkV0oJ_Sg{{U3>eK.O:M}g}`OP|o>*ʁ" Ź> A9H&x0v;v~a?;9|cVvo !;/ k1sb1pP|U`KN͵a'iz~k)_1^}Q͊1#MGeRJE[fsӹ@%) n[Α Xc͝܊xl ř=sw qs%neBj=}\Cl@Lv-587_][{v*% <b?@rѕj{ WCLUglX<'n=6y.  [A!φz+]yq6}3ް\>8O4yGm|6O҉kKvyo !,\d>s8O!=K`)2[ǂ'g\*xy+ Xdw%|?E8oZY'[ދvش'fY[L pF*OJ ^q7=vI`s$x# X #L:, Ęoj= rg6wT߅Y,@ Pvwf0@ܡ2 ;{O>ypH2/=̻tukvc!;[^A#9}>\_/z B _gB /d#r>>c>l̫5",ܞaD~W3X[Xw0Z{3)֩G Yk슚~6Z,{_'9ۀyyc%ΤfՅS8@ܹd{nT h)tbnEWy%Ίf4ɉC^l#gk|S EP!yX/Ԓ)PIaE[f> >D-7b=A9t )?[R֢A[;Bkٵ.c&SO]hן(Ӗ{PdJo@ž~WmQM!SsD lQ;g`[^*]=Q q5;c' .f!r}/O!w-vJDag~.7ųV}c4YdB=ZqlxZ' %TlOF`G, Nio.0y"bwzܠJdo!D Kg;})y z2kkloDƳ _/>I|(k}9zbP2-fS]`guc58$(`LYޟ))5މor69ȩK=BA^8qO&oH+ ̤vNoy2yb=uMί{Л1}7e{1 43s5w^禠Mbo'2_B?PӐ=E^~x/;U> ޿opSwcQlrCh ݍhد 4 qGӊ4@'ğ*< 'E)}~~qcL nӼ4 & >94'z[ˀ1D):<@T8힉*Zձ#H:'+TCSwo~'!O?H{hps \Q އF@Ր*T*TR>PH :?_7 ܡ1AV]1_ИBB45t1Yc.e?h 0kCmpkKExLPc2rac6guWݧPVmT{ +P+q}w!stw?:o:- br&3ɵLa &W3YdL0YdL3d.9Lf3d&LLgRĤ4&L1ed*)L&3$IL&L`28&L2Igd LF1$&Ù c2I d&IL0Id2IAL2&cr%L`҇Lz3I/&2ɤKtgҍIW&]tf҉IG&3iϤ8&>&mar1LbbҒI &1iΤL0i̤& 4`RI=&uD3$fb11LHedRͤi&_LW&0OL~dLgL37LfrWLdϙ|S&0GL>d&gc>&G_-&G &a:L^c*CL^a2dg&/2y&3yɳLa4?1y~&O2yLc(J&LLa^&{RCϾQ\vuϾvϾF3#i$4-YӲeڭeUlw} c, $"`l,lIH $! e?~ߕ_u>9uNU뷄~C=rʻdׄ~Oz'ez)KBo7 A:_'sB?#Srk^% crKz{9B%,ar ÄJ@m6 &z'R6qr;@QB>zCKnr =@O>B K.6ٻз#&w&ȱ; %t=n'gFAVB_'t )Sօ@ݔ. )khg HYˁF.JBhsʺh|# 'Oh=ukkNY"7[Iμ]Khk-#O\br"B - 4 =_/~[5>'oހC?O_կ_/Y?#Ka8l_x^N?[խ @3p`pvv3CVI6~@81j G\0CkB;~{ ->݀ouwԴ{5eͣ73!~S߄*;7 LHnKnؖnCmm-۶lmIٚܜ29)!q`C(ZJ,$O-~TߏM~F>6n`mZ;mεʪ="n_umX\\=*ru+%X\Z8d`qrQy}ɹ}9f%gVHN{+{Ɂdwegk3Qٞlʖd@Krji`j!9l,L t@/ ti@; h4S@=`2` ZD@ 0PTeR@ (bB@ r9 A@ xxn 8v `Xf X`:*Q2AJF_> O;3s>wŋ_ 8?>|x[o+;$M? SkW~xpc/^x(Y0a! < x C~8x<.;m=o|pN^=u-݀u;?G#?G#?Gk1A @1A @1A @1A @1A @1A @1A @1A @#}>G|#}#g7STzRRUTN~҃Iۨ ak}@+MUBq#e= r#oF>8kE?C7Xɇ>,.B\a1JE*"x-]Vfh)hƒ驥>b޺8Qۃer0Ԅ١BQ*JS1)kSSr^kRL^)G~#7Ln0Y ED6sFEaÙWh5Yr6rz=1eKjOqL cZIc0g{޾|).lkV xa^)+ԨRS {'`+؇l1jPutt$I*azZ}-־k_A;%Xa`xr p988f$_0ס:|4:@0jjLcLmՑiLS6Me 8\~jdZNly*K6Ttȏ2m{yZiKfԴ# {i;CI*$R )IB(D# % bU V[vr á6!إ>Bv\FntL:)杗#O.OEaV)T`!Ugf5jh9Xmt:iA.i4:;XR$) \1v"l]1 h$Mk$4hI4$ hXw{)Kd#%$wVB|d6e:JkB?U7+t7zSzp(WMcAUD':Lz}dt>YZ@z5YJJZ%aVIX+*R(* K(z潍\[#'cBhmV(TQ/<<+0PO յi WL etG48hp8oZ2Tm4ScB'3a"at䙐c-jbg*p9< ^6ZI<*[ԏ"N{%X}-nD3xkE5 G.>6.9 %# ʤcu_S6{RL.稉C")SdzaeZ$eZDe4q̸È7pbǧKShȜxD"+*J$!l/їYlW"5}CӴ;IFx/&x w&UB7OWmzOſy9Y{.?j} '@ѳ3UpY,ؠ,8q j*~ uOROT')w { Ğ%<"2b:.i}|}{jϔÑ^}o]s/Λ~?Gokزok!2r I$Br9r I6;bxYzq5şQ\!BbjqI1/xe'3~n9Q%υym˯k=\=//kf^ʚt_Vs6MXQj"qyu[ Gj r9XsK/9$4SaB#NuP$,h9:r nUp*unyn l[^ rNFس,vK9".KJ+'.̢[5ڮdNe(orvkkJVcVhFUjc}ʧ+V.AξcQrxפ *TW[`tf-0tul4msڃIoVw7wFE2gwN&QfY?}|J6Rf\.cGa=w|rKN*6psdzpC0..D1SU3!XBE!1yᔨ|\JxmS2*dLjZrF3*EkU8k.(K~<eiZ6A0X}.LƎTFN X'~((FE QEW^WHˌ/!K<- eLu ,Izr}|c?3W?12' lFA,y5riedMYlV>~_fa\)YPaFl"ט|km.J`5͌@ȍ.M'lnQBPTzG^BQ3w8]9.M˭0u)$[F@uI\e%1Kn"UVn|!V>䌻h{5gsY+=}=dJ&}{5zA_ 䫆vD\5 SF2-*UC+иhjYO[e.?1HJcc'ݼLF7rfI6'oe8 ?:]>ŹY8Wz)UB AoOMbj{4]l),_DQ8STM^΄L0L g*eK㥈*Euy-Of,承յɨXfNYf[3/SpHͅ2`eВ2)zdb VAچ#qxC]: j?|j₦b ,{R_ ?~$~洺U:TYPҺ͡ienoЫbF{N  ݓAAo׀UCe{M\2rɨ%}}Q_sm>ǫ.XQ|ccAk}̀ ?F?F!s3bSbP݆g+$S_b\i[pϒ5gF;jm#5 vDTF9935 [o~qs5rS<5hPeb?zy@~>Q*U8 Yt*l,UEňbbb$eŰAímU-3!C'~9%Xilri B3fUL8<`Pr ^ o?{s qئ&oOE& gƀ64p]S&,[-M.m퇨JXy|U9cde s X[dXo` _>am2dZIa)I<߆76Ư|?JM\%T 3+G[#Bs$kX),nZC3JmyaNYТߚ_pٴa,#VUipfNtk7o^ S?|%x<w7B8ec疢;R8sK W=)GHs>[4N8C(Xɉ+VҬ8( dVݐC*V_;T7نd|M7v,5;SkNAni4 rV(霰Pɹi(^NflSͽ7Woԙ̭̫T-NͣN VSA#Fgͨ$)VAB/C e4фZ;2cSTbaE}((QʒֱP<~.!cl~O}j_fjһͳwH˰ 0 ђױrTN(f6Xc .@dlrqK<RTN HH{̭f AOog{"^Wɫ K= @8٥snhmqƘ}1{?s]׷,u3|X|T :0qfudqHY,q:['&m)PO,W6\WL;!A9ֺޢZl!|F8P]Z { b òGą?qO Z|LCV|yNF# V1|Bc+Id0|KM_CT+D\GaSQz'3CqM{msg$Gn[&.u7GeG cr*eȧI}^Cy([Tj5=:O9&Q?JPY|-Ќ]l`J'D1Tʬ yUxh1HMQ:)1Y ?w(TX0:Qy"X=O8TX2MI増\II&%҂&l\&vOX/p@Y(JE u3.UiI[ 61WVR[.QrQ`Bm+b,Ndq+>FG,(9VP@aei9M.$3$[݋cBt +-PnUAm:+LN벬j1}k)Q(G賴j7Tpz5Z`G!*T :RJ\iQb|*v^hSOB3XpRXS"P_q_|<|>^ j.).IaN}d[V{CW}`t }AETK3$ A_\PPT/,UI\UfGKObU%c$ԬV0+m ֏EVcyYeަʙElAgKcK16XuE è W.> 53S#yx# GwKXiY63*&}~D$h M7e}eiLn O) 4N4W8<\cB PXJ'Ϊ}ɪ/]ɺ/Aq˥˗K}89u϶S޴ҪzY˒,[,˒-`l\pm0-`JB @B.mdBx i"1=Jx7B 3U~/{]3;g7|U-A<΃mhV !Q5t2:}\4|~w.O[v|{3蜟aU\yE8 ܱtt1A1A1B*&*||*U|*Uč uTa[3dc:ڑE=웞&8R: zVLa%;壟5+6t~YvC;W&56"ߝ,Z97ؕQDb 4N3`J <-I_KѹH-9 ip&z{uas% [x$>ICx``nJD }}M!WM? v]"=, 鈫[@ҳӆIF'v畞~ťnrBs}wppW^S'KzыINJ%Q"l%H|ag~˸z|ãeXy 1eE(UH$͆ba '%uNfuk@&eΘzWWmkmY׏ffّ,qU5cN`bm+*VG^;#zv甚.9tBP{.}Tgs)1MRyc &Ii!uv:6mTYV'4p6{B~qc) G,Qtcq/YFt (҈N yR}(xuM6HIA-찣~1s?X%`Ѳ͠89X|o=u1: ̣Ğǵސc-c-cX}3qJZ(8KE4-hutv>ur$:PO㥚Rܘ¸t^iK;'ޣ/g(!{=@B˰q&`\<~feX_3MDn(mOapi$};JSm @|=X Έ( zCl: #]ުTj_z:OtWYZb M~a$o$/'S/1&h@8;A-d: `B:g:yQ8ΝxIrbNR%" =+`n Vk 9l!.w״h|hcp"lΏHj@sTA)6u0j\e0{,D10e0y-L b &shf}z]Gӊ) -"J^+jkd O{ЏO=M'$oҒrӌd-Oi=EHpg,EG; ݀JB &O^"Ls-&I2OsćݜM -WûP4nD㾙\]򎧅@Qdy$9Mk ,>_ALN]e2V1gX-Ad֌ 3ʢ4ng  `uGw%\J3*!2  n2ۺPXJeyy oPeNf2=S*+$fWԡY5\2BOp7>EÇ/Yvu2pg`yo׳au^-[j%Wz\+ްcnU }%E.K<- X8/Zj0R17!^5 W/[j>Pa͊'8`yvx̫'4vk5Pc*XY͋֐#hdžt*iW-m d)KKU`\A6p\ 6>=2 /͔Zo|{]zLmӢiz}]orUFkS ,D"Si3b]ݫ".qWU]iaQd?RgF.|1J.byDGuwo$[+v_wCuSQ_hbP(hZݣֶY}=PeЩ)V_ˍ?0_Wn,2SYVr{EmKs$lˇ*MH.,Eɭ2blj/1~sW.W5gomS4,oךe_íU7|/pqT-1g^_g8KVh9˳.m c  hXh2Ʒ9HAfa*C3dL^IY xArk>03ugosY5H=?o}7SYduTaciBlmXZ[ٙi&W7=/nĦoA'LUK~Xw}4o[`'ݽE}Q#89@"oA(wU/[004h~~\!tf /`eMϢJ`~bl?"dA∼io[_ߴ>|*ْiړ%wzIX¢\gZwě֪b{og2ے*.߶aoX֡y;˖lmWR޷ % 4!FWiь :3نǰ\!f`e<=6e_J3CUWEw ]+GJKJ+*KKcݤbB@hD=ɛ2Hy^+"hmw z&cfwTƠFm# ;x8E;yM( No{] \p(V~0[;SvY_|$x*cU0ks[`U QbnƬwW4J4La8 @bRc@G'>h}DYQ`(WID;|:~UcK8BnU`䴠u~=/&L~]ԢY)6YVwW_ߟ so}0z5 dF=>wn#}߼/ (9Q4.8 k.a']Ȇދ/`1rs 9 qJeړT{=r^ gQDYXLY>$6GNm+%9.[q9শJ=!/NfVL- Y!uMN>=cK^C50gJ/W>.YwdcwY&wkv ]={|v8z=s??P;ruH|=} ea/ {` C.v°CJLȴpL|.$~B%hBf'T&@Ubg__#tiOGa^}~&i<ZF!{Q E :ge3LE ՘I4ٽ%l71Z;3h\@2:Qz.m8G&)r _RM z$EA||x':{=C&0h@+b,y~9GNu~SqVk:|V&' ,oR$@0; (H b`&e+Cs<76Zx6ItO\^752λ~Qut6q൚YnXLvFZx`C+ۛv3$G202HCdnL!XAD)\[9[(hE.`wG#QxΠh44B>G/(,B?.S5*kUn73e06醌k2, bh:dI麟}VVX%_1ӓ^.iRݔW#;'3&_Nyahj-8ܼl_Vkh}[Z׶}ރ֊etFn{lY՛_B/јfn\^oj^6xۺg4=+jeh{XL fkj_(4yS&Ω%5ml~\k8>4+ Ga .T#6¨F0*@a)tAYZI*QJw w*%Nx'YR!"͆Rd|AYF+ʨҘ+%/0 6X1]W5p%ΞTsH%K*Ex ,ܚpJVYa_N7^0eh( EKDn9|n Dsow u cqx=qw'mD!Vcr.)KQR jtkpiw>zx_č*V +<L^c [4 395|Z< q1uvˌD:-¼4wv8qj 0TwҦeQ!46K9O([uK^t؍z).Q8m;Wx 4^}D.!gS" 'dV R|Ԋj]ŝr:0 (;[mθ%èV4Y' ;Z%9{uqr$˫TIRSQrbIsL.E3 6y9mEP$aY=ϑd:a:WɍZ"D'GhϘ)XDÄTQ-lâ݆C$\Yʳd9DGJqFlb(1̱ @_mV7t4k aHfɼ!.eN3 esP.^V-Š<,s1u~:h]/5RM>h.db3"N7-\}b"}Ǫ͟UleW#U-sV4C]'|/i sZF}5;ԷKojǁ#JM7i`NE\L){r ZG AގҧO?N`ǦKZ}ME2CB: P:}z{_kjۖ-ކ>'&^$ic? LLSe{ͤF!Ӣ&:0fґZhqY,.=pKj &=it :xqċ61 |%u+Y*{l&OPVP ̏P@iXJ_'S8]s5Q趘="jq-4Y jDPˠ%irw$5$>2p4t^tk]W,0F֢{jDp*,Ucӣ|q=o5;yz$>_< pd$4i(c6ށdLA{>V[L't/RZ^w/Z=r )D5 g@RV:ܒtROI?~,!|ځr Lr  ĖtuՆF)F˜{C'QG\7Aq4k D2N= `YC )[gujvs'{ {w C KT9;fA\@grxvXẄ́m'} \x*ে#O]3x!{#'C'>bfG2@FɾOԷ @ٿDŊO%P#ְ}~^@Phb >? -|tn4#?Bܧǜ*UL6~\ynh| ځ=)dNN]8,\Z,fCo=,0x;7lUxpVn/ ( ( ( ( ( ( ( ( ( (>  /3 qEv_$#DI#RMd?LȂNN BŠ,-+0X V ^ ցh7` `L^]rymap< OM~w=Ƨ#6nye3Ff^*p: u}dEAȭRr-%"|.JCQK?'~7xs⭉'ޛ8X: Fi&ä ||'owh iωoCWUW/c?aDtnwX>k'gX&6N͠v\mVcHqpچ  6'6܄Km3VJAM&p&ilT,-dsw7xw{mRY6 ~"vI@DRX(̼,3#!8Bȥ@ V XE$O夀1+is|bJU֒d u90v8aܞɝk#?g:{-+C:HZ%|+aUzrBYK=`|D2kkde! L&j5;RE%J'rV~NQ|j{pPc㲻hNZ gǝkG>./70ۋWɧ / endstream endobj 770 0 obj <>stream h޴ \UEg{PL2/^E\@YDsR} z,1\ӺXY.V>K)fι by~x33ߙ3g3 Q&{4nͫ >!Öa Q*CN7[WC ٙx>" Ot_ µtCg0ATmkD #r Q+'sGf8MDTõ ?c %xt1ȏ}cLgib"6*K =s I;`BT]F%v_GyHO(W͠94)HS[Hh5#Ct? 0*Ϸ[{5jTC(@q{toU&liEa!ySOj{MtB=4N@"%QAh0eR lA{=ICi Y6Mch,-Oh"=kO3O߉7COSnd*Mw=O3i\d(f %22As }?t-WUh)@ie\q%:R-HgM2R|0n=mo4<]µ#]k Z? .ޘL'O^2'/u5*5׻Sf:6+قdl/kJZ_CZ|&m[6[6zޣʹz"TIIIωq9\?AP@HpVˎqtG+nlv~lz +vFg7l@ sha4aa Uu:]I1!!iJF*/-eWy9rdi򃝃3xϻ*9c\&*g8cb]Nd%e t: t$Ò^'U6=~BPB/$De(+/) ;h`&jb2f'2&}<"*6]͕7ѰZ_/.>pPt3211fbʰ[Ф1g9R] g39=R#ch)WY.Gl~zY@3)u5 ;iF)MU5:8U3=x0g#58Ksf^rBS[ԞIJ:~TdoAg6DwmZ0y-V +Nt'ѝCB̟?)RU&'@e2sעe9b3c| X"S*[d- ?ٝx[QՕ@mH<2me,#c,J:Z6mcgҲEUѕ\]l]g)HSnr;VUC9)?݉y *5s(rc)!_J P ʅc7tFt;erPTN4 [OH*Y9 EzFG<4}T!Ks˗椩NVv3O#TqZ~egSmStʡl#Ք#d/r"jPӠ\lJ21%ꡙ `+dx r!~?$:4*tD>Mi=AT, ~GQe}2EZdGB L8[zsDSj5/vuR5 !>? 8 &o VP| e?`_ )M;٭H[k0^8}B/[-PވFh"*EJyJ,7) ld< /^H#F3. 1t]8ȃ."<@%ޟRm'wX]FDSvFZd$Ÿ II7ռsTF-w^NF+>E^{@kM|8_kb=+fKtSz&uUQCuQ<'RG} =yc!,4"u.hꂞ 9z0ud CQNSBuqJ(NPYxBJKS t#&ʍ$f"~4istzʐ)%z0. ?*hdנR*CjDz8j;J]_MԳ 4D`#D[4oh)jڦ¿ 6^ Kn@9#'ygL ^ԡ4U#)A;A ! A0@0S$Z{+&f>Ԑ={OMYERw9r[)!ki7M(H3WDo)µ_Eu`[vR}FaB#l_(g.H\'A3Vz4|8@\IG)w$4> ZώR֞V+rZ_þ@Z ثLO'$_nBSh/~>fP6^b-YBƀr.#*B|kl3=&` a8? `s(O8E[Ia(O, A0D0 8A- oY>>~M O(.l֊T ԰ʷ,!Mil#M.1+b]ž-އ>;Fj;lsl8N#l-*@Vxm–NMX8ⱶtƘ߲$ҡgYc:mbɔі?A7LH"MCXY^E <`D!`l+G4x P_|}.ïei#YbhڀxtA-}f\AlDvI7 L[&-S* 7,m{E9%-mC sjH|\(Uj5~PO<AZR^DMۗb gpg)Y_)| H9֗PWl@ [,'%z;Yntt,qmo의x:/`+vW_T_ k` hF)Hz >+cl'=|R,3P6˧aŚc}mt_;eM"-F#m}w:Vq8Vӿ#Ԋm8}| G`gܽXGa}kw=6΄lEYlE ߧF]4f ݾ&a멺k0l|d&|BxmyYZ{^Vz/>ˋ"u?cK"jVp{p [ y:*^"ዴ`-ZIPnHB³|QQCG5!KHVvi3%Wʳ-. D^@lb/}m9n [n;F  Jvh?qݤ ӗ+>.-'Ȏːx9: ~pAKF>/i{h.pAOB!|Tq[qUqs}@?NAh>poí kPAƑC#V{"a=y7L?y0E󍢭Χ,a F7i8̿GA{ {g6 skaHѷ')o3UTCjtT{*Æ;gˇUe= s/s{6ϻd^j2򀾃:<_zB[ n<ڴ7HGF^ uQ.0ioנy gڻ/|+mOyƣ[ۥyƳ}Z_f}YfS1.Q[6elN)b \w>-ճk 8 3!j!\W)_ڥh޶!{ԝFZbIg]>m`EE&޽g1ms,N&O),r;dk:v/%b ipB ȼ'ናjֳ[:گu_3OjFnrɽqw LCc?q}cV헼I IAw{XϤI8{6+EaeY:P=?).?F=1! ]s8p?YJw{{Tgs.P^O:]IΠ". kNv>%[Eû+1A~e{21 ԥM #M?Zz={MVHZ֖]l 2\{ 8Z ^l6` duvfh-~@/~OGl:}:SOl*LP6H.. }E 8 i*2}k;R̓KK}.lD\b|^}]sSg|"tx mi4x50_Frwj Y|q;,WD0ţR7}lJ]L}st4q5kaM9KFo(6K{qѦأ4H<Y z1fz*ޜV{`Td תw7څ~fI8u-Ϸ0.뺿b)۬x ec SJ8[ ڣGT Ƽ|O -(޻$EýKҭSȫý;-[Rp-ǟ{R.p^qv Er`| / S_b zѣ :gЋFצ[oL_ q-'3b9/a6Kki1NBTO U+AmҢ#6]W{4Uܑo=)x^CϞjBnZr7o$Yc>JW 0z1?IM^a +v6LW||-х⊾xJ4.=Ŋ 9Rx[w "C?-קka}}Rqrglm}}shY%`oKz8oYb.6Bd1Dx׃y3@nYiml+Dȵ/6B f"GvTd\-ð`&o"~=bxd`w 1fhTu[b}:Zު< J]HD>UO%(@qpͼimSyw[{ 2;kp^!;:w{o 5?}E?w+jaѯ%$#o#F_SP6% {3yZ)#uOڻ!$w`70keÞ9{K4:)/8l1Vb>'/a9 1`N1~L #YxizG+Kx])5gb@6jQ۷W| ~>_qX\=#3/FU.~ڣ=GX0)>V^?wGQS}4ED~dޛ.{ Y"ܝ`/G+$TMSiVGۭBw E4\u< 0 'PkRqzaR~~k) :[7Du溑8*]L/h/}vs#o"PӊG_Q"Ȋ^'ڬBI5vOu­`Dk܌3rL?yV;xfų&Mޱ8eg- >sp::~Xpu}Й @Y 2 Pt\ h($󴙄ZI@f"K Sdb+f'q Sg?xj%=| 5+%-8 |>D}pgw{q[M75+ ^ |<4x$wM s|b/x < {tN^^pZ1pĺ;vo[&p#\ϝKYK\ÝuYO\ŝ ĕ p9 \ .sg qy!yy>؆K?lN. FY&,?lzց` wda5p. K~a,_@+XZ@3X &A4DsG{;6_Q\b5w'rYLv=rfs;} 2P f ny] xJ|3xJ(Q,P <>7 ZQ,6mr"%6mUx0߭c06HnEù-~aP0`r0[aK@li8@_,llɋMH_Dg`y:Ht6ӎY -F ܺsk5̭ HB*E !{y+8B ϔ(?R~,|gI(PtS+ʗt N)LPާ4rr.!sIz& NFy _&P^짼HGy<92YSi4i$՞)г״Tz55IЙMC=+.cXz.oH)(;iIr/ݔ.vzNjv6:VCt oDrzuk)P6HWQ!]Mr)&"&B57Hۨ~et/%MFFy!uȆ(Xx#ѯkck**yxk+cQYuD#QQ!B~TYFUƈcag7;1a}WޝaOV rk7Ki!kur}N/kErul_%ϏUs9?_)˱Jy\e Ky<56EY5Û70#v<¤|OsṣfN^*Œ.-iBaYК!4%@H88hqpƭseuy]*gJ+ 'Z?hq %lGml*cVb,P,Ǭ F-&$=&+`JgV-  e1`P rL%x VBBpJAzw$>wTJ=%;fŏNN&W͟CΟC +;%Uo޶M,̜5y%izh2wؤyhCu{ėK3!9ڈE1?w}.f%EGu(TL0fes\9.؉zMeZ+tL)jHc EZM8|#'vW/زm8̢V+9bСCƋÇ})/:$KL3QxUuqT|i1;I7Irƕ- IZFLitG)~jJk.W9I5꒽i4T0|$BuKU+F$]׉jaߘ`vkحFsݕS M;yΝZU%5FI?a8Jǜ̽R> #n7>_^Y7;zCQFgO-4iFAl34aLIISߓ0S%J(QD%J_n%J(QD%J(QD%J(QD%J(QD%J(QD%J(QDJKGU◷XVLt!PXŜwqvXCc-#įNJw,2psX c55l@cڏ;K{gtRb,ZY;EVH0kKkrKg&feTkdMt=1'{%먳5S#諡D׬2̖Q-~&5&Qoݵd khgs{ jí oak5\ .NlnV"ފܢɾšВp(gjzw {kpM]}KMxi}4[mrmkK[P}{.+l2?6'ޡaSA?n'4KeV>="3myObRWŰ-nYd#K%͇\b}vrޡˠiL<`sb endstream endobj 771 0 obj <>stream h Xպ2&kR+4&Sf(#(*(2#" *{nuzvoEu|{z)))))))))))))))))))))))))))))))))))))))))))g￯REEŽ{?7j>4*--]|GR9rd\\d& hVUU)V*))))iٽ{w )i&&& wRRIIIIOVZՒҫzܹsڵkn*))ʊ{UUjnc_SMhh%~>???++ P(++O_m%%%%ԉ'"ERكB;;;9D֭[w޼yD0Luedd\zPVL?_XÇMx\\\*eY3(\*)))~:/5jmwKKgeeO@Y[rlҤIppoh׋,xy 5jKɤe~W={ur䂒'ƍoߦUxeCȠdIII˖-z衇8+$ÂĒ%K3`aaZG˲<RRIIIЖ-[^#A8(5z6֯__nȑ#>>>QQQGKSy=s ;Vn7kI|XI2ᬤd22|+++믋 999emn:9F!Zj֭Ν[vr3&'%ٳg333(EJJJJ5(QQq"~a-Yi.bRRRbb"kY^VVA!7H7Pzxx,[l۶mY$b1FLu O!vf "ϟ߿?X$A PݻwXVIIIɌt…W_}Uu!XI˃wVVVTOaaa>}NJ!HFFƌ3ettx~,S^ .];vDwy'<y򤦓kӦMw>z('++6T'Nxgj֬8 C``a9~x1jgmڴ۸qH GdSyye۠A˗k RRRk& .-KJ!H\\ܚ5k0P˗/SwHI1cdžSJ666$THHȴiӼ4qUm۶f[nt#yUh rŋf;uꔦ7߼yewIkvӦMfz?C(J*)))Ք]SL5jԭ[ l޼y߾}ɸ`PR|R!%Q!ܹs}}}GA # _.^q~ i4h"K |7wuJCra۷o/ډ9fϞ= W\afxJJJJ5"JKK,W-,,̙SUU\-[dɒ{nh_J޻Ws6_)ر-,,^W^)))䜛˳+gQǏV=-- SAr}ǕM8<;99ڵ (JJJJ54rەyb.=<<q7xɒJa$M4?>)) /$$Wzj8KnPyʕǎ"M>0 .Gўʏ{X"lF56666P( MӠagΜu…[dd$i<==J|ʊ ܸqFSSS!ݡCٳsΈЭ[[lܸqx(p~zPKgΜڵDVVVVؾ};&R"sl/ԩ#M6[laBx^qلG]܄5 :u K2t.%%%?둦䫯zU͛L߿!.2ZkQ]xq@@P#>A<ؤI[jFׯC0%*MnZx VDHNNd$$,+wޑliܸٳg hcc#XJ^ii)^4.]YM˗/+B?$PTRR?"܍=Zcƌ!/jժm۶aw(PVV&()윖\75L6DA{l  yȐ!"ш$ A=z& ƍFӧ{XLq(YUyll7|8srrc${]㑟9+zJھ P-GM4U~,X.ʺ~:T^~O*))o'8g"8;;󽸻wav΢؂c LEx嗏?Ox!Cڶm+ vvv+VBj^k`F7n,w'K.g=N~W%%%Lx^fMM`` A3fXpGr}[QPBڷVh((SZAnݺÆ #y&>?FF...̯[*Ʌ2e&a.s O8QbZhakkrpߚLE'O^tڵkGm*))u~JJ4 :v?p77ݻw/.^_RR"p8Cʍ,rq㆟. t4hgy(uȑszG}$*lѢEՔ!24i4^Mo'fcǞx_ D$qesH/022_&;y-tURR2W\v4%*$$~ҥ|#Zwpu$tnڵ+TA# ݻWeuև-q„ r>sbzd!&WܪU+XFo5F_igg'vLÆ m짗ikq!]E $骤d2vƍ'MOFtxxx888\r۶m'55C;TQQ-O8!=֠A BEE>zիWE3f̐ _vMɕv…ӧOw·@.џ/];DgΜy¾ꫬ=xq;v2" k8oHw)ՕW|ͭ[ٳ'11JJJ(rww_3M>]۾}{llٳg(%@xHnԩF1p|M… .ڵsrr0eZǧ~:l0~g⶚5k&vȑXeIDl2hk֬:uoXYr7772aEscǎ;w#iu4d2(I閾@b1PNVT?;v@kƪW_hMt߂!CF5zhq%fmm-ְNs+K aν䲭[ L`ۍǗs℄L<|AȕyJΝ{Gj׮`ĭ@ɹsӴ!.2t֖X~8/ &o Ǹ'\/,7?8Ŀ;;;y&g1=8P"NF4*A{UUII$EdFww9s`p}ݩSrrr(]{hH >\ӱǏa㚎QFG"n ^|W^rN4'l\3f͚.ΗZ-uEn<,0`D(eW^gAz]vնmh_}%%%% xNpeggKEL6 wÏ۷oǚ֝۷oL =L`"@^;DPrG A-ok׮pI@\f &lm'OD !={$cƌ!O4#Ν;M6$O> ҥKbb"N8 e/UTRR2C>֭֗[:tHO7nt?>??NqqEO?TnnݺDt2qD&*3^ƢE fjTx'D"#<"jٳg %YKHSrʕD(-)!af7oHر# a74h G+x:,$OWK*))--[Hnݺj޽SLYlɢB#***^'uss6mHlҤ n^Λ7oŊqrL k]vtX <d=˨Z{&FڀTѺCBrbaz뭷rssuɓ'Z˗/kҥ脉׳f yR}T|pvvvK,ٰag,AMvݻw{yyA;wH3wРAByyySv & KK%%%AIC=aSTTDm5k+1 0T:Ÿq@۷.] 䫯˿O>0 HV`;v sRrwH---I,,Xa$"??_Ӎz7*++IVTM7*0lmmݩXȝ7lؐ`y^u@_61cΝ;;~̅I?TڷR8::BdpC@*3ctOOO[z5ݳg9s挜ESHnSLaZ֭[ ڸqcI 6g.(qfլY3E4by|q(++KݗTRR2GF2 c6mdoo{Ǐ_x*++ywNJ01##CPstp >sE.U+++0Ԅ ???sԩr\Mw%*s>>>hmۖDGG NMMWg%%%%AɵkJҥKIIɡHݽ+%E,//oZҷv… RAaM?똵&U"?/Zhƍ;vbf&N(jǎ\()6rSRRX$СC¶kN$8% $~U"""HeLnnuWTRR2/ׯZz>і-[&Zw !tJO.3LD+ . تU+}Dww(q;)}uLKpp0>LOOgd&ٴi:^z?g&ގӼyXw]g^rE0kR JJJf$$ {뭷#ZM;w5k0Ga"LnJ"̚XQӱ`81.[n"1̩͛)~cE+FP:֭[Şѣr0Ś)ż]"~#"''g...vJHH`I_\\\Q(dN2(yĉ~Z6ZXXg2+pذaa3fPq=6zJ",ĖW^;w.z{{c*Y'[\Ÿ|xw...LLP7}jBbٳӦMsss8GFF?~*`\Kơ 4i"W~hM?(܉K<ˆQ_ȍհa۷ܹs>gg礤$/KTo Dgk׮ŠaSӏkׯ/,RMOO 0QƥڵkMŠ+PZZ 322x|.[ީS'^5' >}:988x߾}'O|q6(dF2JVxxv/x ~(dɒ{/QGc5''_ [HX('e~dmJiu(}}}TMNNNҩ>}G>xɓ=<<6n_UUEd Y'9'7qkcc#[n@ƒ[~*++E4i([cbb3;;۸0))) J⡤)9p@1G3uTΖ-[84:m>}deeQEʕ+E'6MPG$?P.^zS5[xW н{wXT칦ٮ^$an߾}墍1|O;]>KP^X)mڴ)***..G˻uV)))(b o/Wfap}T̙31G4u^URP2,,LFƎK}6uqnj2dܸqf fACr˖- =6DС\65y {~~>:tcǎra~;wX;pƍ墱 4o JX6WA y^JI'\v7WEơdQQJ6hנ O>|___ѣG1W\ߺc2;*=;_7h<\'E@R5({=DȐYkz04;Wݸqܥdkk Dz~GUz@lަ <|lٲ寍S^=Kƞ>}:;;PJ*))ElѢ\/hz/ݻ.^uPCy怆D=4qUV---aw̛7QÇܟ4N8]FǏgZX<2Lr[.1,6%Cxyye[v6lwj*|֭[◁|lٲo߾DăCI%%%A5k<rcǎVM0aɒ%Zfff¯%Zw7%۷o/Tuݹsc'>yd=4C()RSRM.l 7/aD۰i>!)5 wuɵwwパ:u˼;w ݪdF2[666ҷ{="ZwBCC)))999;ʌ; n94h 7VϞ=M8qʕG$~7 p@+Fvb|r" R@߹sgݺu#7$+wȼ1ӦM#=ݼySP<8%1 iii,?2jUIIɌdPڵk W?յv۷tΜ9#ʫݔ#9+++" N2e#F|gDb[nR۷///O?E&=ŅiY8߸uJI X!`ֈv{L"ؼݣG&+J[XX,xb?~yݪ[N%O<m(AӁe ./&P1g5rɳf{{N. tt% v#sm>߽{C=$Bpqz.uEFFi|\={hѢE|Orgm۶;/R, x7ot,oRBo; JJJf'{n"Vc1z6m"`bb"%z%o޼9`pN"HJJ7|,NJJzGbzxxh:vς #""pU5>_zqmvbGmԨYYSqW+ݽ{wqy?mڴJJѣGVVOǯ+0P"ڷ0ru(d^U˖-зo߫W $8EGGS!/]TXP '~i &L4i"MKK/ްa/55߽{+733-;w:u* ^xAnlgΜ0d28K?ĆG3/Æ q*Ż >:%%%%3Vyyѣk OGmkΟ?MUzS#PG1 jӦX|~zw0)ğ9s1MKK#CM13k׮>}UXE0v]t}dԩü3f'۷tmE8\<1I, %yX~MI%%%-ӽ{w]~}JG,7ܜ9s@$U5{ll  Da'fpp0,[bhݡk=ǧzJ"#[XXpBaaaf;Lb{qmUUU?p@PM6%7ܲBkz#P۶mmN:ts /~(z*jQRR2+Jh֬…QO!wAm۶izFPy~ŤIf7n:e qa3p)gQP"dffN6LJhug-̀hCDv%$$hz-+0mܸ 5x`SvI̠ɓ'322%Q%qddeiii԰aCqQ0{-7֓O>Irƶ}\\\.^p5jf"H'''X;p|r a͎;fooG򕕕eeeAc;UU=&C_LV߼S+VCfγhNS**C u038ϊN#"21=y`zxk]٬"rte˖LmiqZ 6"vl9sf6t===NJ$H8<Aml10I"///KVzG(S}ԫW͊+O`x"W~o_Iۿ?!C#G޶jʾ о}{ܹsAۭ[p;c_+VTtX)Ǐ1 5cʔ)\k~[O"EXةS'2ˁѣG@m fÙL$v}yJɦM^zU5d_%֭[#v P(\;B,SS!!! %+ 5^{5jn޼^߻wÇ_d֭/}6l]6{}Lmun*U쨭e18vz͛g;z޽0 Csf>z`wn R23s[]\\|||2ÇoW^%?sEdvKJJ"ڵkŋf͚p?3UAb|}} ٷy;:ɓPvǭTRk׮~yzzN4k\~}d m'afNIM Ŋ;w>ME3g 9޸qֶNWWFYP!j~Ək.0Tu-wꄭ3f̠g+S sOV>>>s_hj fagٗ,Y2b)I[aȊO>ľzJ^zLv5fd NJ LmOb%/_^Mb;wxxLm BP(ѣG5C$L(޳gO6m<<<;t>}Z {@ 303%(< ] +djjժe_=k׎k֬۷߬Yo߮v#]jcZMOKjdeV ejt={?~<:00 )V@r^SN!۷oI2{իW#lsRRRnܸp60 sSQ_uFT7~eWO&Ma2BJUrWRvW_={,ܶmMɟ &=D[۶m_Nm>Yj˗#@PPЯ 2o6dK>|xbb"-^|{ѢE>}xyyۆ c0 s,SՇ}!ǎK.] """ 5r8tܨQ+W |V\s…MZ,uvv3fr85*UͣeI 3AM y… tT[իWsJ-[}_-\z5_BI2h0FϟߩSu>s.]! &"##aׄ 0Vyl޽ȥf͚+ ~O%v&J~w4~x5uV|rAwI5A_&'{|[7doEa͛7w/ҥˀFZ׭[=qDtt4KjJ!$ 30G4=pcM8MJII9r}L2ܸqCɓ'74 9pŋULP1ϟ?yh?m2%Fwر4:}tZhK?wmp D=fz4)"q㔎#1@өII{Ǐ;vL嫖f]~~BO>^@-Zdٙt- :ͭD??H'#0DDDDޭ[7%3Yf ˑ#GH3oI 3$W>@d!lDG $@DO/_OY"$ih]hlRmJOU $ 2\3(>!N(zNFl2>lذ^={P\5qF`ӡ< !#m׶mϞ=9DKॠm۶k;j,m50KbS릲XznLAyOH?(~~^ԃs8pڷAXXɓ'a@ψKك¢]]<Ќk׮E@嚴B=+VN1G3Eg:qDLL 0R|!p09sq='i װZJi7<!>͛7`U{qsB ĿK$dV-vڧO#|F{$ 305xH&_pԩS1, =,9}5ݻS?3@CD{xD~{פּ/zzEB Ȩ 6۷Dgx\nhb8r:ߟ|2`~K4ydC~j='L=Oo4fˑx{n:t1cƠR'M_u#F2dӽyRy@Uݙ6mڒ%KR<###/hnB+>>>B^ri|ph{!8M~٧-Zh߾=|Aݤ+[ni6eb0 3!LiIr~* o!MlѣG.]:u.ܹsn@ƏOh^3 }wHqm/xWƍC͛7O3Рqѝ;w0:k, 6 Nѓ={%je/a$Ats m۶JDj:\Bu5㮻՝@H<p' .@O<@.-&d^Xz `✎JB1OxҥXDQ (H 7j-Hpډ`۽{7Kdȣ<;֕S+8kqp=ɑNPg<#2!!J M6JƇ\R:Q`m۶E-_e2 987u ʔTL\sù taFKKK#`###UPE}^zɒ%*<^\@/^Ll'h# M@@x"%=?I!Tc(ũ1C4D]՞pV~tf̘ABS4SczWtrj !jm tVr  !>SS5e8 NYע.F J7*<)׳gJS@ @!;B'XJȃ]f94_4us }\,=(>8pr-Bmaa92%1׮]#EDDr&'A$.əQPڵk@m۶ dd!+ǬYS87$$ RLLLLьj.`D4! ?)Nʑt!#UP'UchZJ\آ{@Uw9Tz[¹\=wit $%%P:(јȑ#.}H uLp)y;}?$@P?Vs" 3̰|`2ZZZ*dJAM`YF86BV^EIV؊&`]h{=EZL(h 2ڵ 7o޼1 O {AҥKWb%ŹtJ6d30z: 'i8PWpAD.V(J|m?\8}0XW¢,[' X8Q? :@[8=][l ҰĜ[n S5S).X^mTg>C3QF|ޱc^zyzzvOt/R3qE%k@'pB:zU() 4f'4Sut'*0x:%&x;T R*11H:Bmb/99>ps.]hüZ0e؝r9A5r'H`yM7wnU.KBx+ :~|闯xA0~Pkw1QJj̞`뙹b*KW#:A3LW@6za)K~޺52C=Qհl1q׭[׽{իf6I-t0t԰4m-,dyM7|cǎs dҰ6ɓ'שSTR:yV"9,rqѧis{Tf\} 5̘C\r"J^}:zrM޳_7]2 6iySHɇ6J՞h@y2%## x/((iӦ+Vs1sN"˝xg9a3I3j;pYxqR_67ŋu/0СC,x}jamNsmEM6AóQ"ӵuD/k5:.7njժϫ5Qm$"1a(Iv/mC1cƠ(cccyRSRnf/7ߴ>eHJ.]v<{#(7IMo}}}]f֞u?-ӍOrveQiAAA֭۳goVTTիW{m22r7Sە+CZjVfK^pOg9TPxאlXwI>;íf ]i}رcpAޱEhy vq5jDKHHQ2DؔTt /y{{_ (J ,Y _=z􈈈J7bcc3Em>Hm2R?ZiSuo!NJv5 `?uŋVZZnQ2%9yȑlm+SlР?::ҥK$OPeYjj֭[6lXH8Id6a+srkrx rvY[$NIY7hmv̘1]QzʍCgϞ]X1X*2aZGvM2e޼yk׮ݻwoXXI3r8qڢE WW׬៚E${4jԨٳW;E&lP0,**je˖U9hm {KH'm#>F8sA[ %)>JmZc'"(&LPt?Tc ޏ[cfZz]111Buխ[7k|,' >Jfu᫼(}¾}?NHFi[ Fdy-5jdT4 D,P"*H eI{|MlCaKI(:˙`իWCJQԤI@d#;&"d˖-}||fΜjժ;v;v,::CJWZUi5hٺZ:^~Kl޼Y XdJrX7n8"oIT][HHm_~`aOJ.+J*P6-quuR(Cd9SH@kKumD䝔lѢ3rkedVxW@Is0:uT۾HGdSJV"M|9)9V9_ln|||}jF-pu.5UMMgJRDCeɒ%(̴iӊ/nCds-x" %yV*d Sn9I?Zj]v#F7mJl) ղeK5YTH/IW4ox`-57xgoIu{lQFvHwՠP``MJJ_ wuu-smޒ!2AK3Ԍdƍ۶m{LhѢ%$,JR"}Ҧ'"'ժהdIII¶CE況ּÇX"r0zA%?ܹsǎ[ϝ;Gg {5kAx$rH-MZرc~M3g\lٖ-[cjd -n򱓾r„ W^fQiۈdZ#)"sCV;$6_msغunݺ!y,ՈО={N<{@׬YS\9m Cڋ$AQY6msȐ!\ջw S/:߈DIʦEdRrÆ *TPj.IUQNȑ#Nt͛7{,o+]M/m֭+WViT^Yc$M4~6ɘmF2QKLmesgэkb,%J}fлAȾl娋ĸH \YX15:p@ٳg^F}1d~K.>fOD.Y9&R\P...?[jթS'1c/_ U{r$%|d*""],r`1(U&yu@8f,7Iw5+&y)[y$IZe"5h L[d6!+VlݺJw'Npuݻ7<<\w6Vc (Q,EPQyAKQ@ʕқh9<<̙sk?LJJ*zGݸ@k_k#W0Yf1xHCY*"-AE455Uiu֭S.[qoXC?)Ho2eʢE֮]k׮Ç_tݻlDnUՆPlcc Y(`zG6=\$}Ѧ K.`vZhh(d[=Kd=Mɔ~fRH1뱺-$ lscnjǷcǎ9|78y8֋k"jF VoQҁ]pVVVvvv/s[˅Vmp/13DyB;l0333ϒO䜜l@()PRaJJ< RTH貨r=6lثףGȷɓ'O:d4p3gB/ϙ3 ҩS'}}}DREZTmRVt6WDYA $t+FΝ;r_[_(z #zj"i0,zG9`Ю];x1[|ҥׯ88zyy;wڵk7vu???___…3g4p1!3!0!BAL3pJ7iU"O ^q_ӧOR7ڠAdis>i\_f͚4>BݻlE1%J*.L[n<%#e"lq&M>֭۹sC@gn݂ !!!&yysrr+n݊kvEJRizTHdFaȑ .Dҋ-ϬR=55sbaJ6 tF`4+`:GQKYikϞ="\r%H}_3?#PRbe{D]J BI)=Q?63d[[-[߿ƳC111O<7%&&/}1#g޹sNweK\B[Ju%ի'/C~ʕ{@ 1蜕m#HW +; CX={6V;;={CBHq>}U%J~*%_ 144)CJOJL?q%8z(T$ zg233~5;iiidDG!/.!?^z9OOO`Ä e˔ޖK-kvοˍ7pq(;;L5Selwuf8jj{633cp;vpqqy&| _.((Ȋq%dTTTVŞꔬ<`rm9s0$322y|QQQQ![rrrM3%%zÇʀ$Nv%PRR6(ٲeK^K*%y<#\N:=zȤtP p,---!,ۥ`&RtФ/^އKlJtKXXիUSSS\_Vc./&sB LX7n` d խ*ِeV 'w̗m :u*ҥKWFO()PRa-f\y-ld2UL뉚܋ &O H k/ >eIIaa! DKMM} d)D?DSLT&"jhk׮ݹs'N(FGGPݪ A Ct D==iaaBH>zy,T+%J*FIb;vȋd3RR#k|!?|ǏKNޅKt΄ԠF}6}E6;l0e#))VӢEٳg'''ڲOh)Kl޼Y]M|};Ŏ\"3٬P˖-g̘b*...---77W$J Tee ݻwd')=PZJ'`WֈH+A]\AAAL͡V/KKK58>s+quu|}F؍hiibŊ[:tJ6 @RXPBnU2eH$%W=|e+o!$ $׬Y!y9$p(&$"S@I( ~-H鶒SMI)BjTce۶mvxj[KYPʋʜgϞ! r劷}7o.0J$85޵kڵ … 2KnUkAFAov+E:t@(3g}c;DN:5qĺu~mv|I`4((H^mӭݻwCCηnƩBCvYOw H-\txD"?~z'@Homa =A ^UbDωC(!}$_TL>`=z1cƼy󬭭!$]]]O: 7^@IJI؟HniiYYJ㥄nrnm\kӦ rڐ~2WS\,u͛7ܹ###~K޽괌C&PRbḊ`*(C1q[$#:uZ|9/c=MLL < i':+++/ƫ_ o6od_h6DuyHEj">ii_oΗ"y8@t((GgU.]}9sUor̙7n@H>}T4:2%J*@l? ozR ŠBthiX,600Xp!"(YėsDx1Ȉ>ߤ$ OIqZ5Zh6o<ʌD;zWfҐ(֩S.ի׀ox|Puv&]BF@JTLA"ٸqccccIKKKI''cǎEGG?{ IEW$J T@l4i"oR5ZN!\1] QCjjݺu1V򚙙2—Bݎ663l0fwD׈ik PҾ}ݻͷ~;tP<ѣǍ7a9rÇ 2hР~ѣSNM ӷrSME+qRISS[[[ر7oބLLL^()PRJVTT Cᛛ@I+CPV&[nB*fsss!6ѫe"k9!=@eѣzyy߿ x_r5zDOsu-J__K.}O2e*SM6}tS͔5|3gܹsgNw0 XBΦsIqq\aݺu?O?tܹWlE&JJ T0D֭(#WBD4Fkkk#CCWt5Xv>Xݐ!CDZj0[|@>}4A y#?`wߠ=QxNhhhll,25")PRdu( aYYYO>wڕ/Q`) @|b444 K=VpI+W\51߾}!dGEEWzJj#m*1SҴk%a֤V"BDW5UmoҵgB ,ZDH) 4QNQ"{ /^q^]YZR&Jā .o #7 **X.--q'ɷ[XX 6ߪ@_/ZT_^MBHZ[[#svv>q =ŷfgg#2P֊dJcd~4'Q/XÓ)PVyyL|,{sE$Gv\Р217D/Pi-oeUd|W|ٳgLii'XąO. Hv0W8:j(CCCcǎ>>>H_S۷/j>//]! ! ŷAca^I)QktwwGиyÇZv򒵊 :tŋae(+QS5J6Wzp*.M:GI8a<###!!!<<֭[]eãF&P!Pݔm}=d%7uA vyժU&** ܱsG6m_,ŕ?/1@W+(`Ԕ,#UIaÆY䜜"Ĵf;޽{+Vm)dzL6o%C:usڈ柏/awԄb,쬕d󮬌'-- ׯ_%wڵ:A $ufOjj*[)yKYl۶-AOOjW]0CY{ݻ1UYXY(txr]Y۲eu{?էOBn߾_ׯ_JJ [䲬RRKKkliK%K67ٳrk+%ͻ"3g;v &|d SwF \C@UW!o ߂Gc3pkNNNK,ի2|DG$FSWBB%$ D:2֭Źs璒}}}H̝;wРASCZDӨ2}A*Fr{Ji?*%nj|Jk.^"ѣR+JJVYrY˃9!Njwӧ= PΟ?uָ;i4&(PE.uĈ?fܤֻ~Glܸ5k5j!!!۷GFn`?垞ׇ$WNJJDt ar"HKk:t'22 ޳'#==oać|D{+V;K.M6E@@((h7K4`499m9Kf%N߂=k.d.C D .@$FvĉHk9%e|!%d%P [l"NI)[^ d|'N‘]"NOOe%o cǎf͚[edd$߱(/_;0zjDz7j}>(Wi)Ɏ,F5E$JSK vعs޽z۷wFF۴i@N|i}A4=CYIDe\vssŋ 24iɴigFv;(kvKIڼyѣGO4Ĥ_~yƵ9!t[0WH2&&y&";By4VYhp1DZ#K1 ?ϣXfE J٨4h@.\iHi"6WpϾOLƍǏ|+/%1PLܘSJMIvm'NP&-hdWD/޸+m3)) !%f+TuE}T(n5vP-&b[ȑ#q9s@ eew((߿P?3"0@yf 6"?&[>V)7{… xYNNλvP"…  !/6XxJjhh0c%7 ˗nذV %Ñ7j %D%D#r&ZKdLԇK}m x݉Q?I-*l!:1H,/RΣ=UOڵ (kv+*QlVVV+WOP؂ MՀHCHuɒ%Fܲ])hSRR?~~m///777'''qڵCKlhוB:-1jժ`2!!!===//0au+,, I>3&M[W; "?*M.^lٲ͛666}Jڶm'g*D&g% # S^D|ﯳ @ ["##~QRR\QQcrRe( AZH{{{;;F+"UJ4Z\YdPcXױ@]v&&&HZzc,"*5ɖ~ +hkkkGadT{۷/?#7.**J)YRٵkWncU񈨫,&o۶ &IֲUp d7nDػgMsk5JU5[,l-|wltڹsib@*+@z䤥{]~… p6`eϯ{"ᩲVSOþZ;G@N"@e0TXa' kb0 klrvv.,,]YYʕ+[544{J$? &GxW=9ɇ]ۭ֭[߿PU\\\QCAI]]],d...ƿB+gP|]zIԡZ,ak0={2eʴSu/]wq/DxU[HH ٳgl%{Ǐ#:88oڴ :hРƍWLЈVG_ոΡ\91JMMe#zƌLQ2KƠwc. \ǿ9QMnddf{,3[RidY q$R2,%KedJ2=LҴq=>^Q#MB%W$ ʍ9rdnD^(hgh1eӧOdd˗!9~d$ruցY@dPPP7 xΜ98$|IXAOOo)j3o}N?\__i-3 ڵkt-[/m2LΞ=>Wu`<抠X?UtNfeeq dFo' %]\\-cǎ`A!&}(02phG?&T_XNLtuuMMLH+++ w ׏uw_SR-sml+99U`@am`*ݻw'9+1{+PKvyѣ?.m%d>G֭111999O>2%OZn]:0=zbWʬLԨo1o߾H!Dسcǎt_zKׯ7EEEHxG5zvW!#*aW'iy5HVNN6J㏞8P133|Auϟ?PB"ogy|Jo} I\: 9}t[3@ ņ͉"Aa})Ƙ1cdAw5*7:::pxYxO>PA {JL)&A믿İڞcǎaqm۶+KX%K {A&xF'VBFw4g͚lI: p*`l .]bZ`^,C@w=r޽Bn1aٹ:R#łXNWrRVaۗ Tc@Hz§cKb7 Vⳳz .}.ke2h 4_ص.ef:}45rl$"Pԁ˖-+o",U)_vMQe}؉"Mfkk D\'N덑B <%1`aPm/>>~ 5̕BGu(lo)** +* ]”)S:vBq׮]OGzQOo`b ܾ} Y9tu~R&;_~=r;Yn)%$d_cP-{ٳg).BŤ%`[FB{ 'EN} ylyDvB6b(dc&1u2=`e1J=e8x?IIIٳ~J~ ˬ]߾}uU|#bLMLR~~~ ..H0eV5ov}ɘagp ʵ`}7|y:u jSK PD/y)&r~rf'YT#?( A)ʬ,$qqqرcOt ܄kG"sΓ'O&X[[c߹mذ읽8D(|*-)!fUJ+8` Զm[.tu~}.ܴi PvS8I/ 27Lccc !_}Uy6rۭcG} "!Axٍ70/gΜA`p v^"@L pl-u^D4`1X#9(faHٕ%fۻz*"::Xر p ߦM&\ѳDɉ&xyy!1ttt\ aÆ! U JPRPM4ܾ}M3ڈjHwjj*bkg1Wǧh2dH||<ȴY+l\ ynfJ@bV4vŋCCCH>w&aڴipH]]]=<62O?uxpF?+R{exṼHGx(LR8k VJf䕓XΝ;7oLNN++`Cٳu~q PI%)łqFѩS*A7Kq [Dڀp|Q\T'N`-D9<+;X066>˗GlĔdLuJ$X+@(7m_dttttqqYl뽼 pb Js mĔW+$79===PT̝`#&+rkYV*|;GX%a200ʊ*ЏVlȓQQQ%WKK ۢ=񝻲! NFFFR#:3>8\ hkk{zz^tƍwRxh^R^@YPPw@zC8}v`bիVZfƍȓ'Ob{ˁgVO—/^%BH,͘1cÆ Wp$G!TZi׮݀Yf-X`׮] _|EFdӦM 6oތBYADIF- ޽;ޭѿxՓ)"\vC ĖA 9ER :>|>>}ŋ@$kd灰0xJb$''C {5*>6L@x%$'mu J+Jeqyj &":))2 ֯_/$b8'')ޅ ,4~m۶ݺu۷o׮]j<p2$vyxBE*|0P"n233mmmYFg3>RO}Ȝ! %EJE,+ye!L kW ϟ?X`+TE}U,s0w޼yXv+my릲B Jf, s @Di tM@qZnn:+$ .Ν;NբE CCACWWw„ `ӧO}}}/^ܯ_N:!a`Wܡ+:^Cn9s:Xb ;vFIR^.] .RDd3uT.5T*[|򅴒#kx»jٲ=|%tuݻ7 PZS)&춾+(# y<(ީY);e˖ӧ߫ R&j{7h0:?/e9Ҹq㐇d~~~ii R0CPrł% EEKJH8 #;vl /bVޮw.~CW쯼#!GΣFzьȏ"GGG[^*'%}"kW߁ ?~ M.(((Hu5SϏ  ytF@ӉԤ'PWW1b޽{ϝ;:RdPE@V-eBkm?G5`TP߰aO:*m .-e11۷oZ!|ή9ݻ˷iӦvp :(/n򘫏by!6qpC@ʒjI@ګV'1o@LK-BK»M&Bg}\RUhd,\N*ar X3J 3UWi&y|+vNz5lذC%K;b>+2O]_|Q\\Arlٳ9{'<㉀rFbW6kXfRFuT,b+u<%'|v2*e"A@F6ŏ ]D2JX೵hbƌ˖-Cc#Աa=z$ @n>QTЕGD5sclӧOI BB?]aa'U;0]Hd;i$d ATfJI FlH)Ƒ#Gd18^L)"/_AL!L@Cd=} ESiA$GpRM:w˗o۶ʕ+܂PR.X>KK6m(ҥŋ]񈈈:(+Hdhhhcc=0d%HwѣQ <\b7\gآjN򔔇~+3%[XX]8UxY:::\rǎO"##ܹÊ_^ZĪtYfv,1HcJ[qo߾cƎ]fMtt|&?ȡٳg<{>z>q yväEGGܒWwdSAe$R25J_FyAԍqSSSgggo׮]ׯ_Ά)EGCCC9)7226l2 .\ӧO"=i~)L k IIIILL aW<&:MԖ h)SvY Y('<ώ[f>888...-- +/)-;:0~x-֭[5: RIVܜ}ψxz'Y $,--N)Y;JZ[] !yHTh6kEEnܸ(>>^233;ʳ17mԲeK%#gGHC>f>E2UXPEɁ́a'v҅KAi,Q=By--ǏðUb$OQ2##k׮RQn$Wݪolٲm۶=z444vo>@ȑ#'Nם;wN4Iid֭з<ͅv]v vQWWW\vux^ǔ)S0,dvv<%kG]ayx#)$w"i +Jmݺ466 dAnݺo߾iӦ:g=wRV욗wK.EEE/Bw~l׮+!!B;ɮ()Sv455e[B:<dРASN.-,,UGGŋ  vv2;;1113gd(eQϻ>OdP`3^Wԫs5Va5 Jo'o+OI5$vn޽@S+|8 {ڴifUT]ʊ>|x-vAw#FPW'7~~~ iiiw)SFD_Å\NJ5S5kk/_|ON:bh8p _S5%H4i;97B_ ]%RezzzbbsX,% (G%W)w;HeŮﲓ<%yJֈ;vJuVBˮMD"&(00wy )5o޼d-49}4&࣭׻")8`K^t̙3Ǐ߿ aQjcǎvV)SF (Oi$<)U!GQ޽{O>+VxzzHyﹹ/_޲ea/CĵR B>ZX@J JݻwSRR7A̙3չH:DKxPְKYJ,,-6OI$d\|$B;-rtlO]t֭[aFEE]v ֭+"%`! ""@32++ƍG=x𠛛$ADg&j?b))WFj@ʋ]xJ>%۷gGYbӭ*D֢cǎ0g϶ =<<XAa!BPEalڴ `2@ 2(%EEE%>e\\@yȑ[ ϔ9݈SBԍ46ZLL RPf' JKK D<%yJVV*b*WS!͆64iҴSg̘8fPMM ܌~:] \:uj˖-0NNN.8`Djkk/ mЎR"a@ Go>OOOGي :ATȣW"k" Y 6 mCN2<%kDI|wùU[M@2 &L`aaamm=wܥKXbΜ9V KLLuփ$<63/QX5ɓ' R__ӂЭ]KIl@Eq+ ܿ]*yGEǢB,4e=ҡCl .  0)SzO>\duUDsuyD\̧K.fff@?dݻw?~<""v'O`ɪ cR H .C^TM6`>5GCs炂dw"Ҫh_r-ZBxJ>%hQUBO6EBfHk[*L&MbǶ]f͎;ϧNMII0>~! RXG={*#6 ,rss, Ӏk(%0Qfgg:$Q(7oތ,>{\v-666<<رcGiӦ+Wb_( 5#NcFǧDLjb)F&M:u4|pSSS8vnٳ/_|"~0<%yJVcNvϲ!,ֲDΪHKZO>1228q"\$h"]]]׮] žY`בwV:2!Je'~,Yы}eۿ}n %7jff&版 9tLXիDR/5,gE=z"zYN1ѿj%\qBԬY={5j)vԩS8# y}~dѣGj$OjSXʤ 6|ڐ#Y$pUd""JC`*34KE@"bS޽{1c` .\twZa7o,`{r \%j3~ Rlk)\޽!Ǐ/X޼R+)(KJ uضH.^Sy;vlܸf6m(ë !ZNtlp(epKcѾ}~FFƍ3,$v ~''UVt޽ȑ#p␾ԻwJw_SH Թ5w܉ݾ} 1n4L\Jbzdm#QX!HD8MMN:(Mh#n]brV???Vcd;XG2~ +u>}(d2y g۷/ocootҙ6W&ݥEϞ=Êddd$''ŝ;wpllٲeݺu?,6m^PݏDg5T"oTpLК7o\tȑ'N;>Ça*Ү\T̙3[n+W\8p uuuy:ӈ6] M/=" !u;v߄ؤI-ZteĈ&&&rw3gΜ3g2R||kȝo`` \dLL 6 6݋es z OG"*jW LIId;v쐧֣GѣbUCCE#*5Z*4>KD"Jo.P:kƼCPdD6ac!mQϩeZi"buEER4X6Pߒ<ﰿ{_=;e_5˪p?}\ɽ8fQ_œaǡicCXFh D:bBVƛoIM ػw}i P"9?<)8Kc1&&f偻K *MeFF-=@NdÆ Em|W|'JRniӦu-@Ek8}͒B,oI%9 ǙtEH@|ƷyݻwPy5jvtҤIq0^ÔR>* NrD?$qT8~#5 *I 6]ԙq8_9y5qd%~lj)>a"!###۴iݭ[+YRZo;^PD"1H׵MΪ$rH~6 ^ /CϏJB xjPI<ƫZWH ={i'?C<*} }qk4dѣaÆaP֭[<_Eh !NgYq> sR*;Gt昮k7OW173w*;<|O{81qtGP{eկ_?66汗oqgk/"$*zpFys}Q߈|N-DUYRƏuV%@% \pe]6u)**0.^5`-[҆ǘoFɓh]vx>d5X=Hc[#d,k.]5kV^=/=-ׯ{;v0cm09ef!6Ѓ@:q'CBs~y<_v-ZI[[CjE..)S< OBBAH^zhr-^{%(˫p ǩco1Q8C6gi8f1)ܬ]G  %.]ᄒ}-bh-A<-TPHKܬHl$ _|O eM7TR¨\aŊ^GUFm+?mRIE9QWY,^+MSCD1Z)}%%-mimplgNFgil-[4n뮃W\q VJf)r W1t.R~}*Cshb?aV|\􌲠* )/;bJDe^b|<5>v? dc_~>,JCmyHHbEeC dxAC C"8Hŧe |*I*aѳŋfL߈# L =@ JTEl-/I` t:H$5R jc9I$b?ej8ϛ"ROCĉ"}yժU8U.+0G/*+<&i&޽{éN:2ڢf͚5nܸaÆtuEԩsAZj 5k 7UNdd$֭-`:9A3̍3Y"LAކ*xZ8E@0!#/DRH ,LH~yWYP SϛGHNNFىS;ܴ^zE׺1C"W^uRIj2ayLL`Z)@9Lai͛7c>S-Z$rI_F)ź\MKX 0(`1``0,N"*r}BDǏe_ 2`L[o%(+[l(Qe!t#mS8L?Gkch@S$8p\0rDĘ;*$c˗$FE,Y_z+悎 d8̜9 `A=fbfI69ڸzj|IE&-|rrH3K:O"r ah0 'kbr_!d" fv1ի đY+_W[Z&EEݶ P^DN0@ >Bآ-"%2wl9SWS(PRDnw*HZxr(s %*(SyF,}:rD$$iIS`d(&bDACt%" HEe +EE`a h+ B( 5{l }ń be1>@bGjyQ6)AY@E AZD#b#"P۷K+$cW捉|K(6LЗ1Ϸrl'b)X#IBq&h rXgUB ryq ?鬡c^D1׬YÍǤfM@4C]QKCpPχ  1nb!#NJE eZ Eš -cfyYs`G}D?f@$:vϚK9 3Yx JݵkWxD` u)-[$ŎČrnÃeLKC$' Jw)BHud.rAYD, C:q0bʔ)OL2x_|I.ju &坚]̢PP.(ꊈ/Gb ڵm6XF+I59fsN~8+ʐQ`ْ!y=@o@e- A0^08. s!?)DE@Mq2` s*)! 4!P|*'Da{KH%rILr s$a}UY%ǘ;0pA+Iאd b,!(%EPRqh?F1K{,q܂q;v[ 30/e)<^1NOhK@ܞ%NJ^!!P SsBZ @TF⹐H#i >q`4i҄&>^1^t'T~\V_Yp~p%5L+ aR{ gV^ytJtVnL"Wh".+VYUVQp(#A1`GDbDsZ}/)p@Agj,0իW3•Ô$RD"!{ |dgǼ"4R ǜ29 `6  HVTneAw):6n$Dd;9$($=.X p~A4 Fqk=8DP -.Yee j2flD[K*B$x"p)nG$⢢p87iIH뮻PxCFh tD kժEc5jdo]jx@.æn׮]PZ+m͗#;riKz 8KrTd o@K_fB2D 5 R`ַ~,B.y(YT,-출#pI;@r4龩Fp`HP3ײ_J J"ScA=ԦNLlL.M>v=$0S% 0AR  th,!hr [1ŋeҹs frA~##9sᲸYn!tܝR) 0e*5m0N\`p2%k5tU D7ݺuY[իO1sd`Ə8g 24 P;ru/ Y aE1ۇ0ɛ+ T "`]'9B>6X[=pcŹ\p5j(b\TWQ%3 Gt>@L=R y+Bەj)eDj;s'ACeRg祑./u]06F80z)ce GNUq/`IVB@AIJ(2_Dv&_"J h(+-  99s\J -j-\RYʫ(#˪C0ӳ s]\%IIIƍCFjӇ q2d}7*f͚։u҅(DPo^:XsȰ 8ϒKn!($;PO,.7)"7YE=1HWMAK1, \qM,"zMQYSH,hET~E"#uQw0ÓWֱ.|/J=c JIe)WA `%Y+3#ZVA$ dX4T^E21`R!Lj\u6"M jUF!/*`H&PiL*hk9wtSpH'֘*M\؀&M .:u:'*yWUɢ`B'- 2UEj&Ȣ\Fإ!oP"߻E \GVPSpGYJe >ree6B.qS)cQHX ,D1' DLV4n.)0̔ d]P+ML! 8hȚ MXYdT,a jZp 'feB,,fx)GŰ-'t;v42ӦMRʴ_,z0Jz7WC`Z-[6{lU|i3csL) Cُi.#gzTx9 ǾjZYQ  uq Ť _5'o `ovtJ̙SZY3g= ,WmڴYdI~s~&L˪A(BXY}fgSV,)S`ݐL#gJS!M Zf+# uyV< ROT oOċ?9/{Gd_i6fY,DȑIIIͰyu=~ժUuA!!!!-Zx}DiؙRFe8edp6"?ނX~Qv"i`~`:B>( >RN2v)q7xZFEGG"ںurHdJhBQFnJ1A27/"y)nKRWM-'ߺYݺu1cݿLIIi۶m*U^. ūzUWU%Ge}h5 Bq~p!d_/?.5kl߾9{xX{\=ϸqN8Q9i׮ BP($/KӦMyB{OܹsK@Ξ3gNhhh*ٸqM6I?^֡fffN4iڵ B8@wZnM6yʔBM%m(׽'N LLL,G &4'''? BPǏ߸q#Zqԩ_K鋢YV= V֭[/M BP-ȑ#gϞ]1^7%%eРAh_*Y~}h駴4BP\@dggO:nݺk׮ VTյk׈r=zIt BqA#٧Oz\إuii&};jof͞5˽?^:P( l~aFFFyl2 1b}箾rÇ.Zx BPThǴroIII[e]Ȼ5jٓS~ለr$'KBP(ӧ:,]܊sɸ~xsϤIQɼ<BP'RSS;w`m޼IOO0aBÆ J0B^waaaݺu+BP(*ׯ6lرc.\XnݠA4011qϞ=Ç\.I&?eĉ>N:7nYP( %ԩSFEG3vرcvSMFFơC?^tYuӦM׭;uPP(*3ft뮐jժ% BqI";;={^~͚5{衇rrr4 BĀD3/(Pڵm۶Hi-[h/P(K ;vܹsgD[7l؀w BP\bسg-[+J* D^^ /СCGj4 Bpkժ՚5kT( c BPX߿С7pCll BP^3xॗ^Zl~P( `ǎɇ=q BP{ٳc&NHOO׀( B!8s̆ FtRIBP(T2##ĉYYYBP( BP( BP( BP( BP( BP( BP( BP( BP(ؽ{m4 BPBzzȑ#z) BP(n9sfʕ^{ƍ5 BPC :y$Q( "##cᩩ* BPK7wiUIBP( BP( BP( BZJ endstream endobj 1 0 obj <> endobj 2 0 obj <>stream h[mo_s@)N?(Ja!S:];˥^KV#lٙgfY]jlr5ńDXA?U,p ,dDRQ=y=6!Aߕ$4e6OAa#x꺒AZEpC,"ÓAADqck~1{+?_0 :Pb`DC.#}uhߑ \$Ȫ %kĠmԂEuw8R f7V{i_jce`J1#RFanp S}f^*T:rxz$Oe|BnG̽ivQ6#XS&h#c%>_E$^6ou\8eӈwqmbBS: EaGJp,#͛*upUOߔ苁}H&ώ}j6/\mMѨG<{ q޸z o!5MKj/$ X6NT9M޻*i2V)߯cϼ&KQHҡK5-,ߛC6DdHkc;-ճ"ш„+1p>pRc"GN-EJtЏrs7 v=v*\ &ĘTؠMy!L}C5~˚lVYÁ1VE""ܷ]FwI8N B˧顴?f"hr9>p~"_n X<*0XUVԴw{t5(,`!›߼}z)}󛷯 !hoAg'{,n;>g仭2o{4G';| Yb0P  ?f,B%CB8kA(*)<>H2KG4>G)"lڮbR2"xę:?JbM. G;;`Gs&Ep2\^QgrncM[cVb;l1=vDY*7g_ծ?t2QygCobL|ݛ]5tH$roa^߻ '8X TS NňfZ^Tpv H]O{m/vR'LƷׄ1uR(hbBeUV4k@c0ѹGؕqh˵\]FmI4ZhRfZl _^ifCN{Ԗ<[E6w;8>e1CB|F&/O|A'0MrG91AC|ƨm8NBڜfhW1Hl3.?74?t kEȁHyAK-}߂X,~y@"Kmi0 e!ݤC!Au6;S"E.Zٻp3%W (5|3Uz;{!̏Y2}_z!'M=(;Fy`UM)O80-{(._PXΟhTXH q\hp7CF/ψGOPC41i=MxkGdĶ|io('։ܩ9ÜQZ;Zrk>~hxsZ3IH d8S+u:`q4$>900 swN_&`Ю endstream endobj 3 0 obj <>stream h,; 7@5Bg, 3bp ͼS\At3"oZK*1l:<8U˒n{B׷e-"H*t*Kb]kNE:-c~#Z$ endstream endobj 4 0 obj <> endobj 5 0 obj <>stream h[[o~ׯ㪀{ATq@Z 8y`$J9iKR]Z$U:&HXxv73U>~6hr*@w@2@ Vln}!D;~ &$/h6D4< EB2H y2DXM$P@1E)OYNX@r50:6:ۣLQBd0{?LžLӤ$r-1H懘wwq&Vǡ k?h"uq:C!FTAm'Ź,1둬(RifГ-F N4\JQX\,CRMN%as. @#ae{i4˷OLl1F'A)!T&p&ᕆ 7 >:aȱƭʋ_'[4w*D5\D_e5_n<B%d*dݙ:-"Kx c/ \'. t#7T KkE,tLxk.-Ɩ<2&Gi~Э⛼gMBps(!WcGq0#W*Oc]UJC+6>p?%U  OAl0χQ5re|".uz:N"7L4]Pb5AuԜ0fPݺ=L!'J6K-R&,RټB#zl6QR俌=ȔgDq8lV^'9Pv<fw*D ]!T57׾έP=D YWKp:.^/`n$dф6*[-q޿=؜s49SU"EQ C=B~=!?vD @ar qxA_1kV|8Z>}TwVG 6/F#H*nO9Wzr$F쯌*+.CkC'yэmL:H԰>Rx5xÃ0aPJqE7 ԧYf kׄuH3M= o#K5al'nvB{͹A m T==S}J v5\no'-a o{l/ao}C*~֢!}"* 7~g`oP1& tL5Qƞk'`ڭ~X{S׋\+ %j2B tAak ^܆c.c$t?L que'=-k[eXh.6p3xحmb&aSz|UtZPPKJ jOKq˟^ln1IES1_N7Ă^SX> _0_ޞ"!#!RGB֑!o"Arx'q"55&0rmu]Y)Ӳ7(D%q>xXo/|mۡ_Զmm`_s)S:g%[,z#PbnuY8R!ᯚyZ+һqUECo5Ib!'*%)Q;ؘAұ dQ'̾z u: -/O[x ^+4j5>6jl .q_9SChEjgZyx-U} 1m[5,Fsi"^/Ad8)v򈅾x_c"GdL?=-%sq7/T?fJieЯaX7>stream hj`0| endstream endobj 7 0 obj <>stream h{ xU &” !Ad܌ @BQ$@ *Z YLu@zڂZEPZ:TqSU ksBh{\k!ADM49GzLey(z\Ƥ?'IDf9WzD9_uŕ7Ls2uѨNɪ(\Յ_-W wDQGP1kI}N#j)rl W_1k9ۣɳ?^fůis)rdn TOimdXkF mX!Qby5‘~ :i~,j$,"Stҍ]$SJqD'L[p-^,j~{D!Fq-iא%¯ wD!C mQF$E8">rWݥ?ꙌV_NhmE'ƈ_ qX*n̔r DZ-n ==A?[tcll55M=哿?;T~u}mv=j1L@/hj?Ր鯢).At$1C\-'okŃO^P(]Yr~ryM!#Gͣ5ѢVZmvVnVk!ewI,=RT=MOүHsĬ3\sg5o)9zFQm=Az<(B'Q6RBRfLFly@9P\JT rNF|Q@3d/;7d}?D̦b:NQ/[Ӡ=vTmnhluo G [F4[8a֛@gyf#H1>"%~zD/KgֲPi 7q7ю27cnf -| :2*DA{)ZDY~⾁!u,:eBKp%>qCLd 2i8=JqpiJ zTZq\(9sO<`mG&`&0:lBW ˦Ȇ})۰N=g6:yq94A2euq92R%3dj{4 d˥C2:sqزО;xNx>=K^ T]ibwQI 0[#H}=V /2ޣ*ZUT%O+=V4%":!sRW^)|G|&A:r絁Z%Z?6>zt+ar:3L>e8Uk ;OQnY?czN[ Ǭg^w0u|ߙeYۭZLoa=vkXSzg=쮥v85qQ7rJ|Mwut_8-0N`ܡU}78szKki%-|D80DQ &jwy-ZE`/p\4uߧ°20c*kOX#q |h6sk ?X2*c5n*]#GcLQ_vQ_ԵnQ?NGRlZ?F&ek#څ~ ~ 'pwև#g@!b[^r9Wxc֮3O`7.F8?bw~Y0PKuRvH71Y_N?٨h럁Q?Sgm~ 0 T~Ilf68qbk!o;NSdz!FÕy3 ~>0Gg/ E[u v>_P?H@SAwi9>o\]r.|y̝^e 16 ؑa.9xzua DaWOt[AaicW#lW`?"яOlfA]ϐfgSx(6V]@,үf=r>NϽ6Tg^7!~6u4|h30jL 5ǥЋS)Ͷ,~tڿ);t)l+Fuf`>_Y7V bDu'-F0oan7o ,{5k;`#|-Y]]D t'hbۥg_peϵg(ama9~Qnc@trM(tc/@8tX) ~@;(<->D)=xןzX5!Q.s ַA  CW 4tqK9vxHH1S捊g:[KCٗguWOўeP{N+>ĪsJͯzkf|5ݥ5 {S^)Fc4>Gz)pEH,swRzڹ Enu{i }j>Z<}f_)rU^qg gNmU4ca-ZCmWe}ݹ;s ga?Hcg%uqB:-&pWg}}AhtS5^x̌(hks?x`=.u  s2ߩnv^!J,2PiH\Ӱ>ԋZAYdKk'5%u+Pi;sNz!njCU_.:n#u'BW蜑:')6S=: N=ȒczvpM3P1҂ SkMt;1;w ;8]jol:oEOݳ]34wN ;];N){}СgYc[/_9{cy3߽r6˹mN4,9gn .=L45?5jLHsX߇{~~hx[炉L8vyaފt_ y ^;Ҁ~{8)}]y?lxPO}@`o&? X 1+\Xw~AvW4-v\W7Fϥv lLSV`;+ VI+< iΒU؛24ayyolPɹSn˟Oݎm{}vD9ol9Ch輓n M; \ʓ/Y7nN8nh,-sǝwzi m1U:6۱ب?]/WjF;NPz_TtS9a/}62y.mon9ePQF@qzkһN|i&[So ~v1 r1chk@:7p;˛6 W`Bl@>:O@N~? j`oo +mpo2e;0L<*Ӳ$vJ, 6vw>W`~D1ig[Lk94 胱>؎:u?]{OP1n\B݌SކAwtAX%{bu=vaSiƐKV>޶z?m5ezrhq0y=; T;R[ێ=T=zPpʔߴl9 ZWy_k 9kW}V3_oCBo3.V,/S qݹ\ 6r֕0OC>ɲm-ך`ntupDW;}:_bG-yw<.A$8M4^DEkY5vc}SƺE򤭃ab]%P,E[vqtJEh˝6hkIlc}Wm[l$ojO!QkӏT!Vby\^rl˭a)^.tluҜ`-iԙ6컈zPg䴝qw"|_9<>7dC܏.ĺ;B{*oz$raܽ@}=]['IRӍ0}z jj yx %p>:K~h=iz"#(e+Z] )[0XWTuږ{i3ֹ6oQk[;b[Ggv:* <thvwP<^L̚v*G9Fk%}1xRchaڠ64  L!nช jmj荺]ȶW+d;26Ħ#4g6fu=˦46%idTZk45*>_!LB6 j: "4[=j)-yba})cۚ5O_9\OM{=Z rvc).~@D˿S v;1m~$|Mޔoj?}rp&qĶND=[k_Wl6d *hpU)7 рWRb,_fkyP6EE_/(|^}@j( ib@c@{ ސl2b0F[Sk|)'kSEM^ S!~.|ק`{O-wşԛWşş+?e3OIp'uT!\uOv;jgFKףG/]OuK`Z.]iQ5VTmUjZ(EUJUDUPT=%+Dp8Q_T=&*EUJUD_ aUd[&O:KCDdh2d>:a7K`򷷙1mK> }vP>axt ss  `8X o ,1@lp*=}9,mcbbj&vbT;K[mm^'v|("3B"o퓷9Ěԧ|`ADJ)RPEO&CԮ]!CߧIuOE0B𽖴ܷG!O ]~ź3u!"3M$QnG\^ _076uo(I V"}l>f'f;Tv*âu"ճSؓI/f#ͷKAzu`JQ|)OWS!7CO1(U_o]<%) ,H$Œ$˸,= ,UI8͓dDuy'+JKL[- Uą5SK8RKL`:hΣd\`R endstream endobj 8 0 obj <>stream hTP=o0 +<:!ׅ*{H8  Wu-}{'oL '˸ ˆ'Xo:~[M#{.7P݃|eiE}|f_c)Am g_ E,.QdMBSnlςdO̗fqn+U="oxᕫnFʜ=FOxN ? l endstream endobj 9 0 obj <>stream h\R]o0+ب"UЩRԒȸRomҏ'vgg$d@ƌ̲ p6ekᚁA|Z,psr&2Irlug 0y_uLuz3Hht] {|8bAˡyȉ/yKBbM0ĭ7ZaXY@Dd~T\MFD*h7W/~mZ<d\z5J@3dV^xkdo1|V2Tѽi1'ad'J.eO5_ˏWu!mP]?0ߏז9 ʏW\Ӯcw =0s`* endstream endobj 10 0 obj <> endobj 11 0 obj <>stream hZMF+8B$吙(JD2QQ"go馱==aQ3^3z]^}:6 (L@?dPPmÍd?BMw]|PP8 o_ 9|pw_0C@B AaܮDP$%fO/ R* E YueAY͒TCO蝮nti{)Lp88Q1Pk|ٗu 0aniQw! m=CBa_dÏ!6G@rBтfQ*0eZ )vߣl2^ Qx;d79Σ@LIτ uH?g]{U뺟}Gߡ#f\N@Γ'&u ^I^I$A5'@@e dmYu aMms_ˈ-pTBQ+]`GCᙱ*!tnQ]!s]O+v`>*nFԞ{V[1 I$<xH[y]rt^`٨x Urk²hvxN.? mJ5.Kz773 ׎J{9&lrgsZ~VQn][0p,]A!#XC5LO}]yZka)+ef(ٕEns"JYVE٘koG\-tY/3)b Qi{7!)_i*rAi0-`Hk6oFz!j$bJzWmS+(DEko(ƓZ5rcTݴH{l#&pq/[M7F.47MDS8,]^8/(פ}/v/Oz4AgSݣecrpL"prkeY,}$t;$CBQCTK 4 nIؒӹ%lh~0B&')#tbuɹ2i endstream endobj 12 0 obj <>stream h, E?0- \*]%ݢ!-2 ~~Op`i8)]q$JuXVz8QI7 b p"{^ pzuo:}3Z %2$ endstream endobj 13 0 obj <> endobj 14 0 obj <>stream h[?O_Ԭ9 fAۢǣѮvd9}HDLb Kg,2; gX;;3sqjOSWx-|}&=|J$g-{ iYǤ8Kc1kWf|6PD\JDHDIԔ;O4AF׷_WCbI*eTM =PK"*=}4!_Q7QW"8=MiClyƒ4n ɂsWE;Y:]Y] ډ0q3|Uuy\ ̗sٙ$Arcewwyﶯ\Mi6(6C0NkFĥq_}uo 2z%1/*egu5_9 RɋÉ]B[9FyF%(3H(真Y5ڠTg!b=68d4;XYQ /)k(Pwj ?YK| @wS]bE7>eM.'0w26v޻Ж˳ذuF>^iAlX♇"էD|3v5WXbM\s& ﲃ7,/aʝ_Vb< .X]`!=A -r]~<#Lo^E29"[2WK2JT.nīoL͖ŀE:^JĢ*?;~&f9MPvnSg96dk8d6_S-\uTшD['/^ D]:ݜBOz2%ojJnЬI N7$E)в$&m}DLEwٹ2J^7o=B |qUT"cU~~~FeC=@D>Da`QU]lNDֹEiGk2E ]!x?uGr8aUa%pMգ gGp0w. +~RIŕSALTc}<_Ruj63qa댖@֕Nu9.$]^fham](} TNbi}M'`IJhzEtmcRM#BM#Y"tde()@c5"vIK(xLy6G0L a/BS,ըȱXXLakju[ cZЇc?`gĉ[2:frs#qj^9sTd?_v)VpMi0W^o֥AױyGyQxL=QynV껾/ ^l;FFwݗrm]O0ʌphwy*OScb*S~ȼso:_׈жGhrV6fXCX3!+C pdے[Ny,iѫyt!&sY Tdd&cpd/ MfBDO'SГ&9G@O@/ϧlgu)s=dP^ͺηB < ,gM؍le`t i3m͍Q3e 7h?#` SY3屩b<HEJ(suY`ɽ wVqdE^4]E'ϭ/a&oev_;4~o bcӻ?QAz5¤YfxVYY5al̶cHr5Y}&fBȋ2!dŶ~FLwxXbf}Hןbu9ui%#~:w\u:P#Yy;a9J&3hȓӶ#7 l5f9os6vl؛Qjf2lS$`/DX|Wϗ(-IB ƩO fv!6J]0L``E@V3{A7S3^P]QHSZ Q淦eq  F9oa}ӨnL_0Ѥu?q;=gĨv_?H >stream h<10 EHB٪QG2ONWG-Y@l,ޫ)JLbKUL'-/I endstream endobj 16 0 obj <> endobj 17 0 obj <>stream h޴[۶_OB5L|ȴq45M'CK;$R)_̓ @$й~ow_j Hy oX1c;uߞfW7gx"s|g2/̟QL /^Ubp 1#ay*fId.Rb)?-42REbaRU#.ayi}x>!g ڞC9'ADkvj ԥj%Li~LlUW^-U8?wW]2 mYծbD)}rwؤcaAU5cάxbIAVƪy1$DMq*QGh(w/R䇽O\&+ rWnR1j[÷Œ! #P&;lUZ{ArX5ĞՃGaaѐ* 7^|SZ\`Ӟ#K'"l27C!W:^{R@l쌅o8UMNl|$>v[A͔zh~kq,hBHD̂h-$w?845*rjxx0P)]tHTB.T$pCܥ:M4!|Wvr_gk'҉&;ԁdI[FEDT.F[-;M RF>, P~MƲw[$8@~lJM:L%6,QՕC( G!EB(.`pYmf޹F>Q0#?m>y#aX:ז\$*+am\lwfDÕ2$Ax"7{}9p6Dt^۽7ʃ5)Gx$W1A%Nb[Q{mr)!<6P) ƋIo@FfOb(mC?m7IB^֠3#X< 5.Ӟ L%tuS4Bs2su /d1|aN1Ccԝ]װNCIW 2Zy ByHm3yY3 `e,Z{vW"< Á[8񢙤9LA$1 ـ 7?\yHL-k ƊҙG#?hcFܤ{)^v8;f2:e`Y׈wu}ZKU\y*w8/ۣ`UxR:f"SKM6[$\ciE8& m{#pKh.Q$z2FCB{sv0 $ۚSE CTxq6hϵ'-پ:Q1g]\ M b%Cz&FoJoQ~pCDS^թ&@. "9aj2׳]pv FΩnN>Ώv\S2B^Df F!F:7bIO~ZhP7P1,1GbѦɅ, u⭗WܠKFm]z, ¢|Ʒʪ:d=`lzq]CVx0[DM}޺:`]gSoG: 4 A|N(;w} @;MnF ۗlZAZ+[K=OEx 7sPe| )ǯ[tXa>Lvss&\՗{XLx6+xCn?prp΃ dCUm=:C>+-} L]]ޛj_'`s)ޞPi=]?`/)C*Sa뫛.Kr J74d3' 9IAAVwB S$˪^8 Ïp& |%J3/27xS b7kĥfgҋZ  xNV}C`}:;~` GU~VgU{gʋ$2jKP cX_)+M"z 6N!WD5T"Cst} Pv)o?z#sǣN!i@ f6~`( 0;a endstream endobj 18 0 obj <>stream h<1 EHDX&kTتQV*H{aaI]ʫDڨ%j.V\cJWյM_ (cȌz=fz:Oz`1 endstream endobj 19 0 obj <> endobj 20 0 obj <>stream h[mo6_ȗU5")Rpzwn !vtK^Iÿc_QH[ll{V/UOU=U|4//.df |g>q|ԧ,o΂=\Og],qf=x-<9?f P٪$4~E!B|V3I }fT>>8<JB!!fž`g^49˥,)̇062-xMʯPEzEIoQKzDo9%t罷`擐25jLa)JloH|p4&:~Ƒx{Ի].R QNG^6S+ަ?3L;Xew]_ CY,")bbʃh5/'/7"TɢMJVI SqJc8#۬^D~~Rw`=sb`_-B|CL &T>!1 rm57e[kw%s%H%$*6{“dkBڂu[8n[GwR|ѬybG4t>-a7 NΊ{;)"j3rE5?gO/IƜ@|4WCft1eI0M`a-*ۧdt>?-D^&(K!Qz?ύCIQ잃wia>u WvƓ$^$wgJ@C}M b^|]㭩+G&!^%+S7wɿ|ScP@dy 8{|:L1JfRmW(V;}h ۝a5f)ĺW ŽM+ړrNznaL@y 3j##kQG@ *I"'VkB?OXa 7qmX + h 3S<xJi2ns#oS`x:>K@H$*3R%fȬJhz| Ƨ" aH/7/ǗR.>_SbR{p>Hщx~N$K]0٦yVHz\~G}`#`9yiSma+ (]lYlHk `wLn-GKw85w*D!rN}O-1{:~])5 GnYő1i˵75ue(2@ sJ ̜P@Sp HkBh, }Yax`gcS,쀟-siY9OKPԶ_>>4DtU#TTՀۗKW@2}vBHSji<ӝ^rߴtDݲ:UXsqm9m6\;[4p^o,?JG’a-NP=-5b\tӅxZYdEHPEM#?henP=kpBoq"!uFJ̘Dtδ.qapӷ3ZZ?+l~~l3\=k/;6<ɆT8v ⻒5g]?1o}Qͷ']]}6~ԬG\qߡ/v>P5]Y(uoD lcN6Rj$E'je.'É()^z[7ث6˔7avJާJԷ-RB2NfIkR=͢Hf]Fڴ$h 5niAֲ֔vW 7RT&ȘE 3NqV2*sQWJ D6G-uo~\,yIw[{_C=dYr3>%Oqxa8%o/?^ܼ_o|f;߇zU߃kvz?vPk` L y;iWV4)I5B6ɏ##fVmjwm>a﮽lt?J[,3NdŲ }>($x$db7wd^lJJw&w$$yhB7]ȎWsaZQ& 4q/8ee~(5vK[UW/4Pl:nyǰ)d} 8IEfJ[YuJY`ڻI16;| OfQ&yҜ?5$wgNRJoP2, ̥GQd*T4<qd?'Mzo@[+7"0VzW$ԍPa+^{$.h@/Au.O\}Qɠj~8 Qtqj툌mxJcGԶ6'BȽwŜVt ]+GYXZE,RSi~+t<kX7loL; sN=FC`.FinR. ьW4Cg\hyC#ඎݗ76/ H?~Ñw9,y^ňBaB9sa \֘a%"/bYĭvȱi _Ztp&STyܨbIFq[??T827\'BY,SA IR2z#NGO\⍛&7]t#]3d. Wp1ǃA ~-iQR#_V{/Z]V-6B<ܗ.ԑt_~{?,cH8 dž'8U|{4˛߽[~'.{Oa(ʦC=VP6sG<n̑q* 5tZ{!=zΪr]x-؍vnv7eMN !5FmeUExy:R1*>*@1lâiT*x^!1%o씔Rxs4f /tuz]漷xُ+tϿ9|ޏsY⽚}?sZԿ$9ukMvOtcc0T|@r',͞RYnơ<&E9XKfs߯l|dhBO)WU{3'L! D~WNO (].P/f@W `bWcUݎؔ:3秫| njx~#}2e>)_gnze'vGoc'J] V^V拡[Q[x?!';te4:@V/X޹<'\CUwqS¸٠Y=}Y@-x+γe:w}0|A|܍uHR+sI xt;^*;䫱N^5]EwP~ƘIR>Oay أw(Tכ,*Q(oˢsy[Ʒv#!0$ă!$/Pv_ߕBTz '9I_ endstream endobj 21 0 obj <>stream h<10 E ei +"٪eD=p:mAʻq_\k粄'MVe-#e,1VuRci.A_':#3QGbJW?/W endstream endobj 22 0 obj <> endobj 23 0 obj <>stream hެZnSFy&( dE»I7jdT3< GH~yO8y&?'osd~?*MqD2I<|i:Se?&?'H{I"0If]>URگQFW›J$*A4"qajYN84R$Q i`y~7G?;N? au"9AI@aeƑ[z]Vf o(ʈ}EQT?GؙKp77 4qHeR˸oL=5wx "d(e@*PRIςa!z`;Tyò=(WۯT[ԿPмd)NS#}%my}0{V渵Ն3$9j-M0;BԶ|leXg(b Bgn~ӠFRq^'LLİ/ͼ!%nO̘> EhG#LDrb5T!ȜQ[_R8h 2&-ēuә@4ͧu 5*2e}ǻƧO S~:S7RN _iu^dv5|,_MQ> ($\e-ۛcER,N ǬABM'\p. X,NiJGBa\'3xkX#]EUlU)v 4eچg+Iwdy$AV""D`7A c7v:ӈ{[#'Vo|fQ,#I*͙a8 u*]._BҔcxB)ACPr@1v9 2d,U,cm ;S~ϗD$S~|{$fr0:&!X=7fF%DdFڜx,6鵟 $>6_ZNݚ'P~Pe{ u?Pz+Z)Qg^Etԕ_vaHJ9te)c쪅y:C0Q\NkF)~ 6ڋ@ta$("S0[#殜 ܘGiuvy߯oEy,ΰ\fAƊ~{3"#n;GQ@gBWeU}{H1X-P/Y.0G8 [E)"#Z>%^w/n_gPJ\C`[#f~hyUmw"G"QD]cN9{#V>n=,,B`#K4|=؅:9Ҧ6„-<Go[LFoa$<9[HS ݡج BSC\uۈl'yC. Hr-N)eYaG57Vzn{[d ChI7|hgE\viO/q0Yj2!~4+2,^pTPmuwbt^ ae(al֓t5H)l SШs8) 54N {spM1Em7A|bjfI\f0?HZ( z@ד-t^эAznwJ20:Y^uR ;rz GQU-d]ݍtWqDӶf#e4NMX b ZGjd(/ԤT|#m5o_5%] mѾW :>}Arv@:fTpi(mkWyۄV@c;p,eOahD33̹r#]v~?*`|< znrdί)e!68E8)*lab˘bGztcşg]ٯb6YNIXS-kh: .F/]la|\d]_##&I?)Ə~-XHBt#gUNv&C3i,ýNdTŬ=Dx{K..`T3k/O|+tO҄qaF+ss=+wn& d̍nGT0(&MM;#&5讆\gs뜚fdnw׵0c@rne yRkni~OHvS\D5|D5lˎr+"Q_< C Ύ$ w?8uG@jr,IX{Cg+74<u}˭)D BSNRuf&c-sX"y,갉U8TЧfPJ@b)xv(G߾Tm'~WUTN;*b-}A˯~ B/.mUҼZ?J&R;2y˶_ 9#N3aQ|[! 㚺=??a> endstream endobj 24 0 obj <>stream hzEg}`{4 endstream endobj 25 0 obj <> endobj 26 0 obj <>stream hWn@}W)ӽ_\ˆP8nZ VdΜ9sf=>yMȒ,lp8s#ViІۄ YN?SƘ<˾&[II."LvE9e`rzol CL;ܑ&-L@b'S tXNTj^01PdhLMe[^Q$0]t"`x$'tWIԀs%/L3u|,uE.8x |"F ġ^uyY41p h'>&k`2iQi!8Kn @C. hZhe(}PFGB)Zq_PȍTp55&2Ge šX!AtnY.EI>+QA}u(b1HHl#!N;w hiW5\*Jcm63Ӗb&P0Gb=¡*1PnW/7MYaxTjk«kRcm VL]Wr /z 3ܵ!ofpCAo<] NzY>stream h<10 EABYŠlUUME=p|lɰ,;B`nS[,Q3i)\|eJ5[_y{Bp>q[ިy>L/3GNY/Q endstream endobj 28 0 obj <> endobj 29 0 obj <>stream h[Yo~G20w7@A !Kr)1pI ꪞ9zwfBlrkby}sQW/j>yS~ᴩኻz~/'u]@,n ra\oYU fmEjx`ejBH8*/^W. } 7JWBpFVA AUB>Qc[`%zB^ݯoM/uL_F-Q)>Z*)V5OZх")_5̫L@#y))0'YoUT%ezL+e]S`W`B5+0+6 piwV;Uzd]`-XJGBR,$Ajp<:v9|\"!13eѯVO˧UiUY,I՗ިZXH?]od%WGWC8Ԅo]gʖG#BwkY}Mof y?>sONPz|}ZL?V7WXΧ/]OP9_uM꼘NC!@qJE*T&E}^ͧ8~={㧷g?{ m%!d;zrJ#X[z@QzϟܬuV.04Hѧsb =ip5ᬿz5嗾YF$FY`;Y9'\]?3qN( U҇䝗W雡ڠsQ'|AC4e*MXhZ,=&xo;h9s#a}"@u%3p+4X~!p]gA*uGf(*p"n@ 4X AEx58b)L HXJTRCDn"I ց2(Z%ycG>~ RqˈEbb1 {S zDKL#mG5["otcǜ7pa9Iq۵Gc2Vy`%`L7i/5竍χ=}zlSXkh4%a?[b0DH6 lۡʌ ە݄C7B~Ec3Yle[wAzh#n{jg|LfL,:3w_ eּ/ۀ%,Q u%2u:SEŤNhWʧǺҸ;Aϊ$^)2urdlDNM5ȿBN2=9L2+0Id}$qP ar~{x%9%Ȩ5!#9sLNޑS0g<†7;G@ɬ['FNf`+gd33kیb d1Pv h O$JAӃ`#H4(Qy)DA;<bd$M}x6Dj Kv9ضBݣs*IQ T0mL۔ESMcP9GRec5d˧?Psx35:ٹ$6/DzS0#n=ͳxnRfgv.nZRncix0|rgSϏ,'',xF-tQvqR9> 7 ~J*Q'F摄Q=*RHD%vx' ńH%ئ{JΨl׾el3ul{/k X;/Љe% +lQm^qη+8;&7{#@ t9U/#)4=_os/۲1Z+1oz.QN/1IQGGxiYC˜m,^)F'o V3tǸrPbFVL,g!BbJ' D}ۣd[t@'?]}#V#^WXL5$ V:H驦 6m/v8$e(d1]K=tfS@agsR(1+Ҙ7o+z ݹjQX ֤uӍ+ol Py+]3i~V"b[md'mx{ o1vRВ,%gԂaFgFwGGв\KO6,Oe숀٦SPq26J\SS26 _D4Y;gp- :@P4RWYD%'qgggŃq;Cz^]%f`z/ w_cUu%"VLJ0;AbؖSopOWbߪF[N0\i3-&$ERUjcK/~lUTJB,qw5D4 /wIB˩yN:|yNƂkQFC=CȘ(4kiS)nGx9IP1Ya'y60_nۤI2j$θI:$PI ?DDs|-(gh&Ne;lqo)1C=$eUu^RL4%v1g$/$A9ZHӼ95V4I7EG{JRi,SG!'xVS\0Ȏ;"L۳W@uf +U<˼W E~s,0ur?:,'6#˜e"$]ύHbb8I9O>TMqѓMCQpY DdR%wA[k)QowA@Ǔ8n)bR0F2)jX{:Å󥓊#)=ŏid3j!ג^ǝ˸[/Y]{[0{g .է0yyQiOҔQ+c\e͉ PZFǚ5D51 wjT~sX<="|jn`۽1)F*' cU9X 3N endstream endobj 30 0 obj <>stream h<; D pIM]²`9[$6ݼy Z8ky#+|vy '͑VfT>2ZZ p)7`?PDaul[z8d~m;u93=rd'B 0P< endstream endobj 31 0 obj <> endobj 32 0 obj <>stream hYo7)-K>@M=,"Pd’]&߾C.=OMK֐$7g]⶙};缠fF }g$&BbXHq Kׄ->זroٯ_cLF˦bI-(5E$S.-,60[UP39/\`J-d X B[ݢ*n@auYXSiۑ>) ]$1юa\U5eŰBfהͿwh,OK!/T+HfRBޔQ',}0vH/0YgA@TAMأ\vnMһZlG(LNx z%@ O/ zˀAo> }7 (Gꑊ`ʚa/ w{a([mT`rKniwmS?lζeAAW hœOU3zTbC$󋫏\ 폗s˻$/aj%vE MO/>BJR T%׿}P430K0kktлޅ{g@z= \͝g3"0^Tn2N],>ЁOez}qJw@6ܴ7OO:[1 ʱMXla𪴱[pQh)?cLH͓#phw7Z[dcX[=G#PeJ\=T_B?ࣹf/LӁ[%6" 5j5R7Od淪C%):tki>84MfqfOfh>8C a̝S5O]P(/+q;=?S c*8=suu=8C]o^^^j~h;ƨc1]0{<{8!E0N=~'A'B8 ,Ni ͧDhrNT}Dn&|#,bk!?ÈmØ#B6.Gp{``˾9X1r'>[whWmP{*-jI:>x,=ےzyBQns,_Z%_Ll8f{ BhY"暴 pF:@;Fe">oNɓ+JrP+X1 B`b endstream endobj 33 0 obj <>stream h<10 E5٪ezu$dY Wgr^=s;xr-sl8-SyȔZT['{B'/$@ 8ݽlM٨ϖl1,ɤ|3/S endstream endobj 34 0 obj <> endobj 35 0 obj <>stream h[s8BC`*U$٭܌>mkגT J$$'[S'n4鯿cyۛno nnPK1K?'D8e1K&=R?$!oox{4[߹ijBo?f;qB'e:[$˜%L/Nra8Up*cg2!31a1BR8ñJ&NDs^ ~YJ*Vs"ho"=M%<5X!t3"%\ t XJf5*TXid}ʋܼȁc>sb>4jZK sD הuu̪~W^I:`-'RA"yL&a"e5/=4ZޕU["!$5M(͡ uUm2 .awV壔D6Z,vQt>e_=,%A1(Z=*q5O}m]Vх.5ʻ?G2B\bt;W_SŌVpHʽMbL-P1mFvuKb(DABYS}9JG" %l{o\q9J% 5 u޼zyJZȻh}/9Q/M1iGkK>ΕH2_yH*mˍJME2UY>|슢C$-z . fѠaZ--X]{l&|ď6oB@1Cbm}&ԕATv<.{ ΄3H -as|4O.H\ZIꄝ;@s iBiQjn,vDlj:-{4!NNGWEB[0mZCQ:X-"Z 9jԅfd`4|{8UyUse,$'eF,e(fT9C_\YSU4lie$ Ll&A$ԃAfYzLDS8IAD.E\ CpB&`@[aJ9d ?m I<"T#mF{ ??FWfm6eV $Gj-RєAzXv|O âGB&NRV6vpĢ) Rs9Lh@֞P{R>J*[urJxc8=Yc] "\RRVMtMtMAhviD4$_ry&Tk{ M'EO5pnQu e7B)rX70K{ٿ)>(Q ƾ<)1Bi8S{|w\Љ hYLz_ J_W&%+ꄱB8 lrpfARUձNN8bЬbǣњL|C5 4E"p,_ܝ[`s?^S|ӦM#b]T*͔ uDa%i`>g)fW^Acy M_uJjWx,8ݿf4{mqxFyj'e4S_9l`Ӧmr:\uys2]Ӕ:Ks8]wCJoo9;Ǜ2se#+x>ݶǍ=LXͦ pY׍q§K[NFooF.۠٪BJM Egl<ųeЕk::K@IَQ99aR_ѭti"hp\ t4d|;Bh[y{ Ȁ2Xw̓j(_Ȍxx1$~y|͸{ 1 -)|~d[~8zIai/: UF;2mgi# O^ci]Wg_ ΘϬ&L;R]xT HB7זnիkpW#_j <(&UBnN(r*>k,G+RIW?dEq9P^hN-$=H1HtGsjS)0Hx곿UEOhBq0VE9r.dtIY[;T JׂΈוزM*DRfx`;9>'1sMvfU5&DwV+_˝fd\3Fj7y>?ꔞVPuwwlM_[~2mY&52:Hےݪ2b.ㄻenQlJC"hF˶-]Thn1ž"/b4>=b; e2l>WܫNfݵ> Mi)e^xn`"FK-JZUd/r=qd$Oȹ+8ڶȻʪO$/}KL/4y8׫ j]iUe:׀jshS%NiNSwh&d8ìYDU2 &Ѡ(A?xbȮ=^6D{bE?$js Uꃢdf(XUr(Bq~}ln`ѐnX4Fb82\%LSUoG&')~ϝ[}،ډ=6΂Y.Շ\rQoXi߶}QuXiDU'Q,W]>!]Ϯog0WUKX2j{d= 1 ǩWgH0-WZyL-Dx|ХC% ꗺp̯s sG{b<|< =50ѺV@B$Х z~#Qy>Yp?5a.#F5A:_侾"ng[ B_Gv;E Z qDVR-<}KT=oqV]T0|¾ƦA46DcR1qϢ(ib4) !nw G@՗ =KI6SY?v@'hƍzWkh;MMn mK%}_\f%w3E&ـivy ګ B)XTݝ ݔDjztA U9lt&qK5ɸfO,`Ol0g0k~md7buoDixFQr^7z]F廥)0=`|:?cFnpQeǙajJ16ĸHT vE,d3!GqH]㪄Cr~{WCT>қ5c$DeW Feg"NZ $ R<"V I̼KQM'4P t rHp3e1ZbĆL\ :':lL,Zbt-76tì4zh0I@@:G1{^4N|7r m1zU`ܓoMSG[!QJƍh `.%gQ;[݃vv'!,<;dRmr9>"BNc{ AjxsSf&>ݩ۽"=߳׋+8 "1+]2{!$OǼV;SDACA5ZΑA;| )ހ,!BT8!Qy3C'}R& rjsr 4ڋ>E}\8 >v%5uv;v;i{1RtEp| op8j84(Yd@R*%sHĐ5۴Z'63]rfL}I#K|YM3Y\qa^%CU `^{Qa>-0֣M=7iۗFS6a7ɏĆ<]xm(˻B8u#>-JHyCLaYa 9 pHj.JG3b(lAUok@W/w +zPBm6Oۼq{>N7BRdMN[S3.Wt)^E.֨.%b7m"q1 E;df;q{VD$ zݜP Av{M*̓lPkшyF/Upoo_ endstream endobj 36 0 obj <>stream h<10  ei +jUV5zu$v%[0[=n˚ v\!ASjbJ˗xRy]U Ks xp1"[Nόż5fz>z`4 endstream endobj 37 0 obj <> endobj 38 0 obj <>stream h޼[[o~ׯ#m~ \mr"s"Ӷ rE$KQ"K|ۿFjz2#3 '-֙ .0z$e{eh& VñXMV_#+}%m!H`MqBtVm˅jAf##3- !dJPd5^ F-A{kԊ#m[+d sW?۩ЊIDlŐ8!Vq̹]1hH4#Lxg56HL*TFR4#a6`3$ZbEzs֞OZewgKo}QZk`F HTE"#J>neX. eh :CRXJ]OJEhx7e "Qu.R.E# tLFb3 άy7zM|=2^wa ^o됹lWfdo/:&SťFBtfZ(:(=v@ 2Gܴ"Id^`"Q.)MC7̯9Wޡ]8n QXdZ9@㤆Z'QzZށU&^5F- cA'H~{jmލEƯ[yʹ_EI^U|u>z٣i-M;`QwOvs*2!X?sc:\o[ ot$ݳ+6%2ii ))&K׏ Y1GK|Gf9Ы8AUu﷉5ϟkٓeaٸ++ bFϲ߅c_Ey.7$'z*^D#MZ9ji'tM0b"| ;HJ2K;"k =3}6>WN(im8-veK l )q%o7MR/ Eu; __OS, ;2Ur%wPy:Ep_u T!è/w"AoKK8Z/\[EئvR"WI8ʠئb "^:y~X(}qDP0kG{ gxGKEaEoJM. ƘVP@)M&\ yq V^"H̐_PUMUUDΑFjnj*|!x\]C7KnMENn\)Hyi4T6B4R=0tSIݧ;LL7[ ]ېJ0;8rAPux>n\) Eg$aEһ<;f8vT>2[gN]F@'!g''Cͳ<4U*fpjwD&,q@n%$FBģג`ͦ{#cVH]Rk𽧡N!-a!,7IBI4‰S ‰hLx֝6Ҧr9AU3=)\N 8o.XjTH j$yz C՟EL6A8ƴSwxP7TP;@ɏJmKZ%\OOМ0,+Rߋ2`i(obOI4cEyXIi YSĴ4D8c0,BLNJs?p~$C#B0h~o%=p^u,E)?IVö~em&"rFv;Ʀ*>vizzc@ endstream endobj 39 0 obj <>stream h410 E$ e5٪eHE=p|lgA[[\bz4GZ96\cJ Nוh}+r3 #7Ž(l1[-I|'K,e endstream endobj 40 0 obj <> endobj 41 0 obj <>stream h[KWq~?e؁a(6YD&$>U2`aCz_Xvl++F'(Mፏ+Z?=Tl߯]{ŊC xj?5-]/$* #e\)Q#8]0A_-/WBƜ+I4^JD#J&נ=:j`jC0Z}^ʬRX}^_|A@QE /$T}&j˃I-29Ш *ol3fgJ*W~"+)|fh%%wD[\i'GvC6(K`FfaEp Ai-:HB,@(0>+!Ҡ#O:X |>g0/ԒK%-^ҟ h'Ӕ mj_ג+z0G :NpuM93=NS!pAoma4<>HTjFӛ #EWv3aN0xZۛn:>PVHF+Z`Ek<nK͋It p!P]avJqUet5L-8:1nir!.iUF$r4:ȃ` 1|6|VXYcj EA!#-Fe]osκ+Y~TTF:mrw;e,F.t.O ԙr]$NE2wj+ /lXoUG3|{Oulk Ch.lu~x]{BIcjɄ Oߌφ~ D ǁpQI M֛u.]Ք|YWHu>YRM~LtoFR芕+@ѪIo=zm{e 36L8dÚ݉ac^kiIhaaE;9S:W|;>V|yq0MK7 AG` TZ=?fX}h-J.^B鼮˨>O قX ?+@]/slIʧhQ#..5)mxI$n;!Cj,2̧ X -8:ڇQԨ(,B]:[Rb{w鸿NGn;Ķy̶1L mi u DԸAj{DG"wd'ae,{ ftyz;2Jo'-98n7b3;BoEp&$U@Ӕ7Ddz1H'2y,:i5S7DӰ*.rg_MՄS!34&v;ng;a3FhoMث#P]/dڻ_H_BРZkH( [@7bW͎#ؗ'hgu7kcT41R*Dvϔ؀Ue,^t gLcx2Gi3RLP{"I1d^=闾*OjLd_M͡eб,BhKzj[r$4Yː6,e_ mm 1nhND#4*04W K6 6WEA<^?Z1'4 gC CH{mc56}{4!mxL>stream h<1 E@H E,m5*lU(bJzk$eHGq˟|}Rā{8iR1sj%.c층h0 e, J+|LNz{`"7q endstream endobj 43 0 obj <> endobj 44 0 obj <>stream hYoݿta ǶMiVE}ef+S.I3"iV+"[MKj֐0| D1|98Rd[jwZG,L=2g C9a} k&V5GhNX*c Z(<䘖d@.$q4py޷@S^],/ ie7$S+c=$KRˌZ?& wڴt ]4W02D9 ܹf("` o"YEm#s Д)/9><"xbbT.v{j nz΄)}igEy8BSW|).rnYWpz.=| UATg]YgSK5̋kiK%녛SR2iW ]@U 8=?dH4+0 Te(m 19aA32` ٪Ȳ'ݟ{N6t;[necE+mnwy}B%?‡$v1hSy5] ݦ>AZAqEqc,s\H+A1iYJUXN:kp"YeǬ׹."U `¹D$+ V&$d@"ʟޑ*) 5v_ sw氺SzڣAd3M!b\h3d)QA`K[#*Dwn.֠DPCI9D<`vh]ε0ѨuޢH5CPUٰa(?{ [x>Ep ,_0-og3[ cu696ripOHw!]`IRzS 5U6w9m8L!r [S} +ͼ$i25h&3L0 pi0Ei1רsBx ʲ n]XT,N!-uM1hK{DU)wHǻO/"”!","_G53]\ F,:L1E_m}LHg³oLeyl RK >c.q 5ԴqCcʬs!V^4_PmáߑR{f}?vIizI9_ 5%s'ʳ3y%U=ZqEz ,L/v)+O]ݦLpdmBf~ǰR =15ɟIx>mM*cg[pQ2"2Uk<#ϟ*|$S'Y"D!6T=lx FqbOA("~]~T4Od5T6?]_IhDـ.љ-֌/[GH5@FCe6Yv̢>Rk;a !⼸ƐfFX hAzNO#w9& 6;'::e辦@5M0 ZoQ"4ʏVnXsvW{[vIQ{4jMO{U]BA;N&w̵DŽmu[S1 !.5Wu|E9 dåQ=jDK tte/%ٞ}}j9؃;a ajtp+B͝x#1Afn6B5zW3ʠ\┥d]K"$nt8_ NH |ui^ƼukXraRfC t{r3e~{:)bR79KL{+_&Ra>"m(3a]'{Ši+dCˉCzNٕ|=uu%pW5~l*l/ƴѴX<!JjK]QCqcrDtyJ!:xD{>mT."I`_ g˗h&K~&Wonk4ڮyHRdpEk=Jgk&nVޞެ$ &S uHPZi[;3}YeAqyveyT`y%_7V` V"_jD,RtYU[]Iٺ(O/FZhFF8 QO1ڋg22S[Tdz_p%2'R#µk#^3]"LF`xcYOI٫N>>|mO⤐rvdf7omn'mv endstream endobj 45 0 obj <>stream h41 @ `"CUJ=5lw> aĭ, \%N,qbZˇxSWڪ(Nu,( &WL#ێg9bXHWK1 endstream endobj 46 0 obj <> endobj 47 0 obj <>stream hZY~篘ǡ >@b; pdy@qgW CCZֿOUsA`37eOٛJd,[=%f wVj3#Q3=o}ꟳVXq<ӌg 9P]7T:T>HU.F2fjSȉXYIΘ ?+! ceFq$ BL9sZHl\}˔w'|!`M;* _w" o,~(yPT-RX^d< "gL*A`AZM Epl ħp_jQwI5IJeϳ(~I5sD"B,YdD"WDڋ"pQC6P+ w`ZTwo0~*!hvUDC^p1v֥κ2$َhu[-ɍ uk4.8$ ~oR9~Xƨ)(/m^BBxhaoDSQCnn dj O#lCܬeq9zYr2eխu4Wal!Ia؂ƥuϒ!.qYri=믣a=,n:kb;鬵nB J  HAh&rS= L5NO-J0J1ʗ=Cg!N/@J_8k!sFsa 1uq 0itէmoZwp [%ͷ)~*\l0_Wevq \%ioF[I7lR˧i4Xh{|\[h}Tt{vrЕ5@_-L騹8Aix_)P.F{PFwHC,LIvm0k[fb88^!G=P<\BRȷ,ePBaUdϞPhĭA"hĂ> bJ յRYȔ "#4bLp?j[>frr9zyoS%Mf vE~p ??{  3qH虰;-M _>3Oɔaǯ .RWؖ%/y^ʚd}|]L)m-L|s]tLew[,0.}y=p[dD~<)^⟡%a-?ᷛvb1ji䡮pgl_E?m7&L;ncҎ R8Jd>stream h4; 0D7J`$[ )Q"lgrf,k (nS[iq`Q> endobj 50 0 obj <>stream hZYo#~篘ǡ}<΁`a`##.)ёHwU_s8vł;:w+nϋo֋w(X-%;(MaÂYoOR߭^b_sx/Vxs.Uq xYsAE9,רX^XI. a1 8q R&ш%hF8%Z`w8nqw? ־M C/juNm[+81]mAMzP+ELyx|;>-W``yY2"?jKO5gIu'裆$ t*11+V `ڢF~UM `j]P@l@:!Kθyi/kuKGgJĂ-+^bbܓl@(Vda4cIk83Bt vEG:kG[q¹Y8|ܬ=Tk~f^nzyrIp;`7Ppn^Q,xme*Ew|m{OE(%(vM ҂1st<sN$jRDzRr&#z2Om0T@pV.ۏ= 0Ĵԕ=cEVõPd?/w]ZjgؐN!I>0K^NH9Gس`vvf9ҍu$[rgߑā$`HW@XգQEj$PA]& t]'uZ C T>I MN¯RPI47$Sa$e[TYir w͂~W[\`j! +0׶zKW|OJfDhd`v(a pD6^_^i{ω0X#<議wc_JJ8x٨9c3Cu>7 α[98Z6˪>]ص?C=$H !Ҟp'9/3v6%Βg646aŶp\e{:֘KBƎ.$Ύ\ڍn"j8k:0)dF>8^:|nڕN 1q"|Եb2b2w >Eq ԁ|Pl<\H'|;%CZja1prif#_!LOKt8/5a#|T$$K'%x<1˭s}W`}pD(kJ9pJ,̄%KHڪ BUU Hƈ3Uԉ6YwPǹkd}^ [Uύvwꥥm/i7-ezli:B/ȹ>b摕X(q+rR\ *(^f,J"߂eɂf,ԵG7&VE' r-#i%˰04(,)gs-Ηuq-AQkY@\K`(ג'a<}t " G5?/B;>stream h<1 E@ `GX&kTتQ*QʐHחV a-~u3, lΉǕf֔;6)~CJ2_3(*hf + Cרlt (g2%)\;g,.g^bO"Wz;`< endstream endobj 52 0 obj <> endobj 53 0 obj <>stream hZY~У"r: n[ݭnc3".,jˢX*~Uwej%2k2 (BMVJEpfp6mqC)߭ZziyϖxrM xMMADQeࣔkԤIΘ /+! cfJ4^JD#rf ZrJo8;[?כghŒ9Eܪ^ w7C{KpU^';iL9ij,Ղ^X*R滗kc_o\q,Ec*~x^#5RD pPp: J2MR.[PQJ* u𡼅[j<  2K4ZFC rE9;ۏ#ٱvD nd^,ԃ6$! *aI?HYG@Tzƥ4q%8nd* 00$oǭ8|Q b{_ZWLPj1ƅ"(8)IB?-DDI׳Ĭ<Ŭ LϹ--|1&pneh"ݚ CSNSH9 xbhZ"9f RZ9wf$a0Ϫ[E7g-x: h1PRAj@HsX3dt3ȯXOŁ]!"he Jp}`!\w3Djǥ$ z@A@b؎^i.Sji0QB5ׄbnNbVGd@\pVσDj`c\E=IPa A tOi[$%yIWvܕA`Fgn3?2SFt*2W h=8_댁/gP_}װzmB؄#*=v *m~5HjMTtmD?+L$n+je͖R<V~;'㾟ߏA Y^C3c ] `zOZ*ĉc<ȱ?E#AN p uySpjb•] ԁyϵak&`ڦ`AxAa?䬟&1DZDa&r$R Ka;3JKg^z,NY na"*~ă&* b*e]7վmDSMxR HXI-MV*" H,&4~)gEovJԊLP?Ի# SR+9>>4$qRT@c({ÿ́)Y0-S6EÖB~WKc0h[/jS7PrVD#ܒ_YkEONvڿ(ꈑ,ɜ߭7?f:y/c}W?վ?~n^SezT jO8\U"y) LE^D?/Ho,,>UInZ17M}ieZ:ye __ԯ47l  BjW@ޜPlmԎK8hyq-8PΔv>_s˻-%5Ȇ,C݉V 7Q, qD9UAtUV_Wa˾~PMςK%1{[+Z~D:9yHߣ Sպִ$bʓ{ v6k?Ve9]N{+bXc0!2ʙV>ĸ\Jϻ͑w+K[2C,p.gFaMKuTx-:vǣc2ӥR[vf }]uYK3XsBwRΞ tnϤ(AXOA1iѩ99oBCh ^6]!!md96vZuKS%%]@*l"-!E5l4g#?PA!}8/W/ sG hBWSfj|vv  ?7Jۖ3)w9p $ ْއr.d%lu.>U8Wgc0 d,S,r%VPCCa7n;˯îNdx)k9_I~Rj5_#wqbgʨ2A]|W|ULZOzSDsK7I.mgu8$nk]2lɁ:_;mD V@ Fo&cR#n<' endstream endobj 54 0 obj <>stream h41 E@ `"CU%J=5l-A4[3۞kY@> endobj 56 0 obj <>stream h[ms6_o2Kqz잣LddȒO߂A\ie{bd4?q>'4ߟ(b'HLbB#x$RQ?9M =xëF9H2>YfD!"$&rs0WTO % 2ɿ]~FhPR(}FJ)Ha8;L y0@$Ę'fyUYnbN I(#s)ƌP\p#HtHkeB깏J) `5E! ʛ=R~*LakI% c lU)L5TݓLgd4L'y$X_/sYmCNZGZ:{]B!buJ bR Y$kn:El3d5 %Z5)hȃ4z1e9l_$<o1SR ?Ou9bP5c^7,+^r!m%6$}؀ {Lfe,j IִM4S;deܓM^ kFS&'3*#j qfAaP*"15Z睻& K5vԬ8x|Ad YeoUŷ1؇S} 0pzf,\8AYFOjVf5'#@1ғlo@'xYW7#ƠGa˜.!A! \m b? 7zI /Kuu$'^~/y}%߯LrLzEdٝ c45G 14Īй4.YdۍS@Z/~m]@[M wwuVP&NorY#Gʤ6>q\@ ǻ^.E,1a^C","~`IxK*3-DB}ixI)f4s(J\MMwa2<x#4{ ٬iOKiUx I4 V^KYU_1Ϫ tZ†5;TMC5;Lͪ-ⱶ7kgmeP}m[3l3:~>7af^]h +Vv␶|y"!d:٬L!#ҹ9o;u)[J6w+pc@sf{'ӱ)o3u"[%p[l8)2biz( WٹU?gNM%^gt&BFx&ɴ+$UD܇EP" Rg Ǽ:({F1K/IBwpPgOfP ./l磩UI΂ҋ:;nUs1YԺ;!VRګOI֨ixvz{#N,[sd41_|/kifE=&2XUpx5{ڪ38llqF7mېDcZ`Vk=g,vy8N>#ߘ:pݫ.͏j4Ĺ[)&aBp03%Ė #O/j ezȒc*w̾իf8;Ε@/f;r (jcø6#( 22&.Z7}qgyux䇭0T'^ȕ)DTr9|A9Ȉ9^'2kIX V 'rs*1ny}Y-=ד;Wo^\s刊G<fƢA4|VZ `H*=K w-–nYꑀb^oypj O,h`#lB:WʇyЄ7͕AxsB\  9Jt.֒VDfŶrRTG \^6#F?u(:RiqًE7]d &dJ<8Țf.,Ƹ`ؖWPtU.vBka-[|`ʼnqW*̈́N\WK?Wj7+32 k d+b9*[BAԦU*u\ZL-ٿ̢>,QǔLŔ\.7W~%EI>؂ĢPJF=EZ!PJ,+i|/W`S@Pϧ~\ϯq1UA䪹ۧ#& p1>& R{CN5`"w a3}ݯgu9Y3j6EQZ8kTa nTTK>SATz[MpS,XFMǐݝ!Cg pZWE(w{Muڍ@9kN5b#VLo>t9/Pt4#54ZnIZ-|JS]u-~;Ci ȸy x~~6wKQ£mc͙*H;3$vgN"Wuc帱l}wO*bŗ"n 2T9LPV@~MFH-{zmM5P/@[Ќ6ZKc|qw)رEQ-hI#O`7о+bh:FLU97XS;_gȤ,CVsЋ2zzb9񓏯l]=ˁ5GL|/ƣ!\X6MH|4-ZF cqr.d#fkn;98"˶toUZ#VkQq.#=M syF 2pj T4Zw/|s'!`NyW u (^NsN6۝3՘]m n쓝3<9ܴ34Ejb槩o;Ox&sbUPTdRJ 9\x\E?%;wfx8vH9w2P ۆ@#n !$A⌮q@jr)R ߴu9c^C{lh!Y&ڧ\ y|lmSeЩ{n,Jr'q/`$W]HyI~x̙`B`BIʐx~ޛ@jwSRѕQ8-Ǻj Nq::ttZEZ%Wk$CIr^\?,H gRD.|ݦwO1ܮߡ]'f~~R=C&bzBlB,@PGb ^#_l_=?&I.i]T-ǑjDVtCpݡO`C?MҢ4+mKi># k5C\K<@W{p>stream h< 0 _Eo`ǎ xiV:%ՐǏ J2 nS[oV1ǎS[RGpIܑ W'hXˠ$ؠ4=mۃ /1Gˎ02 endstream endobj 58 0 obj <> endobj 59 0 obj <>stream h[Y~篘8}\JdpU.?@qgWL(R!)K0r%R4>ٟ5Ohr}$&!fdNL̥"Is?>-#\^{AMkEY/b˓d oGI ,K" <$n!BNaU wE?Rk-Yn B/rB@!RF2Z\2`ȍ/:|VdxѩBHΘo,u>FpSAr'9V 2,"'KAnf$Qbbr&J! p--<ً%e$^\|IR+4MKmGCƱT 2 3:K#ޱrXqg; m=Ocrn^ʥRkLtAp&M8>`av.s[B\ָ, nK phpVҒ!湭F ʬK7u/1zXЂn,`y "͍Vw$|`<)pj4|' t,F|C }q^ [{>1XوS,~:I/*27ʩH,G~"kI`J`jarip! \8w=IrS{:=u\6+Hj*rfƩ̒t•ƎѼ#! *'z.9OcN-}UtF*|-]3i/qEHɖPCG`)c2V@Kxv{K Cr؁ f}?`0*U ۿu;ju[sZs'?l'ޮjSvh82J&7fW EImŲoL]RӞB!ft^G@M! Mwm#lT] ߗw -s=,b3{}xGFA3WQN,ƛ9$Qڡ,hWB^禷_YD Ƨ<R#?GX,ys:FtT|d3"P.R[{mUggɡP㢍9:SYxY7Oi 9L "Wxw* 9U a`3' 8LdF`"XDLfFf1zArƓ~~y蓀"y̙s!Նq"?< P JTD*JkIͥ&"_"vڏS9a FTX dH8Y Q#ъ`OorB= I 2IhQ+7]v֛=1`L*C f&Ïurx~Fcʝ=ɞHHot1\,G>* cB /҉/2)#Tp-"+GN|E钃& ǶdmB@¤A0fd/3<-b<0wLI-)]~u$淢P}ةh-{~wcs{˞0Χ |P.]42.aJNc;2,;r8%7NkQUq+9m㜍RQ?LzB>/v+1¾g>br^e=_I"5\lٲ}=+tඣ95փ-o>3~Wt[a [96+fh[8co[ ל ڞns)d2/}hzF5;ϧ~A"gJHZY[s}j '-mFwBT%}v+kT4 <*F'l%POcpiV͙~ oCF!4{DoWێCs,ʫn2K&gx8_5so/]v/{§܇^XƹA4uShw3e~R|^A|"H^#hʤL9/M 7M endstream endobj 60 0 obj <>stream h41 E@ E,m5*lU(bJzk$g{o O=Ҿnā3F8iNR3sX1S9-hp^K`$^Y0\f_QT襖r9_/ endstream endobj 61 0 obj <> endobj 62 0 obj <>stream h[r}W2s\r-6'V*<@dˑHwl>83 eIJIa_~-?9_'ZT`L"ӄj IseP5K_.wBI틴NvBEGcbyi'Ƒ5՛,޼ ϩ. nӲmrkcGakjAb~P[7C NU&QͪBo\7$ "B*pVB $Ƴ+VT@Md@ FVDħuW) x0IY!=֌SbZ;(X] S Cu9rRK v 8V`]k6 ޠh+ Х)+mGg\*OǕDT@\CAk ji,Z-3Le35C_` ฆ4Ѝ%)+,Y kʙ6ґg H0n6CsVo8GR? 2o{YһBFYVx_g߫U%[E`)Cquu%z]gP̟5<7P \@%Xu%פe"kp699yiʁ*LF1&$c ^^۫j @ukijvLN Rc3's竘IT8>{阱6y=u8}3JHHM4:2XG\= \uFBRuЬeq<)BIXNA뻤m*O0!:ޖE~C6rF4 yB&r,f#&}fE~LYد\l'FcH[:,*){f y[ z YB paTEi o3lG-Y5֖5b:tfΉ3v`ۑ?})ЕayBG8HV#dI e,V:v|knkEy7mhu;H VCswp7ש:v_gV;g I(+!w{s UL}?S_>rig_zfF o1^:].+ɮ5!Z mg{sϿyu'7k IW endstream endobj 63 0 obj <>stream h41 E@ `"CU%J=5l$LO9x\Dڨ%\L+s) :Y* S]4K/Jxdco<3׳1KY|;1 endstream endobj 64 0 obj <> endobj 65 0 obj <>stream h[Ys~[rvcK*TRrAEAm؀7\ JVgk ittt=xv7bfF02zz@BbaX0ۋgdй$t_|ϷgY{^n"n *-'\sd0$_8"Ęngc­ (M`%܁_;j!Cw9=T*@r%#]jXrDA,oT`4gd4#L*AJ pׁ׀ ^|:wkDy\J3$pKB1R^ I{gH;A*yIH-G;zPt#(`,Uk霃}r Z+;4M%sn`h 3{V {Fk n Fop#) Cx@C0?qKƆCVUؠ3zUh \Xp >0-<8BX6P[D9傟m>ϗQf96~^4Ahx5;)rސJ 1H5\,=MLze}6"AV>xae4ΗcgIrV> įn4ju}`p<_0FICR$hk">jhU Њ۶S\YLZRцz/0֓tx vzXZmZxeqa(=.qm?o{>B8̔pۃXhѴ5"VlҴn`nN3?ر7]F3.B>oVh& #5H'.GopS=;Y>Is"8Oh(8ijvx?ĉ3ePoCP2P\Z(S+uKݓW,$jR '") iLc!+-c JVۏl W|Y]S3;&ӣj̖-:@dm [dyIȁrW?}AHEܝ)̕MY/wo~' 8"B"qbo)pDҕoՃ|~0J5Jftb !!+KdGV&j 3CfdM<(/ڌ#-K28YX+1"QiQ2[XMefm뎆 21ͦh(4iV:JqMbWmڂX0<5E8k3>}7]J9Vrk>\}Sbg\Vd;YE+~ ij9 7]/WʶͭqXX<: rąU6D/b~V.3>$C6Cm c1I3$Y2;$ bTMy!^@^C\Y(^fĭ'ufuK8zXGGW]d}"א r`ӒIuB̾ >.1nac|N2N-]1쌰}Bw;0Ԝ]c1U}um C*sśLA,lC~ke$F:VoS&m3fl}o;JҟAB` W[ϰCm8<6(ܜ6j C!cnnh-ta7XH| nO͙G3g!6ɓzb#y\wx;D*mWWVBihz˚R%](ba|R44'qM*hɞJ1kXfswJʦYC-qujFU;ǫ;:~ e_oXt/J~6f1z8DP?/=j8rmNa|A jƔG}QR{+Mn*[l61Cͨ).k^G'6 [ܷA{#d[h9dʤ畖Cnt)Qt)ō<`ե@~>i}pFsxsu2u3vJpI.Ŷތ`\bkʾ( g.E7l$@F!)g7HkHP":0W]q5jz|S= %>U\L?fϯ|xvc" m:!9uJo뢣N6Er <:~B*\SryJ~rZʺrz鯧,ZvPhyɪlu.4L~64tnԘN*VVe'0'_~ KOh`#_\N'Վx[bJcJ>stream h410 E$@aE$P ב,[Ր?~".hRPqR|1Vv, 7(7r#$2N*,e endstream endobj 67 0 obj <> endobj 68 0 obj <>stream h[moF_Au6zIshQrW`Yb#eoKJ0pfgVo >W.goKl0iHH wp8{1fg/glL-/e1/0U"j *&i922# f?_01&S"í` aL5"l[3wçrMIk9C 7n+l^UȚ&J8QaH=q&+^oSB+*x]jɜ堣{Cj=oHMj|-fI҈QOs[ػY#5L`Z~ޒ!=oy6LpHuX'x8-o*S Qp"XUٓD|Iƛf_"%VS }뾡:z\zQz8@݆g n׆tw{aJD9 QewQ^moĜkOreuWGT>4&&g:<VQZ+qا؉[p(&[Y!jt%iWҪuĈ,3(t Krq{;_D e_اySN:69i9 :yKRgO3dx5_O ْAJa\cs|:]ٗwpRI&xŠӛ;%KsTF2O=uFC[I1ITĀ!.xI}MawM]6 A vvA?$ijiaI($("̣ya->NSP 4)(S(#U8jWŧdK!S76-cf4}Ҍ0!xJGPbO)hF3T6=%Ʉ،"}0SOz #vbu<$* ވ;{Cک RбjSPkHxnd~R"GAeD26ʅHf\P(p0k[z 6͈DmٻxfBY"$m {Eg G : p#A~dA6a4@H$Zt@S%8B 6O|eRgW(pmlDG 4̪bVK+/͊7.#4R~Ќm8W. $O`fB!ΪAMQpI^e%ٻV K^DJ {fڊV j%iT5` Vx+wư"KY޼/_ى& {}2 ϻaS[9v kg#<<,B wQ=)h|=Z.p`ºKQn]F2pdkuAVwٚcyswh $̩ݭxwǛ:^0XKΦ=]-p.i-!u*]?nm)R I6R*J&7/8<8$ARs=&>crެv5hDc>6`h[ $(d{)ZٶjFS|͕%Uh}ZPۺmcPHiE666vz-TJ;Zǭ3ht6n5< U ;Ml 2sGHDjո_ynPb/ar;aH*|au[+m;Vz{3OtQ_+.&8뜆bB䛦 4jg}y ;X|hC&$=9XMgF_=,(;Džt{i҄v@ʰl@p[ڞH0y"BCݩ0۸!VZ_,sD0Jh}CqD37lz UO8=xZMӥRXLIIuKC9MӪA$)y7,m ծ+OCl⬳ pHp)*'lќw$O+}u?,[U:9\O?m&oms⊲ܗSm^\Ɨ)ȺO`|vdƗANm=4H{.2 ObaekL^&$R^&ݏhF@h'@Q z3?cezcyGj/COM+&nY) {7tpP1gn dg !l:녒ou #U *ı8J~fDC2ܐ`Yv%ٮYMWwik" y5QiM095`˗`x вka&0<%L[`9t}wHÊGjNa{Mw1 M{ u# **LWQyVj]C"M~Y%G(x7U9eEݗPgGG[{4j2ߖMpr˵0USP@jQjP>ۮ[E1I吊pROm{Pꞇo.YӨl;55ݧH4_@r/^*f̷hxEKlMG"azZj4lC00lR߄'٥=hg:JߒSzU~'$ґY@8|ނk_Zp/-RO=ۡ Ǟ҄;^Ԙ4}FK4[dTpevqӂfL }A endstream endobj 69 0 obj <>stream h41 E@ `"CU%J=5l$LO9x\Dڨ%\L+s) :Y* S]4K/Jxdco<3׳1KY|;1 endstream endobj 70 0 obj <> endobj 71 0 obj <>stream h[o/]fߏa E6Ymt%\>DwWƁ'Yf}1+nF &#/|3i!THvqvAW̾gFuk2EYp_̶gLx*[%>dj;L9IذlUF9nQ~/Sjm%V8@& bb;0[caշnj31No(1QjEk+Yn뙁++Z#8Ͱk07#X ~`?5˨D3#hD,2?H:(IkAh.].(#Xu'tbr:$ELbaFM֣K+ǁK p~AQΑ4n &,c`\* ,qyHx&}(1?EcmZt 2:4tKUtlAslk38 ZA+7 ^"HIn@4|OZtb.c+XEұp9VE7G<  S 3r7 c2ȶ zՠZQqTЗ '%1洊T6I,u:kYUJ0MY c̨.@Jece"Ew8g_ Asֈ#K].- 6ِ}Z*y,#ِ2AA"ilKRq]S:'QTϏ~jfu&)mU&itx%6損/oEPz }j5"ʼnPrӕHm[2E͋^7")EOwڌ(#YƇ*Hs-p||A9VhT=cCӸ5zXno "maULQ" v@,1ahwEk‰2H(Ŵ& ~x:&(Iwn~YRK#Zu֏v:51qg|\ۆ7| 0*w8 @Ӊ䚑 SL/@r E 1Ff Dމ~{ĸ*Y ʋصi*߸Op#nǖDt@RMby*bw}Tq{v,~[K~4`݇|<0Eۯ: H=giro K&ԗ\{1y҄` (c Cv'Zs&nP0sA k0  )z:+PM0~#CmD,CΊ)kd<Z9=akd)הt^.q8™|ٶHts-ErVjwK:t|O1l,-*( rѭyun)b)*])s\g|qW:^ XʠR\OXaWO$Q}pZIFƕ"{r$Y`H1v'FLF%N枟6ԑ^{5=+ 0tO(W%VP LKB{ۋQ|x< 갾~@ d)jKeUk.q^yms`UDMKqu V~Q>V/]A+0O$xY /+ /,XH@)Rf9=]հ}24LJg|иqc!ӆ_PTufW'}8K;ؗkwDNߑ>/`+v Hcˣ0TUjVjw~GtaQN'ou0cU'U(Pp(+H7?-7 tϸA/.=`=nURI{196aS+n0c_/BPɟы ̖Rw;fA:)F4x6Dy؄)^EOiLk)kX􀓹'x\yNK2El'=u]e w!U T6Vg:]:.d{DPCK EBѯP),-3MCApʔ%OPMҋbrru{?@ꗥg\=c`f;Ɣ MŢ[cRa|XIO·5 Y@#>M>9S米@a5`Xak(AKdÚ(_52T,`+xKΩ&Ax:W=76z9 ; 5ʴχ l?\ř a]]b!6~N,D݌HAB "p%}9eX2'3lV:$zaK[a~+o(7Pes8ZʭG_X(OBfs wVUeN&KIm % r C'9=Tpͭ>ц>>WӠ[ M0#naq_( r6Mmm yAt7Ys4H;6f (4#pyܭ&Lq¸wප'!vș*RgFJLbsD,/BFy͍?Uom`UNV8*;J>ҋXTWdcmCS _1WF"9:9eSLcsғ;&!yAL'/4oOUy~)-}%0I'UlWCSiq[TuaF#CcDԈ;ͧ=CayFB(4:j<F{sRҜI2|F{bEIo=%^/* Ax Ξl/]Q~1߼?;D`:xxּ"2' *|>{=XC͙>(W ]Wֵ=n snN_J^J<%V^ۢ$j ,ϔ]D/s/ЂZPoS`[H.ZMuK8?WzѲ8 l5g ?N QOiZJj9;=I}θY 㽶_[㯭/j? endstream endobj 72 0 obj <>stream h410 E$@aE$P ב,[@C߫!HE- 6\V9N̡bL$cxtYYj 3"nQ]-1o3GHeTL 0o,g endstream endobj 73 0 obj <> endobj 74 0 obj <>stream hZYo~篘 Ge6hᬝ5<y̍D: S}=G,ց%ꮩ?gm9r|˖73F57# 5I~F[|kO3J8_2{{ƲMk3xp_̶gBE/Kˌ/$J3Y$WN  VeLa˜Xp 3B)DwJ-p+/xl 6'ʩWzcTvE!C vVuQ=^XIa{춞5 XF`B5%ZeAIyƀPf FшPEhA M.'`)}Qq[EiKdž 63بr;pFsCOz |;zSsX^ ^& Oa1:r-74"݂@;Ğ&rzݿ-eϫɇTA'o'фɅU~slw4pe Ϣ K.P_HP 1G4K'*J㘾g6}; cxλ*MOD g,AuaLbYJœU:tT>FD'nDM /e^zPg1MpBK_(cEbX'!vqr"Ovws|+9tj_uTU(UWa荸p@\#r3^Mҽ@IbCPN6vѝ΁T(V{hjj!ƪvNBljԆgŹی߯{M%rB#l);$F'f憍p*;mNç uv?ms_W'+:BF rVUƬQ1lf3?]x)S?ʲaVO*~p;_-@zg'e#lfqlgxc/;3 i|G}NEdasMeJFBfV &7_` QƅeIb#C6MFYf/z젻Cʴ0 )Ӓ$ۼm)m IL[) dͶ?zJPXK-HK!H{ H0La+9z-.^yu/0 C7۹.6$뻢g{j-Tp3<]|etRi0 }c=#MvWC7LXifBuHAt^^c% Ʈyՙ ~kU} h Ӂ"c*14nx24WO@q"Nn5=HGO*#)я''' CA߽7+|Di[TGKn hF˅:KL_g~"L|vtqV1Bx Ӭ`[pR̕c L"0 私0 1;33o1]Qx0{)F4Ü%TDža|DLd{!~N} Z41=!^&TxH{@ " τIg#p`'!`2mch/Y͝OWk<1\nBW<댬a>Ѵ8<+G'Ud c*^I'E>Ns ]Fx#$ 0C lJqG*uoHij^:,m=gn~GOZOWjæB"{X"M(^/凟^ #רP.''p=W !.vMq> nL2A<(9c",9:_1gqiiݾk/fH?}>Ji /c@VtYЁZceQHU0|G!25/v/~ٝ ' l|Ya ufo{ّvru6N#WO>>쯏}p};?>},[قu+6Q^z9^+ endstream endobj 75 0 obj <>stream h4 0De Q׀VL tϿ uo c }W8=phجޫCsCƊA\XqەCu6(njr\yj'C ~,_ endstream endobj 76 0 obj <> endobj 77 0 obj <>stream hks~?;!ãL8;$M?Qbʐ.Iu}ww;ɱNb_xlvwųk1cUڙ(Ma/tvpqI)W?_mf8>ӌ_O]xLhG=[gDPx!QTY21;;vkHG,YI1A__-/WBƜʼnH}A(eȸHVg~<כm*6q ?3C \n\15 f%͈L`g#u< ?E 1I l L4$ g*&vէ8X!x'p+mqB9v []w+e&(f'43q"&Z7"t佇P ~-5hf X_-  ėqYOj:`\~ Zή0(DA !*%8e+ok"T3P iNoI_\L_'5 VB)ܴc rl;JlaP鼄zCJhRG(Mn H8^Jr1^epg 3Iduh\ .Qp$p8XS9BkA]\pzma@^sd,-Tg8"Ľ4rB\ٞD aU*QR  KL7u_Tp9-ʋ`\{lވc7˟]<}l\.,=FVʶs9:F 5(9AWLy4!v_nX&GИӾvs"m@\I'}8y\Elm&I`M/z=b qjΈwmKf<s VSX.w-Q0 Ysʲ@ސh#goD Ӥ6ѫڬcvBWnR0( AǶQ\AerX4|VIpnBzXm~1@:V&Pr=64' mQY2EHCٴfV qLvCܭdCf O1u܂cU&ji8>6j3A{jnVa)|M>;;)'bvyyX~6,z}ByJ X9"L'_E9?6)UG_~po#HF˸?W`]QFb0mg7h./LD).Ls԰ PxX޶*HCތt0[(Z&i7ٛ4`s<GyxXkYE$^:[Tav-P}JhvO=9|EN?YbnMQL]J̓d"O٢T8ɒ*oQ7m+&h`p}n++?o20Il8LF)Í&|D*Ubch]$ӤgXтu CtJ2â"X MCf[%`  6xhRF *4xH~< H5\;]fv7.A<Z7+Mۦ|k}"$؂&ѧ422KW9}8_n%Ǖeh.7"!qYrc_n,&DaJ9;Arc1r.qFQvvUދ'q;ZKO'T>AJ fY)cCmRQlzr}SS)&Ѫ#Jʋ DG̉kL!gT$ ЋCPaB9x,sS0%3%L<P@Pr6ZM!/x*<" _/ z=m.p}dnLgK n協eUơ̽<OP~XԢ}nU$ /WFfpO͌5NoV6QhjQ]mPcZ~[x]K$gNfO-( .cgZA1iD3llï-]?A7 A ar?ITރ@>G[l/ j]C]eeդVodJ%^<>V 84`O^/򑉯p6?!ÕBC29Õ!V˦|;R uYEb:s>=JAXW\0QŬF\ZFQq4ri6{/8>3Vx&{]0/v'Hw$}/>u|Vx)BL0Ϝ(z9|V\u̖&Dݪ "/{2vSB$W86 `LY4ς]e-Y5ϞrHk\<h{y>stream h410 E$ e5٪eHE=p|lgYA[[\ A=O#T 'e*;uei4ti98aˌ(l1[-I|'K,` endstream endobj 79 0 obj <> endobj 80 0 obj <>stream hr_EJX}Xc%VJQ7Do?8jP:H%pP@,Pi4?vÚ3H"爕Q%~ݜ3|FTQ\CQ:9;Qę!Gೆl%=W9{PjMтֆ&F[Z"nV(~3C! X^oekU0wl aj+ž|\!ʨBE+5>0LuF,,w},ET5ښ[9.+=N-+aq$+vPUj9eϋdCW{\phk;KP9e<?evmB}ݟ6DžKJ,e?p+ijRݶ 4O`dw=걚CJC g/"bHРqZ93)p(>ĴQ2FxnNO%S2,ȩ@`8Nb a\5QlLiQ$Q"^a_(dDшZ"ƆRJN[灰8菐,ܸlp0[s.WG3@ HF߹ ?j,'zUo$6( c|fv)v^H2\4-X% (n,!U ˒CX@ YZ2^Q9p{x +*)HUapj~s礇0ǏǪAXǪxA(q'VK:̸UڶG![UɶSuCwѪCB" ϴQRTu'Wje/ 銪\&$ԇǫjOp?gRjTeCT 1,>fF>\h>+vw}S,r]ֿ, E.6{ګ!@ EOevx6m6& 9dm!+?H&K}R %?Bfig"D(SiR'9>q)΃+VHUV2k'&vab)"[1%JKQjۢ.|}':}r[^#3ӊv}-54XGɀPZ ~y N<bQ%&FD6%KKX2 vM{u#-N[`<13rNhIVvZWmw+8G%dz5گi K Fֈ:5Rݿ|NJHUpZ+c$j˩Lp\ 8oXh":i δMםy{[#7Ee)d ׏{CIRpH4PFWq=ǧgﮊܒ$ Ӵo_j%7c]3$lGb60&ab8L$]7)X +;REMUYn#'edvKC:,Qq5_'~:HF꜠Uϵzt(w$ FIZl &g2G`J1 tOs=8Vg" d g,V'y=Kø kyLhI<&lK`5@h{Z?2Whh00/0a g/p%\T y8{y֏ y@ 3iȃwːؐGy|V\mw8}j=JQ9C*k<HAu9B%rlZ`wi&9`]t#366T3&/LYmP3R1uHְdLoPCFBl6jc) 0V9QTxSFmôf&E}@O*EP̞õ|gOp'S'xH7p_ kJb{!( lCI*QU>] %2.HRWRKqQBH[3*)M?~%'%?$PV"pE´]df ±)0SY>f0-:&~#?m-)}yEzƑ1{:"OO M9xoGkETtA@`(cz֤)"K CG}FS #sgVXפ'eyzn- /(Ow?NIڍ^~Mr!~Yv~u؄6j"qxNոD `] tbtO R+Ta#ͩyw̄£@Hx|3Vb#%0J1^݄G v'uWi2g$T ƾ8o3!OB7)0b?%d endstream endobj 81 0 obj <>stream h410 E$ e5٪eHE=p|lgYA[[\ A=O#T.NTv1^וh|+rp–(l1[-I|'KV,a endstream endobj 82 0 obj <> endobj 83 0 obj <>stream h[Yo~ׯpa}8]90lyɑąD*$>U}3$GrIk~cs1a Uډ(Mኇ :|}xC)?.<'q|îd&T% j' 7$* oF2f'Bq31'V'Lo./範$971'q B))5c84+(W|ؕf)Wxe $(TX!J^߿ֻ⾭M*qYߗm 00 `t_>l`ДD>A裦J2VJgS/xy` bld^AlB`o=}=o#6H"@@[o'~jc ޸X~C 0#& _pbZ ’tDOr=:..EBҸ~a 4J2=~#|>ˉӶa(a[#RSTj "1@^x3ߢ)Ӥ)VYaQ}cix;Ψ!o` 5!/0CɈU; ^ vZ}e,Ydj r6.?{.q8{9'-,pX>U~Ƒ/c' Nstx#;Q40%3o/#lmbGQQj`|]ݛ|F#pL'd8!5 ]EY\Bfr'/נy&h(l=Gx=U1b!jW.U)F%#+[lzRYУ\\@8>ԛ\3aF=;%IeNum~\^ug(uGmk"@ :\f8{Fh pSYBYRwٚf lPvx[S*w/ ٛpq[`\*7P#v3>wmEG) kxAĬ[7*w~7UDega,p6ax]_ևӡ|ӣ&b5Izs cph_]17lwz:_lHbәՊumC$gf{Ȍʍ8",pޕ6U,]o D 3 `)Or$]ƙ펆L4f͐i2#R>,[r(8eCɞmڠ+7S4V40t5r6&;p Nd)2\=Ţ3<\"vm- xf %h3!ב ءF*Putu8^^.v[^8'J fggp5=t#?)ҧ)qn"XWiF !SSX;B&ыA >F2c1T}ofdU[ nG"A$B&H<`vc0۾YUu.OhzX7br!WLi _kfHYv]QvDQji|}Qjg10wl\XIoy_Ad%Gե)٥)-|tiQj(ķF!"ʫb-JAdd +IU20U]R#j--l,3bU[z!i^.$eq!UiO5 pRuB™āGƺ!"L7HΩ L"Dqm*߅$+*ZV)%H ZE{3MŻIYW2e L IT'hM˛ %X7~zz95*A>*gj|?'j""w&:OtӍL^JdCTS 5tfqR@7Giw^x)}P::pcF)0hlӴh6(?Ta} qV!SNb "?f&^PujHY]:5YRM!K_N^AoYalLHߕY}vu ~h!xqY͈6ȲkuܪFjJ||sB_o5Ύpy/`UV\*i"z|4]wSZe>=|glxܮ7SGTU gGVa[Xw>+2[eFM5UN%(8.v8muO͸Q5Yr gclyUs[r7{D/yF+1vsShItk<59DfR)fGX,,y;S=VgDbNB3>\w(Խ]_@hUBxu@!aR*}OLLBuwӋݶtUV=5#f%, "=;̼ckUnZN9H@dqXJ<_zȺ:;*|GGijsnpOo5{,19і3.H&KfuVKN3Γ FfdP.ˇo"B[#ذC08kZrY4P,*K Gl5$NڣkmL{Z%Og_MMᩐ jtHQ$9_y vOAlض}$֝`~pUAp $?\Ⱦ[]A?a' rS\H (>P\|Ypgŕ?_ɢ[,┏9ŧa!wz4ֻ; 'G"(;Aq+y>j _TF1'ʑpv2XFמ y<\:GNs1WHʶCcQn0C" 48ɫægx7o?## endstream endobj 84 0 obj <>stream h<; 7 Y4I tQ ˢBPY%@`i*Gl{n򵀨C.n%T +)M$X'(q$E`bQt0kbdF@ߟr'Fz=u)O}~4 endstream endobj 85 0 obj <> endobj 86 0 obj <>stream hio~?RAckh6m -*bL l%.ޤDo"Jy3/@rzz Dq'wZo?/0z/ſ$%24&+6_-e)0 XhxSBPi)Q M͑ aH?|~8"ĘD 1ᖉ%PoZ &ήO`xWvo퓵8JpH%D)+CEK9Sq2`PC Vˊ1?E& X̰, %4Qx!}Lwr%J7Zd:JKSAF4FTz@U@D؜D\q$%E<b;RDV>y^EFSUmF&F-0Q9=/WXHBIeW = ttJ!P=CQdEWdb&DxOH7izRi+ O!بe0{̊]^i y$UgV ^b+7.;Ҝsq}G=kyO4_5<||wxy*/p K(j~l_nc"3_UIzf0gk?eq•,'}*Uׂ\ɋ1p97]/O6K."KϚ@]2~.ӰvaZ}Y%]6 1=7)TO_gTϏK} 'UY;QQ(/-': uB C_Ja1GqR9{zfټj=^fx=QV/,IfGn~7nF>Ifl gzJW{qBL!7Ki^ui}ź!If|)wSvWdl@70@o*P" M)8~%f N^Hyj0ȧJۨx/#Rz\dłjF¹`< A AbV2H4&HJD}⌊s`n l(ll̵;yĕh9[pd!@x>5FTHbc\ #6":((r1>k>8>pAa 6 HHN,x (I\u^qj1 PiYINYHOD;{p#f;x)R_&5` yƉrZCwG9Fe Ҋbw(>occHutU7KnmLt=<+Vq"f6:)'RWI1pߊ\tsRyWؘ9VOYYvtj2L}|N;AXfȖ֪kRhOufOknUT%ͼv.a#淏 bX 6ux~kfOܧj.չ2/zf*M6یjb!8ϴKhW7DΟ84VIS>VzF3to&+DdmL؀ڛ]2.KRe)㲔qYʸ,e\2^i)lݕ ۯd0 ںld\62. $RnFc/d0\ Sm`< !N aZ oÙɆ7Im <bF>0O5bXٷW`a0% 1w00bJ& ޻Ys]sFH>1FP0~ְf;j&pW#[#CUY k%:Oruͻ?еck^DT\\}ؙnCFv= T'EZ%8nM7Y/W}`bT9VվC[{+8/qsR嬍Oa?v7mnvYLBڷ65xZnh<`Nr'')ļgЦz!i;oC7 w{xx8eJd=㘹 H #STXT$? M뾂&˫۩`KPq Nh Ca;C2}T+j{<)+n{Jʆ> _2R.t+ȠZ`rdۨףN$p(AԽ?uq+3cS9h XAU96OI7* nODSGDpX~ݽ yMֿr'Yw?8H j'(WUvA|uUU>WZAh޿c;_baFw; -x~~hS?>-+ ,.i쏃 iinj!Oz  Jq!_,f)bZ0*$lH=jµj=}*}Dp]_ڈ6:}-p 4B8x~ endstream endobj 87 0 obj <>stream h410 E$@ŠH6ĀP6D*ב,[c@C߫!HE- xMv*e +eckRkh]#p†1|D_,c endstream endobj 88 0 obj <> endobj 89 0 obj <>stream h[[o~ׯ#XM~ m-Xib}e֖\JN!%lm@!mΜ}ʛ?]n?rf˖3F'(M\?fRqy3m28iƳPɶcBEw޼lψ@f$c6ۯ35jb#gV3&og a128q gR&ш\9hF-#2 .+(x_7f[$FIu:scqSW]ahaTUži5nF>xsE#)X{`UCQַaw3A9ƍ7n3_(bQibG\8gy_ FEAQ`|!Mk?y[UГƘڗ v %93aU@p?_h055hws6/C)>nI9n'QH0#}ZT/ VH%u /v[|ޮ1mX~&1Il<`TBGv|z+hH3v |JC)rs٢dJ;VLNZW^g1"#8/^j$I&؄x߭ы.\Ba\3ÇV|O8bJ\[qKؗsP6꣬Vd;)98`J}$ v1U_m}nq0"q9Մ3 K 8nwRA)Ծ-/}gif&&v?Cz@rW1gII'ɋ޶SUNii|Cj3}mn*R^$N'-_T[2` i g` D5VTuL4.eЌAA~  OYuAB9I'H r8%ہ | Y=$KRYP8jSp5$wd-K ݇sq8`(XgF.ڷG}1*uܪ*PTRFAÉQ:au%`GsvH7!< 2?;=KyAS"[/@r ZC^hk*xR^H*8െ-0j-:b ` -ğ*|Gg% _LPOQNܳ fQŢG |á6Oi3A_. bع n-r΅&u* r j<2!5Tr)ZBEJ?'`JRtŔhC;xl$ΓFc ժL!30}ssAyίjK]%#&}tҦ[ZzozppJPM/|ζ/m(&Nb3b55m.3QYW8|ViL,!gњOOWI(kV.:]sAh l.6O.0QO1Ys>kn#rӵڶQ>%tBv!jX5j й!H 1CQnv]i(hƊ[3+ fX˧WW|aO]I"mlJ}ʣ)"MR(X_?0q y< wtRN t2cm 4#ru&p _U mW<<= S}(DCDg!3SlGXh> W>K?%R6SoE|Cb`1TzD Tc1Gs寀oB"AByl?B&mq_us5ns9}_OaFks<bUn ar@PhvaЈذӰ@ =:|-L 31 4"x- `xsr endstream endobj 90 0 obj <>stream h410 E$@ŠH6ĀP6D*ב,[cAC߫!HE- .hRPqR|1Vv,5" +lQ]-1o3GH5ڼ 0c,d endstream endobj 91 0 obj <> endobj 92 0 obj <>stream hio;~\zCPrZ4fQN>PRb*.I9m}ߛc @lܷ3~4;L\,xFzBIaMF?ȂL YHE ZL !|yb 6<זel/\ކAeCVpH7-(5aH-laXfDaUFy!qz׀_rQPjm%+@IAHDGfPk Oz-?5D!mǐ5:cڏrߗ|ho EnzP^/fk`c&V<(, 3ӳRV2GEHLDB! ׂRgB{~ZP@ Fv@ơT,9Slׁb$vtaDP4*oL:#@@QUl-JY'ɨ-Gj:M[qwF .$/i%ghl   a}[р7ؠyak6 Ò\ W ra%+kM;ES >CVpyfUVDR`ij $Y5\C3kn1LgƻxsU=?:% #j]jsTD$.sd 0{К3s#j>Q_ `%ҀCt7TH7 j8)VH֊L&!>\BA@5&Smywj *LhRQ *KQ(kƠp^_j}и4.*)6y-a0qN㨍ǫµ;t8wtiByq~E|젾?.eL Kȱ3)`{ᆏϩ?r'i]ZvEpvʳf6QvP 7쩡DHm2Bi5pL{x#[uhAmǧ=>7yŀ klp=Y3PV*~-=ʷX>x+{Yat&%=NճZdyMGF<I?>mW~7ǟ:k6JBade s=h4Ƨ)G"?X--a# ͥ$d V0*J'C'PypcQF7eB|̀Ie`$€N/gd{qO~%()aVtNud3D T! ¥ T@t$T=^xᤣ33F }s3Bg.޸RT˳]u-|ws:v9%x6Xzz|`p0I泘.͔Si}-ݾW1m˕`28͍ ݫ8!,{jkiVvbaA]&C #М*E_WXW%F )AoGׯ{*6Fcnݔ=|Xea=ZUO%pi9|B`&$.~eh 9l(sgY6&q"t_m򱞚c+j.*"qYŰB0 Ƽz̾neכ!f"-qacXoPÞYU j^A ,-Z--5-l-43$ 7 jβsnVQ4{ +>"R)*jl&ݬ=5?,MK_J8IS( )=2@;,M_J?mFP") */5(5(ppj$^Ȼ*1" '9r,[VcЇ`bIF&t޻O?1MP_Jxhp!y˻$*/U+v\AÇ!iQ<.#P*{+vwV]9@?.MM_J Ɇj1ۅ6'A' {AU':AjԭJV)ܭR<[?8;;gΛ8m>stream h410 E$@ elUUngAS\rh> endobj 95 0 obj <>stream h[ێF}W%X_8Xd1 kypP3r$Kio5)8  Y6XU]]]uoIrc1yX$Մ`dt:Q\ !1ܱ^ coNHN24&3'?}e dO@$8!:/wADq4M4GF&!a&~c%(2FOƄ[#RF5jF2Hxmz;Wqĕn:R^#m]ͱ0$r0,eZo}Fq>>e >Yu7/+m~$H1$X)Dy%.X)o?dUk8'l2MƨlXA\cs$+.]Ngt;Du)J,~&=<ſOa!ݦ1M +^o?y::;d[ [+`=I+g~$6UsCQ RRp28}YoׇήN!C+CTH=ff/VC51j!~T2wbc4뻵]O;c%Vc;rh{TqֶzbaawŃK`p M  j}wÔC$_ڣ{JI%lڇ|ntRXePq.蘳:|:0u_ 篮xeYq>_ōb0g֑{۲1Aq/zr!u&Zonb /ls]ʤyY% 7ECPWFsF]9 R2PEB!ʄpy_ͫu;4q`N] i +;HyҀbkD%t 10Rѐv*ՃWbC¼L4?!*7϶5 zC xڷG}nOqiY-v+Y[-)ٖp@#d`M39J ۸%6lq#moA*$7@x #v MRWhm!"Z,;]D4nK#Y`X+x9[eO+JwV\!fs6dS~>1H^i `ߺuP4V>gX[in2r@b]dXmF8 uOJ`0 wc :h !V0A$[L|Չ&!nc%d$>3:qnh䶔wjhWknFU[Pӊ+4p+0Q؄q}8uW@f z^VZ#4Q) /i MUj]Qghwp,mVsZD )Erړx}Lax RW4 {'j`. ehܩd2P(S3y5mwj'o p>k'+S(h xZ|{P+ZSmLӍb`r 1C^ű4X'Ά[pXך1ͦtq8gfHI'E.K;|:AOS&?DūqcgcD~CxdRaexمY;A̩~xr=R8J`1*??ҵQW?“9ԺJ7h1?:5\ܟ -A*%[P7`Lv[v0%Ì\{jTg >ݠfnыcY .dIBY^L3FL_V&MJw3з^f}сklXN.q0g1-F0]ya/ge!-H] x6t#M72 _eVELUß-xnex-B*vX>%hPm(wwEa6X?!l]XJOSpL.|kOw_; L?c:n'I^aЇr5r!wP~| Ūrarta(|ْS?=!*^u]MdSLo;X't]rLA2-לQ w&&ÏS P7M78Z OeDQxւ>/* CYpmԼ9ڄ{Dc]W_w5,$}r`.&J.&`p.q endstream endobj 96 0 obj <>stream h41 0 EIȆm[RTC_A4[3۞F@4\!EKjYbJ˗xL麲F?41WVw{an<3ʯ,{R}V)_/!/ endstream endobj 97 0 obj <> endobj 98 0 obj <>stream hZY~篘ǡ!>D  Cia.5Z:$J}{%Gp/f/W+lu7c8Q wVj3#Qˆ3ggWR\2j˶<7gl7b7cxLhRAgCFEy)Q#<81Aο3/WBƜˌITJD%r! =*`84]oŻnXÑ$F0E%\~O&3N4z3<_Cq%(m,#V0aަޘ3x@1I 4є<ؑg~B#RKL^Rh #)+$\r8%&((‰Zm`XZzJ"WDyATzi4c ҝd@Y|b[VNn[}YEGz^|)W%TU@WQ\)Cu]O:A垢SStN WHTоpZV&P&՜WnP7.Ԕ^yFC ĸ`x,E4ʜݡzwtlrbDX>E`|/lqx?ǤPN2ue)WˇcF zV76R/]o~ܵ9.ƦLu}87)̙IBŕ;]tN1؎r;P=z!N|xG%xD.aY~Yش\KF$A-OfѵEE/;_@#/&;܀q\eCs&+uztipaPTmȀ[&/Akv[Sιi!AbB|ovȓ~\㦫wfߑ|,wFf EHDB?;0 ЅsŦl|k"CC }]QP?]/7EP!EO2h))tǹͯ DM੣퀟1~1p(Jqc!x h{1 Y<8q.ʟ搡9+(7SPp)a=T/8HGhH#=2/I Xk`'mDK߾~f$("OU@\,K3s~UKn)6v)">fgOe E.E'CN!u[gK||ʋ~dAnlo?60$[p~>| BM5UoatsfDo^[qݺ'vնR"Do+bJW$wA7ɉ>Jmqk{&' ]nQvEX^ut5 (>'\|Vx&cpτ.}bJ;?He8Bˑ( IyD58yq UЉ֓*/1>yA (%n0/)z_š 0/\oP !xw8uM!lLfD _oE,‰I?0{>BRQੰ;a07b43SPIj+xv h5;bm}(ZUGS@Iϥ '/x2!2!~dB(}K\p .u41CM%pA ͋4S *4Wm5=L:pʪ4 |&+҇ъ'h0;AY͸HΙ9$aE)3Cq/.sfqaDݸ Y%kC\7Ңv{PkExkx4 oS0tlx@An]Jgo\I`7._N]N]NwDrՊrxC^nqoGG8/.梨̨Ɖχ2ryq_'[+ ?cVߴo j`?9OR endstream endobj 99 0 obj <>stream h41 0 EIȆm[RTC_ƁiR)g<=Wh> endobj 101 0 obj <>stream h[Ys~e>\,VErJQq2]""! (([>s]R`(ޞ>lxK`gg".TDi #ޝ~=;_zy3.{B3X/5IWzqu\ADQeᗑjwFItDgGeJH˜s 8q>#2\cQa78r?asymqd*IQ2 ɺ!̏ p]4q3Q噽?_oo6e؂Kg` buI1z_Т"/$TeUJ~B%RKLVRh9FR_Ą(‰X戆汴-"e"WDya%Hב<0/Hw%`3, xVkQQL[~ڣ` 9/3t1AWY0.b q~;Q 5A\TؠZXyɨ 5~WJKS{Y^JRPi$mhDy].4(9}MG֡Dž9"gĚ0`d^FܳgYi"9nY&;,0\Pi`N]Zo݋dKE\ym:.:Ͽs@Y(Ig|gG)t 1Ӝ(Of%KKbY [6SH u0ܕ!պ9Wi|⪖/d&heUV_VJQ]/iٝ__.N~t%7]v)ˮ)LMk2IRL^Llq9|h\MԨHs,hOHM |ꍢyN2֫fcT87{GFZ˫i+ O*XQt6x"j;\b7wKi6YV%M }1P/Gm;|$(6:_T(J;k\&P,l۳a _s"wx$mw/|)q?A#<HoNKITu-;쎰iH{vf(F6% ޸z&)M&1S iӾ%b*z `CUJ3#AyB(EuW3u/SSDpYg*/-&g jV 0_-WLΐ4w?~m{ 2{x>a mjzx6+?q珔ޞdV\F/0@L3!/KϼI@3P r0C>> >>H+o>HkgGgAD}D Pڒ n U%EcB=OL/~Cp0ߩ6~OO0Gth,a`D=vBL=8!5jyѽ@]\2 e0{djXM6{$lD~>P)j7oJ<c:|?|2jzu{4–Y_Pj}s_lk ϙ8QCIaAK~nVw5dΛŽi+r3 xXσ3gf w}\A\%S w8[:`j(vn$E߳ՔhinV*"c[zJ/cf(Ym.L"Bϖ+a<#ڢ_vz5x}r׊eHXBpݬt!zхy^p9uJYu&yX@o7x:hD0 @QAH#G l٧Ab}! 80h!G%{c0<`ߕ mCEtbe0Dh0n5^7XnyaD\~?0 H ^p5 bXxs*5}y88jwim(+Uv?y19S(~Wݫʈ9Ll+ϗoU:s$;r(0')]׳/ 4 HTOc{XxNW9fz\oXƒ 48Qw(tmWa}~|lJ[pˡ+Y۳CK3 1v.7a[aܿ>7M#ľ; TXDO]p1OI=+Fi8v@ 7@[*7zӧ1y.tBMK2HÕetV mN^=sݴHQI30 IP tĔpfu/u 盚YC a `|u AeS65Ez5ޫ1x |)GyLx$t \3깡'ux3ىxdh[ t}xq˱AJ pf?-_5ן8o Ց/Z[ rKV 9o`dLGŔw\Ѹ=DP*]/Cy]0vȬg3J ! 4,$b.@iK=޵$(i;Ok൚ 2ld+97$&HR/UZeY١A<`8&ꈰȆ@˞TLb9^GgOtF` <3{vؾ[/WT1Lf& U9ޘɬ/CNVfVzޚONw 2٣KbkݳQ9T;n{Ј)5 sۋ?/ DjymڛTlYcDNș٘ [dxjNMz#B~d^&u:W]ωNj9Še}ۓt7jI'˾>[eJF _Jonzz,,uFzHy@Ngς[$2mdb+&Q&߯2 !ȸAᢂ7G>ieF>MݲaA??HwA:"_wRieL89lm"L; 6 HM&%lqM%.?f> $l&)BM"<-"~"=OO?s`:sU5cb\SJ6 =)΄'q䆬"d,"e!י涺d<\EY~1-kP!#SV\ɶD˃'ڶ endstream endobj 102 0 obj <>stream h<1 E@ `"CU%Jr ϲF 'Xq$t=b?Q雩 ah AжCTl0 $Q5Ӑ5یLB۹< endstream endobj 103 0 obj <> endobj 104 0 obj <>stream h[Y~篘ǡ"bq*yrjK)Kʃ.5\ZE#8>ȡ,WV.z(_XrnR$,Ynfg oVj#Qg4r2{I)_gY5c67'd_ϒ]gBEWNyBDQea$c6׻51+ DoQٯ0\b'N`P$ 5ѨcQaG|rƛC!lw|r$()}QC8%?&<oC'j=Uof呛 o.&K,~L&o :1 ݵ{V_{|IMvs[cVئ~wa̹\+WYjFvz:0_hR̊zTX1Efw__yPjeX(gL 5cPxDBKǗal䵓8$T[Br22~iQ RgrqVEV/,5뼞d }ڛ:O[ZR+Yˆ+~l֓d᪬ >"8f@`熳*/*Hu'G"s#s;Дr/ LNppt"@c䤚MH| }%t] DAB~#  8Ds.#SR`i'VYM}Bt{ѓAƔ采qb b-j0a])bT^zՁ?)Oᫀ9Xuf4B~6.-ӡ7lQKGyep/a&]%O%X$hh|B:+, u 'YPfa,3Q=E9ޱ :V+ugѰ u+^XH` F_rQt=PZ(ِ 1E6Ԋ(dCAPk>b$D6EU9{}'M-y hṭJ:'i'_l0:EX;UfVP@+(yck<#! MUdC6;趷&79fMNУY>žwa?_vw_*vrLW-OAvnsW{l_ZP}u<-.vv6fJ`o{iuf]n{M_Y'O}\4npl5FN6q&il[T`OA|/vMQJ->"ɸnRtdp (H`ظhL/21@#o{FR2=}/U0p> :yUp$tK[݋) hh(4vCH/wCfADq^ Ia]Tw̒¤]Ac9h~tEzwD[di~Bˤ|ʧ)IJ/g~Fq]`X~Wq[<OՉ 0n endstream endobj 105 0 obj <>stream h4;0 D$|,th ҭ6\p|to N}/bfqN 7M6f#fL26?-J $T,p͌hKXfLU7}{,` endstream endobj 106 0 obj <> endobj 107 0 obj <>stream h[m_ q@cMZpcp;+=KWۿ_Y.y"/NNCwfyٝşqfu5]onW`kߌĬX*w|X\ߧ Bvwk][VSW?}1] .^z{\cNXiC Jݯ$Sn%ZXll՚r,K.0֮d '„P@\%z'TJ)*xvAXuǛ";wg*])E̘Q^+Sveư"J-`Fd8cMPNeV:I,j ?`ТĚDxezUJC)DD[r~A>UJ _ܺ{^K-V FHZRMd s^Gi䈏s e|!ç4, o @KYFޣ%?h2"W6G+pK8kӡKΰh1(CA HʹGR6jp ԂVQ-^"Hn In+i#\[NUfUڽ:|A$+o М;pֿgwXý:OFn*FA/V6dT-f{GZLhCR0ً)FAieW@xkF@֌x䀇܂4بW@̘ă<&`MDA+ KӝО #NV?8Y74/:k=t :! ^*F뤓`Ɠy9ܟ6Im!g0lh+Fٱ-˼ܠLzv3SDAgl|^Q(?$AvĹV{u¢)@JF{y-U!J=brZUGo<şl0/Cv<4prjE˕.IDvZ:2eIuJ1`gKЬ/#ve)PaSxS*ֿ ,L4?SԪI%!&/4oJkB@MBCy93 [;9;f>LDH;=a*QNGÅBLg ⤥P1#HRm,M2||qǓCN5{w=X#/MUJ@OX#xY~D`N _?&NYO뤋)/P 'ȟpG V >')֚87,M™Y&_3,YOԕߛ:uQ4TZcct9ߖ}4 %z~OzQ~<~=pB&XҐ})( *0mFs킳 ɉ]'$̞~8!pؑ@$ <\etbdU>43\2r# `o(}f0qDᅘ`khA@q4|B _xIO< V>iFl|.s7GW^ 1E٦[v- GVUO;9!kٯSN1Ձ'ժhV&pP"P$Z1a46?Ƶaay]Cuj=*zrmRHj "lFGˀeUߟd Qw 5P"M],.}=# !N흠C: #n S`ȏD۽#Ge3J.V ;S"24HEiW^ꦬJ:޸XX +HXؘa~;ql6g/XMet97:j3/tPٜϖEo'PY4=08y: p[U & 0;Qu icJ{GՂ MGUZk;UO;]>Q4Lk\Ü*Ľ|vG۝)̏%J<:yςcYd۲*^;_wۼ:hXzH??AȒT2HzZZ :^bPoCgD4Ů7]kٱpg}w/f$þD*]_ ].Fʰ A2-aN\Y,HBݾw`t6 Y;qZ 齓f`GzQ}n/4tA3):tS5 AѮ־8_`$D2Mpt* nwW'cXg|Zĩc;O$qVܼNhyj~Z?}}Z.%P͠A[a9ܟ\_}B@ҋU>@_9;'4KqqD!g;.o xǔPt?nx 1qROV~U~,>~#h%a7fѻwwk1^ίR]<<Ǜ`e ֔߿ݬ/H endstream endobj 108 0 obj <>stream h410 E$@aE$P ב,[k@C߫!HE- 6\V9NpR|1^;]VJCjnQ]%1o3GHeTL 0W,a endstream endobj 109 0 obj <> endobj 110 0 obj <>stream h[r}WL-s`Te)'dA$n nht߼cWg_\\[]ܜ1JL}JKETJኇ3pR*/~:?ت\Uj[ׄ |HUiX:lwg8- *Ĥ+&o/範$Ҋ#q3B)D5aRkr{Uq]ܔlT%JBj]4!ZV:>]a4M {7}qX;Ժ4lE2eZZeRCt/hQWL*2*W%wz+{B%ҌpPHqoВB;?0Nv q^ o2CRX 2;z+"JpYGmp,hG'߅p0=|PAjm<*5&찵Q=TLo3:R θȖ; khMoA b5FScP n(5NЕi%q{oN 9UiՑ K21\"~~>Y33>/w8}fgɴ(WIb0h TfNa&A fV*T&&MrII>LM-O|DgmprXp=DVДrx'G :M1gOW?3gbB39[ BE#`tΪ ,qk\0$ټ(#3/8~x1.datQ ^0bhwm棦Bp AGK (ƕVHqf ~x"@X/@Հºy&iӓ} ' 1!ƏOz&r9 r6NߨӉ)֮pS":z(ZPr EPLvEnt< (pR~RC.0,hm74DPZ9/l(Xob:Ek N~.cXQ ¬S"]\N)m27cgFi 2R#z ȩ FϤxt&3)GôVprZw[•^iNE8 h؞$+d:}ݱ}+MM?cW%&K>۵=jN25{IԥĴAK:~uTAi1{}~9.ʦ\/Aw |~hRrǻjtHb;N1FĞ?Sw]m \C&3첌3 N4Nj"`&s=:P6Yy2IN[`Nk?7<#iR_e"F3:3d>ܲ75f} DASg,#v<['?Jlu5$X!L{kXWnͫ=.OEV/lXVCXNjn%CoZHzn:]cq#I-t<0ƸWBP#zL\UOr05`oвFпۻ뾑r//Kxg2>mU<7ps>s$XR|6|t2Q>y,`dž]qc(r&2OTAUnm i0TǹLl >p$-2:Ng\qR@m`!ZZ`'OoS6ʦoд,DS[-$cFrsz9.n }W@X݆ W{rc;>U])dql*kZ'OS\cN߯aPEbh0[ _/Md&\qDDxxÛɘ|hB]tz沃'z \g9RV-g1gHO6KT0Mm0iF`@* q;% 1P+_Ps<z ͼYC6QԄgqvWjr]/+%MHVgKM[tZgWnEbؓ ՜-v?&W}<-♖fzlӴ/k|T?xf_=>EtZgw塯vudet=k4f|֜1wE$ I{3Pq ӿIn|cY)>'bI s A(nh>uu}K(b>mzMv[<Kvkl6N΄t{ ҧN M.uCÇY{4׸j,QD0YVb[ޔ}%k eȠ*9 'eF>wgs0*Fzs[2Ю#{l;ч5R~,n"DAG 0Eʖ'}KCW(`5-˨",< Z%sԾ{jTkJHZT' 'MExsKKҾTF=lovhӃ9J[I(IHq0Mހ'PEq`>dY 0n'6QP_ w_`Q}w ;v3f0])fx3ͼ VP IdkfRT\ӮW2QNQp+j*g>A햶P}36.գp9Ebo.S;̎S ;Lo + Y<_\;-Չ RB>:-8:y51a<7сd֗>oh.[tVc?\GtjyF3b,7W1jrg2@}@t1YHۯqKv8滈CB.#Hݑ]ˤ*~ej6o(9*!ւO>.J T[7 3UU: Yv##lAu ,)YR;]p_hR/4I5.r@Q{? 4̘)ΘNWJwQmv? pE endstream endobj 111 0 obj <>stream h<10 E$ ei5٪eD=p|)a?۲ $ xo:n1bO=6)nmƪ L6l%ٴZ>K8u-:srGz9O8w 07m endstream endobj 112 0 obj <> endobj 113 0 obj <>stream h[[wq~篘<W7qΑN9휥u itN~D,t[.3\%.EU_U'y,o~uswO6hsA/M m~D2@~tl;?A@mҍ}(#U?~52~"}(fWn|,`+Er0'!~7 3Ϳk4P!!6!þJ)*!<m%J[}O|~Pino/lSq6"fN-=g>Ƃ5Qyc_lGQJvn8M-`܁TbP1_NΞRjJE~HIEi30B!bƤ5BqկRB4deCD/~|grFp(Lüt+MrHzhǔ4h%||"#n+(H/È% X3n>0UO qURQ4✇NԸqNڳ:SyǑ(kC)h-zՔ]YF)xˤa.(u5IϽ3MM94_v5I yWd-J"ǣF8W0ou0box0F|]yē%P6_$0(&e"[N3 c.9~n#γIHP%E~~l*'dA,mM.#oՙ5E4 C9ycOu ԥJcwtRe>}^Td5!)KeVu# |ؘ'F/62HSB[1KS?j̡d oh5$JZS{ShiE-҆$vAL,UEYun$ g ̢ce1P "e)%76xGV% %bx:5ttdp! S#F@#PK|w>%NV,Zo)GՓi( k*7x#H@&#gq\W􈜆3Ӗ{[d[3P0pz b2 vU*:Ġ`"N}a;.k[.'E 4hֺЎ ▴O˒XXĪgaPy?'lh>k5ɘjF6W Ѭ |,"ݘ3ǸYxIb(cYy1:ŐW&xS$a϶g\6D!^K+u҉l 1OO$ p*({fI{,.UGkYȊ-a_τRFm G(ig aBDs7LȘ-ܱu|A7@N\K&gPw"JEddp2GGiP&U/`R fHvR[n lISM[9?&KQy13Nh>,{ I^i3:;w_/ul]0? su4g))`ya8IɄQ zV8gOԴ{ A^Ą//sN_yq ^ԧz~wwܽ$4]Y, .]Zà 2.1[zjx?U.MOH JSn0Cnn~u?P5%Uݮ^t=Ar>-]G^;rfp#ܚE9^jhӗwOwIv'˝Y#)Wdvv-KKjw=wiO222鍌lyʵy)A>V"_ 43]4s(j<::ZǺwؒch|v0d'OZ߾QXP fͤseA,Fs֤?OF?՜9K+[ƎҞj+T cj@\I"'υY \@j$'=qjfV^ެ\ؿd aZS^^җhfI%ᔔ^e[,-A 1;!!D#7T ! h%@-džeRYG|c0*3)PJ ^q*4k]\:~Û6kx*ѳG ]p|b&+1ۜY6˘^Lh:4I9٥tTz!LseUHpY3%['-tJ3lvf`@PPp@~W|2 mS9)5gYUS,+II"w ](ao4΀BЋ‰'1?i >dA3pq+T0y,aL mߟKpPruI1pw4B0s^7$PO8Q[^j=ZV{+Y =UKQdV-7}ʃR*lo1r  ڶMzqaX(Wv?K$$`^)fRUK ~$uό0B_ުX~$"yU W6ɋ oe~? 9\ I 7εOoou6<)\Q OFC~AUx2<|ΔB!)[~Z1T  &oRšk5V?  7zp- q:yn8F$/NY(dI&Ai.Z %r3t Y[V{w'_G@{ %[|Z3E O cfOPa |3g"oZm4iKM/uNx[F~|tT\7!Dt5TU_mF#,;/G0We% ipvku`JOէ: Cp#ݾKA/Yp7e_G N0Bj}<%4 !@bcCdv~K7^\|ݭћ>9#A`[!mtQMxB :0x`@w,k*lZgnb[8h9<94[™/Id1iK$2Q-.SތT˛!ÛQ{:dN#O'Oݟ`bF"YhY̴.6B+%qR\pZи&6ǐL/qzI1b7m!s;ENcs"/MO(( k(q]KBdc v-FSfłݩ_'HRfMnBqͫ[WZd6{ɈL O]:I!CS5O?T<,pxM<7,ɱ/7xJưu; Q+}ȟ_j#57~~oa`-ddV{J!,c$Q9vN]dR횀׾{8\^+p. f>stream h<10 EP`EMB*R_G2{OPA߫! [.OxhRPs1Rk*@57h V@F}r-$z1.z{`۞/O endstream endobj 115 0 obj <> endobj 116 0 obj <>stream h[[oF~ׯ#&s6fQݍ,SRr o3LND3g3_|dw׋,#vA02:I u@Bb~;\o~]^ .+C3Ih?? xu!H`KqBtvJ; 4g?`bLEc"rf0{)^u+my;+L~X"-{ob/TVH+ 8䧫҈a@|Mb)+cǺZD4z=ܓi8l 7&FUw0nml["d%Evr_X᳘~\Z5[K=¶V`fLl@ h  oOk!@Eil+ jh 5ڪܠRzpm9|F6BEpPE뭂P v(OnMT&dK{JD/Jo=m6@ZG l#*r6Oovt|QpqW xDsvD!5p`cgcbax2O<-j 8U+͇aKSW` 9SA7g#Sn??GЮ$'&h hA7eO_a*abL}A3?nG[G v"XpįږVmK\{V<[v:l=Z8،׻so}SOq O *4SKQ]c4*#|{,-dT}0s;ܝJc'lw> zx{&/NfD{ʱ`p~߬~)o~ 6YZ9YafwQ8|dФ_x^qxqhlŇ}c6x&OOTǪVQOY6/ e™z*K);pZZ^*fs)ƱZw7qZէH3eî{8zLo<wm.Q}ڢJ(uF!_h2Pt}Jey mtMT͘ogZYd;Npd;\++zuҫpt-׼f럤rgTsj8*f< 4-WTL5JĄs'4E.dAQC4{Ւ9俿JMaKuG%Yjzn˘zDSAa\[5 BjUdU} YU?gUU~VϪYU?gU UDYV?]VOlB󬬟e=!$C;zz eu^]=T($v [."CBj`I endstream endobj 117 0 obj <>stream h41 E@H E,m5*lU(bJzk$g{o4O=Ҿnf1IsSƊꗸֶ̹`y#hp (:&0ZB/'I / endstream endobj 118 0 obj <> endobj 119 0 obj <>stream h[oB_j2 lvMiYm%Jro.3HEA!߼7,W]_}|}dq}{E02z?z@Bb /st)Ƙտb+C^o?#̺+ۣ\ 0 ,4|)N^׻+ADq4]h\}ꯁϿ`bB M_! (8.{%!i߻; _ۇՈ"it¨а(%>|(*yUcJEtSKHq֧~ɒTV IDj PBE(*hBjɜ d4@  z^9=&GO9z*ʠK(ڻMM5~"uRѐLnJU10fYX,J jiFv,rJ  _0& Z>t`Rid}O1S7}$#gX# q!p!(YҎzsa+vH|1> &I~fz >l/88vE6 :l[vWxH'" 8{E{ g/e(nq@xX7[2F"z|υl;o CGW2$[i<-!>v'ۮkK\Wo7~ 𩻙g9Na߶:P&pM6q;,Z@ ӱH*F0hZKQa9^n,BL@!(s5|M+5`װ5[kBl$X$]t &ƒho*ΌT4|qn`0~2@ 9 zo2s!ڛG;1} |4"FcAAg*' f0X¢%| 5U}R2 /"m+}eAn:, ōd nT 7Mt5 YP7zC܃YE:kt4wJڗwBNS,N_ "vfx>N²,|](>#%΂}yC.!#Oav@(T2*y '$;qqlqe;ѰB\mW"*6(YXmRr-mD`Fi2#^o`nsE*bWSNvur gCT펫vu(Hfpz(b]iKdq(!-')#ˊ$ Vjȕ)>ēL^BnuX=Vp$"G2BB%R!EV|fqK*:+^chU.1jWN.!< w?.pȶ]Mo# ^|_XF]@`M#"j*Kz4U s]f j(6x?eKHIE,uW<׺tҽayol@m8#d8jI>nVK6{e^C-:RPs$,9qBUn_ZYXe6||X؊rvΛs+IO~cѿ/A@dNGvt l83vn&= HP>Vu8Vvv%~~JbJ͒n8U`.sr̨uɟ[TM&hDKū7s1c1pa{c6+Aڋ/[6~gfψxQv!LGXYά $Qg>dm~auw]b)g0bCu?ֹCM ycw+wV.)rQȰ9B诫ĉ@JRX=`'5pP\_ Iد=70=1t.fQ%ݱ'O9g~.-]mDh1 ;w~ᄜb<>!=_eH90/~T^WiRT>˞Έ|jK"6=3g7왑\ޯضa:aA>TFo~`1>I^^k*LI5RFg7!.kj^zݮoC&*m\*-1H0L=$d'L5.CߵYh.h"Z5mǾA"M4.۴kh_[#qLkqei v|oq7"79ֈFz3b{1{O|Pcd'a 5FS0a[ ǐ}{9Xa%ұ:Rb#B?nj1Bt{1bFhYCF@ 7MA؋]ݔ.K4 ~ʶG uN.ZS4SZ[c޴*,xlXjʼnmbELe]Dhcſ:}%]Vb2>gPCu |g)"gmhەk:m{=0K o}̻834Ϧ 7-z29nS#cdېL{)l!ӨNջ~`tX {8a.hCM7jut]Qj ҘbGv/6k{^,[!L֘ʣ= p4=l`6g3_nxd3jD3(wذjq EӬ?+n "̥l̐4@^2ALo#["&F%SFQY"J!# &di:l ع>jZؚT|>\.L燝q:io'i[(#u;pC='<7 %.Z/*'yh+zAhcSlXAgoRI endstream endobj 120 0 obj <>stream h41 E@ `"CU%J=5l1$LO9x\Dڨ%\L+s) :Y* S]4K/Jxdco<3׳1KY|;1 endstream endobj 121 0 obj <> endobj 122 0 obj <>stream hZY~_GҰ}b{uƖ+LnwqdP=Es9hөa`6YWV,nzCm\EIlB)p"i<{T>UMuSt%5 .L[y/^z|(dFP#f_Ku}HuqpnN?u!aǾt?eq.V, ?;-v;*{a-`jfc×Ϋ|` Q/`W4šf0++z VqԶ] t+P'k\+5hšI@ܼ $63g֘ffb^[s!lzrƅ%"t+P|ѵ8}̢kq 9(:tsz[cX[p!=!F uz~ o&TwYm2(k$ƻ-X= 7m̊`BWYa틍-f:Zqǐ|B]D+ "ծyt/Df8"Dw!Z;2"Z A%X/4P?#b)- nP_E<~q"/SOQ)M@huN*UVb7Qҋtsq‰LIbkD{ JEڢ;$4,Ϸ#Si— oՈCДCA43ښ*s^LRo7eS ;S4r+-})z[y{I.siU?4#b؋:̞.izW'{Be}x#P I|y02+slO!Uk2fh䳊% ߌh{z}V֔F69şiD8{+ WwrW?PF8yB:ڃٰm]w1|+ 0O{$_츠j0w&!'-dn74s:H}/;F8L͞O}{Ӗ*BG_<˻jkb>ZAO{2 S8HAk@(#\2sOIGst#w'"!-.͐N]Cذ%>o{+P.&hu."ȍ1_˝R.喤Nb_#+}lMEm8l-mz endstream endobj 123 0 obj <>stream h{i`TE[', [ Bd QD!@\*Eeu "0 J%: KWFte}Svhm%<9SUN[ z44*0}voXOQ(}!ZH,5eDUNd mﶴ%,&2>ֻǶj!!jqcF"Z:CBiq"zmy{Su}Q# nqWi^Ey#nľ'#-0q[918_OFy uChl1dKWS]Ew塖(<>i|P3P\fA? ۶Tc F:hsgJ͉BoyLh'HcVBh&./F:EQc*ECjMq4 eiXbO_3uLBuA9:}MSYT G## E6;R}h"-´G%2ndATLhdJUDЃX4cGuZ-t;Ie E-ԈBtPtz]fځo>\^^j"ZlC_RH3h't7E d39MN>K!dZNJ`lJh,UbX(ʺrܭ-6iBL)I^.- ԟ% bxB,2 _t~~B?eTל?S<%4clWQmwi/cO+:qⰌY*ZmQߢ0Z#kjy=e=N}ԟJi;}?&D1[,ϋ7{{o+MFQ_~&ɟ5Cku~=Jma60kƟhΚi=˩SP͸@MtMXF+0ocD߅f!A$65Zq#fYX,+  -Ȟ.s`9BYr܄-rHG yS-YK.jô$mFvNۭ}}}5[&=j64U{I)޼\kLU`ͱ>yJEs}#a dc}8B<0j0/95Fi'QIMjhŧZ]^N{Eh?n-h=Mnh.ʧ5_5.Z$ni8"{EN8mx+.D_#AOM7Dk{`*qB~hT/Xok/;+ bݍ+b8ǮJ-ƪ.a4[h x q\Gwځ߇1 ~jFS}/Ez8bL1Mƫ.R}{Ex07(:@ΐn+'k-x/'QLXϯ`m;qJMѣQh߃zaoD5ERFj!,'=?jzV 2}J`m%WBo1uBhЉ D9f%[ ƻ^#JBS b|)$e;+clHA5c x_Icޡ0'~}՛ȟ[ݺvӱeٗf$3#=]6)[%-[4OLh4IF ԯWNt2 ]2$%=5+39< #J>$Y&+Q|g؈~u>ɾɾJ1l`{'GT^NJO޾( OW֧7+7&:3ʣ X@rѴPٴOrIz*ܻOYro 1:P0OĤ̌<2@ɽ1ff^RsohX\I{oLrN)J<LMBYݝLHo)(9)31xD卩lfgdf6p~[/<06OTqT;%J F IQ2ԙLe:~1#Qy%e]9FJlg$9|f7L8zRj遴4V+s {x̌)SriG]cxVi$"F&>8 K8*dԲ$C7*e%+<#wsCFyEZtC2QSPj sn@O?S)T —-[t^JTi\fs tM?3- *++>#/,?ٗ_VR6Ҟ12\Y>+-+SJ{@btb eԫQ?EJJ'ru*4O(MШJŪ4dϽգ?ǧƪzŦ$XG;TO@ՂhC-@g 4'#>Q>Ce5@*0` <;uFG/fk]x,2c{B#9mC?:ZbsYE(] 5ڶ5,§aASD}}4@ƫ̣}a4/sׁ\Qu:Q+_2~7Q'ȯd:7|Lܯ.`Ol&LM^ C W/r46bij IO'&j>N ?)E3r0~EZ` |]h> տU܌wƉ+1E({a80cCy1￈5ϡl5@^ݙW ߡ.qoƘl^cBPzBյ4>Hv Y߀ A(:úatu0A Áf@[s]-duu&DNߢ~u*.2h ˠڅn(;{7S[XYBDžu# 5]#ot)9\==DrnGпHCt8t੢v}2.fX{ha}=b/-UW Xo4H4i*|r2~k"׶џGxMXD Q@'],"*!#OO] ?USoQ ҇W(%|&mD[#zMs!}3lwA fXw[~@ཁ`Gjs'= PH?#4-B?H}W{ )?Gql#*IX]4],=ڑZwVU{j>inwv{jcx=R'CJc]{*>:T2F޿P{fkV-1F']L&SF:l:A1Cx-j`Z4ػTڗN ]{}("+hs5AK-3Nj h'歰sn?.0|x<ƢJcJ1\7؇^O4=i3%X%rW㮫XcChl[;5thB͌Cki&#_'AWzgVAb/؋y;B^OlA6*)׋UE ˠ?} yٰ%CQGv[:P4`P:t9v@ Id ^ sX{K(W{=C`^V;B_3ˈU.wTFAAgT0cP U比qHqh@9+~U4M4_a+DMjW%JOnٯmtÞ 'N jRS^Y7c=C"PFm1,cXoa!o*߃6Eی8!??sS)-G×U>7.U^O NQQeߙWЧ9o7HW9_Gl̠1@ =C!Ϗ=1_o^t~{W lvt-Em=ƞo\@(}.Z1"ߊ^~=:|O}>Ͱ_\,~1?#x9*闄8+ls"oi/}Ihd\ǵ͍ө7'DZj ;瞻hOs=S6/gK*Pg3W7_VLC`+vr1{:q/|7zіᡲTh́nD5?Qa3ie3C# AQ/vM?mSeo4\'p#'vqŚ07<7_B;2ig hk1Vg"/e>Hg 7=!Hg+Hu9W|r/=5HO/qz# /H88[_@@zH9`6qF}OwA'/ s=֍pˍ; .z|~le7q5ط | -괭YƕeW,;ڮ9ധچ5[?~ e6#mYG{4l,?vmi588>SM;+vOh72٧9&hޫ=)ZesS㰽NlLHw&|8~puWɏw |P a}-L,J9i CUj r*6B('Z<~_:8o,YF}(U^(=t5m#ꄨTl(HdnH|j>ygݙd:p6M Pcgr27TluuZQ/^QnTgnr^ ?Sq?5 0.廑}wSߵZ%V"ү Q{GPۆw_0ùS(kS~G [A_=k*)|oBoqkS\vu)CJoGցzK>kl\}`h'RpϺa/uA?}<73^9}c;µ}IQWw2>=6Fc wYAZ ]B.lG7 .:&Fӟ v d {o{orվ'.o#01y=3y/="$՛ܯ R?ތV8rPorwJ4PVk7 (xrm EڗGm%θUC=8s@K TЩp`{6.aKs:[v(uGv% ue^\<6h- !o?q^ᨛ*tG/Oco1r- ]Lye׏jw.5vP6hь,k`.?zs&8~Ooν{?$ 9}s\N^ik|лozc6;vyCe<a0lC+S~ƺ\~oV]@_`;Weaߟ^bD}+]mjT"n\-g}2K5vja{/0l#o?t) ?b~y;D7joSuwaa.|ױj[7Ωw,¦wlPvmb;%'!%)X !\bvܱYfmu{l ^u񷚚GS&e;SD(({1/C>(3pޢ8.my:(L 9wP5$u.hmLq$Dotiotj6;S5|:[{ \j=}p6wm NzZeEZ5er=3q9nxyh3aGYb&"2=Ñ9J'g+`0hO//[F@R,F~mCU/_ ڰ8ulvLg.ʞM[O7eH^+C_hd[ `kHqCv@ 4m2E QQLncm5 Hv6AjM!ժ*ŕEU|6 *ԵF@j+ghb=E1}qE'+bescǨЮ*@څ`[H3/UCد"~v,υs!\4.?QW0}0.(EBNզt6)913^O5v> [KDUlr`۴l8OWEbzԣYloW?"7;$A͢(5zc^jpO +e/ȭ/dUEQQn7y`7͇;Y]Z[U{Tq=•jW?*7J܀&!ٔMWJ_Pf 3U*Pe> gʴZ uaV&A fh6{LnP &TDg bug|E=:ڤji+P5uq<%h1<0-&@qVd/ Ã$?{ynę].}סv, >kTv#$V:ead)'r3݇h͠n &V Ⱦ$X/;+_w74 4MQsT1hkdZ%'eGɥomeugAƠ 9m (|05k+R[{c>!WIކQ$~B)5+9\ɂ6w\ s)L-+%+3kKer|k|!WIh9A='{ }~I+TKU76G) B 4`:09=ppJL5)G)8JQ8JQ Rp*Rd9JQp(p%-G(G8 Q8 Qp(p@q~~p~pG8,ő,pd#Kqd# Y8|)8|ç8|ç8b Xp*XpĂ##Vd9Q jpT+jpTՊਖwk{rŲ,{,{`H4`:0`*V UJdy##8#8c8Vc8V(XX8V(ŝ 0oW<5>Q^+gvNÊN}KCk=Tt*(z'*D^zsbr`7F`;`n khmV%crs46զ&zʎ´t&=Uv;vo4;MlOi"7J^!te|#!(M䤶KzbCA`&d@ Uii(_oV h$>n7loĚ7QӦ-dT y9f77JDm+/bփn zBnYv>6Z7AAPIIih(D}rvZJz zpi&e* V~,t=}{0PO|:J1ݖ sh.ܥ/zפ.A]"%KeVz<rQM3}rw7;)+DUAS^bR(_¾EJ{EJ1{mKzs2ZTɩ i֏kf%[V 'SSxL48RcoQW鹏5ft $4,0Y V41F[cs؉1`CGH^+f$_l6dV bh_8>/l={]^W^U$1("w$XBPF7P ˪qCb6԰ړ8?KW$X5NXPq~9QjHM+[G0~$ j8F[ )z0#aJ2&Ʈ!cc.T^֖._+٬ Zfs 3kHܷ Dj'(#! 25r6b'1f#FK#X֑crGh\ZoE+[ҵ㒮k4VIk%Uר"Q"rTUE⾩uDc5K1Jnƪ$'{22AP,W' RUTUTE`*#UMGt-j4ZD $Trl\Ju<*ϕh൮r Ԑ(\֐z󠪭6e͖ѴR6"u3PNAp!Z8u07S08Κ G9Z;|r~+(W u{炆rx@ʖ"`vv*  sP70d)-Cv0Άn}Off)  BX'g>xi4?8; t#0)C _R*R.._D'[<~I LFZIbpl_A$v"g|rrLet%ok VtCO^YtyIO.ֱo!340Ȫyy}zL ?aJZO4ƧLP4j4. 1敗Q]Jok23rIS_I$>'^Cz35}Б0E9ve7d %_?>S3 '3'['nxC8r ooH !_o( C쐰6^lT@g{7(^)lF8: /i3P(^!K"Fcְa /1alwM8_Y锱BJSLi汉KxBc9C0ƩxPDPKKPqr߃,fH >bv͝DqNuG%܎al8fngCo|XyCx[[~8'ۃ= a/G5,ñޣ)Ѽ)mL”4|vLCSnDG=zxL[ĴbXe#<@tVҬ{졧SkG'~-XM>ܚVY[]Xd1јW6 6Q"a vCHoîG_K&'V»l>XdOWSO cloO۾K.Ƹ6fMY;/ٛ{ص/׺ #Fo4Ai!&r${5J`2_ΦVFX>bvYSs8l9Js䅪I^H6z?vM[ki߾sͶ+c8k{y [1 2'ƺ^WOx{Xaܭш&F^$EEվ?ϟ32Mv9#+lvN"ܔUQJ}I֛&c2:ᮌ0.* 1˓J 3Sh j%Fguwxv#6WedfM^l0] ]!ȾEtb)ga[%JXtl '@J:B 9BGgE!* kDHbL.PQe;X+z ^2F)l*b0CP[H郈=yEAFR8I9`ߚVnZo^GJxۏb!|= oޚ%K6?*ƋwfmˢzCoVRƃ.eT-^i@KA tu:P星_6PhȯsZ?-icNo yFd/2%%m%6Z')_  EKé@6M K&\);]\a.vI'\nR\ Spe^;)ل3}?#ᨚ)G}X>l VlS歩K t us$SILy""^h`$l/q&+<`3l| 1~{1:پ^G'wq_>z{#FgxSӏRWDjwl l@,jFeI6 aRxS8%9Bp0 ,!MtތúƱh)>%aƥIuXaslM tJ.E$/^X/#t& mM,M)a{a(`3pٞ 󉞤uG?]Lc0mmfgpX6jjMYNz o4pz2 HzgOz.75"@OC:Ȭd zr=L,y2wi8}Kr:o2a_Ydܛa}{,5 #>9g;gg^>u TbkqĜ{^3;IcѳC m!)GD+xw[Foa"ŝldRlvkaMr28` M'saݻwww?N]ؖ#_=rdx#d[B5yp~Md{{=y ^)K _-na߄˹Nߚ66q\ޗ,G_9-kNC\SI^rfN8ǁ2)3@dgV8CGY4slo˰WYLB4uFSs@C+t8EFv$BS(18.1i b-(Q6wb0SkrcwNᇤY2&od򎧨o|Xv.y>>zvg9rO=)+ۢܙ7dAg~EC^WvT_͈|ʢ  "a'+aH{vvGy@/L>r~9˪֞Of7zԿMP-hiXвytAußm\a5|@=#`-0`\dx9iIV%+%b'-Z^$6!iXJHtI13jh08uB.k@BwAz=*6qK|S<-H4DdD1!Q!1 p83y}|D $ǦJ"z'2\3vET|*0bG" uϤ./3os?|ON>fǓef_Xt7NH)?YHM6^)Rܓ_~M \ OPB *TPB *TPB *TPB *TPB *TPB *TPBX_+фnEN"A P:tMhQ-AKb]pw#3hSjP=5ըu  ̀_QuB]7յ?i9~eDߺ$wwx~#iF6<9>stream hLKk0[+ljBAC~vff a>'+g/Z]NcPjG#lCl eMhvCIS)ĩbDa)(B5YNKѻ0D뜔Y}TnM}`R6CqHng.qb GWXr\7},|p`|s1dv>,7󍶽5RXkb PR| )ٮ> endobj 126 0 obj <>stream h[Yo~篘ǡ> A@ $dAE%.djCJYOUspFfa, 2?|DzZd,[g3 oVj3#QŒ/ z߭YL3Sׇ&T4G`ζ $* F2fP\&F:byf%q:c(\_=/WBƜˌI4^JD#rɗ=b(G9]X4f-gV )l:8&\YrEl~x(NܐH9sa0ͫr%+qxgo1C(ѼlWY)XF`@ |<| #FgI!1I@3JA8 B #)+$|㔘`Owb^r+"ȪdUFei%G? Cd4㡍&fxʛ!LA>JTw%-f6K%a%8r?г< HӔ6 @Cj@+|ۛG?8P1J-޺gkᓁIo%|"~:NoƪZQ39 d1|>~`d&* f݄娚7F^eVt+.7-E}_y LX`erը%R7-hkS-IJcUT(>q)Fw DR9ƽJN٤qP4ue+'x3}[8'T6(>xgadP>|.T|LpXW<4s ;5x}&t^殣ōoʁZ1[b.r%|s6SC{VKkm [U&>~_lH[BQ-aEd`aS׊|+#66/Ь:=*NLΎ.%Vכۇ MP~CJi5 ъE)@}9mO)1_g(EYѾ߆M)J١U7Ktq?o^yN(k[orOM5f|ZxtRčP10GXU5e/ Jčo5-IxILvb̉0fPj,sGӑ]烘Ckj&WL1ozSSѾƜ% ͍ ϔk%c0рo$_1L+Q<-%Qtu.΋9Cx)AUHC\"_Ckޘ!X?`})XNǑG=ƽB&w 'ԑkZ' "R*.NH6x 8"/‡OFs*\Ad=XNSO]7^l뭄GsO0RL+(]cxF`\w\ĬH(6?Ӕ-7=<7<%ΙDjtb먐E?vOF jeuT18LżuϡKdn[BzY2gSD7P%:H{b1Wu2掴5UByB&=qk!>w'![xlg@a'II=ʋQ OT.s̨GGJ)EN8$!Q6H3)_q `Xq8zz U4#W PB@?=" NIۄSM$7Uud;7{IDduzFln1+57Ny]eOk-7cr^Wln&߱VqvyA^+Z\u)6ei}WXE_&HIEȉit煫QSgnȭ01} l8\& 䟠UċPHV+84@2q0&$FIg=aRZի9՝^k>8ÌN#R90ց46XI 6X;A/}w~r.fd2M!#Jr}I3I"i?;EfA$Jց0ޫy*@TESINHWn^< ؾ9{dꝸGm_pՄ#p&̯W|V.B*} װ¿.z^Q#RmX,A~DE4Uix&oacnm"ci:zj=Sپgɴ&WE9ibck ҡ/j;hvoJ|bB*-i}Z 7Dag7Q(᯺P _ߢr endstream endobj 127 0 obj <>stream h40 _oH( VDex:}g ^ pG*z^́v*e#e'cūee5ti8–Q/w>BM-bzO ,h endstream endobj 128 0 obj <> endobj 129 0 obj <>stream hZIoFWHd0tCڴCЃ,ѶGJEA}l)E(53o޾|ߒ\|Z^XB`dta(.v|X^c̖V$%24&}8?^%{1¬ +e)0\'D'fTZN7HDsddB?_01&Q"í aL",P9!HLE[ͦ(UŐaN!.jvaǻ>ˑNwO1ss"gYbrXZ#R)1 EzSZ ˆG`4FsFa lLl R2ZeMG37 VhN 0"+(X:n1S;]bBH(+ͽܝ%X@\=DK bp IվqcG@+L!nW)pbz)l_:$be+x ۡLsgpXc+{<-{eH3ZcѮ\]~8l6-Yf3Uk6Y\PMid[^"wY]zWl{60i֠ʯ=j;6##+I^ۧ]=fp6uݖ H@loviwܖ#pɁ`9j@R'v޻>?w_ 1K;X[pPY~(u8 CIc.z2̐Dz.&8C1&}.{DYzO5Q1UP2 *qdZd6 v1HYृAuS>1B|dЬnnDʇf}\(N7.ՄwʍbU#> h3"9֠h뿈ZQZ}xlḢ6hEKX6ek; f%xhFg&]@HATc^7%ʪ/sz; SנbE]n*t߆ |#]. : {ZX4]w )$dA5--lзΫ }EsBʾAq-_1m?  ˮaz[%3x}6ˡ>=Ut=oX!EhgjK 45p(e !+Eut6.kV1ff ۽o(+6:=}fJ na 8a6uY@"/Co "=PA.ad>/Q F6eˎ AjP^8Is(Ƙ bP[G;XC 2)w~MTt٠(A ^VVd_x.g q-fx%\K\L%&&LYX@V)j% ,Ig60L%E4O^rtHPMq.֑RZpU'0JX`` endstream endobj 130 0 obj <>stream h41 E@H E,m5*lU(bJzk$g{oQi_z4'Z9ul~˜;nnm 7z =|m3ʯ[*R}R/J/% endstream endobj 131 0 obj <> endobj 132 0 obj <>stream hZY"G~Wc19yݕlymVi,=:ۢaȸ#dٷՊe$[f#3 OZ 3Ê>kar| $~8ˎkYߕ2ۖbD or{ *$i922# 7W/G)AVPz0&*s>R B0, Òoۢ,Ovem* ܯvlQ( +iЈ|()1~(3+>,G,ّL} )m-ѱiJ 3iZTyח\ $o^.EYIs$bp!pS|.×ԕRkq+ z<qs?tI>=Z"R$4Wxy[u`sQ>I٭|S[@% F h3"I]7X?uU7MUUJ@ 0zJ8 ,(ih 5a5jG΅ Rk!0#!ZhA.]Fgu]dLqL t8D<%lnI"08'$DTpTZwbjL=_}I@m`61/BѴA} MۭuWhOO  M`faQz8b.*l-1 r #VҰ ׿*z`K.Hi3+/-ൃ}Ygogm=g>N`7.;ڴ"LA6Ij6 XG$u o9{ ga VskRhD'tgJ l@&;o^(Q-f m*XB/`݂X4:6"]@ň*x0u#) H*XŊ"r$]Iȕ.Zv 8xJ_v Br\G'^Ö#p0.8|O;5TX\h7ηCD*M+"- ySWWe&&8XC*&,T({a7C1 f 9)Dqe}7xn9LC|a߀)Zk.CFv \ #f3+1ﭺ|uƌ܈>;c%=Zl8m~0+(h{0ı2fe0nvwqz?BBjl0K*c"?zyڤJkϷFks-]Mbnj骗SuA;|u9^tPj؆>FN).sk3Xa2?hW&wWM_yt:ҊI=խ(Ot!zBHc*(zvb72 ~az;3-ebgFډt* a`1agVF|uli8^SDފ05?piDFK>p[bky3`cgH-ûWеtEDw.*W ˅D\22C:^HoDU*[tA6̂&&;`"#0;,qA p h"xe8܆L.+z=[I?\ͯjxퟚ g?̦Xe<c+x,>stream hLKk0ۃ+Ɋ- !:!D-+Eɿ̷&) I fsryt⚂39y :tdd$4˒u!Ip)c$fAq t*y Hb]L8ݺ ccŵ2Jo>0J)YEEa 2Y.1ʑ Y%fi~}m> endobj 135 0 obj <>stream h[Y~ׯIj}vmc ȃ7 fF3d'7)R$QfU}Uuӯ~xϲ7W77"cQlF_d63R)\Gxl?WWRq}+28iƳ5~8gBE[Wo:3"(ܐ(,ɘ͎Jq噕 p稿_ Is.3'0zE(eȥ*@{4jQr{vK`<wxe*A2\RVp?%7χ2e,dm}ע]=m%XF~ ʙ%2q8;4ZK'88Q*]]Ͽ|>a.lNp*WpҔB/@*Mjχ>Ԃ<p $H?&R>a@RNυQ:`ً0#&V-Zc#' (G (H)#Unf 'mI0~Nj9, ԋ ի |0BSio *`IT~26$7OOϛm9MG< Xa(@*~8IUh]\G{1@ʦqB5/HQ Lj-k?n;. -!gÄ.WAvn{nS5.»V7+y$*.|4elz}xsЉch!HC..Pq)L- ^ UZBB|]yibPrIo>yVĭ`% @aDΘ"0IږET\s@R;^31@XNd JDKb>{{'FE3PT H' a]Ʊ [.]+ތ$92is CwZ^*4qhP=eYzN#?nփLm=qEr;ZBpUNTa;chioU`"\io΄yvbUkA7N_s5kRL)v erzso%.Uu-~028Є-fQNUMͤs9Jˆ pN1`*q#^z tվU_#IJ֊)e.WݩtsW<"7w]>o^K=>#!GcƭS!Hm ?<=4-&! 4i~3-fA ̄۩^}1У6O:igQ$rO\uDoxTVæʘyݪ}ٳ&0S[M0̞'t+l{!&ួ0؀U5eƬOA \=Ut8LpPh%T::qRsA\~ ?eI3EMIِ56!V jI-n=]0M̜qA cq,Q ay~ :q%ۏoz)v $Fe"_sn5qsy $֜]:?C'X|I!|!D,nj\4eRHOV OD dLi&/%BmZ^^W[M0t2x F{(|mtW6«f Ui $Z7IhbClГL%5s9&8`9ӍMr?mM-=V+]GDet}D>stream h41 E 0HKd [!تr og[N %I꧞H|\$ܰ% dl7s"9zZ8  Ƃ`hHzOy<(Cb= ze.c 0{M4 endstream endobj 137 0 obj <> endobj 138 0 obj <>stream h[KWHac0@2 !d݃FxK$o>U )D04TŪ>}8-Z]DƲÂQlF_d63R)x6翋J]jv|o4Y7>|MIgSFE7#i_(#<81AX3/WBƜˌIt^JD'r`=:U0F(`: CٔnGP ℔a¢6pG??, bSy\{ 3Ə*Cۼr]VbZb,"A]O7e|dF)a_ctJb]J/XO)XF`€>P|PGδSĀ6I""!@L$3?KAhhGqFmZ{lo0R;-a R$('h?$KaYoR%H;6/ڑ8o@fj 5o㈆l(|)a ᥍ ]^ש4<BdxXH #.R ݦ\ NdC(D  vC!n@4UP~pSK,Ĉ5M!|YP >;VO( `& 95riEeͥ>] h8 HyMDzHhj*rpu^wwwM$2Xgc'Z(lbcCRPb-*8цA;U=Š" &#_E|m&X|haK>|߁Azc_u+PxtC[rШqُ l͹ J׭ɵGMp>qVYkUǶ"]FBs1K!4S8 oK>ǧ_;Kfw}6mRt$bؖz γhA@-l7$L4 cy.Mv %erB%ܻ&hCظlmĴ'gSƛ7"kvMCz͑&יwi?y0s43j*dECeG6^sTouP4]cȅӗ8YWskYhbx/sLms1IU5H8`⬷k\|?_,8UpkڣƔ'a tC1i'z [V;XIK'$:ʤ3_y)K԰Օ$΢787]TaW&ij&ԋ&ESDȼJ/4 L3ÔDͫ{ZiTI I:z0FTcX)-fG`ÌIjECM15«Co~1DJu)5-GG)(*6K64)䏘'9N-;68⧇;7d Xay96D M'~M $h$oDȉH+ ڭaNhTQDؚD.H8".HY hB30 H>xĆ7mBCM@C$(h$^}Qb/9uI W"D|6Z$U,\#EBM`6ڵը^OiR6|v"K ʾk.J/)mgCrڽ,DDj|n'FͱCEZ/B8tE'0 7v'^*zk'0#SE5l?tT-ܴF}Pʅ> :P9w ! ?>@L?D=ؼJ/0 L3!AAoLϼОiw0h6 µ쇢|J`  "Q>stream h41 E@ `"CU%J=5l$LO9x\Dڨ%\L+s) :Y* S]4K/Jxdco<3׳1KY|;1 endstream endobj 140 0 obj <> endobj 141 0 obj <>stream hXKoFWHfgڴPd8R*) ;|S[aФ43|^Uj9䫇 8.fVi 3k_kιY}~Xeg?"7 uU_3.zs03@vx 6%VyD&4~KyT j"q(-zr`s{Wg.!qɷM}8㝓2AiѝoCun4sdG3 $:^MQɛa d22,l<5Ltoκu$g\BCM&Sc`jb)֭jB+$XQW|Y@1%4ir3C]$ (5&6.vy 1/{FKpXIұĉfIҬxu*rLlh*t=+a{h:|#DN>GytyLO :u<'u<PE3Tbp2?D!h3']}< *`ǕK*Rc=V$ /*SM?y3xI!Wi*CbXwh;N` .]qĉx9G`Ɗ%h2ӎc71$, aq8bzuDzހ}Oءt3fw/lw/d~h^<"^7[|:Ea6j[ʋǷH 5Ht/~q-"P?K<އ3E7`y70A q749e/SG5Mȟyj0ʀ՗B'CYYT8ѫxˊ8Qk4,q,%E"P2[n<7z c=%D-Mrb쨣XDS u X$ɚ$Dqg+a qa_LMy-v ?KqeLR~ʺP9nH E̿"l{l."~ޗ?3%CYG+%M3ZaS] -)%~{F_卩/@0M쁱^WqSSDEїqv֎ 9īsx1\ZDcdx뿲+ʖ endstream endobj 142 0 obj <>stream h41 E@H E,m5*lU(bJzk$g{oٺ4O=Ҿnf1IsSƊꗸֶ̹`y#hp (:&0ZB/'I [/! endstream endobj 143 0 obj <> endobj 144 0 obj <>stream h[oF}Ն $KKDF?@X-$%n@6dp3#iq?rh͖73Zk~;#Ia2-$3gE^+0{R?[<{{Fuk2EY7r_I£g{]3 4pЂR63J%eF2ʉ7_~LKF@@) *P\9HJ-Q\s<3^nnxNHup9K$#Tr*FL;FMM!PxEiY`kC)#J3:)<|3a 24J͓y-B Mm`NFVUͤ*״``#> J4o ĉ9N޾e@vKl mD0R ,8͈kH .) K@90*$ R>'tb[%!Dl"I(h)D{q0@Yx &4ab<$Ȫ*%²b\)ԓze[A[x)K\j.eɮ5}+MZ;Rǟ dd B[zw]HNi%gD8JC@M>ЭU Ajs\` #uK8R2Y(ĜZɆիEaX/Ḃ 4G謸t]Cf.zDHg0xC9V!A\RBjxv0^|S:q%;NHgZ?zsE[l]{Xkx X s$ѽHQ yz[*:T!<NjQ;ysJtpbz'|QfET '"Y~0nM2STCE_y7_@KV "߷eʊ)Kvu( sv,|\ [Ty߯P;v_Ma5BU Om:ff8ڡb:1C}rOp[gW@SZc BҍX ];(\b9|;'ؑ|R]VǶfeqQ(ǥr[!f(m!eDXaߔpY6IFnGm'Ɲ>tۦգ"KuHvEF`ncMVo˟AC(#աW"D؈j)0V&M6syq}EaNDQ\l_4MFT(NV5X77#?) O~1h4 '~i 0 w^ `-wߵaXPbB Uwfb9!96rH iIK\Ѳ Ecy&, thcK IhStIqjG&a; Y腚q%45ԓeYWT{ vwBC6P۽zr*rؽaYFTIH:DpA%O*9à.ݲ-Q( ͩChIdȡ.J^D-rhk̠GaPEKqZ-_CPAuGc*ɵtf3E8l?وG&Z%*~\{l#OT#ϫI7 "\bl6( -pz~r;XypZQն,Qp<o[pi (Hv-' fL['$z Za yrs *{좧#M.k&%[.趬BxURW-5ҌFUPJ6?~P䔸<@P $0 A_B|:Na' !΀:"1*UW‰f!x/ڂ@bRD%ŖaawSnO[W&74oWsן/Sw4Y % >ɐ!wow>[כ]mLf[, t(LOXSK~vwsdEj{cuja'S6|h_֗Xт࠶g&GٴlDև)]j7W+&~_αA># .x-h:>ޕW4]z[!t_@#UNWChx۾`Sf{w}p=yw/>ڎcMx+\al͘m[iccqlyzv1Lр_WT\r]ެ7e?8?||"BsxL3AT Džq9y%O zK2Jmx*2ڍ_8jU]8A>R/Eo ap-ci5{͛}@L3NhZD@DI' mCDb8=;c0޿=\n|m鸱:Nd/=TWI#ǂ,&|9t/+)Rw:^r㕛a;(oE Mp-~ܸǩ[kFUXl$M~0Wݪ=%<S74.WE;ȏƚlkH1? Pk2 endstream endobj 145 0 obj <>stream h> endobj 147 0 obj <>stream h޼moߧw>К tm4NZ$Ji-l7{w a8;><.-t7{:F+}YQcu]{%_:{Ug/O}u/`rlAk(?2%}Tpϫcj{ Nz!$NџQCMRݺ._?ٛzI]8X1oH ѣuw%0& ۓ %5UZM MGM%c[y`ښ@v~Zim|BӧeGA;ZCÐp!B]E^/ýqx>@hσ+737|8;ןd/w<=}HmwAHÏҙzS]u}< :?`?<ܾO~"5ZDpv{Xߒ3jg8ab@k%psAʽ*5~#O<`[ߴ^_(1 'k}{݋l)<.Yihʰ0q:94Y5rP3` ]$޽;;4B? >DHݸ8#Aςր''IoaA;K 3t=u  FZ!`55|00АOz{3.Jvbdi(; pkG0ʪPr0#NN @ުM{04PGA(^<}P_ &sr?-Sgޟσ!dw`=N򺑈1y" -l ^_fe; {&Qn=-NLOw5>?qDot?.nsAx QoN 3lx5:LPE$ᘄӠk77A r81!GmB=o>><16v72:XۛRb d~[f$(ɛY41p˓l&<҅5bsǥ$远.BjWinŀb @ s] )t''Io!LvFVX8\d/ p銏OY9Hz 02cj P"\o?&`>zdaч@[vC&NRXv0pj8=@ p%K# ^Y~/fd[7n.=_/}q5GBCqNM'(Cv/Y}m~ScotakYJrr?-?->vQokYɢRzr;[r\~4p5\YTJR[2$15|9tO PNMG}Ϲ+EР}qq"|KPVz P\T]Ξ8h٘gle TaɉC[8X1IVVqM M^J"$hxS$ǣm1VQXvltU9ULBLIT7^B#q,pk\g(+'Io!$5z3!\ GjU WYQPeD -ާFgk_B_Tֹ -#5'd?fRD,Gz4(Ns0D!&Fզ.tѧD"UR zher(1jP)cN)SʉB[(ia,R/8Pf#k~Wf!-4_Q b0lQ)`%d jߘ >*=pZT:_/?J)#Ӧ U`{UiUY`* K3@JY9ګJŃ٭.h\l_T엥RNMREw.It1˃*ҙXB^B*) 1_3 Ĭ~t@:SʖrD0-lhUޣ8|lMc!sQ)֞.(_ӜߋY9Hz &99 8 8&Q{FdH5I %1r# 8 - jQmàkN @Ae [`q֞׮81/OP,0e L1G1c5D1*eؔS \l*$R$$cX{t{`S)%@SfT+ooezVr?BsĬ0WǪRtw3[0@gwGx.ݞ~0GNLۻ"Ax(qσ ]2|ST 8ϡ۳80'm]?k endstream endobj 148 0 obj <>stream h<1 E27@QL ښnca ;wH ^ q[H׀rX+MVJer5WS5mdɥSY~Re16qsb~‡koݥ/P endstream endobj 149 0 obj <> endobj 150 0 obj <>stream hZKoWH =~dAж65 oUwMJ` h(u_Xx\aZ%ل¿*Bmb"JS#|V[?[J[jKv 7'$/|I^* ||AaA01Bq剕 pQ~9,0\b'NP$**QLɔ?pLm$NHzSTV!ˊZXqU,!V0a@oכ:bt/( ʠwDyP'~B}%\C4pK.c(‰,sD.`gVںC^켠 Rj=irp ҟ7 DDBP@LqZ3v%KyQ`=2TDAi_EJc[t%8 gu 4tKӔtlj3F`4B%) D[C壏20;y,Q ԟԳk l~gAw>!ԩӍh:9{_1dw<ǚn@+¥PT֛W5y5&f9oDa 2@*1>*r#<%V7jh|h`"n2Ka묀l9WJEr%=Q@֏IWq@جfHaS(V>F+#KK/ilm7*nz[}zXfشXfDǥOjŽt.Y o9HnZ;ΑzV-f,UnOGƬ{_65jhI(&^t)#ƌs!B춶O%?Mn8lgE9RR`_Pқ8߆pP!{ ڥ=#1tr /4)ec!TE\kK4}aqJI[t<'9%ێX/m gZ^w؞H R\BG4}K ]N.JVJkחM~h C-Kkۇqh!93`>\7"! ^?v<-k=tUMedHiZ /z&|a m^6` "2k;*7PRg#@q 6,⮒4͋ Bb9` 3 aa <3*(qX1쑇'j^qv2|(=F|#̶X\0fFB~ 00d`WQn aMh"G"mbi+*\EQ]q΋NWkd(!ʁ0Po=yIH`V1 Nj$+cI0vR)9BgՍ[ʉBPL>Al`:6% r=+Ҡ]o mft@I\>!] _ >R^@,gU}IS]h|_wgv/Ws0UbF Ody9Apzr|>Gg1( jm}Vw߶Ǜ]c{4JN`|/s ѽ*a3 P ٜw;`J:هE[Fy(YcJ> 7bֶ endstream endobj 151 0 obj <>stream h4 0_e %k@i+tH:1[faA(TtsbĆ9yhR6/h1c:sˡlpÌh+XfJS0Z 0y) endstream endobj 152 0 obj <> endobj 153 0 obj <>stream hYKo7WqT n6 )kGA,">3$v vg>;=g/gϗKly?c8QPVv5Iۣ6nj E(XYIΘ ~~128qgR&Q\9HJ-4L غ/p~k*#q@Л"Yp.+:~XmX# QDhХ] NdtD54 kf0 hA+;zVR0{N;ךήF v&&&)dH4XSH8]t 7*6Tnuxj;( s\:_#jqMȒW}='MSBjIIk g0uHQ QjҞRPV{aIEUza1\/Hg_5s+Ɖ7r+ 9*nЇ#x'808Grgl %zLUlRGf#|BnG @0} ̲We %,e &=Y2/`HVTi:A+պ_֔# !f!àWZY:HZ'l+D/ t~p\Pꄴ@4y5* 1HW9J BŻM#^~*ƭm[ۚ~,(- '62DzͷƯqj VNk=!7š=ĢrK1C?Tb ^0q3qUy8~֗Bk%M+!.%aV;nڀd{sKD-= ֍Q޶<"c.oB?t_*%y>stream h41 E@H E,m5*lU(bJzk$g{o:Qi_z4'Z9ul~˜;nnm 7z =|m3ʯ[*R}R/K/% endstream endobj 155 0 obj <> endobj 156 0 obj <>stream h[n$}G), ;y1X3@VA+ϮH#GN|}K/ak3O밪9+4oWۭl~g5f5Vi wox ބg5\a_hn1 q}3㲏 `C$dk?pfK̉)M0/~5mxX-Wa TXęh}Xԅa ġo7 w=IZRQX aB2U`:|}; 3.Ub;f]0wDsow4uv{Jư.5s,A[KΥlֵZҵx: d|uv-[8D)=.Ë@4t¿+fl=8-jӃwWs|>r(| '(u e7=߻ Ů~Cv@~j 4#_j,}Ƃb.aLY}|bp[594|: ? Jz< -wC8* U(">yIy>r䝚6NѦz^7{́l$zn90cNg2]X+.'v ]p9/s)0סI0E~Eϯ"J?ʣ ]+e l`Eeɮ+jK(b&ކRUc-~4/z;E ~c-pt7hRm x{dZ3Lhf*JrV HB鎠e&eZ;Sjvxsv~w?j%'L.c3CHO&x{`TBw SQy*g<4TӸLjrxzOΒm~G⦻e0`IR,,U*lAc 5YSZ#n CK!x5?*a3>y'{ endstream endobj 157 0 obj <>stream h<10 E ei5٪eD=p|0[y#떫|- \!9J̱bLC> endobj 159 0 obj <>stream hZYE~q;}QRH"$@(B8`xMSLi7E[5UUWW_Ȋ/˥(X|7c8[P>YE-TDi +hk!T\-=]b[fXf˽b~MhJ@pACAE7#a)#8]0A7>/WBƜ+ItJD'J%`=:D2%`_77{\Sք>UjCRU0ѪVJ[ Z͍8A2ԀB-ep<"Œ+sqE~S43xڸPՀnW~=_H͇ ?zL$BJqAW&5@B>x+pJ` %8\C. \ P) ?rr 94\J"g DŽ=|a DOpxѷo^?o Ok:'>i(|B73M8TYskJzșĩ=NKl9~a.YB,` bڍYC嵼3ބr% s^gmk_vVT=̭XFXK,u{L(PNT(\ҀW Qyq8K)Ú̄rzӼ=8VS]s'X)O ʌ:Y VGuk9QӽeJGރtk vS8!Ppo]Š^@VF`m ^ؾg}Yz]W]:L}RpQ~/ަIl=O1^A(o %G n[`+ I2LgެgD#gG@ky( : oB<5׀ ֺB@y.T4+LYRmAH #vu,+Jܛɞhw呫ĝr\$=e2!ڄ jtVSȲ:YDOJJi<,tyU9n {f'؟Qٟi\tp%Q/]e´ 7g_VIg?ɁRO ۔(_-Js 0G@6Ä9'=#`gӦLyY-Z6Lug'Q"V_Zd^2MDOeljL!^üF8ك?C-r/5{ TXe3W W h7"lZ.@&9ew̿>Ò$8!?8F}rd7*WVnrנqAE Q΍RЙ(\Po(\8gPkÌ*-дvݤCp;}k{>}ՠ@ BL:9+/"B0٪Hɺv|fNɯ8p|Bw:iVfmL EbHBy8nor:n=4';B~\]\ T_;jՌba>stream h410 E$lB٪8>le[Ԡa#~{@YW@;f 7V)Nrie1zV1,VUၹn3ʯGH9.z{ 0/# endstream endobj 161 0 obj <> endobj 162 0 obj <>stream hZ[oG~5( jP[\qpjh{]Ҥ Bsf|߾dٛr)2-/gk2'# 5I8݌fo\?f'Rqcl9sƲmk3xp٫G.|MKP젲!#LvXf+gK 2&t/g?F~)0fm%'P9KΩ"˧~ήnL$NZPQ( !CEUޯ֛ڽKI$X<c@b֢ZܽB5*5KRŽ#ҵl4(׵D{*}ZWaBut@Ǭx c,8bns߮tN+lEW4+(H #8AHSP+PN RJŐ+L Nc@jB"dY3-&i|:gdmp!n1oRN%cWѢqkeKW|09'n]TlmV^+ 5B?>lQdfRJd) j6A ~Dk|.|_4`FikU ;%;gg UW &"¬/bz|)ėϿ[7)Q}EV6D0 Ws"P8`PY g k/8 ֏?̱|_f Y+tǏ^\6ꋃ m_ܧ\Jt7/|Ãαk=ܑ[s@(uݦ%QuмJ^0ͤ@ 6c^yZnGxi&&_rr_ [ $rg# B^juwY QTW3}O#{ݸ gو$:4'Q&!9tЌt (6X˧6JH;1ⶮ@ O^]\B3 # ^ j+cQIU QP(VGJE{{{(jdq@u^0P w(*%~S^}ǸM!Wm֫[}̙T鬒7*㈌6Ƹ1vy%!Ka%cXFv3%P6L5qsdol`\+K6'k>&8EOpi~_`+x9 endstream endobj 163 0 obj <>stream h41 EH E,m5*lU(bJzk$g{o٢Qi_z4'Z9i6VTeΚ[ߵ z =|m3ʯ[*R}R// endstream endobj 164 0 obj <> endobj 165 0 obj <>stream hZo7_#0 npȡ(ҫ}0 +r-IN!\Vqk.BZCg3Ù?arr+3F*Bma"JS0{,o J\{z9w|o/4_/mPѤACAHlqXogkHG,/$NLog?FeJH˜sQ8 3B)DGHL]~8?jwH0& HV! -Y7ȋU vY {ٿޮwxX@.pu9jx]ny/49[QΜ3W^ݶ%%y-|{SvwM-` :bt``' ӂB2^Y {&,Ix wr%SG+  Ws\ySUDL6T[2-t,xFr]]!SBS>lȏS"/_J~ʏqubH߯n^5ˈa'9 vwII˿|Xgw˺ynčj:H?I %LİBA1?ɭ}]s8 r=UTqWbh[aݼhoad;OBFz  Iџ=ZEEUzb5a#4WcRAS0-0tD< U(`^G;̛:+'CxψAiHT ,@.oB Xw@|_y2 ;ϻw1&dP/_`pv$hqv֓B+<^E=Ȼ k2 nNDIJެcc'>?:~go_'~_C ׈4x o qOA_"9a ? JgVNsΰa;p3lw*NrsvZl ؎7&N8~2lv)HHؼJ/l7@fjR0=jk}589m](w>%]yKMw\:">;QIcq 8/\@ꦡzd xv?mq>stream h<1 E@ `"CUJ=5t?۲AI\ʫDڨ%lL3sy) :Y S4;X6ltL#羁u({u) '7d endstream endobj 167 0 obj <> endobj 168 0 obj <>stream h[ b?hߴK /z^WmdTN3;Si8(>:̫v1.=JWZ+D0 jOTj b2J|}h)(ӧ1bAⰙ/$li+s UAmK>#/_/np7QS6^1IX#3 k5>y˫ WLN6x]BcZ?_.|Ib.1lv/zE9d56Yt8שe{i~}[Û]f!%+|x>Sܞ z Ҵ )O6(U\=uJ%O0#_!QsLgs EX7-;fo0xSa'pLs( 6I#7d$'?l5/n|@2, GD)#\|O4/svmӊ?膍;k~k{u.N9Qǜɢu1E\Mas^]~wo/ 4w&TqSʧe'Q>̢}\ws<ی;H`1S[dt)aF^?Uf:OA[8TȌ`JC_!b0dZpڑCNB;Wū.` AaitoaP?⦡2~n6ڋbdGzl'͠ST" 7ʯ~Js>>g<_>8 ~q gҝd/8#lB|$S^$LʆG1!w?|\fme-p.ld,yj|֏MyRG~ D,@uZ]Ȥ7ۏ nO ۄwg 1CŢcB :{|pL`sc`W$r%R/56/ LS"g/LϼzwX io5E0V2¢ăPX@aӗPX͡:J[ &Wq+onAQ0oP<*N&E@ B=Pf6Vj ]mֺ%5BwZj_̣DVt{Q ȑKmq4 aaPF2D wĔKm4~9˼0F Цz'o,})lC6~ovm2V4//o^^ݑi +evqȞV8$cx\y i(a_a0WyF?˘^+Θ*;:ZhmTA8cu P*N endstream endobj 169 0 obj <>stream h41 E@ `"CU%J=5lg[6A4[3۞+, l!EKY43/q: dh7-~q33/ֳ1KY|;4 endstream endobj 170 0 obj <> endobj 171 0 obj <>stream h޼[۸+rsyEIHۦ[fbƞl_CI%Ԉ,2ys,lؒ,7 K OZ $$+x7;1O,n.ȲX+C~(ſ<40J@I.w%bn~)N^vDq4]j\qD1K%(2.@n E"\ b W7]~:G{ES ysuN J+p^SVmWkDvZ{{5qgYOX!̼%DIPBƤVe?u^e݉6wkwӁhsՄ8ʺ=@SF]030{fxu{iyu1bZ՗|r))`l^^7x(VkdvX! t#8QCSiH4/hz@F1S~8dz\-fa<2j5ֲ_M HΠ󱼲`9ny(4fZv_ wu@NIcmWk% MOw*$],}:[$)+l3ˑmpqL2y\v_81uT䕑#jM4&׸8(*)fUlx.ɠwWkFE KmV$D4+W~lWij ̺1c95BTU?K\V }^m)R8!]AܫoB_a[-o媩P @S T#P^ۻ4R*TԼWun+1d6x{546k kEUbF9t?9[M$Յ&\U5=l ~_<չ\'H=(Tt᤿ Kgi|l)CC<ɮz-|vf}ߺHgAuc]5>mUʔn>#X&5xRp.QT࿳5^-},r.nhvmӲISsh&lPrDD@J @>ӱM̰DJVCq(`Jg1%1=C'O@kex2mM*%\3P{ 0m ‡)䎁0ի__e6u'Ng-c63Ch$Mj~ b"J}UJ(A h2A% vPZqnJkUIߊD:­4OCO& ܠS)%{qsEdD%.XR*lJ{@D'O 휇|+QMݢ7\SטH&$ćDq[B1q&#&;&tYu੎C"S#xp).}T$e\Sg2'ip&vbQn~'(LB9r{¥}vV[wUBrS\R$ |{:s$> 'Oe;ذߖ*]yq v,u7~n"(_3&x ({ЀD p;0N_"3DͥDCTYXvzn?vdvQdk8V IShM<0aLLrGS܇qeɓ[y<Wu)MTW9(w<# vO/Ǧ4;Q>wt9 9>C%S,"7Q2[f-M+N C]|>{"lWg߬l 9yS/``F$9jL .#Y rjLm_{d[2<!/hۛ]ųӬQ&f0=g2>0i`v6lj6压p[}Vp֞ΊeAB@N)*kv*}]3d~b;NA~yV&$y YB?Fɘ}UٷR Wt`'R~P8y NFdmTP/"qKC9 6- &cP|M2*H €Š<҄oi(UHK?8dTjV&bV"2i25l1@P>_ 'O \b91QEYĵ?@L<"uPSidt@Ay _JNp{!ZuV' oJ ӇrD&~#CbqH#pHád\AC)H u-ݜYʍŒ6!"xbf`6=0q ?fV;ǻa߼VT7iTӑqXʁMb+` ఎ^4M^S8DwՕӽ'-7=bmap}}5 =aQ{Fk0^*X+Z7TVע8r 0|,, endstream endobj 172 0 obj <>stream h< _eEq114栻\a En\ນoNN{r52F7͖Ve%vѹW]5F,K.KT$s͌5erzze7}y/O endstream endobj 173 0 obj <> endobj 174 0 obj <>stream h̛msS]燙NgdcǩL:yAV$Jo=iO*;6?pDvNVsWSo|EyO񉉵q=X6 C]^oOeoUet7Z5G$o*h6oDiMnvUt:JE,croՔ͛nH dCεAY- ب>n;}ℎ򑼡1x1񪖲 \?7[6c7 F<^ٖ@cFq'JϿt^Ohm⚵$eݡ;I> !ӃIf-;)FKK,vL iratM!ŨAYc"5Ҍs ^4fwIN'j7!&zvMl/a7zH[ԇ('7eo5M&|њ6Ѯcx%Q ZbHC>6hR,>OЅ{+QӥnV JOI/~npٷqCBd䕉r,jeMt|A ;.pDHyW3,AЙdO> 0Nrj7cp%{A/k*<֏~wH|`t_ W}K2g3ל{z34nJQ1" !t(C:!8CiM@%AL.zy?i 4'u dCIձfF !{^Q{g}c<![Ė0[0F0 ^7Ax3A>-_8T~V)v l֙<~ճW=R?#Jicn&wϖ/VKRu3lE%L0aX_i4/PԊbg) !Wz)үF2cPӒVgF(<$`FL1ck!j *;Ɛ e81oR ;Dd'fQ[wӵ{'vΒn NwX6o"(,PqERA7 #xMgGWweeLi ~' Nl]ޥ= v1kttrld̨6F ҁcn_D]0/7q*MM蔗"gN닺.5Pd%m (4*>^j@՚/(> H>WXeTxE{[kϿHe Pڬw^Jo!k9mP{rP"T/ݨҧ1ZNˋ>&#7ԽwMO`h1m'kyb)<՚Ops,'uJX{ޜR;#g5  Pvt{ DC + //8>煠zwCs;Y=sU f ~d ~\u뵻eWr P܆VPݳtSLQ7=po92?(x܎tn#%|O39.%ק@Iݫ&ysN$c_q&E$WWca355NmpI =NL8>;ly&x)<]Apb0{@9Ɖ -/af)O`ɠFʫ:8'Y;ܞƼ) 4e)XRm?|IA]N4K̚`E, )z K>!q_|*w˙;E6͕]1b[mnyL {ly} 6_q}mr􋒃 Y+*ѡܦpが)w0=8L>V'%2TcCMJ ' Ӭ,1cCdO+KݱEJf|(3>i\|P#tόk>/E0] iI4!U$'8 &E>" )![g$@~5qn'81\a$x=F< )$̠WCHH1Cw^MP>%DT/)Vsb_ #5F>YٗF8PRKP#tSj*t :z?X=OQ)vg?d6!b);ro^ϣμ(k'3/GysyJ E Lab)0;r- HSSF8&4ʘ=pE;6g3۷~P<\ɞ* VE"8q Q|،YwVbaJRm*`{KIpmĆi>lcM^7&䐍. GҘj袼RRс [{orY{屸pAc9/:lwة@[Z>UDe]Q݋UѸVK9+e 9-vi|;s'o'xC endstream endobj 175 0 obj <>stream h< E?0Unzt-"E͢oiw90#$ {:3eG,QDke1N/X;b="k(C`hۦ28Qde+ヶg\NR746c>,'; endstream endobj 176 0 obj <> endobj 177 0 obj <>stream h[[۶~_IBe*Kgדc'ήK>(U}@ Ӵ\ϿÓ9FV'S& xB5/?OWB?}|~l&{D`2MrѺ_dySa&e~ʼn0+LLK`r3շn{c'T3Uff SXLIC7W3/|r|mxM5e~Iդo֛X38W3*S$h6^>6WtS6/Ow/fy+ EFJ=b")x`TPKdQý K$+HaL>}ĪIa/{$xZkR~I%A)I +P3Rã3peR1`S!9^^>"DEJ >YXJ<1,KCh")%͏ 0][TD7$v[/")U[C׋luʚ U@*0>ou/ nkүwẸbh `OhY MAUΐ{@| lڍ(br X'[9_?{ܾ|q7HUR9N{PCr3כ`UAbXf.?f}5^ axnw D=r?qHAUʱYِ#{d| R__g d9ũJqb{[f$7~"/0'_-ˡJz C@=Y# jO(N>aZ9x. (]q Cu! !Ћ;EͶDP$7qy.ðJ:ގ  A|+rH> : =!`+*[$wϏc`SRɲ?`}ū:kuF)`!q:2=,1H%C%F4 !$d=| pd^L5ЛtoRpmIARhzbx8'Lp2Zrωsp@o6bͳpP13Z$)dY=*DqNun_\_,E:J眚,&LH~Q8 =b/BqH^0 ?*OV} DZDQ:$4p!1H@Se8@r8@s|}@2:?FĎ?DJWP=^>~ȝh}1G,ܲӾ(:B2:><9 !ދG :Đn`?a3B0=%/)m=nu{{Cr1&<QV-j{n?S|2$Q$Rat:)"t_lܝQDj3c͸s$$1܌ ʑ[a5lM'fwX 7jp5֯~a.B0kՇ|;֋ =![^8s߈%Sx7%Jg%M2HVHur?er=En76(L-D:kn~A'AHIcHy͹}Vm^w0 ) g~8]桔KFE$!2 8zAvbV naMtx6:w᜻u)}NN|;0Ad! l7GA0Ν.$c"@:C;Cs9 P@O I*J@ZFsE8:ucX bس" p;wKnxЛ*% TPcQy_ 1 Px;w7[&2<ՎbBP%Šq!(wd8ǰ-JlyﶻqQ@` .P(PbR1&́!b FbP9{x@&XKq>'sa0 ?!ޟxD !}vUǠpc`90PX0(T=|  !C9 ƹ._@Ģx5#S4Br0…wY4\B_3\ j Ŗ GȠܳ"$10/uJV8A,'6&)9kC.(TR .e?Jl(%8u5Ŀmtvꣃ5BhhA3!R5WxJY{ք5^^"-bю/Exgf%XsD6Jݗ=6MrӇX|zzQR(>d^ 4k8?Hy<b>hVp@QM[L\hN!}1)' ς0\ ,tʫX:;,C 'r8wUb->*dMs&y`?(5z켎+ ;ܖ4kg)dzDD|*doy}X΁?O@Zqxվ)ꊒ#ic`7s]Y}e^P_՞ MMl75SS%YlR;UxRHqZ)b[J7ݱ+'8v?Vˢw74_<4Jb]J9w )AٰE&O}sU s:hUvcLxtϽ˫ I.~PJk0d&Ppj,U6M(?nya#7[@b51LΨylyVAZ[T,pɹʂܭ~Cd<\ B[j\dTɳ~$ jd;:B5Eylb`BR=E:J<˺$l3Wus7"ɶ|35Uώ?k|P!֖(҈ vɖVö k87ao_1ռV w%^ꢹ<%/O,{8rz9)`wKftϫ, :7`͋ôudL $ۛ֏u SƦ][ aw4gؐF1`8`S`Pa 1/$fd\Ɏ؀ݡ55dclь&'[W] e @\C灺sF-,K&R#*bUc]..sN[0Lt,$C; X4p؟IٱҮ6UjB$%vĭO̵&͊hZ!%shaN{cfĀKފKs `_u<+,'/ h(BQD+WA *;W { `<7EK[LDs'S l1b na =J3mRaU?9.bi ͡$MCwXl[1FnX[e]!n:ӭ6)t\qlAEj޷p~ D8o>3KV-p{%dt=,C(H}#Nՙ$ui|sѠʥ췋|QtC+_o/31&<ݿoE.;wEkgdBY-?vδ}8;W4+*QW`OhD endstream endobj 178 0 obj <>stream h<1 0 E8vbˆm[RTC_nzEWgJā=Fu;hNR3slǜ5kk;c{B@)zy =rT.=c 0:2 endstream endobj 179 0 obj <> endobj 180 0 obj <>stream hZ B&ܼ5"~{ne'_R3f EJ6g8IşYrW^oV/6dsb8PwVj#QˆMV(jfK nO4oNǯPѦśB'"!‚DQeb$c6)v%1+ D_rX~%$a̹(ND@IT"4Q!LS7oWkˆov(;X#%R%40qSzekITZd|.`1#\SV Q"K#h ȁDLL=t60@TrJI㎡-*%s@0(FЊkU\2>OKOo_ͶĠӦD {G=:%֪j~b xzL?FGl$C$o/e=hvaVx=o RS)a篻@cp)z6,y&dϵQ*k0c5(=52&Mro.gH܊1aY.| Bя{ E_bK6)=ZmaSfՔjgmOF&OŴIȡ\#Q"7(QzyɟɟL(+ pG(( &)B,&WF2ù&,pWk)1gcġal)REN V$&ƙh>ԓF aֈ ѥ?Jz01X6 khh z ]ZE(Q\t*RJwp *2v~pd%(x'VZlД!W1\%)8>ʡޔ D4mro0#ǘ N,:WcF-wKhxڼԄ/+0ȫN 6VavQ6qr(Tv)r)#Gq(j\5){xR lZQzQݙVku4jH J"i6G#F#l|9Ml 'gQӁ9ow`hje L3 姞Y"rSxmKGfD,BV@1\fQPOOvj!?T,B /9rsUf䞁cjnxwH_A\˶:;^֗*%m\zT^dX18,Y~wb+l> 3ўU~ : hQ xKYdɦsb nЙᮿdĥCiPeS#mBsb/7⺽5"\eem0!]Ms%Vq+Yβ-h:dY)gK)A:e]GtQw2gU~:O͌nyY#墐 +墐'B9PtB mj^Pe\!ƙ0SOf`^. jQ t,$GF @/ +#w. 䉲PM( Әa3ZY1 k(%sGb IQ:%ܲ5hO'3g't2Iha@8=, % #XfJ7П腶4cHLp+i;+sodV$I4%݉0`;v'*GB~b72<נ5z RP/>a R=,|^-ť{3ͬR.(| %/]Tgw{\ťWX㡫 mK 79*7FͪIiwF1TRq`]eɜlO@. Z<&{Bf Y%|TI3!8-G f`ѱ|nSOx7Sl-HWJ#"ق>mUR!f)HIM-A+ԅ{#w< C1.x"K:fwݶO̦٘!bC6RӉb~z4qS?G=R-{%$a?WG]CAu* SI!A65SjǤ3s9ZL9|2[T)OFWgfޛM]"Y[8ވW>1O_ <~vSi~OC~~Ze;ӵ#8wuJW?myi5  0%w endstream endobj 181 0 obj <>stream h4 _oM֨U*Q!_#;, "h&u+rcsđ3hQ-K)s)u:]*&"2 |bGvvgFx=3zUC 01 endstream endobj 182 0 obj <> endobj 183 0 obj <>stream h[[s~#Y!&&m]e-6SYrE9}!9;i&#G뇃 /ʫoW_t+")gRj!G\U|6MSnՇXRd2nW`oKؔ DSBSdE]q" 'iB1SWpa9ecBi"x Va&9 07,ݝyE2fѨ0ysr+xR.yyx19c7,,+04ԊQ@b*AJ+]I`$Y`RfiU)7DլTJLE%۔JonIUBWK#zKbY$15, /ob0Q4{Ʀ6# 4IVvgP)PgqrS}+lJ `˜(bRwH:je}AG}1zG #hgaOlp P9vP~nw ?sNLh=FO>3k:%u#np`C<]- Mbߑzj"mPP΁,o}a PF>`GK4oxɎ) ;[0/bo#f(Y}eeV=-/AtLYWequ]v.wl aQކQ?;|͎cH77k+C8prpjRظ?'SS0d'2>'a U% 65 =<$`R9;Ǚ~14 *h`D#1D4xSR')uyee_㨔]2|Ơn^(=u kvSO+sKȊ~Hf t*_IY2?!b#_NM(fe\A.!%i\ċޮ*Al̖lsDl)/v8!D/B02FN 2&,$q/'.j]Ђ@|gl, 5dqI]`)x",6>~ʯWpWlVhzVcjC2H2xg~m_҆U\ে=s]U.4SM{ϐtuPbJ`#Td"dsDeh4Ԫ~`VE 6g6ﯛ!*r)T7PA/K܁jD$O͗tJXJt*q 1~ A=O`Pt.sI󘒌95u§bCw3%x04 b#L'bZz&Ҥ%ag '_W-jmNG35"u(e#=Y s&ɲ|ώyg6^Boh7/PEy8ĩ1]Ov)r@c!5jR|eXO= &Mdߠr"iI'+a};懀ĺv<*zS9q&v-5,OUZQsc]tRDavZ1\Ɯ2XkoopJKVw>r-e;fb_q`8,XRdVr2'A"Q 0w^Ie_?٤Z3~.[Ԝ>W6!{xqlŸ~ WXO=_+Xb`u2SLg 0]*{`vњ(a/IYg 3,5fj1ҙz"F8z3Tv呇J2K>Z?HcV9"*j+r>#rbAaMa$[=fb]`ζ<G4q(0x֎i I)Ρs wJ"ZGy^.22z?k)!g=1{gK9 L'KZUTVSf~Nn&dǼ Ldf hh H;!|Q4kxoѼ96)XB.|t3HOº+0>3'CӀ%(0Qz,F[T=R5a=}뱾ɱi!<'/.^kEyd8z4~w~)*OgہM6BaN Rڲ҆=/|U(GJĒ3Qs.5;^zޜJ4_)%!2s:ʓc;6bN$ߘ |$mҜa{( &Nuyt{=$=]u113uzڻtj(Aﹿ)nmC\A,˩lk W8z3 "(o/V^Θ__T> 57zcΙ]x/@_^H H< B|&{~Г X؈$BiÁ1 H'E^Ý~1*0q):#*e#Kq@QR*wIg̪ vz%g?=cNSe"@მh@)Mk(>stream h40 _oH( VDex:}g٠ }w#vrYW@;22x겲:׈4pˌjaq(;!ѦqR1=',j endstream endobj 185 0 obj <> endobj 186 0 obj <>stream hێ_GX3  Hx'{(REJdR$ dz&ut7~xP}Z9g8EZS8J\2Ha,?g1y6MSnij ws]j2̗gJǗV/q\Me*bU/)M>gy % l9t|P'sadPPؚ+1(&B4"dMH4BO!SlzMa?럍Xp$)P /G2ợɲqb)R^qM:iM)p\/m:Q*P#`],d4jKSu񈴩EK+BN)$880mHdF= c)F ?/5̇dU9T<"&x9_Bv\x~H z=&?CZt|Զ%#~kRqϛ9B$)$sghtTLI){w@q"P>h>P\X5cƑ)h`}5^0cAc .^@eB# ζ|rrLiJwy-L;o\4T*)Do. o X ^ph5M\]ʘ=%{wߊϒj!YFQD*DYp37 @\/Q!Эoo0T B.nhhZj/|7Ox[y<[G#tyٌnv4DޜK|G5B$kjD@[CƘGg> (^55؈r!.u u4c' Ijl3Z2bxan-4قdM 5Aa59C{rZYU{gڜByc`w(A$msF4̹N6xsf+= H;Q=gM]dO~:Fk{3V<YL=S؍}>{>stream h4;07q6"7@F"wEϳt3oVؓi2*Gl{G`n,Q6e 2`L:ںBZKT:܃Y}<7~=> endobj 189 0 obj <>stream h޴XYo6~ׯУTxއaEP}Ykכc!c)^iYH^&nXE.c8S OVjs#QŒpsvC)wُ쟌sx‡&?ׄx}mAaCp317cFMtJtQ~+! cFq$IQhQjeF f ^v[5lj=S8!e!(7f_$QESpV +0@gS@1:+bx$2P0/RZek;D{Mn0J]ܮQ/ a[D@9kiOWH躀GzɱvsFVd z0rh qE(2T 6F"8C/l\*A=W9Gqq};4`|ڀYF ܺ~$" Vxp9x- {'os';zkn P(\:qr%.,2؆ᖜ=aKj[5t H t .HHdkM( ?J*oB={ǿͤ 0`7n:u K w8>]Zq8zk7r]PztPv͡DKKtq5O+D+$ cO*Tv_/a)Mq.)zOz T6F/ 64DR֢ԣR96TԢ JdQWS2,w2>#_xr%QKTQBǢƚ3t l"XwC]rJR8(*P ^a.9T|ZKj._S0w* K yPN!qz KFfi- }rlmLjSCRx:ZfqXFҧWiwP]G M9x)^} ٖG2wQl(\,$~Nv ]=Y؁ Tu)ewP\A b0( u8ʘaks'eKM[ 4)pd-Jiu'v-n>)acН ϋc860zsȧؔ\ڿ[}v%xlʉbl<0WK|@lHWpr;Ξ/SSU* %;\q]b4 endstream endobj 190 0 obj <>stream h41 E@H E,m5*lU(bJzk$g{o[A8[#VZ9@> endobj 192 0 obj <>stream h[[~p*kx'`$ Af]aG3mM}HHǻA 4x-\yO8v5{Z9f8EZS~Rj.G\png6g_iJ߭~}k9|/5 LK~Rڽ~wqh /D< H'p"FCZ1E<7)Ck= ͌ )fFDpoZJꏳ%a;Yq776HSݥ>jU4 B1w}HNbObƕ)JONBRM鎢Ji/Ϡ 19r"X@ ѣR%LjA֩#EtI=|IIi6;e1@,*یPa،y*_z(yL182@y>mKhRkH ZخwGInv*1XSt)! tȳ۷χSCTYo}m;j\RzX H*(b [9=x2bD9'QJwj4Uӡl !kU_|Cϔ^ ) 8|4Jj6z'y4طL.Ȉe.YTB ;=as;Kjz|;ҒQ:ڽ*ɼJb^f 9 >bwXW9 UɊi_S'Q:V5QS5]͍/\c~^sADV{E~\,uSU4F\gM10LjI)b=U'mي&~6{$4 kQ߄ Ň`DQjB-r#o%(*f}}) hgSe~ѓ觲UMe۾7x{:^::ز>l4yq걤Ѽ˧ɶOB0BfogQC=>}6{?]H0逗Q‮o٘w>|O)P$x2dQqX9&x18nU 8t1O=VD-cgHM|A>YFKԺnk7wg{ rO((yp[ǫZWڒsДʵ7p|#4JIulxBee 6vd7 k[~jM5]eUb7D_q6]|N]o#$uݝ}tWXqr)**^Nۦ ^j!d^.jN* )_s߸i n>xh} 0e:L4l%mNyH*e|SmD]n̳$f1;MktcmQVfw ~;'i`I83v0&Ş[|ϾMk;ƠHOf+f?/gbBtqnۏ~;kX:JZn0p,a:!uB-[kl`tvfkt /¿b?6恂*Sř j)-;;\ ttcpHq ngt>צq3A@K v0LJrk>7|6&8j$,NNvR& x;O̮_7ӶDq3X4L)m.Fұ`l$vlRvg פ\(?5:bVJ(bG6")'uپ*D+ȜQ|iBmS'l pHD~+FjB&HkFG'ЊhjKt':F/|?iK6T)({m1D/'6O87>'(oJݨeupqN ݝZm@1߆hq?px7g.?(|(|AڦӨKnc8:bN6*R Tp1l4Ex+-AYF- FY@ޘ|܀˛͵%Lg|;p+t)]h9j:?"Ez85suF[`g} Ϗ9X{Df<9YಅS9T21;2+eoSta~. }Zbrn7vstpWn sPixK),ߥb+B9NYw@CPlE/v H|S/Hd p5\RW'=}m)bX+Sȴ.¹(HxgY E}" 4l+tlU"JF%{eXQ*OO6cLi۸9گʯ~/bDbPkλ_I/Sei sj)5g\7[944kd{Wo{? R# endstream endobj 193 0 obj <>stream h41 E `"CU%J=5lq&q+rcsđ3hQ-K\L+s)I^P* S]4K/ju'ȌkxflgcXHw1 endstream endobj 194 0 obj <> endobj 195 0 obj <>stream hZY~ׯ#}1ń5@fF~z_k#Ne\m}I0hCNQ.%t"-tGG@R}wjI$i[ 1jIFg6l$5^is(?*_g}2V"o^YJ:AO4Ơ/1~v|twkCʪ0r6/\HзLy}5Pׂd‹˪l ]NQsɊcH`>w;}QsiaN* [/m#* !.lнٮ"H^@W'@ HH3NCRJg ~H1JgyX6!R36ԗߖ$,HO_ f.qS=y]+J/FBw[؊Hٵ˫q\+K-TBo wvc@"mOQ-) OHyiZ^jS>b#bS-wuwШ\<jyٚ^@ڮ?.eL%Tկ(S1jϧ}Iɞ|t,w|Ȉk+:`[^~ Sv" >+>Wĵi_gg9u ƄPn,לMʳ-RytU6,'%.#LFs4(+ڔWrߨ';F7ڗ~K}8\b3e Jp25SZVKBJAwsNoC^Qq]_ԋ7%_D~s((n1sl4}((>2 ևyќI ƿkÇPsk/W nO]S49KyICdD3AqA 8T\a#xR l~_2׿4iw\q;evr`eȜFŊ~jjzAϫm<635H16XǾ0(B˼^m^Upr(k 9e88KLzXSҞ*?G?߂ǼWס&s>6$)4 ]ص H1^ZFnrZbr(vqNeHȟv1HTDJs 5$vw>۷ "_LG"ԾĐ֞RSy<8t60"@t wQɳ?EʺPOXWF9>WE(6&Fhxkڗc;C`ߎtNqeu~^q 0}`ޯ`t endstream endobj 196 0 obj <>stream h410 E ei +"PU 8~ 2~8 tzO㶬 ? -):hiX1b%>TkAW`}#tFeFac;e~3j|*!,g endstream endobj 197 0 obj <> endobj 198 0 obj <>stream h[Yܶ~_1o<4qT"ىRʱ։fgI͡\;_W7^=l_h|7hq_^k@+J.2g~,BP2'W_o_eZw#Xꟿ_͟ӌ)@Er ^I&(BrQnW sAU*BT")]ݮ"B0*7J Q%^oj%SG_>jSwQE#v%)ƴYYK9f٤#L Xs## *YqI-$>`Xe",e`n]T`͖%MrZpTWz/gFa9349} iY̺v*/}09̇Y+yTOI1/Om4SbrRl$8g;h,?瑱e&żJ#HOF*zeF6Ea稅1 >T05`aWHFJ!_o ˜Ͳ* Dnj 0X)g;o+gΨ<aQ݊f)֦aԓ/cU F:d : `=bC<"F9ZG\Ǻ4T6'j"S1d$snt+l=&Ansh K4a.0#AjjlIO)<pt+0,s=<@c΂167„3$vEnb QVXgUj t`4q~;hr]{RHoi`)Mm#VwK#l3/p< { qsrdhWDeՎҞ,if&)APRdBIu iTHP6u]a3UM>ڥMVAo#JHqRGbLKk.bYC?XMa֫ѮPJ7k)/{tF`5elrl=\G|L>vX^ބ31۵8 r1[:P>R17A45a`=iGrdfw\ ^=hɓbtO%y&C+xj:kE(^o=DT'`8)H[#@ @lѣm) e\Wu}ȒC.YXZ)Sp`h,)Z"(S$0PM%kVҙ$3T)*)> Iz>BTNv%]WF)C|j>NtTnv$sGca}b8X >=>{O|RD&rHjqn";:z;T+Al?nN"*k>fUs}b㕛Nc_E eޫ"C}W‡J4م{ i2FZn";9z4Ҩ"Θ׫ںۯyi̋$I"23T$U;ޗ~[nrԅ-U(( 6Hm(3 :wz0sꅬ˺98E↶`:v“V:>}''u|!_,UpX)ru %^!/&64j-ǀ0fd !֒tk!Ϗ؛d]Uֺj]yy"MS, "pmÛ$9P;b(bt ١aG렏nE~AG{/Z ?F9 ]N{!`Wsjf(_fdz GkM;kta㱇H .AI%͒AxUoox~Ƀ|Iڊ(7vzwag2)8.4F[0On=ߑ^K]4@u(u$'vT=#:ѳ213;"HJjxS,ɩ ݂-DvhshHTfW/:bmDF73Bb0q]cfCADTmjʝ93ޑ9vׁ0AA\nW K޶mBpOsC(wvhhe"%f:CqN񎁧xl7=*SC"KAիrB[@O&|g3Cχ(xU'kLHơ#=t) s} ?"'g[N'Х'>&7nqTًY-{neOJEM<"J {z2 7餤!O_!zPF(#Z]94wF%: i=A9A>t0H`~k/N=!5 F=K}J\6 I;wCnnsN,cwgnqlȧ[4397VMIzT;o=/-ְ:f{:KA #GBX*7ρ'5ѠmzL@HW<"QN m3r8_&k5"=]RD" BXgiOµHKZ(N هCQzjzi{zOCz R7aw*蟤L1 %RPAf5 )6>7Jt:j`b()…ץ:=M:¥O,\/Tиڥ'/֍P^>`6t` T"2͹[_,Ʀ)ַo߽lq2Abؑ16e07!3s484#Cژ{Qb9z#<=7;0舋R`}7ƳnCBDגy;h񻻭&9whXҽ<&iK4`qICwDD!vC#;1 oi$hL\Gpmw=4wD>stream h<1 E27@AL ښnca ;wH ^ q[HoV/j.:1ģ5Jk EK)K(~Ra16qsb~‡ko/O endstream endobj 200 0 obj <> endobj 201 0 obj <>stream h[[sF~ׯrUb{u*v+z74 Pߟn \yJٚ|}z^ųOd~wAIj̈́7#Sb&ZT*pA&|q?.^/}A' |-(&3e]O:%),x`*4C Jd\Hp%Z԰US.Z__rRjDKZM_PHqS3r, PA!mV >%*EYTP$eLTsVLwe~e;jR*`ׄRcM40Dhy!KxJ&(|%@ |,WW~:)OS l_m7VjO9PixJP;z[hF&0xS,!{(vLPHz&pP> 8?ˋC;.eU<^\8כ7ٮ1:\aA(h*P$?gO椥~N\jpxxBљR593p')a3T%o~R'զܪEP6J@-t2l/}e)ўpÆ-(}rPPCНTPƉAOZcqM{_[vrǍMƪf&/6-cXcYA(1m_@Q:^5ۻ!NMnR*̠N): :?PJާU^G"ڤL*i UdBmr K4Ay+k=U»U qII2|HrXHv_jS!%wt"Awv2pG5 |(e)Ω'y&ds&8z)N|qܢ><#5 }&.Xj\*y{s">t{ 4zȕx|yPbǘJ1}^o{;#i ;] xrqW(!V>lc=^>[A**_ {z}xXmdϿ EcvkZZ6E:NFWL 8jx8"5QC:{hqIKS&$': !@DCE9>C{4M3g_0׶ X 1&ـrv֛mEj*? .⊜BRsCP-)etڪӒž͘Lׄu[&6Rģ4?I$hѱV&5a6)0j1lxҘجf}ۆ5?iO!‰(&w]{Hs:]2ʹtiPVgatWFctBi q+=V[׉5%{{J'cԬe,SGlUE]U)YvA_=/&OxN1NA1♮R)!Xmj|+~t!)Kel3tF#eW*.mrDh|~p~"Z`:o\8*rMÌpavv^gVW W]{_C_PJʏ( ڜb> zT+0_ǻ'G/|qpHeϾrau'u?<չ.G=ItxIJyܓTDғp%RĎs$2=j܏$c톉qn(޻yw&f&>}=RC%b&Zst 3N^.u o5cO!cڮCV/˞M8l6D'+D-K=灑ذ?A 戕T~. q\nSET'>_=ވ"Yf{"W\T]յRUH+;%0Flqc"ɺԠF:[|q,_i_m@%HpOȾpp(\=)[ : Jzć $@zK9Â2yՋ>f jt*UDݢ`nJ>?~%V$^b0k"6!5^NA?l0a~My5z1^qҜ'񂁆j3nVziS5J鑧*m8Svos:W JITUa3ߒׇuU.NXxZwS`?UuxǾNF"GSҚwUEP,v{SM?#.b}U܇)=Zi׹\J1w&#)Ys7EYʓ%/,},aS iŅՃQP=һ'?A֘^|FƻX)+֫Sv/@{U,BRA^ڞVŵ\x[5߀HTZV'x gb$b$x+c瀭6ƯD&Y3I2A]\(A U?8PuK3x|z4.c]W~1*@V3iïZ/؆!b˴JAR l\]icUøJkGyM fEf3bEv #FJ쯋MLQԦ*s,Y_]dDukKBY4 Q\rN%mA? )xW!# |܃)8* 0<_G/^|q s"K,a7NV!~zJ W#i}G}/nuF|KyFI'!(J>Q{R$N|\9|3U-fTV֯E^_|I5g}zsI"Gֽ.*< :[偔ˋ|āYM;g])~e?:)+_uicO6qř6̯Mԕ5ܹ$ޞyzwtØt3&.Ƌ Zc1Ng~\g0tԞm8SWO-A3[?gSʺhNlp٢?*Ӳ8  endstream endobj 202 0 obj <>stream h> endobj 204 0 obj <>stream h[ے}P)&˕85xdaę3dIc{>ݸJ뇔+ [t>A˿ߑx՗KH"yV$7-\'L~ʓ~:s/W7_HI*h" MP^/Ie/g9k[LV$c908!:9+A%D"4<+dBX&տ!E(A`WYHqRs1" hxc~`oS?jVfga~i֢^f$+:=ʣM܌LuD%ɜeȕoLxy~-ׯwOS]|wFHxap8_2a-1.F2~!HVg3}0t{, n\KpT]z]2idŋ ]=aUq('ktwU!cªee]0c Ep͘YGX״ J=)4N, ;7s n(Ĭ]  ŏ7_>fL??П?c9#T@G(f헄A9d!iY65 '[QӞ M7@Vh&?G ۬gГNщFtRI2РVkC<3F0:@u>Fa6 & }B30.k-1Tԋ+UKq@sz 7B$v]#)i:@#D ɕN 5Ln~EL$Dv 3*\C2ܺ%rfNЍy !Qqt=v2Lw JΖχfs`ĤP"FŢbAD,:oS_AH\ aE+ʇ C n^N적p3;|e/NxkpݍU3ݹms^fP>¿9Džo*ک3b.fr1dA~nOHP2-guX4(l7( /w?%M^pރl:mOf 6pq~En/"¢v d0[~GaZ H U@J =-'GhVpr"LDБf,}3-"sϘs/'DzuB*hI&:`*hs=jEGʆgR\t⪇Q4rf/h2CMљkMv)٧ c].tUzXڿU3'C?lp w$6&Й\oD(̨=4R4u ā}2$V]>ozV/BE-.t\K#6u#Lr},ȹ4aql@r!L K+c -JSsQ\nABtH3Kx4W7G@{,@G:nnE:=Clۗ«)Tp9[ (+sLJ\upA␴p(83Pl㰶FX[Co78 SpJfob=*]ENJ^ zSmlJM5TZ3m:œ@@hAHo?|AMLPt@ēol<&p3 qi}TyTƎ(nf%uS(q zTlp<£,o LW<tL\mnJ4mpRZ\ٯiN?Yb)gPEFW(-!̽50Qqn0$l"(ki?5@˒Ez[:dx)4%,*_FahR':w6{u8Xz1Ꙗp Zsmx~5K˦0Q kzus zq Wl`最>TpL &n5kvR MͶL40]" Ԯnm&uJy"4l]Adh6 ?9gyb2""n I'4Ʉ)di-/y+|p8^>%.l<(|u<^=`1 G$[u b*,no%Y[C23-ڕ]`sac-=,dT,eೣq0yiZ͂OApo: ">x8j~ʔ^wOp9O,f²t`w~@W z!)NྐྵKK 4 gASj+sDDjQןϛN< /!ֈU`Imh~7>- 6Me BS[ %U F lAð#6i *g]@M+hJL9VtViG,n!0)`-5U `>\/s}JȺ8A`m}?GQ@@9ѻ4Xz57 NbMFtoVm=Z0Kz4%SPEs>Y=I "qL{>,Hf~MxRxBhb| VUz_WG+x °PLewB`4ǩO]qcj*|Ґ,ݚZ ht+$u:3ׁZd|֢Kӷ2&=iio&&kCA-8$RCrp&eP&04%G} KxZۆ Rn':;l[z^9B9(LSaaΰÙte=JA &9￵8](WFPv:<8WGAyWr@[|&r{%to ;C9[K֟wZnnֆb_ (K`o&/=\Zzb{%˟OMt.,j3=G(z#G<&Xh|CxAL`@.myz{0G7((0%8(+)_u_X|䰕>W2{!m9ZY;+$x:Ϸ2' endstream endobj 205 0 obj <>stream h<;0 D$| m! !_G ͛7 $/w[Hp7XZ+>VJft[-SP:CūWԜ1g ?bC?, endstream endobj 206 0 obj <> endobj 207 0 obj <>stream hޤ[o6)6iY/0 bbYc\Gq6MoCIt%$.EkW]0ޓd}^L^-,!qB02::Q\ !1d +ϗcbτ$EǕ$4/|dWF^N2Y0< ,4|(NNNDPiGA&##?N~#BIp1%Ri2Cya)H CeU۫(ZmOz͇ݱ؝cy-b{mi$B.gaF ߘ pg0+_WJÑau4e]UA'b$eÇ2`Ҩ- ESVR`J) N/o{WSV5H1AfStfgSXhz>fST?Adp>׷!ّpVPSxc)^Ri\ם$Dle>tFΥR˨b> 0DOEkä!B ny9&c6ް *SIFTLkTz}_k7;;=ZOTpv}Ȟ,س30N(zmH89*سdbiU|IBkh*ah&_FpQzp۲6{J֠ 8=b8m9d}Hiei$`#7oۊklvڳAqz alp\}]fwlD6EޯG+!D26]FsXr \ۃ7pqiZMNI$@*77լ4 A*fQU>_]bP|#qVbG1![ݎ[qdOꎘcA)uźl"T_ФrCgSM 3_k`op١*q w`$^n{y*'_pLU,3; ͊]]֭}wNĄ:+o5L0hկ\F[E*tյ t[;z]՛7`4q!Ǎ[ܲ'ȺoS&ac3\5@5U5dď N#2qܮʙ9:dH/y ):B 1E(~_H۲׳_ < endstream endobj 208 0 obj <>stream h4 0Ee itnB$)؝{\m uO{n1beqN}WèB|_) endstream endobj 209 0 obj <> endobj 210 0 obj <>stream h[{oJJ^y\AQZ{Y( ]Bnٛ:$~xƏ!Y-'>s~ ~=G|`l0  7{( e>I'2Ō'$߃qy$d𯽣޿P0 P8=a}kqBW`y,a!̇\K"%$~fV~Z~FhR`8VT+JIV"Ikz,#xuJD_8"*ME*VaD ?  %'bZذ`1R Wn؈XZU SS1C t-B1\zg.%EݔRO[eB`}:ՄL|8]9+7Wyn*(DºJo} FQ"\ܧ蟃5hBk3lNnn)k ,TUQu2M 6@cƎ4ƐO]md,]ƍlWUk6vL@+/[6|kfgD^;Ґ%t'i#rcS2jի,E],mѠb~|AlVb\:R`:6BB7oCT.y x]n% w3(_{ُ$[$R.yef2O翸).ZA-+!1%$' 4Xt@> vYAqL ൖ`߃88 >Qp?AIEJ1ؐ aF4L_\Q%lQO҅$UEP'<"hʏc">e׹chq5tNl_ܹ%*L62݌[JFG1Jm( ܓH]׮%#t9UAsܭkF\ԬBMj-OTXR+vd{EnmY8@gh7IԃyTu)ޢy򩟍Dup|c1&/J>x/B\̈׋u]-y?YjxvX(,p1)&0<,ꞔg4Og/= wwߞX.i #$){ RyJkzPmt,׷IG8sU[z tA: }6,FzvVuwtQj<*a6nF[l d`{m" Q1NA>.߫бGU 0nGtڭ{_?SQ|ɡ#M(]7ؓmkNEPb^r>ڪkn}]Rgvsy+f[ j7-`Vմ6Ӫ,t:vm<ƞAjs)YMRO3or M>PQS^h"h)7 r}B7K]ԁ;EOآh.Q ;ۂھKmL%]d/~ppwoxzl+Cr"P =}b-}wd-1얷3L;Pz0m68ԩ#xZ&~b̪HH{w~V'^lkI'׈jqxA"ŽXf@f0 ߄u2e8˒vI'zZCQ֘X4vd]ſȅzf`!Ir7N=bSL.W%zR`yQ-]gل'p6qATvd}mh-IŊF~Mn ]=D4Vh-]*bsfc%FHN$ {@םTef?sɡS_&{HZ=>vQ ͣ#Ky1c-ӳ8zU<5vð;?;~|F?D78}2swoM=~Sor; YY~;Wڃe~8x_O.\{w8t94v-#rYA< ޵¸p1,a:\ A]]-"ՙ,^y#]]Cm7x3 A6Ͷ>(Yv;|.pt%5>A J/2%ژF<\ ſ5>!;Y!%Ok5 BԒ%5K@x,w?%Z<;de+ղt}"v$c}-vɲ [<[#   endstream endobj 211 0 obj <>stream h> endobj 213 0 obj <>stream hm7d*zJ#paI#!zxGEigR;|FR?n5ƓǗg./O.o0ZMR"5C.y|0^.~=#BgO.{'{D`2N6!m<:߉b7B2H3Nd*2Q j1rs2  "xjzo5PQUor7a?U"^U* )Dҭa7 ۭo dRSחbn{ffGv.h lo ڂhj*߁~s_)0ou֘b8Yn M!V"*F@[^C~:g"3VM1mcQJ4L~2_ rHkŤyЌ}@)(WLpF64]+𪉮}37w.>.3%XLDEd1Y7d_L( R3e}MqIհYsh=/>fEgX# eU!JX3ѐvJ>}^}5<ƀְc~;|0suzTz() n*ޛj~oE&߁ 8sLEJ;jmfAsMICM0Od$|%`>1n-'0O+Ko6몾XBZ;"w|f_e(c}Or@=e@R8_FB!?*Ӳ"4dyQo~s>^-.*dcCp͠HJf \Q(S?s"7[eh:oϵfc6/~?ϣtHn._C#4cI:p2T~R /C& ?C4½ >TRjHWyT*a4@XD-\6!xgjE{E*ͽ5>dC?= z}3Uv nR6r-yKaIfc̋ݺ%}/WmyƦ>U(wrg6#ۺ޽\z'5 Bߑ_0{\w0xuĤ_Bċg8, a!8 @у=CY>[,V7uTef:cl?4xRj;l^Yky\)]l 9*\@ PXm{."sJ܁VBӓUǀE,y X2ETsr%@+1p!E?QRN-cRTVE}SI^ ?ȡJ d/Q2O)k^W2W屿Jz|%K!\pφպ2ʜ>S%ZVJ׳c([rn%>-yBl2[pt=\^>.&.uT=V'1pPoeky\)]~d飒uq>!m#(`Lujy ΖYELPQ0a隳0# #U7 Y%,Q1!`G 6|rad8Z%`-Ym|B}q#GM 7rr!lO (վL>!XJ?#RB"zFʚ<kX#J.:ɲjyڒ6/ڄMYoQqSGÍnfRKQ;xKz޼| oL{F}yGM7~rqݺ^DzE--y1QOW+P?؄NtfZuD_i޸7.JoN9^^N5eSiO?Dȥ>FK_^M>L5Û3j!v(}g]>#kw)|3k4_)rcX^*R^!fФC,8hJTME+^l9OzkIm)W΋i7opP{/B*r]ί)L~+ F@Ҩ{Z|TP cQ̦F‰o1]c3cWdl33fۣdff,ˤx@?!4 endstream endobj 214 0 obj <>stream h<90E27 I-E)rňL3l,90?? =qhbؘj%.cT:Y :f440>(m5sƚ5=pr-$z>Nz{`d4 endstream endobj 215 0 obj <> endobj 216 0 obj <>stream hZYs~ׯ#0)&ĪOd-uʖ&[ -MMiD @caz-2g3 •UHE0uA'OJXz˞38iƳ%^T_e3;n:2"(ܐ(,|ɘBq噕 poQ90\f'N` B)M-B3X-NUqx,N;TPn寢%}rm-Au^6DzwD B-5gZ'yvR(b}$2Ԗ̉0].+ͶPJoljZh}_ NYq]77KmUޕg%-QA?&"ȈZ:_qs|zg/pTޘ9X+8pyx{ۓňt,ĖTy*h'M6i+Cae&Iw`+n9+K6B|>xD8A X8o=*&]_ ncq28=xMvn(I >uFճQ}?Jhm^!cQ^˪Q $ ܅n%ϛZ,M~E}sSmoLQp;IT,L%[ !WlҚn,( 2ZtSPOE`L:&XKZ9Z~ Mͥ^7RCA:.Aa {J0kJM*u9&԰ݱ|jڠ%8{P~?R]N0 usoDu y{rW'B۳Sj )'=+qmJк^Y $b|/pxMCn+_ؼ7 #)+%|ՒqJL )h'ӚJ YRp 亸j6RW^Cah\uF#w>gpf<ٶhdYAc>ZJg(-:(AW fYԍ[֎WzoLZTE0Uy)t3fwb~q 8a 5w&fQ"T@>TSaU+7C A] I'z3ÍYO.>{ǓQJ$WįӾ 9yrVK^0 ԵBQ)&ĕ R ad$ 1 NvF8>G02)0rSoCS?ך5xޯI̩rʯrp.箯@n>wR"t1$8N)zss˪WdM3 ͧ* YbG>Qj](0>)0ȸ"U :Ru!:R#qIe1k#8f<A_@a#4ՈZJ@S6 JÎ7UZEN eHiq:o"27i'޻~ЂCN7%3.yWMqZϪs]@AZSb^]i=iKz7ze+>stream h4 E+`"CeJzHseQʧXx\4'Z9)6|˜um+@Kptv503L,[%$~;ƿa4 endstream endobj 218 0 obj <> endobj 219 0 obj <>stream h[mo_(ѢW>!W-*ٕ }_Kqr&CǏ˝}p'2=98ysq&drqsB02z'-7>Gsqe?>c̾ۋjWN$a<&.rr H`/ ѓDPigAN4GFNC^sr<<8"ĘnaL}L)>L $K/hS_b[np'R!L[?)m=<΁xY^/oVuu ZB b(ym<߱cbe>)=1>u`JnX[CJrc_ɟӖi0 Lkw΍ftk̖ [!33p (hCF ^wUlUJ֔-qM=,6bP3rfonH K|\W]VkR %[?7ʳ1N-[#3@186SQH؝]"ђww`J/5X}HVlg> !}qhi E8@Z]l(N#휟eMS( iž+K] V|90*Hs6ąhi$Ubx8W_}/iX:JR>;js{:qֻӻVqb :fQю9X;;f{,PtR~:^KRzPȑÏϖb1/IޗSQ)" Cj<22ؾx<i9&3vyU9ΛFU^␋02޹+PH05IE@k/UXee *p H-t< EJ9txbk"Ƿv'W6E*G La-'lIgS0BP@Hnֶo'%Mͬ7j,u3J>T Gi^B3v9>e.ȳnUk~V^ɁE:ZJj/#jV:ua,Y!}t4?;%0nv\H鸂y<13  Lx `Vq}3KgݬzZySxPtNt$IP&K1)yH m  x[k38tI A:Rj5k0ݚ#] zz&ܓ &;4!}6V:-7_tԢ;Oێh9OXwف3ɢ= "\Ni30G&5ɺݟ m #Vel|lDMíc@&m 2c[-=%碷GE)"m'el,cN v[vF"ڽ i&H]a1nE*d1J:.nI(!U`ɌøGDkpVF?S$6@+ိ+,Ԑ['gk݄&qiBiX%|'PDK\ۆn_Ja!V ;V.\]ۗO̿k endstream endobj 220 0 obj <>stream h<9 0E27[AҸb҉H:1N d4v eEf֚7f49OڜZ/ $QFQ J+2}ߍÅM{p`{, endstream endobj 221 0 obj <> endobj 222 0 obj <>stream h̛m7SK_FςHӴд!MݖQBZZHJs~쭼N|渳whf4;~Oyjy"N,X!CI|[K)~{lw_nGO>EaxYH*(oI4!&;-Ba v?`zviJxݏtVv8 Va 8> c:p& #|1X-pJz% 8Z/+kU3}.LG+ۮNh#&G-'GoC^f3Og.TnҤAwQ#"IgxPB"O0tv⢶]:/r4 _|СxsYlG0Mճ_&GANEꃈ{u ss#LXmLv3dYkۡl5l8G'o4l{EGW&.jsXl%ma/ߩsv y{Y|%߷H`'=vߢ7c>=.6WÄ ld*+VfCanXk+ #bTV^Z֚jY=sQJ:E5 vK5UA*qV4MB!l1,ԹU4% , M,@e0e%yr3L2d`W;$l1,ԯ%ގk*Ҭ\]9 V&yjBjY&0mZ)V}(wIj1,%yγu͔¼ZΔYoa,i{Xn^-9dۊ`g ׌UBBZ)т@Yn[ eI?AbVx RCqpS*P J:cdIExdj)̄Gqu*Z܊om.:ǑϫZ+UzE}$;h [ճlpFY1NU5@, vNQ%x0F}OQ }~0LMVbP+\iLe%*̘vƸ+ ML뫝۾sKp"NG[(چ"0P3*+ vxt-@$h#bp>/-Jnt17-v*DUYi}jaq/ ԱHhʋڪd$318諺+~ڪrEBw~[?sߢ/qHF(uT\8"5N j5(bUGޓa6nAnAURZ*ԯmRT33 ڄ*J9:sk[{Oxo>aQ)㫕ΘYoǬSa+v+JCUWd;\Ʃ>ԟmJTQZX* vruT-KpA'e/ʴaꮬ"K}fAO՜%DsқTmKg4>Sb}Tԙ_6 iN/ay)eLTԙ[-tso}x`NW+Rc"U.pu' lLSÂGިS~'"^жZU-Ltz;gXuF}P+V+4* SQwPqu_ag ]O<tGu{|%8|;U[&ٍ<=|tNU; endstream endobj 223 0 obj <>stream h24T0Pw/ .HLNqM2Avv%%% `C)T-?(b`nMlsԒh7ԊX;;- endstream endobj 224 0 obj <> endobj 225 0 obj <>stream hěo7SˤR=/!$JUR+"@ Im}NN<>o.!Bdߎ=';^b;-N1t+d輱:0;YN3+L.&OT})7_>R w\U' +m_('\o#6vc|VT IAOʤALէAͭ) }uOC0woki(t>is֌LI&&X8sBJHO3>E<Y֢t!NHIo^8N7S7oT-eLcq:#7xuYAj#n(E*ՉM2|`lӤߍKHIJMPkLIn-D򣝦|O^ZUOwWT# ';BIl)LՖbu"Mz{LK-Fn@>Nt/y!lֺ"ų5_r/7C!2Ϫ^SF⅗"]:]=ގvpɸM3%DY{NFٙj(TX{[NIo 4^rA#d{xvŤ_45OՉ/|MH%A5ٓ?is^Issvon"52j/* OӉR9B4+a珽 \jcRSRq/#{[L6"st7>񬠂t)&%e*~v"iղ: *E"lr2r1j/e1 15Fu{˟{̣ҧeŪP5 Xi Vm3ePуe=aP[XQCQ,Dl(գ.F{z+5T]ՉPV TJ^mLi`(0je:#v[YnjkZMʀj1wɸ*~h-|,#^n "uˤݓVSr_*K'"PU 7\Dv25Syv>Ӓ4R*IedJduSAb:twDYJ21j˻=*橃-mJ3 Z3U`+gz0?qJ9/986Kg)#99BFqJcJ9XWobuƶItpI&͟t'LyRNIoǮq>4.i)$X.ƌ Y/>up@-n'6@JҶK),8PZmڍN67mMҖݒTe*[LwBE,IT4EjNi>IY)}`WH}TFvQada=G~zy=33q[[*7s6l+-<}G|eYxOhw\UWyz(o4;:$_ endstream endobj 226 0 obj <>stream h24R0Pw/ .HLNqM2Avv%%% `C)T-?(b`nMlsԒh7ԊX;;. endstream endobj 227 0 obj <> endobj 228 0 obj <>stream h̚ko؏H`@ eMI]UVr"M{̐s#[) {sΐ/_`yq8,n6r ͧpݒ'wK4ӆ7>/m_rͿ/7\Kbn?5˳%o4?p۳zbgN,b,A2M?-_b/+z|=De {OIt󂾀]/r斾ؑZKDCL֒9-Zc3Aj,߳]Cf5M4}c'Z1Q:ڬCv9ɺ}=&b=Sjig,ra=r t%C}]KwZI\[&DWBkA/1|40IZ>:HY)2 fmc/YJ9` Iw(+:a붡wރލڑ!G@(~}z$nK/1Q%X|!fP*QiW3Dwu6-}tRY $TB(d>40 rz y5$Ջãif)if.rTjqS-[?wXFxmpz7K O@{] >/|Z) b7N~2]T69'57:GFc{Mb43S|H SJ$|'+y9eEMI)TC>Ph<}> iM8.}ZJ¨ %>L8 SK}Vl?ZGqaFUOqai%@!bxaPRY&W `t +H8rk/Kt.+sr`,uˁ M |ǫc܂fږc++|Ո|~zjۚr=hY&(FG84>7竵f:mĘʋ]. uTw<v4νRc|rzwy}1frp5ijr?}%`׳QBԱ1)mKtrk)}+{ձ7@5jhq>-8{ʻEFa)󈢜 ـqN70EeƸiD='YIc6m6P~ۦ =ype!x6 ʌg`z Scw7ۮՔ]Cӷk&93S8GkITpC;FEyZFm>F .,/Q@匚JS壻4ׇ)FsVj9Iڢ}'{H[]MO7nƹ%75NO |f8ߋkc-lzSܻgBr ˙9 q>AY5A&]&\ >eXB)AP9#pá:&[^qjSKmi7.B'g~SU>T\S Ȝki(O mY՘׶o*}}stZ\ſFV7']as(Ti?@M\u<=EhemzOh+o \89dLl+&AzbŨ0*XtQUqxʋ&5.ulmvE3Q@N>70 v(?#w| rw=X02<}LhN3B|G_QD%9Yq--ri~8F.腧jѻӟ v-fk?h' /tIe|6fsnwN n[ys`BHӼ/1awi![bݹ+o0[9K~]=qû{Le6$-M{6HT[ZckLA5 zl]0\ n;U"똮}^^\Uo1!o=M s>Ĵ6 tb*{KJ:,:`8ؐ01ڦfGNAg|trݘϿ4ΟL NzzvHqʑ@"/?C;6mO sz8NNux1ޕ*9B:蔵*zxNCbޱ ZcwTiQd=Xm'{4]8=frNg n:vς w\x>stream h4; 07Q4Z1B$-<ݼxJAӈ6׶8 K.1iQ,\T*C8smE#WRQpd5ft9a1up՘O%) endstream endobj 230 0 obj <> endobj 231 0 obj <>stream h[ko_^pSG٢ȉ [J%ypf$(Œ.!ϹOzla7i6z61FgwVjF*4#:T@J 9cFB W V~0㟵<<@n3ؗc#V.txf [Qb< e` } i r,?6 Ǐbɠg]|ᇨT EDp.{A Wr7j" D5GjFT`jRzHFiaG5R lCU8g|2M~ Z_n_M89;5{2C@D: f0NM@l޵hP.\w @JI0BdQmX @])^: .~==Fw|vsq!$<QaGV]6]͉::Y]Ti6thDh;M rȹ `&UK=0,ȇ(-BBzճO L'D/z(Ao.@t]$;!B5sAB.kA=&9'u{N$f:De,2gSI+C6|ij_HxӒXiP22x.$]O2]` ba= %]Wu/h皎r,_T_-LЕ;00tL;|ܗs?]{~*OpT bBDsImAͯ'v~ېe__  | c\`H  q=fJhHGq62{EPRu cG{sCIL:=^*1lB; -wE<9AVG7Vt‡ 6Vd^@g=9Ⱌ{Ek g&KɴTYGc]P(-ti~Lh/w 흃6ϣ+4dVJ'M~$ ]:g0,@gyFUuI~j1:L[ڜ~>}CrUkre7Eay!kSh%2GTk02$oe:!+"ʶ`M+dW*-,gc=RoZS+.[g԰Z?&_PP|̋kb5FU~b>[QNzRGX?ju_`v2E~n,Cb|--:=ķw1liڬ9$fO m%_mUvB3:d~G'\=~lpjpWJi&qWzBZT\b~Tp{`|?e^&Dh6R:stZ-!MYS&[3̦Aaf;ucxl}M^߃1J4PIA! ؊@?dl=kEaZ\Sϫ}aa//[#3`@|qv0ŧv/* MmUtj-(4B,/ M%DmL昢A,6x}CiFytBS! 1ƙ@5YK/pc+SG GƁ9$^M=mGeL;v^.ٲʯ4xe:6 ֖F wG)_<@q*J/so*Wˍߊ6rmu@Khj*Au]#m/UIX*FOWZp,HwL+\݈k~l!ZQI.>n߷5Tj6SWV^jGˎ;6ju(TrvZ*(ybT~e%sH^Uj`܅ L鈵1/wJp[b`S`y}Y>stream h<1 E 0HKd [!تRr w?۲ Pb䥾>^|h$ܰ% dl7s}#9zZ8 XtЊ0N > endobj 234 0 obj <>stream h[nF}W F_fvg, q<2e)%Gw~Vu7,,,TuUugoW_]%W F '(MᎻ ¿9 T\^|ů,Y%q<ь'3+.Y ?*+۽N /$* #~P\#'F:byb%q:a(|~qȿ_ Is.1'QP$ ( W.fpw|Hob@iל;+KL`KYxVIBe`=0n"|tWSXx-$ 67)fhP+hU-Y/QsAҨzltzls_gd{OkQA`0~*h6* Px; .Ɓ=κTYW"W"-պӔvjInq䨣JF" UoA+>FyR Yn᳓,a._@0t x/a DA.g7r1 5\}|(5aU|֋9{\M#AԀ3`[6nQ/С :Zj͉Me?m!~Re`W^ y{x3m[U H.*<~mV5cl\![0 鉱E4iqkB6w>_4VWUl,qD+3c.$Oq]9lܘ؀vY ,M GO {?Wi0s-ۀ6 g>.O@T|r3"'<97GA^ T{G8/𢖩wtt(HI=$C}wLdFc5HL\Hj%YlתK 4>Zp-=\Sc|HzEM _78lVV*Ӿ!]2biS΢0<*Gv;6̞anK1Apg'{L;?uY?oweS$=]+l){ҥ&Dcܹ1`!;JFc2e[{}&@^"ٰi7׈jn$M?mrg3~ŠI A#rU+Vw)(b5@ %46C'0=-=-S/|uVOٓA/bb{ )e@ ?AJ[IR2%ΆĬY\ f{Ⱉc5"mQwR^m(z{(~(41qg/LYmSĴBϬڶ><܀|+iL*U ңShзv[pyXCNxܶ!X~ cdq&4!Kg'"w]Q}?*${ڊ*A|PL $M0!lT?)St{ I` R 眞xtl6]bncy:\ԍvw# ['eRطjzژvK,9Q:1oN/G 7_'p)2LozN5zeUnƱ;}(ϸjBa| K1UiWePi''!BFMIp3|ކ:_cS,ZM&|#\d7&e& X8+;Wl}=J35 XtJy)i 3eLw!*x~Pw"̿=](oVT|r#f`ZCչn2{M^ MS_\飁Hg eGlA3bӱ~ouBfw%'bc:1  `#r)4(k֧M9jc:8OCD?9D4^"qŦі!5w 'nˑk<Ĵ!Hc1P'];F]22k)d:kU#*0/W!#.Ad>uƟ[)%\\M6ĺ{>ucN|Ae@m'wu3q Jc~yl8\8Kr='|賰'&>>'gy I{lZ9>\DTWǨig|H~:&-`?7j={҆IctY7L68?$P~< x;;SA%! r"mLh= Y.CLLDhv:|"ZJ?f!\q2C gئP (E3i%]E$Lr1o`SIٖ >\qa|B8L^,Ce`-l5 ߀zozb3G%wIDqröIz @"-fdA@A@"7zU:l[! TD*@k\[6R/2<{4:,ƏeKb]ؼyU°{nN«]5"a띥quֹz_+{|@4K˰/ᬪ?*??0*k1*#-#1?ׇ(X ?Ic@yE˭2DxżLvFW[oF[ph`Cv;fq\yԠe+xb&( H*X\D4Wy\Z*jk^_ږ_ ۽&H/#GϏxt( >R|Us>ExB y?oaE&tJ,MGE9àY#V/ R1 g4QULb _~Nj œy(ڻC43 lfπt>)z\t)TIL:x~h: ]]O$vj~|j{~ǚD?T>NϔcXu5U3U #̔"O| O 覼h aIqRv-x5~י<5*z3v PV#ISFM FFPztGbov_0m Y3CLpSW;՝E4 endstream endobj 235 0 obj <>stream h< DehbV!xi\CVz[%C>+7XoiR*Gl{qDڨ6KXi&SҜU,EL71,Vɟ@D]#7Ž <3ʋ({PuV) 'Q4 endstream endobj 236 0 obj <> endobj 237 0 obj <>stream h[Yo~ /Cl}&xmǢ#0(j$q#^}zlXE=]wW}zS]?/gϖKly9#a?iHH Opv:;_gof$d24f a_$fxٺð!XhxSLPi)Q M3͑aHy?qD1ngc-2s2'a|=[8<)y{( ?̑? Wɐf) qH)hHьp'SM37IXFG[%31)8S+zX}L#)ʮZ)q4:]$@51HXA$J3G  H-8w, F IgY+ Sk+ fV!V#HNl)&oʀ>Fq.R5.EI qH[6d2,Ԣ((ig : /.t/"AZyL³/-u sZgx9<#g뾳s=  E#@h8KaB_6—vȰDy^X'(U8"IA9 ]tu^),< W FLJT.);J_~ͦOʅilT͎"Vz93%a XQ9ͣD+Ԉ~Z}`mzӪm8xeqac76'5=٦ z8w#=,kLwy2ny_{ a<9i7>3a74a8 Sj'֎]OCLIȗYV(d-pp+BLbuBF.W]nn:Q$TçX]!dyw bsMF鎊|_l/f{&ғ$V4*ص 3e!+?Tr,$\zxRBm sGՖ\h<[pOE$kjFݞ2l犧coQǓE2+nj)$A҇kSdbO!JA Ux65NDiji䑐7 KBʎ!+ Al.~E>6.zDSouο)=ʸl䀯&HJ'"\\̰%pt 9ϻ%J,RsIoz(m'pn7'̞\1EE`E&k\C G56^WqÜ|{@8ԋj$ы ƙږ ~bzuV9c+e,0V-0P^F˫8~cKswUFţǑTʟY$C\/K~/:XEZsa%0^FcZZP55 3?!lNgV51I/~f #hMm!&յy Sl̨pB3?lQmLM1kcUv8QW=@aK?˜8"m;y raHv,  )h96p<;,Mִ Z?ބhMe?>V"NHuegrDC\ 4VYޖ:4|ƌ_yj&I) 6b\%`pXS/lmFҋ 4[_a,MXCe>%Jmro:8:?5 A+XZrSC0ҘѰz]G?&1ŶՎ}ka=T`S0(l$UpSP+XS/s$? 58dz#z4oɩͮ:1pdL!*XWZ\ܜDzQCq :$M..w-Z&B |ˬ- )差{]~>e=j,ouyMQi,IM}fae #ܬ@mWmiq>V .,48t1V>d,|`s1>GbqWBБbRW]%.*MbJbbߍS_{ }Q9ԓ:|u[v%/D| 0/VWebf( Gl3ǹ?o-Wo#ξnv3(ylvx~QGK9>b'xԍh4`o?rkan+X+A J;8bO7:)46907՗˒:+,pALF`-EU~e73"n+YuVG[㒌xhyXmeWzQ-3w<4Mp7l}*:܁  `ӱwlVzp{r|վ4緮eײZ0HV@t"p2w{kaEa3%2ߛe%>J=PX]Q9tQ&$t:w?|{&e)uSvos!@iUo endstream endobj 238 0 obj <>stream h40 _oH( Vd: "zq$}g8 ^ p[*ry{^́V*e#e;ckRki8sQ/gBZIt[,j endstream endobj 239 0 obj <> endobj 240 0 obj <>stream h[r a}wƓֲT&hhJBR[ܳ,Bqh8x~߹gS{=rvl6#=ԛ$Vdq"{;Jzl$IFPoՃ߅=polG6? J@lŶ:Y$|m#*'ixog) NJ $ATO"IF'5 1!R<{HpV?|H )R"bx(f&0c05.94zش !H.?S3P,yO,]3i{1tr}-һFw}h~쯥v) lV1H6>̻Kw1a`lmRJS 7k6 i ckF<{QcJ&v5[ 6r S< G2~e &1jd1_nBUN7MP1=.`,kQSrd^UEN1*5IX{Dӆ)ދu>Ðv9 ꒍YQC6 dr1@DWy`"whPyucz[Etg?Vz0` VL[!N۹p)+צp6c7j*s`z0c,,9q-9Dsr2LN>}f6!bBRHV^Ԓ.yfwߨahcehxA[GS)es s[3] <>5j]{ǁ1qa*aW)K=cǪ\N5ؼ/ώ//&ٰ?о|z<O]cNteVSHfד3фJOd hLx*On'a,7_uCY:: /EW.W2i#RXGgl>ж&d-Mwud}oMYzM*jO04d_9KEF^2 _q4>_.b8M/*CφW$?'>Qնvvcqnja$ꔔݲ?6?9HŽJԍE ☙zP[/Θ4MdvvFC9q1e ء=.WM|fb񰙯5,X胃}k lv@m ~g.o6a׸թhojwed&߿)D'Ժ߰lVnW0^^ŰXqZIoX ;'Zxd% XO=&\ M/a#"ء cE?1Jv$axhk+b͑֫br>,"Z,\[@kIr_|f Nuqo>7%e R}-zBLȷָ`Z^&#,G&"扊z3<8A UocG@ $AlҺO[sg6=j8'@E2j uE4Ie[Qj_բ0d`/@[Sܣr?Kҧj4fTY tz4cs(Ix)  S$Z?KS5]\g?6UW#ڟh2upfyXB)TT|ij Z [ʊ7nVuŹxDrch"aevp٩ߣ 4'r&(m 9R}ڂa/S T1@ ].i;<4WMN#}Tԉ8ZBscz\ntQ+]Ҥ$>C"w g0P}ov|&'B&T ;m(8Ӡ>stream h4 0Ee $ itMB$q؝s\m :է=]\b4yZ)ɗ\1cef)Dj@f6-3|GyU7-= ) endstream endobj 242 0 obj <> endobj 243 0 obj <>stream hko;? sahq$i ~LW"UwfwН$6z0hRsٗ-/Ē-.g_VjF*47 xM)o>.?[g%<7/558?܇DŽ |6[ADQeH2kHG,_ZI^2A\3/WBƜ[ʼnH 2D${$jm SVҳ'=\8d' =+ .e}vy8d ˙- dE`Zp3f40pCjYX߈N+hFo0 a.$@y.ŜAT%U Y $V0a@^^/0PDnүR jm"Q:*,s&nrAEO}A HQK:)KrXOM1Hi`U*Y +~u CtC1hk0[9TA6J%6 wr"Q%9A|4vsFD 8TYla_ ϵY|~I9=zӢ>bDD">0NmN&a9ۈ,uƣRVq h##.'8Pc/ڸT[WE_P>#[kQ U"נ]FTjةtc[Ra0[Q Ly ٨Nh*J:QqDQ'xԉrGR'XJHAm"gJDFUX*afuqBܬ%m r(;{^x[wq|0 9@Qr֎bw ^2^SFDf?-zߦQv?(("b [,&8>!`Jl/ 0YYnl%N3(3l|޸nQ ,@넜rְ)VP%}hDž.|y\uP#Chb,8z_[ A*XSoo8s ,n5Fnc@9%{K9O7C06f1Cp؅~ ub(_,>Vms!,c$&(VnbE!E{ߪ3G$Ug[L1![a;ޕQ ďyI^T~ 3 femwp< @G]} ( O7WY+t|AM'7f )d.i Wlʛ4*ϱPFP>~MOw+q@?Z\$K<9)ǣI~Carl UOR|MpoxĀ%YJ}Rq־Ym'@BT^,K~&qF;aC]l Ñ}ge_= 2쵘@+<4V®6l\Z9E3x 4 u#ӱt7]6-eɔxvPMLK=Q]]BxZ>stream h41 E 0HKd [!تrlmlBig:s`$Q>.\n̒2\He^-= h%\0 X MXϺ/g˅ T4z endstream endobj 245 0 obj <> endobj 246 0 obj <>stream hޜWIoFWHx94-Znz0re*v`-)ȿ630!yy_P~ⶮy e+kJHBM$RQx)hxO)OuoSeVCߔP> cm_NB"4xh`~/$S-,14XU'? `m%#V8 p *Vh6(Zg>5ѻ"{a00&Gu6~v/*8*#Fp(5B=djV% UJ90 hY酤J a" PZPh, FYr>%gMdm2Br7IǍV% xD$\p nHb'iIF6XF0qN` HYn:q p榦hf"bbt(Kgk.ݯ 3ߝ>#eޗőx` 'އ+=:@ Xx41f}llh+2'5D$5G$4cL3yRiQq6 ΧcP%7C&!&xM&M(7;Ё' % e*}6TRHs%|zG'šמu+W {n0f-OCl3w`,< <i+l:W`?<7sX(fmy8Vk {?Njh5T,pتos\(<̽όU,ziVkŪFV_GZ9Q,ʢqczg(_dg{oO~ #ĒaW\\`vؚ endstream endobj 247 0 obj <>stream h< EyAX&kTتQV*ϯL{l Ӥ.U\kqdsANZ"mT;6F\eJN׶2 Xzfxo$kǹx(_GcZJg?h4 endstream endobj 248 0 obj <> endobj 249 0 obj <>stream h[Y~ׯ#eD { wȃFh1#M$:G7IEZCVMOoI~?z.0ߴ@X $$;gx5Ƙ]](wBݫׅ4.Ti^P\o9 J \[*}ds=&-knoA#j'"Tbk kAFLDVBU&\ $Xe"(;ňؽvFCP2PF(S+uKSO,dXֳWCz2Ve_0pSޔ}wCd䝎nLqwPCI$ž+o(<<.sWa'\}*DM G#ҁ]2B3NkC;8CQn`3\Dq/׏94e#F_;fўZT|ZP<.2"msg<`GL'a`"qvõ`!ĈÈ4`+OkrxֲxToRKKҕ&'wGmt2$|ߚ<0Оy`BVATqy $;mȘ m<2! hu]`vM*6<Ʒ֞e&0o)GZ cu3Lznzn{C^N9r*.J|SZ߭SL7D,MhIW(<`w8]7CUeLڙTxGneG(Su ^ݧvp`g-8h>.gdϞvkB$B~Wޮͅ-)7,jbK%=)nM3kJ )v|Zz >scF4LF25wMdS;ylv5Ll*4: I˧|5w6K6^r(-t#2+Ӷ^>j"gػF3o3uYY@v}Xq)V'#n>$Rh:5ezR䐇WO+~gxܳဨr7W(TG:AAZD@^N^N^N^N~DدlT endstream endobj 250 0 obj <>stream h<10 E$ ei +"PUME=p|)a۲$ xO:ocĎx4y(7lt1cChxj%cU p5[@I6m;um˹vzX^Hs7g endstream endobj 251 0 obj <> endobj 252 0 obj <>stream h;iFWZX 2^Od7{bnŒثc=UERV:ҊH>~fǛv}TYo R3cws|}e7? mfPx-Cq2۟ӌtly$,cDPJ<4U|Hp~)BJé &2D5s^)b67(sÛr[= p{aEͅcjHN|\сAIa昝THia4e`*!Dh319iʒ6d\ex%Jlt)yenʴnlUK=RjՅGӌ3> e*cJQ*ԢUTIwb~/xJp$ \PFq!?IZ ih%c>ANK1+&BkX=(S-bdzgaLYE @hQ:JcH4"b +_g`J9 OrOBTfjR@)(5r,}RC2B Qk7"tP^t tQ[!C}G Iƣa6z9TH@ֻo#6 CDn{{/BO hy3 2!dd&E4Ӕ˸ar{Gfh̳pL|s^=S$2E*"zIsf hNdNe)@иIy*_EDr|/dDiԨ fq廕t454y<;8}YeH&k aivFGA·ksgH.M~zz1lك ׮2ɇY_ !y4yu֟)HͦRS ~$THJw̉Uki%i-W0Rj_నޠ'QetfjF )JR_brdֵ|MKXB+\,Ӹw@M>˪tb <>nί?/x8Q;1SAҏ ʅh$M 1H NrsVH ߡ!9T˵@'>ŌԺH`D` yQШRDkǯ! LiS 按)Pﯥ-9dmAIul/:|Y7lqZȲaq163fIV?*OuaUK3j8vyZEJe&b{ nWn UDA6?Ŵ7}*Dh@&d *\DSg<#z\4+B Q-ˇ"L}"E?+I Ы fG!S) G 1M;pYR+ Fxfb`sLpk1n&^$ڰ*MQCZ2[X&S K | %i/b0C9ㆾzb$Jj/#^ mx: E£ ɔ~nu$ L+U@ ) b^Թ]y3 s%ĽEHNZ[yYH͊!jZ ೆfwN/yN[Kq((kLB8ym&+m^*e[ Ykd;4<ꭊVЊ R;VF]v Q_nl[\>,% ?ǸP# ɖ f\Q{-8}tJhHE RJ{ȳч:k}.TSY#˅ru%Ko5hQ㑖a@?vb&¸WNN>(8U`ǁ&/Nhrw.t9SAu~+]$u_u68tC3[cy8?DE />~T-_Q$f;ϙY\^.0=r{^=Q8,܂:h7# Bg,Rﱔ[߆cf#J/NfILsC1GJ 4jRbGPc 7HS7D]Y6_bF*^D9.4as7'c`GyH4Ep 9 Oѝa3j>ĠWdC 8ܣ|4م6? v>ׁC $3(,BoG(;v{PVA֖M?XdzؼMTM^*O؋]XO2r;y֥ 5Pnv Pn^˱{[b)VǺY}1/.&/sFP\]tjLw'Er%N{StIP (B鐴Xe+\ 3ϼW}Dur޽}w돞Ei+uz#mo\g$HSgPƮY|l#m\BG;XqHvefڢэ?7MY(*FwS}~wũ8_VQ w~]%%cPΉw HV݂"#]N66I dLUv4y`-0'3Kۼ;BkQˣdoְJ-h+1*S}&dI.//~~*1IA<X9/&|.|jm"ziB`.`: /A=LRC=wSM v-lSj3my岱L' v'LH6;Qx)R-)+pX]FNq~XfrJqMc_ 1z[_8!:)FcsfJT p${`8ojtzOpj#wc}l娛$@(im8.X #KKߝ O[?XOޥўovxNL=.vVZR_f0h75rdB{c(=5&Kj} tmTE`T1I6E?O K WӘbKޟ}Xpr35/gMf(, +|U4RAĴźrl'{rv ]= B; .hIp&SǍ'/kx40#t[#hCecm~tS3 rע2u 1V:]vȧbԍX7 0wh^Wj'<98SO7X+6fK_ Po@;'zgu:o}at]:͏_'Up N}RҴ &vnml=߮, v8miSVk]rx829sݓ MSR pnfrz?P2+ /5m:|qLe{{*I=+Q 17xC&J''$xzX4<>WBXO>\Mʥ^[.# g\|t׹]l /=epԂ nKp \Mz|-̎0_|r/Hr'4[-\P@[.,o-hŏJ1oۛ0k endstream endobj 253 0 obj <>stream h<0 E%W$Rh׊dC U T^|A87PsQN\nؚ%ijFnF s֔z&F7],ɿ`1J@,G1>0;B?| vz=|:\N|`o7/ endstream endobj 254 0 obj <> endobj 255 0 obj <>stream h[Ys~%>T*Vɲ+JD9,? H \{.KR*'V ;mq|B'7g`k&_Fbb&ZH,;> g~~ˋj׵eEd~gn 1E&b9bI/-(5b9Lhaa#Uʱtߜ5_t_r)v%V83L dfLŏox]owJH SMыB5̘wn)nbUrlt \˞s2X \ĚMD:2lUb0IW Qa\ BY,Kb_I%4egM"KM +h&-d s 7R!=9P#ɟr6az`8 0'F eG,qodB$lS`>`-ÿ1.$4%gX@d$H|>[EHњ,4ǶZE&9GF ~  ,\ @E 9&ouK&Ɔyy <\sT=7σ$\zABT6]rP.fjwdL+b\b~hY@uTv28ͥYnjRg(%k&?f@Kz<>x{T3YQy@j_{;M"q9n !ehx$˚hMtՏ8~ Tc=Pی`./ P8HdWUoam@^0fHPek;X_ e} g@8 4~Rfإ oZ"i4|'( Q݂qi ,Clºl6T1 \,eF Cs61*^7`OE44%Ndǖ7'7QFo r#nH<8qpV ɾJo/WꀱP/'/2_~?[ˡ>/dт߃fܭ'Mj0wPr0&% kU6 K4_әAW۩/ f',$!~RH,nqcsOMJJ4a62N{ :] Ś)ӘChqRSؤD˛t@T0٦8&1 hu4Ω*b{1nqqv̳Fb3g6Q &=כO6Yn(Hhi>Iz< =X~ Nk:n{Z;(ʙRT~hx۫)dTbG8$z"WW|'Zڨ2Fd, 8d0jv` +d(inدǮZ0YAF5l|hUr~rkHۮYgĈ ` tŽ  T:)dϚ&_*k#.=VobvWC<0KZo$Śq>n׫^Ln;l\*\dUY Iv-ĈĎ 4ISГ|=t]"aX ~IV]Y`~(Ti/ u]SYEaJ;?nv/ѻVe[v|q-{ vx he<yKKX)(n vNOz-Q/U-kM,ҹ/>,M ,4QG83͸yey4j=-" ZnWf_}] 6/M$$g_eY l$MAP`'b?M_*ZCJoOOn`C .LzWi{w+Ҥ{ݦdiܺΓyP*&^PmDҚt sXb Bñthm22frV_ (BZ< ˄㋸7oAQݮiv }\+w`Nf swW/4\+32c%U'Ci8 Diavpe׎įZ[/V߭$P5 VzL W(ԦʤƬkxHԵޚ'ũPY.t6?S cSf:ʑNt_8o ײoh)7M:=} ߴ&AQp;Q v&09Y8ÚƏ28հ&V&`*2npeu0[_0^o_m)׺Wyi޶-1߫s=yL*طj |i8 A|1Y<*:1]oBerSr ˢ`J1ȇb+FhEe@1h|Hiv~w>E٘X6ZEF|S `ݟMݯI\ v&Eۆr-#0r.w˹Laۡ[n`lNZg!X)D{587JY4jDIbҤ R3H+տ ܦP܇G(,Ĭ(=8u姟绻g>T hv!nqb5иW1#vI7"dԬzWtWthLaIޔ:; Z]i#I)o>|ߢƏiF-ۛDESc!2gRv+u^x. CO'C 4b™ʅg9nOp|\ naOHlbP &k|SǔIQnZl N 7XwowYwt.XW endstream endobj 256 0 obj <>stream h<10 E$5٪ezu$b[\ʫnb'> endobj 258 0 obj <>stream h[n}WPX~1^[8PǦa(i$+HdH%N>շpF.fUuTUWWw|glg.gKdy=#`a(.Zpr_c1;YmvcF M$~ɳٷd0K@V&1 /D z&(nȄ0$l_~8"ĘD 31։T9XoZhDu50&m QDЅBi._כ~;*<63 Sܹ R2? U Ee S-M\'a]Q <$Ia4 Řɮ9&%&a[ Q"q"<*T @XIحShtnCڽl(0Zk cC $ o du aM{ C W8I[Ap$HFb\s Ő)caC Gg\a<$LMiaәsh5(O hcoex M Sy= cJ<6 |;ëxqFTJ{F`ߗ\"?FB["1d=@I/d0$ݘ B#-+SPo~HPZYa"ژ.'|Z>ɝ5 hLDyה[ :[0mP:*'d W΁R 'Kv3i'<)O+em}% EsJhD9}TOw߳*&yˇ<ֻ2r1.M;m7w]sOs׈rsmʘd>^0Ʌ^o DWߛaM'棴yصRA뚚r06O}z6cKKzoH)`Ӻi\Nc1lo74|!Km/r0ӓLʮPlVy@PǨMպ=̰gEeȸO:lZ~T7vTezQ8/y6,B}~I_lEƟ.nw )6⡅FT YM|u|:{5$8- T&U~VA:OnW@A}uJ]OD^D`M~nz`$*K!j:']Dw%W(`opKbxBnu* (@tٗ mlh+*Q u2:4ʜ_ON/FVo/6TWrDԓ簨o^-U>l7Hsd|9k$fʞy΄E<}جKDg0XrНRtGXDvb*Q wzY=Jۘ~幕k塕Ii>zb%aO)'BAy)Bp8 SV2Ggy `<0B{M%'u_[ tG<マpďKxLgI Ҵ?6%>g2Œ︄W8598?Ӈa*vFؐE ڏ顈s{.KPA[ܯ@M>>孳d+$xJj}V!/Cbgij`_hP}РJ>y9[y xާ铰w~B؋D7AH.T'r}{5f4Wj6U5=vBHd I#wV ׄ4xmud*Yq)]5u:&?cp^ctLg#P 55 CiQ!=8$t,$!vGpH.,{Cr8*]$8}p[pwR)?j}u1-`<,vn-zt%|) b@ %:M zcGҼ2XI !AuHH;0N"Z~I6 ɲ[K8*G1rPP]ߕ煶x-2E[pCIڏoRl_ZE/oٮ܋.fUHü‡ݻsFDfHK}5]y;됗8ްgfoGx#Qkɽ~:ވ*#x##\awsT5;BgN&:隡~!Q0􄭴探ۘ~%J-8;I7{{riG2 QF{D&p  <;pKCq ?= ˬq4ayr颹eN%%Q/&M(7~&JR'shOQNA?DI7ݱXF)4Q:l"Zª{<*w?g qʂxzsԤysټue|Ocnwqru<Ъj9 sh٣Iw-JR%xU {8} hHfq_5Y=-̦i:q9y U,T6<-z?ɝ:f\sX <U%*j(z+o_2\<IQk•ځZB|_/*anMe^ `P,K WUi~bKOq d@,UۄKY''>@ +4͎ =Pxb ?n)Hʏ~ v "T endstream endobj 259 0 obj <>stream h<1 E@BM֨U*U!ǯٖQ0M_mODvxbЉRIti X $oĸ c*9fk$[v(Kb:O 7r endstream endobj 260 0 obj <> endobj 261 0 obj <>stream hZY~ׯc+0}- / Z%x!DiAINL28b#U XEE? L [6aBp@Fρ{`*˷~nͩ0nD/R #1fڟS$Ci,aMVqyl)"k 6r 22"k(+0HYB&")HǷWį eAąraD]q-bPY*w^$qj`APjsݔcLbaVBpC3JO4 ҷYNJ+L"~A7 j%Xt$YYqӅkaQ-=.".q*B BaR l_Il?u* =!s7 wwk(|guk\l"}UOz1WWMTE ʱ*-4"u1w_U 0r=[vLak! E1 ㋦ZFͭihx4ƒH4$ԴQ%"W@,)yKBTնl9 nqBw,t|j 8e8e=yHq^pAvIQ`~>F2LL>OʹJ!@vV!)6*MzCSAq蝀X>5IݷKgL $3::vsГ+lF,G+[EkWlѺE^͸"/>L5_E-V3D 5nפ-v| J{qsNǶHq*l昁}Gl<ܓ/F> c F!&e%+]vRu-ORL6wKQY)]i>v@S@9 ޷l F3e}"Tzr EV#h3E 5ń{_ ~ಠ[sr (:.5J*Jpۧ1#C I9$WdGubCBɳ͋]"x1 Fq-lMϳ㇋tڿNj\T=չ}gCvSwY9oB`ɷ]I8Y+ErW;Jgp-bP E8A&1uNTI KЋ>eÓFd>vO٩ fQQ~hLNqSĥ-?gNr\2[ L(-QW5SlH@y C>F';C!c Y͵mV:T!4NRBA+a\HԖE?g9x ң*)6{!HB 3Xbu&}B-P Ь0\"pD ,8  E gQHV+ATHj8Lje Q(T9^WUd=@1MU @EECb A괁^GWup ^Ӷˑm n!.rqͦ/rMy\T|X1zKChU5h:=hg;3@gbdgn}(o]#l i,j}z/'}! E_hJ:b^hgSQ1 W&2p0tڗ˰Z_-Q)0PCv?q) y~N ΗpCI.^Ľxx>B9J&P:lj9 nԌfbyNHuFmSzc]W~eϿ_hC=;e&U뺠ؘ6hmMU^u bJc.mv6; \8L@ [7 nI Rs@"l?HS@>̵:4wMDyrSsW@BSc_޾jnҦ]cBS^<լVi@>tU0ρU{=c :PQd)gsЦ*O0V6ʴh|;KhP ˻wF9~Nc*]f2}ZWe) e_%,~_#}kw[Qw׾7CԀYR # 02= endstream endobj 262 0 obj <>stream h<0 EABYŠH6lU>dιZv }o[9@f޼N$ nm%c,8m"+UJRTjkfTFe63[H9Nz{`/" endstream endobj 263 0 obj <> endobj 264 0 obj <>stream hioOdq> i"ŶM=|eV*KHw7I͐k,vaᵬ_y%)0`h"RY}X`p 6-qOHRL#ٟ}ą6ȶe;{'KP6RxO.&Rd OWXw{:KFM9TCY?vmd2P8^L|; Zcp ɊhvgbzEXn%YE : I m$2Dp DGswz}6W>oU98Ym%6{RPIuV:-Yۍ#v."Ȭ FsL{F:CB(s}|YAN8_ BݔBgz9-Cݦ~HfICr@*ez#~iLgz%27ɭw8W翾Eӎ]@yA1"iμA4(TdFaU9(̒w`-  9p!\2MB`=%OZHgE5[.4o@R@e ^S aKƥ:ȝi+X*r#8 fY1[RR@ڛ= ҼD8 >f($j`,//Gwda\/ "h/(3aY8^T8PAk_ J6.@ę/wevoHOR; j_|do> uIyXs_it 䆅\v'K0du >kQ8@{AӾ}.83M;:rBSz,P[tl!Tlז~= r"uR~} BkUGBP>T. uo!ϕVRdۭ)iB K5ͺ >xY`sr?`YlF y /ef%!$XIb79 /e.um*`KB&OpI|hl6;Sz ٴǛ!J= m2%s'x#r=+LyjzDuE uB&p#LwOw㪎ă2g_Ef&CvcJ!)y$DzXyY5ϲvTKV ].׮[8w=VfkI!XY J_s-gw}N@Z\=M>)E nnbJ֝~bى쐈ՔAx[VYft0MSPJ& έ;'ic.mZ7%&TnaG.i_X|8ͦK+tdOXRCc^!7A~{k] AXA5DAƍ,C}>%3}?zo@2'͙ٗxzqe6nl -n9S{dZ 29*B0!k]SHi:ݾn P!Ԃ!Tu>5BiTd7ݪ䕃'ce_?R`.HUjWy!ly9t+Zlx.|r]W`$*`ɊbEO*vT YUlc-msaWAށ!5_-kwThPJMYo\qSY5'ÌU|(Szf|!8g3,75s38.1-S*uGH&)QU՗y_s‰ǝo HDh s2ӟxҌAzawTolDb؉R?2=>ɹc˂ (g```F!=+#A65Kd؄aݘȼzs&uWBܔ$,Php;}'C]:%p1m(]][u_hPuD#DB2q̘H0C-ɐgd1v`!rrO|Nsta2X0 1Y&>AQald11S[,Ȭܠm#d2qJ@yT}>w/L<| [\P" aQz°JVؤ{+(;bMJ8[n"cZPo\w\]]6CzK6r:Ȝ󅹻vϗ*{G7i0|ئ('v0Ӿ~($cS }/jХviUUm,#úllb~8]Hx׶X1ih6<_hMjƋ r6Յ"~ȗ`v 5hQ9\ӈPS[ݱLݮ9;-mKr::7{:ڝiNA=8 eeeeeO@W`gf endstream endobj 265 0 obj <>stream h41 E@ `"CU%J=5l$LO9x\Dڨ%\L+s) :Y* S]4K/Jxdco<3׳1KY|;1 endstream endobj 266 0 obj <> endobj 267 0 obj <>stream h[ms_3W&v\r9gJ\E$nj7 !5MvK^~G:ޞs>ZkfGF̴D ;f9_'?|~'tymLQ6>T| \lf ^Hd% hAm͉d [%͌ V(':~1~ڙXN;Q[BSsC4=ַ #ZotCэB˜w͢^7w [#91Bs{5ٽ Zy6yawFZ΃<7 z/\,s]|*9J~|70x&k=Կf}{*璨)(#4G%GTyѻr@n3m6+7O4浮r}ݦf`]6_NSt51 aTh5D7/thFh$D mh]VLqzI)v $+CC5QhEQwI#υ+0ƯUD讌6d) Ѵ% FF 77RW`9X+pHl5]mKl @[k :>[sx}0"tc(#* MR$t plyZxـ/>= łD \^qeN!OZ<öS, w\U8utdG_b|9#ՠqAR;^-Aމ m  @Ab`̠4~[\Pp=(M}4BJC대(3Ip*f@@c' * 0]:|w6b j#r(jk@3u!;m m"<ʨ¨`¨y x$#v:XY<'h<ΙNA01@2G;*Q߹ګh<2;x+']Z{>z5EZFh Zv7Ly|v7^ChBHMxpJ>\N2~”lXk6+*1eW7_Vy3<^a5j5VSE) LWuv՘1n嫟K0bO%&ያUamyb9VW*մ_ndhp5ғEUm.(lN}Kzjh+ [nZ -]7}q0Ǵz|O%H5 ^&e9c7kƑ)zҮn\i9Bg q׸Eba~^@Jk5>s`ap\ & :Ff [7Skm9}E)Sfjq|=[O3RYq"_7өԜzM*;w*rz{x`^_Ƶ2O+/^o6ƽ;L$@Y48n?K9/(RQԥI 4- 2?o='aojaT ]eaH]rb]hZM*Qv 9H3V}!w,F&zL}9!eKT4bOӒ Si@)K}8'mŲ[jDQ01ѿ!Llŭw?SUztNSi| =63W$^U,vt>ob]=Dͮ->theF,OP-)g4{\FD=zCOfR%Rj~>c wa6cY;VUgpT&k?ReE ]H_i6۸gyxrn"kgjnw8nYm {F\yRU )|4~Ik]-t~gH&mU:} 5˕X(mV)94T c]bo~fqϩ1)Sp%ȏLZuk6(L2ts~Ҿd-ҕ@ ol3|bZl Ww1 5vˆpJe$ ثvO`3y\R2#KcVjඁٽ⻿$`9i-hHl9jEoB?G&;Y)_\/Vvl4>?Ѓߦ:,!F8үEY/BljHPc^P 4xoKُ8;T?f?9S}ᬄTaZphZPx  [?D0r{x?ެ'G;RUs6{иXw50^>Œ8 3c k07y|-6AJ۵^ݺ%Pb¼)tɾVRN$ pHHʰa |`[;͑@PFx UKԲB{wxX hʺi&y2ͶtM7em??L`xQ;IYO /FlVy۬tZ/ y:fM\bʠ&9ڢs4Ǫ朒ʕ6|$Z[WG^V:$AzO&%M-hd f%hm$X>_^$*`35KPR@yJ2hnFqBli2+^18UZvx.Ȳafo9y|iy˻粜ɸrnq;wmXcg7tAHRꉻU93^,_k~iѺe|ҵc_ݵy]L)9w #$)Uc ujƫͨ0XU3Ŗzi4ҝ_j(fr9Ru%edmapN}i#f$].~/Xɟ/yR}r\mXmNzy?~z>Y4 ]uSl֛P/UEd^](?@p%,<»G3+(jFH9`,n)?;r endstream endobj 268 0 obj <>stream h410 E$ ei5٪eD=p|l-[mA0G#k[@ؼBPIscæ3qRíӵuF`}+U/101όk93T'}B#/ endstream endobj 269 0 obj <> endobj 270 0 obj <>stream h[ȑ>>Rf݆cr6g78gY8KRv|u"9 c4$տw=%Zݖx~uEVhuusPUoXqBGpEW[/("qůh\UjO:?_ ߔj[B C1"$Vpp8T eB$da!BR8áj0Udբ6Dc^UwyY]nRwa$4wk4h 1tiTY~X!ToiA:$+h$1c@rZfo焌q_3/e_jiw$pI256]C_8 s]íKMƈOPƚ笺B"R=sF%4kߠpn~ YoHH] VEm(Hf{ "Ao0{pIBb9:,}zzW*Cy!?s8(s:dKAV:OƘ]AXߧUv.(gtQBF6@01 v\So8Hh P٭rY1`sCS&W Uf96>Y0!M!: _ݥ'qgjwfaJ]V-!MAejR9;Œh-;_5L֌kUW"xXqP;+d r0qT|ip."IK͟.=Bxݳa?e;蘒Hec񰭔 P*BbDrmw[f5,`vwq@.!%'3W9GXd5vn E2Gə=K%x3gimZ.mkaz-c}]ɗ%Gq3C׏ZhS[O+~}HOvإ]]"Z6۪&)2QG!†l0ا;gqrSPB Ԟ {MzqW~"u5:zgjZ\V2g=)|sA )E}z|G{&6d3쁮ty<;ZßAGjchZE#( {7t/A-X96Mn)U+|CJM>Oo^C<٥;o=.-NAZ h_`Yf6qǥd*)プv{"wH647tz/Y)d X^Sg6 D%KX2HXlsNCȘunl J`9ζ*_ʦeMUn ']J&m|l/א7>'` #.!.|΋_ʇD4خ;!p+>,gg,N <l(-Ģ҃hBC|cXf8_tz|?< |Uϴ؍}JlyYK= bm _j%/"#J(31}d6Ws՚R\eZ{0RAŐSʏEÓ)l7G`IbHʟunݓonw?}l/ض8Td+ϴq*o|tmuӔV_ $*u&l~TprHWX.x"֏!D tADTsm^b?h>X HΫe[dOGca f1;~L,*py(LgK.nŋfg\!/tu_5.L5t =6J\hF`U]lKH/2x؆rD;B֣EjM(ߐwke hA̔Iny݈m2IEiXuک#%CvXW*"m b!#ޅNZz*L{p{VA\͘/=Yjҡ׿Ć-)kz˶-*v.~zw?_P =} -<ܮ"feDx"œ$I[6>l`ulvmel%.&9-MΪrN%N,\uhRT(@eKerOv;s1ڶc묈azs)C.KO /dښK9M}MG O^xq]n7[z +xԅE6id(Ţb]i=_p_>"}ϙQٝj[Zfx+㻄ϺI]G5((@,Xl"~T#,]Yk)(A+p >d RVzbF` >3g܊%W)&%x61n cJ…-|W!` He`77 -໤%mV_%XYDw*cˑToOl.B4o}Hq+0~e$~DB G*T RAg8~tf0z/]:FZ}S\°g\G94q@E({/^}b1ju!CLmOh(azu<]d2'7ʗM-b6P"ƘZ++=|HyZ@u\:xQeUW:3adr3rzi%_I5PmCz*zZNKr U5<ȗΏqXb~/DdH3^\v𦤦C,KàP׺##xHC*"1z Eq*x 蕴(_#ja >*gm|#ڛsJ1xF]jtV35H9WCQClK83U>1f#eX+~Hִ48TӛvdU4]D%jM1]S7yy_84 W[Je op!}?1g9U]f@'k* K|LAM(l42C2:nne[]p=xlۉ41%'QH8~qXQ\+Ŧ$F|[HQ5ovtkL,_֡hZ/ҏ2գ[5'(=ޚ'!8qo7h?m)8'>#s젂08eO`R$~!ěl_غ7Yy. N@vR'X9UrJ' ϝ+ C8^쉹.^sd뽗hOƉ& BI]xHEv:*eEi‘ hɦWnt*23fc\7ɋoCJ'#Am0D}EF~H+}k@Fq(*F|ZC_pYpMI4j:Nad4^l^ təMUiEsDP&Ny4v3O.w_Fl)u Z$ E^ єX_9B\y1 M 0 endstream endobj 271 0 obj <>stream h<; 0D7J`$[ )QmyaD0MR^刟m 2K[mf\ޕʔN4!G:h (9k@c =2Аz=u)O: endstream endobj 272 0 obj <> endobj 273 0 obj <>stream h[[o~ׯ#UN6`&*`Ai[[[r%i;!iҎMA6)r8g7sf_$ُ٫Պ%$Y]FF'~Dqp '?ggc\>y5׌$W&daOJvkY}^=dsL@$pP7jA&##_ !$JPdLz0&N"5dI-{W?+@W{Ňisޟ앥8†3HaRDt!91 gZr%NGg4{L' {5hM `X9^cHT {#ZH"]K km fRXB{W;4>),Iՙ@* Taft,;q.R6.E"צUbȔ36'MWI{G+nǁ+  7pP) _᳆s×5"t<Vf#1C\F>bwkLzq o\0w29^\ Zq]AK%zEp Zt*Kd [V-l-x^AT! 1F=:#u$Z^Z{7ҙ7 b 5jEX  oQzXh kk/+iDSމ:{# p t=+n|t~gs:1!x_# 1^9'lI8g7>CDG?~0UL4Mv!YX*V L$KYK~!0䎺<Ja\K@ ::AbF v?_5* S nW[X()}c_.[M還9[xÓχ}va0#Mݔ¨. lbrLRҷ6w_k-t3'voqpd5TyH:dݟG}Ò Nۻ՗=f4l4 *#1vs{iyzXt ]5;HJw#x&Ž"T 7 ׇ]vIcvh2.C!NٿO~zyQtc^ec!Vp*~/|'# ~1c:A$uIAP9q(2V~E`9u]\òYlֺ2IweB a =ʤ[X*UK67'](/lAM VZa`dmFDH{Z_s(ݥ;_f2zz`9ǣWXsۡk7bZts /͆ Vnu<&t8:o4׷mѺO=howQdLQ f{k&v7Oyz~.#,@R@u\&G:K>2*M`ճ_c ƚcL8y=n RZpxT6tS ;LY"̑Nq $ Aì~9&1Aflt@|>F%ݽ]boLÞؘ{!4Wͽ 2O|t؞DBl e#L.M~sxZN'q>B4cCڽh}4u2 ]/nzMK7Zt^ VȪmFބ֌I! rѷZ?>\]eh7!yCWK͹zFfnȰw /K)sі8&E?O׷>Bذ8]Z0T{pzS~dCAFmG$'DCThJ*7kHY4}E[b\p{ #- 3WC[qT"x wߨ93je[j=}KS(=arkFnF~/fvwVTƼr1f|2=!vk&Y47u-EMH0n/Уh>rDzXOqp8$jfWO "a .~}ٮ ,Q`> .5AbU`F v.cwosLv]z1;m;*׻Jl DTxPVT&kF"2MhV <$4kf~RGpo: jQQ1T>>l1ރ)W/RN9{b}?(zc7; @\`I\R.0ND7jܗ[ 15BP2m/ԈW?3Ev|`!H5;T^\8._Zp>\,b1&|X1#2i DnopEHE 8Ʊs!D%ƩO6&r\YI>j.ׂO%bB{7~JD @T#k"½^K ( ca'j P +9lEKNuSlm=lxOfQWlBm㹾d%;홥%~'`~>\v )"r> /2wز9.zǝFq8ႂ[:\s~#NoBT=zA9M ^!U0ADhwN߉;~'DhwN߉;~+/*x&Dh.T`e gklN?K ֏т^+x endstream endobj 274 0 obj <>stream h40 _o'lB*nwY6ڂWC;\| \V9N̡II> endobj 276 0 obj <>stream h[moHr_oC-\+7 vr:|%D:4}ͷ.J얼Cn1cP,UW{=Vݟ|$+zݡ$boʼnXŌ'dҐґq[i_yRTvhgr669?k hw$!RKM\w_ӘG[. c <廪]! LF3fH&Nj”q%Zpd.=M!QLuȞ1.M%m<έ~~Q Hc82d*F#''I=ĮRX3:SБ)NC`soŕH?21JmiD6FRâɒ:tk}vm.0*R|)F&4.m+{`\&C@KtҖF8cVV`!eaߒ@Ah"{~t)aAZ.xl1STT]G7P$=S9F1հD0RFAm`Z`"۬dDSq$ae!A l5jY:6R ȣY]Bh2!.|ɱ6l‰snQٖI"%<l.rX{(\o_Nv,TxGaaYAu | SSEWFB"oBC3!+ߡd!u>jiܥe ˳<(͹2rɓMz2UvF_Mw,9r΃FՆ-SE&fng, sX72&ZiԻγ*Ad̗!!~g%cC7vH4nOD.Xo_i$YVbgO{kcc.jW*?]UO+1WȨ8~N٣)2ϸwuvAt۬'e\KYQ 疻jb ^HT& o 愍2ʙFtRDȍ:}-̃Q𬆉-Neb7GȨx n_M|\Dʇag}9 dzL `ԕʿt#TjϩZi&1<- }S~ ܛ͵Ҕ-ekZR:( ],S iZPj|;c=94 wZD}.*|68%eV0pRqv\tu.9Qx_鮓G/G#gf{kWlf8{Ji^3ZrK*[ Wu88IRlB珰47P_̀ lc x{ԲGK'^!@JS2{P*/ER%52r1ue} p ?#Ol}ɨY %9.&ap"G8^FL6Z,0:Viު`m=SZִ@f[>kAP}oNCP90Yy'JN%cyQ",ᲮgJe8 n1ʹ.:4UzܟyOL =sV; DA0g$ަ=W?bEJھOgUjj u,T r$5/_%"Sk[v˶fS&+*UpvK6-{I34:C_X(F=x OGḙ#lDuǹRuuX FZyl`x<2ZT]|q 㖝N,ÉdM >l?`lX\֌ρ1aJiiԀAmW>9g+տwkg=}*!j_2~7 ( B'b}' C҅"ǎ@7;d@2@+A>^ztWPbEcvrccphazkB, x ExNҠ39кJ;R>m`Ux/IaA8 an$$ *ADL =۹e&iϾW+B ]%U~@.֘ǔkͰ+ыͱi (eI|L{* ѣ2:P`(ʔ#r8'"3-6 ,] \T̉Gͦ.MFH-R~Ҏ9y*" +oj. AWļN`)21-*dCܒLnw6 =Z1[ Ac^cp`ɷ 'r~K?pD9{E=~k F+:gQ:*T ]Vƭ+Z ұHz,Շ5ҹa(qSpHQDM%*RNYql}Y6zʆٔ # mmWױ LJ]L[DJpT>|rCj=έuKQƯYmjT^sf݇px;yͷ1h tY/saRZr6+N-)/л`^A nVfQu*P>sĘߊq\ҙzn eӘX`-dKoY6qrFl$%›< >LFȖҾU`q(_f>ՉaQF;o0͒|yK/\3(Io>Sﳪ/#տu JHovU-U O??d$Cz`j av lȔIFTɬ9B/m:F5>stream hj`0| endstream endobj 278 0 obj <>stream h{i`TE[', [ BDb&tDp FFQ@((2("t:aQ# ȸdPT^ttXrԽfg~| ONmTթS$M'2jUƛ#eP-1񞞛7F|"QQ9b/&c~OId;1z~Q"7i5k#>iڇr12ޣ1ǐ,]^Eiv%ݓZ*.GOTWXEO¶m"=­TYjiB8+c*C?A@G5_Eq9!~Ho5Z$SKG(Ӗ%d]IJe1^G/+$\MP~0CA*"v"G2ԅ;R0Fi5D][?S[xGTTɀ<"=IZ]U}gL@]E崉ޥt?D$ƊgD@T#2Je\$W~5SMߥ7`̱[էT?^|{{Н?0@+VvBU 7 bX(ow%V˻0N3r!Zߍ=rL?kBN{F hk=VO//Cu3e\e 2??Qf5zi?Ձr4#VB7aƈ 'BH wg'1Z3cbX"VAZ̑p9Z>$gyr~ȝ#O䍵dvG D&jS0 un[(f\Oџԟ7wwݨ43NLi&MvZeZ|kuS"4Hk\'Q$4:Šm1*SR![#Do_Jě4͔2VP|*啴W&ڝ2͗Vѓ6nr|Z#qP{hML"b}(A!f} }DS:TLTA0 }M5+30ջlcXݴIAI-ШTӗ_vVVźKWa8nJ-ªΧ4[`{xOtqBG7ځG1*~GQ%}'Ez8jL6Mƫ.rC};Ex07M(CNnE++k5xO'P Xϯ`m;qJѣh߃zboF5E9RFja$'=?jZU >1ڶ+v~iZH 3ueRROB |Xuu6ҫٝ816W`J+ E qԡz d@hz@xRgjwWNs>E)~e]:w3]6MV)-[$͛5MLh8QԭSVt2 ]{'=538< >$]&+V|g䘈~unɾ^ɾ 1t@!z%GU:uNJw^(M[ڻ+;::#ʢk!X @2ѸPٸw2I:*ܫwIr/ >*?wĤ<"@=1mUU܀_Yze܊XQܶQo( hËzmn@)_ş3s|-- T( MEE2%4M Ck€xM'+{sJ@Tr䱥cjJ4ޤ`B]E }IE{5-kH-o59;'#,3euc@:5y*s,Qr(D7I ѧNgt'* S$-.0Rb}?4 葳S)fJA֓UC~(h6*bbN!cw>BvL.`(c;K; RO ?@$0}@ш ۵- bΩ 49C95MćFOjͿظv dvJ;`hwi;} Ί9jPAn(ݐLT.)STJ=*A)UbvE'%]1U?0"g\)]ڞzV,jjWO} FTZ+-.^aOM.,ϖ.MheNb on:1VtJY,f (YneVAaP [ܳ% 7UTY1ǨGe%nMWJPT'&hdtbU~2^ݏrcĉSbUJO"M] *'P} jFE[4T|C7 6 Wk3lF!J : \b:q3ףtD[, !hv梎dDRs-@x1򋸬?A~:ClۚGHC̠h>>pA \yUKQ}>0g*90gϋߎRV U@ߝyIg V v5!g.T]H ` (:sJ_3WNZ㮙;? h67 .Z,Y^/YXgBTmJwp?YB ]VC2ŹezJ۫-Dy\Xx=pi~X_5Jס!BCOO)3} ی4GljCkK=sOF km=X쥥j\^aCz9UϡNSFxoMw ?236 |! 0H= k0H0^SOz%@UGo4%k`і^Gg\.hH_#) ]P `+߁ǫxo`h`IO>=MO+R/#)-lނu 9mHsG0'`;>Vvx uu h:vdVa5ao޶Ok&iM͞Z2^Olj>jמ=ʢ}Qv{n:ԞƺxZ]?@!{IQ?d*~&m^ M6<.iP#>dQ!CvǚOLAS '_5D'VWjlhXJ>w<Tcai~ 2rMOyZ>L ljոj0tl02TXCpF8LKfq^?aj:(0t|5ef%n/m z$Fm#}Ox{xXo>ʰ CA8͂-U2=܁OsX$q?ѴRH"[ZП[B9ڳ͐hzw{Fs\OQF4erqǿ|4J(F8x>#g݄z\Ȏ|s \N,%k,0@>˲x>T?^2ӧ@CyX!b_H"pux\*fOe{mah9 U.P^>元9_z8-q#:3d:lzy2j;ioah)a֥6HњGف]J?ach>@|F}L2xOwܢ]t[F7*p┠s gt1LG#KQp + s" u,xMB8q31d ⋑5b 20 <@I m aZU2W/o}"i\i![r2k#Bu=]b >7UW#:=kDn|y F8G i@Byz"M^֗3 x;';:'gK~|t!(_(|S3@#@Nxw.!rs99K/pWs@7*F!eKȳFh/ECgs;f}.z Q?]|϶Oç _V?T{?);EEwf}g_AVݐg]|%Wh 2Fq.`(eއ!x lqYF^C+q~v-w>m27v~ / N<w'o)|7d}~!V<4̡;s? eGݔ;Qw.)ޯ6jv(;RN5L;W*9I FE =OZj5]xtZ;䦴о>e T} |aW;+ yr16oC=E}ԓ d?_{Nw[j{etFb6jJv5Ƒ¸/M;*6h( |;3c&4Pߨ)I1tt%iݩ\5 5Twox =]Vwa;4c`mZ_껟%M\LZ3o1Ǯ:)0ƽ>z-G[zzP53\ DfwoΠYGbGRG04,9l_&~W,Dq.:ri N$ CNX⸋5a@9IyoQ\ȤBW#.4ԯXHiH iJ$H iH yP qH = DžMғ/"_H oB2Hoy9E"}lE?Wo0ν7-7 Y}xpܖ}c߆1ЫzӶfW֗A_ hӞjrToq)ٌxWgNt#3lܷAgWo?LXt=spg [`yH"lkG od{gB53áh؆$:O~Rh}C:V@n>D ]fgWϡ}HרT{uWR2D ?z7ղ"~ Ffd2kCFyدrC顳mT+D="?DF%s{V;P579W;<*!/h=л5&;q&(]}s:|AuXW%%Ifuv/a2>R܏qsR K)}ZJ>]˽:{aZo%"U߸w5ma{gX 7;2wwغν"Sos.7\cp  lr͉c gzcpQ/^N!2w`|ʁJMY`Fw,Ph.EK`+n턼ME,lÞy/(E;<@; sBи14.7jB2wOuν.[u11rgҷ[tv\H=8;o>3^mZ.xnUg$svkvad|{myƜك\`MQ} jzmؤh!;],p|?Mu$?2j@ C+Rf?.8gy# Og]B߆cc$d{gpAs_P{D wI)77_= R?ތR8rPorwJ̖4@Rk7 x|m EڗGm%θU}8s@sT)0`{2.aKs:[v(ǐv5 qe㼞\<6h- "o?q^ᘛ*L(E/Omo1r-5 ]LVye׏jw.5vPg12hф,c`.ְ?zs&X~Ooν{?, 9}s\N^ik<алozc6:;6yCeV?alC+S~ƺ\~olV]@`;נeaߟ^bD}+ԅ]mƥjT"n\-ǥ|2K5vja{/0l#o?t) ?`~$y;D7joSuw%aa|1j[7Ωw,v¦wlPvmb;%'"%X >b v±Yfmu{l ^uS&e;SD((s)/C>K(35pޢ8.my:(L o9W5$s.h86O d'=2" 2]`87<#W/1 aHLMi0ߋ30{Q4׎-+SF@R,F~mCU'_ZYqrJX5}n+>8ח{e)zEW\Ѡɶfysˁ  hZme0ϋVjr5l@їCUQU+@P*lvTg_Uk9Vjc9pŦR{byQX56O4jOP> )]GD $ f\oytݬX@9hr \~Ny8`L=`f{'PQ6ZɫMm:mQrcb(CkDm}8 @ؤ`]IiYqhu=GY^VͯVyT-oV0Q+ÚE Qj:J5ƼGɚS[+@7 0,^(0w zZoonow3uoTW$u}EkL xJ^њb x`i̓/^mI~ t݈3}ǥ\CJY}U9MATv#$V:ea`)'r3݇(͠Wn &VȊrȾ$X';+_m)nq",_cЖJj4RN/tKߐX%Z"A Arb pP`jRזlE}Bͼs3PB+hS/Wm>f9_gS5ZfJfF͗erb#0 %̗֯zv 44WP1olM*C> Oa˩4`:r {>~2 kRpDq%(Q%Is(V(G18[ bő|p#_q#WG?8?8+?8+Lpd##GG&82>pS>pOqOqĂ#UG,8bGIsT URUG8G8Q%. =`=eXeX(=`=n'P4`:o%x+oRIGGpGp p pP++BqP; `߮yjЃVNmFGJ({VnJU):fnˁvR-;[1Vkn*KƘFsil4LIuiGi=M{PQibw؞&6GDNJ([BpQ话ݻNm鑗4S;z+6=k@6d)W|[6 c\ǿYk߬CQNl Rl`ޜ(bH[1 ;dCлdm`@[ɫ3kKLCPl@mU*NCC)m# +RrEۙK{O0)CgLrfQ -Q#`?z|AvT!hﶌe( Dsye. 0}ѻ&ew )/y^}$ƒy{j"᫐ ӽމ_y'xޘ6D\7A/RޫR*y{~o+og6_ԛG'Oz:7-u|pvO~[ìVW+ja5Y ==ڞhczta]oc)54Ǒ_]c%U7IتG5h}}˾FQ] mttsm*%E҅\+!ƪ1DQ &7H4{-X_LL| 1m1~3vo{ٹPiRy舥ڔT_ڥK=V_MHGEߛ&З&KuԅAa RC]ϖ'iOm:U]kų6Zz֍FjcdQOYoG3V%3==#Қdˣ e ws5`;3(sAe2{g24|~_@[ yT4^dՒ'Vg$q_B- ϳpȗ(|/]P4eT$)+u ,W$N8+rXH4s%lL\׻P{ǷG =o\ nmŭ* c uB讱CކYr]C){$Ͷͬ `c sR, *j\ozT }>IREErziN,cp 'e ƶm8zn?>sSŜji/[|\evr 3Lu`Wfe "1Nt8{*:[dU LHM}6t#O>=$pI؇,[SPDq ƥƥ?UO` ^1U: a{Z0^Ba (毓ֽ~Ǐׄwջ%Ff۟|Gnp=Mvk3eo endstream endobj 279 0 obj <>stream hTPN0 A i#KchaODNCߞb-}{'oL '˸ ˆ'Xo:~[M#{.7xW݂|eiнH3R ,:!/:A2ajC=X\6Ț&؞љ/VzhE>+W]9{Oߍ bQ+!~l endstream endobj 280 0 obj <>stream hlR]k0+zL(A-J +< d*$Vv]Oά PXIQLo6E-=]ݡtΡЉ txJ|NYa:qqfX8I VYP^A* 4fŚ_=՝W+Hj9oIv+R5QB\0J^f@ K" b@ ^JfkO%-S\_yvW?FbcVtlqpU8U-oDW^\o۪g̾owk,w_"Yq3(wW٨YHw1orϾײW^2"=C8?Nm?97ìg_|<ń8 0& endstream endobj 281 0 obj <> endobj 282 0 obj <>stream h[[s6~ׯ[ ŝ@ƛɶig[샳Lܑz %rdlywD7W5H]0)._Ƙ\wzyA,M#Ih2_F{5¬ _]2b >N~!4$\#E#őaHotaDP^ 7BĚ-VF@D֯+s4^`x-oH(^}kݔrbE>-l[,Zhb%JOF (s ĩZШI`(-k,ᘤ>%nFx,H0`RK"YIJ+G}Z}{b2Hxq7V aqp>P.Z[e(K03`p+H4xiE FVBcz]K{uNҭF=2'dq[5|b A_R&N Jߺ.ӣcSI{mEWZXarRX(6!o>BKs" 6btlmƷUpN:JꙐEFx$8tf6ج[vVo;F_UX]R$<1*$4>Y+# ^WhX^{l/ :_kI[zz]$jZxKrP_zPj?kr&dO[2.zYc9ҪWt ]$]a{4#U0,xNACv u8NX7 :L_`vؕP԰@Q Z.jֹ?颦ROuOU 7E$LN"Dko4 }Bj2˻J"*Z!p2;K/YRKmV;<ivmycC)>ݗ}] B2>+4eMAZpyb̳q@0V:KDbMaR`m s> Ύ_=/dHo|J5+w 5$ڲmnJ?P-NZqt Yo>a8$ǜ{1uߤ i;OoAd Ķ˃;M#8]y+ٚFBPt1}vjRM-6v󰤀vPU\MQ v\>1zz l EC]Os`e//˄o:c>]1:fZ"?wxަy "Lp2z80*)Wޅ46?K 'ݽ uWִ(4*o(h9ht2m\[23 MH _ffWP2'7 d!_li6;?tBgEO_]7 !xm|9ŧ9[h{z;cN2`a D܅ E56cPUDYqyFD}Ṅ,Wd 0Nf]zȃWR J5C)n`5N΄9$/ՆTqo2͋VIJ*r\Ŧ7䅻Y5[XCi!/>#@AETmz_ŷYnF!fv }e0ދ;uz{_\^C{Gjl(,CԄ>dPu^x=bǴ{<>EUH5Dc1J$ 39x>stream h410r?06rݡ9KnvgVh`գk, vlVtijb!.S2 X֖C 83 #3QYiS9ozy`t<) endstream endobj 284 0 obj <> endobj 285 0 obj <>stream h[[o~G)h;,6E}g4ԕF{&11ѹ_ȏo#ZWzssCVhuBq*7ɢXe1|pft6cOW7WBl 8«%OhŤ o|)VAbsbkNU+I#WDL?城Rj%WQ# VZ5$E |socLh-oHHw+}UH#OcLb+̳M6Q$AD*=U U$ fX$ (FAF=ªUӊeimYD%ۘ'zp nbAx-Ra 6`IV,5ET>g$+cks` 8#SEn,e"ܨUbM#s"&^ nBV{:#8ՊKrl_>_+=:B VhIO̵V˕_ȉUdcS@IIM ] &wE R%R^ hwx, ܼq|W#jhކ:hUlޤxH';} Q餧X؈HTv 2UUǰuce{c4aea:#6%+QIzH+㮆!˲ߠG^io+S 3qe㉭+7%]o|^83.K2ҹ b9g+;j~"E2zz:ZfnD(r cםcz-u7*&LT^4ޫr4bL|U+ tpBȨ<$P{[KD\`4.]œ8~lN2M)M'\s tqE78BK—ө*Cڧ"aTdu[H"!yNݒjd~>x/jLtϊp fnQϔHU<&!q̘!SHn7SE2;]?flEl- 0>=Jg*Ju`AjDb/m* 1< #I΄њ01ZƐA9 )Xa.R 6a10!dfJml(COb6:(Oʼn! {7T„罪,&)%?C6Ccɠp OK 䮠X ߺO<˿:L 7EPKZuu33_7!48xXyt,f riqSx yS:(bmgSlmF]~:89:!/lLAG Ώn&>dm<&ٱt꟒GZ #AN >qf i!-!5Q؇86ePv&GO.٤ ?YgT>4mh$}†*iD0#W}%4E7xH GWJ*B1o*wKgB,lF@KG™<jURQa{r6 Cj$ `f %6c8ID6M̀`0 2EZ=A%!D8 1/|0}0.kfOsML9[ Tޫ'K &!F AtJl_]88w(p9+ [$wOPxXP/P݃Nݩ7zgHǭßT/mv2c.:MxAwN;v7#ʇmӮTl lF#RQi}5O#" M45Qj)(89L6e*B{B6P 6wT;x99vPq9\;6V./nbgwf+' X=ljg,Yo;79x}Adf{,KgY-ث=wzni-ͩds6o= _(Ԑ 5˄^|X 뺳{rd}npU-&U5X@ b*5 ~ABH9ﯪ?jK+`>ۙ= l$iO }Ru@$|v;} fFѬsYQFqI4fg]gfhE/Z Њb!> چr< tg/Ih|K7?[o'ak5uaꓘjqHEhl"E_sZbZ;H-92=ȕ/N!4P8|Y2=ԫ38sŋU^ٻ̑VT7޺tFsI.{62״Ds>D6ƍ&]ɈyYFnؾ:"%ҡ#&/=G4~4\Jĺ{\4:8!܎cGg]zj.Tw//47__B/W_74_,؁ 37_E_/Bb=1gBߤ!PG7&eq0U 3̆gfcT9_9\Y?$?u4‡-cbRǕÝkDK^^,Pԁ.r&:̭6E^ۙޚ*"1P}3|1yX4mujMm.Bui {Q<\K1&{r1{CBuo<ݔÛ dItx2=st[rm'GVN}j6 YGBܲjB޲ *@n{'lcj {UX$φ1?G]2p Zܡ.QO'1Jvi xyuX QBt55Pɍ38Y!/nmmR_:4&3/mER~x [֔ECɨx-n Aꪞb/Qt,m'Zg2(5iù|"&-,3:UEA{ zX3/#G; aXLBA҇?\ l=S{cR3Bx$,S<=>ktѬhn C*6YsI^:8[JlS͊Ô:{*u狰II<b` } ^$+ߡzb༦r~n\/H8WaIcoP0zhGܪ쐆Uz*RVY|?׶\kV0*3AЕ5ⴒ46~%U6$Ksz"0&}Î*+uO5+H# endstream endobj 286 0 obj <>stream h! ;6i endstream endobj 287 0 obj <>stream hԛimY:g{}wCz7Izݝ!MI@"SHA㈊" "8 *>XW?H)R VysVwg=dN>;My{~{oCͯ7??1ToLGW?G~onO~G^lpK~]9[[_G/G_{'''ٿ`lI>?;{d>OEMjd7÷P&_kd+jN'?O_1)j_O?YHf^w9ם=?p^S|x!luo|v;\wφݲC\aɰdr{rO?ۓ}^Gy;+/|ś'oޞ /Uf{+%bx/be9VY ]#lX/[X9^Ye?᥷𾈕ee}+77nc7ooo忺y$>oՕ W^xonL %O_2yU&*3+yJ/Pq~ơRsfCi[kuwC8PV呡*{>PCɬ>J9ž- *b7{l跰uV~([p,vCyf([~aV]Cyu*gCox:b6ߵO:k 63]׀yqm\zky3vK뗆񽧇rd}VYʃ6whE\=j/dm.xGwmrߞZ7{P =a(oʳCe4TCyh(_3PǓ{|(YM,M^?|:ʢ|p(/ya(_6(w۷,hv+o5=fx![,|pP?y o~n}aCy1|ź[wM01'i?yP1/1Y'ME?9΍3>Buup6/=gˏ)Rʘ~SWp+D-/<ڏzS.sD}e!k_۳Cnwg3ˮ>\߻c[)CS傏鉽?&ȳg77cc=s77a*͌o !vȌk[pCƿjZm >;- #S[À5:/!7|&?{s Sw|w`]bM};r53R&wzs(dCg0es}}&Fҳ sb#ʅ#NJ}c`?1}3;N? tx"V a;c^FR|Mgzދ6YKK/:q_6יKs^,}?0x N{_\}dC~|۟ `y'%CPk8_4\ll֯]*۫Sm?7FS}n=l猏0|͋fc9>zyOTWlF_.WƼMi׀5v?~?8++Q7Z[XoesLVٺjn/ם]x3l ƻ}a'k\muSnV%1]O:y6qa;SoO輁9 1[]a 6sc0ɾ9(3ԗ[xsM8+X|dm_/OҀ潆S^-`qme}X}c2F=s;&Un}V"@كV'I=50o@V6gKȷcl"W畠a?k\9 Ζ'^RL,p<9u[2vM :ʚϘ.)۹hu/M|tBU_ytuԷZC#c?砉 H{ɩ%hN6˾~\^`BV΁w>3[௹ t봓J%O~V8˕+Dδ";Y vÕȳ 09,U+yM%2gm< p༱N|ϰo&{W,gM_ sY^F ':3e=QɬY%4Q3|9~ASolY빜aoAw2AG.sw9 C:}^)*?ӳהh0O>~C߅5OKw*4] 29>F.k%uH++߭"d?\ tA>KZ 3~~F.xk99tM'^2~k>{Wuwض6q^|^lqrq>٨]0\Ծzf YeX;u4Ӂe\?𭔳XǎgUL`s͠ o޷Y;M>Dl Sgֆ?QLWa'{@҈͟,G~pBv =i=-p^ *e|]Mp_@[˱v?}3XW|6?o{,^ hq>Xgg8K`gaSoeDҏ~+FlFx7謀qX7~VoAV|>@kVuq:YuAS;;G8c5l׿a <Wy%pqߌö g6 |s640.aߢ> 8 Kcp5*Uxzic 9D?2yu:ݟa!lN׮G-W2V~X?eӃ{ȵ0.0niKГ\S./œqyvItȻ{s\@1}\2[,8h]]Ǚ-.ƻzOc5bdS#跂\7X+}rևqz=msٵd Ơ9 +8*;WԈ^M=}LeGcݧMn=`4 y7"he./> ,+w;/<ܢ%?6agցn+!Zz6}p)r1 >͡vkue?O7$'cOg5 r|,8O󰀜n!6a'G]gKJڎ ,=^Jϣ*eY@7<6Y}an< y33D*Dgs4/"QϘ+ccϽ[/e-t1> :N)uo;?Aqnx?|%2:.ЧYLࡄzki?s>k@g/ ?_=g懴kpN;5/왷}>/e1ZhI|PH3݉^ ?SCG3XwCl9p9yЈHX/8oc$_*NR e8^98(MM2W V\A/^qKB藴m0R[o Ge]cknl Nky-k4'4Yq\oO[%lTn 0 W&xIwt5l}BkEbn=?]؍Uw_qEM}8M;Ԣ* ,>wA5{G0Չ->=W39 SA_}7fU7b~yۚf :x$; B {3\E?0Co1G|IwyyJ8˵jܖXE*0|g/3sَC2/8}|uyst0sk~eL:.sI]<_?Vp8&Ybۇqu~+ /a7{:F8;6~^>\8ۯI.c0εcv}%Ư`w2ߨc.^^]qޗskYR2iSmU'e6۬NJhz|X_,=:#uBL`n^0|:Us3h>fkDN3g*K^y3Y_#YS9.M.gIxŖ>bBM+ 9QF8W)kS5e" ~=AV'U[&'&Jsӯ<ͮV#}3c~7^\5c0{7޲mgLt y)~yf]?K~Zxrg̛q7;DǢ^_o`ca7'd#=Q\:-`sBV PCFbl-ozG3'dp!gvƾ"IazLdTVh"1,!Gxn gysd.ԯF=y!/C6-3~ߗa|-=-*quIE52V)(0g~S!sHw}͹2!MpDsx9m|yAGsKȹ94[#2: 㜺\lBt7{fP[tnlzL)0 C2aH]'H3y3ѹ7U2~#K̓ /S?G o 4>sKd\t9Y76T/:,j{h.yNI8IAO ?g,]sw g߃P[w>jTv2f!uj]'`a쳠y Yx;cI#sNmYP ͱ}m ޯ q*Xp6<[05Fד/OYJ?؛eVJ_UW>Y$B6W)m X?M<\s,(s('(wu\1Y0LdDϹL=M:X mBǛAҾ"Q7w*2aob ;uw݅=. 0uڏmFb[j#ua{nnmԫ,ԼPkrd{}P[I*R~͋Rۭ{Е)4߳ cYݜ ɹ{1*+;cNvT99]P܇y]0ntde#:]o;|8o:5t<ϋsp"6XW\pvk~Ghvݭ9X{.|yHZ=:ƔlEcu/8D#gP)xa7[*rYXD}y-u=_8ex7G)xyN֭Yߥ>ggmv1_3ߘ%va|GmCB8aoo2(μdZ;~f[ n3ۃ {|Xt]G!}?ñXMx󁌽o_q9ӡ`͙ ,t@~bGF{mN}jnxGs YEg={ϩؓ|{cEBޤ}ost:d 1Fj~.k+Is3} ^J2ŏًi^N`]8L}GT=? /By҉U/d}nad|锕/W=#,&D?c0gAToiƏ*9躩)=+]L`s8 `yGpk oT^Y}Ra|~Ω,8I|Џ*D-vJ=܆oyZS SS''x}Ah\>vQBJH/g1 7;(=lx)pLʿN>6!e-}05v{Ri̯Q@{n>@9S^&3o8Ɬ"}=m_jkb*ov0=1Tlyն*_:RQ6Õc#Gώy[uhاL|>6VqC5ytڅ=8=#awa@}]C Fd:aRƞUokGyӆݜJx5P^pR3h;mg26c|C=BKYB\TaؽsQmQ'xq^yFb垡\ju{w..6Ѓ8J;8EYݻo.VxҾ<\:0?t7\e33̠+svH!:,c(a\7˄GWa|߆9/gEJwjK!ϣm>Zt}[q0?{1^3ܼ9V_!2zϿY]B ~V8WF\t@ɛ5/Jg\Xr@ר_c= xYC^1vi>\NL(}B mv 98uǒyU]:0uB =;iPϕ^ Gyϑ4t@KCz -{fZJ..6.M/A;B=h)Wma4rBs%p=>_]M liwKXx }Gn"6߹a-Ȧȼ%(}-x/sb*uP'z{g-d"[|CI^"ҨKٹ؂7J[c4xT):}F)-"0s.<)tQ kх}LwhjO,Oo󐎓!}w_2R7a|?z0x|2`.[I*O3ي}TcN晧bJQV(8+gPEU.5bWrmHnDƱ7U[M} Swӻa|xi.w'Ac DONb]w{wl:9G߼3E9Rة+ a7sV{{ݗ\R9y*691=s2O_'gL9BDϢ?vƱU0|އb >ib&a77WӮyRU0msJ0 ˡlb;6b 0 x/1w&ؕ!t^l"[T^~?i,a7n ,nƪ5D ko6a7^و~EͯxuȚ=ʄwO/7 z(J& /u,/ؗ{r_4&ݞj8®c>yzE ߣT{ྶ\|5|eGVxAg~l ^zlu7 ^y׵sG17p}Owf^mk?;d$b;N#s24Psڄ;O[ڄ>&l" ԼzO҈OD&ӼDW:ef y8c,6Qݭ=0GqKlb\+dn}7:7qx158Og-uvI=`Rv<1NPa>o.vWvyx|VJi2~G׾R/} 2\7{ZB:߶{ԅ+gY߇O&md~QNsa{ϩJS&ٞqf.ma[V,dyo|s5;a3.3r)CE뜕K=㛗 Vi}Gc\s$c}/8~_@s8[{F>㼔sߥ !|"ml C[G-q^ˡoVq7#ֻAmwk`Fsn›yqn*jƱv۰f^pY8g簺 c_-Bsyy>+s<=z֤~IڀGh9 g.1s7^Lݗzkw75oIԗ{3\&C7|MB$l,u3 "}-j?0K}ׅ`.v9=M{bgfeUq{^o4"K"AA .( DDq%D1DqMwQ4A㜌3&ęq$3Ɍ3IfLaU_߻1$9{nի[Wu:9W:+%GIѷblw[4c*[{R o"?ն|?9NVg}Lq'centLw:QiS|(:cPucX[l{2ǦcmB4|hSMM5&T ;fu1)FdʰBv>&Pˋ\5g YBlFBQkV!NOBGYLtO1c"M: [ wY76XsBΩGoaA }[ܷ 怙w_>⿄g <;:d|r-ڣs4wEЍTq9{oڳ$']X?xA?gyraz0;f+ q51jPG9/]dz]\{\Ƕseĺi`zW2W9K ʻEf\}ZQ҈Ա|>ߊ> 9OK;F>_FZkc/;s?݌z::n.A^K}0SKe6|3fss`wϚ)u/vb+01~p qmx7NCL~>Cw `m67en->f'璉kƴOݰG H*s?͈ǹ?σ' hy*:l;qomx~6]MARθorh7]9nڷ{,?>~?|\˺|=yO'2/Ey/K|M*ŗo*aV73foO˸y3p귳m_dM"ύtas˜rwf c=K{ߗr0ej*k6ͳ;Bv ]ë\odu(/˃2gyw2x|aӞǁe}yl.Szv{3ƊB_ uLt>.Wތ¸<;.p?m~*_]Vyʷ#"L6$xq=e|9sq(s 8 h+!+y2pU>˽ܝ9"0b8#Z.Zs3NbȐp-`E2w26f4NԇRqz$!FRswfO>zHrS J?#qcɰ`+bNaө-9WQp:)t_w.Lē,өwo&Is7s;؎zr3,0K^F3<qzp0nX_$DO?a# r&飳̹5SFlgx4?}϶tnpJZEh)~<٨[O_cQ^Њ:NyD2GTQ% ¬bIOӞoOי|Hx}`[,^ɟ5^˙=pt5e~ʵR&;z~+9IOSyɲ;s?>=˸Cش?d}`'+Q|SldvރW:9Qlq`}rGVA5^߿6!x#t7aB97sD+"mC|s˥[~_98]F}}#OB$1-B :R^fJOv#Zi]y73u_S9#aث {~ <!Utv/칀9ܳ޼]LCcV?.Bi)eaoVv9G0}љ|?{uH;^ ,o+娛+fޛw>6e g8< ^6y92K1UCצ=@/^{wrc: !gRp}bko};rq4R8l!ý!fA{"|2|%N_qfs8 o eu&Y2xNoh,XQJ* 78[#> 橤{jtrдrVӔy 7"!t=Tr)?<k cBƗ6?}[~-,TCeRW)$ӹ,ڛ?F/Ÿ8]9ͱ fFx= ~=Gd~9sWw'J[# i̶X)qSԩG)ƾOg;xsIQu \]C* ߿ķ7ׄoOO.nQ9N5ano؍漣l]G\I8y.>Ɖ3@oYϵ4m]\Gfٛ{LCk{tat{M>ٌw3qa7;酻f-ۃ8z w27 >}M 1B> q5/Ux7/@rtF?97a~rXC 7U ^G42?;ȷ3&u_k~^@Yxh~H@a"gwWX27/ne=|p 77upnMȻטOc6|ˋOϲ=jӈܸ7sE=Y"2uwXsBn"bF:*䫀<呟"y8?b= ?o#x]̣O (QQ"7 a{'RWE>]?By ߀O߻r~~KE!F=0¿ _ׇeA y5_$F]9`o o_ƚ|_F]EYJp+|wu}د%uVvmDŽan;r*ʰ8Sa3 z뾭z{cԕFطwX+g(q$ Nѽʶ<WvN9qx9 ӟ3"G>1  $_Kݡ_X[0 CۍݯüqFQчk'!#m_Ϡc\<,ӟp[:R}&,oFE~%πd 2}?O++d5_7gtgۨG6ff \^;A$݅oF;Qm{j*ț4}?;04D >sa\~¸O^o"C7Yz].xwAm@IA_W5_Dآ4ɯ3sl\Gl!/r\T,[~90ϖ H6w2&x:X &3g\mسZ$8Ds Cg|fN?t]yߟ}ng_Lc;[Xvk&_1Or{HgBذ%=zr ' ӟ3deA}{2#Fʰ"(< nz0v! W}Ś6%+rw%ƐYKЍ*m1xgL`}ϣ{Ì^CI)gP2뭻hB9}X?L; (Va\)~K;c.bzp4q {]Sy-܋w\Xp'*kp'Y]פ8yzDuwӢEq)+r9G(gQaVԑ+܋ J_:bQ`qyQסZc1S/ó~#CiZ~!{#,Yvw/Sǎx4:AhG>f˦k4/cl> 2i?!kIf$%sM8>SE yx̙Gx̘ǴxL8mDsH0Iiɴe43tgs6s3fGb,2vHuex]Ǫx\ /c2<]ǒs\gsy\rKf*KZ:s͕(c܍Tw݂M7qN<݁ض6q&l`$[Uf3"q+טjگ3ך`7;iienV,(wG{ R}a<>?{n<ݎFrA^}VGCX>HG#a?j3<>"гx|x~ ]ƞ4O3Xj?E{?ggi6i)"/ʼb>&a_MNbuPvj>J&cRfjdMTrĄN1q#[s\kWLo(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((Vԙk/ ={ؚ֤rpi0%ƜE{>ў}3na7 sz=k=O\H;'>r<0cEZF_2jWnQf&;ϴfYb1kefYiTx? Fڬ3~~,5Hu|ƻf\hsb@ͮ5jr> |3 )6|n.Kx[|mk|*[v mq%6!Mf\V&to1[M>6؄4Gw]u#.]{ǔJKT:yWKOY:Rzn~tqҚ6zoSK]%_,m-]Tڸk]zJ7..mJK mkae`'s.=;koSyܽ+o 2{? endstream endobj 288 0 obj <>stream hTP1n0 -2QR%]< j"юhy#v$#w<կ54sdG?A` 3ql@&r3:e)ggxhxQNH3R ,vBtxeWuoq k𤪭 uUضU^*W>stream hdR@m؏ %j G p[i !lQWtU)~q73oFgI( 8qoxKaJղ$]@CjOwgk왃?2;UkA45K1Yʟ␄DxHcxgN6G/U.f%u?7QNl}UbiJQsbw!S49"HNġ㿾oh>޵FaVp.sӳOR endstream endobj 290 0 obj <> endobj 291 0 obj <>stream h[rϧţL:mNMf2v@,HE0} NEigϞva싫+ B Rdw3ji<@˫^_5:KM2I0_f[ | !+( ar;DN$Ӆ"b7?gs $'ffYffsljU$0L` &/ML!& cb@]:J*Κ Ԉ:5?'J\~.!XrJPIGoϳtSA3LmuTx!׶lkX=] uY\JΥN9a_ެn_tAZ1*݈b,E&buOQL@g*HZ6͝vSӒGP#XA.6]p3R$Mq$Ҏ9$jDvƱ>QEua'ك8$o&k?BŚeLI-c4;#pH7PAB*#"*D4 8e/XnolՉqRkz?#6G ׇU!Hg=[Β ST-|߮BBH"& 4rN1A!I7j)b y@ܞ#]@KH]dCahޙ; wsM\N2;k DZbN~LmBұeT |q@#a?vcC85o 5Lbg 54P'qbt1Hӝ0rmi.ad)*;7KgߝKn>𻀟;%Y5PM#_4KEtm5csU[V7sI*fGf;09TX!Ç>p󵣀r 'o%ah :ÜBQLZ<5~0ޱAqS==lOE/3>9.Li p;6 ZRG~Σ3V͂+Pt < o MRvF6`v~؛]=ܲ:* FZa 1\&Ԏf)-C`"090V?F|9aaVhx-MBn*WڔǸ8ecN rAo ;PЩÞPtn˕K?oZƐ^n72r{6,'HMicRMz_ ȼJoC< gXHE(|$=\wEqr_ޙav`} ѾoiSo/eCM `؃Wo ZThҁՈ6$:x,w~*tHSgU{x^' :jhE՘jtqr-[O*dJRQ-s:zn. ?M<|0Bh}dBB2TM쒄>_*su䣈ևU~sl.BKQBnA\t+@.3E@CI. j7/cOzBI/:LN:MڧՈ4#C0N?uFulnMen~{ PK,HLG@=TN7{ B\w6Ծ ~4iGաAқS ~?lx:!uØw7jJl^ 8R E8R0j^<^q`0DUDP?3=nrVq#pLy(GЭ6{x%sM`qvd~HFhd-J$ @Wقk:k Ā8? &hR RCPWRJEKQ03d&,FZ > =>RoA=uoFJ(CfJXt_A CKOAE,zI I0ެMaaxk>ܘ BELwq Z-'Xs=X ? Wm7(f6q%JT͎f5ʕᆅi~I4D9>~Åj\t 06hxٖme:rr7j"`r#j>stream h4; 7g Y4I tQ ˢlgy ,H&q+rcsā3hQ-KT\V%SR:Y*] K/ZᓱkxflgcXHwG1 endstream endobj 293 0 obj <> endobj 294 0 obj <>stream h[sz̘ 8͸۸uזӦv'sN2Stp3$c".ŷ~gw?^}{uEgxvu{S,'QfqE Oܟ;w4?>=IӔ_z?gxRd0v߿m(b/f &D< ~I헛3ND2)ayo? aLr43 E4,"bܛE-8(zuiHugDHJc%VRHaOܩDZbC0 sH(A p><%SVQDV哴$X'K1ċ>u MTV5 LU%yvU*ExEV*5E,S> )D% bfuXm7{$ӒN}γ}$Fr<{ ԓJ'',aE',2E\Q" @BJZi#MǍB]0JYdb%m$Ea܄qI{$MĩW| ?uIq"J "¸-0bOSth۬ϣ3!C IZa> (%.dfǞu)UVL-T%lsp/$|c}0! :i5ö 4X6g-kjtwfCM)Raq?fژ@i>EަŘ_Snw`6%_q+&:"5da&Q^3PWxF&!$:|‘TMc:qC?a#t~V/G!c \z~ 8ՓV']QJ.3S,(U@GU: hb->4~zbִ?`Q/]g2['hq>4ĚI#qsr`Kg"ȉ6**&$nÝ"뉎U,dv^CgWUM^Fu Omv:5R0E|ؘԔ K~u4_J`*_H迠n t{ +o!bM;(Rt8a" k|@]RfzaxL$S'w/7H\~IR@[@+H0 nƼJ#8eĔ(=/JOuN@,46eJ\ekѕw2:2%::;`, :'u@FlWO yJ ZxZ^\/DwƻĒ@GVm&xBfWyO/o޾~ۗA.,G i +"AY"ɴFubD#Z+ͩyk-S QiL/3 p[$8uq[ @kU^>}].: `5g$KZ$A)CET,E7v\!֣\~M)Ť _z|65y6G~, J 7f$o_o_h *1S*Pk¦ɥ1{u[31 1xY sdaĨ=P*kq=C {V6γV|4hYyQ\6Hi{?*T|G!kmq9!j/O_\}>YsϠYUd5mUN7^$ (!5X]>²á{@ #P;Yh Tki$Y{ߌ[nZ5 r* p)4*څ LbF x p̀U:rfTO}&Ρo2*Jq\J!mZdapp!؁}9$P}пl'jڙiy L!/&3꓌SL|HiMƻwqIC-^+vw5\[6S5KWhfR6)`_gsW6  J~!QSOO px̼b1U3kMY& G*VB٠HiW6 g_jW-ruFFSZ5KGFsSY{6&(T}.6>JsN + KϿK &v%h-mշJ[UV[*^!8cҭXe,=Z3ˍfh}ݱ>,DLxp#%i_,MkwK47t<:VEEZO .)B9ɂDg?ds- 6zIU:7't5VIlv$n\vwO&d K'1{) I\ux (67eԓT$%d 5}9*P\kQiL}?q_I&l:Mwm-†%xR4ŝm]d7R6T /1vfGJ S2VwzC MJhz*9&݆ɉŷlz.$}= BS MP<Km  $S㘝6ζpE@NjDmi$Dmt"jG6AS 3%]cI#ݚsQwl~9`;s@TRz-咈izGw~N$׆isQq$Ѧ?BjZ-ҥn"B#bf hoåQkghN|m/Y~mjAʎjkv}NY1SeӯV kRqUnuM~2'֩uB1U"jKn¾)%'0H ʎ[~qfO T뿋GdH_1]ʝj֙2aһcnҏ1.,7*k3?l7A[gٲ+a7O:Tu!$u-}zw W$ςGf'mE'|T? mla|Ɣ<.+Ͷd|o!M1=4>~**:̀Tx:m x؉tu3Pho_Wsغ)xUUAD76p+bxtq"ȈlXNrABEUW4'' endstream endobj 295 0 obj <>stream h4 E+ E,m5*lU(bJ2k$sm* $nSxl{n8y W]bj3KTdnTu 4X -z@c~`h@{F@ϧeezEW}`| 4 endstream endobj 296 0 obj <> endobj 297 0 obj <>stream hZYF~ׯ#e}C@ vAd Ǟ`,y%S}x\F]]UUwG>H|xٰßa](.x[lvϋcxYA~Wbe/ϊa֕˓,v1 "/ i_*%i92 ;v]#B)p8@n(Z֩@`/ ظ^~ Q D D)o ט.}jH38|wNc,ނe a.` Yq ǤMԁ4bkMdw9_%;w 5"qz"Yӵ0cfaƯ~ɑ*?%-+7edDMX]uB]ar(E4!pWH(A\QMQ_ΐ|XB%dP#f­ׇ} R"3yA1yA_R7fT󶅢(;`-?̆>Ai55H˘c8 pq9׶8k>F <y-Soe(ˣv0Z5>ngh;vZ[wUgO gm!mNAGL/uĐtNjHl@ءcwrJZgpyJ⺼=>tq]+Ȓrw;j%,?1•o`"Hwr#Mjd\@q~2Wb? Z(?Et$t.AC.?|*>K>}{۟OC5֭fcT9wz'`éji!w]giOj`$$yy8_R K: N]f64D8K\PۗbNF hw( # z+G#3!O9~8Z/уNj$`Nj ľyX]s-R' 4FQ$Iҕa;ԋƤ5=ͰIp&}zJj՚*>$'|*?l%,*өJʡx*TR;- _5C[ kc郡M-hTHZod&ffMR"z endstream endobj 298 0 obj <>stream h4; D7ĉd$[+E),. En޼YU$LO9a A<.Z"mT|˔N֖AK~`eWcP> endobj 300 0 obj <>stream h[m۶_o%3Bgqq2ir~Nݩ>^r.AH9u3m㹗b}˷?a˫+>͈5 ߌ$k!T_:0'<I?L2haas#UsʉzE Bs-,Xͨ0ld N.t! O߯m3fFQD2A$NM*K[lI2>Zz1uaߠ*p[hs^ٌ7<6 VmT+'ͤRFrŬ&Z:a*`ռgAmle%`tЛH4SBA j;IxfKU8Ů$RSM8X8YOYNq\fJ%yzݧNHCZ|[Li՛ެa߭6I9V֮tE1B$9]%QYFK+ů՟RrVvS~Nh=Um-ϝ7<".#մ_:}Ur/$*7>AwsJ%C[rfK+Z> AvᆽcBdαL>:߽-miH3!@(BAˇ1:SܽrJq-!٭]!HPɧy#CdsDtJx% gZuWzksb8XJ0YJ$r { ^qټ$* ! yƵh.'{,#ک! ^+ f|w!ST 2IV_:´α0}Jg Ֆ(q\F f2hmF h9ě;Š3T^gm᠕ƅ,QJs\ˆh(G:8 ~*LƢ33,̋EgCp5; _gv f@} $-1y) 9ݔ1RMוn^,4ϝ ,e@];53ВT}R]?i^@f?;P~]l8E?wwQaJ q)Ex"W aGka.q!¸[rɨ'4:;6r08!| _B^-y9Y1"h69I1Bm)6]p\E):)zsSxth3!㩀4J3EI@A{K Ďi[Ϯ6W 5pw.R)+/ct!t<fyFi*tRncnG% SEqW3)0pHE,|$K$oB9ٵ#Ӹ%ՒY$j[EUA=IsɦG-qNǹl1DaNC[Nu.m xq2j؀ _9dd P'P҉{L- u*5FPLѷ&LHh7Ѹˉqu3a|ʏҗF]1iWW~ 7K#p>x1!<=F,JN nK/7T5DvV ۡӜV.҃MϣWAţ-3)Z%F4AgjAh|2VNLm^i+M&22l ?}6ͦbU -:o3~hs73Z>Eq ;ˎ8 3(y^G ^vckTbe{G!՝k줾G8?1{}btzE'U֋Z7kKoY^ӅY, x^G55]?Nzo*YGNzy.`J : [ SmW/t,b?@WypT8\ &g>k'O61ӼV,- /_)Wm'.-:|yuR9IGw\(\_e',%=}|`#\:I` [uߔ!`Ö߸ !`ˇSt]9fȖ~c0_|ߤ$5Oik)Qc/g\-Cމwd}"ἠt.Z*gguQ$莁}*v#}L\/-vb;/W fJEU{7W 0p endstream endobj 301 0 obj <>stream h4 _eU^&PBVjH z aĭ|mU~.%F,Qq[˗xLId]hNw1,h ֛&OrM6F@ߟr3cz=fz>/z`}4 endstream endobj 302 0 obj <> endobj 303 0 obj <>stream hZKsFWly?T.Uŏx7C6(H-AY=/<(ΞR.uO7|3nŻj2n#3 '-֙ ቇno1r 2^IBp,[_#̺y_lSea ,4)NΪ~!(nȌ0$?|~8"ĘL  1։ܘN-A)&Շ>%~x*T.pAј( :A%^uR~XO3d(YLmYm;kOáXR֫ќ iFȻp)B.sywN}i q2M8b8&%wz$# v ;%jXiW;igR-q}vJ?AY($ÆGY)0Ckij.uX`[ɸdN֨ Sf L@\H7GGCJwQ[ &hGw|lAYav`M𺁿eHudX!}22 /޺ڥe0y}ϭ "I” % %ۚhjXJJ!ָ/F`E>c"S%ͺmܹ agbب9=ve3n SpAqU"*jq UB#-[qmtG;ipNQDcյ?&øTnr/Hz/>8j85TD\2h(P;x^xWWJu+%aCbkݮ#&Wv 9u'Zhݺ3 bF1_ "@1Hҷ~lAMhPR7'6d4YstP}g[򫢫W!8Tmj`̂Cr~]epj~޳dq=H@w:Ieƈ-Hh}粩9?r1T*mCx W.PHm{>ځa/fn/jוzl<{4`A L9u\ҵKP ɋt _Sh|31:0eTך#lu# )YQ9׷EjR7XVkMAN9Y/phuA#Kr,ͰsyKεJ}N)f[S\h5@d: Ȍ*$}JZjb~Ǵr4k Pv*6+_I(fc󲪾끋B =gϴk5+j|y<IcaAsef>e,0t;2[yA̸ e<,$ jX-{Bs -n$8Aq` Q~ R![q K=XbZj=Y]S82tK 7pOLZaoqfmO]AX{i\)֯o1%*SR!)^ ՜PQ^sQBĴҊ_HKAgdG7Ca5k+<#fIFeD\Bʂ?`ϴ/{7sۗx ;h> ,җٶ<+ *T~-=FK6,^r"I=2J:7 \l/)-a&ҞЇ u=>f/6aɦ84|kEFy䡉b C4t0`7əu@g1Aa傽U8_,gr^Řp g>:D/aڎ//' e"=)8α_]8z L)¸ޮq|Pv|C[Q7c㤼C%q]%a0X9hn^d/^wׅ^asM 1-paZ_]ߗ'`yUgo> 5NPM46oLV廛4޳vwMo_5].Y1!v@L$vjeٙQ cP~G욞yuf_fȤ*gn< ٷD)R@3&j!C~>3(!А (`RЛ>IOy endstream endobj 304 0 obj <>stream h< @PH mz5mn0?%mh`ԭuU{.KqiZ)cSOz`1 endstream endobj 305 0 obj <> endobj 306 0 obj <>stream hYI۸W6ӂǙTfs$Jbڤd{}ZJj-{|ˇP&MfQ4[M(F#'-1H eB`5f =!58|P#]~(ooPƄW`]E0'@,Ub"Yb%Q`͐$r,-jS__r)5)ɰVPz *QBbj5UX'RϾLa IO%>s1G+fS>//jb]x︁،Q0bRpg4 c/XޱO]rsXnqsR}~D"+1^2ibjcjyϸByVƫT(y f(\ +x^v1hD(-GTE\ʑ݌n5HtS<y'&AH @Z>P bƖ^M6d8HgMTCzlD-  b\S<)l0}20`$DųGtFKKI:0 $A20\(^}.OQ&K<{FbfDP7&?$L]q(Hiߦ!W͖2c[3wde6 JkP}>Āc-v[kxA؄öȪj9>rx[]\xacӾEu)+@Of>B%7Uf򕌵9s@{:6o+t(XgKbG*[b4dh>{4eZNtFxBi!hMd[ ve9Beat rtSf0Ҟdc])t{nPByQZnU-ww1HPg;,6 v{Kz c[`_:2 `weia+debbl77S 0/a;5mAMPbp>W οm%Qm<.iPL>|DU-}3W+wtSa]YYˬأa!nGUoۢm{'*#z 6ZQp̈́"P)CXQb.jxAP(D]{• 4nԞff $+K5+5ѵr[9.ȘQ`H;(XPq:Y;}7S 8t: @( oeo]HK<0P# a#rMbFgҘZCyDi&vO>,%VrcNKgu_} >+2]:YZF,l* &l-asGL j7^CsNS: PQE.Z݆At :`-osH{$8]`u=XЃw `6&viC  .X^孀⯆яi>gޡPNIʨcL-|q]ͰSm9PAꏶ>3?9G5\'_|AvPQ: v ,6} .>B'D _3 ԰ȎzC+R}K.f0D+05_fU ei,*y#h@@oO)/*~ U, | aJ>2{ ]us^ gBL v<F\`uW4Zc"qux`~{7d&0?3G0YgޫwG1Z2͑^5үe`,\N爚SC)m&{b$Pkd-qm8PS̄4!~(I-!a"LY1UGYU݌@ᗑnE^=+gWgI܍v"v . .cMx#:^_3EO` n"fTΣZgM~[E endstream endobj 307 0 obj <>stream hKqsmn(23`Zv,3P֬DrM-:SFV(ђ5Vd$}r4JijĆDlqTHHIb eCn(`&Y9pH %y0GAIx*aQ)<% " jA:tAt&dG Z hGw:Qw?d0vb <6{3*Bg."S1>O5'^>W.frKne5 GHYH 4.j fd@G ^309} .~KXC2Kt~^Z%?aOX+u+qMuTC2mN4n6ܑ߲.hi{C*,9Zq\_jPsY]m/;oT;y|1wp|ۮk^,kyvQ.8.P(^q\NeYam6jX,f`0zV0ZVT B.d2)D$I =) endstream endobj 308 0 obj <>stream h웉d煓SD 02nPQ[š0RJ Ͳ?4oӸ+4t H2{cW_BgJ}F}rw>ߍ/k S&/%4nb 7"ó???????LZy MPpVm=kpEъE5trW_"Lfml\Q_ `Qvbks6?ahoxr$k{'|w)5'eÔ?(sWSb^V.L1Ww'yYs08XQAW1/+ '$郿;Cޟ9/+ K9k{Ceük]6L2+yryg*+kWHoyW UxaZ[q̥}4^Bs^s xuA<εѧ>"J{/eo*'<;woR&xBb1Ee{ ;-ww^7ot[&Q.'OxO5OsY&-ZKWwwϸ;*_B&- K(ڽ;2n寏#XF;{P0qo`k?༲2qO.j-иAP0+xT b^=TwA=}p ŶܨnQ}{yo(4gFu؍^eOu 9s4-S _]]C-^1ڍ!9ZqhQwq7$G+K nhN$ ? ф?My8 %?ǓwP_}=%"DJ:(ZBS/zdVUxgs XE]"\47ؽ\cwif:e3L6бM;E3"pr???????``b endstream endobj 309 0 obj <>stream h4M027hi? aBXI, Icb;7U 8%+,3N>W9*g hR]U1eUJ!"HNP@vI`Asm 1 Ҡ-mĴhۇ%L+ Y7_oWwcn krG endstream endobj 310 0 obj <> endobj 311 0 obj <>stream h[[o+E~ M/,Ğ9<8$1$vU={&ɂVG>v5u۟6~9Rv(qvN_dvn"JS8;x]gQJϳ/.g|=s|v?7kBE{>y~NE7#j3S\#'F:bJ pߑϿ0(ND@I"c>Jpp/0r? 4D,󪨴P3B8a>KxB~+@b8*Y ALV䌈lװKQB4LI *sƌ|^^&QSI.Y/95 Idoeu^ q8&=Tj3TQQjӥ/}iϘRP]3-FVn|BňR%"p6 dt7k-rHyjvX0d|ևǔ1'"gHCRka,p'5MOr-uQ~_ϩ*b:MSs}@?ݯW]fFMrᒋ) q:k$u4K f҇;bʢBKL=^ոMYP\at]󅆜tH,u܍&lʓmp,H$;K̚t< \g$ hJ쎗nQwˡm|`O Irwz>fS-|wi^}? Szc \6$uӘ ]T@ ; _}N$TI=>٬;%L Fi{WF®lod-w Vx|i5 4B'V)bu*9 :4r15, 3l/dKݲi&1u%$NU=S~Dd vS[gp(i'}U%u`Di/'eu_nQ~IDp3InvLw+@0\ov9h;۟b~(cpƧN(zCEuqzӌC5ݻh즫N]@e&4,06@AN`\/9/ 5K5R%3usl$U._Ǐ9ʩ)2 1֧u 4g_۱5+b rdsX߮]5ugpbR}3*jgH:2S11y$N(k LY \o&6S{єj{tIQR2L&DeO'mU[޵Fsʔf,S-BiV#bcrpTzY]c"0D>&2Cn%KPb#}UK1\g)>:ouu-aR 1X6mn@6wPK ao' y,Oq Hk\*5k~K j<> 1ěo06אۺ32KJ3Ӌbu[hl!Z:{4ɌƓRqG3mM?~90k%!FsNy+UW%3P(ðK/џtDOVW%SaIJ; Qr3eQ %1+7ח/חOP{I X'O[ƕV&XeQ7'/2۞6Vlqnwsaw mCms| }I'"F97WUBԗzMOLzB2=v kY/Q5S&pC\iK4 3ӳ@hH0z)tnopY g~pf!P%tU qYRZ ;42t ,rdQ` ^Ut?քS(^NFeI5*3΁+x Ҭ,ZFD?#h<#hMxjPîr1jK~"Lt 'X J8މ%m=ܧ>Lh=5RbLgM{l<6:GX)FݭXv]`03b|fnT[ت6^K}?diotVˋ~Sԡ]mźjf]e;ˊTԑ!^d6s[>bLqPs}yvI+Njvxo(@ϳ"$M]gaUo>+IW6`gH5inVMU]{৽Fmz}_rITv̱g5/}ڏv *!\~)bʪU+>o%쏫fž>K*_뇎Up;NF]uP4 T@bR!´7@5 THML?,zuA\(`gE('"R NBp]LJ!iE`(l P*hƀRA}۰q0CF\J@ХIoڴhDˀgz>[Q%]h9 am#'f YgAdfGl&,2XB@_3`+Kf7b3>A "wqtAt\@q[\vHR@<9X1$cB8ZAa!x.Pp (pbCe8$PńFoݺ{WfĥL`s w'ԍg|O&A7w<5Sg<4-:'e>Dz|%9# K 5CE_!1]0yD,g & .2tl冻fm{8!_ʨM6*orUi֡79e?I%UVvMs[h9׉vWǽrdQj M)ؐCyB1tch|u#}]]7E3 F5K"ji6|݈P W3}q endstream endobj 312 0 obj <>stream h<1 E@ `"CUJ=5t?۲U $LW9gsđ=q;iQ5Kؘf&.SuX:h1`=6PA7мoZ9!g> endobj 314 0 obj <>stream hXKoFW4w0|h])"I` ɴRQA~gEVe7߼/NEvXH): 7ДJSmjeN)}}E1e/Aϵ!PpCY9zʹ0U 3KS¯k(u;Ng19g@ޫQ+_JTa"qJ$,hY8B[Uo =Z_b+=䏛碔UCeC˧%9 Hh5QCE&5:MLEB#6y*"Eɀ dgD*+wÉv uF!BA 0ּ@}+*xw]tK.7&e:̣dx>B" Żh(5q.,1,^x|['W zr-GHڠHZȝՑw%ē)q1XeRs S%cȤ&;ur1S*ŝT)L(á2*Lp,PFyGi*E:lkRaj: p,Ɓ@;``27*FJ*C\17x]sa^I@fo='6ISZKi:%1\\+N}n!o;aG ?̌p!xyb保 By_cQbN(1A(?435Ü/DJ~V}}T".7\Sחl7E|N&AHoO1^S %h8^T>0)(;N,=J)Ŕ)Jlw^n\ʎkQCׇ]/K|yXE/S?܏bl8o TTQf0tr[m'CzLuR %&VBQ)f>$Ν D`4ոoC6Jtwlܨ2 uȕMAsu(p^Puaܴ3"Kf;?Y@Kf6yeh㜸sA7[|VhM쿼1J9= `  endstream endobj 315 0 obj <>stream h4A E27@@H 5ta ; !{3Fi`#HE~{.uhR LK|Q*0V+8]Eڡq(mfеennjr#$DL7 0/# endstream endobj 316 0 obj <> endobj 317 0 obj <>stream h޴[s۸!#Ɍ/I\zQ:7ZmJt] o2m\.[,ϫg P:Aq$E?HX&QbbwY'/8&/W_OެNwMspTQL+Ցc%q"ޟ$)N8d"Q:!$eIO8FT ,}%sku.yl)B\]hD2aD_[EL8~1܀HxxL"~i$CC(EcJnv6UAZ[ z qmaJ4(c/OH_]Tm11nm'hO,Q_Ljչ7oXeKْHxӻJ'jɸ1g 7U{㲱_"%`>"J#=\")KM1_w(,Ѓrf3.-p%^DEf {G鄩u7H~ʣ,]ص+d9f/a9XTLVU&81?v!݃{) jᵧzOu,+A ΡAT5 j9XpER[[%z 22PnQ3= SW}k'%LxiAnUKu-aʸ ]7o27f̂(!lo޾_ۇUl4CO$qR\7_+_qXE1XF7+|ĜLZ%w%nv";ݲfn]U6a;fS%h麸KR&'8EVcŏhiw&U?|fy3bGϱ!Fnp]fSK8-MSA[RiVdl]6wjq'>b9(o4cߢJ ^,TB͉4H0g".+(L=aOeW2sNFJZ#V2՗2WRt "^a0C_8KMRЇ]VڬY!DgeVUͩ;xLC) XP=,L*l`fs=j?P 8m(O%T$ )DPrx|MyJYSxS_jp>`p''{Ms䬎c$^U0<4lUV1m+]bf Oư7{P ؅S^gC6AYIjNV,ϋˣ* (2 fˊ:#vRf:~ߧN+hL&8Γ%V} M2=J$je9pW0hlg-rt4쨘?zĘ>-",/TvO[?)Sr%0>@:-٤\D(m۟ Ǧۇ>{n4GfNF㭮N]AS'GH?= o}c?ӎcTƙ^;GrsΘ;*=: :1MGoVt)!0x9[Rz 8H5\F;XW8(J (Sn5@5Kcrwpq-0 @|$JE ψA;98QL}jKpRHV.jp4pFzR3HQbjZ~'j" y4<ajSHLO3!Rn<0D xUv.+@)b\X7E&p4wu/KHxd}+Y7fٌyq(;8nnuLVݱ/b6oIM: 4/dT*[G;R|j{:+8dt Ȳ< ~jS@m?<ˊj{-2DžRnCGO!9JX-BDZ6zqbu'x 鹯1F:cǘF*fo\9< ^Y TA8[YLYCT+,( ,+X]ZoPZJcQ{^[!(k[:HaDx^o8L!4(YE۔Kfn Qs0.Z>jY.4fqDH3X|Xʂ|)^pWwQO||^2o2w9CU=2^$|04GKHS3]1ϜN2:ni'ZT==c[cw5]9D/8h6|[4KͧcޤEviO4B>y)&f9w~4Mc;od\UQ/"MT=˵_@&Eޜ +sZ'cc;Sw`ڍ3Fztapj^Lw9hQ2T7V g'[9/ 0/p@!8>stream hXly޻V-h,-ZJEfEZXw FZu2FR]]3vqY!qc\Шq#f-fE ;|ojunds}~;҈h! SvTAݏ -@Odm"-ѾΞK>zewvwj^]7MDyk^'_4@ ljĭ=DaDozbu=u\^o$۴$l"f~Q/ yܧ1:2>ۧ%~?K2m$Mѫ4B VLY O8RiSF. y.<&?=]lK4%jhXz[r*-c0 :c=wОQ87`]f~J/=UV_`|Cd:*)ycK)QZ2ZZ=]7﯇lG+A"`ߧo΄=l+G/g(Z\MDg;/RPb Jҽ? ]^F )SPSk7"*f( MSY#|ӏ+F5ۡtTέΜ=tTt{ X{ӿޝ틀^8uq5 < _;>;G)O3D+`K2B}lAR1aLhBE0=!iAvSRBpe1ZfTú6ދ=eD8 9emSJ a bw?PK+ka{*=EG$^sv9qXN*,U@Ŵsׁ(pb|p6:%|tA}>ݐ~06OR_)w )xJ`!FZU:\~s<H!{P5,T>:rr>T~@嬓cn޺;/< v2cGN>Ge |vkq=g( X禧4_ $E1+CEu DmW*_ysߜysfAt9K/_DG(F*qZumx?ŁuPzA>1qg5bv/ `Ffw~é3Uf7f*Go30mcV'x'yӑ[i~G]z=K9Q3b6ğNT>iQbTEVÆs{t oᴢlNw n]"`S endstream endobj 319 0 obj <>stream hL[k0 7F%@ nmP`R:.~ӌO,x OGS0ت" M}gQͭ+''!I4gf]3t3]/8"BGyCD8uiE`q E i>.ɰqxX>i*vcYZܾ(0ҨF,dKJR lSJJ-xs>7݄eq` k9<ne!wSd(g𧻓ysrVDvR{c7'uGʩ rJ{BmK~S cn endstream endobj 320 0 obj <> endobj 321 0 obj <>stream hZm۸_r3|`a Mmq5{Ejw}ݕS4ͿM/,K]Ab$G3Ù 5߭foW+lu?#ia)$Hf)`5"k<Őss?0txmxS<_s_Wo,##;%RWXӶz !L+7X!>`}*A< c~Զ? EQM4-SNFR„aĀrF! AHұ$?lǧ Ky%dm? $N]5rI98zh RvzNܚziR K6V,KLͬ ێݶn.7Ǯ0[=XXYqAi}U-Üɑ.r=Г#|[c}(QP'lwmh wLđLq3^1vO ܾ=ICy_˻`XeFa]ICx~~>VFl>W_wP`xz!|‰Fz3CR* h3Ұ~ؗ={_8<VSng}UG ɟ D {WfFsN1$ (7 ?ր0AM1 b0-]B$wPA*U n*꨷7I-[tzb0Г )R=HV)f1$ +YxV* +ӳ bQaPDBe&mQOTu(A{7A ~g@ތ0Pt fZ-wz-ur? SZ-1P ^[܉b\5fpc  |ЄIan+ҳl_#HX1/\JD6 @O-R(l÷+;[0fb"hjm_B2z̕5A6+w+)~qxPK"\z)…X q4^ ykt='p^Op#>Y V$.N6Xͳ0 7N.aEVC|0BSȱIjs nXxW ВI` u:pA-|cFq_;c:MC!*Stq;UwVpll("nt.oP0msG$Tɴh~B+؅d =)@|9֝@Lq]B 7*4(BA <ûliUPbPoYz~N;] 0&ݛ 2 ;H"/F IcZ\,?"цcÈ&# =X-[7N^V/ذ3HDh\Tz|;S6j8ÊׁI]6/$v%n,mI˫u-'!mWVW#*}^*ftRTٔÛ8FZ)8&eykƔi2w$G/ C b"6O +!p^P8 _Nd}7 rޡuޔ^~f0T5;O~ez5sK9Fι'\߰kPdS,1z$ MJqJDz9Pid /Mȗʑr i`YBFEβ%ƞv_lu8x7)I]wߌnt缸dH<*auUZX=.Ia:MrG[MCV!sE<*η „*hPO*4@ i c8! w4-[ ͭakbySo)^Z4=@bQt-dr[oا^^͇?*6H_V7obi~씮m|L K5mX҈􍗐*(6pJ$5݅ja.Ҏ5R9=R5W `Pf*I{q^f8#S6 98'u`E:$Z';hݮLŤ͝\|>i[*$op6.ʙ5|6oI״wHVHSKbpWmq?8\Wަȹ'첅]@w^ztd 'eXMB-EsSL7/kHP4Kѐ#~1U׺f]34^T)UPEs ^0.:5P;~Ku[i ڽX":D p o67Bv_9zo@ endstream endobj 322 0 obj <>stream h4; 7fAhحE"A~ aĭ|m~ gqij8˗LiP`m ( Ѝ={@e2~q <=^ϲL/gE {1 endstream endobj 323 0 obj <> endobj 324 0 obj <>stream h[[o~"b\%5R[3ZL$R_3;3{]rm)sfϜ|F]@jjbV Lqİq{x6bϋW.Hseh& ͖ca_Jf*C ÁH`MqBtVm ADq44GFf!a. !dJPd^ BطR- AT1 [Dj!#$s{k}| $jb)?wuգۡH)o5G90u)mԾUr)ԝ!cDOOŪ8}JHKgE뻫jkfrzge7&wܜؖYlŒ#{ #co{H܃J:=j?ńbh|<?9ӱ\?!|7`4g$CjHd&LΈ@ #`c] ڿ}1)y KB1R3kk`MnQ8YLB@Hks^Ԋ^ OZ !ꖆxF%eY2ap2;1v[ze u`N25:F`ze8<׍W-HDbʐU/!x%h-`F]kk!﵏`)_k}m`?];Bjr_Ẅ6"#%- lHKUY۟[9lnAw} Z!% =(!]YFAJ(ERP@G՚)Rym<[o HJKBI.zm;ދV'.r 4p)l4j<`eCh9Hz+MG¯'`3U ͳ q$u CdsWš[2fN!ELb7|V"Sf}*S@q)w:2A^sRI_\-4$]o J*."WQ*fSE5'U)Ɖd!s,24l(M|H||IfSf mw31Y|8NӲHyK 8gwEqnFf{OUy,mM=c-KH4j-wmSVR̓U8-viW,eDc cRӶ܌(uIY^>$t 3)nI["8I}{\~}/:Um8&Q]6A}TiJ"a*?~?DwR~ i߶pjAR)AXBTwp1hO_P!l[:_i"WxXJ4L3POUyS!PI=ҳ3qϮsw>j_EKFnPC 2,MזNRu|>P_pK& BDIvP嗁qU3&PU;EtH]K-ksˊ ֤[pIvgpɨr.%WwޓWX2F`,ߗpv ֺ 7_S?+}UxtΨϱM8ςhϸ`с% 1aN!A v71οc7X{HK),078.1 .QB :vӐ6=G͹}=j5,P|r)SyQ;#Io:B- 33\(\⬆5Ԫ:-#e2 Scw'TKejNm`:Qc:~=QmRyI %BRI;Pfv6m>.(Ԙ[&ߟ鵘5-a[ QG8CQ/2ڻmvVتxV=4 9GOna_nN4d AzpY_ݳ"\#ڡG'Dxm.qZ͠ ry)86r3 h~yϘEՉ@m @=Txw874éΛ a8$8 `&Rjk9|X?&_lNw7LVdl{pw8~̤ƛK}:%sM`Y~X+_v>Em@pbCNT؀lY\L e18chu/MC (ʹ|Oy'.͔O~V}3@b/;"TQCh3_ hE 1 H,YR NN1>&ƚ \,55F;U+:7diifvZ%:gaqE@s<'OeDoOHT[6ܙ 'wr>y ^pLN%%jBC{{N2|sۉ8WDW 0 endstream endobj 325 0 obj <>stream h<1 E E,m5*lU(bJzk$D`-uK~5qhbг򗸌v- X@1\fdǠ*(-;@+hX3^k˹ a}i9rDL' 0Q7` endstream endobj 326 0 obj <> endobj 327 0 obj <>stream h[YF~ׯ#}c'q/atP3j(>xC:w$f.f h0@XG $$+f8bc8{1f_f/Hweh$ FG`w6Y"7 Q9V 4#ϻ#Bpk=Cn sPZb&/X~|xוb1S_d!pSn$5+nP*J7XzAI; Ŷ ^;^Noúe ŚP 믚 P+xs40[+ |_)^R 2S[w b0V,;{a>K{ +mܢ"6>wK-!cki֯,ۯ )!nkurv/6+7V7ϩEsq?Ejdshc\>/6/-FCѤUejgBBi};>A^~2v[}BNyl5@X +!w廈2)ea']F:颁YNުg0=BP.|4wŵ| wōqW wUN! lZ ||ج2~Jt(S+K 0grNbM&DTU^ك{)||BB~ _)JHr̐PI+ QJab(->v2g'9uʹ_?C~jvl-\thk#_jC-G#n}pH/Y21-;?|B]QWFQu@:TƝB‘:ԈpA4udB>zAiax` gMnʄ~I|Wrg".hwÖ-kC]1DO=- QIG}7j:щz^.,-+O˹i&+nb]f6mF6"~݈&EG_`JT#v󦽨Ql{ '갹V'êL1Mm) aE"$<?̡͉O%bJҳi׌ y j~A 5wtMk5A,.MACaی@]vtWMk{XߵYj61)2N-*og;ؽw4>lCm .Р ;Y]zZ ͔+n[D)>tnޣG CZ巿_iM' PLO ) Y\Dv|2\*=:F[ǖ~g#|k9yZg0FlF\ic߫څw2ٹhb W+vI1zhPt?Mi0*E{a;smˍM%v$VҕNj4O"m' 0 e}dr鄵M_~#R *OP,{}}PHPm >KonBVNqH`a}gwgs 0п endstream endobj 328 0 obj <>stream h41 EAX&kTتQV(HfojLO9a A=.Z"mT{6|˔zn]W WcP%#o׎s;Gye^j*!{1 endstream endobj 329 0 obj <> endobj 330 0 obj <>stream h[Y#~_яybg +#wY}Xd Lq0cwY~{1fYd ~Wfln*fm)U!H`\ 4}~s?_01&S"í ˜p+DNV9!*Fo+0LyqM1dd~s7 )9?uաۢH)o~CzUoa)FJ[=Dz7[EEzQc+ ʜ5A˽]_%HQM.%R6D Vݮ؟)[,0YU;lRDtc%jĩ$/% RO% ulK"2/MdmIT^== ʊ,fnfs bmgű'CqSTci*}KH-ibϜ*1SlYL$rt~,02S$4I:pHiukFlQcbCrD u>b09Elp(ř@W/[&vP)Q~ӹ6`KIY7y/xȫր~픘aHJH;6,iX6+rajN;)h9̡9`xHMAL\u*GV{-'8<`HםX 6.^: Cm ȼi+C)q+Nű f8J_Gp_u躚ȃ}}rbfQ̺/`%RPoNeYt,ز/1d`MsY{E`Wu&E0>+p۞}]qqX2́,|)anC[Y"0$}>l`}ej.*6vUnfքJ]-/O=fHfR #^󇧃uS4_m¤&3ZĤh D];eHҪ(_9YE?-Gmz2s0c.*"OFMI)@H.\P/UHr6 <?-H LQxd|)DJZu JބsrjhZ<\ec8g54s Å1H xA2F?-t$0g3@W"^_D5Rm $J|l^yGN_X0p0LF&-wyF&3𤁭w3:$)H7bvOdS!oxlTԹG F^y5kp >hm~uG]ώ;~ҺA]ٚ&Ԩkw9Lh=T,4]<e_>w61sF\[~5@׺Vn/"zI =] 0Gߊ03bscޟGR" `IxZM)x7}STMn/MžTν2D&K)ۿ(޶zyQU6+߾=N?ibqzLD(@א@ l+3Y9e0E72SMNǤʚB;-xi]) u5~BriM9ޢ^65&|T(AL[!e5C9:p~Up=lji ӊiʫ6+I\HSfh[3:hYAϔax ]MKhTQ)oh&hRLmxs;¹ƵSIj>歔Dv.~)Jn)RRi)?nE_I6ZjZ]ҡe/fW,t-O> J PձXZ˸hxFpX*v3{\qM(c}_v ͥ<6fV?74.Hs}A͘jS&'_Lz۽VUkSө=.M,&ez'f N(nW/"cL-bE7 tב&RMoЩu؃l(LjEMnz?sPF%K=5O~X Kj aSH{z!ֳ> N\Ky L4ׅE) rRs ac]^Os_ 2cUBQ 7m^Mג!KTW˧ua;+&לpa,rlC+1i{>OX)bUc>stream h41 E@`"CU%J=5lg[ʃi)g<=WY@4l!EKYflf._2['k[AufFI^7м2i`X`)ǹ/z=fz>/z`O4 endstream endobj 332 0 obj <> endobj 333 0 obj <>stream h[[o~ k1ЇPB$?g.{v؁!`Hqvf97o/HjxZ$Dq'Z8Տ7O l^HBp("fxQ&c BÛ-V 4G#BIp(@nH oZb&b #_zu5bg)z ҀJ^oxR-)omۃfDuV mH)oN|wHCzSO(FJ[; n:f_Za_Mq~ JjneXU$EwUf_(M.Uay=6ŮlCY!Jϻ´Va49oQY`@=AײyֆH-.7:[2pۡo}J=lIZe-5bն-aHI1(w> \GM| rt @.&ڝV=htw뚉=lhAB3I昛yC1^qʞ/Ch@1"id ɒ8i<Ⱥ'K3g!E?dX  A'M_OI7j,u,JlZ!7wZRQ2 ,iYnÓ L9CezSn|x[Z ,hy|o_IJ6e%V@BJ8bț$ guXz=0``rncwx\ؤy{6bA䭈|hJ Mq0r>!$Ssav?dplPx5ThȒKh`bz8_.~%/%t()2|A/c`M T]- m&wkAJ&c0SBRPs|/;!UmnY6v6r6pL ΒPʊR  4I}zvc }jVP5*T~0E,yT|0ƈCm&ؖڪ-}"[DawFS~ hQ$g!x# Cn0V`C= D{-aH[1[6MUGLғ v^7u4y[skPMPsx5si1su9@hhOi<&ul +=M)Juޑ]F zW'X:0n֖"BTw?b${!pDe!Ё 1Qkcfh$^ ]9M_w)Qc> kV-rDr(xT| !:v"Gs>9ާen ; Y56{lI4A o3XM~$VCo?=Znm4^AqkJh*6q) "E$@ eHpK/rJ=7Ze 歹ŻN^/I=8hj^[ ,vM"6m;'HbWm8kYQW Ԝw=Sv3`@ RBsRKG3ˆ>'SoS?=]0Գ̿5-BV *n,RuTJhX?=V1(J(qHpo[Wa:7fp8\ D;^o5ӚR 9yO*=ٴשiX'UX7XO/_XK?[B 1c#Zvot~:Trʜ .h~p'x8|^{!>X=ّWԉfg8-Mĥ+{eKeXZpi<"/C!=˸AmUIܘnѪ9GsRYiĜuHD›6,&ܨΝe(]2|8c&I_JG6ơhroKx~ׇäaW^bз'^ ltu0TcP8bk0͠ç7O# vM#Q2ĬFf;-D5º`Ccc$,bq(ǩzn?д0^x p3 ~n}n=Or+ܾM~_ $}YzfVc,(p4k` 04?}:@4ʶV'V%R|R  D]?{LAgFg]Tmhilaq> a,U!*n'1T Du K];4=igғN$2?>stream h<1 E E,m5 lU(bJ25e:`-mO5{VCOf`3Oa=MmV`lXفqAQhJ͠I gt _ZμTbO" 07` endstream endobj 335 0 obj <> endobj 336 0 obj <>stream h[[s~# {h<]mI#}X"JӦ {pW.Hrs]^-,!zF02:a(.fpr5Ƙ/_ξdD,}>W0kw b^j;TZN7HDsddBv쯁Ϳ`bLE[@˜p+DJV!*Fawvfy*M1dd~k=s7 ,^?S] Q A5?ͶfPhH4#LB^BAJ&M hB8+ԫS%M"a5K+5$N)Ϸv>$A)lҎr://u'z(nFU֓ޮ54d࣠SBKmV:$ Aܰ3M=_0`%ʀ{w4ƹ`HƸ`72dq#1nXS`֫%N-,o -s '!:He.f/A`3@*'ȡ.90_x?X'6b~a*soy{, $!egnQfT(bB:p>)!I!u`Xo°U `rfVWZ]%E6 EEPy|>HGpػop Ft֏2O9AJnpM⋰KcoTyc;?B;4õM'笜Ag;? G׹DfK'k^dM/iEO2#;!h:, $2JoUYG"kri(Ã7jиeV,08/e2儰= &_~ JWT$ 9EgK-S47:\xhIzvi\m%5~{]/Ӈ!S 04'I\9dm@tbj/mt6V\gw-ymo(Fd}vۃ̶Xh-=ݏi`],ͷkW^>z1nZ&'cVZu砣֮tirԤ EݝoT@>Qv7>ϏpVDzRQĒ TǷ\곰\ co"iFBst:$DC>U2cr*ś}h`Đ׫.CWc\uw]:*#*1cɂ8%]}97r~X\j@O )po>DgT)% jwX2(C3zZT6oa|_47dN|:Dք26k56Ѳ=kٚ52<ۮP%?ʹg1o{!QjbA}8Ƕ)tyRSF۴ӂ÷3W߫L3%/yJYUë {DcU:2F/ =ԷUq~GBs~J zeX} շ塒#s/2J!HГ{]fVXʂb9ZD{P,tQ?LǺ `|.OFtx6aD. T&'A/0|Ɓ_0^8Gxz|ү=d- ~`;?_@D t߇zb|\lW=\_!8VA|Թѩ@,:گ&S2M:||CC p?Z͉DFКCh9Py7T i@aB U7'p^N腪KvrB!X QUs,GC0{~[~oےinnw\mM>?fͮB̵@S@3m2'[ @  ,ԲgIoY(n,;6`Ԭ9Y>0H1mez=JckPTcǺW]FPo]s' -FLJbnՋm z_7ir  Upl;wO9xFDpR}{|]?M!ٴ2΂nN ~. 6%E˫?SNOIz%t @P62d@`znULw9^PbS4e*s^%rWs;QAU7 ̏vOi/g0i endstream endobj 337 0 obj <>stream h410 E$! e5٪eHE=p|lgYA[[\ A=O#T NTv1%khpފXpˌ(l1[-I|'K,` endstream endobj 338 0 obj <> endobj 339 0 obj <>stream h[Ys~# g>TZo㥓Ux@%R!8s(i)..)`}W>abj` I3 /-։ 'X~]`ٷٿf$I24&scd/#̚-A&C"/ a *$i922! {oA~-`bLE[@˜pDJ@|՜DpOU}feUb|_g }4,GJ)'/uۃfD5F ƭH)NOf1PhH4#LA]AAJ&p%R4!a ͩHے&&a 54$5uTy_$ #IjN貑=}^WRiZV3k$: 0 8O8#3AZ#Rze4 50UBCLWQ˹&cyW~wﳹD:=~n 13=ZR6x?m1ĕAKЯP|ny#lt}>SԲG_>m-p@Ejwݞ&W+-bt(ݴ"ri14GH*J|MHz$/oo?(}Oc¸mvK{я^t'7BEN?y_gMoϯM4'ow#tũ+e)Ӽ\)]Xd3iVlV2B1xՅT zeV#jϕ 6Ecƒ9q6ZC60Bw&S1c6l,jҞzM1_B>n7[3Qᠰ5ObД!nIco]"݅<%*"6ع%֩采U<`j#ճMocsA Xɴk2&% sd6G#lzڸv$YMa4"\t9ǻ6vy͕ ⧜6v*T꿎Ӗ/.\0LvZV=ZD' +׊jbҪ&eD'fj[OkF5 / !}1DVfu9BbVXU .~٪|bPCajY"$|ܵ+:N5b|d{5Bҽ`F!+D2i C7;p^v(8"A Lh&cC{àFf{"}mx018^QS8Eԭx- AGnW:5`q2 pVQ޽d^읷h' 6G&cG ;WY@ر*W=fdsnvy(lۂ1"'Q?[~&'QH}8RI"oݛ̪,!9~SE0RMaƒ fg'9ʽ[HF1vOQd7Og57*" 6.yј=+M&e'O:{4^ԙ-'NՕlI1a/ I:,250뭯H70VCޘ&}gg2,5`}^Y?3 )~^eh8?^:rPۀr1ʖ4{Gn6r"4 !u.Fӵ_#_ `?e]~n6Lh"7~&I~Ym|\+s>~۷3ՂSVi7.Ko{YW)R\L6`3}D:٤ŜY` p*S#&x{}Gh)ɸ/@P.>Ml=iBK'G2pWФi,K[*RH1-edΆrG}Ho ZXP5j>Pr3D$ּ~FJp҆^AIg*E |ߊ.Z\]L__=TcؐM$%l ?Q_Ay> |DEf~ M7cG 0h{;l(ھF[?SA LP?SToBtg*q*oeqB}aM5 Ә ;m(wܿo)-&xqj JD,:.1 >.D5?Y|A_H s#!,iE yTϴ77K;F􄸎OL{5C-[@?6ܱeʙN}]>stream h41 0 Eرˆm[RTC_rրqTgGiusYcTD;2 eo1Wă^hpX{fF`=&0ZzBZg?>/) endstream endobj 341 0 obj <> endobj 342 0 obj <>stream h[KoWq(,~fHE,.$J!);׼` &+OYzf+7 FUHE_Rqez+v8^hƋ~8T^kBE{pXAaAf$c8n 5jb#V &7GJH˜sQ8 B)hD[hՊ10yg| G~{ >W{Jz\RaUx&j&,-,tRD˟m,c%1:!sY맽~ǻ2lCRXzzRG.<NU:ZeBZRVIoqJLu>1G4u$rp=;/#iXGB$Pn-2(ڇ0iGQ>80[v Kv  .4hK%q%8 ~/ hq)mpSQ6qƠVm]an(u@5j<(c Yg'⹶Ʃ^V]@z Ufm\*f i gE9mTI$QofQ[KoP/mHj5`TK7je%[-m}޷q8|nll߈&ל(Hc3_l PzTxsfᮅ͕QA f!#^cFIKe}u8Ǹ?0m|r5fsiZ)1N9?j܎G^E@G*Oҥq?] a<8a ){IjY#ٲ-3"42cV @2rY 6ձM^\g d ?;+KT*<ףH96wh[4|ŜsLO_%@5TEv s}.Gq9C2 prvTQ2\Y4^p(3&9Ȭb~C=V]]$a]]/p=as9C ISAL!Yd.vtl tzfB<1Rq) ~2v,M+lr)NsHyi>o@+8lO=RC(}U$pʠ1`Al]>us><_c,:81n nV|Ʒ"qysTu]Ĭmpotk:|΂}SNrV<'!7as_aoml#hٷo ?v.-vzPFؗ w?<vpl>Ixo>B RIӨ*3!>.iYWf݄g" * )-6㣗?]+Akx7ov|nµïѸEoD0 un{m/QB9oBr1Jl۲ʾ"m[E>xcд݄- % ݙcsR%vIX)sjk W]?>1݆ih %M/I[ /;rð`,&TEWfH. Abیk.Su܍yaM.`4/f^77&g~!O+l4kc g ^QK#:v>SdL endstream endobj 343 0 obj <>stream h<1 0 E8cɁm[RTC_nBciRGl{*E ܽW^foct\ Xl@bZMwrAr$(b:O4 endstream endobj 344 0 obj <> endobj 345 0 obj <>stream h[YoG~篘"}$,'3'Fbߪ{HX8-=S]wU7w,|;|=% لUHEpzB/🏓 J9y5{’ex27|Ͽ%5 _bAaCHl_l&kHG,O$N'LL+! c%Fq$ BOL)c| T37x |7wҔ NipMD%LL{ŨEeşfr! rPTESRKE=tjAG/Cb^j@:1/cA .hŅvDoC-iR(ۓQ`*Y#klܗ(\`YaF&*X&ߵ,#R 4Mg$T`vu7qbEQKet OsڥLM;;'չD󨶓lkCikv;ʬ^}j1 g2.oIԍ3.çȢ+#դNgL?~zp3z]k+KCf.bq&Tȏ3+X)*2,jr a}7Y /*g 찀?`)i =cŠC4@ܴ3*<чBdAD" PtĘ:_צ?M5,T=~k|y3hw0T ZY%LMuh H|z.C!wt[C|Tc$)˥ofSb[(;Ox+Sq]Q \(n_,4~a41Vn"' )Zi3JTȹ/{+5ma H3KT'JX Lc] Ndq2 j2u1+5(k~-4a s^_㼕 #]KMYdЂv$_7# PH X #uBEKhӐ4 +6] #E+{X.bz)ۓEM}lX[PWHR&-]],Uqt'0SՋĭl]viQ,FG`et*c|˵2peƇh\/ORÈUj{A1F9BJUb=zXI1V[ʕ@X/seR'Jsܼ75v:.J~_˶B;\ ]iqVmC~n?~=Z*;"/忷;lbΓm5RlG狙&3T5>nqִzH: 1霧S5xS5Af<3 ~L˞m(>>dIyypcѳ%U`\R99.݊ 6ZnCeƍ ;nVf6!踫 I*KPu?ޮq1gTaGUtC3]8޿^mogh>΀[;vAGiO{Kj 3|mg9)lyr<o> Q^xİ<=!?+LOAŒ ^bv!|>@ebÏűJכؐg >:%(e~u (&~V9&H R) 9>L.yZvî@GAj/,AB7N> t3Ԡip=7oj8l!'A UlPaC:ՉWG͉kyd:vW#-A;ΪD)œWD!_I`Q ~ѥLgRc g86· endstream endobj 346 0 obj <>stream h<; 0D7ޕIb&RR.DQgRya a%>۞*|{/ngYBJ5KPlf.\ƨ4 6ЙHƞ5c j\-~CCYt?: endstream endobj 347 0 obj <> endobj 348 0 obj <>stream h[Y7~ׯ¢y`o $}AxhI>ūBi[$u|,_sCߗ%H0:S\ !1x<˵+1^2{wFM+C3Ih8-fhxQfc BKqBtv\fJiiCŽ !dJPd5! F䄰9oZb/aXW߼] lS !q׾OL4?mN|!ˈjH έIWIjv0a(i4g$CίΡ %3'R4#aݩJfnQpkY #Ɓ:وAI;MF N҃R?l=]K"QI k08 0 >%fCV>80F54~ ̾@Kĕx9\0t]0xMki 6 j6H6ܠ`UTnvD&B x]\u,@5*s>5P+x-ZZ!ngd&qFc[S|Ҏ&«(sHj<ڈ{x&Ee-1}V IA/!>1eb$Csd\ dkeV$%E6_3>Ȇ6(j( ނ M:-aP32ƒ -*6k@FD(+u-rZUҲHQ.^4z0Uh,qch/kxDqk/p|I8 @EgҖLi; ٗW`צ)&wvx my<۫} <(5Yʀ,ZPՅ-.1e02` |KGPJJ*TWO: )xLcKS*<7S[Z8u}z[-ͩ8ct!*)Cu]b ZbwJOx902=D%'R*3MpJ.6uƘKWOiߥs71LՁb*:R=ZOrq[):rw& HhZcFOI$7id(i0?s$L~KZJ‚MPl Y5ͣOc  w;T9aC=" 7%Zؒr_Qzw߄ӎ/}[=&p PbX)!a>|oh].YIm6G#j 3}YgH2/JbB] -(-ܯKÈ!# ӫV]ݰ.i_~)'ƪh-1cva[Vt\AP) AIEq*Kid ׷vY@,]+)igŠ5I=O(Rfmē e@3[ys:PHW st+%`l;#VoS% cx6`o?Vf̑+S4-NXHlj~nlZg43)ɔ&(Zyn2%QL T'ql`n>az۲ j" ESމD%%/׻Z~ڥ7@Hp:_=/7-c>Cm+]á,JAH.}M#䨤#h^+Y'Z:QNV1-7u1[`3ɹSI8 %&}s?/В^Z2ВagP?->dhIHGsd%Er+YyN&! $e> 껰v&֓0ELQ@}XGj}Ԅ~4*-anPe҇! 8dx|PHUQK1xqӝ$G03 24'HeˎAFI74%oCNQbL JRفC/5(K22@~J3?dJ &Zvg4""nX 9xRëDJe FҼ<#IB.HJ|hpN$ҤXoqdwua@bt+/[`+6 endstream endobj 349 0 obj <>stream h410 E$ elUUng AS\rqyHղĆ2xLuei58oD +10VgxfYǬROd,d endstream endobj 350 0 obj <> endobj 351 0 obj <>stream h[Ys~ǯݔ1PP(*)ǥDH,E `9ޙ{61HavzwXzj Kַ F ?7(MቇM>gſ~X\QJjſ,O{xO)_wMh«gl ^HU~ɘMBq剕 poϿ0\b'N P$ 2&3`Z2F6wo3\)A?[ W Kj)Rg߮R=HLbPn"OmSPY)XB`€B  4 JPNX^<)6)T$ˈkZRB%7 (| ؍E۵lIAIvtW*޵01@Xg d=@DSKmV:I;ARraA{Կc H;R blc] Nd@%d/u)mXSSQ6qGʣR9]qD.9^;ҼFn#4N5rfn=#t LN H s Duӛ~ %2fwG{Ko,Rw+4c92X{sEr |ٻD:ל(ވ WfŴьV9,cu6&jdV?`CXz ^CdN*Ң~ٯddsz/g^xW<#eС&\q8XR_>ax'xOzwag4Lx.% !wXxJSOnakM=aX^ )1&Ik*M 6I`.eH@馹5辂mϖtߩOJ-ﳥ%:\w_h$GUy6>ǒʤ߶h "tڨWa2F`&ؠ6&pJ9ա|9ڰA+#.i]L3>l]Krkl~ڌj6Y<z淏S~+}ʢ'"yu]67"%؋rԢe-KO_:6EamknDwO]8ݾ< vApɒ@z(昂tC&ҼπVx. L~ C,Shi3zw>J17ޫvآ̿p:6SFp>6Oy" %or)ܞ#TrCBagl3A xO-ۈ8K{Z y!~_4A &.Cz}vۊO3dlotwlt*a>T9!cP˱HR0*|nmuMT.i(Ɖ-#ݨ|襁1U@`k[r}g@6+D!@ ^2M8PT<+~UR&xxo"mzׁq}<`=D31=(S7;i PAH>l0F<+ |+#EeolMUabQʹ vKmA R21|8;(+Q]2( gC\F%3!y]|DtrZ҂`8uw0;tRtR4NpQ t)wǴpI@>4 Z&Zo `̆lUKxKl N[Ȫesr'}Ip3Hm.dkMhfܣJd+_R wp/ wM2|3C[99m=}jWTOXg)4Jh_vv?ιEd|^0O㩓hV9)%| oke6m"B* ܾ9;0/;1w7DR?3=v޹܅ݬ)qr(Zq{6hn Dɠz(Tq{HvBoVHg C e7{s&|i#+M%VO? ! qpT@լR0@nVD_E 8Q.XasgmHP ^ptk!v Z}vxL8k O`tyC< V=s kjS/}`]v58.8,y`|4! F;&KdË+G%ã8*h;j:*j0ۉlgʐ:m8BHqe8==0O7"YzZ ]k*\Lk=t |s 5]0~ C Szd+_z/mK[省{2pCPO("Ia럭!QTu0+O.MbMqy)SzE5gjz6e™7?ՠL=u;>g :M9eRD7eGO%|* dUYa%73-y!!,w?qn |N+x9 endstream endobj 352 0 obj <>stream h410 E$@aE$P ב,[cAC߫!HE.hRPqiL$cxtYYj ánQ]-1o3GHeTL 0,e endstream endobj 353 0 obj <> endobj 354 0 obj <>stream h[YsD~УLg>RZ`( ,l\FR,ׂkKQ3jMOOO/I0p5{Zd737-֙ a goZfc\8{2#]+C3Ihd[1¬=?:l}B$pSۙjAf##3Ͽ} !dJPd5! F䄈9oZb^}lXaG\]"S !qK?'h&JUN|!V7}ՒېH)Nb{۾0T43!SPWPl|)0TA%}I3Qpe昔Y #Ɓ:·$q#1v!4)8I> #ޱ`b@W$}"IzvFVެ}4Hav{ؿ07Pqeq.R5.E!  qH[66ܠ`Un^/,,Mppet YTU|X_-!kPscT72)v8NuTp}^-J덝T<#S$ђ01^a8īnK@JՍp5r@/I{Dvpk{/v>FƀRzw"xx"GiӄYЂUf6\|kTi1%Wx @͵͚gxٰ |6,YBeB[w` #(&: t>w!&q @iv.a|,WL+ΤF.Ru@X4:tQF]7p1''a7THG'6ȱ-'/ L#}88#HQfwo?8]CD#N^?\+Ѻl:0MT]78o>|ܢt/7,(rhCnj [@͠1cق8 7_ܜ@@r>>۾F*d2^l|\B)ʷ7:Tn7Ql߲ md~P2˧l)_oUc AHnG-_t*T* $;>EmQNVT6tf59 ! qHݠ+IŽp~ NPQ|,Id#ԵNIÑKul(EL u]vEC<)s? K8$uY$qZ :UEjVv5vvۗI^5#5 R&lKl˿)s|=m~>ʢ6u`Q9_U=OK>@m7ғ jB&=<îTϒdf'(/.cA?%] r֡'putζ/XUɤ6m8˕=-%spFIMQoIv+KVm&wkpxE㡇S =DaGH;NZXSa]H{;∻-.*αng&imUˈ%T֮-~DԳ#̀i'PLFr]zj;,rmLjsY^ٓPPz^.: l=y8{0Ct{.3҆ P1pb ʼn|!S]UwG6>xnG|ۚQ~9U&h a`cFdRd?Imt*$|} M' >stream h410 E$@aE$P ב,[Ր?~"_ {zhS)sR|1Vv,댈 7(7r#$2N*,f endstream endobj 356 0 obj <> endobj 357 0 obj <>stream h[YoF~#Da`2 !YLȒWGd7)M8ź__ɧŗ/s6! @XOHH O<\'/~o  HB'3]y&gY{x~"_'BPi9Q M'##'!a]+ϻ#B(AVaL DN}+ՌDy} e5Őg>.1S?d_CAt&/o=HFTbPn"O:jii4gd4#LB^BAJN4)^^*D.mVX#+OJ1)~F(Fmv}F ؍TK$.RP> `Wjmk>n|$쁷k0pp2Q)Q}0I-}P`e)L6;hW(/`%ʀ{wֹ`Hֺ`24du#1nP`֫%N-kS4o06#BDYQs7^s Z`G"A7/!j hR|1c4q~j&|\!i}BeEM6ъʰjVIFJ.g"DNZ5U"֙rkF-Wtȣ|i=t$)jƐb f >耕 qB#- 9ׅ%MOf$uj\%LQ`= e/]BuБC^ZY8*58:xtcZ8*}x9L[Gaw" E|ߕn:SH }rBj8{pgl1⦎E*<0,VSDd10A}P}3tAܶYY~mG ԷV6Ro p%BW(H(Z,@w\.vهrU%}ӝ %WT33ׯv]*cu{7\Ǧ?o`3Dq WB^  pAӟӋ6MC2XE*1d`'uOP.,\Pj+%x_=TlpX+8mSWOPg+HOMo 'u=n0T٨j.(Yݎȸ ж<٬O@kK$m$o:Zѻ! *`in"~Jf^^՚osbR'AIhؑÔ?T_,6j0kgb[mJѕ:gwlK2-ܮ66}sziI8eďa TLgs HcF.rhgmAC|XX $T%IIjƶ%q\PNGë!;;8~!}߿ϲg=;qaRAb7c.֤-ʺCJ! É|U=nи#3Ӵ/'bsLSm:Kpʣn tEUnp] zs[X,r8mRbP?} YS b]#% 2 a㤧 lBa2Rmg3~[oی?*m 3h8_adcnWh)$#ฉ}5+pp? y}&'ӳ "m;Ꮕ~Or\w!~5l[qUb"Ow  ݙqw*QRX#05YVRL6?߻ 3.ɜx'jRgfYW:"ۍ"(/X=g>KAӿޯl=&HUC)ARۮCRWDV`T*3nPDcl-uo\묟d#{H_yߗ}tZ?Ǹw)~7'Q{)vNɧM6=ۓT('ZhvӮņzޖ˞Y0i]˿|D9~̚U}G׌rp]k4'`% endstream endobj 358 0 obj <>stream h410 E$ e5٪eHE=p|lgA[[\o A=O#T.cJ Nו`1zзŽ(l1[-I|'Kq,g endstream endobj 359 0 obj <> endobj 360 0 obj <>stream h[h,eh0n^8 'VFh46iÎ#y얚c$0dfXUX~[''Osl0q@Xg $$7'8|i0y1fN~O1!&LC1˓l#̺#0QfcB×M 4#Bɔp+=An QS`J5#Q(L`_+/z1{2B2ng)ܽdM-.x:ӿn$#C+ER'K֋vmi4g$C@^KbM hF8)ԩSy%I*kDye H9pj Bj!]rRRP8 `Gic<H?#,kI kaq02Q)6:g[jrkn V]" wFg Fo(Gb^@K?7㎌-5(F VaZPBz -06>wWXh˥i^M^$H^ٷ{e>̕/SPJRSCxyL7~qg#K2GZ(SyڍXҬFY;Zx;-B"VJٴI3ɤ5x؍8ΫUqҢHuI`W)݋.EHI$.YwCSl1tťf SUr_uFQ1ꇀ;IJJn]$1fIǫ!N AXbcq 5&5N6mރ@4|LOG\0RnT|^DT$R\r>P= ~cnAܞ:dá8>wqځ}蔒t`7"jv!SF8#P<}?x3La+(MؐNot_G*#$a&zŠSa8? a&!,|P?//!(q*iҮ˻fkÝ˿*IN=<.E .c8r26xlJL95Mo~-'!;f,=_)Q*f)n z| *N$31m"9̈t%lj~T֑9` vp¡"KNģ2J4gzI3!24' fs ].0ޟ)9O׋pQy %oPeH*cik  [Y+_@3cibTaWsë-CTIYOq.:\/kF=- OwDsOajqr fL){Гi`ړ)$q۱͉AdX ^GqsbX5CL3v$ݏw-ᆼ m+`[nK %z mLu-eW8ܗHA]_mӭVʋffëʵ-j|Sa} kn#{zGh^%QZ;xou >Գgz}4H˳_ծA!g> % *^eJ#NZ'H~vqddGƇxGؐMj<1}L xlئ ǵ2aNˇ)$^CqÛ[x:&Q_r]m=Y ۶|Z=nۣ)&ϠQQ^/`@z9EGwr#z#:B+KTT=S)p|>8lN>stream h41 E@ E,m5*lU(bJzk$g{oQi_bz4'Z9ul1S9wz 8o$ .X Wpό|m3ʯ[*R}R//$ endstream endobj 362 0 obj <> endobj 363 0 obj <>stream h̚n7{- RpqH AqRJbh.=iZ%K.pivX,xF%ؚ?HLLRaD;X~&_ѷ>gwmY(zl o* lUf!D&ۮ6#ɔ[(ҍ8 \`Jʹd g=„P@p[pFcHw;4_=כXM9/~Ap'MIZfL+ĦyZK+x Dc@&Z9ͤt(^0+׾`KaEbq0ݫ.ZԔtaAʛ,t{gL1T ްtCt1H["PI3~E#&ѫb#ݠ{V0__Xwb.$u]rrB阠X}8<ŰDqROǙU=m/sr-W"5r>qym:[P%3>!|5]U"UhԙKEQF!zz@si4.ofg{g̽0hÏ|9zf.0rrā sHfxSSPQL$Nm`r!r rAĿ܁̿~Y&wi[B^܄iɛp xQ\e oEwёv]q%Xuf.>ܻzp.ޅ2-n?ܯ81- ҵ_<$Ts@9O8, HQNވ F뗧f  -Ч"~-~[j:'HĀ/YK!.q3K//>K/sH7O.Z̀*Z)ʽӻ]LRCםs =zDc*ur g>|ъXp{DR: w#}q6/fe4.%vhЅ٫VAPdO`p# vA;YPΊ4 F\Vmm૳7a( -R Mܧ< j{FV*&z7=rdc1=GM7M.Ӧ3+R& $/JUԏsH5t &߲ :UbVSD)B69uRP#$9EbRh~I6vo1N =a&laS2̒zXG9ϛv*h7h>PPH\I+,S  pâ/gs_lB_mQI:!=_V=У}0RV{3,*oRzʑ>stream h< EeEd01lƅ1L1t~~yh@(]2|5 *6uhlfײ鋙⇸Kk C5xfK63gK s>ܴY`z/I endstream endobj 365 0 obj <> endobj 366 0 obj <>stream h[[~ׯ#&s.4&[]+J.u}/H~px&a!o~"˛rK$%'-K +1{|⏗-r+CP䋿oE_y 9j<0e;숹9 K $IrP' th(U@GẌ&:08@)rB\>8YAPӀ3Sg@ɔpĩQAx+Ԣ Q ثK zI^lm4ˆ}d3C:E ѬەW!;l$0\  Whx&6iGi-V< Tf.ĻaARRm1Y$A}tq}Oj$&ՂSBJ`;l0F<G'p^]I-$y[/<8 &q=IG Aƌ#b˺ݜ[2ϩЭAmU<[)2-֭,_A.nV$;Mc1Vbjm(2jWi<|\)]>:bs| ~J,nb]8"OSGR([5wymw'#DB$8tloiAT:٦sӤCawe^l-iUu/kQ^Zfs$uKfSTj⢲96 L8@c0*} !T9t^=iEfn?p:;0I p|!"dZx 2mVrg9&'svk$20e"BkCɺA5Qٟg= ޠj* W{E08# fl+ms8f`%qLǓ;ق%!EWxV+bb= 0dv#d~]UΔD3c~r;[CQ#媝E寔J3GlQifѧ]XsPՓؓ218!ue`gEn/jٿX&9-Ep:fՆƦ:haⳣbVPb=hkU%&zw݂B[7':݁!Tvμ,S9~߾JyoyQtAU8ᚅFw h=njh;{cgںCoqwmJbSR K黯U0E&*bgO1 j}ևg*` 1,p#[Cx$;F+;X!Ƨ5fM\$Μ:j=`'r e`Gzn[cƛn A뾚YvlV-\l6[APzo[#qKc׼vH{ w3Hc77jvj uwWE2,b1.\™:ݤCed9w;\r1O7eyv)zwÇE^m/ȳ:pP،džE/cϮFd*fYK72:o,ʲ(dYQ,*@!-ްHI0R{>IVzp*ⶻ`6/3J%d6eڗ>ĥaLo.36'7s_R,L)Hٹ =*I@Xx H.C \I3X/5rw6a \`ћ+DLLw%s׃阥.j&z0 g6 (4m8%]R EIO ?:YմESV㾭+,w@{pO.wW{ωOs1Z7Cy゚l(jD6fAxۥd4DafܥGK>Ccqd;zftF E\Q"OiF5Xf:8Y̘QNnbJi81' `I ҩ'Y@XL>'je!oTV #9/][%[1s7BN?dܩܘ1n77BClh]LeramfRΘ>stream h<; 0D7_+QnM.0F] $wZ-8[#*, j2O,s(kfifBdVP;`$jjdTL˚r#v{g[HŖb:7m endstream endobj 368 0 obj <> endobj 369 0 obj <>stream h[mo_Tm%0 h׋`YdK7;;eRvpfvfv˿~`|ˋ f(q6P#|.VT_:{{1׌%~7'd_JgBEor $* #I(XXIN +! c%Fq$*JL)tV Kt^UL/okW6ZS}%\z"<C.foshQ,/m!{sV +0`„#F')bx$[qo6ڌZetAgTIY&`Bb\R8Ѡ "B8 R*=^Z~0 c@ҝFkf0 hA+#zP:8X*P F+pA79\o);yiHTFqD)'Zi~?:hxWEv4c(jjZhDf8mS]i8gA?9m' џJgJr͛%Vׂ RΠ;i`^κ2Ka l1z!!.JD/rƵ騴{BO1Z=*fUG# MW`cPfZI•iayL(;6m ktJby%z~90tvWfËTLa7#e1XڄRy/7:6Ynoxu'L>wU?&f2(A@D)2z̫rw$< (gT*APNn VXSwY[nނM6҄c@f?ZXFlu(]"9p ]e(Ǫо0_hRL mIɹ}fnI`(!%yHA2J t/IHȱqA^LfGB?SOg\T89n 8,)v2.pNH,fwrմ֒QpS~勨t=ED@ ^lg,|G[( D_-Z{PDWaj70;CH$# bk[N#8̦™``>.w mѩCU1dyv5kΐz|H9!\̨#-|v'wAjªk5T>8R !ʲD D2*`!="},v;R\pZRD<Ͻj0Y{}?Й]?+7-qhXů<zfaa5ׅBըzΊ~,-J@Q(4YZ[n6տ=Tpn9VnhZnowCXSn/(naI)a cHDw]?t70[pJzll@j3NNz;\|*M-Y0-u&ƙu*F5z'‰TMi_jiwhf'ȗ._Fbzwn־ң)M}'3*77/.n~7> ezi*=3YbRn "@aj&mKL6E zuQ%ZVV|8֍w)~yf5â,4/ӷ[_Z``4Ii4F]\-$-T-줤uH]nmI" #˭vGҽo}y{>ݴlI[iYi+NŢn]7A:⊓jY, o}ΊC_ ⧟vrjJB~F { ZluyCG"}c++t~M8¥$S+\jO>•EH$96.{jeGHK' 3jp./>ip˘tn K\U:ѕ_@~c~ŏ#qacʜU} \}>+Ux_+vbݒ7Ӻ'[F?~s:B~WԔw' 5#y̜HBrC @  I`u F.Pv7HYPvZfPVr#Hh/@RQ<ԫcU%_XBSO^Qy유|H[iqS^yL ԠZWMY ;Bǹ'iN~W֓Vd@@UioՋ{m,"(i~ v‘ ( 633kiǮn3Z*7$B}`}y-F۫Wk.YeqŦ>stream h4;0D701Ƌ%_bwQ E5*:_>ñna^7́V*f/6)erF00:-27q9}2L*? v%) endstream endobj 371 0 obj <> endobj 372 0 obj <>stream h[m۸_r33 lA?8ڜӬ\}/zdKͦ9lǎ(R3Ç3?n׋Ӌ Avq=J( $dZH";nf4{KR~vad k2,[bdpPn/v*eS| TdL2$2#Up"]?_~6Ӓ+P )9Z…oArpIMҾ0&B#>s\n>nQg ,`q2b8p&hFD ".XNG˱`6NٌD9NDxr-(%:8눏K*s|ujds_ĵzz~}K i/!qm  2km̰1%)~ӏ֣x] ^WT.$'ڴ%gNjm !/ۭrk7̠Vh+ͽVp肈.j$~)ŕF%~ȣgp[!-Hdc!4npPmzrK;~5ֱM5--ЬNzA+yP_҇ :ڒm@&uN&.eJ7۩ MED(o2S.,j p)Xp9nnMjxa)ڰ{̦wrۦэ?p8mMtE>t*2k$Ĥk&` `)=k{ҲFi&~@ef(:ĉ{ !g= ;H%yJ8zvdqzDY\Ɯ@w[}# l?@5܀KĎnCy1hjl| )"˅'6Zd2DVe#n1)Y 7oA3qK"UIֶJ UI@ma$.RqYPڪ]7K19zA|G#Ru<t᝺7=WVBLZ [:GZP. װ>Pn$=oEtt]VW5sI8,<OwכmԮK\0GYݫ¼& 57Enw'%q¨m̕TśxzӸɦq/n~<$CMO9^9?O ?Ơ{囅nB^nF A^V^x$| (&OhB0Ŧq2':}t;ơPAh77^x,)OVrm=$/tۯ=q"/_ۛwI8K%)up0u!5ݐ)5ϯ3@OLyOHpn3YuCF3u\*k"W8USا" 7$uL;|4xw]7bIq;gZ£3z vѠ,<_4r c4?a|eȵݓLPqug~Τf6[xC"&LUvI H+_h,^bZeYZʌHeELj 0"t endstream endobj 373 0 obj <>stream h41 E E,m5*lU(bJzk$g{o;kqTG׭sh> endobj 375 0 obj <>stream h[YF~ׯ#Dt߇m k,b#(ȃ g#9&G9] CQbuu?8jbs:_()?Y3BRaFZm?f !jjیηs][6W͗P~f?)@xnXJ" iA7d %–͍(S^J\71/\Z;גV`ӳ*pel㮖L[wn‹j5R6ܕNI(%c_fXX-nSſVE4 .A+ }T+PfR֔Qܩ z$q xI1G)I f "kXJQUs\F:m~4ښmuhDZ|9K0NqX,K] w!FO!S3bu>ܨun$N$m'afE\]dEE/X}Œ6);UAXcDS.xWpPCsۮF%1:dQ湄t [KZ rRfDϵs9heVllCJb1gw.zVZ :EQ~ |ןVl<{Ly9=f!u^}2|& 6aͩv "ͬ?Qv #zlEbfXo J'(5M*Sn1sCppR)X9uUWЮ'ڶoxӥEt(I5os[Y`LM{ v`x>Esj}t:{fV>I?;سIE'gިOrv;A$wMmVi;IHLE Hӕk=6~WW*4U!*>QfK)sp `!J-JE/|[J,FuWQQ2f%걹R\UCȂI5g ٸV e2S~|3w>|)w@~FAvނx5QH("M(96,֚~ucqqmCZ^*Wԣ"|v/Ё; jH kndS #ӡlx ~nߵWY_=96'ӥ%,RsMY"U3_Tk*UV_e"/}vTvfi[+ؑ8 ͓mMjICvLK-,䥒gHZNM j5(ԃ\teOfҶy@L9u"8669U+u7hy;/Y1 rQ-.uil'4)v{Sn:m5]nk 60a%z"q.3ױ;⻷ r2JBL _u= !81 :TU\'u~AMd/%eG!}=ޭ]yxյe\:hF3jgPKO8^혢ڗerAa|y3!COpm'riQ҅U/u_8u}/X6X.C@jĴraP\!SPh[,ؤ^\(+bN!hiq4Z\Ko2jθ6ֈa7dRk6=T:{$Ivʇ(Hڴ[zy$䃥w>\fBSuј ,u5!26;G{e~?C09{rnBagۥH=Q]S?) :hA $W25P6}.Ӌ*37ݩt|O@|$(&ޘ~O8ZfWֲۗNŻ7F/s*p4(DL)Q_~~!+6-~ݯPSr< < "- )jzIH@O(D~h?^'% n!) 7s %p:#0%AQܱjYH=jve '.HMoB6ܹ#KVVt@m=tA(w/"]7BY?ހjr 2 ^*Il̛C>UH.`e'p9 cuP|Yc Y/OQ=3‹bYbwZ\z׫ qli&04Fh$$(3өg[PQ aLj}X?Tp|9_.@)v v@XX̾l `:͈aPZ7]a -2A")[{Lã&I&)֝Kl2fo 53SK V"m^4$G\궣!d>ECsG]};n)g ̖Fl73(!93Du@uд W!읎::YLd؄^pT63~Z:he)X>! CM!ś38`MndN7$ [ XTa8 <}/OE۹ 8VMfQ /{!;g2;uB -j͈&5ܣf׏1ڜ:wwӡN;>/8>n|$ظFjOz% gV>ĔϟScO1WEK($Isd=&b:(# endstream endobj 376 0 obj <>stream h41 E @0HKd [!تr og[v %I꧞@3%,i 3v3/R@WmJ`h, sg32/ֳKYr;ƿ|#4 endstream endobj 377 0 obj <> endobj 378 0 obj <>stream hYێG}W/7(RP.a1hѮ ]E}27cXl\UOui^(׋7*DYμ+8ߜf4ӆ ^g[\qzafi!^FbE_g.̸[ۺ`LsÂ"M!4f{ VKsD)Zb1+ ޼ o~;on*zI2Ci7 m(LJoYOYWJ3UU͖n~%% Pahg5Z`" @YAIGW?z%$g64L aɅ q1ya<tcr<`1<$s#H1WX sH% F}* zGBoٞ tGHq6l?BbVoƬ3Mv0ō_qo@tbQ(zeCǻCU;!0s< hG8tT?6~R?ݸuszv'.ĸ><.qZty{w L!I;뻻^y~{LxwGt$O_ )'9cNXn3i#_ 1GRnB-r>w'_NlV`I%S`-iO'E!ٹb74ߓF_ b?GJy1&ܴ R F@+]}3@7FFE ER8K7Jv~!:= f x8=Ļ~̆ C/ @I$kk5Y*;k/X9\7]lX|BZP3*7\]:U3{f\Ǥ4  )FSN/ endstream endobj 379 0 obj <>stream h41 E E,m5*lU(bJzk$g{o;cqTG׭sh> endobj 381 0 obj <>stream h޼[b~Yo& @E ;IKY!i/_k_Չ~Զ, nw׋kz*+8*T&G\aQdޘϋ/-z}]KM2I2NOt8W/km D $XeDN$HL1E)fv?S0: ` TM䘰%ovaNa-&4R0AB?FAۭ~FPbi']u(hJ&ÎTDtB]LHI97WcBLQQVgҩz_.Y9<)>Myڮ7XI>á,Ed)q)=dQ) jsmLuHg'Pds (n&B:?-i@JUwpX%4mڒP$/_IX:jۗ5s-9{ǍvxkDߞa*HbI'q/㍫/۸󍛪x -O)u)|=2- i?䕓BI%%׎x$V"ci !W?FFExwz_l`CF OJwTcƺK hE%Ňy:>Q0lP~0V+ P(Taqy>1R2UuD(ȖWT!)A616cw妉fMNگs#BIM2PAoQG V`=$j}euc" Qle甾ݝfl$;S̩>bZ5u b{lziŸ8O!: C_q'orAANS̃2pj1"Tqh| EՇ>WT ٩sxrtC)N{"[e/+BG8<>W䇱?̣@<n AKPb8{xN&"8 J*8O?-͊䬁ºglt<mc\+@17l"FI.Ov mjw)p=L%( >Q)8#ʳ+6`Bl@ 6 I1nUA;qRPPs>r;Y9?VᄶǬ6NE6a`|?1# ORÅi)BI(-XA0/|7 : e8wft/sxkň4B82dY zm>NaxL dbc_/ S [4LӇOchHi#,Keo0r_(=F`)w5|y]fn@R㩬ӦLjyK+IW`>Zcm|a8:KE|9lB"Xɯgi+5CWnoLC 6x~ endstream endobj 382 0 obj <>stream h<0 E6/'Rh׊dC U T9cb=3=zE'=C 04 endstream endobj 383 0 obj <> endobj 384 0 obj <>stream h[ێF}WZD_ c,fw1AeRV$~Vu7/j93`ȺX]}ްv7Xvy3a8Q>YE͌TDi W|^ 3J8yu9τe ~7gld3P'/v:[2"(ܐ(,ɘvDq噕 p~m0\f'N`B)8q5qV3 S^w?Vә"&OrYW̯/p!\Ȕ Z*fe>*nt\NAbNt~Og|=->ym{de & 8߯w>u ~ uϘ$Tכz3?Hө%\zFŌqJLQK@-sD`Yz*!GDžG9SV hnCڣ~̃$  erkQ,̋G- |SfĄǁ\*A=+l(𒶂8xR4FSCpn@zh= ^7:xg qs qR3ʙAWp &:)W>ZfL5P6LrѠT A]+c&FOe-D5mtq1e).VtX˵VTx]+ JӜDi T [#2ȽIEӫIRǥrtAGTPgu>kGy! cFWP_Z.b7 !I҃R>? ZsC,VLݑ2fKLTi6W .Fe"HBXгZ%ᤒc&gnX8[ఒvֻ|[6xvQHrZa۴?#~;_pÿb_lwO83T#{rM,덌8(X;2\Z ~,0C5Y )}R~c2<5U㽌*m瀳%u/P3D-Q`N)XBD7ǓVa~wγPcҙ$~*`pN߮wS(C5ϴb5< QF-C Z/FG_IayyM' {KZ!vK!QQnF=DOY;2[`D8ex]\*7!ewL0(܎82f&8N+2Va8${@u J.EEqa&ug{>#u ll :q;A w#;5GAs,Q%kScGHxA?V^PjɹyI vk)#̩ʯȏ~~ū|*e n*%T/[ 3܌tKI58椤nNLs#q1uՓ[0jG3Mgkr)cx;65L͝35wܙ;Ssgjn$5~=rs!!CCf"A?#; endstream endobj 385 0 obj <>stream h410r?0rݡbD9KnvgF#40? ~~595ZTlz1s1 ՖC8šжcQhS5 yO) endstream endobj 386 0 obj <> endobj 387 0 obj <>stream h[mo_qEA 8nMӈF?FAQ'E6$};N\% nnfٙ/"~bb`LqpgwZM.1lyj1eBu+C3Ih6v6kYs^l@$8!:ۯ6ADq44GFf!a￝#ϻ#Bɔpk=An SPZ5#w\]Oә@*?L v_faך B"URQk9t&Hd2D%edJ/~9)dw|s⍿u0lƐʰ"⧷I_NMZhcJmL0nT]xѥ8P/߼j NleTbPUZuɂeX'9#Ҍ0 ʭ+AJfRcD`)^iF8ד ZShHHP!31)8PW %gpσKnhO9Facw3PeD{0ܩ4[h֥>TA?x Khʛ>J)u,G@ܒJ!Qa9`X} n `nW۽A|̀x{7x\[GE@w h" ^nxm9V: kl gH *NThar _7eQ0>WMIHCR^~X]8PX)6-gsR pg^R>YKs7?|,Z A(x~ؤSIn`f{X%٭\22&5K0LFy(jSy HVs40/^TE{罱>acMf}^޾yӂjJeRcݵl )O|ad3mX_ֻ&j_^T)z;PWď8E܉LND(qR`NJЬ1cC y7Đ oכCf 5y<>̶#ԽHZ2s2Eճmhu/ 9f#:̧z ws1SQ(c7 &k߅ںmȘ./m+AРP%2hԪvh+w/T,dUsI'zT TRh`h>I#rob$bBv3Ŕ!W/]^VGuj{CUfLh-dFS猂B#٥8m@J‡w.R(hn~U,7|QhQv30o_YZ$ \[*ʮϔ =PņSPN|-EJs݋ԋ7^؏}Y1,@CP8r@CGEJ犊Y OygFlCfLjSxI21"͘R WquVbL G}?-*SuL59lL؊!FL~(a nJء/WY9p-e!-:;v(5ĨQ:?H&CёH3doby: k>HD(zXa#(;LOa"-):2 tvz{ne:Lh6Cg30blsX#8CLybN@bx3Ń3I9=0Z}PƤÌ:CӠ9@$`$pLtP=5VyU2DeS͹'Q/@7#Q*i:Qڴ*+XGǝJWiUa>stream h4;0D70%_bwQ E*:_>ñnf^7́V*f/6)eu5VX30Z27q9}2L*? y) endstream endobj 389 0 obj <> endobj 390 0 obj <>stream hZYo# ~ׯ"0{%@0vYnrc_w.GRM>Xdӏ$g߬fV+lu?#aiHH #f8jcl1f׫WH24f PUfu }{!H`CqBtvgJ+iiCο#ϻ#Bɔp(=Cn Usj ``j9?4'qsana a sqJ6*D{y/dy+<I` )x.+?8ΐ UI#O7L;XI *\A-@WRC-HmXIl$mjߖ?cЈDVPHGVȩY6?p!#_Oũ8on 8.ڣpIŁ|&Ұ:}c:l$!48Tϻ=(Qgŝ(sC/"abSr^Wu%VJe%k`-ٖ[6_] C?s4 ?j6+y/-lAǰ5?߯ڗmٍ6%{oKMbXk/͇!xSa)eb'a|Lo"іYXӉڄm="X(7r :?+?.{D8" Ii\}G U]ז4kKy n)Ml)AgT-&|ROu fUխ8Io.-N2F8*oD~ÞreQ3:3Lgt~-` -F%f1ΫoyWţ^ ~cKYӦGgpx>=\N 8Uzb)Rw^GHC*7zq&mIt+k̀q5|f}Q[GMu{QzUCY<1e&CoY=nG1.0Xם oR-!DFoOiv#KT!ץJZGC^ltH9ܝ-[aag|EhzypI^n# ҝ0ܹMlA(4FXaFi p"uDJK9ylŞaLѝ0f kٟ,re[VwOUTb"$ty EzޟSTc7%5=]4`%|kt솊'7QwTԶf[u;WOR׌4Z /ۏi֪tm{Z>0ȝv i4en)y7ʞYI1=4z~m \)Twvfc΋tc,HHѷ$:bt'/+UzIKUPN Z )ͮ endstream endobj 391 0 obj <>stream h410 E$@ŠH6ĀP6D*ב,[@C߫!HE {~h S)SR|1Vv,C+lQ]-1o3GH5ڼ 0,i endstream endobj 392 0 obj <> endobj 393 0 obj <>stream hYYoF~ׯ㲨6{F`GZhKE_̞-2n.c/~s2Y6 x>59cL^/^^,fx"3\dsR_?ɶ6e Ͼ؛lϨdBvpsۙ5S'27TُIu^-jABe+4prPsCwl0ܐ\SK9lvo*r\|p!<ȵRjԤB{t|q熬wEG9I2RO1hCj{$Ϩ\Zp~Ap>Ԛ nP:&2(S6^D,ltPjNZ=g* W{=Q-Jzi0ͫw\P^7/Z+';mgת} yE~ԃq  və1g(i <~\q]"@B>U0~ac𝃉hWx]5JJk̤ [dp#UÖL|e+LKPi;m}| B6a rP:BUrqv7c#J3H lcbu[yt JT`^7GX#a`>jLI5@Bðn (?@ȼnsn*,!FN} o*ޝ #:'yD[H)8cErhG2 |@4$1P(~5 ܒևa\8N8( tUA!3M*Q~ P@LV۞|djz3jcXefe!ϟ:#li=(qeR҅)^mQJsULr(mUx9n2q]>Tb )JNʮ܍ZɲaiT}(q2uv*6d=LMcR@_P#MGASU'7E>K=K} x|8l0 <#M*";l3)Gh&ezd#[4x9=y$JX6o{SJ ĝ r{[ɭ<>)Ri1jα'X:&UȚv7 ۀfe.o9ii@Dt2(!v] q?Xä}f%}qOS庘VBFrTo2`pwwOɱUL)R޼Qfuk19gez$c"Yў"r#Ke&h 4~d!mF_谢~ {cϺ߮V}!f}UڜuT=8]?[Ppߤf~Rc]y I{qblj![>|ǖҹ4{KztӒ9Xp`qd0`76C1& g}0瞱XV)f(]9{-*߮v endstream endobj 394 0 obj <>stream h4;0D7؋%Zݡ0"[p{3o4hj|sS ? -{i Q1S1c>+np5XHhXq(hUkT1/Y,a endstream endobj 395 0 obj <> endobj 396 0 obj <>stream hio~?RF4HZhSն"eV\RFj,ś )|3o} $y([/ޮ,!~A02:a(.V<-puƘ_zIv o:tqtp1_:c~144<=fmTL:K];ΰf(nҧdHcki>YN3yxV01O>nQJ+..+6[޵xeLwűApa"P NF!)Գca&kԋlF93QOG*k LVFPN?Fn ҧ2v˄CzEU]]#9Ri };>gw}R)}*>|^gS%<)YzZmzXf6@2pF7j 0#Hkx45A8JR2 ӮlHz= >xo QU97=\z2j\6zBZp)]Tr}qiw TO?$Wv~j>M//5=f,@cɆ49U%},3UhfqD RM:̀nI|xl@8zacw1ְF!ϲ1Mi*!/T`E7GI9I=R=LAGZbe <0wp^. g,<8ڮ|MDCafw?F2zmJ:49ajF8rC7o9P6 "W2HRJA% eyc Wb<]6ք.8} H*NFV,b$Ɲ>GA#ܭR+J]Z+%Kc6kEnkL*F/ڮ9GCy\x ^f3,`b@ U>l7S#;o{;⊟a(:5}Y,f!9ŷ(a5iW <6)N5pwK@q|ˑ[o~:9i[^oQޢ8hWg"(X*xF6HT!4RIXP$/]PkWۮkWM&l1y<]ǹ5~Lq9eafΜ#΄&\?{L3&t*MNTjshft1,>W)=AwfWb'y,b E"( aW~Dz1۞P[ 茵qWM])ˋwM _,fVA?>N.Q%T*]x !!CNFR䓄Y8d @LwpdpFnL /t *)omfakMx7@HЄNeރ@M]KB a M=Z4ub/;AƝzP?1=BDr j5COm|bD0.t25A0il 2f])ԛ~CCo}GU~ =VcUoAFHf@ t MA^C=}̸v9:Ӣ"$vQWyv >,O[" 815kgaڔbe䖞ѿilj/:]2߆+e/ICz/qofPfFǪ{24Hlwx谬C eЩv sq4-]f-uNsYq|ΫA rQG._% "<("~okWL_:ˈGP%ԈYIa/;ai yI"WiZ=!x՜U=q\ !5 BLxOGW(];zSIRQ+=? endstream endobj 397 0 obj <>stream h4 _e*/mkJ!VjH={fU aŭ|ʙuۛ T1UTʜTƜ^5!%`X Bm;#`<1bXβrDޯ/vU4 endstream endobj 398 0 obj <> endobj 399 0 obj <>stream h[n}W00}$Z&w:[#qZXFIgiPpeLAX&`9 \*U|d\27A^Є _mHq!yMk\rV7 64lUllAn@ zA+‹W B,kx P»|N +ބQ1ڕ̵ [|15JJUثD7+0u.P-@jEC9:fh|])9!FnQk[-L\0n4Q GVАS}7ظO6,q<뎣 !x?p`]с8^EWvNB* SH '|˰`l-n> !콢`R>O) ٍB>߶v"İz8w_m[Sȩ@i҅KuaRPK}>sws9] C=#k2K)<ӫ(JXd MԔk]E3Ɛݿ~j4u:v5U%T76_Jen,l|][H&ʩ 'KXtm]%l $`ݶp]:-`WL9mQm#|RG[Bm\= `e<^ꨁgy^ᴄj >ʖm`"!C e,_x2lEli6X:ܫ>@ @,@Pr"n7GD^M֌-&ۇRi)!=@\??;ai A {(r 膓EhsU|v)ǻ㋮l*\|hcu~qQt*1<OQ!- 19#={Br}ԲU3x8[CH8|>={d#GYA^``[8ԫK߼x% ̴㕀73?8A*AaǓN : 'BSs?}'~%ޖ ݻOP>ž <&pq@r:xUMs21r. O%'DzR#qk.5 sk uv2i'ըz_&IŽMR_vۖ]IyQ. @i,p:wd-fzNK/loI6 jVwPtRtm~l 9G _,x$!6 ͪ]P ӧsa|! J[;-?P^*Ȼ{[.ԫIa9K7Hv:Ic,YaF 47%| oVS]kWr_w>.x,-WT"4L[&kGZ#3I/-=o]@`1 +/{L8{zc%7 !yJtg+y~xeņgP_"&omRYT G~xoM5FT!' /:v=@u$HL`\1XW \b\+̹\K4̊,j fIwdf#pwatܩ+.N㱷`:C/둟 GjidMU{8vBiwJ8;}O5BŤ};%^/ɶYW(YtSiG+pN=`u6ܽKo7f5?XE] aw) ڠK\Qf L\=Ws?o K4v̾]ڀY/>UK[#qy2 _>q%w Q:7>7.K>/.p1^#X9wgHcLc1r,ۮmr.@mzn ߑ![@qתЁ?i` 1 endstream endobj 400 0 obj <>stream h410 E$ $&R +"PU ngY^=˧\rrYBPH2+e,_1%U@E;+20z#1o<3,{̴yU7C 0+,^ endstream endobj 401 0 obj <> endobj 402 0 obj <>stream h޼WKDWFߏj AFf%@nlZN]'Vj`BpqKOir|=^5x9WwߋoV_`.Hfd5=/X7_-[(i!<ۯHKH%eB!⇌_o!B`H@ \hrJT h^7^oևͶ}[%?{k%x%CxD8p'uBW&E%CH; %rFKpRmEt Cci&R/Y I?:N?a1JYjQüdÉـ :N.dQcSx4M{S ?Migt`05.U0g_ky ٲ'YH ]q^Upa`oYWܖ'."6md.$͌Cv뜝3vit&vr>z|g b[LIZk~,ӌRq3&Z`-⥂P}eAqUSO/f99QOq/^Ȏɷ窖x^ K:4m;EH> eyQe(G$<$E&>J1AvE`Si(PwڴW7N4$5\ h{~M _syYہ6cr{i_շ^S  I>stream h41 @ `"CU%J=5lw>[Fi)g<=WY@> endobj 405 0 obj <>stream h[IWH ڗ@rH95TlmnL~}^-ܪHp20"[>o${<~w7{w2ݭg#3 ߴ@Xg $$+v3=ec̾q_3m224f ˩]FuW`gb>'Dg~&(nȌ0$__8"ĘL 31ֈ0:U (a71; 8Ț6y>X\ RժB`?Y$GQ!?RKc`ܠ'pWcK[J*{ ‚ v2S'H*@5e7[ˑ̰ka|0 ["bT[*VYKqZ_]i I5^i\.27NW|ȗw;EvsJ:E7ucfH=@"75%m u>zS|JK5+.DBJp2V=i\B,/"OAXO0.쀗3 #nJv4!O%J 2Q!V z{1aw_Nq3M_Ζؗ9Gk8͡4 4^bzA`긌eQ18ur9I3]- xd 9X_=&"m5HAq s!LN#~<"ie4%YKIPJ|Ni[䩪MdHW4_(![x9!o#uj춥aSكI|CnN^<\lv$ۉ szb8Lߺɹ0)#h4ji%fGC}_(}/^eR8ӛ#V*Ua"P d`?w /+s3T 2aBk6lD@VsX%!P$V{Jgtg]0jT@"|2> [k5[Hf v^Q;탈3 йSJQbiJ}0&DjIE#ֿzDatVbN%iҀ ?~~&5!Z]l,C=~)lGс&nOWO(GRtk|ǥy.lM1X)Ӈ˂BA$S_ J.T6X ߕP\7VM9}̈-u4Fx@+'Dp4jNt0b}T00'UW$$rĘW>#,E׾>}lsH)=jy>b*@D# z=H+vH^cQuA=|RĄ گ$*nohyf 38?cY}|&博'ON_$C'2t>stream h41 @ E,m5*lU(bJzk$gٲt0V?H&?> endobj 408 0 obj <>stream h[KoGWHvCo=,5{p-$J+J ﷪3==3b0dQ鞪Ǜ߳z-l8c8;/|P;7R)__̏kBEW7oOz;͉BH;רX>8=g(lqS_믄$977'0zF(eX0!@}j gAwx@q 4Lc|~¹SAˠ㯇S%W ByPz:n[f^+a̠\xP9zJVOEv0FSŌH%[΄Gns"-uJ=m6l%+wP }~?^'}Xlonzt:tz=ͱ(GUEU~ZB4-WKTh \,P=FJi'3^|̦Bc/:V9P"C Jy0)}қ>BSs&x|Qmg|?_77*Z_f}a&;ca"LGR)l))R¢.\x So%ٹ=*&vHzQHaZEf؟$R;w@>-D07NvpD :%{U$a~YO%~0/Q/̥Sni mr04p1VafdWZ9tNؐ'$ !qBb!oVTPp&?K̠!1ssNjKb|ƀX,+My0Y,Β)2ONYY]>T56|qwo?>G1+GOq:3nGj9aā|Zq$Zm5qZUf͎t}@/0[h?Z]Xտ@DٮrQs#WF_)8d0`'7 * 3wDIz2#=_~ CH^I &]B_:XQk 4&tX_ilTzH V?_ϋ?rѥt:QFtS~iZe6r0'OX'_%AOIevYm'0$v%@!zz=3TNn B{@1 P9Y`" i0.긔aE&s4RL<8I%q4`1Y#}Ns=Sh$PNbTGhky8,+Eb?+fWiqNW{ԢQCVa#U_-+o#Odz묇} hjGi/.eUJ*pCU\\N n|V+d~'"mkΒtܖ9p-g`[$#bZ\t,S)KkuAx'K~Ћ=sќ_Ҡ(ǨM L{\+_&;Я>_MЯ[:=+s=X̰a ^Lu1vZ@ ^=ö.pI0 CxO7 q Vi!@RBt)PFPZFP s1W+K*_.TP;&LP*N-W}y^7 <܇h|Tȼg^\k4(>stream h41 EHDX&kTتQV(Hx{oY LO9ā3hQ5Kll3s)in}W 8o$Pj`p3Ȍz=fz>/z`1 endstream endobj 410 0 obj <> endobj 411 0 obj <>stream h[oο> s!h"hnö|(Ja *)ݽ񎖝Q۹߼voew7Rd,[%fOVj3#Q3\gRqe?3m38iƳ~8lfS _*#0QgcFEȉXYIΘ +! ceFq$ BL9rT M8 . "nåP+3Is^*27yPSY o#V0a@`/:bt_T3& A +$RK,V yFRp )1ACN2G4H fCֳ" H)G1sCяt3ҞKn=LL\ƓZKekG>hX2?ã ~^2T X'8Gm\*A+#mQ q~145+j0R ^-3:]*n)upg .| ᳹𘓗 1>T&d8@#)*ʫ,} .x g'YdΏ48䅂Ed6<^{N:YS5yQcT@FerC,W5e:T1kp@` 1"xp1^12Ǝs}b@yDTr~zULBv _K2 DVkWDqz pv6m+>{2WLT ϳy.45ĻC;^1S+㓢|8>N~Ր"* !$27-+-97xF2i񫽎VZ̴.N̷sr(gnp%T¸2[E6-E }Rь׬KFf)=6<''c $tҮE0 l撨yN\~XǾ_e6A46G_АMy%BG2uRF%}A?jeIQSמ5 uTt`j oyfsܜAk׊sS6BFByF>Pdg/[}L#&6e'*vP7 LVwWG|X)]H;Ma.V8뇣oӇ*-+'ͶNbʫ`#˪+h-xhVাۛVsJXn>}z LB2h;E+(s%ˌ6K6K4KwջfC,hZ?i޿R{?k 7u#Fͯk͂`y[kk>;[K< ?{!}!}!! ,aqC/us*V@HD%~$*~Zek𧫜Zz&MT{X7 endstream endobj 412 0 obj <>stream h41 E@H E,m5*lU(bJzk$g{oYQi_z4'Z9ul~˜;nnm 7z =|m3ʯ[*R}R//# endstream endobj 413 0 obj <> endobj 414 0 obj <>stream h[bmD 9I E`~8NwUp'Zc!/v8FIÙorvv+2mVg3 '(M_V(joW,;dq<ӌgp.V,; Rg2#‚DQeHlV+5rb#gV3&wF0JH˜sQ8+B)(D΄Z(Fot,pQ`ExYpT"2 :+HUUM-1ukO8^jVfb8fXxFퟶhSfv#Ti'zq9/w ?7w[-ٕDW-ԑoAZJ,1Ybڝ`DpXK-CqƲLqO,C)GZDb2K%>[&c?2սbYr~_ҭc撻or>4RSB)]wR7eaťr3VEF2,CI)m5@eZ͍G(- יe 1!KFlOz5܈&(X~Zؕ@$vD&`er x-'7 lc ׌2=ǞI* ۤ-]-eJP;fc.bK=+^[ $\(٘;#0wZX1:ͽe~#X{HĮ\\ !hN&IUhpt8^AnX˴q5VSK0SV2A-VU"A[&#.v_*eNȋ 9Ң#޲|o7I=uPFl\I:aR+YCC:Eۥ&o K]vX rJ_%2 U1uYbB݇3Nmus^"M=s#G1h x6 kÜN2tn!zēPY&PXE`pM ]Ё*Su,ȶjlm?c;jk\.6&FX]٬nhs7{yNJJ2_bDlϘBY$]ʰ~rg,U"1#)+$ ;1M@0Uh%9@n_aC~AN΋P#J5oxiFahff`k %Aˠc:<:{H%4,4xP}zt=C6ӣc*lqѪ[۔:@:>0߰ ^w:xgf͕ǜ,]UiU+ʑTt_%%7*1 gdU1VϊEw\SITnb#˜:y _*Hss]03 |slp;B/TXܐԿ4|] Tu\Oul~}zWKg6Ģ@9Ԝ*P8pw9Ww|Ώ)3L o] Ӎ4a"++g^}:^y=^c瓱Iiu?-]J}of_O #TtiuY - LlUꂳ\:ow7RTwuipݽó}q[csknA hvOwO究MDyYcVb%MٳFDkE ý_7˾6mQ*DFEʮG۱+gc8L [ q9Z SmUoJA*[wcXc Zc m+9[/Hǩű(Dw/zUX(tT׋gly $v6w7vBX:q:fA&[ʧ>eHz{&2 F_U_|:sc6CT݁7vvQ?F OU?J;C g endstream endobj 415 0 obj <>stream h> endobj 417 0 obj <>stream h[[o~eQ~1M-IYE2T3jW[' +sΙ3_,{Z|^ZEƲ݂QlFoP{ϧT\^|^{]7glb?ekBEs^}}ADQeHlvkHG,Ϭ$NgLGeJH˜sQ8 B)hD΄^hJ7|}8\9M"S_=pT]Ce fp8EA,Zʃ*Zb,k]VR7`pm-h8vDfrBESU(~On>NJ3:It5Dfq>rz3c>%"~zNzu,eZ+Ųt7W_ k(O+y]K+La ^I?P߈ Xq89Dj,Έ#u?b$,/Ӏ0/`pL94aIEmA>ۍ E&9`N54S 44SS.hv$Zl a:+'=-Ѳp<a+뻛ޞp`3(P4?^!K\҇8ueK~Kƃ=UNo vJ+t[eilC>_C|HJ8_=oO͠ 솪afiF[Nivf~ ˋ1KIb5jkårSve{lNm'ɚ,n,0!] &xwssv ~395ZJYפC q K,o TL nv$k /Dڑd^ 8[)idGWo ;.LjU&kiw#Z31?NmIj1_~{޵3MѺ9 EXg\J4yFPQAE۞UE'Qp>sPy"o,Z*f%#*'!n*.v6{!(vs|(:dy) ‘oy4}؟uba#Ɩf kkUW&ژZ .W%@D;x1&;Р*\cdgrPpcR1\ہbzyn;l}qiJ2y#ݕR]{˙o74מ(lhг֪EoP/뎺Js; *Çv9T(Lia2K0s"B_ vD[@o5#ijAGv!a?H9a+_ͯm*>stream h> endobj 420 0 obj <>stream hZKWHVc0I`d`2ͱK^Qf}AR|hH$L]]U]U]G}Z/ެ"c~(q6'|PF|Y|R*n׿.^`6L3ˡ\*ۅׄs ޼tVT$* #YUkHG,Ϭ$NgLa128qR&Q Q& sz+U"o';+XMl[YEF,Zʃ[45Xgwf^x}Γ1ҥ-lMc<;}>>lw:%r#=Z`Po=љc`dؾy&Z$g~mӎw(ƥn0R“߮aA_Gؑk0'' K.!Y/RMH{i^RI"q1D4(?(M[7:mVmWJ2DweعK$) DI(yx7@z@qv'#{+јڜ7ZPbr+0,,MӨxr\A:|ɢu"TclRK5GP7lj_l79? )&%$ڟp%T^,51y b#+]尾 ƧT?l/>{۴[0mR0H.G'pv%#Ԝ;nȱs.O7igrkeGb&˂n-r 宁8|w(yq$=POuيAw#?#OKmWA4%iP)!qJ>)y1'Z8F@v}#e0+1XL3 aY5e'TNHm@~Vuĺo6 ScaӝE-lBS!?JW9||n.a ;mY=QMJJ\%wk/Ȝ{@x!nR3tDDoickGM/ /.=""1$)w1up>RjzF/V_3H8 AJ0ԋw -UqNl~=D8j&1OO[}CRͯ˿>lnMΧ5EPlwPrz%w p;s.[z3Vp<0=YS*UϭpӮ8nK*d4#oC R=I>T!fW_yx\ ݡ $)ǨKY[ˬV…$%ǒVl^;_UKpѻ :oajPgN773𐸾B?@cص yrPBH0R峲/~:.+ l\fm؜p@k/N~mC#y1(03h/ᓪ h' ΐtfX@<YG7K?p6SaDOpypr)gsܸjܸj/ OP-Wx~[0 E$9$y[uU 0!Sk< 5+1r<_φP`}IAҼ 4BL3vaLiXyM,BOk,@l(Hr^E]p`+0ڸ&LHPr,rz6 N75.U G&.|r4MT%. sSB Ffn1c{pHw)Ro-+7=k^0&BSTt[DV64c:b ᜋt//K4uz IH:ɚN&{r->y*r w0)3Їqa[l&ONh]c, k揽Sj!SV?:Uac)ӡ(+W8 r?z49y<=E#/Y~cHp~pY۽C%Ȫ{$]몫]oIPnlV#aC?pc6C$tFqv@n@`ڝ]r endstream endobj 421 0 obj <>stream h41 E@ `"CU%J=5l5$LO9x\Dڨ%\L+s) :Y* S]4K/Jxdco<3׳1KY|;1 endstream endobj 422 0 obj <> endobj 423 0 obj <>stream hZێ}УdX\/<1 F;"==u=N_J$uF٬c葶IX~O,x^ez^%ل?f61R)xX#|[TܬY}^gŒ]x˩X&T[7gl &$* #y{X)Q#<80A_#/WBƜKI4^JD#R&lU& c&AhOe|=?)ߚ$2sX*QUx fhC;t$V0aMJ7QGN1J_K-oQ?6 g1XpDNp sA~<:qdNJ(8C_L(fˉ2bfnn/M|Ը` y3G7(7 +30>NJxTZJ@O?^q0r 6b#F %B~Q~YfúqȎӅQeA*Yu| B]*TS!Џl^W!r| k'4Wt t' rs|Vg Jp$b`)Bg#)IJQ24OPRiLI G4=BJVR 85H_igӒ<}@(ə\*^e:JBw?u'ޕ;Jt"g%۞uDE >.ːL7eڲAs t(IG8e.̔~e=472{H[b6yD%>Xvϴ@6'&-'ĦH7!g͆BBr=?hi{ld.a 4,l^;ҏ=jtq#S/:&UpI\ѓhBq^@Jj ~ׇ. dG!N6*E$dd8xPd "7On&o㫅]pMУHg gFuڿ(P, pn2 qcN>i`;qA`˰f|n2cXwj y89r(F3֧a,K[UL>m3P!YocAĔE"iw[3L٨.^_/p 鉘כככ?r-1˜f6i3V߮yv=l endstream endobj 424 0 obj <>stream h4;0 D$b"4˧E$t G2ݛy1FSK?=p@,ΩFL`ӈӟ O RE#\30Re~7~>#jGM_ ,b endstream endobj 425 0 obj <> endobj 426 0 obj <>stream h[Yo9~ׯbxa`6"Xd'=,ڒGRU$dw[8{AH*c_^aٳRd,[%fOVj3#Qw3r}]PJً6|o4?_~mׄ <{~AaAf$c6;35jb#gV3&7?EeJH˜sQ83B)hD΄hBr-p 4Le|>ܩ0Ep@SqmuVj & SG *bx$25\l噟Pj Iux{AqJL0?^ '² r;C֫T rE,ڎrZX9o@W$Gn@=LLWZof@vNGyx4O*C*xD8kƥָȆ? 66Ӕlllۀ6 F]@tو.jn(u 3x1ͥǜ\,yi"ʛbEQ:,i²*+Cjxw3oUpq%ϗѫ& ~& up+δckx44K@TY!G 5!'YTB㪊? ;ND#] Ukn;&(QfvՂs5+8 P۠Dz8dc*l)/ [Z25r[h!xUwwӺЕP^,veuxwm9PYiN(I +ּ|aN7*z-=U|m+Ud>$ 8 ً+Y$D j.7A0.i+q/kdF/x.+XjgT Sk LlQ0*|؋tqD8ZJ;"0z_b8/o3/Eiq/TqcOߟGq\[RQ\*"k¦^hctb, |'ͱԂ%m |'뻙LǛV*=,'_u&+qc|Ӓ%F-K>EZ,.n6|[\wvH4Ⱦv(z2yO:RlHW;6qe丰bQ(H 1%g1~LV,uO`G PmcЖ#i0=akPh: \ةb\?Ԙjwk>Hwǘlp J n+"`j߬~NL~<zWǢ/jy$Sܮ "(z=j% >7xjwAӣ'|rTC?_UJ`,t.sITqW`{>_ev ̳c H+Gח:&S8sMӆ+|xWs-˼ Z8哜NP*$B~m׼I.ނOX18X]凳 IO?U`&{Stnna[xBU*s;*E Wu=ˡ޶ؼhJov`)q~ez<A"Q=H"II<Ukȿ5(8^u`T"A6+6lX'&$TEw%`Qrrzmq:~|Or5D'^ò|FPOT"mh4@" GyuaX$ nwT+=B>mrF!+W], 3ȅ;EnaKdb8KAB;LBHGj2Aػ9'ͻfE wgF-kp-uM9CO_nW9dʱ6j Gys8jtI7xjs\onn}p]Lѱ;`7ϻB覹Șܯ?ld:q#la?".,=%S.O>KL5S΢d,PV L,CvѓRg}`'oHWpjX y⚄ϻYNI֫\myqYY$DCC-%UH~IoS@tE\]'9˺]VR_SCPy.bZ!n^:vW dt 0/qy_h7*hr0rm#a˾ZatOV_qG%TZ?͛.T K,m~|"hvr̓ [PlopQ˟yʪI=cYq9>G(w$Ǝ_lw;6Qi\Z plǁ0ߐ%Z'-m endstream endobj 427 0 obj <>stream h40 E'Vd: jבv=ײs4O=ҾnĞ3F8iNR3s2l1S9nnm : 0\f_QT襖r9_/ endstream endobj 428 0 obj <> endobj 429 0 obj <>stream h[Y~篘a>V yHdyXa˕h9 9>4 0֤Y5U5U}~O${\yx^d ?Lqpgomcެ?.ޮ^lLv?d{3¬+230 ,4|(NΎBPi-Q M3͑aHOqD1nc­9x [VQ]]~kM kj#JĆ l·/cPDP37} )mb:aqS<<]A=iZM ׀NMTD UQBuJ!C0])jML{6yvlƧ~\b~cZc$5O7;}}(QqFm ބHcː2Jջjl|,xj\&s=B˾V>-W)(y.s9 j5i-hɷu˹nCy>C )ƅ 6j~$H̼U3QUmdS P]8}!SP:]cqd&FP@ 7GpcR|CQPiVb%A)ɖ'JkBUݷjE go?{do$1P0ZRA#U JQZ`EMejBD(a[ٞ G+Юa+³!tʘ`(# /`N#בsl;nRC #-GAn--y+ĥINF n`\%7ahO¶R$Oo߄9!ߍO[[O-|\?V߭S6Q KUt훴lz.T)BxN"vr{ EZ .w 2 )J֎ )!y+0^QJaig n m0%wTك Wd*y^}˽m]e+H!xOd]E'/zE[QLQuuGfP0!F^*l+v3,벐*;p3VbC_p^BG>@w߹ʚ Yt6 iA]ΤI#eRwE!%l ++(6![ A=*aJi9 + a[5"m ϥ#(` GV0#OΌ$?[jJׂ~~]{ C C1p}ӥoUǡQbJ>9n9mH/R}3|J bTjL,ocz/1}Wy%0}%WCͽrEl|U0b 7dT<ԟvb{b5ò"a=e̒W_Q(4AcElnH1+1gnO1{9ŷkzízDԺAnDXVE kx*1PS9ܩQ!sV0?'9M rr| GQh5eؖfotzTH;pr6)VQVH+]d_Q c(JVܞk2BE8X@0f {EQى 9r_€VbiX9cٌQ@ڱ:1Nx͈K>usCK eh7q+9/:z u"Mj/)ѐpc0gͦ<4db%3'6y8Ӈ ȍ8/;ay{Tbm'MyM(h0#Ak#BG! ˀ%Kf6m1Iq5[O2oπ<6O.N4Uox=K_b}0Q+@ : '<} endstream endobj 430 0 obj <>stream h4A E27AH 5ta ; !{1Q<'_܏Tgz/^7́v*e);^,kƪ&%8]EPgڵeno3֏+!&$b_1 endstream endobj 431 0 obj <> endobj 432 0 obj <>stream hZKWHVc0@u9l rrh83H^wV&)OIv!SbWWU+_biz-g oVj#Qo d{J!QTYɘMNBq剕 pA~9,0\b'NP$*2ɖ >j҄3`b>s$7B7Νl&6K~Zz3:+a7b..4UIBWثkʓrBE%\V'2h #)%\yhWFokN-SArXN5vR3M"qDVޡ+*E[&Rpdvc`?{^yN}rpeխ58ƅ/ Ȏ_"*Ru1tOzWoh5Z٬ul yD,-Qe } ^d)/+"^.Mt 9?-a#|tԭD ܴ 9x";dJ$PSse (cs?VTQk$Jw*QSW(mMd*4KK+Sr%P֗t|z(^)']$ܸpUECcO䛴a,CAxreNG6c@re <T*}8cVbeL?gǢo;k,KV}qQs 4nA" Jzc:]yy̎[^Ӈ*8C.YRi!AkNwrن@念pK?+X\A;DYi&IhbUL /lGtZ:lV25Ydi Sgsfd7h[e&+ۙnr)JK(ji K??%qEMG_P}>ןF2-VpcYsQmR2Ie1pLAK8Q4 $Al[uhA=Dϭ _ՠƑ6$'ㄩQ0vcb~cKHmƖΡWcl9b뀱=Gc82`bYX j>⭀x {@]2oF6FmzS{hR]jW`H5yT'a02P ]bΆSybK UѶܦz~UExNvA~u[! jk<4gTE+zGc8|P)h#&;aL|^ʢ o?P]gKxC@iRR{dG* +$cc~<Xt85<  lEBS3eπ}}Lu UX9{{bfXٸ8xNefst_yk_`⳴=W# ~Le7?B1yu|5{5N9R/gSW0ۈ<]Q )|>/~t-(\0dP}t״YIJT9^5~~gSŒ4evքѧ `y٧1jDzX`("~n M9d9^qir %sl9_]8D'/Y %Ff+תJb߁6Gt+3PuY5#"-'=_mFHZzy4m({ |.H0kYg&ɸtc?Hw_}@k=aĤ%<Ð'7%G1Gځ /X1t9d&Ώ:dæ 4ҽeo] /6لTd `Xʉ>MY>h&^__)$:w .ᕑdQY]x;D3>^Oz5adJKdXۨ.6.׹ dǦ3ߧl <-{"usb/sJYkPzʋ擲X{Ye:(.WSaܳ8aOi~{&@?eլt ӔYm-ebCږY [4Sou$>zYv(޴@szbB~|8> endobj 435 0 obj <>stream hZIoWq^7C0 rJ^ @#TSݳ/ dtuUw}~]}nU&Jp]sqYLox?=zO_Wڮ1mR3$|dk ł.O+- Ib3'3̛L(ioI~_+`BxY-R^1FIaR(k* rm RN|?H&d2d*}܍9%EAa5>`fVfpT&ueUfa&EcJO dx$ei4+-^q*EymZxfQCrA(57.(er~c _EcQ+<B GZtЊYעk%4JAR$mP$/pRa mAV+M35b!MT Q4~9x(=^P eua.n{wxSJbDŽ|eɗLU(PP!*rkؠ=#ɴl&I7iZ(gDxw陋}D eY*AUz gEetJ=%tWMӘnFW'J-/%Sb\Wg|XkrOTSW\ c>O,XY%=Qn҈$uUu*YWaVq@-a jGҍIzH*cj|IˡG'#=J! Ns3K``oRVvX)njR\/oc , "Ѣew+XTyMW# r ɿ4fn <3;v,^E1Jk̐‡Zo,3y:b&qp\ki4 p6p NtQLӾJ wd1)4ooSxt\fwc]‰h6OZ\z1^fiQdU9&/ŮJY̬^Cp^8 jcY":vaw,9cnڡ4 ^A{-n~ x,Ǵ%^Do UzAbJ3XAdܑ΁ͧjbMHBQHaªWUBϖ8t#x{~X /t0B:RtƜh?GYi;Ѯ1Tm+ 3a UTJWє*l[*.U o ),Ky>_f8.K.B+%"Ĝڽy4lVcWWc3Xfv|Q[yC/ s vԈo #]ׅ^*x3*l A\8<&[/<O(fI1'֕TGJEni$ 37``T1pi@^5=a9DEF1>QbF3 *1PPX5@~NI8--r6>9?Z~DzL&1-w=8/(˜#0 ""Ri6A -^hbmza\,%=z@] <ѿ Zef3;-C¼mlS >t8Tqf,B+(ԷL2dk?&NIbsX$ͽcscqMW?SPw]W2ȦQ9PWf&P 5~NkRgSR@Kq&v8]L4#NEU'UjAhWQݜx뱚KE%"5:W'Cs]1 }A$ w(UHKIgx 4;j1 endstream endobj 436 0 obj <>stream h410 E$ ei5٪eD=p|l-[ہaP-G-X+54GZ96lz1S)5:] Xg$ ַZ^3 #(l1[-I|'K/" endstream endobj 437 0 obj <> endobj 438 0 obj <>stream h[6B"f~zi{!Hsw[܇>xm=ۤo(R%JI!Kq83Ǐ3'ޖ,an#3 '-֙ gou_\aϋnYlߕ$4[b񯯲3¬=_?+e)30,'DgTZN7HLsddFvϿ`bLE[@˜p+DN8[Vܛo}>ZM,,"5awX#D QDSTMjoBVoKPGTaaeU }/CsFs +Q>m"LFu{:),Hx8lùM#@SYiz+Mdy#"u>vъصiQ$ӳkP~W,W7kۜ6x_PvBS(Zݯ]q%d N_or ~))3֛w] rކzv|]d~(]RYa:bJSZq(&[m ~z^oݠ܆j#4.f/:zv{>OvyB}PnΩ8@,^rp׍$L:|zt14615Vg 9чn:oߊ7]a).)r|GQ :/>Tـ0?A& I):j")%B'?,ƅ˸m'7]dg@SI\ҍ,659eהtюP?ޔIfx@(}^w'gpdCt(= y&92j4gs9#DPsu818zS6ͪY,aF8~WLqL Fn$Ȁi-|@zb%l$ g"X+IT48ËoIL9@ s3kA`.-jW F7Uw4.2}7/K<?Vf+cttϳ'FlGbkX) R'Օ5T'`i-u& >g ^Aaum!Feyt1SU#ѩweH5~94Z,ͼaXVv }OdD}]hymW5\դ7nW'O]ӓylnULpm$akFpd"RA܌L$THK{lԟ?߲C5mnr,D ߕ{Nsoq6 ,7&F|5f~ 7^Le%[CcNU{#xG#=D3Ô(M G2p! Z'HN)Mڂ)F!iW7κ#CY2d# t}:^!z@6`x-@6nʋ&|N3z>@ԼX||XѣqtrǓN)}[[mPlȥpd:Ϸw۞Bd<t49U\km3ͳ>} 8QcT>â0X" NuXtgùp~SOAJ}h#o1ص;EsA0JT%+qdoavҵjF >Tm]ͧ z }>nԦB]l (5-MqW!0lB9Z4v::٦mc}IOleMzq{.^‡bg3Zý[]®vbW>Md:j̗{KH-kߨW*VEg5E15!tvG۩Jˇ+e>TD5DƕI5D&0BqlH+dT5D@!<PP)mX?ȘgrV">s{@TS sM=*g9w.seGқ*S= >3L>CAAT=v5j| -<-҈HWG\WS&=ύj0w[;vf zӆ^WɩDDTA1gLt>ǴfcʀiދE^,:6)0~FY Gb 7r Sbe*J~eJaj[SxT628](:?5K4:+QlTw!? ߴus5$W#uT~Of7x|蛨77Ӣз%7 :VZ@wGPGvXf FzQ@@|:&eK}m{:oH>kŸkݦXq>stream h^|A87R(o'. 7leIeo1VD ! be.ze.'>c 04 endstream endobj 440 0 obj <> endobj 441 0 obj <>stream h[YF~ׯ#eXC x7by[FI v}/^MRJSUUUۯdfV+lu?#aa).Fo%Ƙݬ~Y;#6+C3Ih_^d{gYW_e9faX ,4<'Dg~&(nȌ0$ٿ[~8"ĘL 31Vp>V `-$ocܫXj4g$C@X'd@ @f#̽^TD^NI 5@p0x({iй`H]0x aa~ikvP b J^La)='!\z,;O5LX}|})<~cƀ߹HTHjU'oȲkW8AxvN{ᵠD PJcx@WtV^,#(q.Qɴ-o@cBp詥EG %B#-k ɰQ%0mPT&`t;2Q z0MJ{'tD~j*fUz6ͷ2=l:p# L]0W~9qn?\WLwz{xyJ|pR'=T\ PXqQO-pzqFbpL~P49$)|wmVǤ<ԥpVI2M"^mn ΀L޹iMϟ*|p1}aUwhpe7sS#Ei=ڈcנȆ}41}F` Ė!}oOT<_bsrǥ/\wX>4B_7X{Щ NfXfF>POvlvda;$wu Rw~S FpK9*/#C{,Nsyyi[^?eQ ^\}J_7mb >q;hFڱw Z[(%itY=QZVH?DP?9pڇ~Dr?,_<´Jۑy?0$ HL!EX!p3nloa|7PzPxr-ޣreX$0%5iia@5XÀ ~^)HO1`W|4ܾo~]9U'2u ,mqDagAoq>nXj rޏin$K:ߞaFGv=nPImgְfdR9laEAhD1ΧDoѼ ؿןD[,cowSÌO̠#f!K,նr|]E\~t`1bv'<MV]; j% 5GQqp +i_}λC%:IAZw2NaU( )>ZBUtzyؠױfX2&Fo}`t

xh?+.?s< *F=@4)w ^vw ލ {Kj 2DJ1q6AQN,>.SMqe>U:$l_;a8 z,R^?L%*=q*'.f(T~7^PЏ%:PMlCr;;~,DxdbylP*TJNmoe-wUG>e]nE?xgq`) Ѐaהr(#//޵*2_<ʷ>]"ObE0H>K,O}@qF(BwUv  y#P'N{[x"H~`w endstream endobj 442 0 obj <>stream h40 _og e5٪eHE=8`a̘uKEDyxRPILygcdmYEj FB 2Zo0[H6c21`#,h endstream endobj 443 0 obj <> endobj 444 0 obj <>stream hZYoG~篘"l}=G&<y@Z /  w R|;@ ;-9 )ݒ Fo(p\A0;|A0?ʍĸVsŐ=kU躛QeeajOƏqxX0o"hdo. SLʏ<׈‘I&LFb :IE"v7$nG|$q2n2|Hm-'٭hU\lU )MAC68=jp< Qހ'JO^\c/Mgn*=SfLF͉)JP/2!Ɉ/X?[ O}H( $裶"1J!Jjd{` ˷ĕurmv;@X<*wO h`rʤNXuOLȊjXYl.2KXdOچٮ. Ƨ*~~8]=龍B!|zlIQ3Cua\n*tk9Jp2⎎x_$Vgm0x_}i6աt\?o}}mt>ݵUQ@mጪ>˕TK#Z> ?l+ZX-W)ؘQLJCHH\;N:ƕ+BS"$QI:uРB!SM,!S;_NǸ:m<6]?JMle+Xw9SdƻyR֊:[3~$pwMʿow@5WsL}|.Tw)%&UTZtN*3A{~s5KJyfVu:{R>3,@wY w 4Lv-߃S[҂z' ]E?^!lPb6]t JY4էܜlkj_K*{ֈsg;,WGEtmr'ÉBfZwy&u&b#"_gDhja@P:p=ֵ9ȭ &o}-.0lH7c잏vs8Vx7*d#5"vkGcZ01mÀ^N sځFo8 vf|K Ȯ9 ol:'D>Ls 6NKV>ק z9kݤi xpFYoՈvgIcdu"}_nw|wCڐnr">[-m?Vl4ܞkRUjY af I mFegMfpD=1=T RwVn7Ǜ.`6 b8^㐲SB66Oi7Oi.@Wwx}9gv3)6K_@w<-}7[MuⶂCTםB{f_Yg׌^96/F/ƙ̞Jߘyu!Nf.[&_Mbyߤ`8N Q>B|)gP~O"1e Ax/B~aل~J?}ssEo(bpwb>4AHH endstream endobj 445 0 obj <>stream h4;07RHCQaynjc4MR^刟mU{{veZؠ Z)5XG[WHkNC{0+3oGƃY߯GcYIg?,i endstream endobj 446 0 obj <> endobj 447 0 obj <>stream h[o8Bf~AbC7p( VZw9Go(R"i(Ùpf~I׳W,!`dt{:Q\ !1RDKHv%aA %~!]JTRaG5T:Ǫyo=ˑnFYvUC;!tpWKJ~KvO0`Q 32"G\0Ѹ`r$& q#-CуXHx%N+*U*[ ` /=L|1!Y4|K|Z|謹sDbm3;l{()])pXIKƒv|YN Y&(u^LZF**u/b(ge[Byx7ze;B#-[>x$ ' t2,~hdI!SqY2ո[ݸz}>:k\Yk]AܓV$Hާ6+"#\uCpvl *oYtC6d6"Ncmisg<8\%@t_|puC"~OS&a9/BQdBSD|*A"ELHw' RK}Ϸ׉_t0FQ퉀z,d8g=\.y.cb1c•֟7DŽc,¦5!{XgsHjwҽ+tF)rySܣPSJӌC(nl]Cׁ)H t[2+򫤒s^ܾ\oM(Pq3E$B2%8{6lԺh/ka_}wW`:bli$)S|ڨ46P+YTC%'^GinۣP)RBB̉(l B͈@1"x,)C*sbG, '#Rr .B4M [)HuحQl၅܈ ) =Cͱ 3 f ?0<9(a6Y mVJ;4-Ui]bO@|ȁZn GxAUHJK3KhG|bl!S:Mw׎o7? B˞Vw2CZoo~ 7|nwsljYӟ]i:(!\?aM\= Pʦy X!\H(I&Zj` ۭ&q|$18U/{Dt; ;j o&Cv S =k(M@BɪNl`^NȮgY&:״w:c#vԶys1+Q!x;z:+Q~8\j4#U5I{>LG+褛ڿdYiu9wZ7ZW..l}/ ͵nJN眍]w%)xGHGJRv#+Yvl@9@ ?y@ Emo1X1j>)_@Mjn~Ҏ_簩 q`D8Tg77j`n7Q@39PeVm',2p:9HHNr\DX+$gS4ٝ*w6x=j[ Ot <*2K&eU[/e#;6J;v* [=;>7:ȈV#H~ @qO}߼ INU~<6tB'b>QrYGq 8Cõ{(#L>KD2pPcE]/n:@Az ) mUbڂ}]G zH<ބR&@ YO ӴI]rJ/JPҷ!4*vEj2u~}.5GmuF#&a}k&J&Mۊ`5HD*cٴ7WV(T2g4t g[u"l  cDo7}/>oc1Mx1pIըz/sh| 􉏉Y&=#C5{̗i͈"Qv☩ޱg@j1+=b0W`F_v]DB~t.u9bExU9{Imэm<ģR|n[Uدm >~nO,fXCaER'C` endstream endobj 448 0 obj <>stream h4 _oM֨U*Q!_#;,h&u+rcs#gqiZq1R%SxuU MСH "ᑹ]Xvgz=fz>/z`s1 endstream endobj 449 0 obj <> endobj 450 0 obj <>stream h[Y~篘ǡ!>v @iAwŕ) E>98ʰ!Y5Uu~}OpZ|^^E݂QlA_xg0R)xo-(zq V 8^hƋ9n؇ m ^夋SAEt_(Q#8]0A[3/WBƜ+IT^JD%J&GVZi{˷~ߞAJVg` z ^0I QM9y7)Ze2I5qEm%\90V)LyR%kU~1VDN W ۲dߌdF+"`fHziiGO Oۀx֢$8 㣧\_;wG3L2Tdqp&-Tۢ+l0.DAC?ѝF9 Z,Ѹ׋ ^w:23݂uBp^{]QL2e?{L്iL77õxucԯd`w$\g5>!j(M`;H"U!A\4Ȁ aW}(&ՒRn^w`/No!FHUFrHU,cKӼ\ue!ي1$WJDr:*cVlVtYc?ҫntD#CՄCqИ2`?lqodWeXQnڻQ訣Љ۟61^_HC&BNlT`67aHy;:̨9N͇L*NTq'Ω;r(KNnP[ޕra^el d`ˍ71a*W3B閿QBi( oYONI6ɝjxB bz;Aй[5 2KI ^%/7t#Þ|)?,vs|B»}Y6(s̱T7g[(ɞjҨX+KиYNߕڢq ?-Q7"ӬMPл8k hp|UڣeJGI3OG tI* 9&b^GՖLBCeey:gD;7EpA*jN3@*%5"[}P"bCc!zA~ZG)tw xLJ1CGK0 L0U`j T>S)JS)*IyJ=L%=STwA~ 8d{ N%(U!*Q* n#c,w-i-%p8ҽ<0*ȲQH^ e TF₤l0#!m7dJB FU~Ӆz^ ΅%~.D%YVATf1*aQ`T/WèPIyX$)BH#U3,3 @Kh(bFJ^il_D/5@L;B>L_}-. j ,"ZyhaDb00HçݦYL,,1 BDFhB&"17А&!wj|鮂pRCRK'9(, 2ka+= /@R%BJ?Oz;(Ii7# :r<(Ĵ 8A1_P¸ Syԏ R%~}M`D!18ф:K7O|e'#Ma=B 8sk>]HZt >ֿϕ#w>stream h4 0_e 'Y;mŤ+DF-|}X@C߫!mOE~[n)FBōfqciKZĀu(RkFnZc~6kj~*>_/0 endstream endobj 452 0 obj <> endobj 453 0 obj <>stream h[Ko#W8 ~kx80ǢE$:)u6Tu<=$g(Er`%Ş^]|+:^|^Nw֌̉i!sBOӋ_.h1e#Eh6~7ZsG`j4ߎrN`\iM Jh;_]H-lnȈܪw n%9֎dEN 3qW -oOr*cŚWkp50xvk5/rR暍ȉzVu`y>M$19IkAh! 6 *iՔ*#GQ$i\ Ao4d܎A&saF մαjE7H: =@1( @n(;}e T2A0~  Jo ޴]Eƅ6{㒳\@DX0 lyn9*1$ gtȉQ ; ,/S\!di׵M7F:or ~_أp-|'! cT^a0[/9_U)kK^Nh>8O *7V rq ~_VU`yf4%3WD 铖9aT#1/ZNHTR. -I0ܦ5LX.ٞP> U[onxy#2GBGλJ=9#¡M6(F CV/:`)="H'`:ט[|3I@-L.jPHZvG/a,Hvl5dn;|R~N>luiiy|( QDR$q1a itqa 9WN]/Vqw@)Vr^S BVy,kq ݢ,i0#'l-vcY;آ -%8u)+boYl-MT< ʇ"WDal[nvrI\!1biqE͢ɍN"%HnTfn|dJ,(7sMÉ*`߲X<+CÄ:+x1bUn#ʘphF:t# feb5$NA;_֛zurdC̙2wNS2{F7Џ1OF dʊ! vҌ:GmCڡnS;/:5 k~szCYo-h~"-8z8?6d6)[:o1(E~a(&o6 Md0~{O8͈Lo A2ft<{%u@-٬P=h: 9Dœx}[<GqFr_:ɉΥ*RuUi/l(2''tיkMS,5o![c&Q|PIXԈjǚfԮX#\/cr?%/R~6$Z`&!xKnUSj9RW^Y.{#?dhG_͑SL+O9FhrSd_ YE,Y:"M_TAlp:b2NZѨwCot endstream endobj 454 0 obj <>stream h410 E$ eilUUM8~l5h(r߶*Ď55^4Gڨ&sl8%ʗxRSW/U XgD[[pnj|w<3ʯ({RsR)_// endstream endobj 455 0 obj <> endobj 456 0 obj <>stream h[Yo~ׯ0}!]l 'Vyhj$qW*$e>U=W zz^#].~xuutqu{AIj͂Ȕ2dq?W !_^v?/bk 쳋a?G`ջZlx`*4fq)D 0"jAy*ۋzERkZ L"% DB]8ýW?)&O6x >wY)9,*Q)ĩBs9nw!)Rf)| M}_<׺Os;i%Y[ﳶ$rgIB%Aa=dZ\5 q0b)'=ji),\ힲ^[.Nx_Cݔfu[6۬P`L9#aΓTu_oJ&ْ$7_ܐSF%Erܵ5LU>[Hn#Ҍ\'Oc?:i4MKxdB!֋Ya&EOurM)tl-S1"e[,;Bmyp6,з1;E6Y-?By5 gIf`+0O 䑡3I9YR( X|\<=I=7IȮ r6]~tS K *pJv/ >확Qy1PH>j$ inpQ%x*ضQ=Ch9K~90&,Ny)2>LؔWAS>D%&(bly奘MEEE `+Y,]sYpH \/R]t.T~A!d *{s=u EqjFFŷE#X%IR0Ov0dYUWa}݃N0BP2aTj>iy*BH=Xpeq0%h*cx Ska9.9j5$Vv)Mv`jH%JD$1~Ni~.~!gvRB/;>gi?F>_+rO$S zet&V:-BJ*Zw\qw}5>@ \4MMK?oBl,`Q.V B‡ ײ:#|2LJmO ?v+Le@KsS^[x|x#$Jaq@&T>0IWk^Vx/tyGZ  h e=[.$)+wE'(Z9\j:HTjG-hUs[T eçdu4w}&# E2[S-Re kZu-.iEȰZxnY:`4ٓz'$۟M=u,ӝњkM\Ս3mm&IWW@p2UfSto7%l6x h]a-"Бcv^m{mBHmWc?Ld05 "7\V+z|X qAJ5튛!LEP19UNE7KlD1c[41M50ez|V5 $3`]ۿїcLKnfۥ퉳T [a(rHCN:m=^Bndbz"y 2 T L~%/m{%UI+#a<~C?Vp;[vp3>?,1_ZtѷS. 6spevrPГt&oY[ 91}i,Be\yt33+j<<d4N,vIK I=cҞ3&Nt8w's;OWZ[ٴ;/@*ԒfP d]r?p_iNJgiLu CtWfdԟJ( k MBԄB[@14ثT抺eɄ8]r!W_\\]ƫXZ&[P S1aҠ`خ7cBm].B wVUM<@MZӋ 2HKtⒽMX}W9OxqNԧaӣCwՊ/hG<7}\DzRyE6iUw6猪Th-( j71k۸ HIś ~LCL1ɘDqj1 &۸џ ۆ6A?V^ 8(U2 9 =d#NOm2Of8o GI(LX$ۛ,w0| t1l~[O }M?-OXj5'|ӹ eno :~MIXv6K3_l;= V7Z;Ay]TA1l8_:^䚀>stream h4; 7g Y4I tQ ˢlgy $LO9x\Dڨ%*.c+s))^k .-zx`co<3׳1KY|;1 endstream endobj 458 0 obj <> endobj 459 0 obj <>stream h[r}Wq2sXJhK)Q,@a .E `ק]쐴*JX* gLO̙oxg\}{uEgxvuwQ ?Md<gh~g!zq}g]j2>?fv 4|{Yٲ S0Vb9DM$ө"3R-f;ן)K1z&9I53g)B#7V-@4^}LLޮvzɋ3U+F,US ZHR)hSIf9eҫJdf;q$R)aAI$Jpg+) o*I3mM2oiT#oIYFSF9G e޶ۀDүHˌJ1Qq7!i$VlqJj甤! }] Zf5,4յGၹR]sCbPJJsO  ?3l\,ϸ > ]OO^m!$Œ*TPrmI8%iʺZ-Ca /lxկ]&ϢJDX<; 3MWqVM:zt+'i,,ylM~PiDaW4X*an1UZ E'e@@E'@^mb/WsS'wNVm>U_cߪT_0Xs׳_4op’|X~u`uC`Hk_WU,lo_HV$J/@ ~P#,nֿuEI*cz}%RFv*`(nD,K=ΫI'ꛧdl i#;XٱRh㟲 `E{w*B7sQ0z]'fS!rdkm8P0gZka>OOߍ|p)9UTcf L )Œ(̤(>&n(GPcߕhlr!S k=:Ո%̴,%roCnAiHC~ū>0"ӯ6Azx+/D9!,%Bimmt{YZ|[`W˱V%4CcvCtضO'|>(;ssv R`%%X狥*5;砦M6u*D JPI$#J%-C6mNR W/laH=3ӭ⛮TD0p]#I) /R<VƧ4P6V;gdw] c-10r(/+츰zeSq6] e^E%:Rs8B/?n!"ߓ8Wt9q6Q21ρEU€4IoB|л4s'CG2LZyj X l3iN40_%І/od|ʗ>rBXi˵ ʤK~|D* @)Ɠ5Zur%mwB,f~]t{k]P"u8;[O_.*K3ShbL5zߦACr{jo3R\fXс: 9A=&{e4Ƅ96f,?wif>qHMIr95jhrhϘ 3:1"B( yJ hv4IצZJIJGBb2LR}0{0pX*Inopdjଷ_.r&4 9n RQ-I?')y?$'W2y$qP} (a5r^Ճ#`sqSGq;_l,0i &Nd=CS wϋxq)EMϻNT#ac0X0\z!ݶRODQ 웹aVz%˲$$O@z3,4N|ojtKO+az. r."|@-xC}j;~urݘaPN3+2aNaAXd)T /S[uz8-4N~\rԅ ⑏SMA {? %:ؖ"`gQ)xmUlԫPs8 NB{]㎑ls@&7%f. tPOlU$;B|A )a5団k8@M TCܛB(Bio@&N_ ^ sɖF\#!VEw{1_IBQ<'6ǧaF(y+I=aYyȡ:ttMuhT,ز\A߹⿡u@Abz:nMҘ6kRsM0CpF|yo's>4yMɍ+8;Oqh XƠq wLBkUF[AT) !H!/7B+n4q0 纙KQ|j0S,Rpv9$>*?wj ޚҹݓ*V_@ GA4\ p8Gm y4p%fJ]yM;qye mHM;.PeWz$D-ʕ+"Mɪ>)~<&u,}币%my0 "..:u2lo3|=1q*QjcSY1?|kM!?N=e?1}>stream h410 E$@aE$P ב,[4Ր?~"_ {zhS)sR|1Vv,FuH͡nQ7r#$2N*,e endstream endobj 461 0 obj <> endobj 462 0 obj <>stream h[oFBC# z0}pXWYIT%)kZ!P$sÙ,g ۞쫫+1a3F /#Qgt>Ws+J8ٷWg=c' lm #0VO HUdNՙ91'V'L+! cMI>#2B$L)R̀^}EL^/bm^ĊWg`b-x.= T JϬgVOI pY20I5 #)$|s\l X%0\%dPxchX2XEVd4d ޫAyq9V P,FiB`g-.b@ \r(>), W7`* x(qCƥؽq%8 H@" GUCXLl0f +_~گW/mC 'ҾD=^=ƚůXYĘ` F21Y#KY\]]EF(_,! i@8X0^!o@c!iѽ"qU8 on0zݟL ܟ`Ct$LЕNy{0~1C@qJ<SIު8L57Nޫ~ʄ o{^95յUE\\9\~|)Ā;ijFt5G@'H v~vD [7?ۿsJ({ A g} _a ;{GXB=8diO.w|pM.bOGa~wb6OeT`YML -Xߧ>)P)x|ŪJ*hh&)w&3ܧM1+bmzAZOVg*&WY,-a|{q33y:9"X ()mMKHxE(I, pFtr{$}f`w2!Ίqtmb. n?,I~M rj@ԂI-d6Xs_*A5Xng-8 1ݠBm/I(#l5ܘcˬ)[nÏ8Ïvt貽y~hE,"J*|xbmx#cy8EC3,٨ǷQjm q\cm3  9Î0}F`S4fto__[W[;K|"o72.><].o//Z3bA\#K7Jy;(հ)h9vP+K-`x Bq0tڿ b'4A&蹭( b9=QA(,yݶh/q W)(^b̛ rcO[MƐ ,NaϜboIG.g\ Sm'd7uFOǺ̦%nn4KVmBPaŘ*qkɓBm3pE7d_pi՛b3 z V`zb&l_Fl13JO7^vte7,+¬MkUQX[c*0sņַjON:+HPpkP {-IyEܭ[ôgY:C5FϪQ"K[y&StXlO/$%ϸlujA.GUٲq`| 5ByMe F:X`ԉ1 Uy St_ rKZJ0 ~wxL.ۚR{7scbK71tZIPSԥ x̻e0}B0 X:ŠF/+ G>5l.?l[}u}`Eİ%3m~]՗M)!Y[ê-1ykzkUoh̸Qlt/ m?'Zq(C&)ޚ;{Yx#8S5wF ="Br'xػ˗8v冸gvmlg~[8g=qK.bၢm@ɿ|*!JM!'جStN/K86ih\ ):Fe۷_q7*U4<jb1YE]LZ^Y|LVJpgUl瓱>u~vk OfH! o 7ֺufGo(e(֬7.{r=p\pPY<,Ue:gƔlz\ϱM _\K97E\wd8 G`"ͨʊ1u^-)H~k{/y w5`VcBu&hNt>Z;J*H+uuQh|RSXe\h,|}9%zJ%CS婊RE {t ޒ./kzEon=hQf}T.k.wzz큻{8@!^ۺݴHS3*ܸ=YIp|Jq\y$WcXNڦiy S4y;>ꎟثTv*;n0۷?h2x]jl̑AGpX-|*z)bli|;,h B3o6b8|ba "+k4DJl% 0T|*@[o:U)q1 endstream endobj 463 0 obj <>stream h410 E$@aE$P ב,[4Ր?~"_ {zhS)sR|1Vv,댈 7(7r#$2N*,f endstream endobj 464 0 obj <> endobj 465 0 obj <>stream h[Yo#~X>g7 lM,#(j(ѡ8 8Ssϐ3aUOUuUu?n&܈)ެ&g YEx,L(o&z 7O59K'f &TW`{=]DPx!QTY01;/5rb#O$NO &n1Fq$ BOL S|Ts 7sYo,XlJ`g,u)>eP *|ߤIj I+*,Q@B`s\[J(4 sD@,dczދE'q8ֹ P+݌w] سU!'@7EW T- x8г'[[JckJp"+J@d;vܟ;MiMFWJ:ok4h#?!M8.x*YQ?ȓ\Gc;^Q xFgz· (-)w?Cn`UnꚇEp GuDbs&xN A[(y /vIB҅~O]υi 9 h\r[ `ZҜ(^;. ~?#в&@)ۥ\*NYtdxp0ǔ!w[\0h(QƢ+/,aGO<-c1ܕ/78#h AeɗqI`f"ɶuJCgh$b6`c˦NH9d;Ǜe5yvζ4=^eb 2/qy[Dl)֒סHE)yM>?l}d 嚱pKWyR\ ,Z.qT weo>%nftXɒmzА TX1FCE͐&@-ݦyj4Y.v qLy( 6H$O,K=Ų,-49.hyO۟ZB`mۇ:>\J8<-VzTbو93*\fX&Vō_z ͥE9si 4Wow}`1Lűa.,] &Ni ;N1 (M,PFS{(kC"8uRV C@bYB6l KF [ZևbR`fj}+obTQ5h.ȿ[ω4 ZS\&q9oC1P0 Faebrģ}D-3euh۷wMW,,qd\n\WLdj|@g{K52SIAAT%e߿k'cR3_(ߒGqe..5rtvB΀3bOr=у|Cd1W1'ƀ5>/uϝeYwRdѰLǾCRȰi>I aO2WiǏ5@\/xP-{|4p=hRBך+Dߠ>?1oE1p5p5nidz@\o}r40PU &굠ĝ{.N{v$v7Uv(nHY[p-9l }v-hc| zb)2#k<1lbtn#Չe$yz>ӾD_X=9s]:"qW(Ŏ=d+./OqZU6[Oou[VgJu6ol!CӴbK*:Z|~]wGYwZ<߻nN:e >YbGoͥWVaηב:_?Q_Cߠs<J Y^a)TeňmoŞ-]loa]k_Z_PCG%r kz+j|QcSf Xw' _?|n-jKijδWR7VqXٰJFC>˾4fAhZܺ_n&%1\!~Nw^gآ6Y4\V. K*/͊?䍿n%biy@=>É3CLWC'tAPEcvܷ?2qbyMckkr3 r]?A=jt܂ 1dS{::Uiz6Lo0PWoT(,v-*3["y-Ӵ2XC|?!G)"16Q@,# 0I!/GK&7~D*a#yzn$qKxڳW:|yamtR> ;h>s䲾DՑd% -T]c,zI{4tҼo϶7= 0rCt endstream endobj 466 0 obj <>stream h4;0D7؋%-E)rYGKHc }G[*rZ^́V**n4Sމ+N;]"CZ4" p|q(_ˑ襖ǤbOp/, endstream endobj 467 0 obj <> endobj 468 0 obj <>stream hZKo7WqUD o}@Ez0z ]Knߙ%ڗvM #pv!3oHWȮ׋ [[ge7wUiñ͂gWZqd~o lE/ⷯ]qy,Ao&gLri>pr%VyD&49گR13@sPDZ.|jwmp1x+bewJBƜiX5~Jͬ@1TMN4*E8*§`a.DdMߣ}a!E%rPhh2IjS^Y34Ej<Ğs SY1r9}x8brI1 Gr%H`tD' 'b$lq:Pt>A.C!c(ƿw{|/h*6sW1rj{QŸ;ȔpGXfˆԈSMh\6ࡃ+Jeo_' {$Okv53!j//CgAa" P`HF$$U0H@Jv̙F>aYAkN|#K,ɢhzOد-'<z?fg=:}SI^o##=BC KCۗ*EKqx_,snb*/Ĩ6X }Dh Pfs~x_DҮIIE^WDqR2oXwd-ĕ 5!X0׺^7; KpUVgs'CuB东asU|8q偵9H\I>§Rn WR̄Z=P9S4oO[38#X'b6n)xuCͫ[1+b D!ViAI0*/ '^Eؠ" $f]nE_l| qwx V< ̫yOȫ~C5}M;9,=oH[g׺DzYj WKLM|YIa)9RI=w+\x/?i]\v?xǎַ)L>XU~cV 1KM<K7:)fKVN6'&;K"gsm{ v%r\ʧNDx_SON~AoLOHp/E7LхM#NЋ(&镂}tc,;fH8Nr- M0a ߹m\dtԛzB7d N rƘFof'm0:2c1ws ^eK{H7r _fٕ C k.NGnudXPO +;wUxf=v<((kT?. ȋMq98m_tҵqq3d&c'>$6PBX} F>} [B;Gg?Ga"-B9cܸj9՜E]gPIF XIx E @X%~E{>1 \Viq\9:U=o[Gv ED ʙ ū> ՂgrZ3:>MQa+zԩ.Ht\;-tۀ҆}]%6[ endstream endobj 469 0 obj <>stream h40 _oH( Vd: "zq$}g٢ }g8-[@lW@+22xee5X׈4pˌjq(3o!G-b-$,h endstream endobj 470 0 obj <> endobj 471 0 obj <>stream h[~ "GjHvIXF?bOZݩI%]isSr8/f;oIrwqvl̖W# '-։ ቇ+ln| c̞ubv+^HBϯMq_##0A&CB/ aTZN7HDsddBvϿ`bLE[@+1V>TS -$87]^m}V!-S|j)md2-&6{ w-UR4XQ"{Tfbq1~RDtmx.o_uzD(bnf~\m'Sn&$=L> ̐2o&`2wX$QeX~i4_ JfhDm%$u͟)춻uv | ǗEuV`_S&Nr(&1O`wo{HQҚf( i WĻ}`CA}v@h#Ő3Z 6ġγ6Abdri@ kPz%#>S/1%&^#订;+a!~mQ9By62g% eO -U X\a' [l!Mzu4ca[`Wg2@ ݒ#Fd=ϫ\8р2϶ap Y~@N|芬 q%êlC#v< "j1峣bb|Sx Jvw0Fiևm3Ashu=pPC ]]=>l:/C`E .?Y\!NSkcFBñP3To}s |c1>)YhUJ7Ro),ݖmwJj*؅u< Pv7␪%&WC):GC77,e'a`K\bƻ<,׋ܶx!D9m/{7Cj[6[ʪ &lQ W,(+b*سlW-ۇ@"dDĝ;d!6b!bSݶEYC+ Chj&8Ԅ_Bb$ Eg`qƻQEuLX;aW:8Rq~䳵uv*G ]M|>9*:LË|?Xd:rek l?}ob)cݤGW ShL"Р#2Cz@⧥TGBٺ^xOAy(34mIPPoVpWzF*\7R LzJ 5 7$N8Q{lЈ~ h3>rĕ=\ k'Da<3[p+Cng P^Yۏ_*7WGEe.1ѩ-Px, Fr$kqx(ygÓgeض~RR 6(5OOM`:1\y2ӊN*:z`0:x987^ P(oY!5BӹZf4b)wS}N81ӎZe+:h['w#^ޞJImif#)3n=C"fhzx Gky:݃hmH O*غImh(V ^ jQ U@I&0HP'HRV<?_͋Y7Lp'DD)bzxT$+N*Ȝ\7> ~|q wZ]Gڦ-.ڮXKeќ4#L%HH# %Fa>,%*,O)c~],[h,9&9o56<%ohRjJ F32P8mt{51҈Sv?XΔf%Gܾn Puq&lwKߵ*z2sÅY9}.<\\NޓZljd#RzGVj $ u7Png7<,žso~t_rbvdXriu)RPK܍cv*29Q|$<PWsU3L-= ,)TQ`5z=5#Zl/;7s?|-Vut>!:f׆]=sґKg78`lo y^8ulIx/sj sxuUeaS{\XԲ,R-?m``c;@éڎT &8cL(|4mla3Xi*.(`\ Ru}*+ᙂG1ta kNf)b6j;  )Ӎ $NhWo]H4ߺt6Q}Ĕ|7^%d(5vч\@J]8xud:Oiin mWk\sh\^q.ݤwEH? l'wxв8/}`W 9u =9h9RG Ƕ.եMz bu{ݺ۳՜v(i+Q(>Ъn־ewNĽw 6 7].uˮ2 4P.I?wޤmknӼTqdg9:q6]c# )O!ژBaGlnކ|6zǭ)4#LhvCEjBm1m#OlcGkF{rEǷv7{%?ڗQ='Ӣ3X F/ Xg.Hnp{P~SzxOb\MeO.ٮ6CtlOGxHDAPէ]}NCy;o>{֫~Kc0їg1c nh.F&=ag@6T}o/@̻n)}]IO\E𞆬i{>E\fʘgDUec 6vk\mY&!ٔ˵+A܀dlsJgY*/VeFjڪ$b݁8T&q;5b@E&RŤ_ s2"O#l;L C\!TN$j~wuN^M/7Ee]#q4|Lgt}-ޠl85`ol%WIbP$)kE7 B/k%s_߆c~/x6g ee4fz> \0\ endstream endobj 472 0 obj <>stream h4A E27AH 5ta ; !{1 (pG*3sY@;2P˔cVcUҊ`d3cet27˕hs1/1 endstream endobj 473 0 obj <> endobj 474 0 obj <>stream h[oB"q8H" YmT;sIW=|Zpf؝/7d]}rd32[_az@Bbx \vc̮?_]^rEf IBg )f{3¬9_lB$8!zWJˉi:9# ;Ϳ`bL Wc­ bBJ$௰"I L<[DQOPFsFfH3HsRaIM-D Eg#̽X^(8 Й%@ \U8XZ^c8&)oz=,WX:R(@`(0h}zb[C^RdCżb&tCt̳0PƊ.@8  tP Rj^@}Uq9Kˑmsҍq(5ng;v1?qC V @_$.ixeJ sa7,,.%>o1tzvCvnk cew_SC-q?aƏ9럖퐇d8LRr?$*ضFRڦzApML!ZS3234낥?j$5ZUV{g0HD7|օG7Uƪ pR Ink*Hj~F"rE۬?c`F;2:X;?|fJ#8κ^y[0>d r"V  r`]V 4@V.ńxkӼ<4"i 7nTp )kp}`OHJh78`v3V0_VGGp^>e)K __6k y1 &P'! ݒVSU1t׫4y:lgC m#pMɪ9 繡1oa;_@t$ ܅5 "GڦI~h!K%i7~XFkXJ?d!mSLLZ~kt˚s-6rV"^^lcrz:S U &+3K.C1ņg@kJaSpV xngMrZ;fcA\e\] A>tH&{97D"K!zN&`ՓX zIA/\?Xvm?X:٤ΡJ_w!?Z{UY9J HwY`1է¯9KDx `vTl:+VFL|<ږbzֈgrF|11+Y&y;m"fXBI~Z#0E"9|Ś=ufIPVDe)k߰h!m2^vOQry!Y0a-뵻!rnm6ƑnXdp[ O[G[bQ1 $>d}dl I*4zO4w(9։`Dß5{s"|/JOx /yCl&lZy߾{}B1f"btwJ-$5t ÄNʄֹ)s"8bEם/rHSEǙji>29괷~$OᬑKn*/m: =) bR.zr,"g0Wn"aqmep*|^JnsaX@ m$#nODY| b9nZ{9O F1!YXp NHV5.mDdQ>Wm {7&C5N%uw%eR N߮ o k$lt nS#"s$5V"3\wRyXFhn7&2KשmyFX:'ʹ7l$/DW~.6]Oç߈?&[- IMCk΍T/U<ش7U#r.8+7VoCZ('.ڨϷ6֞E֕ίA}jTv9c#֡&/;/Mz<]]3t\>alX\5X}2F]?e7_"ywΉ_6H#Ԑܻs6"L/Dwi89S-ccq䐏3;rxd=k-4q$?&#swQdJd:9/wm>r1^DJMէ]FSO[IZ< ekec? vM-@a\Rޢ`{x8o(3֩pEC7jϊ 2Qa3}8FiȥFȽ Lll}޵pY )t͒݁ѿ}j ï1N> QW,4)O`2UaK+:+<lid,fb{Mu31*#Sc_ABDw4w 5`+=njb<*x n;8BV}i*|yEO . W'ߘbѮ;BTA>h"IvXJ%EZuꒃ.D2Q*%*۩4֠䞢aꆄC+0e9Eh] d^wΆ͒zsq g9(o%M9Ňၪx*hWk":o;{meu_s{m%"á6 cz5J=zMzj ]:eʥ7rߘcEZP=ڨ8/(ju oL}xԧãJ a Z dV{y[f :|uzh Q;]5"7PxtNIT$~|NL 3ßu[ۨ. 2\ _mMrV\ yS+.G\S>A~i~Gs=iEYDNY;XD۸]U!JuK| *ޟlQI`W$j@k#Qs.>L Vn Jh[ݮ%UX l dhiponvWP.)F5?\A1:(U Fv^(K]ι&OUmNVp)ݵ!pwb}Ě։u! ph0A`d&ܢlxDU endstream endobj 475 0 obj <>stream h<1 E@AX&kTتQV*H{"BӤ.U\kqrANZ"mT{.ǔz^]W*M ˿8';ވ? (=ό({PuV) '34 endstream endobj 476 0 obj <> endobj 477 0 obj <>stream hY[oF~ׯXN~1i7Yȶi>yѮ,iE33Sh,(P49WC9~1{XȌggԻ_|r2Y6 VJ͋l֫5'ҠZ 3TU6+U'%Oi:wr Pk;%yF҂*F*d0@AZqEZPeTMQ" 49*TdDnU "qym&*sSe%$Khν)x'=/3նѹj 03p{Ρ* VIG4IIme$tܬ=y%37̐@b;b;a#VKr+o$GUĵwt@qQ~Ýy\qZ"&jѵur{K6yϲc> g8+]Q'9(Q$8Ja:^U9@DBB5AE0^𸦇dʰU*dzeV ٵ (G^W\8:8}9b!MevX?$!Yąy܍..q<> NP0a|jD(S,(Ovp׵axd:T gu2XVs 9*1e?-~Jrui=_)2X$kj9_p~^!b#4D!7h,`#"I.GDCZ&_/H; P Ό5 hXxvA#m!Zmi)|lRr^ /~<<> e|r皇l49AB%yn 9kv9YvDk](*f<.P:n+' 񊬖r>kBi?4ᗒwKt =AI'!$"y$7sF\M޽GHw`mbFyƇaXCy%q*QYS ;r,*]eK*ُTrOhO )y,~U0O!cEw-9/Dzǣ) 69hAR!E9LvVr;tk@XIy!Uma đmM!3s($k;SoMqH{&&_;'_Sr%ϗ(M0Z/ 5ƋqOϚKGEc9asŀ݉>&mL 7 |`|8`#y 2&SZowvӇDDzOKD({=fڬĠDTk-0]t4"* ~.>tnk|rEY_0jO ga &7z3ݨlQeY5/cya!Ve=a??1 %\y۩o5 E* exOwN Bv𴛔RwB endstream endobj 478 0 obj <>stream h410 E$ ei5٪eD=p|l-[taԣ|u5- vl^!9J̱aӋʏL`:#hQ}gFejyN*>!\ /' endstream endobj 479 0 obj <> endobj 480 0 obj <>stream hX]oF}ZmZU[5VTVB܂bh}x Y?C  )z}qlN eBjv\]Ik ZrHO.F @v2*Qn@ǜuC|( '7Ees8V_A,Uܶ/w+ޔ@yUl\)!lѻ &o-ִ/V4h^vYR`d`Ov*3e[<=ޗ}vzDŽz Ӧmb^][Vw#DIp:bQJ`KS;ޑǽ9Ix#N䤳j{^3j39XsL=: @h)OU_'[7Eckj)/3uHx ؛m^4J؄%`b[ =\ZW[7MJ1FgǯXm&3]3A* 0/8# endstream endobj 481 0 obj <>stream h4;0D7rZݡbDYKv7oގ֠ (pG*3سY@;3ff_2FX]:@;U,f g˕hs1//U endstream endobj 482 0 obj <>stream h{ xTU:cUe,B IEP` I! !$R@2((^EeFmZlDޠ*"ڶРE@!9*n^{E=kZkH hZFY駐1U;_ŀD{MuwWNv>Mx (r MaQY"Qic7 _J\'EG ~:]"L4 sj%KYY v gΚw4Ds̛qr:˟{Ӵ(É.]I/Bve2%p -b(%EV%Q>JO2c&&:/-Bm𺛄m,O:Ld(1'Kr&stkZ*p۟0Zv@W𳛐Yd1}JxXzi- O?!W,zoh_Lz[ .0=L[i=ͣzl(-GTZt>b~txDdZ@ci#}KѰ!c;xTi;tj6{.܁u9J fH= ~#(3C<>jI(7)ÖOSr*(;meDӂS&_7?bQ#G s! yU~}}}zꙖNI%)sq1QMUdI(]H ZRa@yn-j1Ź<U}RӨc_o*M/2VR?xPy]ɩ j*Wk~h] KSW,u5g9=.#Tr?C~, 婂[גhUե'k_aBƨ")F ة,tˇ8Q& 5!a ܶ Vh%hPlgE2(qܡ Ai## "@<#"F!*W1xhHh/ A_@[!Ŝ&}ߺ,B5+Bf =S˯h1}_h]|QAov_jQJkYy5w.[{M,;:pYyk2.Fee]Po9J+fyۉ$$ x%@I_6vzCQQ7?ҟ_JUi@0k^IEq| [w}8,Ckm9~vB[]XM8Ksf#ML hNTZ^3{5OS \9Ung:eF G=}C`|❚ X:r.uBfFrN y/=7qz1=QC go&N-a1JbobNpuD8y]gE%T“"1dVenqiWїa߱~(Z[~Z*&\b}oUwy#KɪKM,3*Zj܈£#eZ`]kDFz|czB7DcJӢ  { Ͽ"w>OY*Kd7P֞kw>2+k٭4D#iH|fHʼn ߋEjEU@#6u26 v74ћ(jVEz XzK3Un`pQ8`~r Ul "tmp^N`*7v(@mY]-ۦuUA)ha%P˃HXVUXHPMM3TXGU8o&NT-"uc<Ņ(:2dȪ Am&`3i/eLí.MpdяU6g2c۩EbDia4+:*ec* }53* p٠yK6dkѩ`8FHxhΓX66(.V6;y~}ӽlc 2d>U'h5`<9G_A/{t3Wɍ;dTJkf @--DgS8RѹJz+!9e04C mL (燎xx|S@}SR5WʐJ(3iґly?W[O{)ORo>ˀ?r' f"L(ws+ne 4sW,0F+u88[e4DqO g1HQ5P |FU0˗2O2.h*7]QozcW v im*|R=eڎ.ۨHN8 q< ^f?/]gvx5d )܊1'G?  YOHnzL?!]?r5qizDA{z-mHl,7R7ۊwf =w3Gt >Z cS?>k v};P/k]צrJՌ1ysK ~ z9OO<UQ_#xhq><ʈEK8J9'-}* s =Vl=4zX/HcP_LZ?P/kBUv7Wd &o3)_ 6Ad2)0.cOlQ~Zڲ.w-~wuŃg)t cWW?m?`^7d:nUZ䞯Qf?e* )YR' \OiQko0|{u4OHd2 A:$u4f倇E:VΈЍcy4D.(OF40pۃZ뤥ї>Ky(3 2_ԥs-uXCjH(ǾXhiXc"IT4Q.͠~R^]?mj#). #ԋH`M3ww2Jue zm[}{x<钰tLKFӿKݍ:Y[*)<̺4,}HviыP'i/ aqKh'+. KW޺4Ї]uoƯF'Fb˜=^UIz῅_t~M#*T{i4oz1YW (meH+)ZG Б; 9Z@3]q6a ._e8ZJ Q|eh燁ݟmn~ o0Yhk9.0*9l]y7gkamu2|Ԝǵ&LsN@ak"'koKo asd1O3-zLXyo7MFCmyqWb}iwCmOp+1.vYFrBlui0ZH:4v@^myeA:yBRi,9i w۴߁9U&ҋ%u²[h%L - n: -I^p??3y"\sSvj337jcfAhm/'aL__U"h(3Nk6 i Mf6e%侽c~K+'p;p V }d3*HgzZjQ"ت!|o6ؿ~9D8[ Ő>9;cf "rB~z+ttAȅ̖p)l]s0_ɈfyGog4|ɞ#skk}˞lt!/.K<@O(?S$>5r*"D:Ch9ߧd1ַ!Xlp);}[C{XyN/m{6{vd_nuwy6Zmw5[*|?EnN^^ěh+?;|3gxm4Pg눳䧥%q sHu@ٙx 2pqK>G0\C>m)GLBWe̖>v?D)gy.O6Қǘ~}X|Z*=Sc>O2 L/2[p Z҇ɇ8@~ =n#-w('򞣾lO5] J(Hw!lǟSMhM[+o.!(=DiK8װP!uAߪ?wTPXMAkfeȏ/'C!{vRs& ݫߡ53CW u=hoUV`Տٻ"X}e˔C^]C]?1U mI銱Dx8)E1ŋuZh"G"-?Eff[N`zl;c/1&hqn>vGC DOyo`|YhG7v> {s\Y(\&`g"s96 oݣ]Exo&`#hbY ;yٷt򯀽+]!l/uaF>?|kƻ aˆfe֭{=^);MZ.ο}I2wxG/oG;'N9!𞿁Lg!OOB&WN<0z@w\2"lWA _Z1 4LO~ X53Ѕ_ /' q:\Bɷuݏ!OœL.A]9~TNäihnOxTS|HSC.q^'8֑tk~'@/Rijfo7=kGK:YOH85CعZ|ǁ(UT8Ufbr}>b'?+AKF_1ςS$?FCWQv#ﰧ>YIuغG'XJoh: NS B Z@E^}/ m(Iigwp5vn>?kiӧ.=cį1|Jy;юutp1Ah g)tǂ#Tu#1z˷o3b) h7@ߵq{60\b,lc8xtqĵپc8XL:%o6:YCFz*.&'kv  1#1;|eJOa_L$l~]w -|Li6,?%2 Sͤ |} ^*du'4&"m6Fn1j--eB}&>Ty>OAgBOci239Cg!CnM|3CVC=m~t 0r'Z \7%f|74wX&JU6*? ? _UOljVX>nP! O^JCSR $Sgܧ[i+V:G}![@Ʈo 2 4۰Uo .a]X/жΦޡA1'@._:^r VwR.~3au P27yq? 5PϾWHغLdmEoB~l刅5&PGjƉj #ͥl0IAߡ~P^>Gu$ MB7+ t@`b@+`P5ǹ9w?qm=}>n#wwqwwr75ܽ+wrw9w2..xs#1δx״7vI$mί_~%?#t+ we{-”&Tnَĺ$w]tl6KL||ڒ7{S7޴Y,l A\ M-pa ˦䗆ȷXV; KߒSV|+ߝkHBA qb$De&8JP'H /Ip/+36;S왳199/&NuvrDDF6{$+Q$QL-#j U'QGH"cURi~Wcw;B1=?.%tNuNpv2=:bHrrv푓NK+\hV Y—:3)c@"Gf~NVד޳WWur\r~|'1zQ?GtW&Q2yhg NpIx\:y"H)c$ApJD)6{seFh].Key(JlvgWiH,d8@(-4lICmi -=(JB-PZ^!p'f9Ϙ @A,ɨdt挥EK.]רNr)hIu9+]&C_ #J`Vbo"7ףկ6x4+euZKs|uO~%祉HEgD'2`%s8Sˡ\3)b})}& LHD>+ #iwP 'Ҙr 6 ($*egϡR&R>#TNOl2_KiYXe:)#|J>z}>yP H%L4HܴuɔG.^`jk鶂Ž/7]nI%IҪ̫go_dmAM+V8_u#r"s?.I|h2)pHu:(EшG@@i|g,@ ֕\6jiy X:ABGyf3:5z&m"']oY=ߺ}Qָwc+^>۾^I- prǹ?T(r,_ނ4=I#=-yqs@('rQ,E(P(8qz ΤK՗ҷ MW>yu]2zǮ_ fdc-)6?+ 'M}G\T" $H*P0uEH,3-,-{ Zǰq B(}@XX9;#") 8 DżOF'ѱ>.")&t|Zvt 0>~6=Ǹ9 V{7}yJQR}|)N@Weaq Q2(~ͅ+o~͝Xy[8'_/=ĝ˂FM>O[ruv8.| JL|MsD>2fXEءպ:=YZR -c.8f0T+C WM8d5mFJ4(y__'L:^}t hih/4K Bth `9&F*Bc 5,{~j&k::_0U-Sǖnm^iin1SW c^] 2Y3jPQXUY(Tm,#\_S:! ce2zmߘ3 aL@<APMa!f}8NB |?Xz)u 7t:5(Q?j+j@$ǐ1@:Nlj PZl(`(S ધ+-)OOjDJ) a:"OS$g &ƄU9${Քp8M]m/kf/Eӛsc2%9u%w qTzjk*T#Մk~sqV)_kFjj99!LGOs%ܜD;rAm~ >&ջ(!E DM" !1ue1(D.d~ g%,g #sO6>\wX'C5Js4>)Cxߖ7ϻ\nݼYI H#rWY(U "k2`pi6}ZV(hQCH 0}-X蹲's$-!rk 9,z2 a BJkFŘ+mn MٴbPKdvY>ݗk+k^0suy׎yc:nXq}ɬ{zd-iCGV7_=3sN^vT*qU 783δ.b`5yq*qUj=h:%eXrD ==>±^3+\4Le %PM5KLfH%7M+{(Vms{ &V/h7&oM+v_8gV"4۾W4XXQW?v˲m.7`5q$7dHK6pB@uv J>+;h 4k %-t< -Rev7Ij/y^fm ̑I)8\*q^q."aLm'BZ+Rk"eTT C>`<Rx/-p6+ e"7Aq4BP&O#&iw.m #Xd Ž?%8pkJvVByCkg\8=k_9.xjTaFFSB.Һ\Fpی }4+hrq7aeFY pG-%M6#.S D?s3"\VȴpU5KS\6\;LJc ?=)m"R eY,QnSZCun2#Ei.dΕ@9#/Qg 71D 0c3x(tq{{s7aN;qŞ*L<`3cVNTeȤ*'}aa v?L`0|qJ#7]0 `YL^U*b* R"n 0 I' #I&QVtf25r#yI,0g0'c;`4=e5@ G`xW!f1I|"1VW.InM1:+-w/4&fvKfowi1y'5c4<%vuY ,Cذ$L:X)RUmr!5lODi﵍ŠΜH.omJ@3a%=ECujXq_-DY  ABi Dyl\?\JvAzbȖ:Q;6N~{r9=ms|bn[i*wa]t"\jʀ $@f)۲[&Fq5_oюYЅ2z` 2N$@3Vf6~d^MO,S7;{.`ЈiKTP&QTE$1&Ur,$":| *B!G1)% /+G[T]mRC0 fm.DCԈ]9Yq3lmV=6dzE.{hs׈ϰFX15zH* 3 K  J0U UȊ d^6Jˆ1@""@7R.՛s#6+7p-u Fje\9ĘgYWXC2ɻx!k |kAA{!=p"K:'׎]В6f58wlxֶI`hR7\kvNiom_ce*vРr,/<>^r{ƚEe^\rMRJضqӶ/;uؑMMyWqu7 d!E‘f\vuB^ijpF*veWɗ2<\B w4i.0H;{+=7uۜEj&hIFSQUERL.AK"1-ݿJ82D- /mr%UuMI),Rzr_`;Ir)4;xDY]R 8M@ ;T&8,P;^H +.YajS_uQ!j.g}%W]\(Q/4lYg\~&ҶZ7 \Ee zkP#xBFmrQb1--v fk YJ" flXSJc^Ohu+wF$ xa9lEX>BI)uGiߦ.`2dDg^/esW8R@f* |вUĕ5sY;+Eqyȧyi[TE=;%ifYi,{`fHʤ8HAFcXEԒM)/"EF=g+"(Rw*CcT %Yb`Iϟ?o02۪%kGG`Cz\uu";%4V "QJ$@WqY1x >IK EHO|14suO_3*Jjd 2 pO-Q3#НU'H @ ܩ%y1 x# SDڗAu.b&f%K:|^0;Fʂ$Er?b59d ʄ~XJ6ElJ ʐ L0իG/1u$l`B5 9XYF~ΞkΪSsyɪܬhRjYIni_(H.fW:(!p2Fl#TUM3}0*bTJ4{c/[=tYMkTtqaV^=~^vM7ߘ="W}@xܻ] R;s`# kR-Y P?19wG"ɜGUI%(<3NVQTRZ4\7& / Cf2F!d.3skб%Q^߂f ) 6 &]]N`Ѵʃ(T@%Y*dX {Lt& G7BA(L{2{{-1:ʚ̘Ԕ8]xq^歩E3h3a&^[8}oV9K;|^m:J)s b<@' gE i9@r%TzWt$B*A2YegᾸ|T^|1)H|eƂ3M)zs鴜P>WI~¦ɏ SM FҜaF:57۫2sK;sg 1ג1<۔>鿰Ul` 7 Sd!c&CQ 37Do&Q—_sU٘iTziԸSj@ x} ռiY=׽"-oל'm\ܸ=j{z 5QK}ީj{T{cm6 ͽtZ@C,A 8D}QVns8, iVn,DbG~6'be3?[.{R a񭪀-'kj9JlDf04ƩnLpŸP8i _#J܄XiI)*KUV)6M4jATܐq[T皲ӄ'Y 2gM[{2UN,U7!ngt~^Yآ7Zi1}p{s$r cpb8WQ( 8tMSps"-JvoLb214%Nc,Ԩ*hI; hr1ʤ&P4-DŽ@T Nf*_bI1]QR)ѡ"Ntٞ :&ׄ|w '5~˽ &}6 Vy~]Z]e TĪfr]+' _]~[Z(E^ދ@aOJSu0hЁ:,O}x}"cp*ofGm`+$+f@7X `e;gDgtwuvEhJ*R B `PRč/J]şVWwY8fw4QFRQe wJFW͇Op4R#'Lı$̤zI9S ߕΎ  $VF.[*wqvC]顇q<}h}ܞCݳº6{m:83B E+~:] ޡǠpo?8w&9&PUЬlڸq1=`&fS&Q4jU;b7yu9:% TXrB ,V_ L#¡uA>E|m'|w47/4gj0wkB=f'¦{JrKNm GooǶq+eSaKDzeYƟ3 7Z]R-gtoц/⛮#Ӆ`f j [5 )s00 h-n88889\%\\5\ - a_)fh$ːA3ZmX؀-؎qǩ]hZ\kR 8U8d=,ˠ7>R.>3e'~{_t>Uڙpօo' \ B'RF득~'dy^ͬ˵g7.9ݡ4e>wbK?xtd(Bϕq^@|e~KȮ؉H:%z|0PCߋ2d,Yl+g53eug\O4wz-p[{QMjy;ٮQL[ڣ77VIGϑ?|MU endstream endobj 483 0 obj <>stream hT=O0 BBKD {.qK$Dn:ߓ"$k?sSf|ps\"\qmޣI ܭsƩ Ca$L+TcWQ%0d58?t1j&rX$FF#I?ԍ;xl%Ь{URxز Qq-bU ǮRLuv=Wpm endstream endobj 484 0 obj <>stream h{ |y֙!$e% BX¦DaB MYDURjnτI} }=s9$" s&|q<^)HF$ಹMHC;9ʫ9ј(af]ˈVq|h;9(a'.v'CA sQlmD?5?@y3;?!D˿$RYpk#J?"һ'Fmjl|8͒ZYu*+ddMvMtRZ:FU7I9OٯMIтOX"yKjOo#}ZaIVO_BZ@sP9>"NW{h ?]/?@*zѯi4PJRi#'Z .hOvZH L~Z4jt>tjYA$it- #:Fgƚ1-o3Y@DЕ4 s#e?h*0\'oAYh'8"#x (:FG-|lQ+tI{QITT330}ڥTN4nl嘊ѣKKGȿpx^Cʹ``Y~}ֽkΝR;&uHLr:tMUdT#Wht)ROۈd\AItOv)CԱH5QQn{o(ߧ8P3S0L{wWѵė2 U c# .+ *^ $!eRѐRamjsB@,0 Etw0A1JcD_SLtdf4H$PSt Rb8M,hb $cˆ7xeFhO)膜gr͝óBVkFQAMY;i.J 4Q0VYU$tܼܥs5sY?\O)/z@L?o)E^TouN5P,.%X:`p؂妳M< 5d.؍8Eޫ[D#X:V냚MʀX,ktS]/.k,epE~5Oٙ1quӍ.^ 5dd? WxJ)£)b cQ]idj/NE GjmF71eU9WV7߈éWV&K(>hT9S9 !?:rʣ]^fM+|S=?Xl.q'zMe~8ҟ]2WiX!n{|Rqb-/Ub\Wz2U,>s8|悉0Xp'YM38H#MLԋ+hŧF(=&vyNSHz:uE4cDw דT:9gg('e*,V{nϱv'ɝ-/Xo9sJɉoH8W{W:"u#˂~{O˾  g$z0=UCgG7kgr[%T̛Cx]%>78NDpx TjWxr_,C".{õHv:ߍ JQ?=݊2gS)e(62X|tc`RQ>+u&r[9Q 5nGy]+B`K\5"SqGZ3HZ3Ʒ {ߓ$z!Ϸ "wH99UJhI)ʻAHfD3&Q}l%dVZH* A5:Y;S@)hd=ֈ,6b<Ŝ^VO1?zK-Ep7&8醞q vcAQ ?GxMՆA0BJ:| R=6kGñڨr܀ yhggZmjQvu0ɓ#=ÈX^ƌPEgyY~7RdlF5]VLjLhI 6]hjk".(3vPY<Pfg-Zr ۈ˨ñ œ"xJuc@;|s]zد7& CQu}Q l'Ag+XrƵ.Jn) YQ.7iprllɃ};OrJ/@+Byɂ6< %.~ 30Z/% _KmԨ~rJh֝4VH)&r}꠮*yc~O{1b\}b>bN{ =tvs9JJѦ#Mghq>po*Y{<0!h?1^?hjW/Zy}+B;zP_<+MTF>h+N>h!1u ʱyS<9B]LPg@5'aq=x|Z< 18x.ZOK~~0 H}sn!~?ia-fV!0C0yiAp0Cx J ,KS/VhBW4B:Fϩ 0(N^˯('pm[zq1D \*p@a7w5CQ;"ixn<N7!<A(¿V/Z_b >4܅x_#@}w8md`LC!A: ?-}H*A2}M~j`DWOh/]Qz1cї5 ݆jRJ^%w"cm'gT%o/ ?5] g>~}{V5Od ܄1gG던 iďh6~<HU(a?D "}"y ݪƨyY寠ʭ5sX-[XW-YE[D76|Od"ZOEZ WR!*.W_5iq%4 4 7Be0Q5h*z]'cv[OӁ.\ ʭ?rV*P&C+aj`u*P r`(oGTN* /}p#P,0 \ƀ QN;`k#%Lb\C+Zyv~8+:peGi.*2i Jڬ7Qg^15_xY?⽥΢>DT`,p)g0{44 ?}#p3-/:6WWdxUm '!ShgΩ\wxNV!}H|vыS'i aNv!Y^{h#CT̯'Cz߁?aLLO+7?*Q227KnhBr2r -2}Mci?- elei(E:,Ⳑot?Ÿ膳q eUF;ʣNEp{,8;# ْӹӏӁ;l}[`|GlA[-o͑v<t~6}]\ by<.Qm|-:͖ݮ%~[Αk >ԙɮCvv8]7.򿠏6[v¹lBWꌭmnt⭶0x+n~v OZ:Ü5U^'m/o2W0S4\݆;y*_x86S1ʐORvm(Nr}; qն8&pqvWˡ.sn 47-N eiń|CKQZmoX1OQw1竡?A`[ЕP_>ar86у۞pum٩zoͿAhK[m//̿@EpQgldat6mc~CWNvxF~βUMW{@iRن⨁|Q`U0Lٲl(^6StuUEiүNx:xS.mb gφٵ1Uzmsg/?N0AZɡXf~+\Z+dIc}(h(B}bD iP&<*V=J7Bv8>=ByA/m{Db99<~h}!mA/A7N>܋(4J_3zeWzf)&̾ TJ{=CC>xAW(whߣlx#݊8ێ?n}۶V篁.a1G 8^7>sWܤ՛?7tPXa eNj_49{&{=MQ1恨Dߡ{[¿"rtF}H4W!;;n:mnҡ8 ({\eپz*ȫk{Ř17EME|y aWuXz#<܄{R:@ZCfXaz_`Lm |"Hr/ 9a=<_rюq0n\ǭ(,|0~s8WYRUL9ފ9F|1 ' pz'OBq ws' @-v2;s[ #=?+'Yƹvƹa>?|cǻ"% ƾ ws0~{wp{z?w߃cz 5yع|$owǜ'G={{ޓ2< <)w#|wxI֣I#~/x^ü ߅q N*kkЎv֡įC;1ʣh  GO3VwwzZ*a&ЙSqR_YЙyǘzKF NUCVBF^ ԣZh*36Z]$6wp{To!p{tJa\FB7}}.ӇcUЅ`\&XK[Пަ5o-TݨB}2BXS,.D}1oC~Φ%zT(B+߲-<ƿ m{(*okOưCN@Htȶ:7CW(4!dmfown^<G]B_ sd"-ۖXeRhѬCi'̓-Us+Q=&0]+ۆw9Aoƪ4W~S$bl;).W`hh^.v1CC@S?ժTi]m~)Ն?jէ ?%*_7AQC,S l<=s\ uOJPBHc=!&>&e{z!k$9T`#cd+IS)Zif4o&A%/3U<1~>|=>by&[ԄG~=a=xd}?m=HIꭠe4X#P(qZ]@۷[|oІ{8~o91[$~9ix-G7a9tՇB߆)h _DZ7/26L|.L~coZ i}v t|MOlewW2 ~w;)mesrp< 3+A ]nD](C-%gV6~-msg5d?c;-|Sbr2_g#Mf}uw54|( 7wzr2x ܋Y4ǃ h/)uU2qķx1t ~.CuI=r ?x1 ~{jq|EhD@|iT[SۋR G/dy(xPӀT%yt=>kiA[iܷ=qM<sLPiT;N24dd)$O6@;^,%,/0e!O :vg˿GX~>>cInxkb,6Ob]N[:YC#=~W)ڷG51䷩%{ ahyq78w9oDZ/_$6a|e4?rO!Sͦ WlƂYHA+LWa-ej߇1g)=A(.]tz]ljYzd%>2sixzޝ/{${ wĻ |c22NrHtWm_+wҽ7.Kjޥ+{XJVҼ7a)CSR$ NIuA>0EN)͒hyIAzf>I}N?&;y㳼 ==< i==;FEgj$ɱP ЅPfE-RVG=JE}C1JL…taTRu(˨{EIRϢ=.5.%sĆ#tpl eYgOw''GJ>W "IT9(\l V6+IF҈5IU#Ր4K4P4Jjj}R^FDF-^ow#E}yj#uJ#g{.ڤGˌeRXlD1OB+_UVgAbMR X}p!Z!#(|ۏ)'^5ؐK.4* WU)4v#6ֈ/\)M2;:ZR@73 H: @ DN@4@-8)u`O x-;+r큦@06ps`U`ee%@E`tZv@zQ,HOQ Lrs뮔Ļ{ޣtҺLĿ%L<(e>x@iyX2dpg :tPNH93Dށ!;9ӕ0=W(ڒn ܙ)ۤSuTEN=(S9)WNڊ,Q?=wn_堺,Oa͑]J=T2Ҥ줼l~#M.dJ$wGADAhDADADADADADADADADADADA\;eT soB-"q&QJPM]RNXM#b`c!1 V~BC⵱P*l\+ssl }e+_'AWGg/ӽmXjO|Ay&q%+pF>ȧѧ#bPmKFdɐï"Y^@Ѡ xh46 |.Z B!zf4A>)B$G݂f38+a0Z:f~9[YBFu\+dôK{ - ̉`-!8Nzd3عkS5@'@9e,^Zj5S{Rb֎eYUcJBlY뚱 c^9\&n02[\Ag{h]ڡ՟{ouWkP _ GEAIEQkrڻB//w.8sX^~xr3o}}zs.Pb&C endstream endobj 485 0 obj <>stream hj` 01z؀ endstream endobj 486 0 obj <>stream h޴`TS7 B %7, %HoBHDJ( `z "[h,EQ 6XP@=g|3gf;3gI#ڴ >ldjZ4g`BqaIᔢL&̛MuևȎ\27y' &j"u4uR/u>@|m*N}H_Nũq[I;nV)~xAX_!7-bAL'q>ST 헴_N'JBT;rq_uպk=NpBXG4h&o#U*Ҳ/?n%cF9"wC.GϻYL_D]QfrԆ#) )YMfzZ7˟=ojYVA&˘ӾUe-\[J*}5uU)6o$gNLHJW~~;L7y+m)ysX86o"QUVv^[_Mȓ|Y>d3"to%eG 9\ݧ_# kBPB<_RiTinTPIimzl 4!K!$n߼MKۡտdCoMZ8̗)6*ϟBY*:"~abWCn?WoKrL 3TԬL.7 S yrΗ] Ot.gQR&NS0s7/!ɟMV|%;Tx(o`skÛ ͥܢ}yZ.n Fr@28i$"%eQay#T&ϟMbsx&eZ[@7˩s]7F(n΁ #o.tdx4ܛ gV3җ;&OKFUsIxq) A>6!ج=@C΁޲(_2fH^Axh;ePM=w͗]y 7;K*J <|&FIPe(a!ߪ>h9۷ؓ^ӖViF{w٨J]3 +Z!,Ҕξ/;8pD Ϥ-UP 5R~QA?&l/.4h&SQnyʟZV/ţ)Ok}}+4ݎ&kٿ= Q9<&0NCQ&],gT^Ҏ#Ijc<t[V`{B.㴞Am" 4rvs@l#M@۠UpM私^hvJuR&^XQ6'> pfRIX|A m&DW4&A|&aH4S&)b@2kՎGw@׵:+i%{uBRªMA . ݀rԭMfᛏ r _;yP!I_ >QA[4&۩\m>D)q+J\A?׿C{)J[GzS=: #$p%x2ěFOs7-zz\lD@o;'4o/ЗO!_`_2Tj\F.C+)D`nΚ`QHLj%^4 5)΂C|;zgvqs@9ȡ M >eFM3\jPӨ0+%zSSHԳb3Yc:ǵi3 :t@1(4hًf鵜O]ݨs:sӛSC1A g!hc`.O1-_ qt[f -!kX?X?+sgF=eفr.`| ~ /QMo݈eJGdiuӏ=z@{۩5Xth ivG߂y f"qpztvF}/zƾ)Ϯky֮ g3=0(`' `p`=R~FCVoXAy )}`CDܯao4Y*6MU] ЗI>?4Z*4EoWlLj+6D`5ib/,BÔ{'"sSml<|jx>YE cCI ckh:FeނPQ" ;tqh.Wc! UAm=2`\>YW<1t0^@Qsz@>/V=r+`ZH,-Ըyc0^E_oy!2Cc¿k%m{ފtsuZ[wQ:DVwPE1(F3.̎vf;5h{›ְ5-BC޽a.33~L!$n_a+hG|Dw3_R6ЉrmEJOk7)q_82j-Pdg3?T:q#xrux ío`M^\T΁x^|0 nTzR=Ɲl5,<$R4u8l m.A v: k8WOVʽ%h4ضq];9sٟ³x怑Cyh]vc<) X鮴V" *hk)uo+*U>3F F?M;Jp_7cT9GO_6ssQTbI4= Z&Y<**"u6׉s5o#O(Ԭtr2u`xu^S^\0B\pFna|A5;FJ=c~ݩP}/_'h|5j:)L!<{ @r }8Our~}q]j5נ.p0py@z0g/ת7Q_{JÆ[Mnnwm!`z*&%QtcN <yD,hG= |ì=*(יV >DXL=(smRE]@w0 #\c`2oT[{RK{ 5w*OmS1}"kɸ[@S.^\ {FbjԴ[0ߗ ՗?z k .3li_WqZ12Z*;Ƙ SDc h̥@.P8d+^(8sDrlW4Z'G.<{^܁zL盟bo`GϢNƺe*3'bmcfx\j?{Qݚ}a^{$w{~lCRyTO*}==Gjܮi8l_j#y܃^9yqk#28;x/썸Xiͫq|/.Z'98E/j؃0V=3yeos%.Cd`5\ MQgA#=\yЈυyYڹ!.mx! :e%3W\ |Rtՠ}os<Ejlk Py tJW@w)8%d|YƌL  v`5MyDy \nߦAX#nS&uckأTƿ!_cMv~Py _bVyFinpS&\*\`G}Fn8c,on!OriMNQʱZljl|U6/"~gbsƱ\)W8`E߉1VR,@BŸ>/'ȫnyw]f׍4jMQ4xyZ?vhR!׈s'hWR/c)c^E4D<}p4[gktZoZ]g5&mr}{雩~% p/5s>>vI/t)u\/FbtCq>8=_P?9F{C X}55@i>؄xgTru Ļ4kͱa/`s0/2f:`Sƛ0G,s3lf:G;Zry4g~1Di74T_.|vmuNOZ%@}˟8='h>cLsy0hyuoCVg|8Zyqu3R#A|H zODd9,^_&|}3@klg zQКV"06^Τ6.jG_C[ZY׆+3Ӝc]}Cy~.gD Qpϑ9u0|xQky"sAM%5ͪ8 _TkX̹0WPݔb}ԙ'@1-ǘvw`3 ڧ)ꏘgwcޓ\^̪WPQva= sO`(HG:p)T<7Jc?g@ tG\w>l f\%։pW {]K\NO& d:VT\*0v`'33GEYa!Bߧ=*>Z`\ f㺙iK\ :aS{9.9=̟#Fu{ v,kܳ|>۪u=5Ւ vn.u@]p¢kA:{>ZX?з`G+ڿlfTff8lHCE=`'hieo0_Ffj.j uĮ8-"MI[4Kwp}F\׆9P8HY|&ŸRg3)~ ?;8<ɫ}#ژݨ'bJA7X>21v<٣e6b={ȷqV(-~^~gނ]HL>q/lZ[ز(^ u4_ ͱX_Q]+W:SPޒn9۵jdoQ  1 Ȟ5Yٽ)ǚC!yvGjh_! aBَHI~Rjt =Ͼ@2SlR'o߻(kIxN`,E^+ 4@3ޡC<:qQ4p;7lgX~w=DC{GJ%ogaUx4B]<ϰr@PNi4ꨵ?i(GMg &8;;ijkuUPI*~6~d'繸/$bͧjhNnA/i/k瘧_Su!~}SeN\ׂ̣+Kgc~Iٞ.s~|YN^v_kjY 6M342f+[ɇ'4 SsY<>1~F: _{L&cF5k-s 5Z8bnyYPzZB}\"mߪĬM懴\ep] -ajS)mEhت[(lxA`\#}i*Oy}r53JuHYvkU4+\ΰ\aP=f7a`pW$'>YPE9yJ8ſ9 Zwtq2eK Z*r˝`CQ/C!)U>#\&2.9,*73lӪ#[,$SkFѪroE3,wGrWKH;ɥK`It[2].^`6㢹 uiRepIRUǠߊqAn z n{mpȇ/kN9e2EXĸ$s wM 566+[Y2-vc"GE~_"?(<"rX<N[C"E|#21|U٢>M!_TH\3O%'#nD>@}DyGdN)EySn|]dk""6"[D^<_yA<yNYgD6<-ȓ"Dl yygc"lyDdCe!EIEyPK/Vd}"E[KN"t+DY.rm""YKEn)Qd$ATzD2 j"KD,JJ" D\!2Or"sDfCDf]!DEf.2Md"D&L)))Td8"ɯl'rE"EF!+2\dP!" $2PdHHHHHH4~"}E.#[H&=!=Dt*EH'E:*1&J"Eډ9OHksERD+U6ݲq/HxzEIi!\$AHS&"EEg}z"q"uE%#-yFxDLCDDHDNT9!r\mcꉴȯ",ȏ"?9,w"ߊ9(;P|#2LZd_e|W"_Vg@τ\,ȧِOD|,YH2P2@}$w%;"Dvy[-IdR"^O" ^mRo̶$ "ϋ<'ddY~Z~JIMr'D*E*~E(0j}/ogds4ϳ5˒-ɒ-[O&c<*f4!@[c!iK [GG{ksa7 =2bzx0C7Ѓ#>F "7)SS#K:9rt79.BwACnJ23o&gDC/.r J+#@׏]7_ t~};#%@WLμr97y?< x<ເ Q7<x{qk]w p;`76[_,_ p#` 9}>#}x-rQ;Ft/bLhӈFB'З]DBB:P5:BiBjU"$Qa=$'%!&"$EB}~*.'n,^p?Eݸh?Eا]L޵ tts/wcQǾqcȱ߈f. m޴isdS^Cg0Û;7!8% Ms'm^6 ׀7{S N+mr_B_ ! BMk%b QB ^dBuԏΞ]R!{iTJ WԱfkVKo`z5mͲ<_t({}1 tlXeҸ59蕴L&z=Q:H%&*(\_UI&4/4b^;[*7t%%˩'KU]T*aKDLf{3펠v؁ǟ( QX>&t%{CNءP)$Jjh\u]VL~ݏ&KȃMv2 |?ȫNE'n׬@FJi áRKi?lS@iA:|^Sci}ڌ$ZSVԀd &]c &ۯ=r2$88'a<ϷU#E~[q˔j(X&q2v 사U8#*TnMFn/l0rbǕ:^2gި{aU])L'Z _}V`[FA$սUf|T%Q6 E"04K@IiPRy"Pl5UDbd(jN5T`󲏺+*Ԝ-oh0GgEj焲15=8YOtԸ欟ٵPeUj.}>`S1kbnܚT1 ?J=VxJ7bGȍipLg!`}:k|~ncc$v ʯWPM@}c/`;i,"VH9cWr{^::3ISUѶsZfc .jYSpB {hM>xB[ulZ{ [o<ڍ߼*-1GC(XӞM"@ -HI!.^[n~6)@gw CO=yv{}'㜖t~OϾY{_x۪J;Bymq Ü`NhmQ%וJaNVFd}*kxHAuRKA-q+zqq>"J} '".Iԃ)yݚӚ0=N%ˆF$PlVmԌ^#:` w*lxfE? `=t03~}N?8c ]ޒA1_S4ǔΗ JrR`*LaA(r\QCw^XWrR-:0cUo/^rlq-/웱:*H&7 ]-֟3ؓDgO c(?8LUG'?ҝR2񫂼bʨue&MGtpȝH$En%$L/[=wΑ$V,xG:{=u=Kdoyg |;љR2G*-S,q-Fu~wW$S*o:|ru>>UQ5: JwA+ÂЪtgY(Ը%R( Im)?q|,Șlk4>.`1%STUd$d>m3,ۢ>oՄv|H(FG}[j7'֛:Ǘp9Y#=;8 h3"#@q~`'rr*[ 5[dĔ) sww]wKv._qes ~{OZ-3ڶ=o]z8Mb Gz>ap(ʑƟ%$̑R̥A+L^HkL>l,L{zNMW`D Q[ʳc񖮲7gRvԐ]5iE7b2SӲ+g/ 6Oc&?.y FTG5eaXfM0v5$DXh5|r\dc49|vm2TU UKlUᾂ Nδ۾ Ɋ"nL}kjj^Łi]ٙfu<2|j 4锡t[t"eV ikK5O iÅl}㾄/!p QkGU?cCA$ T(̰I9=2FS;$\1vk,G˞D`FOOץ W~oլM < 2ٳ-Ymw\+>gxϢҞ&LB32[DĈ!ֽzyq5w[etyQWʻCnS)P\7f6*N:BVUy]l-I!w;`H9hsc&ؑXQYS1iObwrS8R)$s3N?eؤ2K806]"hS,1}SWhEo4շ^ufݖm]37Bhil'V !on85]" +xFݢV4 5}ᾸgNE,-13 o-tZ643?}I>aL! ru'q|322odzNH+ }D ΪiU9mI'c5v.p*i٫bFF>PI$*:ɡε|eF t'/tfU'C̯&DbAfjfYu=Jq3lC&IsԦsx1+X8]wԍFS26}' ]B>oj֔d7 .QrVE&AK!.,5"CAZeԚ(ՠ 3"9/lĥ b}$\Q5ƭ,gěWu&չ2kyensKʹ3mKzǮL.ԕeY֗t׊*l߭0nT]$F(49WYv! ~D>IJ$S]9OUR]qd|$/1}WVk.]RuIa*}A=̺䡕YFѫ5ʵdW6 2vkVVkۓQeZb ;niRpq0/w $PKCcFӹ[t*Å}M';]® 4?5fS ́ 5KYsXfעPr-:5iԪT܈A[6ZLЊS9j״6S+&U[+Ω=?ԄAnwDP%Wu:w9~:RŎbɹr]9m+fjRP]Utgg2cFY,sboEJ0JYf8Ah/(QXJ7 FƆqz(ߝǥ^5LnLI*i1su[\%J-Q-__IkkKo%N&+i>rƣ/j!ױ%QJa "ٲ20?CMhZF[1d팫jG+.rS~OG @!@ G OͤLjvJ,yI,&1F l]o p8Jnf~3N}/ͤٙo~ЩLANUqRFS>s+l pU+7QU 3 J&<`TgU~ 2 _vnm~lx7΍iqW$x5+ w)ƐAO֯[X]:9KzfyO0YC 3'|jwCMdկzWͻ4S˳X"insf|~E輥NurF^G tQ!e#~^~iq(+}-N 0ɥqΟ^p3TxIg`^>]ҁj!Bg\۶d{SPzj|F{ec໳:aWWa}qjd2 7S!gC.Ej;ca]p92ԶGk7f&l}F wնu֧tVTսFA>tȍO઻KBmͤ!Vu+鴩3yG"Ttkeٟ>;D .AʞS)^Ɇ>:'D^^e;m0j{+@APsQ< r|ӣL%#|cr{|ޢәza52gthojmLrd~?jw]S ϐOK- ?wobi rxRIseҰkfᜄ&\tR4xsYunO)4u ~k[$5Н9j|CB N'&e%WC ,<;f46)?ŃM c։YqZ |8W^rUdE>"J>7?q5pm6z}k=q%6f ځX9ДHY7>u]G/kg\>zu}Ѳus+歃Y^"e5;e7}(G.Uf%qGQhӹ̠r8րCSD< #*G1A2P: 2;V~eA({\S6+aYrN5*Wԕ]:y8/XfdKJ'ʾ:-ѻ }8WX <( sq1Q0y|ם91PJ 6C~*-O e$)}"~Doqj 0 T[kW8Kͼ_P>~&.1#bdrN0?ަ?ٷOU"lU ;ɕU Tf˕vWYR&?@jԃ"zlO+ouqKZF-|D̤L">.窮gtTV3SB٦ZdS3i%jwceeWN_aUD#+g#6ao8@ls?_U ecv7sCkO0PrY[<$4nt_83 WMqg3ü">곃:;Z8;xzw |o௟ euȯ?Q!vo/"(ρWT^F(q?b #| _1%6EL]eNuvš`L 䘑-*2cV]*'iʜQrݮZr$͎˨1iiV 4JV5*HwJ"mU+;o*jН_9+5|vgi#f?o[Y6jAk._DuM7sWw&ڷEgKІ_ f/|<*fkMgV endstream endobj 487 0 obj <>stream hTP=o [N%BK~uI@ (g?Ҽ6%L z-f27Ju&mhfx˔pl|)O]WY$L;3/P ,_t|#+lDj,NQ$ZqT;ɻ֛Ml/BMTKQe[URvm(;^*V12<'m endstream endobj 488 0 obj <>stream h޴ |TMrbLJ)]tZJdP@T"( "MT6AQ}*CA@dKN{/IN䞜,%i q5^ 9rgj{g#sƎqH$V 5h+'SV9*?hYpܣD pfD5 AE =x\H"*$jbȜl^#s>0V>KM_$/IHץ졯o;~M?A:x~)G0/soa^H]1Oi:ǟRKtc>ĸݨn1Epb2j]F=ha6R P`\<0L/Wva/~Sm}[~k -%-}|s_ms|]wTOn+RjjlDv {;m׭|PQӽRw/?#7ot*kJR@OvS-g'MZ3[/@@3&Vօ#ceFnKC6קw/ǧݺvܩcڶIOKMi*eb6i\ڱ1Ѯ;jVP6R!jfyE]xveC$:!jS4י9LFʁR&S&4"Lw9_^LsyYE#*Ӝ^#˙m3vp^zV MuQ~haykF aӛLWniQQ-T]J:tY!3?ns3#V\<xz^toٺ:4o Gsqto] QkDy w$ۖX1Iy+6~BPC_T듩?)Gzu=^b6b*T1S1ٳ\Qҳ߱xwǡo ~ج9JK[79 l]C, zQ du;Bv[/=M˙毠*ݽCR#zx+SbzkfEtGFy=h>˝Q9E'\xb՛;bBn= pDDDtPhJmDR bP" cR۩(DJvoHPY?PgznZPjK+L`Q.cBP^R7ە0ջ1ձ{/m{('C^Bt R1ԍ t`bμWI3+Cxv7 5 jJ;ZQU];UUIb xhUi]PaC:ԛF囮~\jrP"7``'ۻn|\Hqi兄^!.z_߇|u/Bk0ƺm(s#d|[k|XDMae@3ZhS=A6(+YHJԈ!­7 N0 p_!2>X!3X(DˇK*P~@9D 5 ' e\AE۝e6CZhM;#˝6yA_`D[YeΖ(Dt5[YjYF|6{6Eڮڶ̏K侉 WlV,Yl65`"U#n `<nHv'V 3GR+uekא+ȣ @ l"hL=c#wm ϖ#QҭbUj yGja ћZXy3@Gj -fV v=/?Sa˭0:x>72meGOțQw@e5.4^>rpJ#8hJ.&Н~bP,{P&FwlF*iy'#z fJb_yy㵈Y UD!%N`)Ҍ[#Ծ5P{A'Ut o%TRۨ.yӡG'HucbvfP7"cqs4˘@s)fciȦN!FdiqEAE$mfSO e'6=^VvaoMKEZ"PL6g`Zk"вW^j ZKR5?1l+xiިu*~&.~JUŽtȟ4Lۘ_e-߾b6}@X`(wy1]\t«HDoJ) }Ny74__$GR*S/YMX4cF$Ӭ\vymRChC`z[F7EmvR^2CZǝrg#.Ȏ Uv UB} [逍;9⩩c(9+m2tP e(hy=gގjlT ƆkAPus܏oO/Ƃmd*E@Ȗ+xQcJmkk+`G|O)ßAx$k$շ=h}V;F1fZOȣqH?HV*; Tx Sc"56;\Npk)憡s.bX~d5"X/{JxhyHcA#زTW(>hBspLe12JO aTZ> /~YJAc~o"gP r(ﯰ~Tvt=&5[^Nd-Fg_"ZvNz5^;*̷G1o/ ?HG^`;iN zFQ*2c,[gO?BA<{M8c!7C}L),bO?F}<:u:xyG̹*u,$X9cSsV;J yRJX۴ `$'׬54^tB:({CjδR7H~{7`:XXkpC'\+lQ?ٿQ4dr;Y ̩qSyXeJ&7aU)%aEnT3~bYȗRXچ,OXȍ փZv/v3k,k}w ؈S;&aNP)%3L`O+{roimv=l5ohkwxK.^Z~ ѐF8H@c~:dѾ]\& yi>-;ꟷe%cUmTRճPd}uiBc/_J!6 rC=K ?5)>h>Te@.h) )rcXj6*h+<h jɿܱH}`} Ǩjpyy8O5 ʊ?5yθF I#7|* YdHyHIMȀ-A p7P\NkapWFШ&n7z t <:ۋw \Pmaæ!lO(K $G39p |kȺQQ2Iߡ۬xi8֭XMVs41^x}|tB~! S9sAZa y:%5j= Gl稁zg:Ƽ#T㯪zkj g5lj}YX5LN C#9mwݍR 9KhXw{4ps /O۴-Ժ4y x"g 2>;>3 tMf;-h.^>+:hP]X{Qf6Njb^XLF[6h [oSp{BVR{l*쯟j/\_M0ߝ}ENcm9FD;8[Vr=߼w kj?WI=ߖ/*W& -O>'Y}|5s Te+Er85yzuXn1NѰ_6,9R!Sgiy l s5MRRѠ,uZv%0a3z`]m5v㲯9Ŀ,/f $"{au޲oO}'}A÷By[oٻ Ϋ:~ڛƋ|qX y.Pu3rB1Ksja :,u`Um)Ge>KwQaR52Qp>zN D>߷Z=ߖW9Ml<_pnj|OJ<}mƒΉlSL{/ &I)fz/l%P.* :]^cv#Dg3׷4OV4Zr1O):^=(k.xG{m@WI js.ך ON6zIUoqtg(-&j+R|穢5~Ҽ$m$_Cy<˿ҫl<0?&/q9x/k v}9^1y'R-E<P;%7tH_s.`l\BCj>w7ɩڶNV?tZwSe/ ~vz y诧^cDw; ܞ7B#tcZ`N!O>6pRn+6q?݉24_EZSJkKu(3a zS^W54 kg%4}i}(i:5&PouYܳ)ѫ`:-<7MB{O&أkZǶR#cv9y Ie|-%*'YC4F|jfX w-oG_Fu~XFb(r$q*ovx k-ݏV`m÷.m95Qd:cwɀ}ʙkX̡F o܅o"C]05lՖL؂+tB>kIX9;KOlu^m\BkuVfqJ80 }~;{#tZG:b9 '5}' /lG֌^Td+FC0Ug ]D@7C[Rʍ)ý SDzUGIX7ou_G%qv{S.pKH=0+xwbni3` {_~DY}1m@ܟ,"YvQp&ڿG(G7ym)ysdǼ:SK ^mW = x3\Pbdwރ> h8/MizeTbJ~/ǟ9yJ[+[ 9tr֤,8agwC ֚{huf} 6}s7h/ }7焕M Ÿ#M^q~ M_>@{5vn y?v~ 0Cb(`|=Bu_HQPIRd=ӳ[* *=E=@==hpÏ(DvV &=ړP:xw(v8?vmWݻo5&뽤P 7nw|cݶ?m=7ZƀaNߗ7n'sz̞;vS}n}YZm}_'A]`N}3K߹uHjO\7NuYu`~Cnww z>iu,M#e*@uoP&[E76uq6εߥMɣ5gQ2ޠYu]#u?$CUSU6ez!:*ugɵb:MXX.Xk}#t| PڊfŘNvڛ_;L߅" aar6Qj eϏLȟ8u2O󪭰Υ ?# ?Jg],-rg8Qw; m^}'A7@{+OPG%Fnk$a[U TW !m=g6C,Se۩=Siv"\ [QZ-+}Sw!i5;׺:Ӣh&݁T*T2Q^](yQF[}ڪi)4;p5 emǚIzP),p{@VOȺ?#ʨh*]6;^סE>XE&͡3f^Э[+O oi5iCHjX@u꘧չ%rjGJt򰨅H,u/ϊx:f.c~"+2#A C?(KqԣX&i>KE]C|ԋ7GԢ`:x0:ګepU8,/;^Gs)l,W;cl|#w8!_R/ de( iIwenI&Wߑ\ku7k#%uZOuqŸC&^QgK}ư:#̐w/z&$2ZMUqSK{3fL2L23dB6Ba KP@FPh-"mZ[mjڢ*oݣBf?w Y-}?wysy =xǩNoل|#im;N=\w@ޕ9oJ{=Op^˛N1Ԧgi!S?pɉK# h)Hn&%tQC22Gз3ZBޝsL '}sz]ToeD?7hPO} ȊwA#% (*-Ղ@`Ǒ{2 '*KjTwFFQɑnAvgmT2J-A OT..)&Ӡ3AП@W±rTrOZ˨0*} sq:y1*7c8 un=ޣ$G1<}G  zC<Ϩ ۧm @Y\5{XOm= 4-Y>?Og~}@WY_~ډOIZ2MZ&I,#3jd$3z$PI~='|͜ 2`܎@ߌM:Y~[ c"g©j }O~~eebc/5Yn}EAs>D}kT ؉X=\X;h," ܃ D8v aEX93ˆ0 Cgo"@C*o/# ~x "Wӈ_"GGAK;o"^FAq EvkK#CE<qq/ķ~5·"nF@,G\/O f#f!f"f nAt#:ALClCLGt mi kELEND+]-BP#T%B#d)B#z"t'NЗ ŒA .;?!F<r 4$z?B<؇d/A#CZFJK"[DEx:#~-z $⧈ @<8xC!x?h=;#v!v߁؈؀XqbG|DB "C"?‹p#\'Ž BG3z䧈O#!>@xz"^DF]9ij_ ~ď FE8H%D #!;⧘~x8V4 m3:f@tV:4$砟= :!a)1! h?Ǡ=zC@z=A}mз@}thZ@@;Anz:+a;]n]tb)a;w5h՜ C܎mPv!v"v q b;bf4D wlCLE"Z͈&D#b aP1PCXaB ЗCGZ"UL砿>)o@-''@A@߅^:b qreňE>D1"f"""D!"! >q8Fw+4Gj}A.ztPcC<2qFlC#D|M]=;w#@,@CE" f#f!f"f D7 щ@yh\DG^FN4aG0A!Hn/@I<?@}}{wA{ 6@/~: %ysgA=:>: "cq/;oc| q눯 Bh-7"6#6!n@ G\؈؀XяXXX q5b%bb9b UJDQ(Eı KJ!GR#!B0pzU+Ag@ElHW+_tȾ ojޜqĦ d n`7oL\oc٨H74_XڄZR?vw?O>ɪK+7Oi}'aGD޸yub; fguj$Ů&VZMIV{zSc5zj]Xټ" RY+"&taG)bJhВ}KW.K\ТP_bAh^by9}sC3Db_O;ԙיMKL}SD˾f)ԘB!6ʶYWYUֳO*˧jT6vhPcٕs_"AKW7U*PŪ^TU1~إO_Aw((>Q* r9!_ ZN+>d塢FjeteXV#ѻd$+ EYX#.IIVmD<*X1|b074 ITh!A8'y${CѮ{xWsDbNffi$sA99cQgz=Sl  zPO_ӿ& Y k篁#k$r]Cp'~?mQpM:}l w lj۞ ܧ5Yž  p@/SD ! ᠸH f(oOweUdg!j^yo~x >ʰ2ʰ,.*$UNUZZ9%nWKJH5U Qn+USj:QSQ8;Jjai.js$ẀZf }&P?^皲zEB"u\AǓ'??i8*|ZA&x"f[aM뵪d \.-Z!vWu&YVL.R&K }IPOci #Ӎt1+ůĬC^GxVfInEx<1@Y+vi3a` ]JhTmR'x@XSS.  Ԇ2S0> eQQ9*++*4# g{\(?i_IĮ1ܤGK|&1N.PʂJ֊ޚh:K$/xP)'\#f<7sJ'i^s*'FbD#:bzȫ|PMBLEP:bU=\5`0l Dπ]8v1#6Z3n׀?:YC|ߟINkF#z03TE Z)Sߺ9lpU6]D _(ٹkVXk_Ɓy^v2Ym77^ylu[n|}۬~K;11~BPì(aW* Qt:?Ċp1|}]w?MᮘSSGVK­SRڮl[Z^+~Buqw,?r[tvM۠o+mh[qĖJN/If~豊#_s vXdG8qEHT9pɓ!ԫ3l8hX",M.vԆVTJ `G\4['ļǷyN}V-z}mjN+y}NHgs{ρ= !OCw:d2ָtfhКìӌQ5%k C42pݗـ ZFf7;RF v(3Y\D|/׭O=W \0Ub+߯VyFV?'̐HbY(kebηBt60!ԇaa.a@X<3}:ݓG9\ElS=_i*bQ/{咃{ ϭOG>@ ߟı$$h42DLuN HtagGF#bBUWq r^=MrOw~LD̦oֈ_hPSjjȽo(E~ Wt|B(=qa=vʠbߺpƜY玤h_UMy<5 k&PJ B #˦%$ e^T!qu$=7dŅA.X h7>S}zC 1Kݫ] 9Mz[)-v"6vHU,[Cnw(tv׆cj-zcdžc7Ԧ>0W.luQ]@eZ4cBآӏm*YȚUoݵ-ZSw-;A>UvhMWR& G UGH(a0kIp*S6FeK0k`y |lٗS:GM)]1*Is+P0T9X_Y4KJ7/ ᐀#/l xs~e]=`"xhEB)/@ |V YmK6 XR(:* emTz*;i=ِb 3 ku O(ȋByUy]ӹK6Gܜw;𞖁KY+9{ê9f5RлbIRi̼7jrЭIl9 M}PQ5D gVe«*i ER〆n:'ͺTY PVqG|WN,(qh,uO|L)UuJ<핞[^_2QnaL 7W̮{*NZi6ՙZMy:K$֯rVrkx;ŦhIWNb.V엑$䖚&<,ԸPEHF(aY,RKFad&]5\z[n31> 'ӫGk 0jG;SL*ცmqn[Y!*$ !u9W4D=J5 %Z2Dft[6 sC+ϼ>Y2HJ՜-㧬zCfZ@B"6/cUvQ@YusVO5#VݽP !zɝ(k,5Dƀ=*Sw9} 6s5S:tjvK}g-Xk+)0[EuǪ%*pK,e,5ORJ] geVZ%aFy[%jlhI4p8饂?5əWׅ }ufb7LH HIp厙=7` C ( TOP3GzFQ*)0ӫe0t!kS[s6F,CK=h$vH59%/3,P1=~(&h 'pqCZr!֛ip +2؂~l ]UڬTXrb]UtzYJ,Tم1ĺ߻$b<6rB-ttXwh4)po,5+x+|(ivO3o\qο|o"BȗrcZ%ct-CE#U(Vop(e Lvq^(-KTbc,SEj%wM0VrsHɤZi YJNkgڋgpާhrxE| QY[%Z;ȋ |%O 4ok ,qͥS,0/%JRټ$N:dڢVKTV5qC-ɵ* Ë;zaZmh-Vi2ц!7kִs?.UOsTkڈ!d%bͦ2d*4ۙs_&W` ͌0EAf&7jQ'lbtEzǵ4#&{bB0Lf`^3-iefIQ:-61Xҽp]U."ՙ\ &콪qAzMn`ƈ_,qC+X)>?NkPӚ;DO& >M.|±Ԉ_^Ƕ{oߴ4{oZW[`[\W[3."7S{m˃YĤ*9KbYQf0D5h;A!eV`uG%NTU$Gm?~yk|2uPNN1%v?mwEyZk*)}az[Ȩ-/VZԊlhct}W;6<>X9Hlh'&1jWVXwyVI 5Or/8w hL,a2F*sG q&6ٷ6+z` $$!"K)HIYiHL2IɖdVj7vvk]qяĉe?ʮ$VUpmnq+e9ț@U>Lwgu&<ٓ(a5ZR>lWx=JM߫'&}`uGG{fZiԲnm{&#P 7xΔhU3[oA&v*#F-mDtG]lq*2|ȦbeqS. 8ϭM[>3^;iywJӳle:wm>J.wNpF4}a^6hUJia L 5q{WpnH7^FQ_vn_B4uPך T:젶W%[]o/c~|iJ^-џׯe&ǢҸl@, Iҫr+źRp̡$YyjpcW" 7NוWj ,%X_֘-B2hq[7q84/d‹+)rPY|:,|s}U;K>tϤu9 #-Iٟ񆲿bri>"Y}Vf>FqV⪭]4'VC_̰:j  L}b_;G}Y_ g\h8:Q(z%FPFV@YdM*Gt\fנfm8>1Ӳ9@#; F:]עrbgQ_J=Nk{tWCc&MLfO<5q$z2xRnʈ @**%sěMfp#A+ӄf4"h5#$;=؝uy s5ϬbG| 4Ԡ13GYo %±&}I΋ͮrr&/?jR5aa=VQf^064ކꆻ5465G낝c#Wگ0ʐϬКvQ7ٶdlnQG  c;{:N"൛Q+Q5LFQ] @JC+ʹϑuu0vD "wߦH\dr)(K0IKwQX&j)]䉸W*W\,}[: ڻ8Cٙ*SΎפ< 1-ԧ{jٷZeq~e6SaSE%EGօ_Ѳض8^xiW'OJEո:.ROPO}yBw:gS9Z'nbLzi.Bkmh aZi'+Pvi-2DN Tk7dnvLf*:Oo7_ht5jcw!P}ٕ{r0pLYL9ed'Tu|;Va`mHծ-dgO eb=+^t7 t@^Wj6b(/%ioe%Q Y<< h@s?C6QSZvsümև%HX;lz*:^ޡmաbh ?tk U.!rDCtCգĭ $HvCO?d ur h_6(` $H A $H A $H A $H A $H A $HP@ăfOr_C}FC;˪FBP8ڠz`3u`O8}艓xIl#Cdس)r%!gir(2He'% ȑ 1HB:KFE.da+67v^qM&`0L|:GX>m  6;67R}+<6俓AJ??Ϳ' `@ jЃ < sp~oMDK(/"GԀ_{ZF~FK\青Z1MhiŴm4-d2Vh|/Ή|Ż^ǰQŚ]xهe9 #f68i˄ қѸ?T=C7ˉϏ哉$%72=53><5=<@n ?0636}tl4ӓvNMbfdK ?N[NSG #SOfbGfQ_+#GNySE-3WĪ >stream h޴|Tϝ{7$BqK!^, $@hD RTDAХH&*O&iv6!"?̜)w3gJ KIRvl݇qvM:^95Qb=sM%چ4Y=NB$k z}DaVA~gR+X9 $pˎI DW$?5h˨OkԡT)H&> v0.D0Z&Qz_jtRWZ%cc>v@Mf!t9#L3}Jh3e#2end8FY~7EMyڻD&BMJf"TJDߕȢ|^wwwBa:oҋyy5TaYK9.:{?.Ux4 u^ 4F 4`4GBUM)4 I4ޤh6͡hy4Yױcһ>"z>t !Nf>$![b<ŽW*Z$Ox-v7g>/Ы[}1-mmm5Xh7}9F.T'*MR]5n6 &;Μ؋R~՚GwĨvSt7ӭ|'t/TݏݗS6~QRv4;j{Eo>;I7j;j-b.B_]AA ?H.,u5:>~17F jtnb~F5E*VB+38O:mƋ^à;7aAa!FASK|`T1RqAZ_9 aFQ(=\Qڎ)1JAV( } LJVxH&ӈ5N2yȮhT2ՍiDij $QFQneFFFXi=l6},d[Xk~Ԗҩ 5OowTNڧkۦu-7kڤqJrRb ׫[vUz|E rX̠W ':#]Mƪ+A Qi< ̙;eR̓22!'挣g.\gtld9_D@(L);12)C{gd$!IZo|A+)VLUS#"ZFI,q貜}TisE̦օQ{zdvNLd)ՎF=/!*Ա Kh"W= +ͩ5>]EO懘N5O{Opu@9PіHX6Û+6SCF,L6[n{,0pHGsxmᴉ-l1ʎ{ ,Tm/8z#;kAs-#l3O3,-. Z*# вw^ R> =2l i(RtFXIϱIAwN^|d1sI-5(<_r+ArFS9a^Mɠ=Vz6 @6 iD5k5 -΀F9Pv3DÞon(4Zk4ÊDOh [_bOo{.uI@&ǜ9Uo*? {/vs֗/m+[W_eK =0Oɵ y]˵_ʡ*^ Xh:މ&``# 0*9ZB”?=3;}}qzTMPAgbT1Nυ9Zb 8֚bԒj^Ojkm-7<z7ĩwh)"n"'~vbXFS &'ŷST 5GQTi/(Vk gH#ă=rhbx)2F'xw~g+Bi=^{HSܻS?y[&)iw?=TfMI[= eN'$ԥ:Hs|++l@Y0 )F *pGC}OcQTE{MQFmVmU/ͯu Kvzg ͷ~Y{2 `\7qT@Y1Pݸ%/! }D,y٘EE - )C2tESzJ3Yؘx#J5HeCF0V`8ρ`5zWT[}aN]WWOB> vq*Lw|l`>cmUE(Bo_d>pi8֭XߍQs0u6k܎xw|zT AR:ϫRsoX5t~=k7+z?*0uB^PN;X둯+Au[]𰣡c>=o均0BpXm_KڰA }| 1kհTFun"ڻs|uN?ȡ-6s>&4պy r%\g r}v/a@A- 9rgM4}{<3wي5YyJ_ћUk1h˺)b^MnțjuD~"9E^ ?Ezo<֖CrmG/| `@[{namWg5)P=Uz߶@Jy{9A:W:OU+XCP7@C eːų[Xx N+ϣ`s7A؜hZEض^]Ij^i:XShW> 1{}|*h9^ȵ\-ɾ^G~9`Oy7.e۽J< p \{ۜZeU]QV{x vt= *[`sA)ʜ }~NVPUml2 EYtϭ*ӣl8u=w\cM6bS6ϰSBOFjGrt:Ɇ͙MՃ`c/C_Eq'c3`[9-͘9m;i%-oVqJ{ ,vK{0F<-#k1q]oWS}P{v=_qs*5o˟H9W賭b":m–CE`|Z*T ,j?F׵#q;.TyS;?g”|ϷeIv{C{(׀9060|齉v瀏}?x%(G4m\GEM5|vf_~ [# 7I7*$D;ch@o4[:S66}}ʟ;iѾӍh4XEXSvڒ?BEd0]|-ʫGY,ʱb1oE/XqZ"~vQ.5%'wi:V5kAQgՋi^Is'`wÿ*Z@z/Fc{2.^{z{au-x aK1!WByDJruϣ8 @!O9 L]On(.KnC}4=l~[1g%Fc<-wW:9kRua'ʟw֚{h8o}h#Ka{) +߀mO߹l\IY3` Azo!F AoP\Dx>\7fAj9W I2MWgTӑuw .A{;,oaU4 eTLk5ͧ`o{}mMs-w)fmr+w Ya์7c uǺ!v*)zZkQoh:31tE,KR̾C:>(EMdAS?GQƇfwZ 'z3UXX s{yB" 7~9E-j+s/?.{z'sݙ>EA}z۟e?w~zMӪ*Z^oC B_5.u??I'Vid,z zdŘu?պFvjw硧(wmhȂ=W tF?VT(aVKrw']Heͼεnnδ(Ҿ~n3ս}Qu/%{%WE'ڧ-Cm0&'c.mX3BϪ31.Y[l_<D!u7mxP;æ7`kJXV\?c(Ȍ)#t[P-s_NKDeL|vԑCTy`7Z=ګ=UfKpS+TqT^w%9fPޭYSrTQnw|S}f %QF\}Gr$ۭ zʷ]hu?ƍ3Jk{J23UR %;鵠TJ5+P[V.=0}}m?:xB:! +_y\T ̰+ "nȠb:""F 5EƭHʺu+62(q KS+-SKˬ4Mm\]32}=?s_3/GXn1l/Ď^\}`%mb\} Wʥ';]q`"9H(9b< -2\BϢhv|u s֠ Яu *--KL'=#|WWaƶ\P4zb4!z=W_Ǹ%pȼ_ 1O}u Iee̻_5LLk;nlۃX? W/ՕS֟y'ך!cQ;C{?VrH{^<;0,T}p_zlk`뾌<%#aL~WۂkD4G8HXC5h±V ވQ{_s6\ >Э z.t\?{?ΧF p,:ίu1kQO5kUjc'LZ1Ek ZLj-׾^m%N=uۂsӲT?Ik@UI6gzθ&<} {$4E}m2LO}o0r;Yz,&NwT_p &7n:b#VOH,"1=i̶6)9INOqr|B>&!9B'!.9HM"{ɛ :M^qGP6L^&[%` L67E嶦tFz${ne;LTE.ȯ3H.ct |D>$Gd%e>9LͤS4YEQl},"&U{LRIf OƑd &I2KF<2EpK"H H 'a$`b!fb"A$BIn'g]KÓ~rCwr/$#fFKn IFP CH&#$D(ލs,#$0ƙnCcOGt . E1 hڎ^A38Kp"9؏ L9)#I))!TRLޤ)I%vNėl kH! "m6vힽͻ, 'wX"XG'kאj,y@R,옅qdK[v9ʂ::%..N5-grk|0?|0/g2q8G R ]_~rBWֵu]]o]Pu]R8hQ7\RT ΎBSNq)aMΎ]՝c69)ߒST7V)rf*fdECH,r :$R϶^7)%Jic2>U)OQ쓔ɍqX?^(h{RИG*#}=W1W oQFPIxoW'Uǝ'W^Ĉ Ѳ7oQ Q+6DX rPuh}TR"q 9bBVHJg)\Y ,N{f9\d2.;#jJ5RMLy&$:LlcAAyAEA ԩk;Rp.&[E( b0s!FX"/l}DLptrrn o&ަ#BM2a⸍xFQR?w/Z$d6ō״*n|nS=BB5ZNZzq ]=5P%׸m5㺒55k?jG(G}dA/{F!CP1BޖȔHp(6 `ōPWΏ1TYFPtI'O玞 =گ_jjbHBpd4&vK}铞6P.%v0N{ %ӻ;[S-yr4ۖU/$EZCbObt`jfPS\jb]}_羙euho3maKkBt0ck'K>+c YW!}JG3J>~kb{dć'Ņ,&k5C-{Aqs%ғ B & B[ !vøus¸sbA Iِ}ʆHiinjX,ROc|$[xD51NW[q* fa=neA(ުFa6Di1mY mـ$me!U-mYzmYڲe_!MaY2G*ЖqvFhmBp׏S)` oלZ} ;eKeB}mT幞EXU_F endstream endobj 490 0 obj <>stream hj`'P`  ( endstream endobj 491 0 obj <>stream hTP1n0 :Hv0PAvW$PS-}$IЁ$x᎔!A؛#,g6AQu&nݚͨDn)P<y+^'[dGCwB9_"(k yG|ʵ/6uoq k*K}+HƺGxlZ ϼ|݈H >d*z+j endstream endobj 492 0 obj <>stream h޴`TS7 -@ذ$ (nh&H7F#\{QQ7k+` *"bžyg~@_>Oh/i?}E_!Η*7}q/dGH5Ԣ脦rp%ZolղEY/YǓpz46G{ O[ _յ[#BRuSPwd_\~V;_wtH = ZyTH˵/ 4"3p5-G?a~~879>tN+llDY }F+M5JLliQZiմZ ->CbC!5 ",Zjku0^k D$5 k q#ģ5RTXL b Bk][jm4\_u:ji w;! BE4N[Gw*9W3z|Æ vJ CՄ5l(!/9Y-Toqn*JSzZ|^ BC!!dTߜI}ܭ[Cg$pB'+mחBm1YTCח)dpxELIT2_Ll<ʗ%.-0uNTz=RUAl1$QBc)Ք!ns_#ND^C}2u)17}/<}~:,0L`Ɛ,7tce>ݑZ` *+;OKԷ#1WŤ17Ҋ m ܍ pN\pw Ϲ2-D9Rր+1'u| 0nP0ߤh+qj1D,>D ~`lJ}#^BW`,CM/] nq=._Qkc-?;Rר+*7rgj~9H{W;NF24}gWx ^q:3nCǥtUb| kaGE]!`-٠/"8|Y]fUHC4}GGS~6jw\w߼'m\m' }Ӑ6E/lsLOvJg_lO6F+b-+Aґ`8F[?#v+,\gYa!un1Iup Sy }YcؕO=}Pxv3 WlwnX9-*1 ;lk9}h"h [;GKKr0KnN/a׫J{6O /mM< 14K#1ǜ[8|Mjsczv"ވsYهd,s6X 4PEYWMpO*p[\}/v5u WTLbM'.n _T߈F޳4WcW\Eߡp!L?wV–balK3DCHW>acV.1,XC42 s"s@ۍJ,bM19?Q/r%)Yb$cp'Ϟf-O} upq8g^3QS܂}b7/f0<^:n w"mJ~WfJ@[1#јKv xɫdK^(q 0X/P4JhGD]X^{v؞.3?G{15qGOY7Gu$iڢlqu '2cUGvk SNP?b `ʢR+'>ʔvUaV o4+8:-\u!?KctEZF<\ܧ(\{+>8E/r؇0 VM3y ewscXGd`5\%GM ? CP<Ega,!<#(z3yg ϧ "z' ,@3=]YR-kʵ2|=5f j!rϪL7iAw߈Ap^X^~؟{fgS*ꩧka;]ױ&,uUu.ga{lgs {\F̛TڋE6o6~i`c?E{Rh\ 2m}Ra1_UYCZܻFQǻvnYQFWr(ly#6ucZmSkޔ *+ _qq+W;*&'c=N3HD',P z*%~j߁JGef~lpO ij6J g#PgzMCߨ~ʹ\3D1ƌÚ'~}$DѴ]-P,+2? qs=J&s'`Ma|֓-`3o>3N3RR}+2$jç_={5 E=kn:gU"x&79:+&vD[\ζ:=Ay?Ut2}scC{O6ʞ< {bYwvfJB^$άz\Mcז̍4^Xs+<[6`[9ag%aD #ag$;qʸ#/oPO{r//xjs.rzqu/}C VhsĻ iQ/-!xMiЎ׫'JЎZe3Rdhk]n"cr̛v;6 q;x^7ƹƒ}Ry[G@`~rv9OR:O`Rr6Pwr{\c}Y>:GMѧ~&ܻJ2KѿnAVs_s r#K0^"=sѯ@_MP}0~:cy-yXi&ڹ\C9:usx/,SkSt\oZg58یX+uΧ-Fyxs>qW|/.AY_|s<4>߯^~u6xd~\PC}8_Qu?FkEuXH.c"쮞(h Zx['> } Fi؄xgdr 4/Ͳa/`0/79;`S&m0Gls lf I;Z94U]0\; yn:|::Sms&t~41ZE\?E~cqXσFS{9 U WՖ?P خUoM@p3[Կvk84k3?O ը46j'&k98cD] >C{ 0/nA8C%Ά}iU$敕_&HD*"W2UB-끞ߔ/Z[fr VEr_ Ğ[&U!}4QWc;bޑ<{efsR`tfj_}$bx'!Ύ Y<Ǒpۧԉ "'ky炚5JZ GSqb\ka,`ǬĜz`eTuݨgbmc=9m|1D>?a<~6C_}bϱV<>'$3&^_CS;k8gSgU҆59+}A Ah>h =V>Si*1Xהּ-8}8x!0L +.]#0LvvG߅{MCخvw vE՛7RtJ2j0&ݩ59{t dY fyZ ; 4 X3XFZ>f*{u:`>" l"ʢ,NJ qe~"~H[v"}ʅĕap3wr &:3Sa..Fp{" DG e''q Qg]lk"5VKv0S}30] :ECׁ 0QĿ}cXC߂a/f>o[iȹb#myngaD~5簖bjo `\ ;6̧\A{}ٮ8-"Kɶ;4P|잔$Laox?F}6ρ9{]'zlA[hezҩc0u ̙Y6bXo͊M`b"[ ^Q !)VK`2#26,2b 8ʜ~=`8d(_ `ɽa~ E"O1N, T|Ϝݦ(U\TLC))j++0guQqz"iL.E~U}Vo*D{}#بk""WdY{.YKQ.º F$v@}w1c%bOnyE?Ojd?%R+I,so,?1eY~`aC,߱'ECeokA7n8 K/X>(k˧,{Y>a#Y>`y==,Xeym[M,o˫,;Xlcy|%|YlayYgXfyRocyߨ= Y6<Ʋ2F QGXfYoqXֱeye ,q,ò埜n%,+XŲNκr;K)m,K9[Yna&bȍ,Y,dYr,Yee˵,YfdK15!3XLc2e2$Y&L`2*,cXFbɒoe ,Y ec2e@YrYgҗ%%%%%K:Ko^,=Yztg_+ KgN,Y:girK[)4lҚKKKYZ4g%%_;_Otz fi’ҘK"KC,Y$;;fZ,5YYjTgyFfXLEgXHXβTa9rO?m;o,rgXeY'x ߱'i߲'t|?!?! K/ ِ 9X|Ye33C89{,{XvbyN6g˛\,o^'d@^vpsfX^ay%Y^`yYoᬟ㬟eyiS,~rI'8Y6<Ʋe.]mnȣ,<;_wc̃:8eٲ%YF$. caclc+yp 9B66N!@SBBB[PڦmڄBS~~LfGgiWg?OjX3Aφ7 죒^*yJMrIzC ;I)TCJRI A CCgBeЧCRhSȾzw|Zj8.sN1 !p><* Ae%Ep< g> 68 8x G=` -}(` C 0 Џx !~i{I$i JZM4T54t'd$DRAȪ_Ooo[Wݳp||||/S`|;u5pݗi;IIސ _x eHj $ՓVHIHKIKHŤE$TC%hǓ>E!N4M"edƒ LHN$s-6ucpW/MraxzJS?ةtvu1)І`ȍʆz%b}dZP v(1=S*|>_wg>Dm.YiSl4Ii($|G[-_ u5+-feQi 6* JkRZ,.Sj%Zek \5Q]JURpS!_*S).27Q{WR,Ov/Kǣ=;ZzD̊4=rڵ4=Zԕ­]=ɲDM#'7/` rl{|wnIy6-$kg+u֫!kDYNX^:"[-z_s[\%V잓kg+rͮ9#dFlEl]ݱY\5 $ Whd8H'8Jp= _-T /3]Y)K|C\*鷗UR֭lVZYZ}i`K;4Zܯ܏L@#,HP/nz_.ku^Hi<\Io?KyU/,LfF6y3,Mg̞5x]98!SRfE͝a"հo\:lܳ<ҕׯ MɽrJ~[$12r4);k ӥIƎHwL'KtIsr`ntaud&:FDEɎts|qɆHe̞RpH sb.y,3/k`*1?X!RY{GƋh sad&kɪkf-{MpעmDe׊yQ Ճ@5Ql5r#-5Qu܆~=f 렳 /YmP}~ߪȧ׷6Ϊ&5xniNQ}w?牢cwƦzuӷhi4>]O7x.6S\Vrall UgXd쵡*kw8"΁6$Sg옚Qg>K ãl|E G:n^ets>`7t endstream endobj 493 0 obj <>stream hj`e endstream endobj 494 0 obj <>stream hTPn0 Stt4 nvE5%࿯: 2<ܑ؜r{bޑeႃ#(Jĭ[u2E=Ti8E^`uUdhH[sNH;#Ru {!:|A3hrM[6ȚJ)o>oKocj7>stream h \U0dIrC'BDQSs:HdR5+2S V5<jYY6f6OfZYׄ=k~w^{M{A !ڈy"zM`'b9y3+m'|߄ ),2][4eGF$ >B8ዊShz _߈4!zV+iB!Bܫ:-#a+ɝ^PxBfYyAY(ߠ!BӄZ*|Ͻ>}QpR˛Pz]Zt1:f!>ku=Gh WGi ٢O(J%֊w56Z<&5_t>אuZs^+BO>o^=VbFLh+4QW"_#tڣR5Z1GYōbY,B1tt bD],e)pb2#crgTιM,G{}VoGNRolWăb z|xLqM1bAFc]; ğ8$cj!Zghm ZhlZ!J^F9n\`ms6CA-h( Bk9 OeG;vC[i6.Q+6-bx5 uEqunGqąVכm:h.v`y wR'?UySb^/kbZ}ūMx(>?cb}Z|+~?"YGGWq~FO{85s'ub>Y{Mq2TG?ce[0}9$>a۾_ߎֳGbK'M"{BV3c|zZ긱cF_:j䈔KÇ 2A\?Wt]#/ڱCpvm|}0#kg=9vD˰= QӸl9F2[,H頔ƔZmӖd$muZV~i=:hцv5ТDK˱%gU%$"6 螢& l8Ww{Y}f{5xuY"r]RIaFH0r&lŲb箪9QmN%'UY:Dz]=2U.p'&lTZ4OdV@l1 ie Ǖ(JEDȲ,s:)lj#&*ӥ#ԑ3yH9UI9;(5o-'Z/\9T;]DG.5w ŲR{= &8i§:&\1I\D*˞&?g Ws)]|B3,DeڝrP7*_ͩY2eo!–{FwA٣ClN-Ld Y>X"R!<5!%,"3~NR0.OߔW0"DihZ- Tfp9˩˶ ٝ)%w.tdcD^ 8^`ϴc 99ed[;*>*5i6Bt|`1v.=09*L7S<PmUQU2g;g(l}Pc߮#r 2S=9n %WֹMq8ʒr.yGWӝCŒ9]#/"FiG_c8EYmX.5=!'>snaf7bu+#e&24a۰lgF8NFD^Nq*NGFA}1&e\YT),qK.>F}ۺ6x?\x_QqTc$aCVvwF ;q (L>#I/q˕Ny_䈼LY!p )sXIytq<\2]QLc,Dbt;U^(&*kܘ#J @Db2ڢyv˱"/&0)|hZ`%M@W@/d_O_f&-v JԔ|ZFȲw!*>#Ii1B9ᰫ]\t~цxbdۢ-#L?= ۆ-2<#\{{ƶ3۵|F$<2򉕕.i-zϏ8w+Im^zŜ*_{%aǨJM׿9:O?,܏?e;>YxLJslH 5gP7=@kCK//[< S2s=d1vH#rksFr{?Ta1OnI NMC]}dyL ^q1A88 -B@sw/X@ȴL <]|n'R2T,yI)ƣv!>ބLO`5ifŃ+{w wsn{5_=Yg[1Xgko{F_HƘ&H_4Y<&69y8c <.7x8Ygv}rPnwurmj/My#L8uG1C˙^L*D0]¿ihK=⁝h禵k<yU^w/<^u/WQ_ӸUZ9_瞱zZ.~%a C=L Du -й['! j9Z oT+n9Zk Zriry˘L{rZ>rqNP^zoBh)-xT9G{AuS&gz;k&Pi<,V4֕A9?j|l;׸}>/ׅnL5 h@ !(azgY%Ts{yuY[^ufM|{.im;޷iܿa=ca6k#wdFWaѾ~Y}wqJ' i"A~M>N9/7y.TXӾN }7;p~eὂ.NYq<ߜc/-i5(^wg4/}.ϻWҪg-H[+)#hneWOe)OePwe*2*2G9R'e*2?(2)2(2_)2_(2L|>e>Qce>RCe>P}eS]eQmeRMe*2+GהyUW٭ʼ̋ʼ<̳<.ev*2O)2;ٮ6eyB<e6+SL2.e6)2yD٠ze)VỸg9"P,:8w6Zq=pP ,:sCΓkIlpqV L\O>1C/K-q%z\xqtQƔŒ919sI3³vfeYeEgd Gg OvkߴԌqc3j1c)ZY+E+M)ZrtRFbtBF|t\N/ hMO Gxv 7M޻C@U Hj\[jUV{^w0Ds4ԓ'oQc$$w$ZaIDrGH'[oH&K/H><r3$#cH>$}H%ysC"yd/$!yUWHvLɋ$/$V N*i8Qgp{|_/sp|O> |>{ݠw-& =5*x/jT;m.?Y.E.5YidhzxWQY^t8/~tgQy;wK/$3rFŌ -bFeEE/+آC*03*!`*R*L\U#0qn݂ h@| @=Qgp{|_/sp|O> |>{]x{u^exρg3` O'lu <͠#aZXjV w;rp; [RPE`!K p]WYZ%` ŠL<00 LWl0d'\2xR80H0$x`8 A` .A?Ă>7D ]Pp#'LX}D6aǛTtvr'8ؿ:]ǃ#ت[{:mkoòpKw]Z^i82({aṔ9Ч!A g7^޿ol]=l~/a5HުOOIzSiӮ-$$SPPpc_g*茸nϏN7uJ}#9]H-4+^xŋ/^xŋ/^xŋ/^xŋ/^xŋ/^"O)8&'Vao[` b'v\e }{ [^Gyأ.9=D1m"B/mis|I>S;!y. endstream endobj 496 0 obj <>stream hj`V endstream endobj 497 0 obj <>stream hTP1n0 :H1L< b"Ѯhy#v$#wL!AAUNYw= _X-AdM=B9V[A֙ob~Si{3/_0b&q9}1-8wY- 0|k endstream endobj 498 0 obj <>stream hX}tTյϙ2 I#*wR͇|$(̠d&d$$$ZpҒVV, 7m`=}m}tiL]Ojks$+j۷zt6g}s3w FDIMo/Z\Xs-]E'Nt"eUS/$R;[4}D;͑Pu;DYK19/9ݝwUU"`K[c(cC(]-"܏h N{DAğnE7Dox 1G ˰dN2%#l7 g7'D+af7~.~|Ԁ#@S?ch `BQZL1˾ŵ~ǎ-j#Rz-@!<Ea RFa&;{0|g颸 i>` !=lȳ :Kg,!&jgF䢕EX=c\ːGɟr2˵daqSѡ +lš(jay_Ue)('(oBFխڣ 4 ʡʇ960Aw[r^?:J GbNDoXk9[ɶAzLCl=^bږtoW??DC!5H1\%ߐPbZ+=^͡о==,+}6tK)n =_> NdmvdYk'ؓ8;^^]bڒ3yTuok)!~e$I OlnK%i,,[yL~;IQ) JWQÉWdkU9jzDR_WhZRhZ֥ƴSu#̧TL߽}vK8 Reg'k-(il!vA&J-JKY=%U):usRP)9j{=#ImFKfSzqOtm߲Yz.ҩ_?fYYM|T){٧ʨ - Jg]t׻|K-OY6pu!knfFTWYIN,qF>Oe0s멪*cO4C4`cA+̘Ed5^;;\ZSo :&A3+=탬Y BUfgV{*D ͺM~_E(7Yy$OgP55P1>;좆`^r7P@̑gT*fOnaF[gf{" fK+"|cRܗ50?`G7{ iA~fU{|hcIYV6ѦpywY&m>={v?gķ=nsm'n0 U{ꙞAW҃SJJdgiVPR3QG4 TX[o'[8ߓmz{ j.WÜSyx( QVrID8߲*Ld̩.PJ5F˥~9N҈~4HI`@/ #4! (_!b6"|xѾL5Q|[zyT?!mxt$B\l/ag`[ >p?9FԬ {FEv-/rn `#E[^q&rAk'09ֳ{s5k H'잭y.Nqcc+=#s[` ||_^o'|[>3O$fBۘa&҈cK_5JԨ7*+CZ2M[NM'l:nӷmMtĦjlZoSM^JmZcJTd$w# oOSq1Q4;߱StҦ'm:f6=fSMl٦6i6)6q/`x8 | ;YZ{\;ڴIh}i}۵n~~>O3t=Mwdݩ뺪:qF9R-/cFm0{svS13je+L~zf}lqxPvO֌Qmݞs4-' %C4aϲ kebhqm'x=}҇拊v:oy'9O0(tZͭvg~N&Nwo2^fU`pKf+kjwsx9Kߕn^Bo*_e"'Hβ_]w_ZR$՝NuwKtURF?\-|.B.Tu:HO.IH#?Ǣ$'HeQS'%UU,;箤W,)>z@a9csܯH^R@r+OLLUF'H:">;b.QF.CI*􆄮ߍHÄ`Mf ]b֛e ݄&cC1ibh[kaltDb]paEzc޶h0Q9ΖP쯵Ohv6GbIvtFb #C]FL6}tF@ckkw:#F5\mmwvƢBNu/mbF@v̠rh1j!XZu1h3l;kG݅k*G݊p;;vҝ].9O# hfWX)Uo@+hqlmS| êHTcVV bzh!ka kQi4bt'-v~BΒq!'m%;7~zHYsY֭᫂TfuηO<`R endstream endobj 499 0 obj <>stream hj`@@ endstream endobj 500 0 obj <>stream h{y|v:=2ad’@HBP`@l*.E@DPD" ʅ+., =3 \4|CuNU$"9Рt۶i)8qԨDω%Oqg|&Ixwe= )DH6mtU;Bwv`ۙ(7/7N ?"xۄbhxo4Ίب һ+;M8s&O E_1`$m$E(A9eZI-*ђ_Uz!Ydz3ٿCnJ":tرL&)ShC6R4EC)~+,ND<+|OEJwqJF. )U6T~y/Ŀ,`<_ BR)ZRW(uZ`»h*}@zzfQ9ۯtzu_llD)Z \EDvJNy nM#ήR Q紘&g|Ӎ#G /,7靝̞=gt뚞֥sڷKm5[l,ݴIF KW'6&:*2"<5U%JĬF"#ғuO H1(ΕNM)lk24AusAUVh˓ 4&!;P[ӿhW/DaVARː[׿]j?eq4Q-IiIxMWjflm5s䋭lmP|E5(JehH,BfibHR]CJ&_Zg;v1))--8Mrܾ:5v .dA&#`"{Hf@Z%3 a52!Ƹ!Řjmqh![ T Y0,a5=,6h*yoqu,*FzJGJ1T"_oW\-c=H_EN[ދ آr9C\^\ Ņ]QJf ՚%4~ܕKャHK25|? a+ yn%o!qiAɐ_` x]}/LjLcShz҂1\ }ZrE)8O8[-0 CX^QY5HHă"7F[!XjK wY2j2.;n]g G\(,o-X#-j2vq[Mos1)s' 7,Ɂh#Eb+8@f4Y\vG m~X뙖k\ \!3w9鼜e}>gԕ3X Rf PoٯxQZ\ǶAXO'hpG"tX> ҋJTo-۲w-r &:iAtms;xIrIni{3բ's?i֍^0Y.z6>v6XPp_>ћ"5/1{D2ì ˁ1 jc sCol/> S}Vjzyp=Ӕ*J="DRSOE W_Y'n)* =*D+eŬ*\mX} ђ>9ȣ8ћ-Q>m13!㱻ZpwMͱ ؇ <{TO"|kxOS ۲2`/dF`ҏB:+7Vb{]5Mڬ*Qr"EsZKo=Vl *aaE C]t D5_E1‰@!Gn "+Se&#\ l;ـ.= qID~ۈD.@@}" >+V^ )V,WQJC{ěuOh80OiO;-bQI;i8sjr@LQ=|`ӔŴQnEKJ2MWE1_9L>@ARZZ̥g hjF5_BTg3C|Ϡiy,nss*1#^0þR } ,'M$A< w$3S/u8>}0!Y4&IJ313Xb_O aDcH u"{ o'Qo粹L7ir dAƇ.')u'bAAfyqM XNlQ7W[ PY>˼r͔EHkG 9?iԼ/5^S%UWIXSG;EtԮ= Pl1s#a%r߼D}5BDoD8m kiwN Kp~3x\oǚq~ĺloG~{8*y [(OF (o?&HBu*k:aK3[ %m++z9>97홉5: <yÜos-s(U3Zk%̵:+y}g.ky*4W3mIvtCi|N[xNS_D6l8cmphbCEv}vK\oAWdt(@UIX)HcqTGH'7 Cz ](pa@"_%5{V0%7<4e~ 1@WQRF!>YqSأ_v(?Ph/LTHr:`JdRZOT Wxo6Yt8&fJJJ:lJ9S%F`8"9h#߀QyL]Qū.`x@76=ǑuKc(]uϢ}R7m1E]U$/-{;j4r4S j'fr.uF >P?E;,?ȶڐH lp?ƃl}&+ qh`RpމwA4}ռ/AWq;MJ##M9*>Wҩ)es8aڬ?RِaӯI)inܞ&ʋi\Muԃ=@na@j]hceU/S6lEZۧE^FGM$B  YFY =1^Vm{!:#qhoo'L3oǶ?L-o> z*떈3O0V\xǾ) ['21C0.ȓ&!:@З9CE\xka/d6L?}LZlKQ~0:fB!!w"h}RƘ(z"-!s5\|<|- lyŔ-Ajeʑ=)#HOB^fP]GddhIOXc!&$r6:#89gE?Zx7ot^?vX PXugORO @)k{m\Z혚>4) 8שI1\sxݧ~>?yc ՍMR:ebqKŗ>`!cjS(=-{,KFshb>.We+lwh8%kNEoKv5z_<86hb֡8n-9K稉+֑V;cYe,TZWS=HT?DQ\^AIS:B_ͦsx t?5hnm:CڠŕDDE{hK2Yގ󘻣6}Qg!ہ>LD=w}k Aۡ[,N56K]QN8=JsY!4Z-W{C߆y70Fu܋ bPލp|Woo3]QJq5wZzZ=$֎S!'e; +;Bg'{=d8!wg񐻝 wG@΃\l[sD,Yr>E9inDA#y@*/ ЇiJ` =mLѳ r't_$j&@^gKε% )ZϦgfY;6ַhH-Oi=.1>Xw<ЉN 'cE h,#pG>=)Z{N ~=?'r9:K?F Ga`>tMzЖ|Ŵ:Pi}F 5>8ÚZ@y|eV֝iõӄTjڢ(a th|?:J m;7h A1D~=%>y||AyIYv.85ӄaޑf aY}MZcС{ [!wNȨ!"Oh6h?-?05x?B9m5gU?$CG5uWhvek dc Ɇ.S PD|jڳ5ؿ <` -Qg>Ձn4mjg󾠟]qԈ_oiZf[ws PWaVQ;aj'J P*k{0VO-ħbGjd?yy7UObб8`y)ՑBmM)X?Nӗ?',%lA?=~{Y~~/^ar) }+ųmڪcM91{<0B_CJ2˛HgFRHz9 uPNW_1y {G+vW_&eg!K12az =%@ʭtD~!uP:V֏ |{o!z "BAu~8N҃XXtJZ$>ɱr-38@$CNSt(1A<]b4IW6`IP0c _ !<slb ,8Vl  : jgz'!|N81Phmkmt3H vTA{ȶj1ݭƋi/@N ?YN@,p|SPMƩ5Y3dzA"h Y͵J#FmkSB j@$t|s>dT޸wAI !9`!:Y} tr@^ĢOsSF+>lca-IǧOLyZ>ę]Cߓ5_O]6._?yd[t+V_u7^ǛE! DVt{EVZihBibAg*$V=aWƐ*1 0<5Q(˧!1n4-7o19dm|nTO(~xO_6]NT7­˗5zX C!cH[!'Z]2b a)h9.Qi8DG5Nۏ$ɸzT&*/(`&xVe 0KԴĜpb\*GKJv-WKCʥnmnBT_.q"ϙmN'߸e݆d*йU :3u cJ#Gm{*&TR"((L0 Ф<$j,rה'ytIQH]0ĝ?QF=^GȘ0i 遜I #K9-0'qx}=_?T>bHHxIڕ8ѳ>=,uG6noYoLm>ڵ{e"sкֈId@tyeV =T0GFzHR_iMCbh1 AH)ajCAj.t,'cr:aϱ&z^Fm2J⬲WV+Z7ZM(j't}_$Mef9U#!Ge xRA)J$HПb"I&*&thIR,$QKb_2N)ԫ),[wT@8rXQ^$yYG*N?m4xtJD;eHzK*WVT*I$|tĐW! ܔ"G57IXۋJۼQ*ZqS@oR1  *r%Uz'{`8DOwh<4&OPv~jŘmY NkE؋+ۺ=X+z3Tچ: ezyCCd1_@4\LIuJ^Z]qg)d 0mA1oC#w}ٮ$:MCߡsXkM;'yCY|pNI!MN*{ V?^MѐIBU.MEB|F7}0#+4ڌTH9Nroq 5jQpDqŋer mUÃ]Lkܲ=SŞf^# w}+|~KF.]!o7L%L1#Eif&$n/FUNK3jV|g1Թ5o=^u=?S3ܼ3V[ A^d/`N~ʡOFՁQ}\ $|^<>^R}/,}+?}(K6F&M}d`?Sh7z$חlYɧJ6X咍Q|dS(% %cC`eQMƁA͔xNCMI\n3_R{'Nxn5Y88 #P;9>f Os` 6V}[ǯ(I/ B)+ X9  "h-q wqpɎsӹיOB67VLLp[ \f:ߙ &;umgӁDnblU!=R 2–LKst!όq|z,-儖 wNr 78-t!3ͥ'BAN|hnd!L?]%kP7E}wE-~U|ҝ7O@đ},BVStPzr Y; 2Q#B֓vOʶBLO=.\rེUt Q endstream endobj 501 0 obj <>stream h{|TU73 L$PHL*% %%)"hPeaX**m-Lb@wA] (ຂkYŶUеy^~//wn9v!AD1"F,ͼ !oeSfal>߇Sߘp$rOsŬo(]K򆩷tu'/Y3❫"zt4jݞ:myz*Q+gO)Wt~OU>oN܎Y!Lϙ]5;'9~5sҎCɟHӖ[ R'YT MqC6qKr(^\?o4Z?ZrAiƓnJ)AOx"cO8 u66cb:=F{q.A/Rʣh>IE1~H0wPwڈnO h7槴hE%Mh6ki"/>49"d7ЃK{rWݩ?.G/Y"Nů41_,{Dfb9SӦiWksUbcI}IRi.ѐE(]5E <MD3<~"Ɗ_Y VMbxD@.ŧk8! K&O@^#w!<6Z{-C J(2VSOSO0ߣVDxf@_ES],hIbZCK$֊U B+.12Y-sHZ p:h&u_Ċ ʼB,3㋛#6%9#1(o"Ekx ]_NEe2C;BCi}Z~h{W,栾ha'iy%AA qX*sVY?p Z!ֺgE0wlqv0k%׷Ozeѽ[.;u쐞hkߦu-{c4mq ] 2+(oP#LL sjg 6p  şubWJ/{rߪ1p ??~Z?,Us5Ms]PMt8nS# !A‰pB K+£F%vS f(Uل]a?kC+5]V䲌%ah|mn0-Y86IΏgou2xƱ).-7VU Uh"?rKJKb sMVV*R6 U(C$Vi )]QJWRYI䚖T= A™1]x[ [,v4ilS.ή1 -+D%) N}UٗJR+#QeF7 /yfHJ~Kd9i5;pFFsgw.evNs~4BۖOI^YCK,&'R{FiXq^'X 91 t'?ۺEa'+¢@ %2m Y}lWEn$mLT,rb3{J4PWԹ=J"ao]3ՙ9" 8? kZ* 'TWGQ2jH<s4#3 u޾ҤpM ?+dKٵK]uuA_P]V]^g&@.|zN~#8uIUhi?X>&(M(`yqI2,&q%DA*9g TVzҮ QH*@ Ra'LД:iy00 0c[\XzԐ,Vo/\/*_Lb[FXNU nKD, r ghm)?J׀w ٠9-q@6(]ߘQ&x|4gB~kh*MՏfщ0Ҭqm~ lh ឈt=lw{5s v};hOzRo"Q@!xZ \`nB<(-F8ȳ|g Ⳑ.p'.X (~%=oxqe:V y~GQL -,}8 =G163@!yՔBfX6|@6І(YTZcf-'(ʹ2812P%3dj{4ˠ dˡc\gHVSF_@1Bgn5?3&s; w(kٓ!uu}փR}/<m5oaZnEXcr^-fA43d.Rk$eo˔ԅwƇ6B&xn`h`% ]gΌϦrIScS֏XGc=GF14m C߷>0{i ̇];Zٕ |0|əKpj̣F/eT8U(6Zh@Cn 垩*#A[p`" xxNB;\ko^ഽ/h<ʾOaNeax2е{\K1VxZQ466J.8L"n rCf/oJ8=Pma7]h'>X1sh3 ҍ ]_a|-nZCJ''s(kC92|]c^vzHhh䛔fs7ڵ Cb>MMO'`֛OnuCLxɉk \a$?ߘh狑%ndqõZZC8jd~2ףQ;?o7~@MZY2Dmqyk!]oᴧOCGd##z!NÑy1,~>p=_p5:0d*ʚi0!yUː;^{S>Q^q%P~-c6rF9\<c0v/Kdad< WtCCŠ# w}' ~} [0Dl2a;{EV/ Jb 0'4 n}Ɗ?5 뀧+omh!#gC돟KaLA9}:?r ӟk /DDPfzv_8E7><)l˲Gc/QK+lnT{*X^rFc*uHL ;{b!bm ),0wb-ۂ~in=K^`N_̩6&E|ʈ).4wsywyQ(vYvs?GHsDJl@ĸ൅i)C8nom9t-9ʼa <')e8y ]/Vy (He\هh3oSw`5$~Cbu>V?D؀j1cᏅ.njy?44}=>F3L-ϥ!WyӫXwSus٧ _bse1|s΄f꼏5ݩ5<{S<_Wc4Gz)Ȳϩ:Yڥ}B^u *,TMkh1sL2Xg^9{ذi9&PHy?qN:Oү>ys|5PaWߝ{|f5i>gO!#t8,N^hS糅j:= T;k(1orye]0^uWa@;M6k>]i,k*m#4TM :cUT4O վuG@7nSVAź{s݈{6 *p!MNl/{wЯX{}i֜*<(> o?N;j4P[r E焥FX?ک|c =3N;wU:eA>/H3FG;x3 e=g ;<1g 眣;_9 q"O0/8_;F?QK#K#ulX> 7{t8(pc}aN~`k`l؀3y Өlp1:㬼8mV vۭ}1ʛun֮r;߰U;N'[uT§ajFgA vnz~BganbQ4\CgUs>6+}ǷR+vvpR4*07qIU]<ys|6 Ju&g'hYexR彇`Ͷ(!.w7oż=h8zb&Q?4YۺfQvM=wwo!JZ6pv練_Q2t[:&<3GHcRGwl<*6C=\S3ԹT{ i,tg\L8g?F}Թ@oy[V]HƱl {a(ϟ i#{S e9v9^ȒmϺ0Mu-"cڥ8`gVv,`Q:&<c|._#/Wca3t+̅1*n 38h] jolwEOݳ\=4|giv޻#p9vt$,wAemHy|Y~ŽƙCϼmp/=4mwg%:=u1U}BmDz>Lݜ@B8'8\I+τm["a2/`ksZo/s߯sݏ|OW }@#Ÿ LᴻӎNn@5ۏmSeo CF(˂KZp]mXIJZ%RWlHsڔa7.,;w5*=W+-swI۱lPT[F=Y̻<{O3m>ZO0Oon̥{FB>,f߃t[ڶy_mo{rto%AOǚ~:%h#7isv1l+s3Ͼ/{ZA67|NyYwTK3"8uNliXQ#!;v7Bytyuզb= V wxrpѽFut<(, xm7ć̓޷W zo8TnX5YcmeXSv;cC{S1ؠ{uO 8^CգLE {LN˖m "|׵f>J+k]j~Yi V9΋.t7Bw53ȻqAę˅ l#`^b 6:ZXT{OIAW=tS7oSyoR-^"]CGw CM4^DcYײNUs: uGIK ĺHK栌9*lP;,h>Y:K#|_K_-%_t|<>^O55߇xDM?ZzRBއ[Z?\^m˭I^.lӜo`.imXwRw+C6i;oW>E亀so5oVZ#:ɂ?]yw:NTIteY9k :z@Po`;$Aua7Ě7 KOu Kzh=ez<)۲W] ]Cv+U4jk^yJDGuhۥuV]1 ~gۀ=-^!`xpaԴS~`681Z[-fw6SUֆ&i\H`p p)> ,ULPkS{{/MJEϸ2Sy-˔wRmѼ[EVpvbѸ̽٭֨dk|Bb mA$⶧g"4[̽i-My`})bۛ5\=LOۀ=&|ʣxg=!GhXwd+Kr,@ʷʷPo|Ekm~#َ6I#uf|Nt4$I= ^Zڴ:-vt_`?÷!4`U2`\G( l o/#|C9|ڠ}Y>K9E/m&'zA#ސOoOa1d#I-Kk+|qȓOҧ>D< BJ \xO5˯o_7_7._W^+fů WbH3rgJףG+]OA[۹3Zlm0Sg_h=%BcDhUZ$BErdj'BAzRESDp~x/BPP_ ɔڡWd{6:KAh d>:aއS`򷷘1ms?sv,>nxttгggXI^`.pGoQXY$`!p p$ͶM]i'Ez!-"l'Pְ{׉ʎ7[`h6:qwmVw u4оT)"J '2k!YlmznьS: 'O^w![w^K^׽΃nbݕ~źkk} &yof"./>7K V;}YɗZ\9N_!rvFa;%Lӂ]k%ݙ.֝nx=&f#ŷKCz2_T)(ŧ 櫩JϫIMU`)UR㡜܉.DC^˒RJsZ{ R; %~AnX+IFii 'pT1QkG/5Ep@e̽ZϟgWAsUC\~8XW50ܹ05zBIۍ2R֤I~ i 6âlƳZ('`;1Jpb UP<u8d7l)JQ*!o O\gs]v[̵I&ihh k.ƍRixAIdР_?Z%/] xuvZl^rҼ_ӴG߿*>e50k`2._>s/:}>L&3mB` K4.*SP@h? *.!JjjOZEkW)E <ϝBm$s3w{sYI$߈MGvˮ=*Orow3 ϟpAzx'b:lNdBa_aktefLj,O UqNsm6EcшM{|m6vw|1[kuQa|r p6R_:7GVJIr4B>y<7[­fZ{֓Vk{l4)aÆo5aa]w&.=tIyw|%c#8 {q)0{p#9"r:#6wឨ].5nBg[.XOPuk׮]P"Ww)kX15팉Rg~ׁb6epVɻ?F ㌉) ZKV}3/iA #/܂&`rU upk`5XeJ߽Av' )C _ M6l]=;lN1mYsQ BqVZo*kq:*t^ęeG'.('fK,@Z`ߎ{=ڟd_wI&|jca7 J-T݊FpR\*JꪌIg!xͲf9$^)pWpo ]wB;%%B;WFa~ΒWkIUm2̱sU4q{oXt~xM/xM{D 2ccwoX|c#[}u\A~yr@G zG^wd9!mk8%~""Dʫ")y'9Â@&|:Dx9w!.2h^&K$YкH+ #7c{ٷZ ʑ$y(3&z.6,n[kOk[wOafyR޼y η\,&R4lffuII2¼$ 4V쏿Z荷>NCg3kמ:k-;?l+Nyis+/ 8S!ʰ'8|g lGZ"S 0oaH:%RbQeY-+\-mmGv~~3bLш0ʙ,./^e ώ^k\^n'F@:M7LA&e#F\gl0!E WeY7?A}\\8#{Mf`"٥_*]*/!msVnՠx'!by9qN` nG }ܳ+Y:@/QbPEg"a ?Ux*& AT8e,!3O]iebe:l҄[ !0X"]cm,K(;-Vgg)צP(G9 [ q UHn U2|PVrAY?{It}&@?ܦ_E5>jUFdLfq- ٫n(V8,XmkbKbB j1ƢX'ޘ;=VnژJ8Kަ|,`Sׂ*9,G`?gޤ'^JO~yG޽?s{o܂瞹񆗄 ͹cOϳfo!cM_y؇v>Ⱥu [-rapIJVo%2,F#Xi1 n Dg,utQoU: q #_ۖ[K2h7 bq6ɄZmZ!^!3\qR8NK {Nswd^pӦt],>5P#lq*665{Aq@wiOzݜWD26[ͭM>pb0Nx\CKZꗾVGg=SڙӧlX0}AkOAUq2jr^a{$ic ب)~T*`a% AXt^Xfj&4I0 ͆k *Wa:N(Bmmww@Ҕ{aFFH ؊ز0k $%52f0 -lDɌ]aV7F'qAΦ\sgC-G`,"뵵z) ou]QK 2EX/TcuBQoN/י+ Eb 311{v_yg(ol+nF'g{t /^g `mï8AF+Z[!Q4MT͹3 s:aIS*jdԅu yCV¼Dwىy/$DM.ܘ"[, <ᙼQR"?}v:Q ^G'lW=^/`PhX.U,k|5+Dw9k0Ey[( 6S¹byq%u`QR>W}T2f}8Gx;# Փ0/d$3K|_v. ? }| w@(e^ z=SZ1fޯ?w{;\\49%w8^f>x7,v{g#gc^t$ 6qb8i+gKMϽ0GSԠO(^Z9.pV'Y⛻;pOvYG繽p7N׸LɁu, /;y9 Fa\ʁ328XE#2 ;p%fK6' ؙ=(#$ &KC>ƃe-BK9˔+ƷygxI96"QwMK5mSf)>e32yo=qeKS,f,Č4S|zAp*%s}]Fx{6 G,R_xY-UF=Q%$W&;ŮYšy6ט[[g_8qunp Ɩ-tu iT1A.IqC%%* ix1F>RC3TS̪tr5ښk jAX9cZiXĻkb kYgsUp*gYw)ubU re}V]X;0y 0 ]Dp8AD "]zL2rLe+6Iv}WX0ª1 s邃l4؅}(%ļf2ڗ*W˿?|v?g%L[sϽ۲+.[tټxo2ͰqkM*5F1&Ӌ/L]NgsYᙩ?>L|$UoO[L> 4& $D'ӡ:>'590ɸDk9h$›m1dcß@: 4|~gƱ NA-ƶuLgx 뱓JpO9Ar01ytLG_:p%ܙhHm kS`okn#We^NߓӞ]!f0DyB?,Ӑ|i1NRTؘghm1g?\;f>ܰ'ʵ^=G}w:5߼7f'x1#D:tc.XP'jsy5Mx=^Ry 7?%S&OO uIKRIECqˈ&D! )kڦ-2E_+}Se3~(h!Y:a751`Wtŝp+v`z ,   D7LE<2-#j٭ϵgd{ 8n߁y?򸾺c8?!֞Ɨ.hlUmr檤HY+Ilc=={Iw"{dɀ_u]WysB KsaXDcMO#!$@n2\n$BK\0 P!WCet/8>Hpc͸ڑOeWq$&\Y/ZT=s*ץnT<.jFt,xb;*C$C @;]bJ+,ng^mGReIaq8GK.[F49UC6iHSSmϛ^6b#w|OѓOFϼc1;x>947ҝib^ Kjy^˅ZasI HӪN=vUzyXŰQuU\Tw6}*I̅` PұMV7s~T}:mșn^7:p~s?7Y{uk$ϯ2{w!G{xu/߼`+8ߏUrQfRX3nīFʏ OEbN gD9tt0sTMÚ{UC%QtQ72 6 B&$\b4Q&+ٸ 6ACq38,A5k^=󣫣룽Q!J8a0N~[Y?gz?\)qc^j@gHxyG("gMSL:x"JPB0%S1% c3˸rG7NGu=}w1%G3FdidY 6|Xlֲ-_0v0N!@&,G( mBpeW ['8ĕ[.Jqeq^w#TV~H믻__}w*jInT/1C֘KcՅ&8jlAmD{ b*[>ξ2QsU]leڒhȲ+CqN ˍ.]{K|GJ vŢp1cv9Sd^]_$iT6/䪑D} 7J"6H;|IIHED⤋$\$"!HET 2TsEt XsEt N ]2YoLmIGJ&L竪HreXWiҩ ` D̃:3Ą$ ;!Cx#u7^bNQ]VE(QµXT< 1y@:~@p[d$L'n""b u (^+ #bS%I͍:YG. 6I t(}`̱Z-" A.@?Lb [ՏKOqNZ\񡄂!EOPi~FH.D-3O6|kÿtJ S sQo|%Rvh^TLeL! UP\/J%ڀNa($D>!}B'dFds+Gh qȒyhLTB(f[X^қODDODn,    gl:]wr?QP)q ˸RE.m%ccNPɄ$(!e d4u2[q,rdQӶ!gB !g'rg>\̀ G>k{$أg;qx/zꚞk\~rˬg3V ޹xwLIHe+;1Jj*mF.R")"HӺXdPU#NO/Muvw ~G>G#sk߉ ())tRܩt u:y?X=Uq2VzrC^]:_՟ޕ~XPGꟖ)>~:s5͔THEO܏*eT,Ebfu#O(cT*VK؍85V{?Tƾc/! (CHmW"R$ThU…TI|`XeƯb F@aDwݵ}D f?7 [D=[hv~ c gw"HbCպfhAǥfϠ"v+x)A岢TjX!rM~PFuUZrN ")l^k;{M_}l5_[|K֞ĝ/?KWWE3 wϛ#WuEUns}t#} "T1P3QvEEx\D"NSbQ@)~AXdOV(1&bL0C@H>D—mA a Zqve+qzDI\a#vB"^SPHzDv:v<=Z_?;8|8UXZF)8"aK%@$ |hxTQegdΣAp22u8,(J錝JI&K(N`YKţTbiah,c]]]vpe4SSo[3ӝl|`#E}g3ld\i6s/ J3q^CiG%8&9s)$@2|o L,]+OSgs"c=ZXk> Ǹ%1'95BٸU[{Tyz~N~F9 Gた0p1CbR+8;uwY )2/dx5fl)%?Z|j2h UT(I^-%"Sw.1h'P]#VGyV$8g RZg[k$5` &FC,m5Kq6*6K!'1d.h)[Qѓ7 ASb@Md ɖ\h_Y~KU3W_p+GUI$S1]p(1z=e;mC/~q^9ڋ߆+TLVL! Fީ^cYU H$c`0cH!*hed R$$]|9I'mU4V(Ē ˠo4^6h(uJOѲL^(EVP:J &̝hނ,Q$qzT:vm9j Ql>5vX%cVt:rUJѡ{G[TsK)+ DcL/1Hvʬ^#~t:08;5]siad>-NW˙c޹^'X |+ J'=̱94Wk6(Po~`T\7B;f]B @G9:Wqe!@@~`o@P@1 o W`Z`F҆&A5@ t^a7<<<<<<<<<<<<<$(Rkƨ8ǟ  !CGiln<@-'64Lj 7>㺙fϙ{= -~vYr{Qa4jhI u0 Yp+(Q_rk롉bgBS93~F&> tp(!yH10"'$WF>t3sp>t؇ƭDgѶ6F0>2 !c:3o/.B֢a+Fn{jWSCfD[g~rը&X>~Dsfwl6mۼoUϦ̩梞7o5uoֽzi3fϞ׳}_#g[{ê5DZ1QlnGOŽ-h_?Y Lo#A:Xux(K)Y6O}ŵ_^7d]`/ endstream endobj 502 0 obj <>stream hTPN0 +|,LCCH=!Zg["$rC~IW8{K]N4sa"pyJΤ- :fT99&mF?ErN~~eb}JŎÛG= m ]cIbUO y&sg5WWleQ֮UKfLDrV1>stream h9 TTGO@hh>*ЍJ "vIiZ&aumtL2|klud&d6gaG'O֘M~{ߣ%ٳsyŭ{Vz a\R4O$2>97׶D[۱nuE ͛>m:?HK:QwѹV!^y瞜px KSy ueO0oѻ߻So@ 8B8fa Mav.Ǹxc6[zI:F|_bqM%fR@fa}o'uL){`!6~Qk6pss+,?T+ s!$ Rc 7>AL$@>dQ>_I@%~0 {:,g>wYCV߳i VI k"|/Q=ÚB 9D *!KQZ ,KO$!Vʥ80)|^>l5ӧpcvc9UP8n!!h7cJZqK#| _r)6,ŷ89ٻ4:#Vkkue)=kfQaA%/{9Y3rii)IS$ěb'DGMD%P}V+]Y+3փkPzPX՛S+?_=vX"B,`C9Z P~}?D4 Zd67"KhaV:f+/'p!rtXeFm(f>E Yh PvH磮υapgZe}{ n<pBY= 'Sfq?9Y{HCڍ mׂXO>pܕ y!E9UB2V\-)Z @*-\<8q70+5zi?86KX3X -@ۍs}۠ksx܇j4`x7"C@9D!Dz|:0} 1V7P74 H<B=䡏%@Mp?WlB*: ˶ѧjY0K1(HK`k-`˦Cxi􋍾 efhAe"a~/-sVNBfe'[+s3=ќٙ;*ggޏPy.HnfONϺ<̓$\x"<4qRy!rZ&J<&vrqN, A8%$J1R$IIT)1k?Q0H3h{㫀:988dj"Q&8ZZ!QkVYش$d*݁oVWhh{~B#톤) UeuoFp->stream hj`0x! endstream endobj 505 0 obj <>stream hTPn0 StCKx]hG@M <+k y#>"/#8 {G-:nfd"7qPB~yMo '[dG}^cB)_"(* CyC9 K]ս1hG(R/ե uYU"mx嫮FĜ<./FGxN! ybj endstream endobj 506 0 obj <>stream h{{Mus> q92`231gL3\r\C*ڣPI%$ROI.Ó.G~~[g#"h))o^@q靓_DR#"=rcf')Do}}I+KʎMn>ќ4\FẝbyŘIw{nuJ}\i E#gxo4Q!"һǖ)?tJ47" hC$)&uȩ-*ZaQ,r:Me("ԛvSyUOK%.7IOrrTµ(XOR;)G8-V ?}*ijCWsPͿHTLn״H hI_L~AjMۂ >IaAXLQM%}3 Z\ ;a9ӣ(&@WhE0(s5Tڭ_f9I{1/GimFP`;Jm&G0"?sYT~M7>pHA~;;u={t5=KNS;ormdokZj٢Yiƍ\ $֯_7NlLtTdDxӡk"K,%Y9YF'6"bP+SǝRNeh^ (3н'`(-bIB.w_I:0+_A]Br-0(rߐ&փu<ýxv޼\IV~EF4f#@{]YnH"Af6٦H(rlh2'qKOkh/]kmvBwQQEW=pwBn)(G)e(+ri|pi0xIF%b6LbJKL幥E3X a(!.)zy@R,cVQJ Gqn7*Sk<Doa$ mcAhr\xEeE 9"RJmJc1-/eqq-MHvPDTv-U3q- ğj6NceP0:o>IbUSnAnYFT+8@f4Y\G mAX癒k\ \!3w9鼜e}>gԕ3X Rf Po[0-c[ r, op酇#tX> IJJTo-۲w,' &:hcATm>k;xHHn)껤3բ's?i֍^c

ћ"5/1{D2C ˁ1 jc sCol/~ԿrU*?^^"<1[}Rۨ\SoꩾC+u.cbq⌢R9WP#u ?s/+{@d53T!,/| ٱ X U{Zyfki=M_Fs.bښ&cM|nsus9@Z}V޳^ WP&{ 6kGXc00˫u(xC^Q}^ȾtXTnD+}G#xګEe*N_(# eE䍴NN)tV!H>[ɟѓphnp"y%mnIHr0En>A Eh:ލ"(pDgc~kI2.6lDy𞅸$`OmT @O"X>H d/]4z+ȫD^-NvWf&ex1^*i'x Xr6))b|7 t`Zm@V9]LqStP`6ɭh LIJ(AkA89R,ϊQzZ\j8>@ۂE Dy694b|oZq<7'C?y.2m` ! c|XbRwQ!?['WٔfE y}NsB3gQiH#:a>+;}V'9@_uJ)kh0_<@:]\.͋Zs-@Nt1ɏÃ?SE o3uH"yY_z:CzӖ+=.z( \:o5¯UXs1/ЁX71"zYBe8u+Ci>d|-WNe-]>d`o0Au x^yMv{c} !:Fn1\b-?gL<c-k b1sJ^_뫧J{ qQG[ݐFo_V^%&L>g-@P~]R*5원I2PUI,ӔRYMtS)=І҇nzs]0^i}ڒ⽋I+i"0{QIQSFYC+RT)[ݬ)ANUP/Ob`H9r:`i0]%S2)J'KR[4OZ,s:` @@3]%V%]%1U)tOR  r]|zj,)oH?*(u9m[ a܍n)= 39/2 xm# :lBBFNxu>7}ynZ9Zl㠝7626'qyv_uL; _;*m jA.9wژ+#k]!phQ'!/ 5I,^kmwds`'6R؝Ke;TZQ hXD_2.Rn*~P^~ MZ!H&ݩ,”LT-Er*7C e?"Pu]4}w'Xv ]v:-5: ;tm~x,pOCu`o^pX| <, t#=싚xp{SR pཞ_E :0@]y@k`:|^M7Om8`>5v~kЎi^7>@է|mE3bUq: ۲lGöK}G׿. Zc?m:j oxqy-t _A`>]V;k0z=)[,ߛ>;)Z VЏGmɫ7}c+`8vZ 딎2SpYvBvyn&@v;O!^ =jy4s'^+r ~Pe9_\GlsL%ݙY凞q.|Xg}~(C~{,1?DZ}e_qZYu|;PG3'`/^+m!~[,?( YvmvxM[݋ܫ8B'Ay<Y>G[zljs *P`#09xH~ qSOzjoڼk`cY9G|l +^yFwIΡ8S#ƴsM#9 >^'L}r1rCMcQl7mGۨSl/wh ׭?*qOzuUbB`>_(˕2FN1y9[ c+ C!"chC.&ɂ ]>=MЯf_?0z!`=y'  }UZ꿼bbwUGGMrL|SOSN)^qҴYm3!_ -R3=?=M4ꨇ`{ց $XӟyhceU/Q6l:ۧE^FG$A YF8Y =1^V+l!:#qh L3oǶ? Z*'m|T-gc`} :T}SjԷ^dbc\b'MnG9aʑ?D\3u+/r\A^l~~ oj.E-~){|| އ܉Y3{IUcoHB|p0ͥ'^eS+)G^G^G&̠/iCAؑ{SƺC>L@H64l0[uFprϊ\Zx7ot^?vX {PX5kORO @)k{m\Z혚>=tSpW=t>cD_}^yc2MMR:b q>`k!xTQ{J5}+X22L?4VYC]4h6Po0K֜bޖ:ORgvj?4G_OkpmԢv语C}q)V8[[s:;Qg4'#qG/PƬX@k oӴN {X_JkPQ^QEM:B_ͦsx)55siN&ڨ ́DDʻhK2Yމc.}Qgۉ>L@=Gk% @ۡ[ N5G]QN8BsY"[4:-W{C߆y70Fu܋(Zrgڻ6? Ǔj޿y{{I8W%'C~O˝wAVv,/~w:w %W#w w[@vܝBv;r{s5~jVrn(g,9 @Fz@6@Z1G}ğ'2~;?ӏ߾l{}/9Ǿ,h=fg8v[G`[ߪ#??p>\Seqjsm?C':~P)ь)dKm92.aރWW@.8=ފ5qC[jV@M)5L k} 55NS;;q x˭ﭬ;Mӆkz ̴ES2,i;6~t]);jvn<#'6c{K|KUS<5Saޑf΍aY}UZͣС{ [!wNȨ"i&H?-?Px?J9m gU?$6@G5uWhvek `c Ɇ.S PD|jڳyUؿ \`-Q>Ձn4m jg W}øWjXQV-ΰa;vh9y1GsJ%ɅXu(eƽ -'JMYTψJ5UPhӟ<տ\~Ŀy\jGSo giig^VR vH d]-jԻ0֏D<:@|mu(hHL!ز?8,sD $ptQ[HU4BMk[xY{oEZs6:tW'uºlgaIR'ǚu eM D;@.¡4vH=&*R:VT+!_X24>q .-.9yw:.Ǽlj{c:ߋTߏ壴Z>@PcwccWІt* YH SRFG$ڧ#BE~K| oB#N}""!&o*W~[.zX!Nޢ,VϚRGT)?c$ߋn2E}~X\~FC)hS*O>BWTCIwy܈VI?ANyy5S%- h2r8|qyxRHy dI"ƻs2hAOSroQ- @N^|tʷny }!NSi!0NK EW܏59ZN s=tqdHߊvV4Ž7ǡK,`L:)1 ߆flˠ=a)g||Lz0 FCtN& xй, 7m ~:hZmm:4uh&d6aL|soW;vS( 8 m, GAQ <%(,rs-0s33|:EGɤJ{/1\I< <.7ͩ2XxJL{?6.e,xo'qy-e8#UGAS_"߂!'s!]kibyhEe~TL,'$Ὁ.*[!h V'rj#NZJ}8*ߔwOIwrR|wF+ #Q" 1g"=i06+l:/TIM.~TѦA*aW t\= h∖.w#o|/}G1qL@`֛ބs8_T~y+kץD5D>к=ip>m%:&4uLtcsN<[\70u',v*f~tc1}by)G!W>@:v}qo+;ތZ}YCT&GHaO}93CjrnPӫh`o$yWGo,             -1kJp<G:v"@!Ixf}ѳi? Ͷt rfE:z݈4{ { YPA@$"PˣfJ=lo%Um8{o`b< z*DZV8Jd/QWM2^=hձט[+ڋ7sh,%L zETB(hc2Խ3{,͎( *HGϰ)c%Qxw33ٹ@ީH M;O/y%sU*.˔t\^w* tr~L aKP8~Q9a 0 u_I ೞ9< (s^wG؟z4>U9ϜA_.tVR-h]O6\ő{rQg'.|>stream hj`C) endstream endobj 508 0 obj <>stream hXLU h2DQXkUh)m>Z(h!49aAhӐ3 #l[:ܲiik9Ǩfm,ޓ{.臠K~l"g~C6;dƽuKV<ן weJXK[O/+ʕ͡Mpiwr"~Zl|Gk{oCc_h_A=DU+U껏ڛkÍ! }gGvZ4w>zw6S4~MPa7YiZȳ0Ww+Ou&250FufK\r4{1nMŠфA3˭ { ԫ PM 97^pFB6܃qF#>^VN:(}}8^lbఓCN1vDmi`>i4Y;W^#>wu7Sx+9i/|?[\r[w͕ɷnSɹwU9`>y}^_Z k7x,Eغ,bܮC8m L\ S޶s=W>t# qZJ_%ߛa'̳i `~LX 0!ØpN`"& 2?58.3&b~JO2>=B\$,~%sP5gg%BBj sQb &BgF? ftͦڝ50prM55z ]Q5OUG)|Xމ,"~.;>/01)MC=*f?8TodIQ]ӞFNlcui}@u^GΙIYΨuIT0OnKv=-9j0 0bXQŰ/wIŰ9ۃϥz~G%랧~Ry)+bAo*gu^/+Y_qވNy,/|U{i*& اU_9qچPs!Fu~NJGO }^Fznj-{sSfY֓l5hoA{?"[5[|x}žB']SZZZvnhW9^Rj uZ:nestnuslksi6G57 VTUuwuGB5]ZLPuCnW$ӕ 0bA endstream endobj 509 0 obj <>stream hZioH+1 #hb;A, bqmdH2vUxɢ("gEZg f%sNଘtL(&,IL !& 3錆 @LIj8(Tp4SNQaTeZPxhgZ[`l3Р0dFm<͌G3wZ+CѱTj Μ4(#p@wHBs+ay-Ўp[Ae<jsh4($ghnAЪT#4 E(  Aces [lJ.u?OOql1?s:?r>/}~bُ8+"߾Z>'KrN֏@#R;gϋ|S'CֵPq 0Ǚ2YB"p,,@]J`iJMY F'5 =CZiT 3!mcMfӂR F"NW| K2}x\/'_+t4aO'wՈ:ڍt!tH`;7㧤vLi<~C2t0K߮ñ-ʶ08N<c(3ÀG۵1@'kſSJ0Xi;.n_W` [N%w#yů#z~%Od!LZ[1?oؿfu`>ԥ4^Y\C5Cܨ:Yc&6?X 9\|=9Edzr#+&;b]U\m\vp+ҵE4pzF½$hESd46™w&uFEMв z #ӁAALWmҵ@c)0A\Yk{8J+ƽb,sF @OaB'*+$"Bl}TAqHa\Nn[[mJĸvM;+{\D.Fxh!3Q_a9t3ĈuzIlQ_'ǎCQ ۿ|}15%&_T"|rε[Xũg7[5aquM|4u&09VD)h@ Ϧ9ggsChRJ,I{M!gITo5#TF{eZn4 Ѵ v=-6Ǿh[63f狗4Y$~;7yIv\+-9k8hX? 2̰iyS*| @bg D@u"~;C"hgQ-Í>Ć,AUHb/o\WxU e;FL E[^ v=`q ``ҖL#eZJ;Hp||;~ z0ll@1͝7tL;2x`8fX4ӯEKz}01MuJ}3-_9=`Cm+, 阔 b:H!TlRy)6qbͽ7b!/[wd5q?!r4Ӛ>s:wy#.RԅDbl-nl)]Ȁv.6ݣs|VɻSBXxϿv)^ 0hVA,57x΁m+'@`Y7e\2Smv'FREVvGn-p2ELtaO~mz:\4tj:t|ryz~yr~Y]W@qntƏ6K|af ]պskɨLv$+`)F. aJƨjA]O:d  endstream endobj 510 0 obj <>stream h27P0P07T02P+-(ł] q endstream endobj 511 0 obj <>stream Acrobat Distiller 9.5.5 (Windows) PScript5.dll Version 5.2.2 2014-03-15T19:14:43+01:00 2014-03-15T19:14:43+01:00 application/pdf Microsoft Word - LittleCMS2.6 API.docx mariama uuid:9581f7cd-738e-4b69-8227-11cda8eab889 uuid:b4582499-16b8-4928-bb5e-495e8c452b98 endstream endobj 512 0 obj <>stream hޜ͊T1_%o9 qf܉q ܮ*4wuC/{rEKeiI6<Қ-2͗4&eI*\Iڲl5^|ܓZ^;xhJKu[IR3iݝ|%oGw?OOs-וBhC;: & KE^'b?qt̢h6zHs$w H@FMǁ33X:im9fȲ@ &-;Yߟn0A l>cM8f7 ,[PG|Wn܁;p^Wxހ7{(@' lK6?wj%4y[^ñ(,da1֍u׹^HRa+p߃&+ ox>>O3(;ʐg69I>#pb҉I'>)|NycvRII'%tRIINɿ0~ 0|"z endstream endobj 513 0 obj <>stream h|0@en&,Im\*"{YPP%Dv :tD?<{},Es?bu tI]UvἫ]U-Y;{[S& T7)uQ<}H78 j㍇:-c>/Filter/FlateDecode/ID[<4417E458929EE44383813637961D92C5>]/Info 749 0 R/Length 995/Root 751 0 R/Size 750/Type/XRef/W[1 3 1]>>stream hWkhq8;g3cdKV(VJ 1ɘ@O\KBj1R|BRr }pkɥ6f1дhOOow+VIJԮ&}|Y@ 4RנU zBqi%4Hy#D%࿐LH3!CA3|Ku[2;:60yuҗdsҎ|#^*nJKHhg:vU+-d7mzF2)ˑe}K$}%7K; Rer6-+CVNFi]߁e$1(:V_:_S޽ b#E(:ZSWM2JI-g?[jYAU] y:->7?v nZ| ƞbcLDU4ϡkidD7E ]U$N%lZ5܇F;$ |fZIqo'oSeةd:Wˢe%ߑZnR$JA)9 iyIvqCf)%ˡ!V9F5jNZ1b_\rcMq޲7]ǼΘޙF/WY\Γ1'*eVcwevYdTFwT,0x+oHt|rTً a "62M轞2|'Oņr{ e5,h͛oZȯ Fz5NX@-E47 o_;7-O9U3u?/Z endstream endobj startxref 116 %%EOF lcms2-2.6/doc/LittleCMS2.6 Plugin API.pdf0000755002406300000240000175070712311617072017051 0ustar mariamausers%PDF-1.5 % 324 0 obj <> endobj 346 0 obj <>/Filter/FlateDecode/ID[]/Index[324 47]/Info 323 0 R/Length 110/Prev 511666/Root 325 0 R/Size 371/Type/XRef/W[1 3 1]>>stream hbbd```b``g ` ,rD2ʂIM|D2hHV(i"s`#f fl?fĵt俓i L Lg` Jc endstream endobj startxref 0 %%EOF 370 0 obj <>stream hUOZW?.o :p褥;amtȋ1RXTk_:_Be/Ye$KŅ-ه%qui,sYv^iy~sr. 8 A~b˜{1Ν fԱگ??fKY5:\k8W7g5zA{*λ~F`%8bn`@sWq$~ ~@ga?cIk$u~ܹ'U;ǒ34|m19'_>=Q)a@-N|GWbjןzEӆ@}K3kx3Ԛaս(7\jsoזNRMO!j:vvuR >*'~)Lk&VvK5]WЛJXPWfVi c71bw,)GQw:搶lH0zZB6?h,h2d H įάsi}%&ѱP#6=lKɜH`*)RƍN2$$|SD]#&-6%j\. D[QDDT=~_xEODtdg!v͆TħP_r%0Nj۷LG<Jf~}ިvqI "-Nԭe]NZؘ!UgF}`%(/N;i^Q+įZdRgGx+BG퐝B|tS&:rstVȮY tGe'(\\8^xE`97`GW\L# <ʗVFsi9HYdEy.=ά @ßAEe  %tH+1j͆+rmC975'_E]N¸-+[Zg,@hoPM5n):O4| +`3Cy)6"6-H . endstream endobj 325 0 obj <> endobj 326 0 obj <> endobj 327 0 obj <>stream hXmOH+D/RМQ.]n jBK9gҎqgRHJ0e8qAFż|zl>.+zXhg_vvA]4r84r0`"&hK$ZGKm NNLtKNAUA6YR^V"vџLg^o\TL)EBOطr@1 v#s o;uy5Y0<KFOfsWIr-; x<|[n08|PNFwrr6[7WYф9.'UK~]GqxPϫ*;'8N4wm j6YOȂ躞ͳ 1Й[]`یN|~QGw ɨʾTE=}{1;БA0l5)?Mg{w1\7g5msI wdʥEł.J=9E1Oqz>)]mZ+&]< T1%}Z.C >>s|}h|0/U9_} ʥuo,}`tQ_-r`*?~OG93 ZHu.F29I(/0ƙhk@CDض6!5g>4!e>tB/0yu6pַclaMÄ6M@&< 29Y{s=>{NneN'e[Tx!Bgm DFWZ3.kŬ@}=%0Jp*V[fQ$AbPDbfAG <- HlۢT\29;jGy28nZ4>k?;ćEA+Ju?o9x{ی,%|PvתּM i4qMa 0VqqqFȳ@n%u!tnW1p5R`HV@kofVEkU{7)~N%mOڤ QMHt~imˇG>stream hTPN0 A I-HUcpha%ntu"7D޳{EMFGq+3N:d32m8w4zh!?p0TO;[dGSBwB5 H-X>stream hTPn y :@H.Ru5iw>pRC}F:`tg}6Ow 3`yK g硑`I,:a_.t9&f;q ,sfgf-o\'X<^GYqsר 3B'hUgWu̗&vVG!h2ڣt)F 3T[Őx^*Xf~Jm* endstream endobj 330 0 obj <>stream hޔUMo@WAx2ߋC0n%D$%k;jYʮ=3o>%ü+bZ <(x@*睃Ϳ0) uSۢl_Mf6դ uJX_xMDMbBIk;N9 M.`.L/͐G D=?1p\Ru(bDճKRKyzRsRUvZt (Rr6ٮ_rQɗGcOisX&@Or'C]kדIu&+oW qҌL{ r;).`DN%zš}hH,Eиb+Xo0GHbhg<f/D%^V h_R_I5]{#>F0.\!A `A`(5zkAy1ՠzFr 0"cxǰӣX5Qy&U@[.l96<RZM3TBtv$ч#Lc^[lQ0,@]8qdB:/Vl>;>[ 1&f2RՐ˜L 4+<ao endstream endobj 331 0 obj <>stream hTN0E /A,GӤR R!Z1)=h3s3nvEvG9:gגh0XvXO"ɻiX݋]~[`>>;O7BIZ=K}$r_pHhfk%WҔ0 l_O iM~.^rUzRtLZzR@ZJhO)>stream hTP=o [u*Cd臚;!@T0>_λ1%\JናHΤhfgq- Ώږ\mp3 w+Y$ˏk8O @)82~yE af,.Q$'VqR;=H>stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 334 0 obj <>stream hj`'P` #T endstream endobj 335 0 obj <>stream h޴[|UE>Bt DDZ( $z&(F@JW1QW_b\(X]{Aw7弼4yxhI,7mCETŴYʳhu9S}3g!u4'?ᶅ./^JԷdܼj2&Y:/npx@zߜ[6hodނy37DQ1dٝȡ(gs%jJI01)ieڟ&n҈tPfPv>28ix:z#J3:WMtHQ.J;azN'x3XO ԴZsB m_ƍqÍ VxP[|ڟ*_ݞ"l/s|GS}/kG_ dC܀ %Z.~eXźEUHJQArcDO܆6(^""_ i? {eHH _`)~^pŶK?v ?H.< ķWÙ{i|s*rzěGOS_(\' |qLt_?#?S%Lx\|̅EĢ(_keo~""KM0b):`5A8DDY"!qqUurQae@zyR u%'UF.4E_#GxC8ʊǗ bJf2L?PBjhk~S)iYmQ2FHR!@Ac`DDh_q?%X_i74gC=iTEe {2C3ʺθ1vxTJ1R$^sObXV`Kx&V1aN,kg|D Rk PODIc]$cm .uUJ::[N%5+DcMMLqQJ7L2 DB_+GF#l?) 5PD qj@ΘaH7X Q!zebrH24P %% G Gdû e2;fLϔ9&@CUN;񠮙 巉O!:~P7JPXLI:yQy>Myj.U|Lv|XIYV|сZ@t⽙2V'cQva]3w5Tע"K _ETZEtnL*mh8s#j2(W݊S>>..~8I``Sfq"0e]"u83BKƪ|LWF8sZǔYS]:dMdbuhD91lbHrF0Yw[{hS&D®Dy@>Ӧݦy p C hooFM57&Ilj>Zړi})w1J#m,WHh Mᴡ] x[ѵS7,H}4ZH \,M!}.T ̰PwiP%}]@֗Zȷf/6J0Qq̀l9hFhfRُn^GـZkOnGAX*y ~R@9+x`WHr UpO™tJb0FK Dl͘|Y胡c#zF>& zdclxE\17l{hśc|B.w7?)QdyQ65Q/]aPa >,rO;[{8M,zOi=Z.RّI!/jܽDN[M8w`N$|:as5'G4[- lD8 t0pSg#nEXs>< kxanaG7v2抧PRacV %/u 네)|upZ.Zq|a:Pg@Kj|U7J+H6c.:+~8YN<|709Vcܦoi[>Nü_"/}a{=D _H01՘v{3e> 4wQo9gk8l_?ށyGEmQe8U3|z~v΁-|GZh9Eִ=n&f<ޠ;0P{I!oL9]^{fb.TZ!p\{2`]8"M~.\޼ΣSfr^,u_T6K ;c^gA1v=h=`{pY0jse{6ٹXׅ*ڋ}_rE_};bu:b c ^\{{yߜۯ1 h(FV~L@P}Pop1~u%,9};zov\ծ7+cyO#,(UFġό.ꈸ;<# y^>jqڇbG=uHRYMa- T؏+iΆfw,ܠtLsME鳞t aqS3 6طwLn}J;̢R0=oS#E9V" qۨu6ĕүSq?=pqf~>b&t_9/J$,HkIc1à[㛾EB߹GDR0 s bc6<:9os?qr)R͎=X9 P3ec.o/6O:g.֥w)}39u"tGG0wZk7@h삭v&lH? NP7w+i!l?sbjym( [w 2d>8Qg*穇EVW#b {4B>٩(JDŽN4Ϡgԋ3YNC)}MgJSVgtvg}Χ$/:s>qW|o$R>M?Nè ĭV>/P P4"cYyh}W_?hlV2K̡<{0c,͗[l6qfznz^gX˱x .'߬3r Tb-e<7K(Qf9lɿJ^-qϭXǖho'\v?0Nxg]7G}Z< ,&ӷe>?oZ-dPkzИեYhPF?Zq .$k]ιװ }%|duV,φsbHkCH 񑀾Y>\%^ҷ< m=.P,\~)|,\#!υgR0+}%khO Y#c Iw=/r ]9S|ob;o@@ޚ*[|_"joK}a#C#ˁ O@@{ "$j2ř= QSg5|iq~?gK1ut+ҽ"P}q./l {1 ΏxCBr=\)S E[9> GH'إb  *pQy<仯x@.8t8l IRp[ 2'3ᇀ-z<\ ,^*t5ær)?%aaa0~Q}fww EtX 1G`9\Mt Rc9 (`Ce??]C5"00by>v؍1lm{zCsL@>tϢ3_"2||(Sc>D9Y=쉐PGg8#}hyԵ\cgPS˳2Yw7-{hq~gOAzd/U@|cLq&%5q." ,Υ's:g@L=ҵv [,qV4 Ne9P)?Q~{×߯?0{F<OBz!-}Nr(6~Aj. p5{$}/lM}eLޒ%_tXȮq7x?uw3ٞ2g-|`XvED)ēz$S}3,;n;=rhyJ^`Kuhz4Fyl (_vaDIP"W(țE3KbOz?Y](_@Qz!wsXHZc7GiȤ4GOBОzҏ"u?XHq@XR!R5z$>+߄One:퇀F4Θ'F+Fo/}?COsJŊ0j'u{A{%4B>23@6Z/d=xM/߈_}Q|0vri:ŠN%vWb77Evm|khK܏Հo_.w)ezh{7Y+ 6<yz{xfZFM~V@ϙAm~e8dzjIMĝ_7c>$b~Az1=43s:5w^BFexORS =E^~Gx/;U>޿o+sSwГlUrCUMy4F CXXׄց}N񕸣iE`EπjwD3H)}~ 7DY)2F8/RO"֫FMfWͅ}rPicOVxt~y!Tp=w {b5zD [: )Ir{S#; y:UC: 3|27'56R{:>UC~PPSAB5tRo2±KcȻRci 51GcB};5 5t1hQ}e? aք3(8خDՕyX5lD9U+T|P5Q9C@1O8@-Y̑o1i Ŗײ|'k53bLdd9eLg&,buL3d.9Lf3d&L3)d2I|&S1e$&Lb2&YL2d0dL0Ig2IT&d2p&)L1dL1Ifd D&$0Ϥke҇Io&0j&=\Ť+tgrnL2eL0̤L:0iϤx&maǤ5VL.eҒI,L3iƤ)&L3iĤ!L.aä>zL2ä6h&D120qL,&& ibLLT294ߘɿ_'&'`#grLc-La5| &3ɧL>a12ɇL>`>a.1y_f6ɛL1yL2yɫL^arɟ%&&3yɳL&LfSLdr&eLLg&TJ*ѢHJ4+o1 M D(Q_))QW:*JRqQJx7OpʛAJXJiIaJeJ*8i [)ʛY:*'8~T81)JU%VIR/U \ϔT}JO%GJ]%P>P!+o:*oMU{Ϲi4MRR(KBYjH[(BBA\ (."b* )"o ͯμy?3ooN~9ܓ{K~:SNRxur 8Bq5*+42K/R@qf>O(ӹ}^=)E3wRovm[U{BUňf&g(PEBVƫV=N.E^kiJ6XՊ.c7b fňfպZ,0 EP5?5Z )V-GcSB T-TK?GZz">E{4բfoTCOZ*Xwn]U]BљDkvLD%R$PSQĪ)\蠚"6 +E{hBiDEaA()a43fРBj&kS;ڗ_1 ?ǹп[8ok / >??#8 |p ރw3w}䷑ok7I8u8p(Ǝkhhb.lt/U {a<9[Dzݑ>Y;16ۊ1 1̗OOa$l'`< ǐ\ra0 <:u?ֺkؽp k.݁VGWEWFTɍ#6t]tNy)w7* eR,+znϮ_X?]X,P(ʼ\eUJ\C9}~ݏ~~.ҧxo0O 9둘Gj=t-Y:eVNYYL UJuJt+r9M)u^LuNQJS"8P:')aDg |%/0Ax3[6uVF+YH<7E8)guKbWL1c$WLY;|B=Rlwu69YA٧Ys읓L6n6ilrrѢ77K&7ZM˄(9JQ:WTY&lCQgw1-2 d ao\,WZq猛p.MB]oP))ٻY^vSxnq_5_;&5hbJQfW6s)ɚ=IM piV4Xb /L)))J_h}쳔?}4T/^?}){«#:iXt+p4X `.? aL PPPӠPS`2C$&y0ra<a,0 `$L0!0A0C?HҠ7B/ )p +t :dHDHxX`X=D`(0B$ A8! B!dX+:cc p.o+?O#wp.piW\οK>S> |i8 opN:cpax ^Wex ^<}=]vv[Afhg` < OAla#<x<:p/w ;`5mp++fXX{p{p{p{p{p{p{p{p?Gs?Gs>Gs>Gs>Gs>GsԾI^[^1SKX(cW3=r8V񑶳#{*1>L)D2輳X2-C߈idzkXNRnK)J 0p.o12T\w"0iq猉Iq&1,TJ59DN w8SvND=1:<<:nK[NF]>4rfH53FK!aabbqDS{sbG["ܲܖ`Z-9|& CGx,qRjJI4^|C]([fBAAA           Ǣu\@[%F춶9mm׵CC$mHl3s^X,Y:JX&Z6+x,ň,g|9XƪX5y df33q] LØ3y YyH1}3wTqO.C֢_;s?uoZw[WsdyfyJ}a55OiyEmg᫮gieuJg+7c,r_)ѾuUx7foV)d`fvm eu3+)tW^ǃM5 ņKk׋hy֥/t ?5T endstream endobj 336 0 obj <>stream h޴[|UE?B4 ]ADD@!JZ i%"pAEE} ׆.*X>TPBx{^^E99Sܹ3L TFe<.4 )ٶaٽ, 6яiU2_YȗCTWxh>TZ\0=>!W)w5*&jvs-ߦ ]s O>{#}`n y Cd-?E7l z Ȳ7Cq"$kuVGfC4M2tShe42;0{wdl8)?inLI?h5m[ iNC5z?+9Tz|Ԙ= FMk4 hw[܄n_#WyoCq=fۋ Uw ?YGiM|*@Q)@̢4\M"UR1I5 i-%7r/q Tx1-ſet-t%]^4W"f /kfԚUt]vg rZGo?o nh3Jc\IwhoS;nچ1q٦>K=JO,B~)Q}8}p%Z*ƺFzjVt+r,SBJ]~\U1=qڠyMthj6WΤ+gT!f[i+ ^evfI]x(&RkķWã.BTIU=7$=ELq?"O F3K'{U:~0ҡWUP~zޢzSއzFJ_ :|N h ք?)4%eȴS&O3nlѣF>liR Y}.}I]p~׎۶i䜄׉uMCp(E~(iB|,P;e RĤL)S")@?w~@z0KZ0ߐ (>Rq G ) 9K!#?<=? U֍T~W Z,18PާR}~lJN/IOKLJU:  3 TvS~ww7-8`RN*@r+9]BiN?o&C](,cLFIN!T>xpmM%'BLnBpBPC/)nw "*&VQJ.!3cHLqS&1$~U%CedG| d/,*eYP\LK66'R5{7/G#fp7d儺燚Su(fd,^PA!F^P4W v\G 9JBma|rB)`Nq.`Bx\zʅŤrr\ LrmA_~HRA~9F"I2iXe*V .mʼnΠݦ%΄ֺbLiz--友U2)dW^(>XLezF3sRy~T%z(Z\d`IK$ I@^NNNpȇzHAr8?yXQ.$BuPBpD"@ PYn( ?4gF !׮t7 P&>XA(;Gkru'EAD6ec4>Qk1%HfYuLJ\y t*tNEGua\U/r1YiLpf*ɏPau{K8#zeZ?J} xER]8ħ1)dwD~pUʞB;}ΧAEngN!xF6Ko@HKj -8[ߚ.݁'롥?S™~ʰmӜS. `z02-C] x tR=}|+iIX2Zoo0UC8` sv"Uz5 +`~APl)^젒ş4PN2ؕG5ҕM4__#\jea-176.O,INP?] e; JA֧)i=i < ϣ4dGJűPm=[.{]o΅l@0s-nMko܃{if+%3I="Z{u.GX5ʭj"|y9= h@UM/F9t=\6-<:,6S0@?BӥCYwKe;D`TL2c/.u$k ?-}Q2>중h/!1}g l;? G8r xO'>qmD.\Q3s<{M5c^>L@G[]^tU^ h(b`PQ@-k1^p'JQèF,A}2 @1P:oن4'կYׯc/!0w@J6&b]a~GS,,M0| ?kn/t90.Ss0dQw75'(lUVcJsXKs=y F)/ӱ=74n n5j4S< »<ž jc{^3}ŘD 7wp+Bz#2~ ߭:G!1{4-y^U.r!'kjS`<67ʩQk/"_n MZ_[<g=֗4! 0LIގ`'%l}9`'y}؇eQ`;pp#wQ%pFp'v˳w/Rv̩+QLӱ~kOwÏhe~E7Z>t 4'ҍ~ȑG؞Ř7cyO<25Z+@ݔ .qhX/2ԃ& uh: sp;>uQ:kPg@K7uO@hLR1p\lxq/16A 0;:n7Z,Oyh~63ca6!\Ӣ/}z} 'AݪI?e4h2-)G]+QcM`ԡ c+lU `L0+)1 z%ь 10Ȍ?V}o]R s)ѹZG`>$7{c~kE9m&`n8̫n9~1Q{/̾'z\qθǾ-{G}Ԝ}}~{G\yYq~g ?}WZ9 h\<?1#(v}o_Y)k&fBߦw䇯S%D>uQ xuV=9w :Dz ,'\ %o N:KiD,9#9@Y3idߟ%NI<.๟]aM{ fRo϶rެos u2VUziվDgcvp)evji<| jmIˁ5^49 # oov ۫]mm%#zoVʞl'=X(gAꄸ[" y^^Ǿwjqڗa OCgVSlc *R+J 6a7xt}3`9i.8'[Bt*}?QeNoRE8|yTf-{ Q6399+Cƈgqq is}Yۣhq8|Ϛ|穼GЎixg 4Z6xly39n?u.g>9 vBNu@zx8Na'N=c07ꌑq'7.@3Eً]FwhoggAj@;sDjĶ;:\s@5g~ ́;“l/|Oɹ rs<x}} !QI^Kc b}kϯ}&hgqs6g8vo97S{~};k?N"|u}a_ 7Pϱ YJm!.R~0?`}u_96)}I@݋a FA7& ozۿq,wbs &<:7Yxl)J͎,ڜ[(LlxnSúw@KIru=Gv{ G{#݃;Sa-4v;G6ٟQnö1'v&7ІҨAW 3MS*eєju=kޣ#!΄DN7Z5`v8iG}|2Ծf eS|L>۩.9wƧ~)6||W|oR;닜}~>3S}y[Eb_ܐH4Ʒ c9x]Ƿ?h l_P5X=30K͗[|6qfQzYgZ+xJ.E'7,_o=d- e:7 TK)Nt#|u_^ϭDVh }gsUYWU;W,k*H6-`3Kc4>|uob`)0Gu^8.wtg8^)X sXjACX =X@$@ y*tRPSCg(7yP Slq~nyPQBz`l2mB|&s=.=5Sg]NqeX&ݮj^7|g} q4Kt w{[j}/?v?4O2/= =>S4־t= w)w|i>ooIϟ}E3ey݂t/jlcK>?k1~ֆ)M/!ɰ?@:VlWˁB+e@N33SW+йu(|~.XlW: ;l~1o=ry6QJ`Yp}fvG˝%W/B"gD-`6|29hށ }d|+|˜-9+ueew;(gNoBSM\ _Yp#H[+EF{rll o 3rYi=*aŒ| ~+N wjCK0+=\wp# (;3Xwh]y0|E_{w6|~-P|rM0Zd{{$g`_t1]|g3<|6٬9IapAa?PgdD4'"C=m?BRQ*}?zPVNo.ڮi |a?A^:2ߏ"o"Hs 9Q.I1;uMkݫ>(q\=8՞9xo2];.[edYӔ&:IhAHbm/GC;aַ>[y=9A-(^*(6->jPB8=ֻ$M徲rt|doI[;6E:k C.1S{Qs''fL#2kQg=uPsFTǹ30-|w+.Ꞩݘz9 ?h 0^o"ojάv=d .QZڮ w\91og-pg K h!Ʊk:6Q= G~0KQNit[(ꏚN}o[9F|u>`ɿJ;3s:S=T 8Dv7l$&ڛ).__:[K_7YB{= iw_}"(k}8zPMv7j77Gv]|kizo>z1x;٨+ .={x~ZMR~_N93SݯLt,D_]|Sv1<_*1Ms?=gS#|x`.8 XDz.U~ApƫxVfo탴h`Cjrר r/݉&ɈF6=܌+=p̃a5N_!! yOȻBrP߅MB*䀐)/B_B^OȫB^򲐽B,%!/ #! yNȳB'!O -)!O yBBR%RHHȣBKN! !!! y@B(>! GHB [V!w SB]mBnY&!(f!7 l^:!B Y#!\/DCCCCCCCCCCCCCCCCCc                                1{ 1{ 1{ v v v v v v v v vA1\պUBԡkZ(ӡku=tJ-Vh\+AKXbH.bV.:/b󴘫bZCbZLעUDMӢHB- bSt:4IZiE8-j-b-2^8 bCC bpUbDzU4-i|)Z kqtʾZ/բhKua=HC :ZtբEG-:klEP$-:_-ZkqHԢeUQ-h^r4ĹZ4ʦZ4Z4EClE}-鸺ZkQGiW"©jakaiCjVI:Tq-t_ZS_XgCC?jGu:G8ZCZ|ŗ::}Cj븏P+omT~uFh6˒,˶ۊk;v"gu݄! i)l)%,- 1 ІmZhu n4wܑ,7;wF9g9{G!kBS%{"˔m:;)[/ۄN_z I :)S^#*|Џ L83H^"tЋ ~@:'tB&g&{:D 5JYg :@BO> z2ex Wycأ!0.=H;b&Wy}%= "{w&}]*wmAh/[ə}Оh7])~)NB7$ЎmO@m%_BЦh# 6P?֑K%__Chu_\l%9:B_!t-]ChK-&g."B #4GlDY3Ah:^*= uLYi) ) 6).J%e5)Hgcʲ hrUe;P}ʲhRTGH T2&7ЄM#N*5U@)nP99VF43S(aߌ*$_/ !P\,P\,PPP0a- kfk|*^B=7,B.BNBdOsl)vOBLD/H@HOHGԒ35SMHEHIHAΔ3e!DB(aԸЋ6.{/@<9 O?>cY_@_cGӀ?hXC;[a7x+_ꋽ>-h\ x}?_)נ~rx_/CKal_nyZQ:zsaapcCЗ n>v)VvI<-> =w;?h}p{ZZ@߷w  p'|횩4ohyjުy{fPwgrGƁɭm[ڭHյu[U0)4[6%7&7$oؐ茺Qz7   p`z@?`=`` `5``%:WV,,,,,,,ffffzI@LtmV@ 0hL4u&jՀ 8 P @1 ( € ?<7 8`X<0L@ @ P@Ս–P0887sw> +^ 4O?=w|8-~ x.W_ 8 -'oী^ xcˀ~x p "  RA3<< x81G.! xp?>{ &`.;n|p+7*`&jq?G#?G#Z1A @1A @1A @1A @1A @1A @1A @1A @?G|#}>G|H?>ys)9E1ow)%ک)=T\i2ZL+2\3ʽ#);bopX'?,.Ba1JE.áҒZ,6b_YEe-SZKy,cDAo $zKѢW,&vRUI٭_sVI2SZn8p^EDsFEaݑWo5YrVr5x\k='&PTz9*gAR#4>9l!hSR |v(^D>=LA1-u^\g^:ˆvPC%$DX߇JNFI8iR-Y**J=۳Aet ac6_lʐcњӶHĆB-*FLM8fwU8|\Z7qYWm v= {L4g#OQMWeUvQZ0zV{eQQI+QI+Zk%*i%ʎb [vQT*TKn9T~G ! )xRTY}ߚ VL #ds􀟻liR^%&@)SikdM&IEU\SW,**%=zԜAY,m6Kr% ! ڐP ܡN҈;ǤCWm22= 2 S͋mAe9(7gS78z\XJ7h'>*A}WpgeBB85:)L(o7Jl<(oo@P}ifgcGx ݖa?#ɾcN%\Qa+.jd7T:jY>y}b'l.O8ƈV4aw{}OeNlmV CSª-v7hcvQbLi3ζ:s8g64scD1 $$$I&TͲhXZ}-־-#l" 8espp̖H`jdZly*KᷨvTt3m{9ZiKfxjᄭ$R )IBJR!ubfaЄ1a aЌ}y1n/a?* \1v"LbHO#ݟF?tu|˯a]]( ڠ}ؒ *ꗒ"ޢP"d2+-ٮ@Uι(XzS)pT#BgP29t蝶ё{f)ַNjsO%ayIX^񻼔Q VȘ'p jq\dQ5S;vu-/*bB9%S`<9:{{{{?i -6Nݦً No2\ $ h&;LkqR.d(pIS_TETe:l~N2Zm=-nBi;<|5m=Z72.%#Tc蜹 әG=yHMQFERF"ʴHʴh K2KFKXn)%Tui aBDa]Xd2DS<44ΪdS_ |_]M*nT.wwEIA`:>Ք]OŷVOƼl-ylX@IFN2-ӂu`e{;QSQEFhdQ[:IuuRTU7L lAm%sJrJt.; p |Ņ]K 9$~ֈS*]Q*!9 ZW*qxT[\%gLPKpNF3,6Ջ9Ae%M/(\̢ խ^mBJ2N[RWSҵ|5]No1+d4* ʜ%+V.El{kuٹOʩť=k::^MPfI5%32,?Zr.ڀZ;s/x F–02-v $ky9AL8S_۾L-cvX!.TqYf3ÙÓ7BV ȇև؇MLJ~k$yQVI`$U* lY Ph7b:.EECW&R7mcHgVw7wFEjT L 3 m| JRpCNkC!=w|;r KN*6pسgzpC0.a]vx3!XBEA1 b\Sb*av[vNd3UȔ7ehB.oQy4 Vĉ@(Ͽ(K~<e9)Z6A%ã ر`*ȍ +Q7"ÍbTP rPAUvu 2<9 N_p,c2żT`.xYYScpF|,#~RϛcV(Q[,E͠܌p{, K8 L[6`sb&hUF˪5Ж6"UlP(dCa+ʥP+]ܸO\Ehl&wc""z)ᵲrr=Z~Fd!@"\cv{ÜL>PkuJHie1J Y*R|#/cy_ TŅQVZQQifRZ1ZIۊ9ۙaZc)k*?0+$s`L0?T>$$F@2p(+c  *6RHGGMF RV?AR„OOULet2Dºa'QvqaeT,3w'NۗIQGťyHXB- rřr)_zdbSЊ}rz wt6,]- u*HɕIK|'ކœ3խh J4ֵn 6M+wn0:΀ۜsV4vOj-_!d,TH*炋?óXQhna\~Jq0R @B<>6a|€W+53b ^R^fhgC]Mzc&9avWMDu.$lMլ3n0Ma?fDsٍkQ!*N"xHcl#886QobDk1IY1IY1ccbؠ4f6v y\{ l.o hNVD{P.Y /+\/:6퟽% ױKPZئԏomHE' aGƀ6\6SWLYEhعlkZ*bU{ه|cm81-PC(ao+I'lL׊L ev}LNȐLM|jmP%Xu Gq*qf_j|4d#)ONaqsL*Qj+z[;f̓V|s~ f4[;yaқ:n4is7NnXw }mK*=G┕(:KZLrI% (/8֌ښJb$$>,>Pv@SM%31J%V1AR˥,-a eX3ck38h,R2U-O*棚)yIV~!-w%;$GK_ʵAŒSf:ף?`V2 gVTglײ qK<_/ a#177JvL\2*\G\a>/Jޜ97EtzI_QS̶dv񔘭{^G]%.f}3=6|T ?qfudqPY毭*u8'&o)PO,U5\ꭜ22wBV9 "|]~x0Q..I=n%NZa!*" ->!+*< #႖FG>ʼn`tYAMW' <21^\TvũPt{m~Gƞic܆ɑ[2=Ko^#MP5,M.^t؁jAg<%+ĕƫm}~P6Kp+,qIw!?94ce !q!,N=BWQ@fDǽyX|xxSB֯ĕ,qK sִ+_ Es,RZ[ VƂ6Ǹ?~)".Ks,O3E1*jX'H(5, uf50~,*LY6U\5-lmʙ~}b /W0!1aV!7!e x%>H H/~.=Z͌J 燥 K%ϑӜQ=F̺VOcJV3<](P|<:j^{\JDP E8<ҡ (O:ةd ͸6ߥ lGh ?lWcr$[P9J5%Ɩ2n`º]ʊW>]ѼJ蘲=\ yxټ-;s }۠<-+>_$I O qŃ0\u^yM+\FxZι uB8c.2YxZTVh 7lYD]&6,BG`3 ۘWv??5H}q53h~I[{˫bjt)1EqG23_B^[kggKv<_vDg؋kg5v3Ei**YtǼMy^K~Nh  VG˨.RD (D?& .:Q]|5K2.duFl\q ('\PPG[BF̷QRX.<T~)hZsxGQ%qTW]VUEVk߭۲,ے--c[-[!',C؇&!< ȄLlb&LM^Ȃ@wnUuKEy3ײ[o{ιl͑L&9ۜy=aKW*VZo0%Cqz.km]{}^vV0u-0B➲]dT٠QTbŴ"1=_WB d[d5Wq n:eL W["D : c!d HhVpf/^s5?<;40$ j_XUgWgɁc%Iݑ=e٤#\cK̷cm>)R_MékZ{MC0YtNɔru5oߡf$#+B ++\K%~%ג*֩j{]潚< sμ;ګdڵh{U"Q7j/߱d}a+Zb׳UR!gbp `q8ma ip4eWQǭhKB2Hm.y`032!|IK㲙R0R%ҝDRJMI!kasEM&7$<&Ò$?bCEl!+ `ҽ0 j2z^kxlB >)D7iJo$ԮFv79SZ#q~%q9q,c2q,c~/ 'i܂[qKn-ǂ}> ǬU U&G%Tf%օ=u a\^`\"4]wDk 6璑˩nu- Pr|{$PRLX *nVuj72l Jee:E@0g? X_g)^Jzy _x[i٭3BSfjF!T<3dK.3Jo D7CU@Hђndz$.M78]Nn-#v+7bL 2+FcU&Cb=bP#󕅨Vg7Y-T^$7{΃=ˬ@J)UhhUl$7V[Ӯj᪪Hqy}E/Dg1rITrg5- &zy*M]YX'$x}~P9$8IDL"k.KE0Z,NհW"ÅdZӋ+^49E?u#]/H-Ez3-D]I(lq:=;T*9gq Su|^nFh e-h?ƲLtfY_"UvW[Y]/zmt# 9K%s&h^Mtq=od@NxxޓI7Oh-[YD0j6]kSuӖ'DRۮn |F/ UxFOEY1!ãFW .Lv:glRC%~5<6eMFw뉺wkt"v' 'ȄKr?w;NGOQ+P 8vLeX+5O~e8P 1zpfx k<2L Ces NJ>et .X,~CkN#u C YZIEs&W+R;`r`V70}0;F:Mў9Kx %U2U<* .LwH7ߢg* rSQcHi8r>+yfMd5OȿfߡG+[kij5|olQekC5wjD3oX2R<6T`j*Z)ӄ {;UΥZ .Q.y*wrگ X_cĝ1vY2M[u>M.{HtY9|,N'lnw&&(+uy{>qXguKǢs! o.Q t'&a/<}zq:r.ǹӗ]Ӥ'Ahl]V]8z?zlYM`d43]}_.W*ξ053Ԯt݌wAY ɊJ"4 @v'T* ݳkS7 WXI'=Π,@Ege`&kdʆFuغ 5k"sUϑ^TUS<ٙ\8ٺ3)~Z[^nYwd5EWl۴:~ڄoe2j0 =c#LDOj["psL.X|mRl6K}S5џtU oNY&XQOM_bs.a ӳg5/V /E0`㑭:p`Y5$SlLA}9~jY]?7}]H={xp?w*>lʊllqjX1RӰPeMcҺYzx?:q.O?z׋Cܯά]$ݸ\M?Yݲ$8f#|X0/ }'{Bh#dֵX+Z"uPK_^8 :K}tyRP7%)vu:].'T8;v=0xHsVㆊ+SqQ䴉rB! ڝC]fusb#]^&o52r#wnX|xUyfxë*V_ÀKQ&c T3uF},ua+~d׹geVV,CK6vYKqH;َ;qm; 3k7ûponé:\_ݏ0YB1aY366ѣ]qݒ$iXC?Q|IhUZ~65Q\]GG\;v@Mm^q}˲Ca7jnLޅ}kF^{Utiw7Ծ=y?8zKnUm#U26ѲÛiLJ6o鈚]AVdwI6Hbs8E Mh=u|OmG 3!gdn=J:Bfd=I(NRM ; X#*+{Ш\Hy?kTn:ɍOR\xL̤~g3J\3:2Ў;AXM4O*0KSS aVpJie-h9W}VYwh'lDMPU۹rx7qUظim뎱pHWM7/[}Æt5}m;껮^WSٿf9tp +6lm ^7t¶PpAGO=Ē^zVL_f={K +%QgrIdnz3j@֘Ky0ωƧ}C9~q ?=>|&P_>Pl4Q?G8*6 %(يiQR$5&DR#hRs.&I%&7(jrGEDMf?5OXI@R:*}jRzIHSa;E`oTnC8Y7Ig2roc˛$g<.cL`ֹ³]$6+ 10Kt &+4`Fg޺d| ެ9YSoyv" epS[ҫؖ&Rc22IQa@F|qc2W:|,o,6XMomJV*:0d)VnYeCi'.%:!\.36lmT_s8륀,h]:u"/)q a$+!$ۀ@*"U ݪݪ&an˒L .`AzcY 8rOVRU(pހȷEcM2q6K Ikk*n " l bUe!eBg&P RWwI*45e)B4W-q̺+<3?guV=G[|ݪ]ԪqF c'k^Vm um̓ llh_YkgX~GD. e Ǫ g7$zꃑB}NK`ӫ,no2RDڱ+ViV*pG8å%8EAq ǜ81; 8(S>h+IVN74eY?~dY?\!G$*ED )J *|@@LeܗV&I05^ u5HJ;E%?<7 xFW9qۥ{v5b&RA0{DGTn#~r[ -qiIOfG_L5wkլ9ހJhjдRI:){KЛ r yj:m-=d&HApʳdR%Ɩ%":),\$UxTH˜[3yKHK[tXz+Rb([}2, 8VR⎛q#t2#?,:il@ ӍH "=3o])i$6M'D4έ%0Rp\P;`sۅ_*La>|o>:sag~ط΅軇sBW½ !OyE3wF»C`׻6wH ĶGs%({C]E"ҍsQy!~QsX敨~z%>SDEQhUiN"Ԣװ{n7;Al ֵo`O.6 ؋8W x1 +sD)4DjF- Sh yYh%@j4mDCh FWl@;(ڍ12G<ބA#G.rlzƢ!QCf:1,*o֠u1lg {1p]s@FtF?MiЖM>stream hj`'P`  ( endstream endobj 338 0 obj <>stream h޴ \UEg{PL2/^E-seQTTL 2\SQrMb?fT֓ZTVjZ.eZp9^.e|gΜ;3FDGwѨgdH4nc'"2Br _cDD* 61k_o#_i6fgf CV$__~b=|̄/F8aOʠ*s^%pwgL}\xcD̗wKtߒ;*3w ^O{ 3MQMg0t!&h@>X8dmToG5O?4Fh&ͥN@"ZNkh=h?S?qO4S J6D$n5`#P%Q,J)|fHSHՊ-)â O=5[%әR ^ԛҨ;uD ԏP IY4) 4dѓK#ip q$fxMI>EO?')dz-?NŒi4Lߙ͢pߒ|Cϣ?_˔JK2C/UbZBT^Qe KqkHV *ʔ5Ƙ:D{0w3t~ tQ:5Nsmh[ONFlqVٞSU;y#s荩>~%S{m/Y'YbY^IqK>em-XIJƖnY_ƬuP:.@oF̿aoIoa.(]B[i7BēlکF^ڧ_tP·݊kP>ft>0vW0>>O1kFI5Z=:N|`h§"g)(*n@~}3GrRbn ]t1.6&Cvm۴nXG[4o԰AZ55W |_r~vsQXg\Ý:5ag>ti\tQ2eRfJeԂmMXaӱM듔 guY_W GlKKwĺeǦ hgtTo|gnNS۪QyZ1ؕdr٢]v#G8 ~[0 L898og|B=WgΤUPLW}gLuI@s;/_*)ɰ$Z7Hzë́xP6 e-"KJ5KstsO> ]nˮhP~kO8([ΘRR]Q1DeXu-h3Q IF\W샜1WH Ql,#6?=,˙3o7f&N O媞:3ˑJC9S3d/9]uua)ԭTjObYs{-?G* i pᏳCDTPh6T-<+^+Naiaϟ)*QW02kԲ@u1>,aʭr2֋N(^ _.d (*%:R4'PTblkտ]z8$IUm!3rQ=1W/ӭ*QN=ю|?g2s!9Ҷ9-+6çt;3QQ٭dmBUYS $_Uh]R:4CST'u{0Y)Ƣ;D\vQ2)BpȀ)?>t{QՕ@mH<2mc,#c,J:J6mc잧ӲEѕ\]l.gfWGJy)ICq䜔<J9ұM԰C/a}R]a7juFt;erPTV4 [OH*Y9 EzFG<4}T!KsՓ/MIS9EfF|Q&ħ_9C٨G) E/K3r"jPӠ\jJ21% P+dxr !~?$Z4*vD>Mi=AT, ~CQe2m윀EZdG| L8[zsDASj5DZ)Z0rqBc`SZ~iz W|e?`_y )M;fCH[k07T*i+đ{*H>7e0FD A~RASˍA Hd&( )YbDS2E->n+y(ܥ<+z!hS(hCh خ(UDS7i#]&77|VʖA=۫'k/hm Jp]lG}S<rBϤV^ ~Y$!Â;F 'P9m`'hkOke_2m ԆZzWZNH{Ɓ 7iq J?I/ K!bcj^`2JV )%[ r40SLk"Ł!JLCy<TP`=,W;"~-t}&GCNLP +߰g-Axӱ)\L}(S_p:^<=ژ5\3X⺵sBN6XD kM(Bv[1cs-sVnn[XRzYws`%>a<.nuaMܫh)9yV D ր$cHI nbEikB LbMW\ |k ƩwNF^QvA'N=iE(g|߂:Q/ ҟ_W}݂tڣj4!.L4՟8Qm;ز1!'كvW^iNzqf?K]գ{-KcCooQvRU^z!65ZظOI!OIm<1GoL? g#qzJ&b/,d tJKA7Njus7hImI48 =ghk0' n>?ȦMNG#N+:'נ$w;ln͹rnjMۂ ]x.#lX":ֱ,)k\l-+kϧoNzGk~G2-HgmP&IY|֩b. f6 #P7 Kh8n M߱tZzւ/1jp C]SA!xY>UB0_z{E`*Fob]D7tN bM*vP,ʳlgi,.N1TŦ,F(!ptW}twmi9S| Λ$kwuF!MtX:46ԗPΫȧ2꘳B?ߥ ڢ%T/Peׁ4̯ l!8;J9~I|}J||3_-0an Cpai+ 6ToqQ]Ă MӁ@|sQyOSgoUxBq`QP*|Tv&ƆM44f`|uy7z7Gz{8xVó!%M0;-5C Ƴk7G*Yyv\]b+[ 5f<c&N|ÒHzs,i) ̒)ţ-;CnD3֛esp@xr"8LC( Vi ֡ \_70 B3z͸Hu:M y/oH=@LZzeon1X+-{wܒ|95Ewo$>{.~A z?{go-- k/tK)Kl/4XGK8+i Mxz생^,7NzsZz8o7NL<{yg l{.+`/*/Ā k` if)Hz ~+_cl$ҞE>)S(0SjcM{Tڱ6۲:{v@>ʻ`Zchk_Qj6z>Ї.>v[>ǣ1쀾;K`gv6,袿I,6ׂAC9A@]ikMh)1DKj*8ɳ0^}vA֞mU8ݧx/[ּtО/nG'y>'{+ w0O׃m*Ib+LEkVy>? .-cGȎ+y9:~QpQKF>/i{ipAOBa|Dq[qeq s}@?J!h_>poí kQ %!ƑCCV{"a=y7B?yEMΧq,a A7h8̿GC{ {g6 skHGз(o UTCjtT*†;gGUe=sg/s{6ϻd^j"򀾃:<_zB#nڴ7HGF^uQ.ioWaygڻ/|'mOyƣ[;yƳ}Z_f]YfS1+.S[6elN)b,Lw-ͳk 8C ״_C+/R>oWmoN,wd$PF_OX;dQ ƀwY DK.SJ=0ek?G=K{`<}e2{>ڻցNk7PXHM#7ݞ n9N_a~6Q:?5υV}a(0{Zk TN]f`TZg㻂n]~X9;\ ej3#sl5GtW G}: UT  t`=_ h0ҰvnׂL.uQ Ə˽0u]5LmiWBq߄!;r?FG瑙M#=s{9oT)풛:{a1#A3Bi_b)^9|,Py.#/Ri&Sl/ԣ2;^dYoUGor'bيh[[qVrsO>)o7`GL-<6л["'ǃrT/Xћ~6 >+޿[~9G9?ko%a\}(Nݬ5 zǂAWhWNۖF#яXq %]!|:R;-۞w#rO( } goUb},cSO^k9ڂ6z]\-噲Ph+m 6. ?GM5SkFy :olowc ߡ"Q賗 mڍ=J.ȳl\ek?k`Ϊgl hϹ@[DV .KƫslyqY%Kqfc(+@#WZ-e^?ט1{iai%,hTn@^@nY.ur%{m9$_';u[ZsMw',Jkvm}/NA4گ}VkOЋ%f8^\6ռ&E{E akl8 +?}YDHlx Q?%V5 EEcG~] (AM<4Uܑo x^UC˞jBnZr7o$Y+YIya,ca;cúWl7X=ZU}+h?C[L:r:tӡJÿ~+}=cx1/sKd 3lBq8,H#]lȌb Fo= gܲ (V .' k_l?Bx#,[a+3,@p Ā Fq٦HZ02yɨ(^7N'5U#yTB;b|*! Qy7~@ow[H{2;kp^!;:w{o篩;@V,U¢_w K" I G>GܿxlJAgџ!RG rꞴwCI9V~ n8\aޑa˜=s9Giu"S@_pb0|>_d_\Ws!/`>y]^U1~4L!#xkzG+Kxm 3P1 D5(Q[Cu>yO_ 8BZ!-3z[?B: &ȼ7-]D"_֏$J,[:Du6Whx.@aO[sJW#Qt7oIuՑyhaLR:?Ԯ.md픞oP#wx7{9Z{7?i.?L(p ֫ۛ l.NÆYIXEbugh:ۿh$#sZnvD`/Jd,z |MA-y-@GޅƷa5"[&ӫu={7o^l=17/ M( =4zi;Il}@Z)/'h;A$o+I'2_勵X(g謵%ddXX{w+Y ?`c2uA){X"2,- vH#u7]n5)OmMFTx?%~ ܰpaeP ц@gZy^ogC t{p;;x`9xELqX-3IQU82yows`8 < gƍvqwjOg;QѢ< Rx.:̎E㈻I=P^e+a C;Vs, fn5H/:P䃃 lw0b= `zqG}oC;yV<ʍAV9: fX O,| onym&Yf$cγpG-1)aRi-޳8gg%u^D5G\1vc+:k[?-;Z^ELx 4)j+7ط&4oW$je{e4R ;b $%{!JHiBH% |wfnn2s3wsw5{>xzww3p3.VJ9'vy8i Jg"" N51ryXbhÂVgN 9hEDh ab,pl!%0`.fY@UTL4̦20L`P="BL@{ʈ`L%Ƃ1`4f8Ɇa`(9b]y d܇upl NGg N}:H dDr"TsNvK6YE0Ѓd6 B 4 ѢL` p L,~8~?xLGO"߁o1|F|_s>hQ8s,]w&Q| AxW1{_`xσP|<Oq\qGG#a؃u(>Npb} A Xw܎mVp n7s1q;k; WeRp w-8Xp3:Ef?dd< gوg `=XZN,WB{ N\/Ah@hKVz-;M;6 ޭDw-F;"Xq1;6>jn"9ܮ'fYN.Tc^v`frt$()(N`OM!AM"&r[ms%s[51w0#Gm01F0n_h(.4r[|n<ؒ[bKDbAtfcK^lB@&:3AHEA'p`v\(ذ , Lh1bf[kdn]Hh@:T(@C}ȓ_)'(ǩZ De=;K^:F5_Qc_sgO)PcG4>{#Ôw)P[7))oPu5ʫWh2ye?E> )ϙJϚZgLɧL'7I%cQSyT =DCyи\m I;aie'e9zb(RMRl340n'o3n5tIPfM)7P\Gr jCteJm(R.7K7J鯑._']AB)TU~,/m7gF7.y]K6t .OWYךh;]~Z^]-WgDW{sY90F^#~шP#"ֈ72 ,4#! GBGC" ={w~[mT{sM &_ %4WAS8%X"9f;j;fS9`XĀ-f,_z̪`DbLbǤrLTt㌪ Dy  ㋂CN~ 0Jt]N)H$>_nmOeYL7c^L73i6ǘ\=ovA`vA,9*1ߴe Y˜9'vcܲ.6q3k襦3K|bog?Ĝ~ mN V _}R0ƒ:df*ef]9n&3PDg:&oFU1:*bX>rxB֓SF+lٶDfQhG>|ȐqⰡb>fJaClj#ƩfVt&:OU~R#JM?M5ORi ZJ7'F]7͞fV &d>Qn=q`hSzhfvj4'])=씓n^5Zɩ.]^c3 ;őXd]̐nq򺅼t?fuU.t#`ӟZ`2Ҷp fhnØdw )'a%J(QD%J(J(QD%J(QD%J(QD%J(QD%J(QD%J(QD03^U_ޮOZf~Ccs ޱٽc lP?:*9c{*6H4>;ְAi?bn#^¶1/%ЫMc-X;40ՊhbZh˥#X+J5f:֙5 Խ^멳ֵRbPGKN[JuGwԔGhOuבm4$[_PRjlo {CpK\VoeKSs[ZP[4tBIeq%gruB3oK7Նz憿GS=/׵u.kiߡ)g |pmk^gLH z,Yld[XrMIH>stream h޴ \UEg{pL2/^EͅLQPEEQLAp_*5Ŵ5K}}Mb?fT-Vjj.ep9^.e|g̜93@RqJܥ~?Oo^7 4O~DX#'|Id?dlD<.z5%jȀ̌~nc/b*=H@? 2r쳹!<ņ/;J*wd~l&xޅC2_/3s(o~fHq1tK=<3iDeq g,0֏.?F{`L?MLD\d{PBCFn`a,q|QF#H3|i@{4Esi>4V:r>:D'g | ٨-.WFd.BtGD+dWsE{,gg,JE @= 5EӞ:R unԝҨ3uD  K(? hi0 lFц#i%1ci-Yzq;^& h^w-L` Ni:̀+ Lz 9^_.Q*Ы_4> i[I|zMr/V_Lo RZ+0zK+S. c h~~Nkt>Ageg񷿷Ǡm=-;-VF[qf{NR/7&<ɓL˷;7*o8+)|O|۬h .T[׿1+hX<%M0mmyGi mE0~xҔ,N;(C{U(Y{ʿ>,tG>#1ǧfo;kP#ȩզcF_A~։"|-@Oqzz=RtINJ)cƴi*:e͞hxD ^YJe /g:gՉuƥ;\a.=ٮ]]vf@#Hw9 +HWESF#eVfhoJ-Iu8bG1NVGR*bieOP~=L ؊b.-= 76=q[ [jca9 źx،~Ĥؘ4%6*/ˮr u:{s_L}k33P.}U3UsxLWgLuHNG B块/dX[$̈́xP7*2sk4Aj'dEׯb2f'2&}<**6=+n_;\<,OuĘ햒ꊎ':zؼ>#/1P6CR3ULC.1W6.CS1^2/gR6j$N5vӈSBtJXlnj,W~YԐPWt/͙&{yŅSxb=۫9RYO##RA٣#Zy+^M;mڅ?QNFuO^xdsϪej:b3c|*X$Sê[d-v(^_.d (Ŋ%:R4'Ptb|7֪;tqvHꑪz%)EBf|S3PD{ `\Op[D;r̝VglZ1>8nθ #U͎͋MLꚜ|xYTYuHi]yNmzR^6KmPnnbk:-R9IʀCdN!ۢrT*wFJiw+3eL7eJ&I1:y.m@nzKs$sӘߙl-QRemRn*hh9';1Oa@RfE.tl"%5ij=ATWژ푮$ⶮ5U>k7 ֓!ĻJ!RVHEߠ9r\iepvQ;g3t& [P}(RuI5%!4QNDMwuCݜKCLI&D=,SbE|-^= U2įԓQݞfV^^`WjӔhD˺ETU&'IJαYdUNvDg`7󰟜#<R|hw^=eXSS.r`R6 lJ-.p=Yn@% ,.ʦ4H/GB_AzPaHH_&/1R(%JU YnKf48z>%KhtJf'@] tc XtVJ?2$},7z/JD%H0* ׫d$Ÿ It?j9Z*X<*ͽ_\gB"=&|8_b})fJt4$LC-$<P]u*і<'R[}=}!,4.6p]A2yjZ ᇨ9`Q>PJ[SQ~՗S:~XF3+p4'ܑ}*=_%2j{V_ 4 \PWb4+A[hDy8h;JLԳ`hL3})nBSTM\ Kn]Űc@)'ɅygL ^Ժ8Uȣ(A;AQ !A @/0]]=hg(3QݡVl)VYV,qM!ԩ Em -Jb)D\WR&6VMEm7QEeTK?GQQ;0W -W"iȳ9c+\>FAYfQ/6^fMyBFyr.#?Ϻ-Su , _L  rV3A:n@+R0@8 ={A܆{I)~fyפ»`}uLf {8Yd¦׭ux? 7Veb=^Ht߰qr-dw#>12jnUGޅ)EG?muHZ"ckȓZ&d>ٽnJgY=O` HRƘwc)ZoEYCd ŷ`F}t=CI`郝շ~onhzRW^zS-ߘg`8]BlF>ARk=w~Ag$56`zRyC1Ɗ_3ga8]?xzCNіN RF[wyeCEM۴X{xc2v+G^7QKdPnC)6c805(Io־k=[s\#;[k`Z6c=b'i $8ֱpkju,KCJ#9[t%57c mܭ!2`F egbqV@ rmkP>fJa>^o mPDGN@7ޏZU9Y5qޘJߗ @9 `g6s`C|vôL0Xߦ<_(d|ITޒV^A}ւmlbC)6j}6qEP=Bӑ ҵD/nD^o@&]GoAKj&oB7 I&MutH󲱒Nh&ޗPϫ;:ȧ*q7 ڢ)T/GnKK0K`7eѓ %sIA&|_߂07QoЃuǀzo7Ei|"*7`qRs;)]A0-7LNP2GX'Ϫ8~P~Ba`QEP٪j~T6Ɔ4db|uyz"}vv'<%;%# Ƴk"BȎ|t2.Pݠvi:>] & 5ӖIG@-!EmҚy\NؖZ.t1fhgϋ|p\3H*1x&⒰"Hо;dHҀ&N+pDʱB`bl]+cfqҵ֛Sճ}wb` vB^k)Pg!Dx`'`Ҵb}}XW'0 =|R,&P7gac}mt_;e*.F3m}w:Vq$V#Ԍm$}|G`gܽXG`}kwU=6΄5lEYlEӂA=^ZsZ@#b\TupC>2` @<,[/V88KO'n /XA+ڻ?ĢA~b w[ZG0o$K`7j>?<00,_X:Fjtn h0>J<1`F9VeׅC^Slo=5'dls1@8i7Fg7Y)q)W ;.Rt\zpAKF>h{hpAOJB|Pq[ qq s@?D>}ށ[Q-ɶbݐ6 +{wSQP޹4%b=Ah{ }}tnw:yHڭ7I{kS?9Vt}{6S_%J=BF[J,l }f|x]%-ÿ ig_wPY泷+TM8s^{f m]YA@,:z#2[Qvo?b-MvI>[ j_X 0=\'O:E+j/BƕaOTj`^HQ{kkɟg텽gWv'4w?O|aU{eW}{)ڻքNk7 XHM#7݊"qaz;ݯA ٯ44v:Ѯ W1f~ɛoe:z [tGLsO Lɘ>!~6NDJ}ϚB>pӰN=| 5yN4\j*ؿ~S1PNm ໂn]~X9;\ uj3cslmk.'(+G}:}ԎM`=_ h0ҰvnD&{(@^8t'^:YV5 }Pꌐxw}X >?`y_%KȋT 4@ޣ;^`1eɱyg ڢE o%p[ }LPݘބ1]ʶ^[ClEUq_xӏ_BlGo^&X[WZ~9G9?"ko%aD}hF5axp]9}>U|W1V~Bl33nQ1BYO;m-mx.k +W{Mg^ n8KSkQaIOcbT:l Y11P7W.0KrO]԰;Ҕ]3g܇]Gԛhmmʦ@/˯ӛ,VXjd˴4Fn79zu p(YzV u@?!kOq?9,vX3iMZ_qQC\@ 8 iYd5c{ %Х62"}1 w.Ůo3> B]~@us[ C?f mW&v1jJ-58f{Al5>:LiM>#aUoT|!&NFb>zM#)gi3hbd[3em=ΕV꯭hei%ga3V eğhx岽yl4T"~DG^g S-ڴ{Ʋy`5]g`<~7@7LZΪ iϹK@[@OV KƨslyqY5Kqa+@ÀWT'z-e׀&0e948z@_n@^ ]@nIǽҵz${m="_'ܻu[[{s5w$㫏v}/NM@_4ڧ|8-֞=ZLopmx5ꉸ-X;2p<'ZJ ZS1KxMbiAZS PjtC!y&҄VVrW51{V{j u i!hfE..T']Qԍ Ij2n^yfu`,k.W/GS2ynnS 2]O+mԃ1_Rz59KFy=Ezz瀑ϋKda |q8$0#]lȌb"į=g(ٖ'lj mPl?LGxl V>*cHq٦00c29(+^{u'UU#yCeǻb|!2]y7Ҷ?`n/ڷabdv <<zC1)c{{G׋ {='![s%apyGs?swٽ]tyl։Lq =a9`|~\es]M1|>y-^J+a>) 6AfGx 3/E ~W@HSZ/@aĀƨJz4lߪ_-I>}<;i<{0`G@gxQw̳y)=[6ޥ7[I;_"bAynb_v>Z""?2MK ou,N@# }@iTv;w@ M/tt}?# bkB)*nܠz85ߡZ >bM4^n2[( CtXL`5 ԓj._a/E N~ƒcg(uק~zEz{c=@2Saւ%=cXO%iaNu4h9u IGAO;,v{n_˴~F=gF6o-Bɰǚz5uҍgp/w9'yǛЫߐ& =t @٥cw>؜}h?翔яv&K7[ؓN %p7]jm1WHQ2Ϻk)K66Y AVڶH3YUQ KWv,7l xՆUdXP{+Y?`2u@QYa=,Y;>qtw/}˚'Ώ6r &M#snha8Z|h2=́s/÷L3APt'p;M Y?< &G@qX,IwQ)?29яwڂY`% NA |Aq] S.U&^ ȫi>'Kfǂ1][$?{A7 0!ޝIt n7(/ځ lw0`=`zq1,#[y*V<ʍ@V%u*D]Zc߀,@m[fcα-7jR)[3񊉺g/ZIjpܛ xյgH3I#iFF%ٲ-˲-رxE I P PR@KBXJ_ShGB(miBkhI߳ssս{ιwQݓ&~F| 5InD*Cg=H]y_/>Rc0Qy86Lj.z9zk,{Zp[؃p> a'*a{؆p^ ؚ,lA، a#T`=*\Yw+` jU+V ,G !",CAXu]B'BB;m-YW;`QhFhBPN@#BCGCEAGH:R*J TgK !JJPeŨx +B 3P \#d/'\ p#`GlJ̌ D3"P"GX]ֱ :z FP8>00+N#|p $EK>3{Bxeym8G? e!={ M u¯^Ex%k[%/#'JOQp'(ˏݏK/"G¿#||{(Gxa,+]¿AvVZx[D3O#<=p %>pqFrGP[Aw_Gxeyak"|{ J2!܋%{p7]Yqά pGV gnG VduQAuބTzPO,f T٧PeW#\r^j$!\pdEE.DU_ Q[!E7A8a7.;lCw֬X؂9k)kUƬ2U-%Z(6k&k:k*k'Z!@X3Y w|/k7f-e=YYs %v"tv%fxҊ[eŀ欠.ʦ0P1+4 gu!" B PT!Tf*%ʳBYVPG(Em)A(FM&!&E"aB~$j>ϋA9.T܉@6 5PDvZT΄`D0 (qY5貦sZA@IDG)N|rH;O@+_?g ɸQ~A! g߁oAނ7A~o :{ *+  [4lSANcKA~r }@o!?b6SVϓoO O<#OGA,Qs< @..2w|?wP= _ w yDsg/˷o0-Vf 3MC~d|Y-_WWd.|reKGf8wuGbְdd.9(sA‘ 2O6*uOP'ُߴ߷ g ge×j 6L`8{la \2̛dvgٝٵygf4-#[27f6ll^YW}n5#k2WfV UfV@@77қ^Y ՝LGLȒL+ts>7iR -\xsKqzEa#g]蔝Dс/q9nrFvBm/~e{FY[ai&$Djߤ[vKpQč,ck»)~0qqH(Fn4B3e C"fePL/h3r2GdPEm WRֆ1 j+pQnu=*4сX3yDl#_w͵GUCĢ#ޕCfOO{fA_S¥ *~BJtn&9_Y=]Q\suM[Ըr""䚊_5Yެ;.uŪkjLLjI9EWˏ*3ҰH]|ޜЪ%KV/v7Y.^J` aeSuRh׮{z%)Ze{K}헭R׉ XAmXdeYG7zY<;6.+Rtl2\ndTi $:s)9sah>9:o3i跘nhHnF̻eiF/L>ד3K$'pQC)l8-ڝ"? f[ɄIHvgE homXrJ~c>!DH@]Jׅl"ULO ,ґj[g#oddViΉozi5?jO.Zoj :R_=FqZz>v[c xk+ a+bY1gX#IU=}FgժhZCBn!3W' N;>&X)`w@]'qwfBtm9)& RC4N|{)VHIk]Iqa,E=eI\͙v*npM%]l#g$qc;  8*CkqԮ'~yvF09qVcE0qjv:)s{i UtsOcƐ4c>k-n.[RK ƊV_ ˚|7e%Ȓ%c%_^5Wif-01\ `*Y#B#! :,qhq#dp\D$d&L=ڢha)\d&)eyL4lvf| Qfz-:u8D> :GkV/]a/WR'<8dmdh*GM; -QYqw&\+zg*$pjVNj\q`ʵ #hۖIbI4`r:gM'> HPal4dKVUͬ4ۜ|3v$l5ݮZ(M6ڤrZHo:3CdA/Z'$;0̘E7tEsߑ>ZNKB<4<5Ni?fkb CiBD?xm@=xo_I;x~, C]QgjuZp ͢j Wl8ҏ|ǣgSpZ @yI" #¨wlͮ!XaYrTywjEhb߻;>#jb%RWwH4hv5 j┯{ZaGk2_GmVOGa4Ѵ[ Q:Fb}+lZ VC'P{!oP?mj?54!OyGPN`@Yո`OE#=T6+I"nO`LwݪwfxW[_ʞO~n`O9z^_[yrycpg3Z~$"Z7I]e=U[JMwZkL X#VEXPm۟#)b11d^}"/Rюi4.c^pnlՓX8Q["H\~ UA45F>yjxl]pCoHVC:,zYи,V\UV\dn$~C#9"+EL,*U7\ds-s|/П0nY\-.҉1&/OF3QeRoj|׉\FcMn`IH7U4~|~[ c Yt}7C [06lCX4844|bRjtʁ4߆C;ZnI+v-v`Q y~E9g#1Ź:vK!Uϝ";?ABP Yhy+ wЉzbS~j>R+?uؗ·WPg0,Dy=4~o(S܊=W-Xr~.z{y4VH7U OU<$/Ў|=%#9x71F[19P>GYV& }Jo+p{ HRgkzš HpF-E穆X/ca;qq쩕Σy \h-lf 28FxF+ES"-kk`nBVRbQB6rrU,C0P K)^[oؽhI*[[ۇw[ ޾+kM1s+;YdT}K6]H,pf;0v#7sz;1MЏiyp$wv>-Ve&wIEЧ$1~HM,SmLhѨ1U]}J?SwT ⪺_E &#]ի!^;YJEʖ%]mu ;Jksٲ-{awf/`5 fۍ "=ъEe Xa@)`Db.3G-fOXVM0T1XoF^W5i*2iuN|bE;*= K2cזmBѠr7nK~CJ;btEa%x T8@1iDN;j0uZU$ssLU㬋>6s~2@%>KP脽/>kWTֹXWCg>]˰L+3- }"Phmk>sۛ-R>㙉K}*]n-+@s0V c4;F]P{I5?F5L/QQW{N@^Erkrgl[&kԠ;[7w+מuCoحl,t6}jQ ISeQ_f[Pu UO A_F!:[1-s?]hpL:}njES!+8S]έnd(pF2.mŨ$T_u1RL;:{vĖ$;8y|{vpxK&ckh)%tXT-lv]aVU mY{YU5N~ ?H sU*n brs:e!Ĵ3g޲zw22+d ;oLNsVU+KM!*f}Vgn[=zmZZo#PE:!ICVJ/ЕI8XhS[TV3oV3B_S zG[ǙC ~i[JJJ6)_X=![;)L0&pUK[҆dC{=cF.~#19=x~ֵ^ˏJk%o>mVނό2XD}s;TK4i ]^܆U8xHc)'im[zjxe)o}˪OtrV%[ oY?+|%_imvt*Sv*a>j7m.9 h%2œ@B:6Dn6][Ef*W,JU57z&/\6mϨCbTT₞ؒ wD{_nk-6|=qx q#JKF=ǖ`,JaVv#hI) Qb┿"vyΖ9w. 7h48:*\6ěwܹ7\PxK,;ݰraP]=/nɅԓMko|Άh S7qWI)IWٰn6&& O,11[ +&h0dc3>IL1ej^ؼB0o}Ǝވ4. nrF®tftjuS@m5  +j +WQ]F+4I/*SQTDɢOTJR/5--aWBO3E-ekz*S[nY_TkBvn WpT8b#w~d[7ZYTXvъAr鵂^+gr*cE~yO,q=SQcu ZaUq,ktM)],VlXYTS ]_xRX/ KRԗ{.rgIs b"wAܣLCf.0ЩD *AbzOY&B 7N'.>PBH_5Kѧ 0~Z=sd:1nz%Pu )V33K"$> Uf5'aQ_ZtktFH.;@Gq{gvfvvgwvgfB@K!l@GbNB ssjIc[|l&n'nb&khfw†6=Νw_ʐ0Oo1No6]F+cR6;=1># -,yi[<'B`iቤ 44k*Y$HLG,K+ZXl#q61btgwbTN%Js<&e_M q9Go=Y"< H@Ճ3(Tt!#O0:M&IGAS'xtNl҇<G";psVh*^9O'ŝ-I{ė# 4y4YI=Ebixi"G)h{Fa_-p'!Nb 5'O=ۣBɧA ΖhA IP|4RKf)T oM\nyfChSaS?0 R$t:vS$>qODARwL 0F#h1{`hC&BhXa50•ʆ8TNYfQh/C~²Wey SQz9,P/꿗سeD-F,zd MD'?¯G"(D@$ȋk9@Y~LE\w˜ũȶZ-y"fh!R DoiZ- eq"_\' 8 3˦YRwZ98$ ʶRh (, Iz;ùA^X-a2nOGT%Cqb'ACOsc@O+J>€'(iorQ^ hr*{) 8LHXV{d<{oP_3'4L ƈb):1;W;acIYŻE#_ CSMM\(WY{h{bfmj{M1Eȯ襌hrycj;êSJ hS^t%l2IPԣ(O! VU N {8 t$$p>朔 ٭ˋx#lVV9DF|5"jʏʓ6 -<,4jVLjR(fU}9ugbI6=# V$g)r˛i67hf@_Pw>YBRƘ.ΙRZFN2RԖc)%-Eg1i bˋN8+SH(6!pX++W0ϨNv_i'_|Mtg< |tB. 'xwqŽTstQz`y˼c~-nqG0*`JG Xʏ|(̌|>D+X V]ө㼺,܂ED+ұFWtGwm:: 7Um徦͕"FͰyH&䱢[;57Z/Tt˗#ѻ}m($#:tp2aDCI8PɩP), EY%66i 7?P&&4ujfbf _H$+Hi:үg3 ME` 0\FP ULN5Xd1`ԿY$EmL|\>+ٸ9Q*g|^=E[8?GtX3 t9S7;ZС$ӂ#X`*90}pQu5SH𴾞U\W3,`9&,YzR}uc&2Ky<+mdŸ id1L3 6ڶĭCU 52 m) {Z8 r8"}4V9r ʎͅoϪ\ us@ug!K ʰ#$M+#_KcĪ+y4Xv דúPim(1@ K:*\qT«1>E{뻧W2Sl"D06/I{nDgz6|{ݪ+#5} w[*#P־ 8Wű {)_q+ݶ&L,J *{KʽV삡xEUCG0?` ]߼'% 9JQ^ b\bLcb-`Y K}>r$A2IV4K.=P7VU e@VzqP(K8hj ڤV4Ns*Õ.^伉OP0_./c^a1S>~]<3wnHzN%uUb)3h7@*ZT$Q!_P9/E$S5i Enr=] .àE #A9S2ōj_ ͊y!f yȷx)Z\4Tۍ5Dz6~ccf[kco#07ҡ\b ;8 s!y!jcqrͮ\wU- dùCndJb+AoBd\Y\,UyjONp+Ҥ !DVdx25QUYgWR҄oW̢/VviBfwj2{W좹<*_9r_^4ځ f(kbM׽myۊC^güVM_mч쮓 VY+)j.rptWKK`L,OÝٙ(Sqp UM(NB\5kz&vzqԽ7g-䥉R?IqbT yŕ %A;|om?aZGzcw ˶&K7e^{Ś -޴vyŸ߸eAuwlś/iڈݮ҈#=,W|-ˉ ؛(t,]r&_?g]љxm`ޚlt?72]^`τ!v̄TdߩAqL!䖮 9pm[ 3S>O!΍pB#Zr}Mr(6!#*}(o?$*4hРA`޶4*7``?$@ha׏W41j B5`F>{hѠA 4hРA 4hРA 4hРA 4hРA 4hРA  a඄H%ExMԓw!o&o! .Z{%W&CxDH@NpWbjn5GKQ RʮCVԏL-n˜F'0-؍8Wux#;ދG]nuI<>_vΖp#ף~~QQ(QpUh!Eu*FԄ6DB]h#A> m Mhډ.4rl/ڇ@eÓPc4SS@c@rq'q3nīďe |SBfrٚ}9 wٖ72i0I ϤiHWf -б;L|1&3iR&tu&MC?cHQ)a6 289Nf|eU&F)}Pz~B:xnyPb@-QߩH \Ad^~ȝEЦl^}l@1,^Z&6" Y"!w l#wZRXgH^GfN##=[{o#}ڱ}xh.%whpW΁=% .4讅Q^ gD)(C§,0=#HKz2w`406fKVVG"5֡;|L7运KP1v劉$2YլME endstream endobj 340 0 obj <>stream h Ar&*yX?L>L t@821Rj a h endstream endobj 341 0 obj <>stream hy|N y 1! A@0yRԠ"PQ*V *U_S jEA̹sbĶz7;kﵧ^{OJԵ^<g(bYȶ(NnN^!գ=gSuUV9ThdR4*,[ՠE{I _8,x񱧥,([(w3%*0*06ErXd֢Ct"鲝O* |ف帶x͑Ug̤PH9R~5e߆ŴfuJ)+6iX9Y&L]J)b5~fVZֺ=~cNc*0af-]ӳlzR?.CZnjʯk.ӭ|)Q&\͡ev*Uwc8YNo*Kvh4 5h{~[T˩}y*\-]0\ZTdKtvkvi}ǔd-3;BZfLktKm5O ?u#Z\{=.y{=mV+w7ks S۵^Rtz|:'?hs)nwWaH?ԡdfJ tBg uyf]ˡ`y,}]=YG"U26Z|:=Fߥ?-C##tz6nղEfM4nְAjJzIAul+NÊFZ +BQpPϮŝ"nVDM "MRNvq:؈yǤ"N&£#&e^Om/fLɿ|7,TI?#=ɏh|蟲a*;ωEjq?r/i)b TJi5lxDMw)O53>&鐅 i5hy$$h6v8 |n8|-/Φ,UO,jԓ/tA E'  C>CéoLhW ep/X)ywYJJ|ys#9K)c7Z|ײ'S&1,Qj+ńx"96vu_iOff˦E2:쒝WQ9`| ,!yP5uӷpW*5n( ް#yFYT4ݮk9'dC[Nk Z"zu^՘,onْ{c~99BscW)icH`ܔssˌysCgnU_Cysx&3("݂(NYss>ASzh 5{鑴lsdhrgbgeScg͙7w'ĹLa=9A%R5(ViF>fMKUvxi}kY0GoW7 7uv$);MVdۦE(i46!bVC/#iYwXšF}FeDD})|Q5MF _U?-iuP^ui +nI ^za?ţvs3b=FGiÊBD"N U͎J!8.{OpptI81~:w^T\џYrBPoOKaQJe7|֊>l>/#ҭ-q-?-G&/(^b~[vmd(,JLJ[uJs~qa+0aWN`äށ"}S`,[f {413hg I/#ׇN f$ex: SpO:?;c*2Gէ2"SIrS}vuuR?WRj-5P|U!/ۘݸWgNkI-JS}HcOjJ+rS.G_֍`ڸb|r-wZlj~Z<\J߫yp;תY1:_'d`9F>wz2.._N7t97hvS|S:bR/`w2Vl٩06Lغ.|ׅƆ75)S7{84P|g.vIV\X4Ļ[`*)U=NE:zH4Yn%FFgdV)նௌ!wF6טbmBcݩp8k CƮ֫'ؾ.ԅq8?ݙqcQGs_S>3Sa :+? ך}*~:;ίp~H\g8_[Uf·aƖ?ual^ Gǿge[4{Yմ*P;_COjl`٭Yz[cIk$cZiCg[]$tvl=1Wo^K 6^ 8~2VuUl ҷw)oKRЍg[uO h@5 3|׷6ԀrԀG~k< (_CWv%vP^9:nݭ>f~18>j?~y >9&`4Y#Y^'as6; ΀i{<`ڽ4˃ {bR\`sfMǡ_~[e^v^l=ls,ygB~Sk2M>=g0f }+@~s&ѫ\3sOB۰S8aY>X_&+.fP&s# Pߓ}_nU;cis W;ߧVO5ZMd:{C?hw)jip'wY.NGe'z0Ccworԅ&ˆpG)𾮱3uM0~JC{q ;}i%HwhO+u5 VrDotsQ{ x=ٯJ{V%#N}J.n˲Sw;B|룁8Z oJ \yz_hArGAVo1_%㋉f0l~Ċ\bU.3R\klPau=cq. EE9Eրns>Y)'ԙ*w({%zȻXS_3^۸TyQ\zr M~oCbZs F9q_7q?Ǐm36x* LA[,OrՄL~O8{qyourc_V}[&pvL.lu3Q_sO\6۾אְv>}a ٦^[9.Zz&?vytrbf ^o95Y3ȕ Iv)gM[C걒{ c.D g0@_Y4^Ē#R;iep D} _zsj-"{Hkw} ymkBwB.u;}j;95,A7=Sӝgnd]E?gfNs΋F{+XJ6'3g^n5!NǓzPzn@bP\CTǴwB3yy[oՆ`c34zv-unl2}Mkj]NPIpyCIa a|/O3|j0S}`@KnCOY/›Sr"hҨX}8п_׿AL>P,#'x\3w0oº8-ER nf/o*2߆>h)ybw3]_^z:a s{7QR[@Kr70^}BN^c[E:dEɕ!|~/][ ]EU29y'9Vm7ioto>'@̛zo9/VzQB)?:t._rO{ ƑyIA^Kz.rK>S{g sbuwiOM7k&0 5@-p̼{7D綫؝^Ŝ+WrΤVb8w`>㏾Oskm9BP<+=tʾ3'8aZ؏9985Y,)5ûsohө_YyGz:K꽪FzqwldZ2=*t/b/'xfN>W u)p_,fQP+wLpo1o Q[n!Z> XhG/Bs\ >wW y_Lq; tP3oJwfySCߧ4{1Goݦ" qHzEKsߌ]=ZdR;x>oIjd^J3e o!=˝P %:GSJLL ܭ9ZOgۊOƻTwM'Fq;F?vQ;z<}SΎr7&pԙKyԒKKgutc~x:qت}X=H tp%6m.mdA]V?Gjyqm'W~͂/=$fDrVj`27J5-fR>CoiyK@c2>̘gco@6\g-Ԕ7Mk7fۻC|a|]]_Ç&| j٣=ǽwrk^+-|6`]Mcg'rB:)T4F׷97-x%t+P奪.ބ+53oľv6{fgEZmQ/I]1c;ݢM2{ƻa:9Yd| andYDuH 5"w5J1#_uP:l_N0tmr[>ﹼ!40Xb0=: /8V}'-U+^"Nv'N"NVG?mP6$N6~ =Yވ+rͩ׼s'ߧ|Lybg|&+/P !NNr,x}yNA էs>Fdl މD?E\9D wùi v=3Hp^B.}BK9}fp]ù~}u4~ZzeS9<:CNP8f*%d; \)>f2w7?[]ST/S)J'y[hz=㏙uvG 55H}Eq+)~'Cx2X0E\|BtZ׳Qދw<Gc9ڪiZGʥJBK.a_~.:e?n ` ȳ4DEߟ{PDF^QzRc`?}Ϲ  i2}?[@Un>o.9GOHCi7% >n,~gާ'+~!缗*%=L^2X:hdNosN9CXs!,!s*i,[D Fj9jjrڥLcup8y|ޭbwr[j4q1au1FT==ι ;N$wIj7 ޯI[{ԁ_ԹĿLo6>$n_O-x4*6hjz8m9mw[bEۤmd]ؾzZ䜿7.gɜwo9\?6DJb Eʶ7un0#Cκ&+c~Vzk}zFh9W#:@ Y{|:o=lh[Lki{^Zi/c4&u3[g O9^;XZ`&{QF_ '5{9G3C}=Jevڏݩd*yR2jۇ&D{s3F$Z<}r7xGE3)b߫Rh)1ԮGL_fbDgn1|{x sn\.i+i}8[o+ZI !*uʡOQk3Zȱj7_9r3;ڧ;_J*rys#cǡ{sNyɿW5̹7@(sOdr ˙s?*z;BVRb*g1:,G/ۉ_S}}nBNԟe#>OAwhh0Zqڳqg2DJ[J x},p>9k!a-Fw(`/ -CClb}C}^C!eƒ־_͛3y4oWtXmޯ{yYZ[߂:~NAۧN|31/wYйC97sOt 5 W{rz>_yrGMAWwDxˢz43ߍB#ymݩJs?O}^;e20doБ?ggs!f0B59w]R0OaׂGj>pi>,.}`;ׂ`q~ߺw<5H0AfvEx?w]{0q q~~ǻ,ڮ1ܭJ dOĺ)fnJp'X!'|EHN|ކTMtU;*j?yowmk:Ki[CyKY3q7יnw Zc>H%ĕK_¼9x9֍g]Ny \9 m1YͳUv ]}2|h_$q T1j1ЧE.-tyщ3e<G3dw0uW/;+ ;U9I̾}? Sz iQV{n^7T7b\M"xU[ν{$AZ]A^]n ԳGn,gN7v@[=m,0@Wzryq')Un0|ӿ ͥm>vz"ZdnB*ĠdUFwXg'x\ˬN tW3x:b׎3c?;ѫh$m%f7b@D=sT> hrF ~㝋.g{Fo.7˥Owb,x+t r9NB em qe}\܍L跍~IFQꎟAӀ߁ȗ')_5y.rڳN)et5P8v{R &VP!/ Z^4H6xZ >^mwog{/ B B wPJ衉PCC UA"J(pD띊X M^A|73;3;eg۝'ǃHjy`=Z!Bc poQ,/_R=vb;z s1غ_<d V㰷dCk!)X]B eސ/KsY&aV!C]h%b4p=-fρ43l@y=?o +oo j6|?~lE{EڎX J)" j}ԭ7+U^ر/&Xgˮ~Ic=a>KDйw. I)Fi'0Mb" pTS8%LqD?h5 7iV: EACWwpJMf'T0CÚ33)ɫ\t6K6l ⱷ6,)]nsQN"np3hlsSg"p&™?.Nu\Ğ ҩMi/Doݿ\?&⪗ݛǽxsIEXAh/Rv-S(MG)ZyʳfQta&ʳ=Gy>yjgtGhdޔW>7Y|-grSM7"&FYଵ 9[ ;Xډ3)+DMu-@vrP-0QG9l{< 5Z)Cs0pɄD{ʿL{' $Kg̘;阺Ou7kq&+,F_^gTe.,G=uBy~ϐ)Z]Щk RS[Ur-AMgܰļ,5{r((^|u ;k8څ)gnYdRK^SL-ǜA8Xf(YʵK/F6mT~%SZvb?6Bgz)SPG\BN~Hox)yj렭iz?4L[9a[Tk[$5R_)4~qߚe4Z3Go}%xrgs !I0nMC|Wxb1hy,0`[\*,>r qͿ_w(GRj3)f/u})7JF,J)wI-oðvށsv*qXh4݈T~7zsb5 [LcwJ5{vZg~7w`ƞ9nt8g*EQO:{/✁ǿo}<]巾4v8rh6ͤ*xT0 tNƿ Wt\ Vn )4v$՚Szg3O{˂ =ׯa\SW8yŇxڐ<\ U dQfnX cF+F> A KJ_J7P:OA?=t=c(o8uI*/+%R;u7kVTM'*ڱR -q0~f8Ѓ[ p}RBX˥0NCVa=" YqaIk mޅL=wl V]!HNwZw!`;/oaryLvfRn]AD*xo)]|OȆ?CJ3!_wF C;uw-"URF;Tx #4\GthESshJztG b h [[G#>Ǵb/Q3׌!tB˛Kݱv)دQu4zfheT} M?f@52z䍵8lu֒FB!Z^6ذGD1:(;k_X5 *3M N7x?rŵr=d&9 ZeT#0q=?y/y|O3 @qyy+umO5Ol.!YB"/[/SyaA(cɇ5 F{`ˍ|>@[lYPVm+kCeW8jaaK󦭢)(@w]c}\Ehhk/Գ_h/w<ۛ2rC~ϕyp hc.% c ڄ2DߤFi'\ԃَ<9+|Nue.~{9L> nUG TLۈ:]Q4 Y?nڒ4sk4BwΦJ(#l>m3"\ a,u{wL1tĽ1xc>cï ݸs'̓SQ*R@*c`şkcRIoqwlu7lG# N?:P \W W =F0o@d.S 8 6ThY }; [uHZG]-*Xدmdy N!L *EGw~?ا7bՇ [%U6ĻiׅuO$fa܎;#4X <}? RKsmȥ ~76sc`|H}Cp9t7po4NE#l`6`{;_;n5t+DwBҩ:36 M#6x]~'_z F=ߥLI6' 1ۮʒ0?Q۷V _> ;"~g.yVuw0>&j4}*?p]1x"t .p6RP eօz'h3.GP-HY_[Q46)66G&7h?`k{ ]S %]/: %cc]g/N/~C~w(1i?M:fh oN=7NJB_PS4G o4*S>PlK/K]11'GPU e+lcM0-ݡ1J5=wqF}}(y-a3SyPj:(`NR(ˍ4TE]3参AE ʕ  x#<')]n Q<Ƶ5l쪠{ՔnRzX3>øwHsy 9Ss9s؛b,ׁ |>RNzr4 Vo('ە2cmъ{! _gE0[?%OЯ3N_g`r֣3XIql>m5n6"=xfʬ|[iBvP;A1fwp$ 4۷ܖf <[ݨ{ m9i2˔-#_̥!%#63U:@m(4}T̃at(|=I6rOC]E%.W)~gR<+3aڳBVUһ: y/y)iAG#gMHnx m }I34/#j,pžXK^r _On{t@P R'I]owݸn#U"p_Ǹ;GrT-(n uzTz}QCE5K[ߺk\nQ5>zx֥Z=$́Ѳ ~6sW]4?*A+4xZ )28il&eaby(LU׺(c AXAJZw{Iե#~SC=؋Ø;Ԯ LpnM/ tke&&~i XW'B_H[k:Z&0M?7CQqI(3uP=k+[5{y VTZc}͓Q]],|G' i;8?&,M,A]{J2fE :P-z5l!<ҕ&77Un_c\BY%:)S(ŠqP@ϨAy*a@WAX=b tzw{́A\ϳMbORCy,;=IpNa:Ay:ϸ#o:Y˩:Sjgn#e ^}{tjy%{{m!Rר-Saz~6=7M s\3=WMlz1=_9oz2=Lχ9ezN9jzgYbzglz'5=96=]MOiazLO3ozlbz ]~Aׅ{M p/ k^~%ܳ=#Op p{-a#ܷ[&C}C{[U wp wp XKXE}\h5jnpn{r/s$6HAO0 Ls  P K%h` (e$8s&dRQj2JMF(5&dBR:S:S:SȂЗn$Hf%&#F~^*Sv9yܝw9LRP2'9p]Q~ /_i`ír9p[/V{%_fba \,nHAO0 h%k@g2_ _<:+(YNt8&yxOHhԺnj3:ΨuF-Z/?hfz ADÍ>mZÖlV̖T $_g@a[fbYM ҿcK8{2C|6ClgdHFmșl9 (UQҰ(\&"^$&;ll )4y; Y!zAs!y=5d!/`.4H?Րm+$XRIf-.dЅXorЕެE^l( T7"*䧐^,9ƣCGQy GP YegF¼m?z-+34: k\w@ֵ27@z :A `\hnfFnȦȨ;gGXqO[Eڰdf?=-n KJUڐli(C ˆobƬ6$s"=`aPie6% cp` c#"!CQR} D8XI= _Jg<6!I_L{.AW 6/L2I)ML4<4G"H!;,Aߗ42:)1#+#Ⱥow×aIҞb$_"zR$Ҝ~f'&׈G82 66dͨ#}jo쿱Z7T;d\#cSB Ǧ }վabqb_lx7>*پhպU62d䑑rZ~(ΑqK^uk${g0{چMkk3^RxvE1(J[|>+-\T$q@"GQ"ytU$I V!-R}mZ@9!VhQ6mȯ7GjmN+H[&yyh> |49TJц:KM޲_jc(M7FzO-d4 kXBkԭP1bsŖ'+􊌊]%*T/y&T$Yt;KZEʹŧ5Mk0-6-:-*-"-,-$-0- /͖iW* ȦKH}ڗ$۳QK%%i@ĖE}KED@AsK墰x$egvܒyKge@.IU^_~TSQ'v7nةi%h7cş?Wz#WtC/JHGSPP-aA}Bylߗn3ӕc<Aݾu]]3И% .i]|>Fnbf 9RKN?{p\߀Ep_sCp'qp [ ,B @  d  6`jF'םל;8/9v^t^p~<<}{ra;ηeC7{[;8;9:KEǝ99:8g;G8{9s8;}?!l,PRcBq )S|wbxͽS"9Nߐ2KJ/v,?@ v$kKR˔vU;eJØh_fi"+ƴsX+-ilp0vQ-bJ[!kd~iQ -+w4yҷAAqM[6]76)b~D& ۵j Qg{Qh歝0VMQI4; Z ZV}X:VQ^ת Q_ F/t _-L Q(=9!8Oa @G )$!99? ៜ\{aYY'Av83^ggvg{ڕJKbYr, )4` L! Bā܅RHq9=$r4/fv%ِ{Ȼ~}OxE9Wpʞ4oyfU65x _m,ܞ41xھo~Ï-?w|$͘+m]ID[݇?z#ExZukmt邂ceL>]`1ku YNj3Bi݄Mゝjܧ!!(Ͳ!^W9p&t"+sܠ)Ŝdg%aK (!DYH!+uݛ[9-~[/ލT<e͵}M7NtZzA6~ lRTpo-nd(jp͸ sGu}*ivgN QZ a튆zBX'u` 414/<ٔeE獿~ܖ3!u?KrШӺ{&;4u h<ϬaV;}\ХC:Pxr`ǸJMZOcQ3:QvGα/^qWi U:u*%y#0*R–` 88ъ:s TOͫVBYTʵՆuWV.S*[\S?t.s>$u21Q3&4jyl-ӖZZ ?.PZdڤO;z>Dٗ('5X3)LS 6 ԩU0|>fkCk͉yEV9Ib byKj٩?x˽p+iKM\ r> qZG"X683^{$bk bYÜa bm`0G-n_ qޮ}IB/KAJvfQ x\6ώP@ 9LQ?wVN]>Tώ>uk >cu\D86?sٯQS6x~xc?:){m kMj@?hFlʌB*lOg* ;쎉Fs8C0>/h z3)D(U%@LgUK?eVI<_)2YqqTkzMkI#cq$ZarPb8q.vN;ůu˅ RL6c'iT]W3KnolJ)IuS#B#IaLq_+l. I29Emme֊q»Quj_)sΞ:*QD4A)B$Ūeafb}똿pMlH'93h{sgkH썆wjbцϲm٦ם*r9uGk%]~e.y-DH{?lU(z8ekvJFc\;y;?QcF1rv#,1QW*-J5}nFg: +uhȈx4p>b)Je]MBKSв}Ng!7q$(T(7ݸzL}_u7`mt ؿ?E {BbZbK"+MƖ~xiK"TM$3ne*xե{T݈V;ѐ2"7*1Ez}GPC M|[>j 4ƥQOu Sc'S= ;hnO=쯝$0H|*/y{!F74B0 >%,j$2*5[4Eۧ~U_YԪEmÍmhۗ~-$sZO'/׼z3 r.%)+Bf*;!; ;3<-Ub G= E lJBx21CSϭ$O~G ^s}~Ʈ\'ei{v-ǫH7 CR(R-8D9S[[qwǢn[*Gsh$X*ɗ$`"ZŵU*dLnŁ`%RB|lG-o76gbUB*v+KsO G'yq;7noN{;!v^e1!D.)'Ԥ Gߡ0aãD:V uG|S8.#=8o6gkQM[niyǝ; 3Wgv[R/\{ߪ#5 % ~rIZ*ԙY 8Ȉ~I9|GIwtA>̠*m 1>Wt*i JTt&/*,rSSѼOeK}ϗ|i/ߛiOqw]HU]# mںv= ::GFN %0oܣXT*]d(5=+qK9:mr7ԮQ`I5zuYm&NAi~)`7ʼhu܆/Jْ9R&l ~ ۄ :PKt!R+hlus-@FZSz%]Z4Ae̠'sZrR'CJU="BZy;vOׄ z=u0w_eR':Zυŵħ݉,T96Zxdgl-uŖI`\'G׀Qj ulY I&demfPkGa!G#6jEi|q =$"dD^$$- ! sO/>.Ad{e~: -sH0_'e9'Bl*⻊k??HtL |3" "v,4'*2`3r!q)3djjiRye;8J8sm\[#  2r;%H\^UQ1'W +(9I+\6 #It} ɄŹZ;?F]lm}OPǂ%IޟҀBWWE 4ᰧGi $<+NtFhUA2!L&u4&Q́:֭Tcɫ:ZwEJ0Dz[CoPL'!?Hs\q6&܀CVZD0Dִ lch40 uޑXȹaxԓts=L[EQc6 QV: , .jyjHQzJtBPRRԜ?؀!%hChkלdȱ)p.s]+ k69KFwH-n23BcT V PtN#"KZs_BCN~3 J꿨T4`ޙEiE.(hd,( Bsd)8+sm^[ kq2ypV71'_(cxG g  dZRUu8R:R)voSR<#Qa`357ӲD'˿lvDIJ߹~O+k ?9ݓ-h_e[ϗaeOНz?oȡ-[:,#JSh-Q<"(Jx6q`]ɲ џ%2gFD#. {E>${\X܄kUot@_O76?{nu]QGs;׼']15 >V[8t/>y-oCcV}rnHlX0f!m902c+X3 !B5~?XȡVMՔXk){ÍDW_iŊ I/L. ʼnMJx JaOeMo5;F}ڹlڝ͍n,+2+*[;mZ_|lζK`]'wx_Ђ- zw~)' 8/8Z<<}wX;KYf%=|64}fWf+J, R-ay m<M\R|x@~6aǷiFK3ؗ /1[U.tjz1,GT /F 6u}C^9@sɉ  3G׈R@ܔ8mB^e|xV>)Jv[ 5uژMwsiڶdžst.6~O=UۀHzUH_shM\VlEus`<5ZL]wq&)b\3E-3!4$P ?a>d.10fLB}'Ӂ;g%Հ""_s;ph[Bk9E堒P*mZ:@ 1`--LJr:EB=2#73 xp:=DPu 4ex!TZH(dLh+!LA$XUq*9*E~8xAŭޮjC'od0Sk}hT5:[~Y B(}͇j[ښ1sGM=\iu[+[\c~(^^jwiVOC >, N5SW hNBR8Q,5$5&ˍT29Tx,[ql{=$I#7:J6}O4tbȊBiٜ9"Fބ$֤KpQ+dW!a lTcxRS_z]6(NI©,;mU6wbdƿǴu hAINcQ]e|F-܀'v%}ڍ G6 Q;{]ӠjXgN`V@^z|?(JZmpLn-kH6mPPJɲ;c3&fs{dbsFTrXHI:бj4R%Y%$鑫Tj5鲃 l _1@l-3ZM4No) ~S) f-ꊵ:6UH:$ r9Px@ [fo:Ⴄ*2E["OeB `&VʆxD+04c%Õ~3j5:',k^T+[LEdȢ)‚!e8Y^j>jdyie w1mX+:yHh^ōW y5TUD^ JWU $S)@JlpRfn^FEP) qg=Rɤ4q:EˇT iY,_*,,9QDz;@Lkf?sɅ=YД3*DH,Wk Ѕ( @4b^r\c H36e)c k JMۀ!l|Zӌә̣cg,*hƒ#s*͔գdT^Gg&"@0 tϚЗc 7nQ\w%_}hH,zڎy(}3oN>Uۿ`{紾r9ZWb}뺆nSNJW˄'2}`0q;O*d*\>P9VS+c̹&b1k;bdD+قڎh=lugjk=};>?ItFks_j𸶌 L!Iħ&+CocO2uhwQՂDQcbt C k YLR.! CThʐ"ҿk3;nyF1QYa0:u.zEtgu-|%>jwHS (Z@)dMV_4GaV pEF5b^(œRYsL*eBrͪ_sxU5\BO )m}Y{!e )mw0GG21hz% ich趯7 oXA4Lo qQ򦪱2/X 2[ Vί)+c85am$hWF^zb(XMtX$c:(?)̌$:[QRQ~& ^!@MT2[fh1s _VJ4 x46xELc' ͑%_)"u.maU=Q RFYlRSy*r$R>'93L٭+UvO۲)nwZv!<#S釐[ISc˟ynw3M}s8̙s>7by , ," Q!D$j4FhLL6ګI5{kmjlK4FMbڴ7IhM6Whn_߯Ys7|sRDIFbEc_*IT{& mqVw۪;WQ7JA謇PF:oid.<~|nzM]ڴ۪3zoݴ)zwFu5_So3kJMZ\=L4Tزɭw>buCNnzjSTsB~[!+b $EǤnEѮ8ͦx="Lڳ/bH#uC"BoOiB&fOjX ſ[jǿWhs8u a8RXV:F1RͲQD ,P@#`ik x3G%cpbƹɁq Kh ;ѹo ǟ;Fߍh?Ds] ڗ揟USU31Z>,8mhhJN+{;`=;r»йPňp.I*1K1Fe@nВTիߘy7e󾮊PZ^.}L^dzi^ryhЀ ʣT $~O(5%IJذؠ2>X{B&#8˪d m~'Ӿ6#Aa ˚~>g F#:hJ!Dxk3i]•ʿxʹ- >7owƾ#붼P׻rao :3kH+g9ޖжp֝{>8vxg=4- xoB)bxHq29XnsˈF?XK-s71] H !Wݒz#fa/02gzSTׅpkxU𫅨USWȟ`ڞ B 4 td6{4Z-dIvRS[2~_u? 7 U¤T.ɾ(Vk*h+5Vs/ ny -M{^qG6xXfÌ1fG:. *&&ӞV'ʻ- ձ^o)e^0*2hds Icf*6A%i/@3gb%8<:c]5C,ʞon;YX\Z/7->ST1ce>urTWۙףRݽX㼧{lUޒ'Lli>,)h+YW[M/TװurڴvڻkH443MG51D>$ѳ(67=u[ԝ 0˷b8.aڠ# Zghaaޟ$KHPZle3Jk3a{b$ #?3QD̖{&A3>x@ CCG! DeWrXȧd!\%EY!'>Mӡ#p.QH+Q4ܵ#r*m'u>Oc,fCHL8 {00򅏴 s32 ;IAþA~< ҅HЕ)H a]΀=qwF|mC.<5UU#V mC!aSgbu`* ҃Ci%FA=I3K=A:0@%Zen( 򉔯&Ƶ(%JW(owg(a\ĴOhJ`h`gy) &MDX ѣFI.ѿbV)֢b,lR4H(JV䕈, xWbX Bl1򢼺E樆g:Voᒕ1rIi Jo![KÛe'eLm^[,b7|WZqֶ%]o<,wUZzBz0vkJ,ahPai?sc g8RW!ĹRpóxgF3f\  kF5-9ɒ{>;x]߶j} <(kLLR_j X"{ !W&Ś ,"AgTФ?vzGEK4e>OJUZ5\Bc|Ohem_BG()dv>gw4q{UZEP!t6G*[)NYX(=dRz-50nݔf χxnW"g+EւPܽ ).PpFmyn5kRZj$(s&%MY%@vA׃T(9d*yIZ}nIRP&tS@/TB7,U3#EҢj:Z_(5:#TJiiYɍKuo- [7-]T܃%}Cٓ{YZ0lz|ڨ#e h^\.5mqIrp!g4$ B,QDJ I Ip#ѢP+Y.bH%]% +W)Ԟ掎A'yRBdPl)yKђp%su\EmSy˓?#.$;W*N_9PqPSPq=aBE)2ӘWصJBW dPβ\atd!^&+: ^Ǟ 5ѸcMV16SRSrECSyqߙ4QG;r'ƗVɬK&RsIw-)Lo/W7Qcg,ZvU*޲nUu"Y?3mVC}]\6U^|`c=[C#zN4ȋ\d'njnyd (e蔲fW~V`݇f~9/8= &. Oz6??<1pPm?Zy5)'Cǟ$WG)f GcP' +(TIEs6VI15Q&߭0\>Isx+er;-Jti-e9I*ȿ a;K pxT!dO}]8 &2 9)sџosrQKhaoՑ3#^.n{d8=cYԶԒ2iǤeE ffƶ4YQXVRڐ9>q xk#Q?&Z#%L8 W$!:K翼t Yy|g;agP>A!2_ eJOOwrC$9NHF>B7joׯ4 w:Z2soz+ JOd oI:-QE31Y- x}7eT1;J?\,C:-7K,[+8 $?uTS*7} DSU.gM [%~-MKgQFHHZg"i)ZOѻr8#i4㍑4 uҏACÜ!?Ċ!7D5.ԉV ՅVF8gJ2sZ8na[^6Õeh1i_+.H/Gݐm݅±[g[&Yh:{ܸ,k@?R^86 `oWrg繧7uuvw:Vtv5wvK-s׶/iv׶tt4UV5._W_nwK{O[Kղܲkm/۸gug4t;pNM:z[iV PrH|kj\A+]ހձW3ȇv`~܊|E`?t?/5-ezGs۾LX~ N v endstream endobj 342 0 obj <>stream hj`C) endstream endobj 343 0 obj <>stream h޴[ M{ p<8F~d01f2 ffgy3$%^j< ꖈTDݛ-8]ksOޏZ~ڑBDa45gfOVwArcRH]7dQc7'b6t!W;eԢ_uH4'.BsCS4&D-F>8"uA~ &.CyQU>4f1W}GY ZǨi*iSTMgf)Ry i׭MUhk8V+!acDP(yo !Ҫx _#~0IG調GcE{Eu_TA&' 7rD$J({?@8v󷝶)C @F%TML}i42:J\SG@h u}G/aWEeϻi-uN_'1E>*C747#QmΧ 4\vHZJOa;9z7]K)Bmtb&RoX S]J?Q.]R%밇BTAW_bwT֝77/WNn]t1-CJv$m:-[4oִIF x׻nBOxw5UR9RŘ Qa!NkLUgƥ7ណh~nMq{*7kh2uIJsK)%)47d Q˝nj RPh> 硎Y--7>e Yץ]hFwGzJlR\2~: fM4/V Fi*%ѥU:TO+]HfI6y1hdkT*]4 C QT-x^8ܓ^8 -̿ G%#(e- M E* CJH@cJv mJUrF}1b͔x:oȩx=ZEUB L#tXp3S LZ.mdQY4 z 皬J%ճEb;x"w l>~=Ţߐ^X48_l%y!iwt׌@߸XIz0w0ܠxM{K*q`n\('eaۜ5p |Ikxӓm"O~uʣ]^A+?7Ó_RqgY=hOIixxɘ|< ҷ-t"\!ќ[콌Yf~b2EhOrWGg$rgQS 2đŀzL WD.qjX^B63#d`FyZXB1geZq7 tm^cω%rfs=X{'ݺ$әd/}Ŵ\Rb"(K6xeEH̒h3ki\y u dz D"(U6dS, rUwV% N/ɷwZˠsChWM7[j'ds劷Jt3#l6#ו$͖wH,(EB+8(D ,-_7 tFxQ^Q[[yZrrm.%%,rc~2X|xIqب݊Y97Ă:yIɐkfx[N^Wp4lQ)ԣ,.MQ웻5 MA^V7QLUEHP6NY޵5hd*SH9i *Sh4JKiVWzfJyE%yTڀٞvdvjf'UtC;<8nqK=8REMpq $oi$ `Cyn.(I ɝY 86eBwg: Hg3--D#nTZA$p3aPiԵ늎xH0C  A(S\0AicL ~L6lɟ0RO3 U. -]R.TՓt@>r CP:%A M9>b47)F:p7aK)F@6.WMZE8c$Mf?2%f;;V@&&xsSk795T]kvwַ s8`'uo <x7_ lnB4~;sXߧ&򇉮tt/Qc.5:(+Iwb/4xLmӎQ*eD*UQߠm@)0O mJhs{w w]4J6>EG4L070fE#U~Whz'՟bM A3A3x$Хm~z}?)yy7{;'[qϊ߯[RqobRh;q ^Kdzș{i[E{&@di6 wG+~Qw72ІWJAuebq?6 u~Zڃ{?eR'q׻#mՇ#1ڜd/m!ijc(뗻BVᇥSȩ_"!eg'[P)z Vo>=})_mnU^Q(-g]žܨT},>B6X{|XOG+[sQ>i>oLб)rk耣 tsc/ҶjM&t/^@#td _SГr<)t@ǿ! J*ˇnlߩ7 {|H'B/w+\hQOF%kCxuwB- n+dt0:L@/.Q5jBt#X*ROGjbjsTCal`?-v{0Ns_!AKhKs4pVBMGËp)d@9p׊;16&| ?-^rc'E4h(v/Lťf| DZ4Ac@}voPϣf7"(pm@e} 7MINm܆I*F+η٨^d `){`6(62W>گ7Ҋ/ʴGk1m;@0 X,<[g&qOu (jgϟ"<\ޱlk ټVhlDyV3@?p b9P>a2`u˟Gxa|ARyc˷q }Ywa `5Á@Մ,P}oFݹȯdqyQǷTUȏ{}"EX<+’Y{> ׵Z}Z+bU#op}e+9{ Hn P#_4ПjAx#;M5y"J+?hL>oמ;fq˖MwM/G@Ow'hg[|A3oL?!j˩3.׭|/q7S'S~őH߅4T=R";E-mI& 8h@@!wS:$mz' rV~`Vf:uo[9e/RMigt_۽`) %;`nq/ zV'=} G~M䷾nZ~l> `kF{ŏxqj`W]M;~<5vå}uزnO{ZjOB0"6tq۽y>:iD.#T-:68Ҩ1 mvGd=5}O"}֑͞ZK2Ou?j}XFz6гm3w $(q/}c$!o[b;V%gM#տ}T\50Ǝco([Cm@Z~llcmtQkczm]M>ux/nOs xM]keAo^jf_'V }L{MS{mGg f$mET :N-I+|/ hb|WQmOlC8]rS72E;B~@O 耷DWy]g}y(@gKroEM/@m囗tS[Xȯ@lڪ*|SOaǏ]ۂN'u7w*%ju߄[AoZ<''q~v~{x?~< F8[H=$M$.y;ﻗ<_C{isV+ ??Yړ]y8祜 fQ#A?f<t(tk" @Ȼˢ\@gлyEr_ ?@Mo~7F[T?oAp^eig42m<҅X=7und@oi=ҒOf9?ȿ| q#ZɺRu߲_˖Q|dfLSqnR͊A /ߢNX{F@D\ M;x{D8)w4ۙB+oD‰XCz3vrc94F/㨭ciQ9Bz8Biу6 ]ve&@mCtQEBޥ!+'yuW(1l \{ki<{6Y} 7R 迭Ӵ 2y=C# '=uA8Ju >{G:Tjx2{hʑF 2śN *;沎|2MiJHKje:xgOZMB^oϐo 6r ]o 0ΦmgH'$] hFqw[Wnۿ9neCa|~{ܑwߗ C~7D{/吻 w_{rw!u`މldSmS Cl NJE`0Phv`, 40 aSp)!g6DG/]2Cm?CoozDcN_?ީ8 >#F*|2w țDDߘ|n?MjeItQf=`.j˷7H!%l3igBo VJoz1(-}7Miù4ǎhwq@UG5a-+o۩`?έ ɀ >_`<uleOJHHz@?_b g{`lmBug7Wwz}0E+C&0?-?Z ^fh(7b-鵩CmU:Z2edI9 T+lM >n?D{b͕}+/l!8-5f,s96c\*7kmuwO/zJ`Q-ɵo.{B6?\{):f6lݪZc*O wħS^{Q[ȯj㼭,_rF[:wXv[ߨ?14= [b-Eu[Y? TMdX#M,M֙[6:"qR-So9 %D|;{~:@VnaVPnk}7b t 1FWǘ HhPX3q. yq$F?*ǔ{>WTaOʟU"UU"pڎ@~/ͽJy2OP?nmQ|sBZG<keH F :C}Kݠ;؁HtGf3@G'@KyvyAE8X+ -h"Ph@ $hky6K.6e: ]f@#+痁+߀W~./7ٗџ YIm<@ tek@E6} [AKMFU {,$9ADXG(?jsZjPJnPmuQG(5Jl6fMTg: k+n:$dٯn3W |L#"'+8z!m4V?.=I/[YP/H~'rK>jP[ZHm RoķN ?QRw?~D3!=&[h Zrǯ(1>4БAi6(FMvG8~0`à@[8x'>K ׎ޚea g:%@"=y}ޟ|+_w!Ox|M#Ͼly 45;.a'5}p/vwWk]k pΤz{8O/֯kR+ ?:VB_A@sF%LӜ;Q=ʗ@_a-g[X-ݬ=2Jam)[c})*eXCqaS5h]7W(Ծ㪷o _W  %mT+AvBV(˗޸[WYD/k27JUZTIt)E/սfއg*♺;o.̜PC5ҕQ-%](i+nIӔTIQ%m<]0W栃GܐV4$Ulݱ-ccZF5 o4hR^š8)J"h+J^Q*rt1EnݠM&'Q+TH.]JlROMF6FDDլEzFEW 7pᤨ+U ʊBC:eQ jKmCXO:N[H%*%&ʥԈsTc3:(Xŀ~Mn\/nrɮd#%Sr9EY9fEgܛU=f,3{REy,LS[PĤ[Ts}m۵c:8IHh ^q&1175E"?x Njv7U*jrl{ĩ@HinU!QfB8pv7Ώk}媢$=wqr+r\W|ǛH-)|V/e5ofyKN}3֞Vp۫7潅s?#|֒'kxzM5/y㩥we`j ğ# 3fA[8GBQ*Sg H *Rrp `ͩp02z|HTI5Z'Sd~"]=U o7v_AAAAAAAAAAAAA wXGR(c$㩢}D}!?: I^LoZu2򖯃:>j 5G8% ]A& .jl&J =&>ezx3ho-,ua\Aa ]Lm^Phm`mUY>stream h޴[ |E3C  C2 BE $H1CS2""(x@ (x} .+ HU3  }zޫ" Ĩ=[y | S4.,wDKӉC&?})w-a㆏ݢ CОGOV[4-ZTuZ-D;K`\{y`EQۘ)귭;hIao8αEcnD Ӹ'>z?nqGte`Li(h%=iR SjL׌`U;M*O!>zv: ":]$ly-荘7 &7bHADZ-6`oa~fț+*јE.~Q=M|#fUM&',;[D$N({/{@8}E;#Ce=GO=TE".C+4z7 #Qzh9\DhhѴ3 =FOUQi*LTq>ǿK)\+NFA"vM5Į 6fR5-_WbRZ/{J;p@>y={dw53=-KJNw%w>ݝm۴nղEf Mh0٠~:cjՌQ=ZdDxXhHpfSJPb<1i#= =tWzŞ-<uUsiQ*+R 43].gfiaiQ9;t(t }'si'D WH4{/37S=gXLgI)8:bezYuqę+f9kD28,EYܻH(򷪊VZPy;D)2U"QD"B Z۪eyǎ2W 2>\!f)4\5"}i*43-EZEFL X¢{Rz,()-,̦vu"TF'54JEzg36W*?SB?p>9vQC~1A'vqw*P䮞C86eBwRDn dPi6kK1S 8Ї\U@HAW2 >}nYCƜ4[)edS+Jj/9Xczu/3:Z+zNj=pZNy2ȗW@iH A\ħ!Im7ɥ+И:p ]u5V_ ,E}Mw' \Ex¯ <l݊[ 85ⳀCw#a/G] ^Ne _FjuQ֐eh 2 42LʈT޿F;2`'  c*` (d{i0w|kD}9`P_` aKGڠ@WT*/B?eTO}f.cD)+X.m~z}?=~Cy7{;'[qϊߧ[S-qobRhߑw4zQz-ћ!!g l [i!?Q%wZaySZ_ˤb7KIn=Yփq9EkOjԟ}F]}#_<_'hsپh[lyɺO Y[rKO!riEBh!-R )O,d/{r"06[3uCɺfyQF$bT ׁ=EY@TYNG|\˝Xw,v| }jR>,)r 9k[鐭;tsҶds/k-9/R_=7[cD V/xR9/FBa6TVغSo4@A:O^$VܷBNhJ-&ҏn? d]4u0X:_/.р0Bt#xҪSoGck t5#alf~F]9@!r 'p(3VЖػi[*'hKP< )u?Cx0Qн_y&؂ gA~f: b#R,W< `3~'l;Μ :67Ϸ۴:̀4Y{1^cA _򂣎w; >EHT$|D3yV)wY}9 ,fVeHC.f"z)UQC3p/›[ H` 5T{x\;xAcb+u97I6h` `=_1mA?Mz <[1ID>+̾; %|cIQ[E vn$}h:-xڤ.d1(ijk-K}4I||(H mIv@/@,[}Z< чmgEWDUý`) );`Koq/rjzG`;DzR_LE|~J෾1|Ux[̎QOw0~ޮ>w?kMҾ:br'no:@_gw5 ߏ  RؼwQ?wkqG-FVn;Ҩ1mvGx=}O"}ֽ͞᳅#5~O ?wla9g@϶|Ϩ{Oe=AIX1hn%6)HBPwU/?aj[Τ;4ý:ߣιj`c_ ([Am @7;~llc-tWb&r.|&O?e%4MI@-^,[= MA[>_KʷbyzocC#| ۟ͺ@i\ɦv^w Xi'}L_k|c)zUuF@/kcT9)aoJQ!w>C{ SNSmDx+m[|Y7tFчmg|MQ"Kp/.o o^*RyF+_rbYuU[dŽ 6NWu'w:ejuW-耷~-Y_oWP^<.ߦH{0տ4 xwIN%S5Yf#-tqp&e{4]ȑQ;3IMx>,?$@}ܜְ-}x=/·,xDzd~_,%t} Et?@C?~oPW]%~ZƏ<#苡w"]nTQu^nڻ]8~Zͳۛ4p,u4SGX>>IdhE&g4Gh^4HhTU7諫irs1)ʰq>1mZ^ c\B?2YFغg&hOH%Bmlu)-mi7m-6e1zJ_h}$3^ߦR'}eE# 'mէ|eGI촀+aoEӂR(>&{ӦZ|| ȷG"H j!0/B*?)G?xg]Uw]]WFo*۠@m"/m&}ws~Z @~ߎ]r͐ wA[ ȶm :A=6 m d[6ؠzUTfjW L//oO,6k&y 2>lOqƛo>%c(AԤ#vJ~FdrI~6^E|+Ҏ{(V {|3M?(+7dOBIo'#o 9}cTzZשNtVwEM4K_1;~7%  oR?߻ 7;(Eia'F@oG}oiJ =vE{AM> [m_ix+Nvn}XO}bѷx/SdM{R@xWh Oc`OGYw=< >O71jFGvm>1m69 65?gg!?K߬m}߰B.\/xqფl=ߋy.SwEEߪkhr)!Gwyr**|2)Ce+Ss84W@6cmy:V+yZ|` ;xH|Dzw?XHݷ{@-o%(/VH >tQQ`M04:H]Ad -"DjU Enh 4O ~ G"'tF*r3dA| +HAE'5};@ˀe{&,9IEXG)?9jj)PFNu6̦7QtTăjy~6ǷCs]3-/sm-48bkl{rwo;,}ϚJͱ|A X a3v1Me6~q-kMC94SL3m'\}$z ωOwS~!|t|:[| q,EE {04x %PPrvW>H9L-WeExgؚQcLuϰZR1d:'֜V;vP/n{~l{ДO:]B߭8=!aSIh۶U.4ڣ;ŏ.yͣk~V yws Ŷum'7]0}U+UwkV"WvNibr{՝}ZSը!:IqsTs9!սpsYנK҃ZS%CIriJw)ɒvV:II騸/P܋!  lhsgtt6ѡZE-Yhjŭ;E(bP aEQ):+ R@E9fH%rZ"j+a):6#-wDCWx#WDGjDdРPfeJjI(Ta<^F1 DڈC W"R"J[Za06èKN-1pZhW&ɍ%7Lv&Ov$$G'G%G$%,{SO~5|߰pAէڅSLi&p &*Dj]N-ps"lV3%*$K]K(W56@We ~|鲜.Xu~.6n+rʛUx+* Gd^\O0l 7N>k{)Vc,[\GV!V`gM1@βG:LꉑMYd8o [Yf5Slݦ?~ȴ#P}_cQ\N9YDqU.w9j z2=#ue ׼8|OoWC0<>}O`#F/46r  7z+WSBfwir;2ƒTl hV1^G<[4/ԤI8O͕0eo?T)qW7hQ>).Mò&(W׽$Y;7nߞY椦{Z+tnxmJ.zc l\7xxüڮej,il?[yNvV9&eNOڵZw"CfCY$qXoNDlȎaL͞qfNdK_hI~jynJ+B!XE M "Xɱɛ@$j͵j.yBxOlyH0U53[5N>*7n-R[ tKlGc˾]+3Kǭ+ uNL߱{o<́ 9Q47 ]]<,bE]Lx~5p@ KFeOIKan<誾w2^uzG2O=Ұ44~h鍸|8ƍTǙnrDщ8fw)TDFDTLD'[\%dyxaFO8Syj.쫷N[Wb%.gQ/)56O&_\6 x?ܦyM&ngyn;j\VӁBYސ%z'eXQJ\t $14e JъȩtLҰi5Or?Ξ0/2sZc&u.@BnS6%8"@B `tӜl+ڧ~$Ȃ ă]}P"z*&4!A Go~H A $H A $H A $H A $H A $H A6)"E!9'c }|W;]{ދScxI Ղ 9!?Q%&j B#hT'c9"M~}Ѣ30U)'j7lxΦ>`?&zZ%I-PM!-f&Mi&tΖ҃C, |`-QRdfXV81I5 L8{7mFSPKH:%۠&r`p sZBIVOA|s,{ IFX m aѵJ}޿ 9 \FR[iJP Drdtd}mInIRa24v'6 Fh<->k[0kq-i]2&JlMDj0dcl2!1'l*o%7#“iI61B3É_llx /:J&⣾oIK |ԅ8(_7?WAR5KV endstream endobj 345 0 obj <>stream h Xպ2&kR+4&Sf(#(*(2#" *{nuzvoEu|{z)))))))))))))))))))))))))))))))))))))))))))g￯REEŽ{?7j>4*--]|GR9rd\\d& hVUU)V*))))iٽ{w )i&&& wRRIIIIOVZՒҫzܹsڵkn*))ʊ{UUjnc_SMhh%~>???++ P(++O_m%%%%ԉ'"ERكB;;;9D֭[w޼yD0Luedd\zPVL?_XÇMx\\\*eY3(\*)))~:/5jmwKKgeeO@Y[rlҤIppoh׋,xy 5jKɤe~W={ur䂒'ƍoߦUxeCȠdIII˖-z衇8+$ÂĒ%K3`aaZG˲<RRIIIЖ-[^#A8(5z6֯__nȑ#>>>QQQGKSy=s ;Vn7kI|XI2ᬤd22|+++믋 999emn:9F!Zj֭Ν[vr3&'%ٳg333(EJJJJ5(QQq"~a-Yi.bRRRbb"kY^VVA!7H7Pzxx,[l۶mY$b1FLu O!vf "ϟ߿?X$A PݻwXVIIIɌt…W_}Uu!XI˃wVVVTOaaa>}NJ!HFFƌ3ettx~,S^ .];vDwy'<y򤦓kӦMw>z('++6T'Nxgj֬8 C``a9~x1jgmڴ۸qH GdSyye۠A˗k RRRk& .-KJ!H\\ܚ5k0P˗/SwHI1cdžSJ666$THHȴiӼ4qUm۶f[nt#yUh rŋf;uꔦ7߼yewIkvӦMfz?C(J*)))Ք]SL5jԭ[ l޼y߾}ɸ`PR|R!%Q!ܹs}}}GA # _.^q~ i4h"K |7wuJCra۷o/ډ9fϞ= W\afxJJJJ5"JKK,W-,,̙SUU\-[dɒ{nh_J޻Ws6_)ر-,,^W^)))䜛˳+gQǏV=-- SAr}ǕM8<;99ڵ (JJJJ54rەyb.=<<q7xɒJa$M4?>)) /$$Wzj8KnPyʕǎ"M>0 .Gўʏ{X"lF56666P( MӠagΜu…[dd$i<==J|ʊ ܸqFSSS!ݡCٳsΈЭ[[lܸqx(p~zPKgΜڵDVVVVؾ};&R"sl/ԩ#M6[laBx^qلG]܄5 :u K2t.%%%?둦䫯zU͛L߿!.2ZkQ]xq@@P#>A<ؤI[jFׯC0%*MnZx VDHNNd$$,+wޑliܸٳg hcc#XJ^ii)^4.]YM˗/+B?$PTRR?"܍=Zcƌ!/jժm۶aw(PVV&()윖\75L6DA{l  yȐ!"ш$ A=z& ƍFӧ{XLq(YUyll7|8srrc${]㑟9+zJھ P-GM4U~,X.ʺ~:T^~O*))o'8g"8;;󽸻wav΢؂c LEx嗏?Ox!Cڶm+ vvv+VBj^k`F7n,w'K.g=N~W%%%Lx^fMM`` A3fXpGr}[QPBڷVh((SZAnݺÆ #y&>?FF...̯[*Ʌ2e&a.s O8QbZhakkrpߚLE'O^tڵkGm*))u~JJ4 :v?p77ݻw/.^_RR"p8Cʍ,rq㆟. t4hgy(uȑszG}$*lѢEՔ!24i4^Mo'fcǞx_ D$qesH/022_&;y-tURR2W\v4%*$$~ҥ|#Zwpu$tnڵ+TA# ݻWeuև-q„ r>sbzd!&WܪU+XFo5F_igg'vLÆ m짗ikq!]E $骤d2vƍ'MOFtxxx888\r۶m'55C;TQQ-O8!=֠A BEE>zիWE3f̐ _vMɕv…ӧOw·@.џ/];DgΜy¾ꫬ=xq;v2" k8oHw)ՕW|ͭ[ٳ'11JJJ(rww_3M>]۾}{llٳg(%@xHnԩF1p|M… .ڵsrr0eZǧ~:l0~g⶚5k&vȑXeIDl2hk֬:uoXYr7772aEscǎ;w#iu4d2(I閾@b1PNVT?;v@kƪW_hMt߂!CF5zhq%fmm-ְNs+K aν䲭[ L`ۍǗs℄L<|AȕyJΝ{Gj׮`ĭ@ɹsӴ!.2t֖X~8/ &o Ǹ'\/,7?8Ŀ;;;y&g1=8P"NF4*A{UUII$EdFww9s`p}ݩSrrr(]{hH >\ӱǏa㚎QFG"n ^|W^rN4'l\3f͚.ΗZ-uEn<,0`D(eW^gAz]vնmh_}%%%% xNpeggKEL6 wÏ۷oǚ֝۷oL =L`"@^;DPrG A-ok׮pI@\f &lm'OD !={$cƌ!O4#Ν;M6$O> ҥKbb"N8 e/UTRR2C>֭֗[:tHO7nt?>??NqqEO?TnnݺDt2qD&*3^ƢE fjTx'D"#<"jٳg %YKHSrʕD(-)!af7oHر# a74h G+x:,$OWK*))--[Hnݺj޽SLYlɢB#***^'uss6mHlҤ n^Λ7oŊqrL k]vtX <d=˨Z{&FڀTѺCBrbaz뭷rssuɓ'Z˗/kҥ脉׳f yR}T|pvvvK,ٰag,AMvݻw{yyA;wH3wРAByyySv & KK%%%AIC=aSTTDm5k+1 0T:Ÿq@۷.] 䫯˿O>0 HV`;v sRrwH---I,,Xa$"??_Ӎz7*++IVTM7*0lmmݩXȝ7lؐ`y^u@_61cΝ;;~̅I?TڷR8::BdpC@*3ctOOO[z5ݳg9s挜ESHnSLaZ֭[ ڸqcI 6g.(qfլY3E4by|q(++KݗTRR2GF2 c6mdoo{Ǐ_x*++ywNJ01##CPstp >sE.U+++0Ԅ ???sԩr\Mw%*s>>>hmۖDGG NMMWg%%%%AɵkJҥKIIɡHݽ+%E,//oZҷv… RAaM?똵&U"?/Zhƍ;vbf&N(jǎ\()6rSRRX$СC¶kN$8% $~U"""HeLnnuWTRR2/ׯZz>і-[&Zw !tJO.3LD+ . تU+}Dww(q;)}uLKpp0>LOOgd&ٴi:^z?g&ގӼyXw]g^rE0kR JJJf$$ {뭷#ZM;w5k0Ga"LnJ"̚XQӱ`81.[n"1̩͛)~cE+FP:֭[Şѣr0Ś)ż]"~#"''g...vJHH`I_\\\Q(dN2(yĉ~Z6ZXXg2+pذaa3fPq=6zJ",ĖW^;w.z{{c*Y'[\Ÿ|xw...LLP7}jBbٳӦMsss8GFF?~*`\Kơ 4i"W~hM?(܉K<ˆQ_ȍհa۷ܹs>gg礤$/KTo Dgk׮ŠaSӏkׯ/,RMOO 0QƥڵkMŠ+PZZ 322x|.[ީS'^5' >}:988x߾}'O|q6(dF2JVxxv/x ~(dɒ{/QGc5''_ [HX('e~dmJiu(}}}TMNNNҩ>}G>xɓ=<<6n_UUEd Y'9'7qkcc#[n@ƒ[~*++E4i([cbb3;;۸0))) J⡤)9p@1G3uTΖ-[84:m>}deeQEʕ+E'6MPG$?P.^zS5[xW н{wXT칦ٮ^$an߾}墍1|O;]>KP^X)mڴ)***..G˻uV)))(b o/Wfap}T̙31G4u^URP2,,LFƎK}6uqnj2dܸqf fACr˖- =6DС\65y {~~>:tcǎra~;wX;pƍ墱 4o JX6WA y^JI'\v7WEơdQQJ6hנ O>|___ѣG1W\ߺc2;*=;_7h<\'E@R5({=DȐYkz04;Wݸqܥdkk Dz~GUz@lަ <|lٲ寍S^=Kƞ>}:;;PJ*))ElѢ\/hz/ݻ.^uPCy怆D=4qUV---aw̛7QÇܟ4N8]FǏgZX<2Lr[.1,6%Cxyye[v6lwj*|֭[◁|lٲo߾DăCI%%%A5k<rcǎVM0aɒ%Zfff¯%Zw7%۷o/Tuݹsc'>yd=4C()RSRM.l 7/aD۰i>!)5 wuɵwwパ:u˼;w ݪdF2[666ҷ{="ZwBCC)))999;ʌ; n94h 7VϞ=M8qʕG$~7 p@+Fvb|r" R@߹sgݺu#7$+wȼ1ӦM#=ݼySP<8%1 iii,?2jUIIɌdPڵk W?յv۷tΜ9#ʫݔ#9+++" N2e#F|gDb[nR۷///O?E&=ŅiY8߸uJI X!`ֈv{L"ؼݣG&+J[XX,xb?~yݪ[N%O<m(AӁe ./&P1g5rɳf{{N. tt% v#sm>߽{C=$Bpqz.uEFFi|\={hѢE|Orgm۶;/R, x7ot,oRBo; JJJf'{n"Vc1z6m"`bb"%z%o޼9`pN"HJJ7|,NJJzGbzxxh:vς #""pU5>_zqmvbGmԨYYSqW+ݽ{wqy?mڴJJѣGVVOǯ+0P"ڷ0ru(d^U˖-зo߫W $8EGGS!/]TXP '~i &L4i"MKK/ްa/55߽{+733-;w:u* ^xAnlgΜ0d28K?ĆG3/Æ q*Ż >:%%%%3Vyyѣk OGmkΟ?MUzS#PG1 jӦX|~zw0)ğ9s1MKK#CM13k׮>}UXE0v]t}dԩü3f'۷tmE8\<1I, %yX~MI%%%-ӽ{w]~}JG,7ܜ9s@$U5{ll  Da'fpp0,[bhݡk=ǧzJ"#[XXpBaaaf;Lb{qmUUU?p@PM6%7ܲBkz#P۶mmN:ts /~(z*jQRR2+Jh֬…QO!wAm۶izFPy~ŤIf7n:e qa3p)gQP"dffN6LJhug-̀hCDv%$$hz-+0mܸ 5x`SvI̠ɓ'322%Q%qddeiii԰aCqQ0{-7֓O>Irƶ}\\\.^p5jf"H'''X;p|r a͎;fooG򕕕eeeAc;UU=&C_LV߼S+VCfγhNS**C u038ϊN#"21=y`zxk]٬"rte˖LmiqZ 6"vl9sf6t===NJ$H8<Aml10I"///KVzG(S}ԫW͊+O`x"W~o_Iۿ?!C#G޶jʾ о}{ܹsAۭ[p;c_+VTtX)Ǐ1 5cʔ)\k~[O"EXةS'2ˁѣG@m fÙL$v}yJɦM^zU5d_%֭[#v P(\;B,SS!!! %+ 5^{5jn޼^߻wÇ_d֭/}6l]6{}Lmun*U쨭e18vz͛g;z޽0 Csf>z`wn R23s[]\\|||2ÇoW^%?sEdvKJJ"ڵkŋf͚p?3UAb|}} ٷy;:ɓPvǭTRk׮~yzzN4k\~}d m'afNIM Ŋ;w>ME3g 9޸qֶNWWFYP!j~Ək.0Tu-wꄭ3f̠g+S sOV>>>s_hj fagٗ,Y2b)I[aȊO>ľzJ^zLv5fd NJ LmOb%/_^Mb;wxxLm BP(ѣG5C$L(޳gO6m<<<;t>}Z {@ 303%(< ] +djjժe_=k׎k֬۷߬Yo߮v#]jcZMOKjdeV ejt={?~<:00 )V@r^SN!۷oI2{իW#lsRRRnܸp60 sSQ_uFT7~eWO&Ma2BJUrWRvW_={,ܶmMɟ &=D[۶m_Nm>Yj˗#@PPЯ 2o6dK>|xbb"-^|{ѢE>}xyyۆ c0 s,SՇ}!ǎK.] """ 5r8tܨQ+W |V\s…MZ,uvv3fr85*UͣeI 3AM y… tT[իWsJ-[}_-\z5_BI2h0FϟߩSu>s.]! &"##aׄ 0Vyl޽ȥf͚+ ~O%v&J~w4~x5uV|rAwI5A_&'{|[7doEa͛7w/ҥˀFZ׭[=qDtt4KjJ!$ 30G4=pcM8MJII9r}L2ܸqCɓ'74 9pŋULP1ϟ?yh?m2%Fwر4:}tZhK?wmp D=fz4)"q㔎#1@өII{Ǐ;vL嫖f]~~BO>^@-Zdٙt- :ͭD??H'#0DDDDޭ[7%3Yf ˑ#GH3oI 3$W>@d!lDG $@DO/_OY"$ih]hlRmJOU $ 2\3(>!N(zNFl2>lذ^={P\5qF`ӡ< !#m׶mϞ=9DKॠm۶k;j,m50KbS릲XznLAyOH?(~~^ԃs8pڷAXXɓ'a@ψKك¢]]<Ќk׮E@嚴B=+VN1G3Eg:qDLL 0R|!p09sq='i װZJi7<!>͛7`U{qsB ĿK$dV-vڧO#|F{$ 305xH&_pԩS1, =,9}5ݻS?3@CD{xD~{פּ/zzEB Ȩ 6۷Dgx\nhb8r:ߟ|2`~K4ydC~j='L=Oo4fˑx{n:t1cƠR'M_u#F2dӽyRy@Uݙ6mڒ%KR<###/hnB+>>>B^ri|ph{!8M~٧-Zh߾=|Aݤ+[ni6eb0 3!LiIr~* o!MlѣG.]:u.ܹsn@ƏOh^3 }wHqm/xWƍC͛7O3Рqѝ;w0:k, 6 Nѓ={%je/a$Ats m۶JDj:\Bu5㮻՝@H<p' .@O<@.-&d^Xz `✎JB1OxҥXDQ (H 7j-Hpډ`۽{7Kdȣ<;֕S+8kqp=ɑNPg<#2!!J M6JƇ\R:Q`m۶E-_e2 987u ʔTL\sù taFKKK#`###UPE}^zɒ%*<^\@/^Ll'h# M@@x"%=?I!Tc(ũ1C4D]՞pV~tf̘ABS4SczWtrj !jm tVr  !>SS5e8 NYע.F J7*<)׳gJS@ @!;B'XJȃ]f94_4us }\,=(>8pr-Bmaa92%1׮]#EDDr&'A$.əQPڵk@m۶ dd!+ǬYS87$$ RLLLLьj.`D4! ?)Nʑt!#UP'UchZJ\آ{@Uw9Tz[¹\=wit $%%P:(јȑ#.}H uLp)y;}?$@P?Vs" 3̰|`2ZZZ*dJAM`YF86BV^EIV؊&`]h{=EZL(h 2ڵ 7o޼1 O {AҥKWb%ŹtJ6d30z: 'i8PWpAD.V(J|m?\8}0XW¢,[' X8Q? :@[8=][l ҰĜ[n S5S).X^mTg>C3QF|ޱc^zyzzvOt/R3qE%k@'pB:zU() 4f'4Sut'*0x:%&x;T R*11H:Bmb/99>ps.]hüZ0e؝r9A5r'H`yM7wnU.KBx+ :~|闯xA0~Pkw1QJj̞`뙹b*KW#:A3LW@6za)K~޺52C=Qհl1q׭[׽{իf6I-t0t԰4m-,dyM7|cǎs dҰ6ɓ'שSTR:yV"9,rqѧis{Tf\} 5̘C\r"J^}:zrM޳_7]2 6iySHɇ6J՞h@y2%## x/((iӦ+Vs1sN"˝xg9a3I3j;pYxqR_67ŋu/0СC,x}jamNsmEM6AóQ"ӵuD/k5:.7njժϫ5Qm$"1a(Iv/mC1cƠ(cccyRSRnf/7ߴ>eHJ.]v<{#(7IMo}}}]f֞u?-ӍOrveQiAAA֭۳goVTTիW{m22r7Sە+CZjVfK^pOg9TPxאlXwI>;íf ]i}رcpAޱEhy vq5jDKHHQ2DؔTt /y{{_ (J ,Y _=z􈈈J7bcc3Em>Hm2R?ZiSuo!NJv5 `?uŋVZZnQ2%9yȑlm+SlР?::ҥK$OPeYjj֭[6lXH8Id6a+srkrx rvY[$NIY7hmv̘1]QzʍCgϞ]X1X*2aZGvM2e޼yk׮ݻwoXXI3r8qڢE WW׬៚E${4jԨٳW;E&lP0,**je˖U9hm {KH'm#>F8sA[ %)>JmZc'"(&LPt?Tc ޏ[cfZz]111Buխ[7k|,' >Jfu᫼(}¾}?NHFi[ Fdy-5jdT4 D,P"*H eI{|MlCaKI(:˙`իWCJQԤI@d#;&"d˖-}||fΜjժ;v;v,::CJWZUi5hٺZ:^~Kl޼Y XdJrX7n8"oIT][HHm_~`aOJ.+J*P6-quuR(Cd9SH@kKumD䝔lѢ3rkedVxW@Is0:uT۾HGdSJV"M|9)9V9_ln|||}jF-pu.5UMMgJRDCeɒ%(̴iӊ/nCds-x" %yV*d Sn9I?Zj]v#F7mJl) ղeK5YTH/IW4ox`-57xgoIu{lQFvHwՠP``MJJ_ wuu-smޒ!2AK3Ԍdƍ۶m{LhѢ%$,JR"}Ҧ'"'ժהdIII¶CE況ּÇX"r0zA%?ܹsǎ[ϝ;Gg {5kAx$rH-MZرc~M3g\lٖ-[cjd -n򱓾r„ W^fQiۈdZ#)"sCV;$6_msغunݺ!y,ՈО={N<{@׬YS\9m Cڋ$AQY6msȐ!\ջw S/:߈DIʦEdRrÆ *TPj.IUQNȑ#Nt͛7{,o+]M/m֭+WViT^Yc$M4~6ɘmF2QKLmesgэkb,%J}fлAȾl娋ĸH \YX15:p@ٳg^F}1d~K.>fOD.Y9&R\P...?[jթS'1c/_ U{r$%|d*""],r`1(U&yu@8f,7Iw5+&y)[y$IZe"5h L[d6!+VlݺJw'Npuݻ7<<\w6Vc (Q,EPQyAKQ@ʕқh9<<̙sk?LJJ*zGݸ@k_k#W0Yf1xHCY*"-AE455Uiu֭S.[qoXC?)Ho2eʢE֮]k׮Ç_tݻlDnUՆPlcc Y(`zG6=\$}Ѧ K.`vZhh(d[=Kd=Mɔ~fRH1뱺-$ lscnjǷcǎ9|78y8֋k"jF VoQҁ]pVVVvvv/s[˅Vmp/13DyB;l0333ϒO䜜l@()PRaJJ< RTH貨r=6lثףGȷɓ'O:d4p3gB/ϙ3 ҩS'}}}DREZTmRVt6WDYA $t+FΝ;r_[_(z #zj"i0,zG9`Ю];x1[|ҥׯ88zyy;wڵk7vu???___…3g4p1!3!0!BAL3pJ7iU"O ^q_ӧOR7ڠAdis>i\_f͚4>BݻlE1%J*.L[n<%#e"lq&M>֭۹sC@gn݂ !!!&yysrr+n݊kvEJRizTHdFaȑ .Dҋ-ϬR=55sbaJ6 tF`4+`:GQKYikϞ="\r%H}_3?#PRbe{D]J BI)=Q?63d[[-[߿ƳC111O<7%&&/}1#g޹sNweK\B[Ju%ի'/C~ʕ{@ 1蜕m#HW +; CX={6V;;={CBHq>}U%J~*%_ 144)CJOJL?q%8z(T$ zg233~5;iiidDG!/.!?^z9OOO`Ä e˔ޖK-kvοˍ7pq(;;L5Selwuf8jj{633cp;vpqqy&| _.((Ȋq%dTTTVŞꔬ<`rm9s0$322y|QQQQ![rrrM3%%zÇʀ$Nv%PRR6(ٲeK^K*%y<#\N:=zȤtP p,---!,ۥ`&RtФ/^އKlJtKXXիUSSS\_Vc./&sB LX7n` d խ*ِeV 'w̗m :u*ҥKWFO()PRa-f\y-ld2UL뉚܋ &O H k/ >eIIaa! DKMM} d)D?DSLT&"jhk׮ݹs'N(FGGPݪ A Ct D==iaaBH>zy,T+%J*FIb;vȋd3RR#k|!?|ǏKNޅKt΄ԠF}6}E6;l0e#))VӢEٳg'''ڲOh)Kl޼Y]M|};Ŏ\"3٬P˖-g̘b*...---77W$J Tee ݻwd')=PZJ'`WֈH+A]\AAAL͡V/KKK58>s+quu|}F؍hiibŊ[:tJ6 @RXPBnU2eH$%W=|e+o!$ $׬Y!y9$p(&$"S@I( ~-H鶒SMI)BjTce۶mvxj[KYPʋʜgϞ! r劷}7o.0J$85޵kڵ … 2KnUkAFAov+E:t@(3g}c;DN:5qĺu~mv|I`4((H^mӭݻwCCηnƩBCvYOw H-\txD"?~z'@Homa =A ^UbDωC(!}$_TL>`=z1cƼy󬭭!$]]]O: 7^@IJI؟HniiYYJ㥄nrnm\kӦ rڐ~2WS\,u͛7ܹ###~K޽괌C&PRbḊ`*(C1q[$#:uZ|9/c=MLL < i':+++/ƫ_ o6od_h6DuyHEj">ii_oΗ"y8@t((GgU.]}9sUor̙7n@H>}T4:2%J*@l? ozR ŠBthiX,600Xp!"(YėsDx1Ȉ>ߤ$ OIqZ5Zh6o<ʌD;zWfҐ(֩S.ի׀ox|Puv&]BF@JTLA"ٸqccccIKKKI''cǎEGG?{ IEW$J T@l4i"oR5ZN!\1] QCjjݺu1V򚙙2—Bݎ663l0fwD׈ik PҾ}ݻͷ~;tP<ѣǍ7a9rÇ 2hР~ѣSNM ӷrSME+qRISS[[[ر7oބLLL^()PRJVTT Cᛛ@I+CPV&[nB*fsss!6ѫe"k9!=@eѣzyy߿ x_r5zDOsu-J__K.}O2e*SM6}tS͔5|3gܹsgNw0 XBΦsIqq\aݺu?O?tܹWlE&JJ T0D֭(#WBD4Fkkk#CCWt5Xv>Xݐ!CDZj0[|@>}4A y#?`wߠ=QxNhhhll,25")PRdu( aYYYO>wڕ/Q`) @|b444 K=VpI+W\51߾}!dGEEWzJj#m*1SҴk%a֤V"BDW5UmoҵgB ,ZDH) 4QNQ"{ /^q^]YZR&Jā .o #7 **X.--q'ɷ[XX 6ߪ@_/ZT_^MBHZ[[#svv>q =ŷfgg#2P֊dJcd~4'Q/XÓ)PVyyL|,{sE$Gv\Р217D/Pi-oeUd|W|ٳgLii'XąO. Hv0W8:j(CCCcǎ>>>H_S۷/j>//]! ! ŷAca^I)QktwwGиyÇZv򒵊 :tŋae(+QS5J6Wzp*.M:GI8a<###!!!<<֭[]eãF&P!Pݔm}=d%7uA vyժU&** ܱsG6m_,ŕ?/1@W+(`Ԕ,#UIaÆY䜜"Ĵf;޽{+Vm)dzL6o%C:usڈ柏/awԄb,쬕d󮬌'-- ׯ_%wڵ:A $ufOjj*[)yKYl۶-AOOjW]0CY{ݻ1UYXY(txr]Y۲eu{?էOBn߾_ׯ_JJ [䲬RRKKkliK%K67ٳrk+%ͻ"3g;v &|d SwF \C@UW!o ߂Gc3pkNNNK,ի2|DG$FSWBB%$ D:2֭Źs璒}}}H̝;wРASCZDӨ2}A*Fr{Ji?*%nj|Jk.^"ѣR+JJVYrY˃9!Njwӧ= PΟ?uָ;i4&(PE.uĈ?fܤֻ~Glܸ5k5j!!!۷GFn`?垞ׇ$WNJJDt ar"HKk:t'22 ޳'#==oać|D{+V;K.M6E@@((h7K4`499m9Kf%N߂=k.d.C D .@$FvĉHk9%e|!%d%P [l"NI)[^ d|'N‘]"NOOe%o cǎf͚[edd$߱(/_;0zjDz7j}>(Wi)Ɏ,F5E$JSK vعs޽z۷wFF۴i@N|i}A4=CYIDe\vssŋ 24iɴigFv;(kvKIڼyѣGO4Ĥ_~yƵ9!t[0WH2&&y&";By4VYhp1DZ#K1 ?ϣXfE J٨4h@.\iHi"6WpϾOLƍǏ|+/%1PLܘSJMIvm'NP&-hdWD/޸+m3)) !%f+TuE}T(n5vP-&b[ȑ#q9s@ eew((߿P?3"0@yf 6"?&[>V)7{… xYNNλvP"…  !/6XxJjhh0c%7 ˗nذV %Ñ7j %D%D#r&ZKdLԇK}m x݉Q?I-*l!:1H,/RΣ=UOڵ (kv+*QlVVV+WOP؂ MՀHCHuɒ%Fܲ])hSRR?~~m///777'''qڵCKlhוB:-1jժ`2!!!===//0au+,, I>3&M[W; "?*M.^lٲ͛666}Jڶm'g*D&g% # S^D|ﯳ @ ["##~QRR\QQcrRe( AZH{{{;;F+"UJ4Z\YdPcXױ@]v&&&HZzc,"*5ɖ~ +hkkkGadT{۷/?#7.**J)YRٵkWncU񈨫,&o۶ &IֲUp d7nDػgMsk5JU5[,l-|wltڹsib@*+@z䤥{]~… p6`eϯ{"ᩲVSOþZ;G@N"@e0TXa' kb0 klrvv.,,]YYʕ+[544{J$? &GxW=9ɇ]ۭ֭[߿PU\\\QCAI]]],d...ƿB+gP|]zIԡZ,ak0={2eʴSu/]wq/DxU[HH ٳgl%{Ǐ#:88oڴ :hРƍWLЈVG_ոΡ\91JMMe#zƌLQ2KƠwc. \ǿ9QMnddf{,3[RidY q$R2,%KedJ2=LҴq=>^Q#MB%W$ ʍ9rdnD^(hgh1eӧOdd˗!9~d$ruցY@dPPP7 xΜ98$|IXAOOo)j3o}N?\__i-3 ڵkt-[/m2LΞ=>Wu`<抠X?UtNfeeq dFo' %]\\-cǎ`A!&}(02phG?&T_XNLtuuMMLH+++ w ׏uw_SR-sml+99U`@am`*ݻw'9+1{+PKvyѣ?.m%d>G֭111999O>2%OZn]:0=zbWʬLԨo1o߾H!Dسcǎt_zKׯ7EEEHxG5zvW!#*aW'iy5HVNN6J㏞8P133|Auϟ?PB"ogy|Jo} I\: 9}t[3@ ņ͉"Aa})Ƙ1cdAw5*7:::pxYxO>PA {JL)&A믿İڞcǎaqm۶+KX%K {A&xF'VBFw4g͚lI: p*`l .]bZ`^,C@w=r޽Bn1aٹ:R#łXNWrRVaۗ Tc@Hz§cKb7 Vⳳz .}.ke2h 4_ص.ef:}45rl$"Pԁ˖-+o",U)_vMQe}؉"Mfkk D\'N덑B <%1`aPm/>>~ 5̕BGu(lo)** +* ]”)S:vBq׮]OGzQOo`b ܾ} Y9tu~R&;_~=r;Yn)%$d_cP-{ٳg).BŤ%`[FB{ 'EN} ylyDvB6b(dc&1u2=`e1J=e8x?IIIٳ~J~ ˬ]߾}uU|#bLMLR~~~ ..H0eV5ov}ɘagp ʵ`}7|y:u jSK PD/y)&r~rf'YT#?( A)ʬ,$qqqرcOt ܄kG"sΓ'O&X[[c߹mذ읽8D(|*-)!fUJ+8` Զm[.tu~}.ܴi PvS8I/ 27Lccc !_}Uy6rۭcG} "!Axٍ70/gΜA`p v^"@L pl-u^D4`1X#9(faHٕ%fۻz*"::Xر p ߦM&\ѳDɉ&xyy!1ttt\ aÆ! U JPRPM4ܾ}M3ڈjHwjj*bkg1Wǧh2dH||<ȴY+l\ ynfJ@bV4vŋCCCH>w&aڴipH]]]=<62O?uxpF?+R{exṼHGx(LR8k VJf䕓XΝ;7oLNN++`Cٳu~q PI%)łqFѩS*A7Kq [Dڀp|Q\T'N`-D9<+;X066>˗GlĔdLuJ$X+@(7m_dttttqqYl뽼 pb Js mĔW+$79===PT̝`#&+rkYV*|;GX%a200ʊ*ЏVlȓQQQ%WKK ۢ=񝻲! NFFFR#:3>8\ hkk{zz^tƍwRxh^R^@YPPw@zC8}v`bիVZfƍȓ'Ob{ˁgVO—/^%BH,͘1cÆ Wp$G!TZi׮݀Yf-X`׮] _|EFdӦM 6oތBYADIF- ޽;ޭѿxՓ)"\vC ĖA 9ER :>|>>}ŋ@$kd灰0xJb$''C {5*>6L@x%$'mu J+Jeqyj &":))2 ֯_/$b8'')ޅ ,4~m۶ݺu۷o׮]j<p2$vyxBE*|0P"n233mmmYFg3>RO}Ȝ! %EJE,+ye!L kW ϟ?X`+TE}U,s0w޼yXv+my릲B Jf, s @Di tM@qZnn:+$ .Ν;NբE CCACWWw„ `ӧO}}}/^ܯ_N:!a`Wܡ+:^Cn9s:Xb ;vFIR^.] .RDd3uT.5T*[|򅴒#kx»jٲ=|%tuݻ7 PZS)&춾+(# y<(ީY);e˖ӧ߫ R&j{7h0:?/e9Ҹq㐇d~~~ii R0CPrł% EEKJH8 #;vl /bVޮw.~CW쯼#!GΣFzьȏ"GGG[^*'%}"kW߁ ?~ M.(((Hu5SϏ  ytF@ӉԤ'PWW1b޽{ϝ;:RdPE@V-eBkm?G5`TP߰aO:*m .-e11۷oZ!|ή9ݻ˷iӦvp :(/n򘫏by!6qpC@ʒjI@ګV'1o@LK-BK»M&Bg}\RUhd,\N*ar X3J 3UWi&y|+vNz5lذC%K;b>+2O]_|Q\\Arlٳ9{'<㉀rFbW6kXfRFuT,b+u<%'|v2*e"A@F6ŏ ]D2JX೵hbƌ˖-Cc#Աa=z$ @n>QTЕGD5sclӧOI BB?]aa'U;0]Hd;i$d ATfJI FlH)Ƒ#Gd18^L)"/_AL!L@Cd=} ESiA$GpRM:w˗o۶ʕ+܂PR.X>KK6m(ҥŋ]񈈈:(+Hdhhhcc=0d%HwѣQ <\b7\gآjN򔔇~+3%[XX]8UxY:::\rǎO"##ܹÊ_^ZĪtYfv,1HcJ[qo߾cƎ]fMtt|&?ȡٳg<{>z>q yväEGGܒWwdSAe$R25J_FyAԍqSSSgggo׮]ׯ_Ά)EGCCC9)7226l2 .\ӧO"=i~)L k IIIILL aW<&:MԖ h)SvY Y('<ώ[f>888...-- +/)-;:0~x-֭[5: RIVܜ}ψxz'Y $,--N)Y;JZ[] !yHTh6kEEnܸ(>>^233;ʳ17mԲeK%#gGHC>f>E2UXPEɁ́a'v҅KAi,Q=By--ǏðUb$OQ2##k׮RQn$Wݪolٲm۶=z444vo>@ȑ#'Nם;wN4Iid֭з<ͅv]v vQWWW\vux^ǔ)S0,dvv<%kG]ayx#)$w"i +Jmݺ466 dAnݺo߾iӦ:g=wRV욗wK.EEE/Bw~l׮+!!B;ɮ()Sv455e[B:<dРASN.-,,UGGŋ  vv2;;1113gd(eQϻ>OdP`3^Wԫs5Va5 Jo'o+OI5$vn޽@S+|8 {ڴifUT]ʊ>|x-vAw#FPW'7~~~ iiiw)SFD_Å\NJ5S5kk/_|ON:bh8p _S5%H4i;97B_ ]%RezzzbbsX,% (G%W)w;HeŮﲓ<%yJֈ;vJuVBˮMD"&(00wy )5o޼d-49}4&࣭׻")8`K^t̙3Ǐ߿ aQjcǎvV)SF (Oi$<)U!GQ޽{O>+VxzzHyﹹ/_޲ea/CĵR B>ZX@J JݻwSRR7A̙3չH:DKxPְKYJ,,-6OI$d\|$B;-rtlO]t֭[aFEE]v ֭+"%`! ""@32++ƍG=x𠛛$ADg&j?b))WFj@ʋ]xJ>%۷gGYbӭ*D֢cǎ0g϶ =<<XAa!BPEalڴ `2@ 2(%EEE%>e\\@yȑ[ ϔ9݈SBԍ46ZLL RPf' JKK D<%yJVV*b*WS!͆64iҴSg̘8fPMM ܌~:] \:uj˖-0NNN.8`Djkk/ mЎR"a@ Go>OOOGي :ATȣW"k" Y 6 mCN2<%kDI|wùU[M@2 &L`aaamm=wܥKXbΜ9V KLLuփ$<63/QX5ɓ' R__ӂЭ]KIl@Eq+ ܿ]*yGEǢB,4e=ҡCl .  0)SzO>\duUDsuyD\̧K.fff@?dݻw?~<""v'O`ɪ cR H .C^TM6`>5GCs炂dw"Ҫh_r-ZBxJ>%hQUBO6EBfHk[*L&MbǶ]f͎;ϧNMII0>~! RXG={*#6 ,rss, Ӏk(%0Qfgg:$Q(7oތ,>{\v-666<<رcGiӦ+Wb_( 5#NcFǧDLjb)F&M:u4|pSSS8vnٳ/_|"~0<%yJVcNvϲ!,ֲDΪHKZO>1228q"\$h"]]]׮] žY`בwV:2!Je'~,Yы}eۿ}n %7jff&版 9tLXիDR/5,gE=z"zYN1ѿj%\qBԬY={5j)vԩS8# y}~dѣGj$OjSXʤ 6|ڐ#Y$pUd""JC`*34KE@"bS޽{1c` .\twZa7o,`{r \%j3~ Rlk)\޽!Ǐ/X޼R+)(KJ uضH.^Sy;vlܸf6m(ë !ZNtlp(epKcѾ}~FFƍ3,$v ~''UVt޽ȑ#p␾ԻwJw_SH Թ5w܉ݾ} 1n4L\Jbzdm#QX!HD8MMN:(Mh#n]brV???Vcd;XG2~ +u>}(d2y g۷/ocootҙ6W&ݥEϞ=Êddd$''ŝ;wpllٲeݺu?,6m^PݏDg5T"oTpLК7o\tȑ'N;>Ça*Ү\T̙3[n+W\8p uuuy:ӈ6] M/=" !u;v߄ؤI-ZteĈ&&&rw3gΜ3g2R||kȝo`` \dLL 6 6݋es z OG"*jW LIId;v쐧֣GѣbUCCE#*5Z*4>KD"Jo.P:kƼCPdD6ac!mQϩeZi"buEER4X6Pߒ<ﰿ{_=;e_5˪p?}\ɽ8fQ_œaǡicCXFh D:bBVƛoIM ػw}i P"9?<)8Kc1&&f偻K *MeFF-=@NdÆ Em|W|'JRniӦu-@Ek8}͒B,oI%9 ǙtEH@|ƷyݻwPy5jvtҤIq0^ÔR>* NrD?$qT8~#5 *I 6]ԙq8_9y5qd%~lj)>a"!###۴iݭ[+YRZo;^PD"1H׵MΪ$rH~6 ^ /CϏJB xjPI<ƫZWH ={i'?C<*} }qk4dѣaÆaP֭[<_Eh !NgYq> sR*;Gt昮k7OW173w*;<|O{81qtGP{eկ_?66汗oqgk/"$*zpFys}Q߈|N-DUYRƏuV%@% \pe]6u)**0.^5`-[҆ǘoFɓh]vx>d5X=Hc[#d,k.]5kV^=/=-ׯ{;v0cm09ef!6Ѓ@:q'CBs~y<_v-ZI[[CjE..)S< OBBAH^zhr-^{%(˫p ǩco1Q8C6gi8f1)ܬ]G  %.]ᄒ}-bh-A<-TPHKܬHl$ _|O eM7TR¨\aŊ^GUFm+?mRIE9QWY,^+MSCD1Z)}%%-mimplgNFgil-[4n뮃W\q VJf)r W1t.R~}*Cshb?aV|\􌲠* )/;bJDe^b|<5>v? dc_~>,JCmyHHbEeC dxAC C"8Hŧe |*I*aѳŋfL߈# L =@ JTEl-/I` t:H$5R jc9I$b?ej8ϛ"ROCĉ"}yժU8U.+0G/*+<&i&޽{éN:2ڢf͚5nܸaÆtuEԩsAZj 5k 7UNdd$֭-`:9A3̍3Y"LAކ*xZ8E@0!#/DRH ,LH~yWYP SϛGHNNFىS;ܴ^zE׺1C"W^uRIj2ayLL`Z)@9Lai͛7c>S-Z$rI_F)ź\MKX 0(`1``0,N"*r}BDǏe_ 2`L[o%(+[l(Qe!t#mS8L?Gkch@S$8p\0rDĘ;*$c˗$FE,Y_z+悎 d8̜9 `A=fbfI69ڸzj|IE&-|rrH3K:O"r ah0 'kbr_!d" fv1ի đY+_W[Z&EEݶ P^DN0@ >Bآ-"%2wl9SWS(PRDnw*HZxr(s %*(SyF,}:rD$$iIS`d(&bDACt%" HEe +EE`a h+ B( 5{l }ń be1>@bGjyQ6)AY@E AZD#b#"P۷K+$cW捉|K(6LЗ1Ϸrl'b)X#IBq&h rXgUB ryq ?鬡c^D1׬YÍǤfM@4C]QKCpPχ  1nb!#NJE eZ Eš -cfyYs`G}D?f@$:vϚK9 3Yx JݵkWxD` u)-[$ŎČrnÃeLKC$' Jw)BHud.rAYD, C:q0bʔ)OL2x_|I.ju &坚]̢PP.(ꊈ/Gb ڵm6XF+I59fsN~8+ʐQ`ْ!y=@o@e- A0^08. s!?)DE@Mq2` s*)! 4!P|*'Da{KH%rILr s$a}UY%ǘ;0pA+Iאd b,!(%EPRqh?F1K{,q܂q;v[ 30/e)<^1NOhK@ܞ%NJ^!!P SsBZ @TF⹐H#i >q`4i҄&>^1^t'T~\V_Yp~p%5L+ aR{ gV^ytJtVnL"Wh".+VYUVQp(#A1`GDbDsZ}/)p@Agj,0իW3•Ô$RD"!{ |dgǼ"4R ǜ29 `6  HVTneAw):6n$Dd;9$($=.X p~A4 Fqk=8DP -.Yee j2flD[K*B$x"p)nG$⢢p87iIH뮻PxCFh tD kժEc5jdo]jx@.æn׮]PZ+m͗#;riKz 8KrTd o@K_fB2D 5 R`ַ~,B.y(YT,-출#pI;@r4龩Fp`HP3ײ_J J"ScA=ԦNLlL.M>v=$0S% 0AR  th,!hr [1ŋeҹs frA~##9sᲸYn!tܝR) 0e*5m0N\`p2%k5tU D7ݺuY[իO1sd`Ə8g 24 P;ru/ Y aE1ۇ0ɛ+ T "`]'9B>6X[=pcŹ\p5j(b\TWQ%3 Gt>@L=R y+Bەj)eDj;s'ACeRg祑./u]06F80z)ce GNUq/`IVB@AIJ(2_Dv&_"J h(+-  99s\J -j-\RYʫ(#˪C0ӳ s]\%IIIƍCFjӇ q2d}7*f͚։u҅(DPo^:XsȰ 8ϒKn!($;PO,.7)"7YE=1HWMAK1, \qM,"zMQYSH,hET~E"#uQw0ÓWֱ.|/J=c JIe)WA `%Y+3#ZVA$ dX4T^E21`R!Lj\u6"M jUF!/*`H&PiL*hk9wtSpH'֘*M\؀&M .:u:'*yWUɢ`B'- 2UEj&Ȣ\Fإ!oP"߻E \GVPSpGYJe >ree6B.qS)cQHX ,D1' DLV4n.)0̔ d]P+ML! 8hȚ MXYdT,a jZp 'feB,,fx)GŰ-'t;v42ӦMRʴ_,z0Jz7WC`Z-[6{lU|i3csL) Cُi.#gzTx9 ǾjZYQ  uq Ť _5'o `ovtJ̙SZY3g= ,WmڴYdI~s~&L˪A(BXY}fgSV,)S`ݐL#gJS!M Zf+# uyV< ROT oOċ?9/{Gd_i6fY,DȑIIIͰyu=~ժUuA!!!!-Zx}DiؙRFe8edp6"?ނX~Qv"i`~`:B>( >RN2v)q7xZFEGG"ںurHdJhBQFnJ1A27/"y)nKRWM-'ߺYݺu1cݿLIIi۶m*U^. ūzUWU%Ge}h5 Bq~p!d_/?.5kl߾9{xX{\=ϸqN8Q9i׮ BP($/KӦMyB{OܹsK@Ξ3gNhhh*ٸqM6I?^֡fffN4iڵ B8@wZnM6yʔBM%m(׽'N LLL,G &4'''? BPǏ߸q#Zqԩ_K鋢YV= V֭[/M BP-ȑ#gϞ]1^7%%eРAh_*Y~}h駴4BP\@dggO:nݺk׮ VTյk׈r=zIt BqA#٧Oz\إuii&};jof͞5˽?^:P( l~aFFFyl2 1b}箾rÇ.Zx BPThǴroIII[e]Ȼ5jٓS~ለr$'KBP(ӧ:,]܊sɸ~xsϤIQɼ<BP'RSS;w`m޼IOO0aBÆ J0B^waaaݺu+BP(*ׯ6lرc.\XnݠA4011qϞ=Ç\.I&?eĉ>N:7nYP( %ԩSFEG3vرcvSMFFơC?^tYuӦM׭;uPP(*3ft뮐jժ% BqI";;={^~͚5{衇rrr4 BĀD3/(Pڵm۶Hi-[h/P(K ;vܹsgD[7l؀w BP\bسg-[+J* D^^ /СCGj4 Bpkժ՚5kT( c BPX߿С7pCll BP^3xॗ^Zl~P( `ǎɇ=q BP{ٳc&NHOO׀( B!8s̆ FtRIBP(T2##ĉYYYBP( BP( BP( BP( BP( BP( BP( BP( BP(ؽ{m4 BPBzzȑ#z) BP(n9sfʕ^{ƍ5 BPC :y$Q( "##cᩩ* BPK7wiUIBP( BP( BP( BZJ endstream endobj 1 0 obj <> endobj 2 0 obj <>stream h[˒6+~Rq)+Q* ' FnkF4ƹ (Qh-]v?y9/3Iv'/sd~?!`>a(.~c=/&_c7O^;,v bD 'D'E1TZi9R:! '6x6c%(2>I;I Mqw離*7w#.Znr4zX!8,v<%DI8B>]%ӗʋjgwfWnRVQs}ʗ -?}QNf1"MٛEbc 2~cAi~A渵G)-t#?~ ZLjbJ58`#Lk[vmM͉±mW{OAJpr& <ӓCX5ezԆDs_n־ *&鼵z?A$V1pL#HȼxXmҴnFF y.! :<$DTH0Do3:ԉwʹjIMjfdәx";Ϛ )X[K纁(% ЧlDj:u 5Ϩ%C,/POW?W.[USdv%CִOJ94[E+QK1PKm&ȵ[I:DHzSq 7E*gbH)# /!Aiy~;D/rXVwK|UbT9x]6 K3ef ?r4'D"AB8I NW >{bq >GMڜex&-:@޲+aP;~rqK9rG`~K!)Ei\W]}[.bcIY?s)֪q/+uOwr:(xLMΪ h.?s3ŚSrc MG9ϳ4L@쾫x܎&< "&& pcqA>Z&m];">+VycO¤|FL $sTqN)HXp-*pi̳?`sI[}c0<qHv)|t KevA(}Ӧ !Èi+:_HFO~QMO ^c'#WqLF7]e 8M7)QP)8]YhmϦ;Z{g)#m=@4Wc! >nCoXQ|V >4L(7bo+Ϝ6Ĺ17mUϚt;뜭jٓ ]권ui~ 42H2+v0~R&(TQ]?c-=yGE0=nEW _89`DI'# te`7Qm"Ȍg<+'y;gWFFRp(+`z/8&z_NL*NiI[xŏ-Ge'lKzM #]K$ }}ۻ Lq}Z6M~ʳKS|Nfjy"EV#D'r>stream h224U0Pw/ .HLNqM,2Avv%%% `C%T-?(bh`daq 3(X6aZSK\CR+Jb $ endstream endobj 4 0 obj <> endobj 5 0 obj <>stream hXMo6WTP1~Xf @^"iCRNlɉlA ߁̺}$@ʛ 8pJf4ӆ3Nf]V?;ι]ΐ#LrdkpL \Z)f4YMxO̫ƞQ!0BC0(B~jWŗPL*LUh_B\XRH E0:/p̓e4{LMkƔ*S8 n;*F07t V{5S>hhj&6Q5HaLuj j wTHA&3{e(.-vRW&qk}{^/h fS챾oPavYoݔ;p3fcC9=Bh0pV -jci",;y1ĩp߁F?4BqFZόN?r|<8Lwdb7t杜.?n=`p"bbǫr2tղI*H?4Ht#b#6f -s bV]@LJɣEL5.P{(}_)8ƻ!|4Xbt)^ TRGRl`:PÃ(ʢJ5A0}ƭ Q endstream endobj 6 0 obj <>stream h224S0Pw/ .HLNqM,2Avv%%% `C%T-?(b`ljMlK(h!Tq@Q~rpjI~~HjEI@W! endstream endobj 7 0 obj <> endobj 8 0 obj <>stream h[ے}PZtR-MyN/WDH\-KHb'֗=_z%,pFZƭS k&u/jQYPRTyw˪ +좽lVFQL>iV4 1eUyt,gjI1w{cuLv*`f8;%ElNF:L3]i%C\1 ) ;;Yzc>L8Q#aJdα6'* ~Z ܝ<^|C kcQB]Z}bfLFK/h3fnx) ݧ8Yt/7It"!^$Ҥ0&(-2 n(py(FPo$=UFpɱ]4CSSYm>_{:˹rŎS##I:nl4 (jvR#ݎ& *U aA';Hv ʦOʷw6 P2lMR(Epv,<i5ҁ2BO:FL͋[RǑ^t* m&mA#7a;Ë BYzO{Db_gҀEVvqSPR q(.BM`ZDzLzfV[Gp(:~eajpע88*;ܱb9nHFĴc!& KvWWG#Z U/d@G,ބ +ҟ{;H@H+5@xU4:"Omj]^2d1|3UL XaqW?ɳ]o @)inhjVPjhF5D<9h۴ :KfWq^[9G.ww=ǝ x a_ϮS^рV$ȧOOfHE7 Oi$O٧pǃԖ9nVrq[Щ*4i4%HmX<,@132ɫf3opoal@¦koCWjXZi /8!W~sGw"5 EǎmZ'&]ـx)^-2AD^zgLi^K3gW\V;ρ71#D[s5/Sn؀.ݓDE\w,bn:  wIut{o9 pEjE2c^ZlQh0xmͪ ؍Gv?G3Θ%'mμy$@-*1[.t; ( 7=qGqR1KqNH4X2,|06&k(ȟKU_ȭertT{Yḏzto<tXIԾmmj氬 ZZ;[c^t:do9Of5y@EHrF=?cEI'r11hn,jtcG9F ަ3^,$f,E!M9ov,sTc^q dz]$UuI ֌j_讝o~;oooy(gm"XK79]ũ;:f Allhۦt=;ɆApgkPѢ|vH6v%6ipJ~/ 'tx LCy?V-I ^ jH+ȹח̜=o'wdaTaiuTӢA"k+]D ɤs#\8yQ;nާz*2K-ΆF#-dX42gCnxbVXp |Kx=rS[^48^P|3dݨ>fֱ2Aޱg h~WcD}] e- GPp/${/Yn/_:9`s6$&e q+q3j$>}vYeev;c}fM:M|C$;N(MeJ)rIs7pc.W ha ]=f U2P_O#Y:{LzkųMVm)xڞ4L),DIuSzGA^3v)Q{퐲xV9SȈΣ9HOp7SC$SM֪8W}UK92* bkFiʀ6Xf"&DQk0aTjB)ĤҗV|!FڅbB=dQm^xj#qx] 0޸- endstream endobj 9 0 obj <>stream JFIF  &#!; %'),-,350*5&+-)  )))))))))5))))),)))))))))))))),),),)))))),)),),)5))"F!1AQa"2q#BRr3b$C%Ss1!Q ?*)w*f!U@I P4f4ڛ6ƼT.x񔭹/{G\\Fh_v[L=[kvߑRM[V'JTf:7r*C% al, sYa%]/-Ǎx+_V?pzzS~2Q{'O,.bG^L#+vjT_mͧ,R-uZ(TDU@b"" """ """ """ """ iJQK; RLezWkQzۺRa`tW}:mƢ̖55w/5cx,|ο{v_ Xuyݙޟݩfv;g K*Vqu>J ;3j ?Wn֨Lm6}UEZlsͳl klkQ4 !~랏UjU"&?hՎJ O_)K \Z2H|'IMN~k NhڛD Xk=,pϑctx=!ZE+i}YK+}'"f9c/]JZl#fO}(% Wkؕs(m @lkiY*xOܝ1RXVH v?`ߴ-*ۜZ: {Lt: G#5cQ{Wc=']Qw–a^d+pkjY?R>"jOtg:WR)5bY|_Ӏ>8]>ِTƫֹ͠; $$̓)KFj٪0%[.F%gno%+[C?#hlW^]p_)@ P4 S:+_e]h(#_R^SmGANh1wmO?VU;?9G2,XN-8xMGlT-`5e@<&G|Z?Hk((6oVc||$w1oXJuYT@$<ki-cu?;W`lUeJګU vK&{!}a Nlmsg7+|k$yv^)Wݥ Fg ho]qUc@HBtknuQ[=sxtZ]~v:lt-YmӨ߶F1ޒ.&huCn>BWTԍK݉k$&?!GZO)4>ujݎAOFDbVvlwjoa>b@n^WHt(CZ|:p1x$Wnfڴro`]~I. ovлi@OA5^\`8?ETt^xjOY}uá(]9'Þ^Sϻo,v{tN*#m˴ʨ.ǫaGiw1sZaGΒ2DD4g ʺ*OEָ= :T}P;i|e䶺T?m?ý?%N=)}8fxu`ϒya|Yo5ڍ|~@Kx}2l<1>Q:CboA H뿺fS )ȲBG)oWǞ?-4Y媶;. L3f̳KgWnaOvby7wHeQt(bF`C~O|^jՉ2Ӻ[+vGSȎˮmYBӝ_$NlU :P?E}XK8Ns}tU}UֶljH\u}<\U(UU@UP4xL&+)*FTy&m̥]0=3>oeY܁.U">0|qEq4cfd޽J >iOB}c8ײ _~d=l "n,~%$ԫOޟ 'lֵ$g )myU;fIԂ}G,|R~+LM&Yٻ9`=砐gsەOgz 59pU8kK&%[:TdM{ebIՌ%g^7P='_ ('Y--]gZG"7VUABA4ֲ^=[M@Ic@>@~ k䅮]}O_Tṵ묵v;`J5Un~y(ʷav)˸gXbxh m#ROcgB" """ """Wj{6:{U k?dq0'mVVw;TzۛgvkF~z|I/dvsc(wSzdii==}kVӋxz>|=glڱZiP (I'͘xiMkUj*(&餑KujoHWvO\cܠ?x*oe x0=taUvoIB-& qF9}_Sx7=Xg[cZku:'f=XfA)P}A杺l%XtG^G20w`5f$x˾N1Wk8& Fؑbχ9`J&V Ʋ8c>`o}@3b" aq!N;:peĮ*cZXNJʾn 6=՜[\v2-ϵe?X72ƽ3>{?]~qsw+%~>g20BSGZGKʔJn@09hYrh,177ڂi}'g6n&B} +2V*4a -Sg;vI}YI """ "|-@ۤ!Fj@'gH v.ץꃛ22'ff0&bfWmL9#Gm7{hAɇ0}291n/ݐkg>| r5N8?{"QkbX8t:R-h4Eω- bw<ُS3݄|1fA i1@@i*zUA3>stream h4K 0@27H1MdSmbE,Akf;d7aF[hHq_ ? \(,ciOM>2ZE2OBm)m +0@8C pYƹؐnd>ą=ix%2 ʾ1v7 endstream endobj 11 0 obj <> endobj 12 0 obj <>stream h[n}W Vܾ_ @0 '#L{Ȓ!;6 d7om{w1Hv>?W_]^\]`Tj@}SDj!/@pZ|!D/}$Ӣ,9 >$X-N'ˆL,+Z`Zűj~58e%Z/$'fFKxhypՏ"Fvo s$%B+LIJB4o V)KȢD(nIYI)9ԉ5r`M!s%a;u%-忮֑H9w7J8"f)j5jbKЖ"Y!4J0TPZh`T (]c ]#ĕQq# tjYARA1 fyZ%1-dI9m[+Gj>֑ S쏊BB uL !K_`̍܇<'NXW,*D{f|fz\q4n8+&:?CWUXAcr%AS3,J"*~?xQ!qn'9JH9Y†۽VG;CK7 v^B_t ~T&JR'lBY>x;aQHE #em!Ĉvwq@o'3 >h"uԀoA]btS2H),Mp!e' y5z_3S/ +sqGY ^ ?3>25`Zp)S`!5}N{qji{SRp‹o͢ݏkaHkX5 1dd`!RB(?win,>1W6/=6~a Q4~"zJ (kãr XzBtRE+(+܎P*abp-gUHu0NFُ'8Fާ,d_ߪhdj}OqpΉvX&!m8ၒ Şm q~ >,^Hf0V  na/H%ft|9 T?LN& j\>,ɡc;sR7`+HPʮVb L\2X+7[_}j闥*>/NZwa~dN0DxXi#IC, ~`Fej[Nh7TZ黍3~9EuHO6DUnbo`!E47ǡ ػ1yfcvDǐ##c)@JAn:̅nÎ($'C _DH [iOK(oͩEqdʸwCECdFn{/0ɜ+4ǚ"1iW޸.NO㺀wI57˻bvy&X4L_`$q;uf3n̚Rumo\owP}t7L ht2VXy syĴmbURy.Qy|"I-VDNAE2q$A;eYcgtܪAQ;ASԌԇj;s0K| v;ܸXkE:`­NUJ3,js(5f\iۦO@!W,ݚW  s ۭ[zb(!z*uQpϡV2n'%vuKPfק5@l0xO 3*&fIf~=T9^|8@YI煲2VӑmbX̼A p%Ӿs۬\%0|>%6i?%#`"nF/~Cq>?^,?H"=wOya%R@ԝDRaLJql#`zql=>c m(ǝC#tP$MŰ {IUj #cn'`z[0_Ax=>'ʊ$ He5:n@`)v k hGʺz|#>5=-VĽ^A_*?I-䢇c=<%irePyDΪӈ%r,򍻎JX5Ӓ-WԼgͱSàF潶C|KdYQSZ($ҾrkVFّ.!'/U)|d~;͉@D Bn!HdյiwXPq}|I$m#T$d 9uq(HwhRhLr'G*_n`%IN%G0gqCxT m$'z^j(RiBe8S6Ϝxc*S7>stream h41 E% E,m5*lU(bJzk$l&uzﶗ&?ƶ$ڨ5KBnBo!s-m,NāFij̀-şvee{*TmV/?@4F endstream endobj 14 0 obj <> endobj 15 0 obj <>stream hެZ[6~W1H۪RJJ}`P1 BgűCHjp//|γVϫHFFgOZ 3/3f_0lg|=lsð ,4)NΛLPi!7HLstF٩m+5xqD1ngíF "ƌՏU2?UQ!Y*(5"a',h`(wH9"ԉ78S=@F39Gqy<_Hb"XMA#n^ T~J!`T8VM=hxFsF2a 2%kYʛ|zk|\{<1"MwWdcZGo/M=vpLq*)!^%MvՖ,Gzu գAG=!Gخ/sdZBh7ӱ"!̵,gYSd {k㿜?ؘmgR_96O[њզXM{P01ix#Fo /i[PL)nkղh f2Ed(GҦ^߃7Ƿi6YPLk۲-oO)]>V#7\$k{xQϐ!*9.XyC瞉W5Ȳ~p =}:=O-!=I'yy)QGkKOdB |;13zʊVp̭lcU2BXal3,@d:3,C İM|1 g"-PJ9l-7([!s֢^:whC//ױsN_tUK +SMA65 s N-~ǫ h R*\eANK.K/__)G3[&k^y)='˘wnCD3E&t#7^>XPe:Æli,MKMQnFÆ1y 86ajN^Hwgf):5]kj<6yjI){sa]E=ggSP -/(IS7q&aIc}|z41 {??^x. 0diT`O{v{~4{Ӧea$͋v9ٕ,`t-WfTrMbaT2ߛMNhe endstream endobj 16 0 obj <>stream h4A Do*$nMata F!ݛyiQLNÿ' 9xq6092Pktnn(0>{Yx׽׽Lc!^q`O, endstream endobj 17 0 obj <> endobj 18 0 obj <>stream h[[o#I~ϯc[ZFX $t3未ku&3VxRݧνNNW?\}s#Vlus(qvE*BHE]=f|R*o~k^mO+"(IU~ɘ]+54WVcWL:VW 9Ά0(ND>¬akhTxǫ 82Y?SpmxK2@8wCL{b/OZ%Y0|@K ĥ۟y )ҹ?z)%ynz(n~ߣ(459 SS4d!7DT{ߢR.8'Vڙid1tfeZıZD7|[kEdT>TFHV.Wx|k g;W}:2Us bm q[U۵yZEy~ H(a!o咕nNb`81Xq3rݹT9vis|ˆݾOR -~@ԜHu!UrT0C~:_Wtȼڅ9F]T2M\ E|Y B|JDs|.dϻ#jj}eP5Dym YB%>$|7[mT *]ojS@^`~H*?,"Me 'D RMDEtJ F,?FA2e1L9EWl/%= S6* @3%(CB\;}͛l2'52:lSzXPN4*:JC_Z!nD;Ƣ(0D*JȾ YaC#8feVe%@k^ #Q"(qiL68%ύ2p(&Tv_}g1 Fq*>#ჿmvj+C2a+[*nQX{dcz-Gk/g]? Z hK\vi;f(1 IP׫{A ԜzeU9RNᦑQ\g̠AdzGG+(H e9+ڰ݆Y r-e}"hڛ`oV9q.}Bn2k\["̘M;&SW/O2,t?$zFe_ϨѰJb& •UĘky&?cWGk!&3.ED, NmfgsnM1NM zg^'[\]6d`ՙTɅ70i/펟~+pКkh&M_k={M_z(>lBcI:Bi weo OdENX Bs&g&I*A 9&r<%b{!C־C"R;Ⱦӿz|+o=GrYjq~{KrʲhZOǑ@k#iu=c.X;Q#Wy5&sV<-sOJ+'\Rʧ\0}A~_ gƔ)t-t;V@ag#>=hL -ӓ~\Ym [Cud`8l[(^t VFzS]n< ( BCHit') @8@,.ak\<1 *dq}!eFxJ:M;@d<\PWvr֎QUmˤgeФم ˊYRKˣ^X3j5k:U-4I]o^5cfwz~l!Yyg|m<[N{\qwY6}NrZ7&p G!nhSe@&SS ֤9SinyCxiLsvsc0L4 EԘfY6,La2虪^@6goC =w3L>1^E; aEm^Zm@@R,tmd-)7U_r'lst}n{>yʜK;uH^p6Bˤ.>o [D|6;7|[MNk$wkh*a A$&-4hEM{:;O<D7Gcj endstream endobj 19 0 obj <>stream h4;07%&Z(rbl6i-A8G9K~&_T^!%⎭,QQ\ASR`D8/L3[b܃q?Z-,Rq ') endstream endobj 20 0 obj <> endobj 21 0 obj <>stream h[ܶO1BxN&mvc4)77- oP3Y3Hc{#y"u45wtt~zK6D3ԋ-\Py6TA\0Lڞq- IaycW͂aKDQ muĶ!.mcǮ9e&䑓lFy;4rE떪sp[JR̠[QܸQoIrq  J?8 cVJ)2iwX| tW (2֞vT Ei8S@'SRY}dNxR16xU˃߇&i`}y%~Q`u&t(ST3)FESA'n ˺V!A1O@tZ% Pvè "Ekݰdu,CW\>oS酪$1r*Ʀ&K8F{n+aEU]E4VJUi7MP> }yiu577G*C#yC\ߩF rN3!K-D|~pN|[SsybJ)Sd{nixГ'`- oG5q !Ijs0nFHEk-I+:&!BMhC eщIo $T9ja3r1|4 ur|0sNS@]Jp YHw!'ҫB5[k>Ej[f / J&vm.q{$)2H;P.EwKxZA|O\n'X<VBj_[F ږiIa"f4g,MuufCRC' 9ףMitsQtU©|m>=%.)B1TI qtƧٙwDjdC6cg^,h2X6P5s]?5 x} jpTB š B\M\PN;MQE.IF Ku=+JӓR5 \* 7Zb=\XYi@C`?PPn%Y^JVGQԂ@ʚ wq(Ge棥DGK^(S(^2Aǔ_T}C}>}"-1t?DdӢڦ9Ǟ}4E-AZP%(\c`@t])χx,٧JTB7لǁM,n"WK4NTv>#>jnɦo׊O fE8o &+u46h /? C$dZ YgW#[.X#Z˚夔zx8R=`tӓzJl9[/(7nf:;DntyfiUpKsBY ׃QXY׽nrspp)_E.|) vd28"^ǏI&'9l s /d`1{Hiwa,}0"܃U:La6oH5٭tfZxŋ>%Kq:=\܇=f3q)5HU'XQ92X1T3]Fe*a-2lM0rYu[Ia_=GivYۮr}fۅ)2XJoluL^me;3cB0A˕=c5 Ig>?,]+REJ+Q½ 68jTOZΰ&d@%&v 7@z04P>0 T, a23.`o ׄq:d1 >fk(I!pHMnnfE[A]܃Ieh">HG RL(פO ,9ޚfm. ؙ}t*揳XnK_%\4e_o1CzG_-2g\ϕ߮Nr} ?7۷sfCR&fx%Ļ8zO}N 0b :bhgBDoB5RXl_?>$'N ^m= ^M Oz੓тNѶ `U .<,ݨƦ P#Ui aHQpӀؿwqμ4.IvWZ:y|q$n\Ch&P A9(4-odn 1>PxQn_5by{MT\!ATaS8z;MF648;]lZ8;fvqo3PWtzS;.fftT􌋇ܯ&hC=,0q GV{Z|@˂SbgNKsGvE;}3@"Y(j qhlW3fr;+.x<+}Q_[Q]6ɟˍ!O9hrr Ϸn˵Ĭw?,e[{KqD+=ZUD! N>fR@ԫ݁$ dkBhv:h#tի%z>' +D!# t,ݱч~X v>߆5ga$I?& BB-\,xZh,+uZ^½o ǘί|4oe֜u:BLP5aNv8E3Y{>i ׈q"f \[a SScqЁ}0N*!+w'nl1_ISV Kў!u3EODl=K{Avk tO:37'SVĻɿP"*J f_rV-~r(GVov endstream endobj 22 0 obj <>stream hޤQk0}$&1Bj;=*۠! jDkallOss9Q1 r,MeUD/8&wgάYgI44yNM APb'N"@M4ن@A[$GϦɄ gpm;Sdv\!1/tcAF,U{}y Vc[W3Iÿ́!0t'TeuZo3jnۨZG6{lmq"ժrk> endobj 24 0 obj <>stream h[?O_\*i lҴHII#[Z[Qז Ikg,)R7RHSA2Fd;Wz,@r?#a1&!.ZlſkFQ~oKXE͐D?1-u~G $cC 1[E=j681!ǒ]%G+@B!$x*lAdS[NFBBf-I+D@!'=b&vܝ Z Z(-$^!(A\S$ tN%7 q+%)%+ ]Fň(r8(lIƊdo3& (* k?i獘42_V8KfA裐Qp0B@;s+M!C =@fNCKX(>Ύ1`=gg?jZqeO-j؏+*^Z[wdL;_vH].[5B<1 #8Eociy/80S m~k]"f \dUZ1sp sp+S^'S"1CIyWO^,ݠ8JZjŋL­,TC"б\2:9]RixAiL?E3EQ K{*!:3Zʩ|7s3u`WjfV@T^;&%% ilx YUE;E"f.a4)gL G!Ą/V ƆP! SjRrp1Jvz-J|\9ʻvґqȬ+cbGUeoxo)blu& q9Ƭi1a;'IX.9%kJu `/B7IuY{Kop0xx:f8>.$8<4'U~LJ+Cήzr1IՙG9!u0Е4hR|XA~5 P-I bxas /|Ak]4uRip:_T9"0W6$=B yC9WھowD6+OƐh!ghpooAFPqLdcQxI%梞[PI`( ؄C$ߩ[vhX_]sB0z` $@9#D?Љмs*5=vOBܪG~hD3TJ[C,Hc?وd#zC8 9 &"8JT;ۈ5l{cy1ϐtyaU\̜U?VV$4ѐb$g^?yqDlD=;'Q)x Π 9jj~ J-_}vǴs-۹cylTQ>Fjh!|GO}t%oq?:ZC.kOBz&! {@׮"4?% DaدQ{J>['>zzwjyD1(t5ZyFE8(XkL*,sr A&>4Tn|$v"]JQbR~T!Bk&䷈ؔ9 ;p5Κ B64B|cLpEW 97ča4cX[ wK&8 `^1AnL^aqfU.Y?%&w0JXq?PgYYXˌgHo^?$R ޽' "_|1A+,b>W(RӮ^ lDV0$}XrYQG.Yw|&"{nVX ݰrpvbd߬}HN< I%B7 iHbUWKXOk>?g\kDb$~_"k[Y=XD;vg^>,Gxam%t]-C<^,h\f-3ݬVt(ZJc["ȅ^~9*5: Q)s|z/ ^{r٥Edi(Ea1ke Zؙ`W"ƶʐoW!w%s %8yUvCeVT7o95퐻 V؏NH]X]ώwdR CsJ9\>)CɪːtRͦ=XwبSMCԻĆkUa%IyKib؏Ajd"sg;q%U@BMez|! zs.mS븢 yyͲ(9k C^mΎbAF])t~xzr}ygcKYY 'w,ȋ>k-= TVd/|YVm^FcN>&<$7jBD/?ZBt#"bֺ"w' Oթ`.ވq[yy$-e,1tFQ*+kq b0 ,X(ֈ]ĀT34:ꁑ]L{C gt9P 츣Y Miy#≌hM#Շ>NŁzL5p7Nj%JLv)QOQh܃vdkBGhoj)F7JX+!bCK I8 mPY)jh6v]Θ q՟!oz_)XvXDeO-Z"gHNս]j&v8L=iSb߅sVxcO>՛de2[y%sLsJ‰n7Baɕ,v|,5>ݫ|B{κx4 x6hfd]ݏ֟ZRd#Vo }uF\BM6Uyq/O!abKjx{}xy 0۽ō_?*H;ټct]|oToC_jy1^nvrB嘪Cz]L̡Uy7T'QZ`W,[]`,|p_( endstream endobj 25 0 obj <>stream h4;0 @|&R +"*QlYR:{*Gς6x8Eܰ)J*XHÔdKKIbYD~< goV2;ۯ*{0o\C 0. endstream endobj 26 0 obj <> endobj 27 0 obj <>stream h[Yo~ׯ !`},6"AV/6hr$qC [}=ıA|ق,oFF/0ߴ@X/HH w|7כ[1,1 O"ysTZBs0$1#BY(AVaL x BXV aFY!+{\EK\Zr^vuBZ5`JSJBRKT /]D`D u 7!H&NIr[9ҞE*6  0ӷ?-auR9`A>xG 1#su֘6''Y qcXY z>ݾ|*m`|LA&dNj3KCv͊"%⽋YV\Syf$ aw8&#\Y zJY}^XҰYq%;?m(fK*B⦼G֣!]R2r$V#ʅYⶮЈmF)O-ɂFJB*~).lWL8QL`gFχ1em.FzB2s!/s˪a+| Lदbl%-ۚi6 Ϩ*F(آ-m"P&Xuu[݀ޡD L <#]֧aao٥|9>~39e BDut+qft @sCV&$JTVK,­6v@Yl'v q(CHmMbq|L5|sy>G5xByQ9nj::@I 2,Mii*MfP}ӸYB]/^_$*קGK2Dj8XyiyYj2fϱn|wY/W߹b$ܛs"ۍ1prj/Sx,O$ad>#My>S&LE)C¸"8!2B0R.GA2p9 fA .9RA B Ts2 _ h­7܅{-:/i`] a@7&>+R?S@"XxGW@:Doo+BQisahqX7ʺ)aϭ(1̒eXa`xP-7{l67aTQ5 t{}I1 1jvӶ/90=:,uy.;z؍> cUa)+3J%lko!lWUe)އA6\Sf|M#na@~)}J9ASqR(,Mֹ`%?y~.a͌-\n=׮&(qH~#~pOE%T-_5Яfcnߴ:k/H@Ix YS4v)DQ ?Q|W' {*Ѐp2ZH*`y0t8?al؉áMdB$.HI#$*VNk| oZ|bUzHh8L@F)]*i')&ANM&$8;`hMs?7*bF!~- LJY <}ND1CC;;7Dy D'(oDԅ!5`6L`0F ,&;bh!A٤E5";?@6 `jR6F%$EcV߶gѨV[Eh_4A5f>-MP_7& [@6Wk+``={sC8gRn-xeް 䁰<_Q!nHc}HC\Rw1&W#hh< m8Cbg8AzdzSE]^4զ0@Oeyy9Hi=ϖqn2GD[gT10ׄ|=l=4ƄstǛxa=5z(~Z?c}2J#fJI )p=g|{osI=L7kzz rUCir9|*&Pu3h66/6uS/2u!M c'-ʆTsP?na0:~O=/%G"2< s8YM07to*]ȎE<ސk}6 ~i5؃<8#*D@yXrxhGH"mR /ptCp6 &\ؔ,3vwuohG&nC}:Ps0e~C0A|q>ør1Hw"a@ }Y/ D2؟'5Q78C endstream endobj 28 0 obj <>stream h4; 0D7ײFM5u!2>~Vޛv@4[3^y(. 7l͒5~œmK(e#%3̖807i%O]Ϻ/g˅ Ğ1y endstream endobj 29 0 obj <> endobj 30 0 obj <>stream h[Ys~7Vea܇J#!S 7y0Zɵ`f_`0\g/z}}!_?lA aP\ !1bzcOcoo@˫\lN 0D S8mJRq4]h^"M.mm!,p˜p%lmV_[9~{l/sJc Jy\)K6Sr]1bbHsթָŊ"F7Ϗ&Kn\ ddIxX{ciH#j~lmQAa\Am+Z?$M_@br|nR51Sg:tve;7qČV+^i$cf6sM?ͤ\9 :SqFDm#%8eCs94MY"L<4%)A0N<eJ{n yD7>fѡz|wLRFYb/ݮc3 r[xImnQֲ2fd}#XeCS 0reTNm+1?Fe=a}n9|f(<5}8B6:X=}CCFI.P8Ol:"Vjz(Sk[EaPA!IEfU%,,mLYrQ>HYk&a[9/J :7B dFNe $)M~/m[:B,ȉZ/Ivzom!QV}YڠFTW*r\Bl!hиw*r% bGյPcn;>Ξ6a+: "Hj>{ z a9HI|YMG2)aЩݧ0=(c\>/hR\%H0y'` j]LkPTR3)d`0ha0OUKM[tEj恂:#;z_8ԥ/Ye,?!M6`$EfRѯK$ яb1j( 㵏X\]},j<1]&C{ c0 NmQry@AU~ZWU1y?oO&#B1nR?D/ԍXDAp&[lQlˆSwrudZHg}{Fqmn| f[{tv&k0jH3g0] n 2M;L_@: 07AuZP_hƐZiu3}hC}w}PHC`nM:xB-e9 ʙp;U5IN(zҶ.]%AMϤ> F (%@GZ)SvKkvTmO7q WWw,tO+ʷҐs TȺ\0j%\ҡ 7x*+qGB{/3M[sF_E CDWvJl)6/bkp9~n!&!-S<~;%X ^]*W;RKPʻзSH[ Ԓt <^"$}CF>S933=GtuDə X@?|S}<훁&r;G77ĺL45YvRӱ/cM;]D?/!}Ağnh"fm!-7ًX}htyڐ3C>])0a޻#焹Ts=^FkI}­!p;Bl规=׌DR>j \r~ . -s(`wLk+(xYk׵GM%_#_\fi;@`~Ky}=^~̠fK[mڣ_CW$զzi7liAŪ$\e9 D 7HOX]$Y9PϡO ^r.۾OtzK!xOva koXC"vzw o9vbG&j:0U.{!"Y_cok_n!{ Y0!}CFz/ޭ^mh7m݌ɡPS09Vwaݷcg`͌l>gyQ:q#Ja+/&,zRG5Vv蘁VêKj mФAʴ_`I߇U'W-H{,rX41'<$'9 .[vbxj:\gݸd͝d|x捷C^ʾmKMCߺ4,O>K/ڋ+[{CPg.|N_2o>.ON(8ꮮǭ*M>8K];VנRܱs)`yv&x,>[ZpqRξ'8xet5gTZu5{`X endstream endobj 31 0 obj <>stream h41 E@0u@X&kTتQV*H,CaԵ۞+:)%Ƶ,q[ˇE4ZW[񶃗 B 2me u/ԟGcZoJWC/' endstream endobj 32 0 obj <> endobj 33 0 obj <>stream h[[o8~ϯȣ 5\fgZ4OypUlkk~$%U[=ttx.)~÷O盿O7J"%ymx+^o|w?oBts7)?|[Swq _ XޞwN0UKr+Y[Lk~{jo>95ظcnNjŴMfZ (u[H,率5\%qeMk&uu QVۗBix ƗyNZ4U-i=nwQ|ۼu^J@D= tFAK|̀&c2_X@L[[,t$ZUS-d2S˹R0fչDpA:LԾ5hjVr0UrYK4\m\V5Kz0[ʏ/d jy ʂckUS- h6B{(5 ~7uklu Xw)zL1}/(\o|Ӧ 7I$ 6H0 M  ׂ26Wz}k]=]PPLj{ƭBȐBK{# v'X(͠)"1HDEoJY"A։אkИnZimS$hg0xUX:H޳[+ڠϷ7D;ָZEy.~N^ІGe7\~F/拊ѱ8W?V7j+aU Ek=N6=81ow 0 J: gAPf{i~oa d؛v~ן>}o |ۀƝ] & 7kjBq׎eADMTPFւ\;cM-ǙSo7TI){? {U>.qi]XAX"ðE%ц d)0s$8pYɰ~ >8Q0m ǝRPvW2r1*a:7SwsvwF:v]Ԁӻ0$0hq:0U5 t'n5D#i.h ?qc҅ܕX^vZ%mGU9eoQA` | `DCы6XeH.n|*f$fR++ACbttjOK|t2+SRXn2q>T&pE pA,J:EƬfߚt F+Z:8 +3ae%"]CP2{ aatĵi[%\.rͥK>T1Tp9gSPY?L?,@=Lƒ;#>7փyУ/mf+_Qn P(Yq5T$դK *n^䫓0CL(7:@7IJ"]r%dIatQ?:M B`Rțya$0ۯc9ƛucF9 (BKf.BƧ@zr J抌ȍOi+ITVhzo/`^T1a'U SweS ӊ"ʦBpej>6wܧ!nO٢:Wٹa mk<+.H0he xn=gV#FzjyG|/a^uq?' E39—y?Y<;95иYʍOvaP(xC5uyKuHƜ4rSFeM!CC+ u{Fü&FsSF#PblFXK>vxJQ%سd<bEiݮߗr ]Ԑm,1tln|n뭨!}Z&yY1uKQwc_@%̾XDI!vʛڍO({O9IZ9D8y/҂2jV{'5$>q7˾F8amrvcM \W+lR)iw@ uj1n|1K~%! {2 Ƨt厷^YM^7sG۸>8]G}h>rhw2aԞ_;v\V]*%Êc|SE$9/k0bDbw<%GIpepz/奍!Ja=+h\Be[nuU88#(7IDqwvԢzyYGCU߿9eT;tű3+瞊'𩅅rr³e;~gWc%!ۅ3BNvxl`5G0vZaT0+`ڙ1Gs !jyXKHGd;Y53[{9FxYp&L 3~=HV_ﱭz,dSt}>Ę-+gxzr;]&X8TEJ'GACF㙃ݣ Ma>c0t*SI򜈂2>3!X :l_Lҟ 77v@^[MTz<}Ih?Di9%fr/ܫ!2DD7:0ZVᥭ&4s?.%2$h?+2&qбG3:΢}N fP"&_;qDO_t)c*`iAhwD4L)p1E<%).c|i5 }WENHB fXjH:t}N8Ku#F &$yW4M}A/ع+hMiߦK0ESPN #u{}2."\,?R|[%+k%MYx ]d= NoOX| $6吨٬ 9]{lI+Xei[ǔXcPKa"umȢyNA5`Ey).Y=8̳;<9\+KGK܋76ɫ0l8=Od|y A.+qUc[3}{j=r}ozv@wذED hDrVGz z endstream endobj 34 0 obj <>stream h4; 0 @[ xiV:%ՐWk{OOڃinGn{s`lHIO\2n˒8>HRlvQ$%fŀ8l }:\),J=_;4< endstream endobj 35 0 obj <> endobj 36 0 obj <>stream h޴[[o~ׯ ne8W4m ZkCaKIwɍpyrɡ\d|~f|{(or{-w{@ /?7Pxe!|xzv=! C|T^ە^@Bx2`!# e7 sE224H"7lq6BRzÁ&CD/>"`BgoooϛTR?Rjy 0Ch8lo8CrLW7"Ff`V:7@W14nIgy"MQ*(޻I&! ^W)!94`51?}b8.Ĩ2y "v ckfoCs\4sfK2"`s| DxU"3 ρDq!4GE58<[$b6ii "p[K-5tnH' M"7kAi,eRHdM:TCa!m,(b]e[" T}TEξZ2c}7'hJHchXb^2tX?{Q_Y!'HL[,|RI*dU袊+")χҊdʅESJ@tZCc_uxRy_Kz1zګbm[c!TL*oŎdǤ 6QC_yգu+5Q跫-7G < > ;zwt+6`o%W*nG@L/"q0'zbiwi;XTK̛X\fjhxE0m#k:m[+\L5P~W#H*zgU7߾|U=+_h&e`ʀdQ>t_5i3kMDr^]q4m"E5*f ~:Zu`H8NpocהkFjɊSO, !D!,磀 EL3_ {fkRafy(}H)$$"!=͸Y_9|biqyZc3isfy CsmMyZf}!fK8#˼ܐܬ3uT( &"Gj~p1s8)VY;%ruL I{jWcI"%沀gOJY_+uN$M5.8;uk4Z,t,: #V9_-!@7 Ghך#7k &;^!Xs0OVjR)H ~>jT4ج6,tCW~\ZkV㒐58Rq[%2.;Ic0 00!1b `lbN9ʳrYY|r":%RyiU9ќHPD/&NcxoM.._PFe|~q~kvb6S!jv,sáXu>*jtΥ5˸dg6eS=Ӱt_] qjhƌ!^;Ll昸85H8g$BՀ(dE _<"`8R9O0B_vjeȞN[L_v}Xs :l.yy.Ph!I悐DZ( ٚ1SBSsR'nv8rk2{mwfL=%Fqk4ɐU*RH'۱IGm.Ɯ+ @s~M(4bWW"Nug3\˺nϥGڬ%$Ɉ S|IgD8lʑgsaR̿̅CUQX~K #ݛXգQ]v6CnB)fi/Ԫ\hIR6̟)OghU5ZxkX-zhyaU Teq/4v"WtXvKoSwt?FsbG<.lwZ摸pȚѺ%gJ];ژ[R}ݐ%`|.8lIl[ؒ$7|2%h[ȑ %_&eŒcD_bw,r)I_B&n{}}ㇳ|t;U~LQ5 Z_b8^jKtt1=Ze,t{q~D|i: `4~NU\E>Pd" 4#dg#c6L\ h]ZD{ľ>iFA9LsYZs*SلN7* $`(n6VUt+}6 x_TCh4-}nK3[/SD#yt kk!฀\UCAK9UNj*il{ؤ=s~BUP 1ɪe @rXF1VCa PĽdS^*W'p endstream endobj 37 0 obj <>stream h4; 0D7 Htb!N ͼaP@Ӱ6v׶ Jf/7Lftf'R=/@hZ dYgV&3}V<&7 j'k>) endstream endobj 38 0 obj <> endobj 39 0 obj <>stream h[[6~_Gi+U';Ȣ3 CeTJ`SPnlI]sALJ-_PHHI$>Wx=?>iJ>>Ï@SjLXe!V"Q4-ËaMr1H4ET!L[R\TM~*;uofJ~^Yc-KED >E2l")ocT6E:w7#GaCq\ (M+S׎TcVeP1-"NlaPlJ%LB+ȴx x+~b}6c)7Gh$&BcB)dm]h#*pz sbMIٌSnuTb=rkHŶ>`3#cs#tm_9v4&Xbʊ ^pLut4q=K'(h܀<~&mTPFRM U@vtH$)?tΆoN:p#yخ1՛4 3تpݯG15#`E'b L%ՇOMaRY+Hl$~Ŭz 5C]d#VŽ`/%fBoc#-@G<\|'Cš[7O/K~8lJ[Ohe懋cHXÓ{{![Iq8zɂ8٤Dv"f7nB'>r٠S=oNGm/)`zQA]n,I't aqIx Hkl6gה#7LuQUU҈9ʂfԊTIjkm 7T_5 #y •& fH*upWWWT6RYnvQͅp;zA|u&}vLw\*w*%4 *T\ɫk< å["ټmkLjI6=hWA@=HumXEJdeZEVV|VȺ|7@ e,LY5Nno2лS8]mi509]mkIb9[t# +1>8{)b#v˷sZOi`1l(\ j!VEEX@\E(U]611PDMbTfՏMZVP,)fK,E1a }boK׭|77d[%Zy|PZHFFS8|y̹]iB|k뗟><>D7'Uqx"_Xڇx~xV:-ªɼTA(r-]}Uu#$]#?(H"]ZCѶW>bԐ "9˕)z|zw<ޑ!d,;Nir>+D":ID.c$LpW%5W 6I[zSN`% ףMA_?v$ϫXz~T<ٝ5Z; iiNz4߫668|+ m1*O+4xt' 1#.-o(3fkOOQun2*%m'} Y$fXf[Ñ x0*w+ZszVJr4qu0dftx0 FqJX-hFFu#λm8#JpF6c~[m`R-~gW=&D9wPgjuR4c4s}T3&6:݉h@\Cl[֞>q5[M1@Vڃu/|)c!$ OEIew)d|-kc}r> b-nvGk@x)sGlA{\[FJ*ja'`/=XoۖMǺF Q"\JJ_Vn0"3x=_eУhd6޻'Rruvz 9d%`:KjOQXm^E`ޟmmYAKUlLF|ͣM+8iQo7}Rv啄N÷WPQӑ12n4N2#%2"O|3L;aye^1ymQsX5].(ʸN 8}rm%KoXk56@7Swoj ScEWymeȌ):RƉƊm])@z@XC~*ya% :sEn-gOjp[*H?+D8o+'~R.BCB|2.lnnJƠ\&Fu)1T2L -$rNPsBT1˟KmOGRؗ; ؚ3~ɢ苋2< `]4r[:rx%S?TwU4TqKTMf8ZhB7>Q0ja`|U7$,ESV;BV (Cb_e)Vyypqx\ ~+8|bBya &Yk)[WN}գѩO'3%;UdO嶎%P.Q1ZXUXX_ ՝FYGfJUpӱŚ֐նus~A-H'<6BF1Al]4H dGXu 嫘Sy#%C ύy˿{'$!nKHn \9ljd׵/n( 3gS"V@("$#'c}Y)~\mܺǸݠbWkmzVA%)./v`LemXԁ95IÁ͒?TnQ:tՌےZ$ ᴵ,TI|bwhr'\` ^݂% \C-ېaxx[3/v/P=<ā`4*@1X<Ze :XEºEo`zoήestT֞A]::,Ejs=0ʪ%/5D N?K)I@i{  LЭvSf7{ϫ*v{ax#kfg*۠5|?:ߧcu퍧JbNh N0*f gq%ŠmRt mRgSGާ]m nZF Nn)IY,AvzZxsy_nk=68k/sݱ RVAoۘƓ 9].ҏUU.j?H-$3WO>B@~\?-<{I5k/ٝ^%\ ^2&92gxD>stream h4; 0 @8Ա xiV:%ՐWy{OOH 0MZHm/M~ \1IKZYR!0iE b^Fanjkᑹ_ }{*TmV/1 endstream endobj 41 0 obj <> endobj 42 0 obj <>stream h[[o ~ϯ g~)>hI$lgߗ4,%iBNJ8ICW?ފ[%ή("ԮTDi #^{緫kJ'?&QTY01:ݿ^)XbձE1JH˜s+8qٯL,Ske8 (~z=Ƿ?VgE"5kj";lLߞku0KP݈O20f#,IF+P4p"vHv ֊kqMIZחv dFoS}XoU}\;51 ,O :ߟߏ5w=F1I$8(S7M:/!H vR \9] Nd8gx#Lz ;+!#gZ+JX5,F遪8UMKS4K L_ZU#Y|Qо^~#}>P 5S^hj;>,JӉ#g3=sBL$Z':@E~u45bm$X|g,mg c)3iM9 QǶoY rFuE܏<lH95y$xKL.r`cW7:,&|UlZH,.;o \5i6a;Sq2xga½%)g}?Bsw ak4̚Yc>QyYB\#{| <=1";NbrPN|Zi]9'\Y\YY`jsWѕ9.ibvplt`ٍnDfΛ#L6E%Jss}hECs mϳ|䉂7*DOG=FFhq@e(,2#QF`a h}ڟW3.̄oLz~Zo4UC0q /wCV_W$*CӇ3ф!d%]O{˜mwB0f襈^QG.CzY<ːaPQB P/'f&R`=aN0 a;vw;{+4w|S`c ۚ KߨFile2e]櫽Gi,.۸hDSfqƋ!'4̀ҲZ@ۙ5Ŋp9^C NXMf994,,F, T7}b2pbOgYV疵跞jńq觑<᧢x:0 C%Ý{/'GPi@}4"Gy@a6?Rl}^mwmN/HcZCW/'cQ\;݂K6BҜwn^' 70L/ Ig7 .^S ѥI:>H\"\x@Ǖq'תS̑^N; ^D}>qDDžFg\`+h\hcsҹ\{6މ.7E[Odl) v'0*ޯi M(c,A4dMT^f]o7=` a&;L5X`.˕m0Z&r91= 3,~\<\#]̛! NLg.ĤWPO z[;;_uDŖY]Qג'rه|(>^XJ'}YR3Q&zalVkRNe#z FiCmEW\SNAMyFUwuF^*lw)3m6$Ac1"NH[F&AL#ӧ.'&QE,hP<_㰚^djgM dF&z 慬LS/,R2o5l ؝/3-xqr*,קAM)#9Д+S~IbMSR}2u+ g/G`p/{%ъYmJگà ǧj[}f/9vH@T? t~y o}qkET ZEN &1dFoX%>\bY endstream endobj 43 0 obj <>stream h4̱ _@Aik]x[ڽٙlP ǺVhӡy{/_́V**4)c5ʖ+ivlllnagr-$edL}K', endstream endobj 44 0 obj <> endobj 45 0 obj <>stream h[I+W X4!q|F2LZ=S\zeA^b۶!cXQo$OՏ-["I ZqWxm߫'1{ .1 O" TZH t9RzM<[ 8"ĘnWc­- )am$ t~0u\,wv}kb3r6Qjﲱҁ_Xղ`1,+pH&BC`SXd\2ȸ4Aw_Bkz9MQMaWpHa,jqP!$bjH5Jc$Y5\Ϛ4DcgN7YRyqOoYk:&#HvHyV[!IX=3,T?]?9|6c*nm$%-9(3K G<۟=DЎʳ|J7> XMtښjhfyR6UY[jla 4v'ݦfK1UlI_梨Efk1\&&3^HS$V9<YYzں -ow4/Gx[1>ݭ9˲`)>jF"fb*UW*R I=BctKj1R\K xm| d#$ tt0s{2H͘|ii7摘(3cv> žg/}L0k~`_z!s{>CVR̳d8@ |^6yfd~ha>$?\geELۏ4LFgIO"[9bni[zsEtJΘnQJ^_s*,FUr4J{?;9sڜ%%^oC6|ْxDU5?\~D-e |>بsG]0A\Ě bm SVD@:@dbs hnldG؃O |L[%I*@C?"-EdRi]rb±A/bJDFuFlZoGzY'}|o{tsK $MpCIy|l}E 5}fz5'NC;|F I{ ӬI_7Z?ZrG\>3#7d̸{5Tõ;`<ъWoKu|`shM#{$~P/2% b+Sxt"cSNjd%&]{ jWyDbR#5 BoO ,vhJ&aAk0֑`( I3P hoVL=(͇o},A*!|$tha4ugv[:l5h;Bu:S;ScLK*}݁à>_nJt}{5s `Q֖Ey zh[b`R endstream endobj 46 0 obj <>stream h,10 E@BYJÊH6lUGjI7:ToAzZT(#6UŊh]/lGa~`Qg6rrjǹG) endstream endobj 47 0 obj <> endobj 48 0 obj <>stream h[[oF~#sݴ]dY ̓lӶZREA6CRdfd yx;߹GOna y"aP\ !1\‹'x^aͯW?ץ\ܗ 0܉'D/JPiE*n ͑ XǠWC01fE[=@+1V%(au[$ \h/]8~>m@sop3'((5_Bz؞Wˎ,h$aY't"$b4wOX[` ئmkKdfa?L""@Q"e !X׻PV5qT&5AD7lsO#i}#Qk.ba 9x+#C*1۔ۑ9p7z\ 3xC, ]%b$tA?]ŒgL< j2t+L@LK S)}@LJ2#?b4 Hɘ"J+ap>=!?'V3? B@+f-VqKq9T@tml Y\qص rfSu]be ѳvxG9sĜ#`}yØ/^0aOsLfb|H*ZxAVQϪrP8y*qD>˭D(#mlD^NHtN&"'YepҰ89θEaq326MCi(hYK++I/@q6AKԓr&C: ]l=0 -jHK0,`oCѓ!S l;_rX%Cma"~-B5Ý:\Rcڷ4D`Ap6F"Tʧsw3 9֓v-׵Z|a׃ŋ=јz\ST\@of{Y<䃞Vy(0RuċmemgYF(s[U7:8؝*ҵ>Vo^Vf^䑢|z%]5 hb[{^0Bj8F/@?ܷƻ]/]ق]eAHNz w E}#x(>|T#L ɉ'N%j.C#6Hi ԮbZ |u*l|wfRL8ۄ:ELy-[3 [lq1`Mflv7[k{rtJd1/pw {6Pkj 9VUZ'[~X Unrm+ lsC@(q2$D=JiB^d3Ę|нI8}Bs5>{ Ò!}6u} b$sSJuQL礁DXF#}yOS`ղdC~yе9gF֓~4B1l\UM%SVsQb*`AL<ݟfśpm*h Orx\)Dp>?$bn>IuaeY2QZjF>^s:jV)Nn<Ъ-$.>D3 }hO&(< ķCYn;l}]b_*h βMj%2Xv.yʄ7#mTirDTFWab+_קMn\fD7I/ :D$-%B3"B߭7E{"xǵ &[g;FcO}SAfE !&lnԬ)v="A%>JJBZ%A 0R endstream endobj 49 0 obj <>stream h4;0D70r-EC1"[pufޮFi x\\ς6;qa5sd<|ʔdʙ )Xg6Ğd۳#nM-WcƏXI|_v. endstream endobj 50 0 obj <> endobj 51 0 obj <>stream hޜZn7}Wɐ\kiIp.D(BÒACrV]H>pg83ɛKFnW' n:f$ohI 2Sh1Pr c{7Jx>\d"3ST($c%Ys#:+9)eVLIՐ~5cZBLK(eee0ukh2 ( .֓l.펳ʄu̶v ek mn-,Q,AzJYIJ'E 鋬E5.cG^?Xw3xL~] i"3/J.$001UIYs"aΡQTckiZ 풞ݘ F ',<  \*a+3Y`}HQs';)JV5? NP`ZJlN1oWr1]\W7h=쎗՚s7/{h|:#sZUwZUG;Hy(ιĞ+x>{$?lweitp*IpaY~M#XVu~4_aѩQ#ɛ$߱Q,%d)d۔?#tSc_<%?=Jaƈ2rFHV6-#u>`0mi;F)5*aC!j(HqED.{ 8Ta|ar!(/l~m OǸ.xJe$d605Ͼ34W' q&zh]';hS %%Pڔ5yyT TsHYJvPb_ @))x*_ qկq S=ވ͊RVrzt)q=tB|P@<BUh_wh χa o\Ѧ${*9 vo!dn..`{XLf+ߑg'ݮ|'JsO%#uwXlQrXqS<W HB|? 6y!<~亸B\/ā匐n6 y/^^ [T)lMS 2*xNeg'&agf|9M4 ;)N!eE\!24‰F%y)`䤝ж5?@D3x@ވ 2ܑ :©~T?h;Ufʵ8N "o<5. O\2 {\ CdKv:v{'TB4 ̽ѸR]7dS@x+a}5/^9-NxSB*W u ?a98jag{OTd)"TGQ{1,"=GqJL+6=^3;͎vVݸS`Ń+}+r]YF8.[sMQ@L`&\Xo/M endstream endobj 52 0 obj <>stream h4; 07q' ib҉H:1[x|77rDȠiDpk}T5ѿ4Z(J.:!ģs2VqeAJub,ebLwحEL i5`& endstream endobj 53 0 obj <> endobj 54 0 obj <>stream h[Yo#7~c G0IEX @0A۶6dţdL4&.V}"odtt{-[ /- ÌxƘ}@ǣ\l 0<'D/ݍҒT M#!87 ͆`bB |7c-/1K`"I<{~-Ol$ ';jnF49>6-$z3V so/6)E)bQlwqB jcQB)*Mjɜ,s[swD4f=V i';J Z{L!,N鑦zQ)-j)5 i-F2av/ e| %0"#]z)C•刧1uDn]b*_z܁5+X6 &ҹ c>}y+K4.` V񺄀SDFXBY=/Y(`J͢d

$.ܗ+HB ɬd4#FYqM+T~gTߤ#xQl :h*h/sNK#T'sQnֻ,R9.'ixfYJ X""X5(?b&_u=V~gr!:sd|l%s]I8 M|AJwUuYhlȂ=]V!K Pa3NE4[;2U(W/D W6 џGsM^qz1c=sN̆~OYZ) 0BnqBcbKB==N_ޖ eK`:+)Dթ&ΩvVof5C/ §-*o_6o/cnIݧ@No6@[qEҲL vذŊ-{okhGY!)~Hu U湠2OGEyUmD|T)4<@Li%0/e%n<̅JkX0@n & ~[=1X=,[UB K֘9"3*s~`Oϯ۸LRo u׳ECqX( UMU"}1Fp|V ٘fl#k eƙ5% pGl a߯vAZVSOpx6*#L#a^{B`![;4X\a<[\ډo}Gl}q \?䘊=o16΅7>$7,MM'{Cp5>o8eDp/!rŽH6nE[ ME'xvHۿ#q7N({$P$ VWɴmO`K6D{Eu+6иE 1-k dW?8_ JFY)+z^;#e.LPn/@k.\3ėN tP,sRtMuS_DE^p'8q-^25' 5J;3|ĉ==31 P{^\rD@ݥaKz+:e@uNj =fU‰s޷Sqcu{nwB9QZ\[Їie#L ?4~S>^S@dijlZW5 ՆGȶTt\c8j_9k)9[ " (`7eaEWukTiɞ*mr&Ű!*MIP5f%yJ&eP jp?Pd}[J mƇl͈Nlܺ֩֬V;?P lDzI?\ń(Vp#)*s>m[{Cz_>r[ 荡I ψ&3 uG(mF)t.{0>qҨXX .I7dpU0bzIUH'$ӑE525$Hz3 'UjW~uS}@hC("Q.5o0>dnߓC); ܥ 20޳1aϕ eÄl5n&Uuh÷2KKDBĮ83?hn_OËlSIcbȷ\+~~9m#!/iPee*P\kn>}J>gAOtU[T>)%j@R49ڔLGjooWmQzY-EYcMW_&M7pϰKU} /#Qos2WJ!aytCG3]uVZW{C2]S~ћ_"•缏;HR Fe_g]u!2x^4blK+M Zީ|嫞^邯;fzV5"cgWE]*?:AWo)Lx?ߟ:EH}}xHoA5WƦ sx?p vRGC(wP묧l_BL C=Y0_ endstream endobj 55 0 obj <>stream h4 @PDH M` e׃=^Kj`#HE~P[.bi S)K\\-s?(;P, `?T̮hڶen3Z|D/>gMo H. endstream endobj 56 0 obj <> endobj 57 0 obj <>stream h[ێ}W ޾_qnX/Xo>P5f24{~ _歛șf HN4?qՊ|ci+.>i-Ƙ_}|88G ÝH`8!z~3AA5GJ Cb^fW!G3W"í aL%xJXݖ {WW`Y]״L٩7vqaղ JhJ\>fǾ,$0X=ܟR(h I^,YA9@v-s33]Rvt׽ (FO5ʀ{*\0y(ՙNmծ\\r0oVWd al |@(9>ߌrjn{N Pl)^cJTH 耏ZuX=[Uzz,n7CLYAZetGWVK]D e(Dz;>ڞ8U{tJ.%+glM.{ ӓlHӚf]$sy1qa O>VL£:0vMd@ZD2Cᲅ6#۟nM"`K@V/=< Onڨ;xYÎBBuJ;%o%x;l= QGe篑>׶E~ wh`K­K wXlipu+͠Jҋd  Ơ5aJ!jv׼Yi.wE ܙʽQW 7/hנhֹ_Ni1r^#vHMuDY6EFᔅBh8tq!L,l(kYҘb)JExO="hv̉|prX2d2F$zd+0E$)ba}@4ڀ+6#2jgԱ1"Zi"xS6Kh>vi/LR)=Yd*nW?8=?DՄ+d)>KK Dcd0EL HçxT^MvbsE_I_B%@i̗=$-SIÉHKHZ1/mQv-&+gHEIo6 }ޯ- Ho6/VM+%]HLN\-sO>rQ=Z!֤2G |L7 t5!zRڔ%|6rZT>F\ZP.Zۘ,!7xv9٧)5)}fN $+N&S(~"-BuGTDMTs;cx#I`l d ߲!0S| StqMf> eqeq~ 7œ!4f(u`Vٱ$13_ROi9/6q%Z=mdewt_ MLv|9* f뉢>m ""5Έ-?L.$w`0s> r[wM)'K>u lriէ8Ek8Y_`MAS vm_kb8nmlŔIxud+sFiY{p\Ȟ ?ms3NGS.r꾝.&§h-ޣDOK9V|jUA-FBd o?$w`z*_ d!&I 'šܧH&!zy啁ʴR!OI妮0 od""WDIrc8.Z*TMQ#kAɦ-":B2JK'p.2i2h?Z)w&wG5aeq0Eޟ㗖]Kƃt@ Fql}7[lCo $I,N劘5 $Q>p @m (MzI?cJ 1m9iVwdtM;{/¥ 73iosNuF 8rvO٫nZ+=f_8i>΋Fmuy[mh2#& >YBF'B P=[tT^I41]KR?%@˥jJm9`ര&BڤjӠ"fÙא]M% v+E.m݌ҙil",Ӽh;o4ZaC0b8@[ b즆65Vyi껇" 7JYpn 8Jo; tv#&MCߞHPׯ_0t&rφxTB5W* 8fR@̈́ d.:SN8z47t4IK)jKRV;*W:h] endstream endobj 58 0 obj <>stream h40 EC Vd: jבv=4O=ҾntgqҜhfd1S9zay =?r-z>\Nz`z. endstream endobj 59 0 obj <> endobj 60 0 obj <>stream hެ[[o~ׯX/}fӴMEb5[ cEmIRÿ=sGYWADFg͹˟ߑ䶺jn.FN0iNHH +v8Wk1ˏLUH`CqBtRJR ihNC"97^ >`ee_ 7,@ ے$5#wY]6?t,fe#.2ª5 J3Ӗ(gqb(wvY'VL+튴#-Fڐ i.WaH~X3@!uQ`| < b}@eHDfQp0&,|eV@Ld d+C/la`)C@LbF8|6j8Ǣ ع{,&:~S"vGmm;<7/ |WCLJĢp ?nUw乚Is ivLr]ܔ"Y^s{1P.*Oo`(X e sA,AyAFRN\'# 0 O H 1nE2'ﮊc{xާ lQΌ5Ss5mWޟu\x1v~`yBqNՏn_V0 ivO.ꊈ XSNG!DC>BcBBhjvt1~Qq>gnj6CyZo *0',lOk " V*E(3(66Uw3DD]ڍ\F |&U߼O!7I JA\+ ձ5‰ ( 3|P{ؿ<}qH:KƟe+pРA[\ˡpdu$/q6'< ͑"Jq(8 /&sg\d/F{<FAu=Uu\+A 8&BƜI `l9æq́{\4r(j9C2$L څ>jh&o͑!4^ 3}.V)'޼/#Mt3} 2"J04ҙ\;%kϵ&y<`1~1vO*z\PPo0i/hߕu]2T1:_~_~MT_ |sA)eLGC#М[zLP{Z\_FR_FM Гgj Sͦ?m$0:O NTJP%C=:B;>s]T^FD}4Ԋzax\p7H~=Kx~^?Iz^cёwV/;`9kj=Z4Lvo Y}Ĭu]vR[b^3O iُLJ Iݨܺa}n) d,jBnף (k$X='!gE0њpzmV/m2Yo #:T4`$N hz\ ޑi*cg|M 2Ů{3SФNIclj#M?O&g?f;nw- A-dATsZ/g~#vm =-L!L|Z %Fw endstream endobj 61 0 obj <>stream h4; D7@QC5Bg,3bp `fdJe]8C~B6dcdqd&lp!FQՙ%Lg&qes?2_܌i){ endstream endobj 62 0 obj <> endobj 63 0 obj <>stream h[Ys~ׯ#2s.[ǵ.I% Ybm`fp @9E`}׍O^v{r:;i6 Nf7'eZ%OgH% Wܟ^BmE2&E3+x clN!)IˤJ0x)Nnl? cIx?2& oS)/D =lݮlͅ, {u)V%QMFaQ|mS jS(rWێO+iCHf \`,hYAB Z0_V-xdz>Hh 0.DHR+QKݑ4!/B3 %L햓XZL5!*ƉˈR2~"4L>-R[d"(H:ef@a6ZgL! /bHHl YJp0tnHBB`:*]緑uCu-.B2H >F"\eП)svY\M,b2WXY\h6J.<(O1"LSWb0򔡌0)#SMU|!IL@ifCoiKj(ib(|X"EՇMqSl[pZ\D:7%=wPZֈW[-GP˓UAo(#5&Jj -/n& c]"6y>L!CwQmXm$;z\a""8>lD -/(QFQ҆v=D PD&ӛ 7en$`b2&2"_-tethWd *#2|rPL(^6 c:j$ՏS$q =H Of'{9y|LH. ~SO躷% :J4q򖓖>w\i#{ poʧb[l/vataZ_[J6&!a5rbS e\xv5اl[댃)p@ؠ~^nlI藍)j2J 15ba2L!rr\1bV'4"P $>dܺmh-dҴR"ELi-a8e?އSkX=]?g4awŗIh4OĕlϻŮ0Հ_@mX..:PyQ \edejja1ffcdqk㏑&'S*߼ ' <2Fz}v)Jƍ!zur252=b̨T~SQh,3S5-Ko: F٨#@g2dWk@r쮙_Zbqt]"o8 n,RHyղ?n~)>F֯$c\=B[&!K[N)徜᷀6T"2RQ< [&Yփ1a+߷l"]W),6h&)0 zK$:t<w`(\L"b{!S$SCF+ϡ5 ᔨ:EZbg>G,iǕN-QvDT}@xs#D7&q_ (kf`*=&߼o&+%簩&ʀTf"y J.+$Mo_qb//9TA1TiTU->3棪6Wy1H "ʗ#n'X/y"<:ʻG;3qiq0jpJ၊ʻZ NzcuM_?E$ 4HwY+Fpx>#0nkH&Sbkf{ӺDm" AG=j&YsR ՆF+I줻t>QfmR( P.A` fZTXoHX[ՒCUueN\uׄ|u*i /fUpaǼ/ Nq 24]+?CawA Ϛ@9F]ٿU~*={Kegja(V4\]p3k읆 Qwš!H;x%n]h󏸠@Ftx5*:=tH±|e=Xꨱ}q0R6-죹r^j GNU<GG|smMT8c~bJU9W/&Rcj] ?eSq ܶ$xujLO#u _;pτ${ـg )A"2vM>?eS`qQ)V! rwQvtdwx'=؇ },DHC*8PdNDճC,Q`;5oW:8܆#| 5@^ 22 n[bXLy=e`q:wu%@Dx/_AoT{pUFJr~m:5 Q:fMw坷 ͔RA=:/k&y3Ո gF: iր ~u[m8o0N@z!of="P~hWgM|ARf6[1%ִ5![۷ŒhD8quqrTSƪ )Xu7sjw>stream h4; 0D77QnM.0F]vYm> endobj 66 0 obj <>stream h[K۸ϯQsGjV<\͛FI#Gw> AA3c{c&u_oOWV,v(qvAUڅ(MWt>[߮n(b}﫿?b{ZANe$cvq>^)J#|a%1vQjÐPBƜ[ʼn~0+B)~,K.a~l+K? :o/l',Rǫô!FA?>jb0U$ iX?^GG4_ s1Emc9<'PCNZnaº(AqVD:ąaW=^\WZ&W1xRRxyAk11Va2@t wCNp!62aTLއ6;֩#.ȉ.ߎ}4]#F/i/cb6PCcPe0v2{i!U04]q9N5/  qvיHL$׎q`M'`!x ] pPxv6 !j t@Ccn6I餩pv%eX.& -a&#d2\2^q u B(&y6m!!B֙dvD5<"1o@H1:dˌ/'|!IFU'怭*@P5-n/6EJ>Kٸsv{ O揵 (,AJ\&8;02#0.A$xA |8F4`*N ?@9L[.w~TQgT`1'_7+T;] <um~- my󡫈XH攙ĉ\Tri8X,M}5i;* K'p/(#{asTF л?ݫpmt?}(bhͩcN51D}8?a8,gGz^K<bzY#cf`@HQ)9!k[\6{#2pa_ƪO+Ķ.ۼ׊hǦhXx3AhAĥՃ F!iB:":-Ň}ie闬rĪB`Qzd0P~ú-+e*+Fa@t\y%uBD|u_s$/u&"oO*gâƛm=if("drN$v(EWƚY yTély|z)~^猘t4O֙3_ca׷/dlԈy֥֕|^ JYVp3'~qߏywu|Ki!+1B?:V/ڮNys%)l1%Ad؛m}vW"hP޾P"No \\ش]mq$*M -7xS /91eNm&a7ذa F>G>s_?pqu }CQkcuj AI(씧CxxȌ!v0]kMI1&ZINƷDmOOzl@$ Zt_ Z{bW](Yґ ._MU OCױc*{悫%[a veSɚë0^xd*/:sDe(6D. \X;-ƣg;{C5Ui1oU [jz=Y##y7V/#ixr/ q>stream h4̱ W RHhp Ct<ņ Rs>=ގ0ʪ5>-lk,2n9&h9Zfu<[ˍDNahZ F)Q endstream endobj 68 0 obj <> endobj 69 0 obj <>stream h޼Z]o6}^ yY~\]ҮX܇Q\XҠߥHٲLƦE#'.Wezu;Y h^(u#Z^]?F8Xy'Hv,r8*;v! ]rEAew'߽6EHs\[X,Gj A;~VtVB#?TGwoC!|j oG2V $`:x2]<:sWvzG_vTGWy}֫e1;L lo)$ʂb$X]9 ]bS˾PvesE|=Ci5ۻ :)QKi9ROQ?@;d5`&ij^X;L͍W;&!Ȥ$!vU]-])r]QXJJl]2h&aWi"@wqWW'ۻNY%a9TmS2rmx^ݏv- RO.껙#miɫ٪gK߂xz{PeY#7Y7;B_ޝ2TexTq֐? g mpswɁ ,wEy;_C<=EC;1 eqեwVJr<+)F hׇ/NǟaY!>oƏGwViE.l=H/p,=UL:x ! Ys*ٞTC yhHc̖4zBl  !{MQmnq !ID|s'X&+]`=]1Μbr}9[0tujHGƻixX'[wgǐێ`tUmΠ80NqUTv7mztIT9g<-Jܦ7G8EKW;j)4\/LqÓ׸l+ u|#}d`|-;f)gXJjR-(//ۡ%<A0Ҡ"M*nB}$kF烯L endstream endobj 70 0 obj <>stream h4; D7@C5Bg,3bp `fdJe]8C~Tdcdqd&lp!J%SKA̒XgϚgVFs /n| l) endstream endobj 71 0 obj <> endobj 72 0 obj <>stream hn=_GpyA:(O>8M vvvP$%e*Eܯ+Yxu[ ጧ3jkrv1fW8 |>B ÕH`CqBݟ *-J t9RzEΓ#BY)A aLb DX.ўEwޞq8Sԝӳ2(sIӮDy_#Jp2B HP2,n)"_zY$|XL Q䬨 h%$Kp N  DGL-EFBV3dl \{\-0mR!`瑮vTUv^$2(8>)Lbu#SnTnE[#|JLc KޗaL Ee'9v!!餸oRTHܶ]b҄j#j}b* b&Kt>zpiPf/\r i"T7hk/V8 Tvl=l2f9WMS#};* Vd98_C|R^gZBGOEF"8lo'EfKcA1pcDۅr\t4;[~f?#L~iyKe,i 8Y<۷'2N9.g! #P5BI VиTHj  W1Vզ %Ç2 f.DA@БG$H[!Dgb=`g:cdVR 806I|oỂO |3wC¡`3_w͗%`& {moI1J9poo=`'q2'AAg6#an1MZj4 AU!)gwޑ Ed"# ܵg'txv NSH Ne̅*:aaR3ocLj#ij@hD^g2h wrwԟPe5Άn@|lqSuC/TB(~2+ KӒ>۳=F.ț;<\5e#EW l%8G.Y .`p… &)H&)?K Ƈv}R'HPprr%,3_0H$RPѼE8 !*<. s R]V]1LZ J2$ DhWz_Y>[ \)nuBf)E:~ ӳ ](AL)z_YN4Em{pY\+[pT6æ\'/V.t. |0B:9{7Jy^jԥؕ^pZ)oϘ/ir%'<+q"tnyxx~{M+cE^̗Օlp, 8^Iۻٴf|ܶk>-7SEy 4֋($^ϯ)&I0zlna|vzv;ҁk\wn1+_Cd&K}d: #/wR 6W&&Fq9{ -8O޴َ"@ʗnW{214d.k.`{יS)t.B\. 0mlI[zxy#(<#3s0=\_u\2.][Q2n|1Sy3gJLg1(xu^칬Ҷ6v/vw*4"&AvepTO_3K t,R{K}Z{CDaҵjp;m%s>1&&3&l+zSlEV9c?&Y,\p<Ώ8Cƥzp:E6\$=Rͤ#Fd΢1bxצߦ<\vj0by\lG#. E&Lr}t!H'*/gGVbQ;B|& u0M:0rv6@DvQAz" ,N#Pj]JDqfm"Yݴ4s%)+oj0wRTЙt*wTa]I7=1Nm& ؿA;s6b}J km%߭oᆰ#xwyS8Ojnsx5cLB Ue96E+3]o[gFweSyDeEy1P֕ :zS,+]}ΘV߀嫰^(*Dڮ*wvےϳZ`hP-PThP.Օ1$тxOp:^@vw;'xl}J4vw^}}iSa:oo6腂IRt!H檚Կsh5G=aaAmrY~?'GtAW(RKOq:WI=m3[I|a%ŵq٭nk뮔3ޥW^̙q .fڭo~9_Fn疍eӲY$9HkfQ>:kRe}ju5 |XۘpJ]B0%GL󈦶{ó_^w+p"9m8^@zx~~m69Cc9)V!hom'i]kxA5؊$J̙[`72̅-ݻ8Ey LN8g"!43g8SBc>l.^ )ebP>ϼT5u;&]jp,q׿8CzW'&6g$YcK̡{kk^ %NQW|xB{K~: b{\Z5Wts>~i~YaxXľS z endstream endobj 73 0 obj <>stream h41 "FElQRy~۝8p&,GOT91Dܰۊ/_aJ`TV$+bx!;_nj̞|_r,9 endstream endobj 74 0 obj <> endobj 75 0 obj <>stream hޜWn1}߯K"5n B(4 4!jQTߙMmwӛ79sf+Nf,NRN3a4ՆǢ`d-^3WqQޭ vRʹ*YOCZ)jjr;- {O+ We @ =:0 =LVDgKAPc}n#C`3~+?Z񝐐b/d&z ˄GH:<)[<=/VebI2ǩ)],1EyF9(38cn =t@1;J@.@yCr !BȱcWZb4Z 0@ cMcªݶ@-eq- |9%ɟn#xsnΔ<,_PT=ѫh^rO{cv|,rhx6#d|͗prUx"oCT`%vY%{MK%RT-O|rYޞ ɀ]h>V98J:q$A!JciqgK~6t#lϫ\~xJ`g4۝p~1K9bv H 5ۧ~?;nc26ie[ُeYDN.t_eĄYُlNm4.Yeu08Wc̓e;hQ75yuԁV'9d-AYTeޟb} Op0 U2?{Zl(,yU endstream endobj 76 0 obj <>stream h4; D A%Bg,3bt `fdjHEH=H…B3C L,C7m..7VF#'NP7L4Vc>& endstream endobj 77 0 obj <> endobj 78 0 obj <>stream h޼n=_GypwCE}Aؽ`7M"EڙS>: Z|z,e 7$K3gp![E52O%_d˔eL›Erx`kTⅤ DR8 :#4EH`8UT?Y%b HhVH! }"cOGjJtxSsJ ~MJ<9?uR":R9Y#]q"HRD8A@59+!(E$Mb=iBzꑉD BiU#$8h*pIɝ

Y3|֍-71Jo5\z~\梌4Gү/_PrxWپc]>ƵTy)f{Cglk$3"42lE`EhOӞ%xڊށ^m1Ư^XlRf^= 5h[ZU{{dxZt(^PM g d]ZnڔY1uHG&4Tp{KB\;¤iՍF5ZBLtL6zyJ/l%fi~up*ȁJMz-{C4D!BCK(t 2A5*Vjhګ'ChњjF :B5qး `_i*Ur:VX.X"ǟ6Z6=ndfC.1/3 S)_aBC4AH5ڰZh W+H0"^Bb 肍ynTr Tϑ,O@*pePׅ)%8vU'GyB ɇ2f!}0!/I3T`iМ_S&SN7;MD$dڊG$ rm4PHi{]^G9o6y{~jVfTΙ7i ,e@l5#:-g6KV$ 0{Dx5Ӳ3Ddͅ6[88[x:yJu-vM'.IgJAn/h4Iz}#w!gSܜ)z\esED t !C\Iij/sͮK뉯Gz]R6핮.{waaA@s6κƒ9?c$.!vŦVD2JȽ=Ʒ:jw0@sqf"Pf[|/DPH;x_ޜ(a I&xL5n_<*ay[C5QTi–ɋieÍoo "y]U a 2Y{mhwYUUV#J#* 4NmLw#vC+F="[d<xn(st.JWhCa EQpE_eY!Ѻ2H^$lҖɿFM(<ƴrv=2Y99wcmU#lone̮*iz` Ûrs޾x7 =ր@w$*lRr.Η+T-/߳Ldsyy*,$`U,` &,"?ܳ2py@i#iS-4)cvnP;M2V*UI09`+s ƊQCF`fPvwuY W!-Uejw& R+"w T syWSFy&ٖߖGaBݤ/lX $) rE02e/p$CԚEgp-āx >5eQP ׻E,Vx8,9H6Q`S _wӹS FveGTD)6DǨG)bF{v/ѨfCPtBQJ%B h ZR0-$1( 1g*} 8޲w_Q(]K:u*HWS(Ol}[m?\CU[֋cNæ_ae{, )"Voj{[dRtZ<$$Sf uS=Cԑ 9}f~Wv+W|d X;/r8\ouﳫC= `o PAk*n{no)gހN;hPM?=p6_49rJd*uv3[DAe[}LmMVFzc`}@ |yS}ₐ:3u8x0=ߦv9 Q֟ŷ30U0:=]| d~|+5O<)֥WgD82lDp(JKVOt{ZBf'}جَ87-L%fhf!{zxW W,#` ;Kp(y M5Wzt02T/NR?ܦ c$Xf2 'K<_Abmo? +$yj_>ˠt222j̷|?~[]m.1SNoxA{{)}ٔ#^c!sEEg{YַF[^\m秇 0C endstream endobj 79 0 obj <>stream h4;0D70rCp[pufޮF ˷˂6+1ݸDܰ%J2\2%فr5H  g+{۽'nSY-,R_w. endstream endobj 80 0 obj <> endobj 81 0 obj <>stream h[KsW8`y$hb|N <:h$\>FjZ 3 ?!L{:!9jאҮZxP-U^긺5ҩҼ֔31Eyr[c4gN: B5i dҎz*7*7&c{sjϔ ,AeҶ-tnȁA .!m e1Cאu^ą5 Q}onVdjPV#S(8Q > ~lC=AMCGi-7@g4@ ȏgltn:R%eeL(3r^eDiѠ_MQk*]S]k3є"Nw\5i,>]n9QrLm%vm?ڠlc*LUtj6ZJ1cD+X";sYyk} @\jOJ!6]9 ݂.G(  zP7y|aCw{o2KlH,+,Z1,1@B0.+S'[\zVp=;erx(=/%\ d]Nm#K灜fL cF-< L W ʑۧ"9"-(aB_8%zM$wCf$< KD%"L*?[_%%j|:`#fLqN0OHRY:|1I')Cz >%a$~@o!].s(o@e9cDK:PN Sd 2H+WI D8yOORfK&!|檋og'˾E/3AjZGj68>G3hazԣ_t'Aμ2 sAP1։t(Nڼ0y|[#QҮ+9fL`Ἐ1 aS%nHQܛ-g>e󰘓eSm^?5q=ʁRz@ l?O1Y/,ŢjAڧ@bA:ڜ V:` Ͷv]\KSm"ʁۧ_3"_8֟EA^1^bDpNp _xw)oRfN8W(&4Oy,3נvl#^g,l/)YU(,vjƫNf2$3gܙIGE sw~[:n`ŚpGƆ%fBa|[rbjVpz`/m=A(憷Ǭ-M.ՑvԻk:o;Ht-#AV8u;u y.]:Va9ƆZw?[o]Ȫ~7˜s^tEk7&+2r ן.Uwnн WL^b`h>|pwV4;]B݇u## \4roZЗeLo1u@Rюþäf+`<nNտ 8LOT00C~zͅ6NHyO=_P/!U!j3`ʸso=j(Jb ECA_cѓkgw_!Qo8ƾF:qAtVfU`N#\#y!g8CquRwX,xؖc0l'$(=9 ?tnAC=1R_1׌pPAKⅇڍP~x㛞;kcS8 ? yPկSd'>y" |,O Y^D6t,>stream h4; 0 USkMDBݾ)$Bm+:Vh-@bLE2xi-u\%[%׀LnbO*~ڴ& endstream endobj 83 0 obj <> endobj 84 0 obj <>stream hޜZ]o6}l#f)QZ`m-C!R؁l]W,I<#E~l=x9qe E5ۄs+.=iwbfiIJxղAPK>7Fz! WOY9ur] JeQ}^&ûY`֠3d8p@F&PcቤFu~_/nn| i4ːvoa@5w TV8Q pP7򸨔=e1 nP OC}lެ.7f}uLy6#d BSUVÕvq-U'-UX{\XZ Èfđ5ja? M+ SQM/Xדw1/1{|;>ZQ?Pn{0\p'䑓zO'onWc87k+-@\sA`'ž"|W"{6 Z žBwED<)]o7p<0 0I%_qz5&7+ -Yo.PŠJɋWŦ99>"k|6:#CY8,+Q<+?'o?U[-ܷ07s<=PYZPYi"¾a lP(A Sj=x F*c_!y@2,"% D'$M> Ht!_~s_/x>q'~8ysC(UR@)Us93_.dkE_7uE~C<7Dն敢+k0Ng{=x 14C[u qTpg|Q y*xd HjhdS#|T LRtJKpn {l+יEC!4lp=˺pwMAXѣC'-9-Zx<3%]R:r~Xo.Z|jϕ #*Ry#˛V ii ]T-KߗK!iFXA:!1YD#,+}ѣ<<a TݏßWu_ Z4<3dQ&z`Y2Oí5 =6OsUz7Pp8qsCOS4LP 6>l&44+@qÑaA<7,Pӓj2\$i=zGN}n6_L/f<'~ / 4)egf^lE׼K0@^_' (™%XaA{b/P(M\+b $UCͩHjo??Ź٣ipnjqOQMr\(Uz""Bhi~V@G+YNBĥ"+U2khSUʞNz*E<7y'iAh•[P(e: fRnZĥ")CSJsQRm DQ +:Q7ej3!_GcgnG^Ԅ+H6izi3vxiv=1MtUU;UsUq,hfBwM>t\~3D%Khܩ)Q z endstream endobj 85 0 obj <>stream h4; 7@C5Bg,3bp `7og3P@۲.!{?|O B*21lxqc2dt6cJJ j2Kb5ϬMqes?2_܌i)~ endstream endobj 86 0 obj <> endobj 87 0 obj <>stream hnБF5/a`  Ω,SݚbHr&y*"md%z~?Ow?>>Y vűЊ n}zdžTz\iY&ޡ}[ȃw'كzi"Ss&xKw€Q/4JfX[Wt@eXrs,ԗ,rzq7|9SIA7PA&b0q\Z.%RU :؂Yг9OqlPF/͗u CX8:ϻs^ s oܵ'`$u"6~uv o tFVS51yflUp:yJd.IMA:7.u&6\ܥђX[>; ) CgFvzU*Rne}%tڬyɄhD#3: ΗkHuK9:?488sZ? Z!п.˕+ !!,,yKa7ŹpF/_NbBLGĊȋy$oot)|e՛YWcG# =QBY#eq]5qrő%"@Qj=psTOgfk'>]> XQ)) Y}ENza>^6z|(bEBLt-:lY_^tZ#5d~te A "xY`Hc9 PI \. t# Ypu J@@; A;<׍WP h5 J±' \ a+p_ýo[gl(e݋7v's{ؤ) Ϯ[5[u7pp<8E l\UlÅyM2ђcOo^`w+:(Qr~9]N'F 3UѶ@@wT|;ģ=ˬ#*#[MΛ 3=gA8377DchZ6 -}05H㗴~^o=՘:WYvw ouTeOSt*ޙ린X(!tOQ HK}7}Vپ4Μ@`(G̅_v qva}r< 7ҞA-l{[ͽXG@Nk/'ClBCG +t%q}ė_ [0 4i\^bHs.6b<=V쳹#`'R(; {?9jP1i]Ϝa1G"|pj~Kޠ?N73H{TsN ʔ[w`(xCrA9-_[%M4)Sowz{cpk8.gg&Ys> j]Q]m0=Mw A0d.MAIO^*\7S>HiƔr9S%fVdÇ#f8raF!!sjH1-Ԉi[N+ A $y&vi]o[pZȔ{S|Ju&.MM'Ydty6dٽ!0,ohiPwX. 5 &}soelDToR .JX?z{̄wl̺uw9*ftCoro_s16dUѠi\6K]xĮh;-ZTKRs8/\wxNhgCd)0fJJٞz,^ǁ碅H湾 9?Dܞ!Hn*Ce_aIx]BN|+ag=Uյ^*.-lG搵;V|@P_s> j-CRbXloՓ`@b@1q` >B,Uכ&$@TpݕX胐}_XgAB("uւ" U_prsiHVW" -l-L c&jdwIt] Ӄ hؚ$ޛ:_u>сKD?2{k|&3$),'Ј( uh;JM0؆8/!3SW2u몚Ӕa ~(qa8TҶ>stream h,10 E@BY dEMB٪Gb Lz_¹mZ @;2JYxQ7X*Ŋ0]/̣0?ZgF9]>jWSs) endstream endobj 89 0 obj <> endobj 90 0 obj <>stream h[YF~_G :}€3Ël`gyh8e5@JqMJ$-M_?ŧۛon؂,nFF/0ߴ@X/HH w<]'nW77?]\Wrax ,4|(N^TݕҊT M#!(VC01fE[=@+1V%(au[I.-}b-{, I'i r } S8 qyHa_k؋gH1fsMhk4%ޕgq/fWXV~_cԗ0^2J\yp2` EJy*V'2Ƙa5HXL6R0EMfA.5Aڅ0 cc_.Qti;bdﮯc}Uf>0ҁIF;D'r]|U_$GF`=C$UT}D #dYlz Đ9iw ,&*e_CAq$d4gd4D%#AJ.p, ]:YHC\х{H@Ai3acy()5h3(X h{}ѐvJ5T sy[HkIXxfa~dX)A.$cir<W;ug &; ڲF9 `;1zH8q|7xh>jTB톛]c k0-|;OW02ȬA>QSK*H5ctk,^[}_߹HŃܢ*0[$oB5'lIapHt f=~J;X}\2.P\F,F)ر9jJD#n9c:ȝ)dd=2{=<مdh*Jikm,B5HެES]3$5Ua!jna7δ~MYmH6 6qJنKV55'dLC]v"2Kq(3L˄YLZ?J*tP5 GmCG8ksI]9%(xBKցl^{i[8i cdkin Λ7tnp*ڌ gz/c%Qs6R~;a"nHij 9rݔɗ+ s{\DRJRWzݗnܲXnֱu؜ѮT)E/$.ؼ">Y(cr޶urͬ#~stƛ uK r&MxڹK"^2nSó> |c |2/sζ'pڠͶ{ "tsD*ݦ_W훑Tsd~\AAC.wiN=dD㾯8҂rL4\Z(-RRTH&>Ԟlr366lWG0x(,+;LNRuY;0:/?QpP"*,rUB,͔ ixFȩkc96q }pUQs0N3CjSp ->*oЀ5Rfy$ΉDUWx<`E{Q|9G\='hs8&.l|x1zNLa#Iy꣢]f2/p(V?!%, 5X".K>,`wִ5 R؊;Hm=z blJz|i*xb(Zu2gO6v۲ENE< mkLỹGS\VO*Qi8 sf*mNg*Z4,JiLb"-櫯Ҧs >ZB1} W+=DK ܗIBM]"%@Zѝp? >i endstream endobj 91 0 obj <>stream h40 E'n"UYvH6PUAC?G{|k[aյ둿7!8> endobj 93 0 obj <>stream h޼[[s۸~@ߨŝfN8;Yד(Oq&ȴŽ,y(If7= @"`:u.|ȃ;_!h;y8y` VJ+p Vo4}>cp9Iܡax2X($v͉ҰLEljBɝ! %ƚ9@c,36]xtdwpǻrSfD-4WTbJhqպWk+y%Ëawpom3eYxRKEs%XgsXP†PJ.Za@1VcI$q:5Hͣb] V%@+Dj:̸K.Š8n{&kqH$ʈU8.GSpӢT۟ORt}1ܪ$f-=pt+'=c=[T; fm tg ѯMo rJ`#B В<,RZGgcߜ!1+Z\\->\_>^} 2GSC)Jh|x#9 \rrZ>/ 8lQJڀ u>wz[yHM=L}^i?neۚ>1@OX<O[s2}09}*t*nrM"+ ؞gw)4:r7QLemv\G(W$f/9؊nGEI&DlEѧژbDb&jStRA:TX[1 q}IG :)}G \O ;h-'Z5}b1 «G=53t+(.wC,y*4C2A j#:^GSQ8a>98Ö]nvYQB\eN óWgOV,y$ahyu?>/"_^~=pZ}*vh5ncъE-yBeΛF{ѧjGX5䶌r;D)t.Hu>'rܽ^T'σN =X:8p7mV䛕vK{((^&jĜqwQKWN ?HG PIFc|j_auS=NC{v+MhѧJBXKHMmpk!9THuÌOT XT4P*šZ 5JqfǙO3eXKw2CۡU~E^:=6wXɼu%ఐ5?9rlxS T{b- hzn0ZQOlz:wH܉w4QI#HBlc=0džќƌHdgO;&;:')NŽ/l: D=U7#-sf#}v-DeBx_F5D8{ۅnߴ< ~KQ'u?q52-],H{CV,gd@D%cǔ lO)ݴĹ:j*&?ĎE o#uGϺB+|ņM2^$'|pK |\M>>)*B ZL ՛|4u޶\ ]XT" gstYxP>>J5fNר騆|9j@Cܝg6hKHFi`Ջw]$4pa'!涅6-Ӹ!նzH~8_.a*$IVEҞO2)o@ػ˵%?r ,%Ouvv|,oetʐ&]WuL 麑,3@8*v] ׎4Aeύt|(ȴP;leLm~>ݽ|HfO^մ.ʬJ @ t+\TX*U-l^۪TԸb B3acLNl9]PҎ-(!X,ߜ崿o_B3x endstream endobj 94 0 obj <>stream h4; D7@C5Bg,3bp `fdJ@m˺ph)<5,ưLٌB*JQ5%L5Ϭ&qes?2_܌k) endstream endobj 95 0 obj <> endobj 96 0 obj <>stream h[[o~_n)۠Ay쨕%Aw=ͅ޴b[9<$3/~`d ? <%Ƙ]]Hysq7B ѳj{!"7HәHaHmPw!G3S"í˜pK-< 8zb~O˻hn .VTN!QB)* Mjܘ|!{,U*ĩ,[.Rl8n<6bgS{UGN0G(jXܔz#Qyl#$O˯続i§^zoE9G؀znD_XM2m.>2VJ"J8}-Ih9/4*N!XM~w4"1.i ̊TJMF@j9_(tݝ251j5?ebSfڴ6֠U#(Mޥ$KSd/t$m%nSCfgYxϢXf8Lu%z.(R ]w$3x<#J|-v;M`S.7W9)y#o]{~03/.Mlċyv]*XO6A$%A7Bvǽ].ұZb5#SD/ .Pf=-t<ņV8GY<(,mL,nҮ(nr=a9ͳӓwwbڦ&8y~Iw1̨RQޮ7H)D˹ G%I8 J:s @aǓHW^~>Qi |h5ny´8XxgHD-`@fQ pa0"xa( @p{Zpc YxwNHfÛ.tSBǧJĭR#jW&Z.gtʨ.jJĚ9Qy$c)& f[!CC -iavuZ9m Q:mi}giYWtK3j4W-)/|uQWl`fBkD Eg#B#Mҙ{K3ns 9&%wE^VyPL`(\>&T|/ 6u77}[oV=V΍@3. kũ'4 Z:e+}u ,wZ"ִ #t]ڹ[}]0nA~cul%Fsc C\5-xeszf"s-s֙ >>*R%rv9A-Y^Id./b'oehKOXIdXzPۑc0j_+VOW#$6DqD`dJck>1eCDB%Oo>c<QG<>k i/uKhB2`8{Бi.@ YD{;ϔp;==*sGk;MQ> Hw,:Fi~ gQ1õ4ac\<hp*9]>EPX94iu:r[ }\Q1V}s_L`/bXw_T#xM1y _,ݗ7ndjDy@`lA8%=%FR!dg9mOlT`(q+qn2+SB!nM98j=zy04 ^#y _#GMmІSGqB"9$O}d)G Toxx9.b=\bHBXq8?)Ȥݸ<@Ĺbhtw;iS^?ݏFrig vcL=@S=v~:" !Zpz `c{|YݽūN\_ur,lߝ3^_fA6=/Oz9lg/ %V#&Uy۞N߾xULu&o?b궑W0_d޳*3BWy+ TǬAX9Օc|YKtFTWRFꞬf4smM%"ŶN 3ͦPLY|B[\j^-w;MQ|XX뵨~ܗSkt<ソW(XVdcCLP%ղlwXbT :"zj(V}͋r(|sb=$gon/+ ПeH`>mnu@r״TXZ|S'3 c[j.q,+c@Y7<ϢjU>bʊ,srCΡ*$KU}rtH8N'Oxl>-WN1'2S$9qg+aːO\>AXH=z*z[9/^ۇMy.rłhbYS69Yz̖C+3|$JvbPUa)fݼʼ‰?f s`yg?_nu763z0؁D/d"BWT,]nnnytA/aH o:e?W46cg:sYH L۵h[ e:юE6=W0W9bb0<7ށom$WL;.F|04ƠW)跴[5EerC#2;R>|"b F X3! KP<1R֯12[1iV7m \qncNކukeKfrxe)5#Y|ҫ-R9AޔPJp}̡rށ,:tQj}kP?ԳbNy]:m1=ɤe]LSO]P=YzXVqu2h gyBTlTZ*ѻM#O#pegÕ;Zh&y@(WE+~6T|-1iÐܞj~3ɅqӰҫR60匨I" $jjUz OHUᑚ /Ўu[[$hźcyS'{(nH">j{xAmYz_&4gK[+t{j|?J`~ uOwJjD^+y/yf@:Kz aXsT6G߬WRΗ7_mkw:NrfرH^ U=؅RiN1>EFioN]=Fο*yDj<KUݓ1'׃LimjzuL>> ˘v pٗ  |th Vy<AF꡴πܟIK8mu@kg6#<^ܑ.yC'lun͕k\Ni*c x75Y516c&ug 6^cfq Em~V0. ۀLGWKkW6 sR[ (kdIpg=A=49c=tϱjSϰ 7>vߗ^^ixq 4\Y{3R K m> endstream endobj 97 0 obj <>stream h40 E'i"UYvH6PU~>s|փqG׭4:08'\%sRLTYI޶jEX`Xɢi&ps:[Йp@7<1R-GRXnW?56 endstream endobj 98 0 obj <> endobj 99 0 obj <>stream hޤYn6}W苴ev7-R,qpq؁dS/uM$5Z9s̐CtE8a>{?sDnF 6DTH,3o/_fBs0'0K"5ÄPaD\bK8 ?lWr(0c" ai1R;::Y><Ɖ4 Gu|3j^)s^tO0xMsHjbHBCkqQFة.* qJ#{`BXhԀg&ېT3,* PNBl!Uj hԥzܢ)V-:^nyvucVe]oPۡR I>R" '!F%TƷ̵] qW>stream hj`@@ endstream endobj 101 0 obj <>stream hX}pTu?] $T1oYK!>|cHZ.î+FHJV (v+Qjm8#!5.3vnSeVƙu}o$N't;=o!FD)CP,;O$bYDʚ]{^xI;wm[2`ZroxE _'r --{)O |M^ j?BX; 5E4Zj}eRܲ/p`'/,:jѣ21,~F_aGZa V`.1eq2 }Czg7P,L~Ş1V!X+kgq(rs/Gv~&I eʘZǩ@"۟RfnMggVgP(| zoJ!9U@٭|2nӞUVHdP݊c3j=ϒ!`-1zN9 K`u l5 Bl?{;Coav ѵ-ޮ qKk$Sj:) Z>&?-#0ŴV*SRV{!}Cۭ=}C{R{YDWj/:ySڵ!Yz2F}@&Y*Y ,NvtGϰg v)%ppto[9a~U"eJ͒_lJKi*&%y\;IS+k -J_U‰P&TkU2yZzTVViZRj Z֭Ƶӎ #,STB?}e~ZL Ii2ijSVG;O:mVQJ>S>4׺)$MHǕ;7ҍu{ +=۱9H'h|k0wܖJd!oVu$JJqVx*r@MfVy:XU^_3IZO߬TL)J,,0YE$OBšT+L͚ƈv*IƐ75≄ R8(=}㹅#٭Q1hkN TVlCV|7ܘ!!<90`I ܨ3D[VHrQ6톣1LӒ'Z0i^sL~#5q]`,Jl;\3jf{ 3TRT>K…<58"dy%MOaEcXP"}%/c$gٖpҢ_%2}M\D[ʬ‚nӑnuX2b,-vwG=ؠF{& )O6L8%"ms[֘, Qۏo J^>NC b"Q1Dxdc{Cuuhɋ.laXTs漊A[.)XH:?S&pgU63zS]ji.RO 4(Q4 jhБN)>GiCTʆہ F&ǐanoAaaT?jC{Ԇ!Sqհ9^v+l4\&1fNسu,kq ukȧ?πo` f?o7ӰKe\XjG728({Gm8YčόaIeikvc?7}~KNSy28X]>zƴfc = PMMFR =dfjc8St"vڦl:i gwmzڦ6TmFmTf:Vۤ$$|xxx>0NOO}A izЦS6=kq)*m`m6IID>m-` x?1/@zi#˱ujǴ#Zߪ7kQ.-"oozg\=Uw꺮uQsTYy 7 ܼT<̬*[o#lr?/爱G R?Fu{/B4\ k _ф~/5uЗE}?t*Ve0Oq,I([:/~b7/ss*PA%\s{^ҕuHaRw%ۤФǗ7wIR&sD''hp--Ysg{$:)cw M Nh:g${$c13ϩ㒪r|Wk&2VRr(W;R.Q.F.CM*ƤC$"iRgd&uNs.Q K2 I]aRtXZRkw7wx+Vdlhm5vtu[xw4RTQ[k: Dwi4h?i]ήh<1HtO8hϮ׈HclkupWEݚ޶x,YdI2%6ao(N 4c %@ZFQpݸFYݬ&? # $wZw{+~WtqoG5j= -Vb Sx,߀.V.+nڧloUƠmŬ ֨Ӛ d3:h^xEE1+Z#4OX:0(T}+vtq=>u?*E z{Z'`rR endstream endobj 102 0 obj <>stream hTPj0 +t\nAȥ mevwm%34QCvt =$OsM.<7 FYOl.;C֙vK6 LjCM3 3>stream hޔSێ0?&mn*R,T%.G 1f#}@33AG \8)r|EOOx#Kg7rozhMfPȰ1ZzC_@!6 ` x}*i>@ӬY" %^5 ox"C#JRATE,W^d^( '\īfyUPh/~{|+GCbŚEKtKU񲇎..LJWu^ dQ'ZTߑþ2Jq5'UhOBdM&ջtWIM']118E0XvPaR<ǻ/7_K2@0'O Wu *f(t7PZZuE9NMS7x"8|<;?q"k2pMY߾e->  l endstream endobj 104 0 obj <> endobj 105 0 obj <>stream hZێ}_I&xFԶہ/ Ko$HHɖܛ,MTU<'D/NPiE*n ͑ X'VC01fE[=@;1V- 8 `/1.1Sڟw6B2Bz:"T6l|KSh"P횄x(MLF)0rғ?)xH;fVIsكiFX CP19 H)<09'TAZ灺IEɵW d٦KH2E0 ɏ[H7Ad+o]w$ &SI'pYAN%R{ 1'ȱ ‚У߿.עUsG5_GAI2C΃LB+w@#b>XRrTR @FD΍Ȫ"$ϑ*!⪟6_eRq^i6{(dJP:-MmucN1US 9:"st2uꇦ0Bcx]zj7}v%^ 㪪Z(f j!$BNԥ nMwW2H0 ,?qe+q.Ρ7.E#/]?Ǎ\X.aέ=ᑹRrO]KM7h> еỂO#| 1~2a/ݽ7+Y"%bŏKj?ͽS;+` 2vI~%ʆx LѺcc3?}!<[d7nvZ@o(z \ Ncj!61~<Ԏ*ce#kfܱ,%,b/(wUKxYx2nH ᴷsൗȗ.{#\P~>X$byW&&9v}$9D D/ m tr~s u *|ij#I>C5o?~ L!%a\qB_1);-;%2@xŦ%vݙwSSIHpR>٦V!*QŢq{!/A:2ڥ =#u4uEG3!&hFVѾ}q&٧0OC}o༹a4lT76d0\8p FcT&I {&/֧- [ [iKf#m֜KrizYIO?_+}H7D~~6ITzsU+c*G\f΅꫍VRb{!\%;lv)j(3)'KK1ЏS=.)A4mY*{u'>,,t|8~*OUmAoiuNO$ϭza؀dSZZط "]ڞ*%0sU:<Xr$]tHw?}~:HtTMjN鯂6d?G2B]!ȣk?:( sL8jpuTGb6gϘ  ܟ2oN:n {Z9<T'_ןv:96a&An}ʳҞ֐I.\(),8ѝ<<=Xu\HhT9^mӶp+lOw۳/'Uu|"nus6Q>SG tvѹф9a 8d1`12̣I#SsKamwzI+'d}@EwdfJ[Y Pk<4YW92P%<مLJͥ=w>7uU~Zm Q+_B\r+ø^2 kKju`:[;Ikj`M endstream endobj 106 0 obj <>stream h4 D?@å^M` ?Cޛ&y+rcs84%FYB[3/!LIuwUIJo9֬j<z=fz>˔/z`w1 endstream endobj 107 0 obj <> endobj 108 0 obj <>stream hެZmo_ k}mz$MXA?ąi[,\/ȯξP|]$ >̳;Cr_lb6c݄dh?8HqIla}%2ߓKf'b0`$8!뉠ҺT`MXiDhO C0 1)A`,#bIL6ep0tv1b]q;{Lc4SAiG|N.?>SeJ=O5x`ObrG9*:SUk$fJtixSaaQ,{$lRHDާr }<٬`&o+\*6w К5$؟64ɿ,7ϻvr#z1 :s&84Dw9_)| ެ2XR$ W"*֠4u+,ΩտCeEg<7~o>d>/fكa]3Ww(Tsm'\ ~v(v&(f#mKs +maAHl5_t Q?I`T~/_Żˏgh91Vh<O6ޓcK(qt!%G>]}k=Cqg 6yXv1]K&=IOH;d=t=n6N;z 0KtEN0$W1o[n8of ;l)iy."CZz[֌7:70xEJE= Kt*@,uݷF^ub?\ mޮO޽ X^JT"Ў;V;M\ u$o!RmY֘$Gfa6v#$݅Mϙяt$#Lc^s> 6KMhAV~jYw4K OfۿNn*}d1Ba1,u2ò{p9`#G$ps^8toH=H] ntS]f?Kq y]{QֺiX^$:{C)P/JgoЇVM ⌃}$enD9T/v~: 2'͖2шWZs{\fȣ]>m v?zwuҎj9L m Ȇ 3(jKOO562}rqcG,s|5fS˴w7 9X(U1Z?<".Wc#ofk 8,},kIaEgBJ%]ÈЛG9 3cdhe稃V9>2yLsL=aZn1^- XP 2@`Nb~D X cKېTBy}C0izA!уp0(ajLgcYB|>{p4:izqXBQz\u]B,E?̂}$3j ZY{uX/;q3edXWLjwG}ik\[T;R >x W޴ʋcf-P}Ƙ9\F.x[ orK؛|P W<GH24i/ò8Rǒ19(U.9*d;PCPH!BpdS!Kο6äRÔ<^ɇЬ~6)/4ɷ}! !*oJN\$zc$3 W"G%Z>stream h4; D Pk c܂$н7FpRo{^.%h6a1pB2lf2DJd,3M[gF"58:ԺֿH& endstream endobj 110 0 obj <> endobj 111 0 obj <>stream h[KHrׯБ2Z;sîw k=5|PI**I|L>F J*" ZOx~ ٿ$ Sz(ȗ~PcWzI%(BrUO sMRPK4rHVձA`) j>(ռdD K' zV EQ}{N=[wc!acܼ|s^o;-R'c9rB i$Bv#$8@` Zkni+ -- @} ؀(K.NQ7B)Y@)Z$| *J{lcR`.l>+~4ͱͳ3O""[uݾ<_[ 5,]c gii6hc-|ٽs!M Bhpx,k'/CP$budm)J@|VT"7=(Lˆks3p6, mN5Q$ }~áS{]@1)ɣ@=釚NCgsAr,oͦR% Z:٥o+;p;Z>E+jx_U$3)BqhNStb,oe58#jM^ h74"Xw>%::Z:t'kIf޷, н+G\GS>+]ʷ *tfI-<\{iK}O을];^I' %\ҋgJr172uż}?u'muC |aUq Pç;eθq/#._C6U}+/uR9/!G4a_ t1=L2 tΓE&ns;CemΗ5B>  ;'͙o03A n|*GAOf\](8K(U9XeXp8/貟[֏cgC@>rXiBɩPP_2ef9\fYّx_w&m5NJ:Sx"PB/^njkـ#nL /TS/j&皸*edn/_U&6v64 ?ʽ9]+}ύ_kgQ3 v++"J=qè |/5KPZUFDܲ3f9̃@>h"_}V?OXZHc} T sjmV5nP G CeҖ)MɯT|1 "iԘl *@gK6(N.p Dۣ| {[]RS|Dm©M6)v>-o m113E2ܵ;ȑO v%4gZdh-[D"F:-&v$׬wsf6dGwf+6bgZr<+1#<|o`kq58x ~B+sq [~Y9Z QKlGJ} aA]7ع; `װ0 ? 4:ns vHyra=Qis)և c{X\n},HQyAH?T&/M0-EVi΅kǚM+6ND7![ tQބr_L˜=8}],?Js"@řp@wc`\3#:#:$aqE R f}$uȣՖi9R6"8Bb+ԦBƺ.HIxFO_ă6 D򎫺]ɞp:n1E!-z;402 E=t*$y<=rUkdtO9tƜYW?.N"U;{.iaӒ[x˻Wݍni}?<_agN`^ABP?CKm{MJwol~V3%(8 zMhULnXz[Sp6PD7\ w]w743+رCA3y ڽ')ϠUzAD󷤧z;kjd|8Va fE:l59SҸFg\(u,1d׏ލ MSH._uB5Qlاia/aN [%m"<~/Am 9.SR(&.IˆҔ~q姤;c> "5Ѭ8,=P==Wk96hN7sZvADIO 0l#[ endstream endobj 112 0 obj <>stream h4;0D70l IbDufޮ7:G(rcs  J;2tqj(x6s!)zk[`9(Pf`Ğd۳#nMgcƷXHOz. endstream endobj 113 0 obj <> endobj 114 0 obj <>stream h[YoF~#Da`wYd1HX,hkcˆ$O_n"mgf2m5٬ꫪo,>>ff Xߜ^`aP\ !1qcgA/8@ ÓH`8!zqK t9RzA}uvb!,p+~0&R0!l+] =[;.J Uo(ۇ.UZ5!Jh->.}Q0n-;}1Ew@OBx)D@NR,f)ЪS*6H|py[*EJ=$>FyGtiT܉"#Ax-1Hx`IɤI;F*ףؖf޶`dG/HEBj>@ZezAq\.@{ؿ0 ev.5v`V% !5|l7ZJ%#>ZJ& Hc >".A'kb4.D^['byBd6ڱJP*To|/W#/;2zð0~@_Y!yPwmV77B 洃)r&($ i#iLw)QNmo^FR]z@PDa @X70( m a J 4UQL)15"V҂:hQ吮T qJcNzǣy"uqO J=.JCsR;ҠP%IP H]@הH"_E^p b+$  "6/d`pz5 8gRFĤvc]&=N#F*:|48<:14M҆5օ2{qhacƐ/PB$AC sj _2xk@H$0 -6ދ9:h=F =:!tl'S=dj$i-4cM 7GMJU7'8o-=q $čڛvu7 c iB$˸Pկ]FZJqҮħ״xסj-+0bDX7#u>A:(}y_+4G`>Ch]7tD =>m`Z7&_TPt:Qţӿ)J %.#̙^Q\ATOJz̒1gq]t41j>G}{ʔ%GUfyKX3MI(u*U2ceU!913Anf&'%d4q{׉(1MywYVnwﴺε9π!rݖ[K]J0s8 V9+$,sM23aZz!.8lR݃kԀ,#9<}z Yf]K)Jf,,i yq8f8~NN%q&ĖGclMإYSL,,~P:VC)M@0 z) ,.p#+|fPnƈOջt3̚?m]xVu{Hu6*`LJnGH :YVvFy&?j%lƻ[܉|TLdNVڪCOSs5bTq YTK vfZsDD ;&ѩK3:ܔcf\9D]T0O>=L79c~IMa8GGGgvJwU6>HܓsɁ.yΐ!p: >-2͂|^Όt_]] awKNʼ>m I5Ѡn/9Oe'DKE4\rcv&QjFͲ)%AbBa,yPNY=@CG]miY$Ǻ_L1d$g(&Qa͡vAoe)!es5 Lt g g&D9^Lo+]~r כ%)rScS#T(p?Zs5J mhLo\_1MzE&´zuvWi> %8 ƒ 6`kY꬚znxԿsJ,ߖ*num}w@Aʧ!v=]Pi+],mɁxD/,a){" vşv6>_o%lq/?6vdf~KW_z03|[]y̌@'w#Xq xإsiwp F)K/Iz @wtZaV]`+c]W;‡e+Q/!\v=\|מ|׾ljn1/!Wgy47&nḶٛw_oL|0TŔ s\Pl'RC_ʹKzNHד7u;{pB+WnUfy!<㧉V0Yۻ+5O#$_~VliR?#KKVW.g #TҲ+fyL%|@_1pMf6P#V -w%I!*Z:s:BB Kkd?.b㓑yZKRRYJev>UֈkimmzF[_fqeI?g#ShL)O!if[|ѦFT^C)`aSQt:x<(0fZ3?+#/㴅`ļstΒgY LimD7#3VNSnkA=<3 iSh{ܳgv7rSyؐTW>[Q!~X>6Ʃqj䈆T (:}]mG`{*l#EƄp N)"%|ӈح$>BJdQrڜH[" X mᆽH_]:Ol7gqHz#.F4o?g^൙ Alp0R66Xs,Zgȇ+N2)W*ѤyCKѸ!VBz황^9OKP%i 188@}콥ݧ35]ZMtloG`1l})I6NEt lBz9Ob9%|PG8G'vދ[mHP\0<}dލiwұǴeJbkRc:yyhLSAt24?'dVZ;6 endstream endobj 115 0 obj <>stream h40 E",maEMB٪Q|~ν=iR)g<=Cpz\Dڨ%6^\eJzW<8݂lP54s'<2{~mw=3zUC 01 endstream endobj 116 0 obj <> endobj 117 0 obj <>stream hYɎF+x$ tȂ ,9p4ԈF$ʁ^ibPj~w$z,~Z/ެ,"z a@XG $$ ?.0lg+|!I$pS]6B*nH0$s|`bLE[}0&rIt-(UVSO7-?dd5{PYi]J filʅJ"/wugx/vNzR+ոQY?yǣ`CLNHL"MlMVT[Ci4bv Vz׬Ce3F#1:1QH}7G*ݭ 5}Wx< [COCwuvi%Ku[O9ʚ0Ƭeb\6$Жh P' $sZFP pTڅ[ Qtl$#t}ԸoqK*t)Ṯ 'ͪpҬ۠t Q-j eW+7Vc$@d8zHne`sJ#Hp衶UFZp q]8V'6z Ͻ\9M;AZ+,Gz R*ŬGbL+S~0IK xIGnKqn Ԧ 3؟&/xs_,0r7Š侴=1K,TlVa\aqHzZ,/KipPuHz H; endstream endobj 118 0 obj <>stream h49 EѭTp 14N:ca p> v%yw̹n}\BM2Ei`` hit oǶݴh0IJ)W endstream endobj 119 0 obj <> endobj 120 0 obj <>stream hZms۸_~#=mN.L|;7LȒF| 7d?ԙXXl4 8O׫_ LVnbpO SjđnYYWxkYbďMB8*f)X(єaU~YM88 4䏥40hN(|M8Kp2XR$MD|ꮓ"HnBiBuTB"5pe@CFEs,b~4x ~?i i->Q a;fn-j^/O/6t!h{&Y]WiE$yQr ISBb) f 7ܧrFovϟ-BKjX`fc Bx9BC^.ZovOZtQa>ȓc.GO-tӉjl , j/Cǒ$d!1Pk Bow:tMy( 6z$j64!%%RN|,v ;BS;nYon zA-E~Їw/Iʟ ]|d r |\o}ޠR>?*fy%P=ng{Xg h BAە -?A7ȸպxX26ڃ"*QΛ}2I?CH-L/w}2GT4 s ;)or<ZʙY/Y+ziK3_$mWe[@;\ݴ|,mBL h(N{wzhW3~ *^{ ݃/A<Ť^zUپ ^vYWo|wo-e1b6;7cyŸO*m6s5HzX b)#;L⸊KyRUQ􎿷sVۍsLvsi5ѕ=x:(q'aۍAA9|Sr+vza*[O-z2gC7E/K*ԍH؉yŝE,{UN\rHWi?A%zuL+,b7o^=E:w:R>ҏL  Ҙ )!j#V&cIkP&їXkBD3XK`D9Q0r{+1r|dA8i[[u zLǨŴWwc࣢kEKZ(ZyouR^`,BcFc60`8#<v^{]gpM"`N fOiVS3IKU=eR0Cy<^`gKdr4ȯOpl(PQADy/ޭJÝ4qwЫ#w|p pejZs*YEz|i3Y|c>0eR,aΈXWu|&@e>V{Y 4ZDDF)C 0ۮIV3Ahq:LuP=O#w9*^6kŷt//l q7b!bgӖ\s&졌ovu8_ JA ~ZM"xqcC)E ĝoy-i|0R~c Hdo;cE5aQ ZzLYrNWO43DQ2#b(V>stream h4; D7@C5Bg,3bp `fdJAm˺ph)<5b ^,d9.9^@dj)UYY̊hqW6#s͘Om') endstream endobj 122 0 obj <> endobj 123 0 obj <>stream h[Ys6~[H\ge''Lڕ%$gEI5ő,>n4o,7\|^YnFF/0ߴ@X/HH 3^oc3PY.bD FPiI*n ͑ XꛧgC01fE[>1ᖗ%0ay[I{f,n_{;)qNDji9AXRƑ6ڥ:=m\IĪOtXTIhFapH>vˊ p1#w_Sˣ?E. Yc/+c5Р( QTԒ9l8eN7Z (6u+ L[K-W+ŤBر)[ EaZT3$SrbVt"@1 3\C3sSg.] "d@*_CAbλsuQI5^Tޞt]14t|>m+HZ!/z:GN8+<%8#*)x\C.E0k: m]X&pt{|}חzkr `s1,tm<.;_kZުu2RD8#$/K^] ECAO{;ٌ%T왳*yůV#ʅYult f ~Op,yuB)uexJQB)d=/"*7ɂNUwoɉq)`a:\,3G0c!0d /ȰHLD _=,UFXF܈_fEzR^M`c`Q sHMѝCkByvBv 9aP k|tOFpƑ>1%|J>q +TCNL]MɍMu4z[7iޕ7K0捍uat1$l>y:(lLK>iIx {SyCHt=6qD1jΛw}]^r5jg;Rj!TCi%=FY'~#ߒ6#u[j z)' LQb.mӴ5 {sULH [թ/{+д VC3iG[gNmT0n+w!qI8g,z/4bD̦N3T՚0@$="#-";'!E?!UW/9%aweS̅Uە2K%&IJˏJ_r&@ju+&S`trI[tDp iƩcakPyU/pc$OD,؍։Ej2lAdcL6_gR'cGAP%{G $Áctܳ4RzKXuyPuwxB˺!+;i\p]e jpHJ%/ۗD!糖adyEACw|[4c[|{VSm\αw" Å?>stream h41 E! E,m5*lU(bJzQa{~p4K~#|=Rڢܽj1Qv[]E$TQqG 2Yy,=vvw=?zEL'? 0G1| endstream endobj 125 0 obj <> endobj 126 0 obj <>stream h[YG~_CW>xwC+ƒƁ}XWՇ5 C"?dwMo[ق, oZ  $$7xqcVn~./Or9-0 ,4|)N^6AeA.4GJ/Cbq,oA /`bB r7c­,KʖK&GV@7;X9~[RZD~ee؟cGXxC4mɞD,{_WKD%8id&,cGZ10+zddoQd_)s1R-r4W7~(^1"M{xx+6O/غV)&*e2{_.GH7U߭ P[Lr|W9GnR`O~%X->@ oςg8. cϛlt,G-( "(!.ˀ!J K g X ǚހ#VH7Hpsw "Ad˴̡D;HloʘDD`"7 j3"I( ֛S˯؆޿nc$iD(KK%>  >t]s6m0fA6Ud xDC`ðZ)?M=⃞#/KI/40_1fS+г`øo 6*V)՛Fd_e ۚZgUNmz H `'[m\- ..qY<-"[X;9n!mxþc-\3ɷ`Y3u]T_A-7"ޖ GO #P|つx1\߄R{OHI{m7 },PyOJm] YίGN bOA z(S p xgO NNq@\S`D?PGQL=5+7w~Wu=5U 5);쓊Cs~m,$dS[*8Ăm C02gq-.!l2'qX]P3>پ=8gPhvX؏N+E6lXˢcW %VleDzFQ5K2o9Ql"`7A|{{v^ڲUv,sĺO?-_!ypԁVFA0 HvlS;*/9W;SٔO63 j-0c>fZ6\f}S`E0j+gk5"u:SM01n;rYA|9wP`2 U$\<+J\9k>OmԞcxJ*ПmviVS_W4ޗv)"tEԜǔv{\iu8Ğ\<AFHIlB զ6|]o >]`Ayx8RV]twL8U+ ҽ6Ƥ$sģc~^$7&ϑO(KNPBs|vj2Gsӳ8u@=H^@7/.] l튻 2y'pۃI/Fť ƙ6`IͫULiI*-^GV kW ?P>0k,E=&2hˤL{envo. }U\ Jk vu s#;JRY)i4WbێI@pf^#b& L1pޭa=o\dxEp3VJ=MJQuV?5!?(ҝDN)iÀy5 ;JN*vq@\`Ѷ=U8v cE cttbKoW?<>BQvvƺ%y???W5a>stream h41 E27DI ښnca ;wH{4Fac: |fO2{Ŗ2x Ah,ۮT` wFe+>W,Ix#s,6 endstream endobj 128 0 obj <> endobj 129 0 obj <>stream hޜYn7}WQ2$;Ѻ@XA '5l!CUV I6V\`;\ru%-s$kysf9CM&u:0l4"&).F[M`d׺/-%-fĂ ųLhTZ)+2*aqe %(6-LH-6gae}{`5-s*Қ 7ĺ2.bc"q| ONOb^M:_@Tg;.{.kc\Ia0r6]wbmL e)Pa՚t/~OZvǍ<&m-A&A,XM8ԋҒ2XR$u0Q}-$-A;ArF7ڒd s R2࡚cj޶ FA^%Ql(ԯ{-#5VrEevNX*Duzr4W Xnf{2X"| =Fh<|wӰ}o?/NOUYtדt̋wrE d8kO%݀8[M@hR@8,r؂?6"k6"U1>,sn O<4,L'х1jϦ2}*CqjޔZ$i̾qE߼8AOY:qz{Si㒒@b,Y[4<x6a6)$Q8Uͯ?dy9dh!DUƦܠ T%ZJ }0|upACJsyq榙bP^ՋZ!?ۛА%+T6 =U3uMeAeU'fPXE.$ool7oaC)f!2/{7N1pty8qy{Cq8Gs(+q&$%?c4a68li+Brмd=ǁ{{SKcW {ʨ7l&-`rD4[MzZjx{Ӥ&Zr(= b}D;@gXR G>Q2;kP7D >u>'ӑ놻N07I}| >stream h223T0Pw/ .HLNqM,2Avv%%% `C%T-?(b`ljMlK(h •Ԓh7ԊX;;W! endstream endobj 131 0 obj <> endobj 132 0 obj <>stream h[Io#Wڗ @ aE$&)px}^mK2CAbUz֢ۯdr]-yA02z_I Rqİm/z|]l0l_/W_ax ,4)N^^ҒT M#!gC01fE[>˜pK D x/ݡ/?(՚ ^I XV(5e=R&K$AJp mdX@Q'{ cT,cN EXHxbjYbaX ZY$SQ ̯%sftw#QZ MGhը{ǚ(B7R2fHbwe b:?ӣΊ3%MSI~ K9=Pwo 䘷Z^&-5,Z6D{G{ p=lͣ<?X)d_.ZlByZN0FIS:n dP͕Rr.΢O8h,S7f VEA{yS˟8b9.ͱsp>e/6\WiKfycxޯ$V6=+ywq5^rmu1qљ%AZ^769eHI j]m>ցD@T*j J>?+!r)P'QiEJC4uj󷖺E̞x-jf x^|.wO׎$T3u<<^voRWŲH!03GE4me|+O7Eq K66m z:v Py')b^{cb4Ab ,~ dp:fq-=32V:RLsA1"M+>|{|ʑy,mUzf HNSK}24: *C};Bc/!?V$% DÆp]BYm]qe ;u.u[!$\ú2z-ZpD ]7wQY4 Gl {쿳h_|&M_['6} _IҶw/!`ϻ[%dT2zbZYz ƞu#~ '7+V8 6flȊAM 6ZYAbH'=B,beSA&p\w\BpБKd1 M W&zbP NEMVMCC !sCĹU__ovw5*1*[eF'H@LTWXTaoC{ na# k~AEz>Vr::wlD'FW;W"_a>orSal[]!iJF!aS !''#SqH qa9QP$S57qe#5ሚxD`2WLK,Jx 8x8V'྄l!5=-]b%ձ[hOx`FU<5!RQԟCY\@46PRܵ J$VVmru~k*7DĒ[(3γ7<X}3neP>9cTfɕ M-wڰ>䴂$=iBR8d?{[U Zfىsfiok9ay7!>79@RJ7K2W&jں;tNFHAy Ce'ZBjwBG<"TJOk8,s>tO)lrTtkX0Roݦ65:voIq;V3^,lH{1Tqؐ"9[P:_L'/08ZAK-یyWLuK{kw6Gxi' ܚi9~_eeW==?txRa'?>ܝ 933Mjv̘X8?26a=V2n$Jq}e~1U#r@(6?VCYUץ:3ƌu("WL*SڈEDNnKGA~h(Y5f--krt[A]q[sP9f/qoP054iEn>܍$cS~0ėVUƑP[!ߏ_;zTI!fC0׬|B ȤxI 앛΂q"s,b?*C&kRgn[xMcZj$ 2?@u}sK\4u_'?lЎA*A*%Ga;:Żڴ}7 YGe5O"f0O{|\Bg/:9L:PcR!>|cisW Q=x 3A9l^g(F4 endstream endobj 133 0 obj <>stream h4; @>! E,ma[!تRr l -`yf)gG :^;"b[4L *D7 ǩ"'c,G̸Yu,= endstream endobj 134 0 obj <> endobj 135 0 obj <>stream hޜYn7}WqUH %@bˍ -byA,((^VW^ҁRf96gqu>stream h,; D7@QC㇖0Έ-> endobj 138 0 obj <>stream h[YoG~ׯ}!f#> 0F6k% %L.>5Y9^[ wx)Ƙ]^vPy~q'BËqTZBs0$.#BY(AaLr LXV e(֍ĸ֦OtǘM e6Cp5w-@aUmKCn)Xr "(14'\wi/KKܬcIFd= =G*<*t(qP$hm ϒ%ig߷x_ñeæ{f!X ?8 "2`ȶVV5@mEMoX6[>l3l[ ,OtH$n$s"vɱuR'p^U(V9pS?974 g`0Yg%V:+nB]4~Qv^G.7dNr )hcq'@0+۪K &:Kȴɻ?RJ,9<ݖ2Qsvy*zS.=\B6qszqH=Y\N<8e/6v>A"b*X|Oԛ5Ksxµ!9^]X۶p?ۖԩTQD 8d;k8g?/LA\AdO͒C4Zb}ZZ"Pq2K40 Q5#h|S%rnn1I_wCɵ`'Yq{ʠ$j2:ǧkXܧP?T6'u m E C~HCZ3IRd7>q.M 3r9iVP Y*ĺrV6Ei "d?.mhjUVvvO!O}[n&mF= Ga3Z%GI]hNtl^f|Qm torJEysb6+m QSަ,f,=ZoDV6+R)GYn)-)ybna2zO&e|wDQ7jIzpl byn77O>\_'WZ[B2FI]*CٴsQvX]iu8'qWyJ;=V" hut:5k6V] rRrKV㳫i{Gj-fm!ۡĂo!=PyVY{.k>6xL LGщ(%'+q3ĖU>w[#>C®|AW"v)@dSMc2 ?NKk#3bz XH\cDڗI3b8 glà6Od%,@Z_Gk0IͲE3"(|׹:fa ,9lo4h(1\+ZY)6C kfzܰ30(dpY@sLwO7n0еuD8%q}KdNO}y VC:CvA 1)>#vF@7S՞Li0u~Dģt8kKhLxWΗBX87KahQ.<;ًiزesg'X6 #!)T}XQ=sV48?Ѷc.[!|6\{E ;`>Vwqc;׀i%hp.UacGC|8GWG,s{=D 7̀EEZC.aًtcvb[dol_<$7TdXX̦S%7LNJ{DWJ7a #^Etg̭`q]ڇIS=_I9R-Ɏ ٔh{9ZuD@uv@z0a $J/dL@4AeٌC]:c`II%9ˏ:5P'1OU-5d>NYnՁnCAX=N:Zv YX3|p 8fـqe9Ua4)om\2O~A. c[X6Ɛ L<pǟ(1Vv<@.յ\*[} fx! hQ԰1(V:SցisJ)Fck|02Ȉ X#ʿD 6Wm{ch/!HL)џؘO'EMB<v/>p}ߺk%_\QmY-b_ JH;'7kl>D<罝Hh;܈Fk6cd%lBFc}:qogr$|zi>r`]OJ WWDi endstream endobj 139 0 obj <>stream h40 EKHU]&bl⡟#&uaԵ>V|`,1ASaN370gִ40 N ( kx%k@.C"t,K^Tۨr9OI7" endstream endobj 140 0 obj <> endobj 141 0 obj <>stream h|Mk0 :&O(}1Sa64+%ƶ^I^>0tLjC*&(1 )7xS]ީ-ǧZҋ.WʙhɆ|yowjW,4> Z8< a sh GfWHĦT5$" =֯ǮH&f4ѣn(hIjԜ8r)nTTϻy:zkx|n$Qkc&QuUz'YfL[`]]tb Ɵ4MpAHX~ Cφg/ endstream endobj 142 0 obj <>stream h223U0Pw/ .HLNqM,2Avv%%% `C%T-?(bh`darM͡l :(?98$Z?M?$$ v! endstream endobj 143 0 obj <> endobj 144 0 obj <>stream h[nH}W_wdd`샭Y;oHYNh9*X]}twJw.%Y^.FF/1i^*.ˏpn?k1+N_/fD ÓH`CqBr^*K t9RzIm a0cJPdb_ d\ >|ހݧFS!4F}Ak-=!hwdWǑx[ƃ:iݟeUȾ|Y l{N"VL㮉s{#$!L}o#Y:˴*ak}yo۫2Wą`c- 8̧zeSYq{us9ƈ!6@gd4#LAle %Rk`"KM!tO 4>^wǤ$9pF  H-aXI*#l\= E&+R^cJop % IΪ :#B#nܭy1n,h'`+襤}0;DUPP@L>7xF lŷ\""uwēn|![e™9Z3N@L j t@uS$c 1BN '\9$N9"~񙈳e:tU&(P<ӀQWu5&`#9naw#$9 YIj!9$slLH6aydى$S(Vƶ7MvNY|D"'<&;Gd E@Q}"6HS̝n Hp֕S0U q"!'2*}PU&bf9ҽ5Bh. +E e Mb[Nz v;>v ⺑|}_Egf&j`pFE}8Cf"eMc\پ VƱp *fztU. `!؜xȦAcTfRE;%K. e# !#uLus{7F|1^~n~1LXC\ކGDQiݱٮ}d1E9gr{`E:__^`+5'04x=T59BP+sB [=fup" 9/+٫+wQ+;3QqmBϿ;ߞ.opoTBF(BaՉPk 8,ooڎ`K^?~^ }*3?uFQ@+DW~r { ً7/Gh[Q3L<\^nnQ7!,'Ja,liBTw~}O|fݸ:rSZg:b+)CX}#VrF#5f`6^V!R(˾'[ pcc$z:h飍*vqYfc۪r[K4ɛ_{u)d[gv{EՈ*tK{?p$|3 CC nePo~*6cP0';X*Lf-qt#zF+HnT9' !6!G?LɅ.&2yذ^q}Oד@9<!WSv,Ua I}.S LP {;zG|fΎZ7TE?}Y4񸒱|hۯ6?m,ir1n+iFB1j`~V T9$9[G( Öv}_#SD!`!5 1MH s؊=҂t?8Ʀnt/zfqL@hYYVe!?]zΎiy!2)Eќ?4uTDIfS|(r٤`ߋ4!6@gջ)bxD9tzOOk5 (LkORC+Ttn*eL =!EJ[ɟҒ>=z<#<*0bTؿhR**&0ba*Z-z4__3c42t2PؓF?mtpJdk-1WZhR&=dO'[cܢTh?HD)2&JAZVD~^BBdLtɳx&/ٜrV1I2GSeELT/ʗr:"{k)GT-A4#¥%ē@It|R_%<-$>stream h40 _o7,@V$bl⡏#}w " 0MZHm/ ~yN1IKZ$I\?fz]sh@0  5 2vXG(tx{*TmV/o4t endstream endobj 146 0 obj <> endobj 147 0 obj <>stream hYKo7WqT C.&mRI`AV׎X2$E}g]qwe-E !I/~v|b>W(Ռۢʹn‹|͗+ι:A-?mMLq4ar5Ґ *[t' 6C+`B8WTZ2d>a [JpS4l9&״KׇZqMS2⪒gaM]1aEy* "Ț t6J Qn3_Og3f7skGb ga«.? SA.&[:,+R-u̓nɤszd)btg]-}m"he+\7:V=NӦG\?j ̕[RӃzDAY%TaK;VXKU8tk钅ߥڍ#v][ITE bgB`ٌi̳4n .=&Re"MjR3%WH:NôQD 30 8S0hv mPRLnQKQ+ a_x{rЊ+J2(ިco;kàqɸOLm/ .%b`5 _.wW ϫ s<#Zs'cѬY\)A?:I~5eE |KTj9@ct5m S:ڏ(&N KHƊ^yiKyoҖ1퍴uL#pAv[:pfT73%A%, Y$q]ucxEy"bQ1utQ/<'y F!`#Np-s\e~y;itZ6u@`,SPHܯ7c9̣LsRWGj*O@z2)!߿RL/*YE,'@̖J+A4B4TZ}Zlwl_7\B O@wqM1J3 !_߮v )Nlւz_=q@Of]R.V=dk"ȡ&uAvQn}|{>.?Lg.RmC@Њ0DW_mFOt&\63ɔ0S8W[jy(_6%% ΌIn0<=)6XyIQrvG _zQG]ɳ͈@*zf%ZVa e{mCeNgQ3ȆFi} ]ɍA1"L;) A[ \s 0W,ǹF`EGP``NUZ:M^Xd^*Eq wU x?9CrBG}=qj>G ut;Yƻ_q:WG:t!^B ;~ga*폘 0 endstream endobj 148 0 obj <>stream h40 _o_DZl!J>>oݝO@4k}#}t!)y(g[RZO( #맑nE :F2h \3`.nhK: zܡ!/֣Xol o4u endstream endobj 149 0 obj <> endobj 150 0 obj <>stream h[[o~ׯاb vZ7F,AbV2mUgn{%Wv# 367C}w,9iuj%2%dOFj2 HEqnZ~:;dzgI7 ޞIJ  dL틳h !ƬʹĂm?#2p.gFzP|p4 SE0"lӉrBc"PauRſVk(Y&Z6Mf^uW:}SKʔ1.L3B3u[ ,9,u3b(+qq6AǰXx*!Լ'LEQD s-@[x4_6,`4;vh(F֌!Îp(jbᛶX^aKRjjʥ d@7o؛U{5čKEZ06J|b⽴S#u?;ŗeeYQiu^B@Y}BS'/u/chƸN|qQV6zZ*<")*IΠ`M6 :tX3]Q#+5aJBB1ԕi`sw>=@ 7AjI@o@5 H3T=ie BJ-T D$y8y;)gβjOCOpL6N}_ǡ š'8Tpv\Xйv 8^Y4,^|۱p?Wמ?lrY ^o{n0pi4d{qe N>炢Md1 .y32{k3B41k$WAm)(hl6CAĢf,P]Qópg`y=PUkZ^ɦrc89!nEcУTeu%宭fGR7͖"R7NoWK}(= +BW2<%˅`ʺE?Hrϒp6[bP fJ`kx 9PUw:'++1ڭǎ:a_-ֻdFufnO6qmPbchƻyrYJ D'jzxj)1qbsI4慵 2aYF/6?`k'Ao0AGtjh5+^Y#rDU-EI>,A{ Y,4ow$L~&= !yYu$Jߓ}11J$Z%2Ny=)(2i@RvLU&8e?Rh׋N װfFEa|/o41%f1ɀfEWLSHw H tI>1_I Ha#` 6|Q >twX=d__N@W)KTh#E3ݭ`J , 5Mf QL$~&aY Q`؊Rsj4Lͭ9zM#'ɣ:b`FG1mOEo`lqewLebbhL4H#ь_("ނ_ .cJOG1($?/wB/嬅hݲBw%&z:w춗1jZ۹L&y# -8 hr%GoK'$AVZlMjm|V,}6|N2Uݼ$B7彃6(=8-(shR{]⊈%ȑE|N/Ϡ Myۛ VP*LF'g Ŭ]%gEǩ[z9z"}Pp>`"iS~j2+5ލwe@r;&qqyw m ӵV]h{Ъ@v.n0ZGXP:4aN]>o֭]0v׋Qz22o' J5S#oz,ZN~nJ8vS.a`nv:aQʦv*F<bČr6!R)t_nvj 4fj:Uh0/BLZ,?7FOA GFN>UU]/_,<}'`W s/5{t44lx9 endstream endobj 151 0 obj <>stream h40 _o7,@V$bl⡏#}w z`Ե둾^k#Fu?iIQK9 =Y`kǹ&Xv0|f^Ʈe׳|uOj*^1p4v endstream endobj 152 0 obj <> endobj 153 0 obj <>stream hZYo7~ׯUex 0CB_>8qaK$^{suZB]ECg3[7?|zوĚᛑB$RQ-~6WPJW勃*gILqڮ$WNK / m &,&fH1k -9@WRΖR5l,aTɛ/OnHU4M0; /˜hˆn۟NdM:9Կ+O (wJU_6u ,=U3:ƢwP"ōE7,۫ʙͼvs"b; h(uwwH@r\uTxuz?<'1-2ankIxy,wCڧnZ 3+Lh/_ e &B[:n`=^Y_Yf"l%.PVOqqVA+}NPÒc"Mj\0s+N:ei"dѤ1S\/Ж(^(MG.-fж Ѻ{갵(Zq]W 2 {r•UW.KVL(F{ ʵTbv!0?7Z|Rk|0| |*L14oV-\6l'٩Vz+ }W}ˠը Cq=2 q\-zܮcT 7l-pp~]I^"Ô./ zx__{Zev-..%zr,!:":iAc{ C}E\N'*k1oQKV~']B6/zaO4$Skz{nRͤBB䥗(ӣmJˎN^6aý ba~P? @b^ xmtgԻBҾnMa87m\*A+B0eSYhv F"Vb͸U*gJ%;) ;&/)o kf9~#Gn6ӧv{+iI~U9~2Jb%;Q]$$d%a 9VDLkqhc%,Î`<(U j% Erp/(FAE@.g.xwTjGQ헾r< K\ٗ=6AuzQgüxΛPܲG7*;9"-3KCdi8bgVMB1ñ>stream h40 EWqkE!ʆ*8RI] #Fu?iIQ3K2lB7ss6Za@Nk 3eyzi#"֣SYr+ƿ7+ endstream endobj 155 0 obj <> endobj 156 0 obj <>stream h޼WKoF WqTy?Ev@{(KxS$v ߗ48F"pG8Y-KI8Y>,8ÿi`XA;\-3hΐՎd iU;[mZ`*N:%h6 Cν'V *@ `jQ! &↛:l)\EhR}ѡLZqdI;fV+d} E!twj􃾼lڂcKaT\0nGۛISpKYɈY`!  \SelH)$*@o!vF\0 {pq須r.zРܫzɓ Ԏ:= Qr\+0"69^]綀}D=$ΤTYY-hv&砘Wl ;5mFzxܴs˱!+rv|2|z `C,^]-N(,W8So&靿n 6U0M-xM\9ݾ4?0%ڝ0D~wlnڻfߴ++ hjUty'󄯋0R ΅8"|㡢ͅ#J&c*U`'Ssek}=n֓c$0)~E2T- >LLr& ӡqBCl Ym;$lö[..:Z(3eIǍ?D?Dd 'zIRh.>Xq).ScO7l`Ym$+?},?x9 ؈k@ _z! O^yS|i^ I1o~r_q 0l endstream endobj 157 0 obj <>stream h4 ECX&kTتQV*Ϗve$H&qz߶ x2%,i i AyӦ ,h)E`;hУP=S]Ow/֣KYr;Kg4h endstream endobj 158 0 obj <> endobj 159 0 obj <>stream hZɎ+XPAhV < >PjMCRȥ*`̨X^FFŠo_W(Xz\0J-( "F*4-kH)w/Z>u9DPIUތdnFF:bya%1`P/r %$a̹(ND;ITb Fm# ܼ?vK2W4:G* k+ʧ]w;1J km\&hT<Q~_VpZkL 1ѱiZ5˿S O1b!|dN*4[קiĖu Hfd b搴_߾ׇd8M!\\UǴnq }inYq"cfz&+L/uB[d^0I &?ƞ~jGqGaR{H3|bJ:MD\Ծ /5,K #dؐv~o}8NRhe;lxjqzh飧 X<:}$/%񁹅ߏAM7& fD}OW`E,X BORS oC{32!~5: #Xxa,T*4tjf&+vJ 32T ʥLO/puArGlgS')cSC^Tm K0{ Ll׻%|b4&r=.j;'TH+tc2*(|L@$KULVWH/I߿r 7眨HE]~Z޴_ġh endstream endobj 160 0 obj <>stream h4; 0D77QnM.0F]hy3j@4k{#v906PHIO\2nؓ%+JHA2KQt C#4D0?%`ܡ!_GsŧXo(WJk4p endstream endobj 161 0 obj <> endobj 162 0 obj <>stream hn_GjΕ3Guu[AZEXL|@g.$3Di"%sx3?rGwۣf3:£F#/S$Ggx8B;n__^#?tn"Xr%| mo#N2R0J2,riG֑+5i:!4- gc B6Q)FT/ bzӏxi C}ddY43laLNO <>ff7RbiA|8sa츣)"VS$Z HYI-fޔؑNREeI@JpdgQ+ݘw ޕ(1=(&Ը1JgHggX߂[~QRҙ3E>T&_/|R1xq|ydh|{y;YOY)T!Cc`=H2y%)c*z#ι[J(3l5"ŇlM'LG$^ȼsn:;ב XaT`'+@ۣ.c (1INε_sq9/u{8An~ܓx(3ar"3oO}:dtd'Vu@#5LAa7gk߾./?~Jfd4,E4`k*)x3mD`3Ŕٳl=Bf:Hg>N:*mɚ$e *7gӮL|/w3y_n*e% V6_Vf^UAVnbKP.B.J6HBI-P 2 1! g 8+4/swtSzwQ.3 KgmxYFRE6+&H* &YXѠr];\ V:ZP;1-?* D hS*lҔ4-|]:L;*eZzKש-[ƙm, c8zEij,S@1 #$'{O/Ewyُu\o{ w4! W*Q ]!ѸQGԘ`X t]?vg^5Yċz(:?9e<΄-ɇHc$KMyRUފ*usRVOuXՑmصmud"iɎA4o&hhlwu8Ib4c>پoi>q.~dm\+8zGHPO}=j>,WߎCޅ@|zη *$0N'lw]4gY*i'qmjky$U=C|s=f5 QF׍: g^uDa`{Y>k3p f=)bS{@轍<@^|e0~ SW@J̠t`|/3Sd担VW<qOȳcU?F5x\滧M,yUjT |QMtXb]?4٠@`wM,D78SeMd&U!|Si]Rh+J*V{A{uK9HO/*⛔7*"J@$Xᗁt?nF 6>û0z⇘zz!TylaE;W#.EL@\yҸ.Ex/-j2GL*a vܗij&ʉ.=a݇b=v֐L[iݥ eE;annMtxjYl⾓gN0&OM"gFnLۦw mmyy⑎kݖ>stream h490E27)r$m!(r0 S%Oٴ aĵۑ^(y$'.7ɒ%q$s KQtE8:Fhf\`KN |#s?-uz=W|6RO|`Ғ6 endstream endobj 164 0 obj <> endobj 165 0 obj <>stream hZ[oF~#Dӹ_nXd-V} iG,l/C&CQ8v=3G>'=off7#3 @Xg $$O78{cV_nRe9fa8)NΎҊT M3͑aHdUyj!dJPdtAnuɅXVA3{x݀~w~[Zj}Π[]=A0Ev=įNh7*H+C~b#%57Kmq2meGà+qLv1<MEPKq('%WNYS*fetCVzeNCa6^B+;8^,uB\FQN87PB_mpN zR16ũLfsf@K2?n׃ib@wO)2bJg #C4d! @|[@9K5YML8@=`>ZgsdpaT'Ox*Oeu|ߘd!8)T#&FoSӻ!:zJpAGpoaH*H~x YE#cxf9# bzN8~T])Ir{xXL9I9Xv(HRTMQ=PpP|\f#~2>?A5IݩQT Ft8;*C}zPDuMQydN_[VU{Qŵ+V ?ɊD4hF#f݇!tƴ$ҝ$OԾq6/CV:Qfx/dR^>my粪U+S5̆-aZՋo ?8'?8'?,ioK|ع` qa1.K k.6ԵQ;řV{"%iҙ\j48cfA*E iOTv \(+5!G <-T3PCsؓ+OXx*#3XY&c17"<&.' HIJvN$]w_#Mtf$87\d$jzehŒ0Lj%?a?x[z{ :<>R8Sx١y!˜z-r?U'7c0k,eT4ͧ}Yտu%ZR66"OSTtCoo'섗TYօ'ߊ8FcáZ#+_p/Tk e{أ/3-K:Lmg^&Kƚ@Q69 =$eSc\ f"K?/n{\ox9I[z$_[^o#]ll 9F)OvYndPk\>}>N0*#T'[& [//ORחE%Guח0Z2:AXzt^ =jI[(@lF#Wh$_ҥäPxa_Jv/~|A阇Iގ-3`z endstream endobj 166 0 obj <>stream h40 E6yHU]+ 1TU6DPǑ{}e&uzﶗ&? h<7%FYM\?a^t Y u6̡rz=z6\Nz`ȕ1 endstream endobj 167 0 obj <> endobj 168 0 obj <>stream h[Yo~ׯ!n8XF< yёH@Rʿ~fND0hIۓ?]|q R\ܜ.0i.HH O<>Kד31;ɟ/[Y,bF"ru",7HBstAŦ: bn1c %(2 B@+ |}S[HTQ[fg(WÑxZd AZy6uOO\!Ynv\5a14̚8g&)f)nAJHтpy *h-$FG;hfu1P.v LK uw>#i'RMq=8ίRua8t e-QxZ#7F E6>% SJ i+~(8ѹ`֙R`񄁣a|i)'V fV=kVҎ5G3udg֘iЂi X_G&H+oskx<% 3i-™ "Fʙj[0I263Y'| j5.QvX> Rhb E@#֬C@=0S+&vZ<*$ !5AL%"[vsҍTe4uզ+qĶFZ&׸$0͓Tۥ,K8ƅt'B&JDe"=vў [<@gKG%-vD8AV凇r" P*,hR^vvES:!Rg&2Ց|mڧ%$}DyA/!M1 ~~p?`gJcΘcG ]5 I͜7nM2>Im~'U5w8bױpY0ieU>z8h[e1WxꨙIdRw~0&n1̘՘1ۥvA3O [kt{߅-,f TꞺu< ZUיC!H/6~4헽\lnk7QŇͭ)2<` ηTP~XzS&qKu-$b?6F8U!67/ mpfOU2(k9RI2~ 8j&m+NiBҔ/lH] H8xЈ< =mVۙuSU1ۏ}}Aspq~`@1~Wׇ\"ttR9a,v-4+i92pMY0䷶BU&fjYoZ*i At0rV^ ꈤNchaMhdZ[(gQU*N"8!z Nh5ZtЅx2]k͍;uQPy̥cH4]Psl lB٫e'k&י ti/obwI!߂fx z\@Ze2Flǵ FRhۙ'XX~oPHGݸd6"BݸM\:T# t'T+ Yan^cnt#so6@\X/83A@iIE>-UGjx"+8vs2]0f#_ .6KBd^ 5v:l!ƑgL=[q .ĩ,z=ךA= so%Z.T`Ũ ֭_z.`{UxXyRWܚ[-ʷSBE:DZ:ᢒvֶ[|ƶ[Sl4CzFj~ņ_W|6NZ&v{ش:&7ގO 4|~N9=3qg<^uxќܵW$>:E5c,A%\}j-1xY>HW7vE%`3{9a8$(eor,0`?KIp4qw> 4P>`˻6ufsmP M dxy&W?U3/)5Q VyoddH?l!@~wOյK܌PrIMleCgۖe .[,zcw#"͋IrJ%'th{{qzh%MerCx%[op"^QYol5$u{QC4j>p0ݦh< tI]lqƢ0R5LJqGYhyADw-~ѵCC endstream endobj 169 0 obj <>stream h4 EeuXjB0Έ)ν4ZB]'x]Rxl|K]d3œVLm *?:d65[[U/w]XIj_yo,D endstream endobj 170 0 obj <> endobj 171 0 obj <>stream hެXYo#E~ }DQ$Ehb#9M+T+gxb.cj{~kնNveخ3- S' uTu5O0aZ*ʹՂz82b!ږ=L\DXp%Sq]0I+⚄L1qy\SF!T ݗslʹԻŏrei<&^,NNI^P'5kjEe4*AkrTp6bGƍp,Ԁ!u=? M;/Z֎,_$wa$Z' xS@.PimɌ9e[_ U*H=~? + :bAn%LfL#2:3V0Mt\PyyLc75ƪV]\pz3vmy_kW`3AƖ jn˲{{s\A!^ա$ATDo*PTnգ]~v Wʖ&|N&s$qʚFI muSGYcբ׍"! [DMK]LH:yl he 9CY , hA05.(&؆j7}ӻ,xQeW 8|ؿ<=j۟G ,qopCvP%l1Ym\SAv%ymG@28f1' ?wbzԯ}]*aĔ]v"w|*a ui<6( f8fr`!,ϐ }ڬPiDN3֔SX(_AUw9IJa:@a.8jP#$BoֻIk"UBjXkF.2D~FWu$I$h&\vǎz@ʛ5QFGێdczZ Ġ9?;K 0$)\&⼃Eu <=*y~8ɑղ~о0 hN+c,J AS>stream h4;0D70x?rZݡbDYKvfJ3@(pG*ez/^7́v*f=W͔e}ҪҖA:SY1P6_|DX馷yZ,D endstream endobj 173 0 obj <> endobj 174 0 obj <>stream hn_B *v@E 4Xƾ8yʻ3H$-=I.#(lcy.>We$"av@Xg $$W8k1{s7Zf:C N$KqBtVWJRq44GJg!;O&C01&S"-@˜pKK.tDXJfvLo>%@n]k}x:Vp;Rm$H&OEM_# C؀eԤE[O!;0ulyEbm) teQ3Gj >r1Uj@ D!.P91c!Nl-Evs H\$+IiH/aS&S,돧EENs2ʬEt߃iD#kc,[yէ>`E6%B" x~x"?8;Ot7te:)k-ߢҢ9=VI#6`.Zth>BX%L ^ Iӱ:6CL8$'"sڿLn@IߧL\;c}Q(X羠`UF\Iq!$]%7K Zf(w|͒VD8 %X=3|2 K-Tjۆ^ 4 }u;EVDR&\o!84@±n%I kSЌ0mTckF$)b{<pRR*.aɏO6]SmuG&!z-UۜeY &?oDɿ{z(>LE层 idHlU*=W=|%WZ"_bJhdmOyCt!{oaD-;Hz&O mRq\` -;콦@wK(B&UZ;E|dJy~hɄ7}6w7yx!p)=f,y`Q)p&RPʂ aC0ַo|*tTc x^akV v)O7 d("in^Bȋ;D9u2R]~dNe߃#K/=4!X[Ռ_ H2c+o?5S^ҖYڋ $łUjW!jA; ,WzՋ W*WzB:G5JqG1{{%)a=xY{=9hE::@\$-qyqky_'f(`6HrAσY&|M,&lWKtk:mcFW]܉G4*]k0 Ѽ)$Rv_ 㳽 殲;:ׯ27- s%]I2ɬ&sw~eSGljm:*o L߆z]}W܎8fjCD@;okM}\%xhu_Mɶ6o棕 ˫єI%Ut?\ƭ)"=EtA{:fd?2B3?x5 JHXyul)s}5d;Bdo!z,m0 7 ^puNpءD*YCMե4k ϿJ6 e8rᡏ&0ܱ5? DN-hw$n(4BhYYjZc!Ҷhߚrr}USpקL| {j5 h@6ō_|w:V_b74HesJ bxN"\O2&{K<3 `ɐ3Hh}}EBjeE^TR;<>stream h4; D7|d$[+E),. EՎLO9os?6gqi,Qr[3/q@9S* (hУml}c^C2O{澻e^b"!\ >1 endstream endobj 176 0 obj <> endobj 177 0 obj <>stream hZYoG ~ׯUM>@EPvR8V /9쩕):"pHɊŋKQv(qYE-TDi #>/hq xE)/7{]lfE#~P\#K#[0ATQ 9,0\a'N P$R*!P# |P! aW_1QPE姇tbdV!ȹlD?.WGv2D20DKi̳._ug` 7u~ `^0IwD ڟZeF7ކ+)1AvTR8ehPv&rE4AJG6HK`/F8zʰ YㅶIpRp0..1f)(#*&`mX>`[tSNW1>(q\ 8Ot12z5JyFu6gM=%:3Vp ckxٌX-{ !a-Ow ɰ\$WSܓ1FW8KY PauhdEQ4 '9Fe&5ʘch}uYyh2Ne3YW! ްx/p}=EK$hY(K2=-vO~@69>d+ħ^$C\(^+=Q@TSP`&G%e^̦%E Pm]DN3q0&jWvﲢx?n{967;7 ;IwZc; n:T"TT+$E֋y$}ÿ)z-R2초^vj8ئN8FʪW]X)⠄æ&opBl@ b6>Z &LPn>ÒCuDGِ}Gm%!0C;#j oafWmO_PguU>.WP!Unn %ıC~qb~ChNbG88#v0"i[7ˎ%er7zq|*ݗm8f;V]長vBDfu$ҦB}bwoΏo_k:ދ?ā-w9=;DOA}>Fk8?bށ~Z~! 0_+5b~Ip~y*bAB!>l~}Pԭ'Uu 9"[{~cEvHyI144(м;IIt&vFNjT[#JCf6 (pIptp @E4`s):b/"e /E~ŎEBѶݣv6==~iϭ=s)R)59j>stream h4 DeEܩ:ca 0|KݛyixoT91d> endobj 180 0 obj <>stream hXKo6WH  h^b[ ؁ 3$%ђXheh8gmQP9#ydھB&[5A5PJ x%hi]tR('Қlb =VhH!z4 `OOqܲ{{8PG6 }[=9ൂ{)È wV`h.ty .GH#UT2=F(vZ@c d;9vRm!pC& Bi%OH2ѫzxg!s-bCde7$Ecp1t}X`A~Qe2! R E/_.`2D#6%.d-g^,%R!/vi Y% iG^6D& >wB|[|-r&~ .U.2,1f OqUQ "8!*&C(/ doW$  ]DC.M%P[-cި7E㱬9KL՞U{gq& .nbo/zeJr d?ơj4âqz3d0w{̏#$@Z:ɖ3׏_#]Q=u6T1Kщۻv}@Ws` vc gz~M]m7SpIt'z13/7-b4tQL`.IIb1]m\OդvFW6M7W\:&ƮnqE&fIjuZc󆩂sjV BZV--`*;C!Jҟ&l åX8O%JÝMlA\>%p'!P/؄J``xHy0ߠ endstream endobj 181 0 obj <>stream h4 DeEܩ:ca 0|KݛyiL/{Nts?b  YCNL^ՌG\ 54K[SY1P|GZE6nqj) endstream endobj 182 0 obj <> endobj 183 0 obj <>stream hZYo#~ׯǙEFbf"F4$R GZ/&6`Zꪯ_ ş_,#`dt7-֙ azkxq1fW/nۓ̶ 1 ;B/ iTZi9R:# X^<1qD1n/Ƅ[YrI ʶ2`f7b`{|yoTB)z9@W}w;ROH)oDm~z)VG|(V X?i1e:2M&u~oA:v a-5|=gz2 R]Y}5KH1JGG JiS+T~,Xۖhț#̨F!ي"Ω<\OOu`^6qgU gB}\} 9*ӈ8DR=!E9+i q\#)ϫ't{ǛB"ei+k,kJCX /C!@2 AZ"^(&4A&]T|K{3b[b c̡XMcڹFs(a=\Zgl saeζ]4T([-Zf%غ74;`"#թeGNo.I;j"6lY=qN)@b` Ak\@jCzrH=á>^p} F n8g#q!@zKiikru'zJ+jgqA7E-ȫ0{?q#xo`W~+Ky:j3aPd t9uT#l)Нq[2yoVzpLCo9FpͳQ(/C4b&NMѝ, Dy:cnط X *5~w&nj #=>jͿӚl^3xqW}HYiբ(4VTIh4 >'Lٓڀn[7>ԺQ=f{+&H,6G9PiҞ$<&4zA6H'0v2_lj&|akul ̠EHۃ~]>zB1WD t2Tz\5otIZ ]ͯnQOt3˵3щA~.JM/4i8W\I*Ǎdž @&?O LQ3ùPNvJlO[7?7]]A,@̿, vs'AIXoj_PesN0aa5.`Mz 0ʣȓAzݪ.qH VHTC`'k0t 9,<u8`ε>ȘuwcH\:tK.` wW+d.;\*HgA'?GGST$- %%żZ,7'@/<"ֺy*!WM_t'hApd  j]y`t@Q.:8@KU[xU7xl퓵=V?}:^-CȄ. ̯('p*ӷeE^;K?,/?p;VR,rTxaTRK[ /=wcv>>*}yOԋZq\A˽ȫ4Np_hz~-̂щxxYOH~ wy& χ̀pPy|E1??~( ~~6_T"X!.ɴkHHmLēix1UM’/(g)̘\h݃}[BLYvC}ʳ"47jDFMoŬ}# endstream endobj 184 0 obj <>stream h4 EmFElUR|~s|A4k}#}t906PQ϶,IQ#Q1g%A۫]cqѰ ɢìN |#s?-uz=m_7 endstream endobj 185 0 obj <> endobj 186 0 obj <>stream hZoGBWtޏ 0=qe@?rݕv#pI!->/n X\0J]P~P0R)Z?^/˫^ "($* F2fBq,tD-vMC$90'QP$Rh!PFn^ P{KZhu^T~D9@VvbdVsوUXGvYa?[LaLY3ϺxevJ & ?   & S0B<_M O-2ANRVIoÒqJLn2G4(g$E\i #m}p#=eX.D񅶖IpRp0..1f)(oGT;!?paءK%0t%8-g%hI'H-zKi#kFl4zKtf@(G_fĚ%:MX lOO)|8 |J{S=! A &$%9,9 Vr \z.lWۂ,7+珠>J7}S35*3Ud& kІ/:vڱShDr ܊ eխtҎOR&!1$JDr:*0o|8 t,PB`R٠h\\/#ղK8T}?soL(Qִ8 ܤ^b<+43cvy JN0}W` |'#!6ᨷ V`Jl\\…]\-Ȕ 9Sl_+43$vo;iă;Ds {])*m!;kp]k܍sM'7Lj|E5pD'|$?A K cQ2Mmh?\(OuM >(Z5Oa)=hmK~Hꆋ1) BK/tdJgngy`ΞvHbC>퐎ł`ں&Gƣt/ kԈBw) yrAҁ8  9St7vg襫jv>7ឿɺc+4ʦ+f0; d@ ~lLEsw1Q]bJn Dv,$_8޹8/ƛ 7𣺢ÙWW}:VEV.X@9 8mD7UPEPI$ύϾfH7N^rWb>p{J|qu o>>]zqjTqʺB{X)ca..C\u_E,\'>c~ Twօ04Yx+_xŨfZ#U9yoUՇ(D9O91 1mʲ#X:1ߝ|;`m0"p?lwU.`3 %*yFGߛ'zyKg)<\K^9c=*񫑭(u: eNQ'wPcȓ1*{1pՃ./:F_Bԣ@_۠46?3\j"']\Q8Rh{:u H3vL鸠FzT';1l₤(ԕ@] B7`j+- UO>j릃$ޡyM[5BS3 uvwC~c1._%/Knk,4#@= mljag!ffK`ԇXtuY%Pbo75jNNౢˠJa}Caeœfݱi\'1fD4@ɋwK!B$#gNj5lvU <̅ɯ80 A"G4ӣy6#o?uF 0WG؉aދ?"O3p;p8j3Ƙ#<ɨƖ 9eׯV:lj endstream endobj 187 0 obj <>stream h41 @0u@X&kTتQV*H,8 I]˻ʏAO^"o\)|X) cV񀺋R ^V76v}GQej*_!. endstream endobj 188 0 obj <> endobj 189 0 obj <>stream h[KsWLUJmjlŪ\T9@$sU(#NfDmEQ`z{u?Ƌ⏗?\^^\^`j@xB2r xx.T>b.)E03+x c('L,KZ`>ula68e)Z/$'f"E3K"08,Lyb=] ՊQHT55HR,T,0P% RĺJ.E=FJ 3|[D%C8gNޭ0AJ_ _LeNhԃ!U 2urČric~(zdx2 쑅P*Ed`7@:VF~V$ 7jjqƩ8$eHLqpq-IZTBY 3dfZvi8-hFc5;8UnTV(e0-Lw|A|.-aϫtmnjȔLXaOJG8 >Q0nۀr%0h>_,IK4%X[zڏi |z5Ivw݇HTXG}ǔF{ͻJvFavTUh2Δ5]H1; YXߗ$ǒy|ua ?h ͇BQn{)%_u"tӋuؒ|L)ɞ"O"\_o3sQb6e@@4)̏sF)g-v֭-DO6rxY{/Ǹk0`wNf츣 w=Mړ`,@5r0$6j @WjZWOz H6cvT.~q9*AxQ$Mүa])uZ\"f3}>MŞXoe߇5 K6eXU1kotS*I&/@;L9m{ʾ.8WM0zYD8}XW x֊odC)a\,9*+TZ[ V#H9QG烔w/Yl [MYN(=z26c\x H~ vq(;loB@ e7ANebtr5G Ee;.1gGLM?os)b~v m~E)Zq'Sr n|9$MQƧ֫ڶGI+! ]󔘊veBQi8hUSICs*)MU6 Zv| #.[ Omoʈ˖B8 *CVm7zG{"4]7n}dN^ %.4Ev>Ɖ*.0]kMbbF-3϶bgT>FMcZءlB0A8 _2G{K׹[Mwv;[ũ p󤶈iS}RHȳ2U׬rOI/ǡ@OHvٶCt]Gb11l!Yq6Log7QnG]KAZbu4#g ; Kie9CWtbT?p= ]Hi~WF7覴96k%XGR2ʠσYU7R2JoDԘn 2Ǚ3dRbƥI#]/ KE@"'vL]E)mKTW [,œ#{0HXJl߸%zIÒbWE>h\^2%iJ>'r'a4opzfƷ*1K6ް|j!.).=#YJ<Ȫ3 Zߊhg@6Vl~ 3Nw;ջhB2؎)9ʨ '^ruD~_;L5, 3]cʝKRUSb[h}5ԉJ7nKs㰷ϫ*:6EyFs\ݟ_~ۙ1⊸_ZQ1}NuASG!s$gwfpKE'1F13D E99[,a3p=nQN?\y /.n+tA75DD1i0xxuWWel endstream endobj 190 0 obj <>stream h4 E3mFElUR o $nSXO3F8qIaK( =m&ı80EL6f;[ЙpH7<1RGSXwғ6 endstream endobj 191 0 obj <>stream hj` 01z؀ endstream endobj 192 0 obj <>stream h{ |y֙!$e% BX¦DaB MYDURjnτI} }=s9$" s&|q<^)HF$ಹMHC;9ʫ9ј(af]ˈVq|h;9(a'.v'CA sQlmD?5?@y3^{/o\9s+Hҏn{I#Q,_:N9AVꊬ',"u:ٿqnrT<αQzMfSkSwR !H^ᒚîS[ayVenӗP2<"%:y6T,OhHZG#OWF~O*J^kZ+ ҥTZoH}ւK*G&R6V gk-+?1xižtG{P" h]Ki𾤯ǙfAc [gD oi;#t%i6;)/܈uO#*J= Ii[ FAV#'ډ>HHy3/}B5Qn#t5Q-G ]vT Lv%5վS&ҒE#/;lr.=_>33zyz{u%sIbc]SY,)H-5]JFԓ6bmP+=(]мu4|MT[mEJF<.3 y>|]ըct-񥧻 9ߘ:wHBzJ0h6"rӫNihu 'kgaM]JJ Jnp#X|IDHFن!u4qr.ܳР,) E34=bQ4t': BP =]) N@ IزM29@$n(ZGS !㙜fs,BPa%{QTg:wSDg4$e{~I9C9[jsIre 0vNO\{;ld¡h/XY+*2M1>5NW~;X2|Qy^Rr!R'N'UޕιlHiӲ/@2Le|\V1F'fcw ȨgVԭM'q蓜+Jic^ 3OhCɯn˴_ &.{gɣ-BzWRm>p5_|y.ubm6:R\?(E}:kJspĘ3x<b80mO:0F;ݯvέRȟo`Z[ i!0-LpAix|9ZU VDj_J/xyT(uJU(De mt1aT,9xfWߊ9;xkc 픨C{6lhA!4 k ۩@9ELWE}8x 㿃|{̟? ZkO9vćO~ 韓O'~|y݂roGT)mPS%Y>P }r?}yiOCyV"S 0 t6[qm|F٢UL4 iy`ZC<L0^AC,";PF (ss0B:L#4Jk4J~Ʌ'h2nVz*v\LQ- 3nA؍ ~ow[%@McfF<<|/v3qOc ME'w!eP@>#|/yP`C6chwgKR< {L@9OS}T3Ol3>ڹ@KoTC^@ m%@ iC!#WɧX 3=i@ BOC!Fqr!{y37,d Y-z#B4Z<0)7] 4Q~yH=E,u.%wQHHB1juV?A+r+emM7[s]wɨGtKG|VF>m" Ak3|JCO r߂>{'ROhӅo>ls(2~iqc[N=Se`ZZzx=7SZ~1S-s-#^K㰖GZj/Q5@M~4MzTx]}B?Yf=[v!6{ (?lcKA[CkAE_]d\-.b`?Vdm UKVQVi,|2(!QMi}*" Dz-!ƖG<,Ơ?Hzh;Som<X?`w)YMŹcxo߳fPS!v!c17bN 1>J>![ cq;.;54XvCƠF3\mxg=0F OP>s8[EwjiS>_qCTJoW{tok=IgEHo:;m9s|?(<ުաǵgGH6mIZ3=AXsN@ekbD )~ߖ@,¬sZ01OyF߀!z;moPۧ_c6vj#͂3pڴ=ovga<P~O`_顐ӄzwC6c1_%+߁ lJa'J)~2g'Xo^#wCzU`K/+t4G]e梿hv?Zȣ*wf_觟gDrێ >Bmsq1[sWlvBgy}ʟ!e2yl*./=fS7DBvu@FB]j K楱/cֶ]p.U:c=o?vlxm<>ފ`}S௖,0cqGtvɣ>ao!˛  W}(^{C<͔,s2䓔]l>Ӈ{Bܿqwt?;6\܇ݕm=|r.g.+lmDCFG1!_зRgooke[(;:nz5Gㅭ]jO#h09¦t%ԗO/;/OO*ӣ3*ʐ2d=@/-`m6 qlMg`{=bfy"g]s[vj3fo1|F-}[K04/Яk4\ԙ`~5Yd2E[o$蕓8j 䁟lAӕcbv:n/T8j |hn6ؿ~>6p,%G}svGz30]BUQkS씠 B.d[avmG&#i Oi=g_!{r?ٲJl}& YX_? ZʟP~7}(#gU~< !fkh}^F{9vmqN;?/:Z;i c+[X; L@\\X?r䱜o[6f[`~[μL?Bfg a-6VZh"i?lَ}aff_ \F8Y8C=n-UyP6^GG]~/([) H"ζ[ߩ&!kೋiv*QECܫj27i{ m~?Y"Cި^gsCTy j,w^mQ tHNFth;ހ4GY Z-G1wMQSm~nU-i077'/dC]o{=ߞ/$-^e9]-`^{x͇/o`vIF[1߉Q^𞿁Lg!OOEHߝs=x>(x 0o{w<~Bs o+Fcuhcc̽(cQS6< p'v(ݝJخɬk=/tf~{C~w܆WrtfG1fÒ}¶Skï@({0khm;7=JME|f M4ܞp;dg;:ݼRD0r,*׿Mp_E;e~Ct- Rz twK0U@7PLm=Af31T7K)Q_ېi1?.P z?l Bo,Oo~mcG@1,oг;(Mȿ(Ysݸ۾G7Q= c?H˶5Cv(E9i4PI$~Kո\C6JmTO> =/L ]NmE[**U_ N)+)qں s]6Fj)Uix~_J!{Z)AxJMPT<`!9:o Of,?H~RE#i6XaOxȼIϼIG.^5pZ'uc'H/dҔbVz&7zI=kGz0)K sZ |fo)C *fc'}>b̟Ọ*)_hAϨX^' )/c/5aO}cXg)k70uߏE[Rz+>|` V;JAh}h}W);m&`l2<;t[q13-gD{f#t=~8MX]b!зa 'B֍KǨ ߅ 0:cgZ߇Bk=k;eGS4oߓ#;[շ_N(sz x|Dyܩ7)iзB&Q&ʐK 򇦩řՇ$aaۜ8;m{ Nv9_je̗YHYf]!;a{g 0?|B͝ĺ:iFEL4^b o@(-4ڋy~ z]ALoz9-yLݟfwi\$08A1He%8Zm-gk=,Q%P._D<'" mkK(Y ^:4`(U#h0qO8ZZVm{S(Oǜ&S=@Z&.@g wAaL6M5{"lq 8v  $Cqt ˋ9t~vHmZc'][qMدk!㮥%!<2G<<|,STiC,/*AVB(Gc* ӕa~dX~Di#_El@Y h8kO# y]--,J2`_.vJ>wc*T Yq;8>Inj`Qh piehgOBa!1 TVbڠDw9QByg~Z͏h Yx"x2L@u_}6cu-dj@0ڶYJ֩?*>J :mx[4D?c,%x1|`#f{yn:"Z}k$͐s- kuj=Q&ORȎyΧ!?{бJekm9F{3 ؀;<_}Tp}|-=*q7KCn@PS( tBP :  hZOZp?'@ Mk-]}YNnnp wp 7(ܵ½YR7 wpor.R.DV B-eR!0 [@ zQ6PLef`+]+u#7tr- |5p.3g>ur]>oٕ]]F8fÙِٰꊮ]vKuί_|)y=%u!~߿c;{7ޢ;!{#EwuϋO^q%qb֨y\w=wg˻;i]7¢?%.c0y%U׊*]t$wʞ=֬4MkXJД!)ISD]LQSh@J.Z^R;O~Rď ǎ!~ు'#'~,oBOO|/OBZxwQ1Z,Irz$T&1t!TYQQCQ&DPp!]UF],J%2ބmQmRԳ()%uKutKI!x)"D (6/HEzV~>{])I QzOUHFR%UN)6:J'͊{4j}M_H55M152Z_ԅW$Q_uKQ_޽mݫșh. XX)"pc`y`Y`i`I`b*P;no(`SB+ܜ+%h)n=0oJه^0P2@V /;Wj9n<9K=cDsmr9dW4);)/HӇ-_mDAD38ADADADADADADADADADADAD@<=WNٳFqٽ39i&r\Pp4Ung3sҥ.XR; G A(h;{fy_zRB_;yFA:8MyK>Yסv#t'Dуt~yO)2u鄘B[m!d@(PEMX:T16$Q{} q@@IQޓހGG3دC`4s0φI $֬]K;B>wۭ*oV3mtNYrOrOZive6;R&&.T]0+R4,ȑN3"avX{%:=VcW!~ '-*_:,0Գ% Z{-t߽p3?\5a^_?|(P jKԚ[z+M`ޟ}xF7?t_;qx״P 0DD endstream endobj 193 0 obj <>stream hTn wcO0T)b.z;N"drQ۟c~n_Z2LGm9,\itLޣ6 ܭsCa$V{x,%"=ϯtK?4πX?xjFb,QJڏ ">zR@3y։ՈϊP#QbݫjÖYR*El!U ή 0m endstream endobj 194 0 obj <>stream h{ |Tsי: C2`I!,!$2@l **XEePb]ʍĪjK.E{oDZx}~osy<~gʹPnH럐# z ]Z#7a/t%&|Mt[5 a<3'#iDDM4%8s(}i<40H)$cql(ϴ}bf|T$H>O%촕UM NxJqF(> h^nΐ2߯o5}{Jѽ[jJWo;9s'W%ķk㌍pm"K@iBX/:(o֢FQm^,)>ږjeˬT_"5)GE?ֽ:?p5Wֱ41%߈wPs!2RJ4*342HJ~-ɊVV^nqh!lPPQ|E(;ֺ0'B5Jׄ4&$[vͼ ޢtP4DSE=;ToA>RXCdD`J'PCD$R"Y D< F j ű1kykx A7䴽Ө[Ef!cZٌAky5u7 kt/* LkR 4RT7NTZV$tl ]T!z ٢HM m"sWy8EZbѷwIn VnXzȋXQ}>[e㻱$'om[[:{5 935yE@=r} fQ;v :>5WwQ}!OQ_T-!&Һǣu𱊡PbM7Kgg0-oh_WSXi&X5(뎢-em)Zyyz ]|Xr2uҲd!eB']J+c]Pg9qWEշ]o boq *CPMtBsn~?֥Ԝ:a_!֜RjTqz=.O2e,+'aJNMքv,W9{g"y#BsO˼ u8(&fx7ks%FTj17k1' np"ܱ<.rױ܁B*]ɍ@!c2+28\-ZKXWY7 -?-&2]b}oUt|#cˑt\XXgq#> o]be},rή y*nOXȯlKtM^%7QM-YׯNٶ4eEFMx_yQ i/c^1 )( oi#)!Ay*^G5^ C(_)E))_N#`k J?6j*\l l<Ƨp`.a>l>T`d3=l9fD $6i0- ZY`4k NC WFpphx l-jusZJ9r*Ar*oEoAd*~˳J'ixR6ڪC?rG\jl<`]1^l\ŢrJ{b9؜7Ƽ="}&hU@a4ڵRO9zʑ.P $QN۫}8 7?@Z+{_:=/> ܋FW`^w C6 D>Y?Wu~5xE``sQ |r3@Ws3NP?cIhqPh-4/e`-~{4:)Ɖ6ʕ:Q/)DC34L: N7 jyyV: &F\4TsI]Qaۮ?(Gɤdv#"|G?O#]Ne0!I䣝kt Fe8^a DC_aT1M&uAOBzI0fk;oB M(},x%_Tt =T[ܳJ~Β-';s+BƐn>c+g?My1w đOȧ1wayMWLǾyDv[#)Hq/o+~JE/@$v̓H--W "Xm& @ wM^y'S*U1>-6-w,q>3~^GFf3|eyyGЋؗ.q~7хslOZ`TK8az29h%X /HcP_LZ?PwZkBev7iZ ^q7uATl{C C?d{6mlSiiƢl<;)k@y_]xz1AFJ$]ˀX"O;X YE[&1kO6Jl.nJRg!m,2 7)@^JEz5-ƔGLƠxwж}`,3?%kR4wG4znꃳ]y t T:1/ӏޒRw"}<03=G7οވ_X R{3~}6b>AeXʭO T( -B&'PܻHLA_|#"Gih+]ZAJn<Y6Ÿ脳q4lp(ÁT$ⰋǁPAMv0;5{#͐Y&os8Ąbb&p+fl~q jp-p/gkbm6u2y9LT>FnDN )ߦ@L4c: [ :Zz- 2'V43&e"3pQ79o7{/M >xq /.K>難 'qy*7A6cCʿocv2ܻ#%GZ$ulVn[~ppzIlhf6D $N|ȣ2f'Dbӎ9g}Xm<kSl~?|^߷lf\gZ@--e2~m&ܫLw~1:1}dp;{k_26[ =Bk/L_ =3'q57ef;3{l6f6lf{iarƔ %:cfC &DfcQV@ 9Tہchr;P' V)4I:/׃րVh V#} Pw'ڌ2l(1)^6S$?9;[S l B.dd>gژa:LFL6˳=J~{W?J֟C[d?4eȷl=~!VsY1}4hHB"y^_SQ QGHi>%Y eoZòszha7#,\.iW3[p#_l8 Uq/r vJ H[`<} ໠g$z +P׃[Uh3.DGYf_BY{5DCO`L[? _ЖNK7G[qRSXeH&~$2UhfǶC?fcFoc~D:48[?{ i/ ƗvqcFჹ7+/b̥sx78#4i? />C0=:}^h6 &ḛW|Kgo1 a) kU–ve\]r lo]]lSf#_Llhf_mݺՂ߄ۧT{,QK|KI^xĿ>ozxO6ʴOLoBzd'nG}hߣ~UϢvߊm(_v4T!~y~~HFہU.`8L~"V.<2YaӳbVpTt` {(ِ?3w#Y`&PٖE9&2Ovjz(2b2{5R[ܞPyɦ¿Q Xo&nOXO kgwNy~)DcŶT~ECᾊ}02B1.&XMOG(Yƻ|JOS )1{*͒:r ?]:0PO||O-Tzi[f 7T&O6o6{({'OF2yW|ݖzmU߮GI\=Ldm6n0N=myȅoKEZ)1޲oURhbLR30RVw&!~6_ӸkYo-xtLX{-JrNz?e8am=zl*ס4 ٠Q\Hjߵڲw@.tW~IOS7:O=~yz4`r 2"NFr{£(rZZK9d`=cKH!c}LSToʡ{Vc赲1kcճs8ͿLQM)1L1/|g OV>O*>$}c=>|q-& ^^j@ٍ#Þ0d'S ֮0yߏD[;(Nt>RuꝦA:\ˤhro06PRyd8~o9g1F-]-gH{6t{q7a4X uaַaR_%Fė։z g}ƿ [k|&~1oĚ kj|vb2F$lN{3=ʨb?~lOZHEз:B!QVJX#]WN'omN߽Z3f'KV?r6!9 K O3]"{n{g5 aۉ_c>r7wz'b%"h;܋iԗ}))!3F*eoǙgn*k8Mxҭ@<㙉sCTľB%;P}Ǿ3M(%Ec?ÿ h8z<<;OP8fC m%yb0 HKh$HW9̗ ]'&H?o[Vh=ay@ #]߶x[,O[csq4zfˌJc1|tr\4ױ0Sw4>\H߰c! >!1.Cz x e"a+ȸkhGfHgQ9/E!~j:-c|5XR />1i0t8o+lA(?T%W(v6by *8k%~EMە4`J8 wm<=TȾMxG-@lGlghp}_%_o\aŖo;*fPVћڨLl/^_(|)QG?Q} P! O^BS钡 $Q{Uܧ[i+V:G [WCƮdMhad\8@ú'#ODg_mMCc=FBO\bѿt1dCc߭dJ~3fu y@27y1?!S.ϾW HUۺL6dmoB~AG 9V@ v{s#X;_4Ô+z?@y4X.w[Hz֑(p7 @'+ qVV 8 V@r}Ll{J)Vژ25hKZVk@uIu5^:n~ʬt?=aDB^gԻ*(qpJ,ӀυPRjV2}U1 < ep<>pxIiKh(!#䂳_oiH2a,TZs" X19]p%.J=FxD;G "l6mVt:To5a1|XNz49 LqSu2CYšGA4i)3ǶF)M*YYNBKTk~i{sonǗ|u?t<JbN131/[cNYLwހӏآO`>(-l:!h5U q6=/ ŮE@?u*ο" YlB]#АJ+6 ,rͣW77OzL/ a?0Fc)URPW)rQxԉ^#19/ Rw]@9RƠg䝂jOd؎i^-d$ @yUza u@| x荺 lS*vVPg?"RMl4q$ )7G>*@(oh7%Iޚ*~dn6m(kG@HAQ_P4R61d7_,7dfV'c88҆9 fMFjbyr˞ZUoܕWZij-/CSCr$QPVZʖZ-^](q5ө`bp9 N >FCYE⡬ȴ더mB<=%8,O65Murb' 8c`#W!C1[̑s׽ͥW\W]{Leg&'ǾVRN,2PeZ"T"F"JL>%T eMx!$jVo3x= 6'Xռ9kYQ.^߹9dB{;s  %֝:oZe}aB m̍f/ 45s<Ɋtr+;uOmeٗ{RUH3~61?h*Ƀ#Vr PF?@`?*o~LEl^#0 u:6:2"ᄪ #h!/5LAJwD)@9EE7Ѱ oыB9P0@ lg0r͖3r}1GzU.orX"kl~[Be&aG-www*@oj%,uh$OMdW5"D&6f<{%J+vlM˓r R,+'q9dXj9XG?xRĂ"L&PքTNҨҨdDX`r/xE^p2ߤqS9D4jaJ+\ԥR/Y`[_?a^1CNR.bb2̭88{'ѷ':ibH3:wdO$>0xdAe2b dJ_߮GRZ)D V?L8SqBGq4(+%TXG#Ĭqj9ɖ)._w?!?g& p_Q:NSpdg^:,>?fT*^$T̗MNA{Sú^t>͙ۙ&^!_kVO/a=İz5DHRUywVQ29ir~Dem\]|&l0-@f=$ @N \9DH 4n |;^w5?hiwOlhjr$ȏasoX]l|~؃3װ-:^JCEAZF!ihi)f 'BKϝuLF 9Rp9R(jo[Ě7ݯvΜPVfe5+p5o1>\{ ,: Q }8NZuPGBpV(H(0q$xYN X)h(5q74p^ &hs t`h*KA^s64|pDt־qwd~POBVwsmJgHns?9{&sU.nPys? jY[kZiJ[]% H")Kf(Cf 0@#h-S/,8ʇ'`BDhL|L11(D}8J#.pә=˜~oj4#y|ѳw}ǾU[~; !^NI-rӪv itG#mUyn/ҚkP^O?R')uĎd8X I7^KcЯfcmoؚ)}ϤD{?q: >KeFk%V1*_JWZҺud+ǐ/Cvl=i\咣sRq\FAq dox5̉)~4͡),4kdk f A"B@?{'4jq u? w\=J5P]0r`E;Fd+s6"qjXX2笗{ҁ51I.zܤ[?'ojliТ\5:yvz󶝦YChVf[=zL-w87]Ţ>cNusFido_y-6nsGlpyQ>?=L- {la5^>+c7I*!Q] cԓj8Kl /5 7<1jkoEەoil6Ѽ)8=,hfiZXۗ126B^"!N*BЯPMSyQ5'~> H@ׅZ8bU,IXR# tgfAk:mQ;đ*GU'f8W!k0^9n["QV$<>rgue(Jm 5eh,ŭMbirʧ1Oe"vjLOUȢuƙ[²LsViV"9X x-D5-Yh|^XTjeTtJ mUOh=/|'s=ӋW`5UF﬒}\*y՝kf9-dd%PS0]qfIvnK8rSl|A -;M&'݆)6  78PBb6⪿}[̱%}a͒lZwQ7m TR|ou?5Nr^ ;Pl@aZhj5H3LkU cEB(0H PJoKdLN*<{^& NL27[2\=/qCf$PE%U+.g++1U!N߁قgb󹽦>,Xvߧ( \lQd)*ejdΚM1؂p1q煮z*m3JSlzxtJ,j6{E 4]w$75gns+3njɗF.F?xHʀ$&iBeHM2$czUi99 W|/ b6A҅䣿1Vkhga݌阡"*CIF;!^wV5ֲTy9ְdjRB,8xp^3'$Tz]ZZkCA-ĎGBh0b0]*U,K(,t[-Fj ,%逫*gb0s#m T'fc\T(i[J؀XlaЮzU LeiPXj}[o^'ҔQk܁gpj9vmjKM\kBɦ;+H+czL$|ו*3z\~[ 0 OgpFCFbI&׹Ÿ`z}7&?VgЧ@jmvG`ThX KQ/ٌf/ ʝ a"g@`9 :bUWr۬nѬ߯CV:HȆEТuF[I,ȻI26oCH 㧩|::{ƜqJN`_ % { 8r-|u$D\Ek_k.Q]f+k@37kuEOue[{:m OLeJ"e2؟MI)>֮̏/] vzuMUG&ۚg&,jفܮfWT 'S[6l1ck2Rkoml tL_;͊_۸f<6" –zrZT7!JSy5sYC-|*B0?=3>Zó*Cam;_cDz+|4R +@xJi*gFtj$h&ӆ̂:)gR؍%`۵% 6C0=ְͩJc~ɐB]WwO}ްaS(f_Ii[nqjZ7_D0ayXa% Թ) R|3gY«N؇cx@ߦW[ZQW ZVg+JJPkk—~ߕl"rv|& ci)p"t[ M[W NH@%6ms?7qg,^ǃ:BHz^?Jo*IbXNx=nېL%Aj;Oqٜ1w';ט^WkԺ0<0G垑ۘ]~Tj ߿&k eq&%D KWS0sukNB7m'׬{9sq̯ޑ:џ$P(۰zB?wzߧ'<3b {YB9nֹgzh\ 5c?DEC40n5<[?5u,Nҩ$vu*T<ʆkO0Lw`,uԩ&ъ或 2 ?5snoozU:{1F\XbhzQĞ\0+6[J(t_plLd_06=0~ޝۣP Ws^4X=+!4LeDO@EW#xkxe~Ala*I JTHe(1*dZ9ZEd@@{h<&lC->|99 8\8Z0kбVك_>5skB6Y_l~*ӱͷ$CH߾Zl}FM 82YlF惴Xlm@&YeD@ L|I7yk*T:+"%=1Ğ7 ۏ|k oMͱ䯘9.y98V$~'O:z1yEW'н  dvk%?{"x7 kRSt}į-RTtƴӝS[㔊aT"HTJ\Ub~jkӴHE*RT"HE*RT"HE*RT"HE*RT"HE*RC BB~|-#c@]EuMtID@ $*@g g=0#03/!T( |;> ]` Aj k@JPYv^ lGGGܸ?n NnRp;S(2?1(p7a3G(ѱqWr祭 㓗TcɋCnB-'A/^m׼}җ[=xIso BY)33;&3McHqZU\<>>stream hTP=o0 +>stream hj`@ 0@ endstream endobj 197 0 obj <>stream h8ktTE_U}tBy%$&餻!t<;Bf7ˈd op;DGGY ;9̪ p\qU_4Ϟ?sW߻]7@ R/>Yz傗 @RD}ӆ+ RPGǭ}$a?Qvlw{Ӳj]zUz Tݛ bf`-5Ǟ GșєD&F^azU:.>8^OH 䥁I!a6{wcpqܫ}$F|^ ^p@hoBǿ6k'3fgZW$n*OfA 6},\!5A>=+6qg~-ѮcD0cw=p/z320FJRMfc#/joӯt NBVSkZy< [a;Sz'Xϳ~ .s'a$V@VI;JI!5.t%m0Uibf'K5;B:m#*^*\ElŢ_<2s|Uj-- 6M.|pUІ;_a'vzC#_›|_`qf3)"'Ku#;$a#4rg93\C.Gw}:+1D:[œNzA([;̢lVB$laI9Up^'V!lxZxɐb2,4 QA.Kp^'De&::Jv Bp> N k~IYf'Y.n&.DZ%o/b/ Az1KOU/d(-Iͧg$Q6X9;.`.)|~wl5ӧp7sh d8&z̦G=c`kI}`,ypǭ֎3 Bxзa55v|Ӭt'GzVwM*+߱pAy%EUn7ٷ͙>+mfꌔdSi q (t(>YBti? |6䩖Vlu:iILrTEV߰+r]A]G:B\ٌ#.';g" 6/*H| HUMtrTD(H0+5S; SPYߪ68YfP%ҢR&YtaTM5aN>/G GBFM$*w);dJPIwzKqZ!_NnB_6Q eEM~Ҙ3DU?[F w.!rj-f)]^:-ZaWN᧤bKPBX>Zϰ oܞ!JWEgXR:)9pܰCTUYV]+D 2馌@ J'd&]O5.-?qX ϗx{FDEVC9,e{un"=rMCyUBЂEXa-_ G*1;NBnG"3dR(( DhD:G9GrC|9l\(CJq/aKPW&Ca=ƻi83d#ю2>c1~zv Lր;EI!v~&|8' |ib;Ѧ}-_\اq #QģhP3ȗz*>V`0@!Ẵpk7XMѿ Բ_X9$K9Z.v."]nUx a1Be *S$!. `̆R-Xn7P7!X:[&wQنt>~OOX0K&0(HPK;6a˥Mxܭ+FKxOKJxGCs͵&=?/%*󳬕]~D^i=%}syݛ}pS%k\x~uj\jpÿ6Op1|1\o /2a1c 5J)I.%J$$AHQT#{AM㫀:9UGH-zݥDIG=tysj)'9^ruGHWZd9b=Zi%hW]Up{";AP֡ah$-)n H1JZHK_%墦WK endstream endobj 198 0 obj <>stream h޴|Tϝ{7$BCٸII%B BhD DAХH&*OϊHA@fn؄{/3sܹ3sϜ)!Bi"q1fܐM!dd f D"edMG7Gd;7N'$r$*Rߠ~Dvf3y!V QX.‘D%DMWIˈBx*_Gz>ʝDaC!/#V.UÆg>n Kr刋l d7֕}.O+`\`&~!&hD)=}ID^i,IǷbX4s0D{!mmE`ʠSNӟt a1*lP,*G$oSjz[2r"D ʼs y^0 *̦(qwIhǩ7Ch8144m2ZyB/i:͠4\z^y Ji-Dk.ŐCx%:I]ZA+iOo -HCiC vC8 u 7FDmw3}D[c(_I.M/ w })#;:@0LG1Y_ =J' <חg.8@StNU1dgT2 pQ17"EUXAQרg41F*Bh =F0.^BQG/@FǗ[T-D^HK}7}V>9>G^T'w+M ]5n6#V;8RךGwĨvSu֭| u/T==WNWNzPi JdI:R}voњwXovܗ}u=]6H!OT3,O5\*e݄O|:|$TV4 fpȕt\-Ƌ^à[7aAa!FQSK|`T1RqAZ_yaF Q( =\Qގ)1AV, }LJVO&ӈ}*wEpq?bQ |padW3:F=445f (#ڨ #ވCLs#HA4b|6_>l3LFԉԓ'ٗ -z|Gn]R;wء}mZj"%9)yBqM7jؠ~Tt_|aCC9,SpfPLEѮVbUؕ Af ㄨE4gN̟2)HKsQ\l3|rn4uv?=ٕ/u pOsR2Q$WRvpl 7>O5װFxC{Xƫa&zxTJfOt-$]J8tY4͹:fk΋èwF}\}2{=<rxJNOdO1㕳=1O  kcF9Ww;_iK+ ~?n!/"Beꍀgbg/k(ftP1[1eU)={;cc7 wzxtFq%'ڭۓ OB)kD ݞaҮD_u;tvS3%Y˙쫠*ٽ_VuCu)]S6 S%#g_;<“KwU/<"u.[QAN7 骷 p8DtPhbm?bP| Z(& HܥJv(OP@Ya/PugJvr@jK+L`RţBP^,P'ەJwa %trwSmmmnn(/o y(KlQ#߭:R DG;s\mrT.@r K[ѭ35,Yf h7WL3"'s;guBBΰU}r\ip]TcԣJR[m.cj ԴnMS0%e$D{VN ZʔT UTtM Duheemd>Y_ >YtRhbg=dʢ+kx WCyQ;Qz*"'6ƥ&50)|6x׈ *( ✜3+(4υP}oep 2XbCװȭUWQq6YF!6CTlYI $~YnE qW؃t`Ƞz PP Te>+^#b5cad+vAc!/wtj@ X.ࡶ[*2TjE1bm!P?r))ĸ|_CJoci 0DgbEkZ!^&Hۍ1|#ш"UTR&ĺ ȇ! RS~6UV6A6blh}`Rl/}vYfMl y#_\Z|'њ6g\hLkja  Ϩ4b!2?#WE'tyﰊϤhkUVX/H7xF|ȋ*l~R X E=IA 7èހ vhy* xP^ѱ4MYZNtրhZh'bvfch<ötc$M4I3ğlȅ13nil)uePv aس@P!;C UЧl3s<- .Z̫  Ѳ7^ RK-?1l;iQx4ō`\G}JRr?g_gL~b A%G }Ci>{;̤^>{@*w{~Az}sʣn]R0U7-O.ý'9q KB}sw֭zn1F`nJQe?KdKw1zc _+sp]Gy&__e zU=*Oc$r|9WqYUķIEP;㱍|Jc}1D?Ø.C.^i:MyS;5)}Jdy 7__('(ݗ,H#9VO.F6NpjI)Qoxh- gcۃ픭緳 \ }lUoHӇ^__l`:`ΠXjp%zB )ttBYfYk_Ps1}|*dG Xm4e r/jLmXmw툃:E_jY6R-k!gPTsn<ʯ-/Ўd%ṃL5'<5Pcދ+=eVj0[K07 m[vzP^iǺsUģ40z$NHDZ YeUYwaicy\X"PNMoA%\G`L* DIOiaw7N^|dopiQysIn76J Osy%AK{m40mSЉk:-!r5gZ'?=0WXhciMOTĨ(\rL; k95s۞Up{V9X^Dk/1O5g >~^"%65yFnҲ}p3\{-`)WLߠ{'81?c¨"愫 eS2s@̜±(6/Qy6BAW5KQ}K>Æz k<&jF\*|XoKQ;LxY?F*>v~*2~7 ߠ=J\w:Gc,Eۃ9`%eRkآ[ kPNYPo3քFIP\5@!PJWp}AKc+' r=8#{[;\o4yQo|;^{7od>C>"BG۬)0gd|q/`EC6 K=K5>è >Te@.hȉ /) cXb3JZhk<h:jɷ4_cz9zNA?:zw3ַ/kQ"dKq*GuAuq*Gk̓yTΐ .Hם [4jn4SW5BXYcQQgts@hFAC$h]'pY v:M> ?~q Qg󕲩V)uX}M6dֿYkX2q[3paC_e3DM>Eqf̍?c} k ~/d9p߬ۗWi|g8e8Ge<ٷwS#_WLWFhǿ}|U?Te+rk4^ bCalfrB4xv/UiylJ:?s-SRޑuZvUwm3Π]ymk 5o)roY^] ;k 4k!K#S ㎽e{?מ6?)OƻlwX;`&˷w߿۫^RAYtel7=K⪉hG޳)\J-9aށW)IT`- QuX]Q˫v ZR$>w}nU`c¤kukea}|j5W{8W-ǯCs؜9X󟫙^9lguy^ٮrzO݂guB:|Gq-#}O1Xx?j۾Πk"n_fy>!I)bfz/lP^xg] n7y:0ԧQެDf!: Zbdgop/?rcy(4>#އ C5ȗ2Cl\g`}zguX}W>0|y jaPc"A uFXHvZE[贶tLŨs~zOūxO~Y@ς l=S:`.X>3W n(x$?%;jU{'-twGahw.]nak=#]naUo= 6T6[~^{d6=&.Y-dg[i"}{Sl˘ކ'ԙz D^S(/H_._yƳ|{:H(& ua߭IS%iM{('_sV"lGQ/3!y q&UgYXW>U~["cFX8=eضD\e5ʆ`{ 1\"x{Z‹ᦃv8T+p2q=CnqZ*%RoOP \@x1tP[ ~I{TIK@of߉y ;.ja~{7;>O{*f{woMOQH?Hg40L5o?wxyH{6}D[@ ܀ըۘo_^9xo p,PW#{"(;tr|O?⿣w۹'!|LÊ 񞅛cAu0{꾐"=E Ț{DgwU;=B= H;p‘p D{.aäqtOڿ$΅;vp[UnR{n z/):MwG5~wltp?lVq0p~= p1PsK#qAt_)[f(h{@=mePO?T"1;snJւYf[pmM=ݽ4ǾKnD {fhZ)M{b%7r=ڿ( u)u.l@ ]C}ox. AYXUP2n\e0[/PE`S֧ar4PR}f\/ƠnԹuBVwB7娥;hg)ʼ w2 `.\vXo caQmu/O({~DA2/'yN^Rmu.Py }>⻧y"ߝT]w,y]x'J}ZLU*aVWixy,o(-nȣ*"2Խ<+鸹yGTHOɫ}=#gsPbi&s|c,5[}#:S7R)Ch .h.T e9.S9Qy1nzrƷr]ߟ5u[.svP2Tz|G6grVG|L6+_SwT7D*=u7g +3bTubzsO9'4/~9`7|tfv_J)*%B}dE':J]B~.Φs'rrCx_+e=B*gqh]aC-W?OH:xhȢlAˢi .N#Heۄn)6u]qփ0z]3A s?S]/o~ %< }h*hxʥrQ886ΦF5@PաC~lFJMUД:n{/=Av}Cmwc>~֒P/!? ~xšsmEυʢ}wډ;BGS.V?]7pmFGN{?m4G~4ҳ=IDͥxd-u5Ec?xuE2BѳI=O+=B.;y"3|>Rt,.̯y2x?Ov˯j:.T1ԝB~%%~>m]iBiK#NRs3:7I4PBcqBcpOՋB HρdEgلUB/_N\mpup^%ρg>4 {`7GN%/Ml}~H[<D(Y|rApϭ`ǚgv Q_Rq߁o7k8K'^WK`?xlñh1/Vp/Tփ epp)X;a _ @+XNt0 LSE`2׃0 T kxD|X jA$@@Ԡ0iہYg\J āX t0>Ĵ1Cv']s)'|g8=.x3n, 2PR ,@)a@ _bF_A? |>g1#>4S`xt0{&pXW J,elЄ/A#  Jp. RP F"0HP0r y31`(8~?x<6"/&z]8g z;[8;!DcԣNjfa^j 6S&n.HANFJmnnR/nnQPWSWQWRkUY.˨mdaS=r)\jZa[,B nEѝ Cp#\39np\. |0Lq'` \DPƀ>T$@<>:}\ Q Dp>J~C}M}E}I>3&uzz:@FgU!Aj;:}5A fhAh\pPay l0 &T }ŖD6#1sXնBxtUw/"._DEv`\k`f'`` p:0Ԃ0 T(f 04 R ̹fiu:BG3Sc#CSQRRPSIj7)6n׃pF?y>X[`8t`)8NKtvE'NZ('P F"0F`zZ3@AyzzOH@=O=Ggi5=٬ >,\L8ý#{/t=ϼAljU.yR=u谇i-Ԍ*qOt|L=mŮE/qrfV9J`u uZ[y)to[=FwSO{}^c3}}{f t4TsO׸k{j}}qv{l=ŝhrFX蕔vraLSԞķ'J:$'N%pe.x\Yn'7m{pݴ瘜LL2fZo ݆ Ba C d6w 96`ЋѩVtC'8tejЭ:{^S:L[nrNmzfꀚw *=.bY9qFBe'y%s;6>ev|oؤiKg͌^=cw_Y9fϻRV47iI.9ULvl[G']v-^?GS;x5nC!ޮ&?ow;Bo?bbf~vzzSbfSX}a%j~˔\/㙕Y6;e|ZBIЙkJ|7#q//99),R+ E;_X8bD~~^)?Χ S JR!?wŞU84P-TS% \f!;-)GEF.ɑ>*3^)ʰC42WWmĔLe2D(#_GF}P0h8C媰ۓ9ȴ$Π땉D2ܠN9*њU(&bVah2XA|<ƲcP%Ȧg/4gjQ˜HyD9ibmܐ8.[VVST9vߗg7$8cݷLO ) Ӈ(J6o3?bDaFZ)kX"Si&^o\̎Xʙqa#9N3b5 3y}=%ƟѧTV_3PmT+t!0$\\UTrʠ?rQX#쬄ݷ]p cYy S񫝪,DF8nPb2i>*ܕFS1IQU<,<ZrmhYA+CtZ}_}Cɷ,.,}ӳ{`[GN_6+UձW`V endstream endobj 199 0 obj <>stream h޴`TS7 B %7, !@nh&`. JEF( ZQ7"b *"{g]6KTw79SϜ93̜%jb2(wȰU67g`\qaIg{"z3H7g;e@DZo";bbɤ⇾KH l0i9͡ {awr_]^?( wų6z<'| q7ܫ 4oq^]w<\=k6ʍ]Ex %;ݞhP QUdȢk g5ޡt K7L/IwRi\D}Рan7M~^s='I[#Œ-Vq7qg׃sYz[>EQBBg4\Z#ֆ7YTB65&rN;;|tǩcע6F?iǝz_v ~)~r=ʿZqJh&]Csiͧh-EtҭnC],tӝtMKiC韴h%OWӃF o !Gi=mG1ZFz~'ೖSGTIO3h3v\h =GC75_ez-M ck^6ݴ;.}H>Ou 1>AU1#&8У2K:E M3J B+e;gO-Z`<:~)\~O"nj0P5:\/! [N"Wiߖa2ݶ`jÐ,òf8\GԲȣzDZ}Va-Fci˖H'1J}>?uo:EтUt6u6,,>AsW|%fi6ƴ-RҢZ!! !,Rh 1^6֚hʹ8-x"-Ak4FGk%Xi0E8$nv-VkREO;;aQ.t:mw!U*R;fÇ 2x9dHOڷe{ѽ[.)%NJliyQb֮-LB%gz ܾn'ܞBxxʪ.c"İ35SqݙowǽIuy';.k3I:jÑ&3>˚3, UԊJOjLQpY W֞ uM^3{V` -n33 rq ҏe^>;y2-ewl= G{}F!eed?< h>+1.;A(>N9ARp"Iӳ/d%"BGL|?-jΜRjZ*˩P7Fќف #o.td#D+6q(L{ЇRsD]镭zj..% 8UKwЙ< . +{T޽~gYӇ|OѾ(τ4_-O+-] Q9bL*+`BR]Y79po jH/-~+q oBQi]2DHr@,FtG$A-7Nɗ9GٞhvJ7J/(M Q Dh}\(8Q&ciTLh&MDũ@e$֪l O\j/^I+ѕυ[U;W %J J,w+*nmYDeN.j'(k=8BTKfTxv" ORt(VB1_XW* ǜL fk x:)⅚)Br TjM#k\JQJw!]J[t}EU䭁RVP@/00\& ּSL i^%ŨF4%F|B#C},%BB)];辎@8s#|t8چcT<>XR0';1f-4)[+:۵DP]AuPrrE/} 5QHjj :Psa5gHߝ b5Dž#|99NӴߝfq,GA̞4C|(6"ϒWoN BZh(UqRO;+B{#v|ri!Ҹ01Kh^_Q #b0큱x@Ƈ* ? L6 (6.?!p7:F_~6 <_h2e8lb/ԃl@/T]Izr^qf e*7P[!Ŝ^`P|oDxw4b6@1|$F݉ԞCb`\X|Je[Ilg^`1+s*?4X!c"ʀqf_!1xOPe5gǘ (Bh#wyB+7cz# En7GQy+q4[1 4i9+~lKMuW-M IwF1mTDQ!6zi|J}nS({pAQK(J3ՕbEq; ;5`{![ְ5-I\TiFW n\Gҋ~ќȾ~N{(my)޽a e  ?A!R6>p+ Qcڻ/ Gy7Hy6"{̧/Kdf@Gq鈃uFo'19:Wb ío`MlT"T́sļ&ihwֳ܏j3/hsy&"\O&QE9ŽR;y}-d%X^LmUSbn6Q=_x6?t< 0Y`"/g/Xjbce>݅Z`U&+;Oӷ">Wހ%}17J*V}l^9!pB)<;XHJZ ĜLӯe`Ÿ3\E\aACfW:`nY9D\Z=(X9N#^FWaCM/] nq=[_P;c ?P+/r7j~9X?{1bJ1Si#`9(A {'Pk)ϸUWQƧ0Nur0 [2A]p^2.|j*>aQ `'^I!p=ܽqU߇~Ur4ob^OAD:賑uSR}>]")^~~>vݺ,JGe4je}R/2paP!Ba]OYh* %DA&!6H{x9FuN!1gi&Lwn<'9ZD@ev-0'Rk: SpBօXo9v?/œ ՞]^j_n\3"K-p /L<34Ks1ǜ[8|MXH`m`?BCr=;opo9 +=~(~~!!w9MJ|, _*.k&'`L-y߉>'j+Mycv6XӉK[Cn51hl՟$ඨn~`3jF7>si|ij#Pl*ޅh>0kTs#7`Ndh{XEX[,F+{})C@ =:K| d?"ӌ sIoCn2g"2`=ĽDy܃=0'N(|~s~̇Y'Q-{+Ku:8,շus5!|q6 <"sF,?FB\.L%?:'9#(;#sгB;wf=Dn'xs{mkXc} eF]1S{boÞ{b@C9& ͂(L?)>DϦ$eyKtb^ǚP5׹`Aruq51or|^,u|ͶgHs1 \O@!Ϟ(s'60*<^;)^{9_5xx- K ψ@[6\J]-o$¦nA+|s ֛!b[r=y[9rE1%d?qEbm l?=dgڨ%P,qTR:2/7+c{IS{;d:oJSν2 c8i~+wNMM[eoSeXCM!ҿ"=+`xny>WaܳԾn4w" v6؋Hg=r<3:)C_(C޷PJ#{4kc/&8 ljF;geDَȟy0kVgۣjgĽJ.ROtsL17:rrI6FbSٳa¾aop]1NNȋę5[Os22v;ʵr':ZcƋ=bnc5g䊽5rXBPrFH5{n; ߹sa~!g~qyz =ߓ{ys:.('PG8PeRD#HzlFo kJv^*>R{|>vww.H}xg%j+c^jwr*!mElo| ?_1cHΠ>^1jqŘ~ |hz>!kzf`cS3/{Xg>֙jy.MTLg{1@KV|ODОׂUD3j{t~z{Y9~BϨ.m"<08Sű@`1Q,jh :%raw]vGuNWSfMwF')G_YKп,|? c 6esP47vyiz4.(OC, S 3k8;ն:g秿SC>Fk`8i1v:׹!~) myuoOV<>2{fPi2 p\Ϧn kwA8|;$U?Si*q~qWc w`z4\Och v]lPl s{2MG0.{Y/vga]zK F6(?n)'1N)vWܣ?M]~5LERlZx&ĕa:&0(L Gp&ra7 C\_|`GؿFu勳[A_[-Lpw k ] Dȵk{X\Ș!yLjLօ2_xn{sP;#Զ'#~<TW~[x+Ռc|ZXmaCڟs"}`[pMwiܾ;8}) /Ǩ׆9P8BLJ%fՅS =>N+InyPLۨMJm\1%Ί$q_VƎ06Bæ1ZhQߊg/#r\oЛw-(؋tqW% -b%P3F~ } ueJg .[߭9gyVmX䜩mQJoyZYٽ(ǚE %vjh_ [ Sa@NH ~RjT=>@2SlR߻ Ns^5FȶG#FxODa(ҥ.B߸}M|\B"#Ř[3_ҽQ<[5=vݢ!-?*Ɓ"NlUݭ_2lja-8.W> O y}b. w3; &kXj-wajFvᶞ<{Kav1B< #37 xϠ}|3U!0UT3g7홳QL_3UzuAgE'EEA">j :CgŽ`%CRʗ"~Ce>G(&e9DYd^%7?@iqpD9Sc{v (Zu-IS, .0,ew$EÊ<8b(*S-svLqbS=BS V4PQ d> }$rES݊@V*V}D/_FߪV=z^a"˚siZLUpQxq޷; #`.]L*"Mmo 2>ro+~a'Y~Y,߱|raoXUGBfA*[ԇ|Y٢)),|)G]Y>fˇ,˻,eÅͲmor7Xvβ5,Xlay|e|EX6lby9gYayyG Ö́|Ze?ǜ>89Xgy3{ӽòen],os87Ydy﷣26 '7ƥʙmayY^byz3g~~YgFOTTm},O ฾q}}@y&&H{I{ww_!g_&-Dw¸~!НwmK'-o%-o!th?iyn Ѝ㺥@7V}f\7tqrO>EZ^K\>xSxv|Og9< o|A|p^vˀ/ ;n|pt̀Y]97!z\+UAF &vBC.#VB[]Jq@s!$TM(AP|\)i%! !5!!%!!8LJIT0 =wހ%W? 0-?+i'OSq7`#3T~7vIhP3&"yxBՓ! izijw<4MF/W'GzKh!B݄҄u NBj!&"wr*%d!d&d"42_xL _ #[?xk~{ "ເ 8 x0xf8(+SSD{ ]IhB!F"Km :Bk !*B+ ZAh9eZBh1E2E E+   *# '#s%!$" Q0H< ~}???/~ ui:8mۗm{3Wܛ흻s/-[ tރ{W|e۞d==mW2]6{}1Z760~lt쎱P!y`1zbY^3V;uحcV ծ1um83rp8 'o׆1 WSȰUh]=lc0m(PghhC e:%[/kۖ6NPHx١,M*O- KA#3n\Ypp}f]dmfMdufUd0`fEdYfe%~Qd 98ffz"ݙnOG:3];3L6 ҚO' ;ng?cgdmmvk36z+-W[nJ8P`vo102mPTLͫ_Rf>5Ey@yHI(W)TN+CJ|H GJ1 VHeR r.*o[䘗G⭼hmzU}<NoJԴ#;1FXDsV#,Z<6wNH:,\~p/e7Fe˗#}Ooj.Hl?BLdgGaT' o?f2$dUBMf {R❘Qwya楪ބI8K :/@FKz28ANpt21jR >e*cKAW*HT/̅Ɖ񨅉О+2I**\xwԙ"eobݞj04,kʴrfSyʁhKB{.ſ 4 åƩw*,[19"q+ ?M}) A./D]~BǫcƄ.ʍu*|zQ8NQYt M2 'QSN "h1kh\>r_XWKϴbaRe}CkzwA4:OsDGVt=eτWݹޱ}D!zk+w~^c 'Ȉh';x܆6I%&N$*ċvq(kfkG8g %(5g빾 ֘h:5aO3Q U QfRL+px_eW5B-s=h2"e*X "wtHB?;OB`G D !wrG^VŊp`//m092$UsvsT塺*'NdT G99ʈQh2DcJX/a xyz2R u>ZUadryJ9Oq3'K-Ƭ8bnw̡_d(dɊoEbN;JY:`{uEYL5UI':;ERBd գcdlD #8Qd (TW,TB-<[myRj(AQ5'p͂h`п_Z;mRYfBUnT٧sJ#^O֔'^YC̯4Y#^w̮0zM21N &mkj9Ke>Ձl ߿U80E*'ct݊h_SzOQ#5QKڗ79O!2@Q^.! T1oۚw3\e(NZ;3I+}ݶGfhTblXuږ%!Y]ɏ< #OtQUDdxQ{&Qp ]Ƃ͌'\Q!xWe:BO<ZF_V>'8fT_Vɇ 崧{∋_Yg(nSG4*v^_;Pku˔,螚îʮ*KV;#ϻ -K.ޕeA(KGz=D#g?_Z"oM"jGOyd\*YE¡XW5^im:6Ȋ :%r,ֺ&̇ўw/ƄTF!U2单X}fwp`DaFVfᬮR/a G@>vLޢb#&XS&yfaGONC[KfUHVj+͞Z!Ȟ`HV#{orF9h2!4arREyfg~itnFg.|= ?z) 7mq*]'m+˘b;:|--lv~W1ա4r.`Klg4}瞠5 <2ZcYaQ0MM4)tI?+?//.,~nkQ %A,R5UiD?N49p"ξ"̩hɊXʡ`ަ~MD@KM6H6Ul "Zמu?њ"Fnҝ-2E"Cyx*`~&5&&GQ LPy6?qK R!N$"Bė^~7ŻWi8fl fRHa\Aha"U+W =19Td !9}UzJׯߩk 9˛N4Q 7P.*z AM1!g /W;:{5D1MX_yu 7-0gE| S<mAЏ-dVΟT ĚzN[i׮Cc_Ubp4jJpZv_Op֧xЊ7HutXT+^GоuMc^~i&n4D xֶw_`w)GK)T3"F]OQFLB@=[Q=ȁ8ƛU "=_|wMHi-HĆp9c m̭ Թt$dqkNm{XWAOCO1,"21hZ-$ZIwɲˋ!}FF"| F ROVz}VNMck///ߛv O08ր>ihQS%,2<-T1?Vؐ/b.?ZQ' Sg]Gk<~GjSxc@P9АHZ'nhjb?1憎k"!U; z|J´Q"=v1X8b;JU=RTFH|LЀD #*G6VAе209 4..˾6٫W'*goS:"슙/ >K_?+RNe_in^Bz*۞<&!uQӬgp_wsz_)(db?~l?@>b)pٮч*P.0OCmUnwd"; +)uSo"Cy~%-^x>q. ɂn1y?5j5K])p.ͥ^RWDb o('%V UoșQo6_3pL 'L]ӽz_|gB=|i W":cSoic{hw@i4+ml(,e{iu-]!NW*c['ћ G9r~)̒qchj|ny*((Xf%xlB\\*w#yI^8`rj*~2&a\x{&/l :Ly6{fv^ޢ jyFV>sL,SBﹼ?Zc+3Ŀl5`{D* ¾~V-yȦAڊLdn GBsn?+>J5/%k:_+hŭo޴+7x0i55ݦ{KlIknz 50nDG`%5q^r] jxtdvY 9;\΢z~Fy<;ƚ|n>i}[4'jQmˬA,-FjOzqz9b #f3u `-D8N~_TȽ"R!^1?dq^ɃCP3<DŽ:,msAyUp42E+L$粖3J[*jJ-*OOK%UY^mWKs@y~hX) j8[cVi;C%\ (̺AwGAB^)LK dOtZ4A(GնL,DdzҷyMh]9EuO ANB}jta,f$zQܔVGbmyM8UZ=i6HT&5 :Khl:HKJ 3Wc!BH 57ȌV:} ʘ/Uaf^zDc_/QWE{Tw)'ͩ=*JT22H$VM?IE!58k@lCU“ c=/o=p%+.< ZR xU*PJHBs c~'{;CM)! 0<%@{nfáx\ŗD^@mj1J*:pq:xZ'k7 wa%)s&pÑXLo)3jڥ-9_"/Zu.4.<:=Mc%Id3. |dNT7͡eׯm)+]O7E%".Q?ĆTswڛYMYSԚLhd~ĄeyC}~/Uh*UYxCª'߼*]]ʂAoen}BaE oriKpIc 03| (8Avn'q *ZK=}A D*@*)PU4 2)XpYQ'{\gpK!j|m:Vҩdx(%M-J65X[etLjLM(#1\~,3 :NAA9y`|< 8Jɀd!yq(CYAUWD94-Ѡ|Todxҟ0`9o~4~#|EQDE?נ8^/"("("("("("("("("("("Q@YhDّbs>tf49Sz+ϋ/hFd΢cjA󁅶Jmwc*lvȆމ|By]T0 #bP9DI45CM+jG]-D} *؀6h+ ȟh4\p?*.t>l?>=O5'$A%HTHlt)*zGO7ۘ%X͠6<ݟr=:no$03Wei1/3Pvb(e Hk}2FVzL!e)E@9/,_P7C) _K@N!ٞ;P Ey0W[n#(J8Zzh mBfh9n `4wMa-P'Wf^GscЧBu| lso8ʸ3y%CkF7]qۺٷyg߆ ;74w55wlݼvxsEGkkoضfxs zqxhlPnh5m0ɿ `6rV75?eOA7Rөз((ZN7 Yh}V)Krf|Q^9WK/g8V+ endstream endobj 200 0 obj <>stream h޴|Tϝ{7$BCٸII%B hBhD F)tH&(*O|4"7w&D}|3Ν{L DBSil 5z7Ӊ ȬUG ƙUDψ0eD.3}I r@BU(0‘xR6_5dxV&mh@Y ;JJ)8e>DK<È#OtB*T .ڳ-dR9߬T|mfDq!8BL&*RR4""/;Y%*o5KEȱi4^wLh.A'tt a3*5jP,@$o4jz[2 "D ˼s{ y^0 ˆ*̦)qwIhG/ @h$q44 i*ZYFhͤY"͡LzZ\D!bK:uzrZIh5Go -HW@.iC vCvϿ:h#m>}^݊~n u/iOis/ wȋu)#;OA:D?п'a,t _a1G =F <חg;jq~Et?T*]Ø21%2tD8(F1"FqQۨo40-D#:4/}a SխoտOto/›.G\wv;g߃qJ_kfj<7 11TAnu+@I *}/a'{yE|S^;Tϑj{Eo>;ЯoњXq;K\.w ~o$'\*Yj5\*e݄O:|$TV4 fpȕt<-Ƌ^à[7aAa!FqSK|`T1RqAZӟKaF)Q( =\Qю)1*@V" }9LJVɸG&ӈU*wepq/bQpad0juzF445 (#ڨ#ވCLK#HA4bVE|6_>h0LEԅҩ7 6O/Zp=ݻvҹS۵mӺUJrRb˄5mҸQ麷ZŲJ rX̠W ':#]mĪ+A Qi< Y0eR/22!?挣g*hd9_D@(L8012)Vd$ܐ$WRvpl kDQ#V#i.̄PXJ5=%9<"­eXI.9HՙwlyacͨU_ftD3S+Ss܉xlO+9S˅ڧ?Qa.gB]~+(ɴ%VTR^̈́xP7ꋀgrt_I}PBZnP1[1庫U)=:cc7 wzxtF߬q%'ڭ['!L]SrF ]=]# ޯZFx?OvgU/<5q:ޭPjb推 g: n[8[?Wb"]:z41Ιn?bP ڨ(& pG~Jv(OP@Ya/PMgJvr@ jK+L`RţBP^Pg+va %tIWZo4W=uoۣ[//D, cUppk) rOQɉ//mE|q4[AZeaV99 9#R26UeqDž뺦?>N=47wKIuӻ&zo-} 3XRF;7q雜D ZʔT UTtM Duheemd>Y_ >YtRŁhbg?=s2JO5UN-%w```E(႞€Jp7*ҹQn_sG`==jAQ퐮"֞Y=]uDrc Db(]RypD, :P矌g㮥>ȭsڸ}eA9]uO!8jrn#}(gDk JPp$*QDgkHRţBB=GU'iF9n_uhFMig@ ~*6UL׍ ͢*Kr 6ߗ?Wc #B2vb MRUzݙf}<.>u0b-j4 Kh-%kYh>]KxiQmE*-N5JW Wl,bYln%H`<Ñn a<jũ(G6#+sJGNP u?7k#x B<h~wM `W #di ϒ"PbU #y{jfS7ѓY7y?A{j#]vVll'_x!–[ Y!ly~ #r@gnev7_ȥwiGq56dPJ#8hD."SН>}P4{LLL*9y#=z&gϾ488ȫ!/ @BJ1B6`}lf.JbSFwooGqw/F̫40|wPYmRAm~E `ho>/fi1fO˳l+0F I4EY<Ț8{6pʖRw e06= ^Wvg KZ*WH6dg9`?Ct- n i`/peey ,ײc'm q@MW v5pѭ$*"3< wc oLR6T_,?ljN f& FvV? ýU5w򖚇1W5=Լi|jHy՞G빰4t| 7y7jݪ-&qcD[^T=UKAD|q=ɿ>e~:@i8J\jUCp˟G4D ̯㲺ho_1j^ԋc;$0N'{b1]\*u›򦈗;DOj[R`U1C`,6N_DdLZ5X ^ѶFv:_٠.MSkcgPTsn,ʯ+/cЎd%CL5'<5PSއJ*=e6j0[K07 m[Gvc@^izsUܭ¶ʃ *H7#]8Gt;~@GD|Foi1`)2DA-u@vYi /~YB@~noZvRc7mymyy: l _>Nȣ퓗ny[.üldIF#An: W2PM~>d: ޠV0-u6C`M./kyqËZ4hxlއQ6b}y$׃<һxkB-{XS=/=gzռ'|L3#O"{: cz| ϣ.@2_` X1ϵy[ vgð&_i KFYP|gA@[T4?u幘;V)^Ap7? [l}K^ .Bٸ$oqL^GY'1Pϸ)/7! }DYؘyu#5H=Fw0`,4v`5xU[}Ca΄]Wɧ|T ,|ln>fc]/uD?j(ES`iVZp,ִ zV&9z PnA b(ݧlYPcu(gZ` y:E55|j= l稊z:#Rozk)jg5l*j}YX5:LN C#8;mwR>8Khhpw?s͹lZfj]y ~jk|p@:fC8' T c1nxfk7`6ЖM(RtmD]nw[#jMuT"Ey?[rzo֖jSc߱kz\-s{z76ثFs||]=Uz߶@Ty{A:gW:OU[(w#XC'Q7pC8 e3ː)ųXx([G"C9. J]Ǫm7]l6 ռЮ|sYdܱl'{G{=)zx|nkP^pH-Ʒ ojT}P.Fnj?[MVEb4хl< ouyyw(s>tUJ9ձXKBDAWu*e>E aR5:2Npֽ>zN G>wZ=qg&6g/Pc/ e>}'aq̅>mt6cQDjx/[Yky]`\ޓyY]!g\ˈzz7Oڶo3ڈ[b'T^ƣveRYr [ =kk'ϱ:S-](S#G8|QNݱpgy(p?o +r!^/?K;OxΓYڟsQ xo9al3B9a ;{s< ~3}.+PTi7F<<]eShF]Z~cF{/M1`"9<t zl/wO(2l\g`}7[G_Q>0y jAc&:!{ꊰҥ yJ2>Ƽ1%`j#j]?j<57wG0摓ͥ vF-e k%Ӎ–Hl K"$ђn?c^y̿=Q6ǟWf,uW`5^aKeVqT]tƻ?E*6Jfi ۜC=N'1WmŷPߥ=.s1r- Ay}l!"FC<ګ5A{ljo|sg`]SyJ=)(a4og6ba}(>s)=&O՚ZTz]]^_Wo@[P;z}Z?XS.wOmFJ1z瞍whiSwA&zvohNq#53&M96FJ]NAbX1yLװ`3ǒ@4m-1ʱETNd ek-kj-v[xA}ʶ!2F1a>HM5|v`~ [#7S7*îy^~vš6^cGhjKullΕw:XCѾ/8K[h648K%J`BהY0Uae=ޑuh`u@0AMjˣO..,[WWѯ:{5M\AHanN:J'Mf[EvV^6?0!DyDr!ruϣ, @P9. L]nm..InC}U5?|%za?DvI[֧k 5: z羢e8>[C_c/:ˊ^޾{ʗa򔍫S64P?[q^ dPY<Kv]Uk XKAppݠ _[ÿ5Žo_l4N{YGpq ݻwxU0׻{k x"+8tZ@?UlJ )jP/0Iݷ1Gz.8J;\ wsN[ ZY ;uGנ0C/?οW_o箐`燰vY0 A8+0 ;jA`?#T E(VH#?=[Ss܃c;z! y;<DH}% cTwA0I<Ԟҹpn7a nMj@|_ۭ7A%Sg p[ݞnsvzxU; 1w{#\Pu?\ ct{8g>< ݗ_7ևY> |A!{"`O<~Aۏ9H`݌;FJyG(q*8kWqû50ȵ:]x?k޷E4se -2m4;&em7_B70n<Tzh~VAgĘub| Z-n!E?%z #e?7`OE#Q9J@PT:|e1nAY~dBͭ߬u7kY3YK9 yEa(CF}t{څe!5Kqug h}gX>vgkRʚj]޸sZ(º{pGy5/"?zeا`=KxmuXzMC lOk,D#h>¶T"\W_{_sV-^O薅?:ϨɋA3__b,aɞ*m_iןtEaZ&Dܬ^Y oDVh}-QGjp64/& ?Pk5z }Sf̖@D~OT:O- F)Tn%6Iz% n$5z_~`H|mA*iOlJRH2I"$#m}q&$9A>#1)9JO#r|@>$=rCdy%o7yFv|mTQ6D^$[}mJ d L|dwϚz,҃t'c+9gd%_rwpF~%OGr%GCr|@q["8^$V4q(>I qr$8Z%9ƹ;H5=N2T]!x2%w1'8>38꺑trJΤ#I#=0PB$C9Kΐw[ y#r$~ŷ^ONq(6dYA!}r߃d'RơT l"ÈAm!2 $٤?GkI.%!Fr &A@dy %C@nl%-\X9?i&E;OWv2䋽4xn 8ތ̱jvZA?FXOD(nzvhGXh ڌ|hjDԀmy#lu1f - B` /& / U~r/K!wȝdm#ydNZK>00dDI'|8Mb[GڐXC}8Mbc .yt GЧ(:>6$r&I%wL)'3H)%4RBޤwSOEz$IO7b$$He/e[{G CQ[wbanqMX9_L"g}1i`=y _K&kS! y,x\Fb22L"2#cBRH hOU܋]Iҙt"IFRI{hDD"8aGa; }Nз5 KA~ЛhjB/boE/&q#8yy #wvE6r+' -Ln" |2%s7qI &,RE 2\Clҟ#W<}H$31w0JB G0B{ 2, ο1vn]$ڭ9[BgrN ˮ˫Mu޺u7;(7y( ι<\%|1Q<_x~ȱ"Oֳs k<[M)OU퓕)$De}2돵)Hc/P J}2 GySu*\eNJOR!פԧO1OMIjO$Ok'I EK„ق+WU, 9&>ZG9F2Q$KeeEη[YZ-qy]o.6WeY#f{\ɑg5eA|`&{VԡsyU5\Xk Nj+ȢM1!X&/lDLhLzz^01dFƎckGeDqɄM416`"XXIkL3quzL8ԉVLɛℜ Swzz;])n,"V-+z3()ƽz959◿=|iWݯ_ffbT@fh NKK}ӳg@w/jFz((JrR.O4˹ g1m3sD3:b4C:IV>4e!jN%B-᦮Rc-//3 ]S6g|S}bJ؎Q&l6&YhKX5Cla&shddkJ9";zG; faeAi0sKpDx1B6`6ڴQǩbŒ$q6- fq6- Yvmڀt%0-b#ji^a[ =pmF t%T n4CŲ!r 5,l[ U&bYP܁2Xk4,JPm1K,fb-X<06t8 %ز۲ȲvWϨ vTJj+gmln[a5>d3g3}HIU4WeFNuUZL7n[Vbu*qʹUϰV]MjOxzٕenuoBSHbߩ*53p32# gFKh"8$)LSl۶8Tbˀ;R1 _~ endstream endobj 201 0 obj <>stream hj`# endstream endobj 202 0 obj <>stream hTP1n0 :Hvt1 ivԔ@˃ut y#yoE'#8 GP`[f32e86{*!i8E^gѐ}vG ,B>t8A1hrM[6ȚJ)R ?.,oi{3/_u7bfq=}5-8wY- 0}gj endstream endobj 203 0 obj <>stream hTP1n0 :Hv0 ivԔ@˃ut y#yoE'#8 GP`[f32e86{*!i8E^gѐ}vG ,B>t8A1hrM[6ȚJ)R ?.,oi{3/_u7bfq=}5-8wY- 0j endstream endobj 204 0 obj <>stream h޴`TS7 -@ذ$ !Z(A$"[hD x/* fm)"6XP (|;l(/9SϜ93̜%bivv/Ԇˠ`Y~i L{MDfDѵ:w$* qzL_8kk&£ZY\.p78m֜/ (˧^;j}U 7[qB|i]㈌u3<> рDuWa_&V{ x^).0MC7&IMrK& 86H{&m3XQ#zqsnU8=K/Vz>ߴ*5~_FK5Zٟ-4fl!9Ps>UL=rE lc)^߁qsZ%N'o2qCk*fu4<ZHP NB\IwQMKZJ^ZNtO+z5*L2T oZGcM$؇Og-= G+b G䧧ʹ/5_B^E;nAn~'vzvޤ3ޡwi=_!;B>O}D'紟z?EKGc82#jQtB 9BJَD묓,)E =j'PO=K\?ZI-G ZۭZeu!BvةZBj(;2/m zF ?/;:$kkC՞qqD-<*ixct8lp ?F?tB~xI|H?O:Eтt6u6",>AsW|%fi6ƴ(-ZjZu!U-}ji:/iZ"ZDK֚5њi)*,AlJ1mծ-6Z/:hZWVj "J#ȿFnju|Æ u+*e,|=Z󞚼Лgw+\Mgd fg%&'K?ʔyLK$Lw[m)ks<W83 .-W'bxVl_K2R={S|$.# kBPB<_r(˝өߢ@l !BCB <ɢ Կ[B)pH-(;QhROVp/= Yۦ!~abx*/-;K˝]Zyy/P{ħS%dQRK&$C&&Q}|Jx_qdyG ;Y<+%|Zp?OFģShFWK`4EWH+ 4obr~2"%2Y)*/ƱEZgR*ʭr.ԍ"J4g`7~:^}4{Ї҇xų;̓7+[[\ޅ]>JFpСgL 6toDp`4ʓ;TdQoNWxgZj`tz΢삉D~J=ü=eYz'EZ֭0d{ya#/u/뚞Y_ aHP8d҉PSzHIFc7g_H'1flj1biAx(MO$Yv/3>/ s!*GISP^JԸ+"KfMޕx,?]mEoG>x-[(A#"+|t`U#ӈDc6h@~EI;RōKkywBLBQ6eD8q|$WJ>փnԶIcX>1$%1*c)b|m!6╴R\\x]E}(QjXUeQTu&o3 " -sr!W-_!N O`(1FĪ<^g_x8Ի2|gnr؟֭sXK Ȫ0R |R]B͔A[K^[E*(lz)3L/fdJ${}+hG|Bh(/%=ٰ2^h?D`,q}"ɾu'br1^.l}7fQP5G݉jYr?Gȑܐ!$s]hl>62m.D;BmD5'|/c!{m\WNsٛj³)W)CA,f y>{Rc M3FP6ڭiV9)_)h*D}+J~ QL s.بnܗ.0*WO%s.s PTJI$= x++7i(J\'~̭7\ 5(7-b+'Y۩c+ Uwtc/⺱6`,#uz/w藃~E㔉?k ߯RNqyvˁ A }ث?_KymX~6v׸R0>}qr 554 E ]/׬i5֟1~†[MmN^zҦVtaLRyIIthE]rt$XNc֏u]) YV1>FX@])u mRA@g04uc`#DiX#v3xjTT@sM-4~^ j Nj}[Z|s_,=B{8h ̩󰓠˫@K^Dh} PCAAB}>c~i$skW/ U\Xmc\NqJ(__}Hg=E)ޘa =A]ugҪ %;_m X>X'8bLfk:1wuk<|mԦF 1M9`7h>-j|a"a̿c.4FD5єBw!gA\eB9nH7Wb! iQ_}_Ԗ-AuO'9ُ(%5~4h}R[ 9' !xHLꘚGL'+)0~7tk0kA/TK׾"05П&]TMj~I4\ rPl'[E K0?A,z̆砤!VBsp=u$ߋ˽t9>b*_CwĚyE XL8-aFW'#}*3^zkr_X=Şx#jPAQ,+-b} {L9nWovI3]ŽDy܃]1'(r~s>̇9gj1-+C5:8,շu`s5!|q6$<" sf, ?B\󄎠L %D>:';#(8#sf=Hn)x]ڢl~˨9c ۃ6g9^j76`ތu|^,u|˶A`gHs) @BMg79hsD @_ϿjʵE7r*w3s 3 RGa)Jc4\g>XV\yϼopGaܳľn6w" v6KHg=r<3:)E_(E޷Q(J=|رJ\^>s]%gr2 mlGOE͵lQg53PqbSM({Tly/e;4\{b=3P"qft򜌌]or뿶Xknqb%ǪvX C ;S, #Z('< ;#$$= F>wܹߨsVƵag~{z ?ߓ{ys%TCu{7P{Y#U(2XiA_G 2cvuA;^\`g( >C;^ tr]WQ`S=k "4|ۣ_LW1`L smN޷""gu7YrrV+?,EY)~/;O0>>^1ZqØ~|:(z!%cZG3z)֙3ufZkr)֚j)טloc9:7S`|⌯^]⳾x֩|Χ?_q lxĹ: 9TqorT5XCy\]5(njMnlTTm`❑}Ic.|>4ӆ#8ļϘlM`=Ͱ]>@ɠ&ǻhMg>w|sGt5z NΙTGP(O̿q4bun`=FM1o_7W1F_W[HC`:W} 7e:u.lQIA3O"jD8?9&WVҘ"ꫝ@C8u- U5lļ Y>8WV~п"- BЪ,_rT =zS\hU\l9Ao1Zʁ~U${VogR6_X}{GkchHIK}Z@11Rt}? qvNhϪE;w\߄>N?\ˋ84Q9B垂3WZ;s`;f9cg-s/;07ws\y 0e<= }u>Zq ^{=^a%1B]:4Yq=:î6Yn AA[p! LUq)w(6:g.m1WY`j\_F[qY`3;.(G0l*vEߵa-kG`~WoxH /*kw֤~)g,\?Ƙx"ki`Xe-up#z7Ǖ {w!oQ@vu)fWƇwJ-`*1-( NMra(7 C\_|`ǁGu勳*XA[-; p0w1j ] 2BZ\c } {.f̿qqlFOqlF b掋/f<=9[n[!vގVk?ZyN!-Tj߱a ^f>-⭖Pg vŹo^J-ߡ4Pf_NI>kxQk(xclq&%PʳwuaO ?wpyv[3L&javxgEV*ڸ6ʼn/+ cs]r_faS-{oڳ;|g9Ow-;mA:`!=aڒE 鶴/c>j2~j3u -֜<]m,tT6o7fyg-kͤKR-ձD^mxɰlwx$njdA?)ŞgO (^w}e}'9/ q<ߐ[ +H 9fR+C<:DQ4p;7ҩ0FQGc7fnkKFgr\]<ֵ{۵ïgب/W`6-<{ LQO:5_Dq06N9"}QodP?{;413Jt7B_2Sèys ;t*n@Oh;nqNnZz-\BU>t^7UvWp=[Cױ+`HBvxGED gŷie>Z0ǟ[A/iuXRkSU+[ cs8nO y`0ɜY|{3vSʜ9˜9hÜa*ؤ6 :(+(f+o"Q~(+boU4 0/M>B1A.|h!"*VјrN+ê9߳kFъ3|oIbAKߑҎW))c0L-Rŕ=b?sY\'6Oc*v)WP"_|+F%UX^"˚siZjLEp1$q޷;#`.]}@uˣ)R&?I-!ZAN`~cׯ,g'y({,GXb?)-|o\ qWi,_|9G]X>e ,|,aͅ.;,omodye,Yle*+2K,/yXeyi?KQ;)'Y`8F XsXeye˿YfY˲!,8Y+Yge?9r{Y,ee ݜu'NR;XsYJXnc 7,bYȲe>ˍ,7c2z,ױb2,,vLg2e dI,Ya2eX"BYưfrH|/˕,W`2e(K,X `eҏ/Kl,L ,,Xz\҃;K7]!]X:tbҁ=K;XJ146pg,XZ\҂9%,,)z!XX䬟`8F w!<; :c܃8~ν,kwY\DCPI FWP\!  " l/WHU1y%cfۀmI5jScĶ6m&M۴զ&m5Hwdi33ʹgs>;{{a6 z6X %zgd/졒vS.=E;IO =J =FOAzMaN=mjh+Un!}c!ِc9X}&X }:(6uC4 U>@%{૶+VRK[8;A?σ x____`x{1mΧN$x<;0VL>)݀ۘo 0} !qki{H$Aj'$MB*4t;6Rii"i0d3R>)d'œl$+¦ 8R,)M"Cc#=ue.x&x\?y3lOO1"8 o^ln0iׅ-^jN*%:L'yHHSIw[N$9H# ˲8%vh.Ihkhfդ*R%.R4%"ffƐF]$')NJ#RHɤQ6H#=A!b >kOoo[W3p||||/`|;u5pݗiHHxeLj"-'5H%:b"B|B%ܴI"n%BGK!ed2I&RI&I$N'yC&x :18~~~΂X&9v>neK/إvwUtɱ]`ׅ u:%bcֻF7F]V{uVKVoa. $uuɁqfGֲWSAM&jR5_Ҹ2MB!-k\Q=IRkMǫ*AURUuG=6=ԇHіUΎJC,BrzD8" X>wlUV`^4) J}pĽX .V* P?](ZeZ V+U9+] Uf\/.SfENaθ,3]L~5]L&mL嶔)=) DM3'yOr_΄mY%{K[M5خ؆l}6g=n}*WYUYﱺ l3+"OɳLTY X܅eKزiqUq q8˹JPhi(38g<=2܏FrGrs+C5QsyF^)|ۢ\*wTT/[YIzE{Uw#~p$+Y[@? #G c$g(oHpՇKr? 'b /ꙉ~dffY%j2 eI~QЕfQ^ψɒ:-sR>{yT˦ q3 𼋗_?x>9>a1ni؜  J&dJĢۦ 3$Qfd|*y`vtNr .[EefѸSDTl2-*T֔y5fشb4x%{&3nޞpjVZKdUvgf1YSRQvk̭)I11I)iƵv|@ @ @ @ @ @ @ @ |<ʞG+nVˬe6 q$̊L*ȤXbV{8Yn8@|v8Db҆cGf sgh]XӘ` WHcU̍?.V\+kØ?k[Pm3*Kv,G· _lF]k!gGMp/BWISꊀT:U1SW]]5ֶUoV4K˽%sK}5LQ]Ѩt+\AFIl\kkSμrallUG^E?Z?{oʖ],s ylcqMqvxԙjzlSgQcx >}Fk~]t endstream endobj 205 0 obj <>stream hj`e endstream endobj 206 0 obj <>stream hTPn0 Stt4 nvE5%࿯: 2<ܑ؜r{bޑeႃ#(Jĭ[u2E=Ti8E^`u{^@~Ev4$9'C)w> [BŦ-NAdMB׷d7֥7W}PHy33'髑l޿|j9ğuUj endstream endobj 207 0 obj <>stream h \U0dIrC'BDQSr:HdR5+2 V5<jYY6f6OVZYׄ=k~w^{M{A !ډ"ˈ|'bl%t߄ )*:C[}2u9G|~B\? S>xFՕ_߈t!z^'B#|׌+˻,:#a+͛QXW#nP\!BӅZ"|=>QpRHz;]Zt1&f!>irt=Wh WGA9O(Z)֊w46ᅢF<*/5_boAIBp8/s|}}sw@|E#?p>ۘE^uZs^-BOB>o^VbALhtQI@ tڣJsUj1WkbQ,F1ttMbX*ns=sR.ᘛˌ2EQm:V=B-[ 1;{WSJqe_%Vo5!35<,6M1whc'q$P Ѻb hczF+JLQ41wBns6gl*unF4mFW\QY~*?8Gl:ZhJu:Yl[{BC7p<#. }HtlqGvϓ68qBOgxA(^{$^o7[FQ}/W?!q}t }u whٸ#[q;)ګ ~Ma:j/G܈TO@>l=}D\*Ḩ`r&fg93'd7vţGL(%9)1!1bC.<肁1}{yΝ;vhY)6W\=55Zy3ElJie5Zt eGJt4ԂmC޶d͵'nײӜKY6AÏ1@Dΰ%'\Z-ٕ2:97 ն L'F`zk5=/󨃼WLN 2D7ge+eKlwU>XLɍj_`/q,y8ڒ\])˞ur=)eGfӛ.|" o?C˘< MH+L8@PB/"BeICLA5?IaV'1QY.=W٥)WGNϵGȮJYšSlѽo$~qtϝ_,5ڞD6r$8ɵ}c>/(͐t] 6%N>9хIN%W&Qe^46i[bȒpN\,(r`|ٜa.G/,̒dv0hyVe"mN=̒%{ |@0MjsjaB%U8t-A*Y䩉aYs"q|"]T&NEԲ@lɅIԇ ȹ^N]_gLU,s##Jb%ۜB{c1)&iNyLhホs)QaOEF)qx:lΨ99Cavdpܗ))yv[-:=JuQ][|>ڞf-97*y1Z=!!7&Z8֡-vn vg鉹 Ys 3X)69#oۆe|Ո00U&u Vq:0z(틹6V 暬,ygЏ\}pᵚh/Lp'2~x? , #'\;&)&hZdz{3bOtDatIr}k~~,ts"Gga̪ d+9pHb#"NGߠ#ʊudc9%R)OB1Y!X}HJ&2 .E%ϷP~ m4QL!CkB0>(d,: CJ߮}"Fh']P:84RPTiMZH_iE]"Ga!>X/'vs'knP^gamO90E6 lU3]]ߡ;4%㑁OwIkѱ%i>d'pH8#U F߂~`6>i/< 5XO~<@b>a>?O܍2$uz=~6s|V\UTNy+3]T<4Gp?sgr$_laUEq#A ֜FYTbʶ: -SN!r:n+Mi=έ!Ǵ #nt˭EZ=Sstt78t ⴁtŏWNg:ϟǤ0eSx^)m#8{B4Fcbp9s?j6լbKJ1|f4,ezIZ-_T޻[|煜 q۫* PϊG>329-r?n\}ϽRզgǜt cjw9`T6tz6=w¸ )?yыiXeT6Lc0몖eo>\g{PiD׿=s9\ܶs5:c!&in/My=L8uG3CK>LD0¿yhK=⁝9hg9k<y^w/<^=,u/WQ#LXn5;#դ3xɚD^{FxІZY?ϕBƚ'xI?ƔO)u]Jq /}VB$={kj9cm틞m+)^4_k];x _g=YL<5F!'n})/^t1fMD^_O2DGqW}ArnI6/r|WB|ٲ=q&Mt:4!."~?4..O?7I<_q.1͡rn30cLz+W|\\ר?p{.ޯ4C| ܼ('ww$į_1uf{֫.}0 =<5k/-{P~Fr<븣a \Q{S^i ˞i^6b;]/tqN}Tc6n|j=Ny~Vͨu籝ϩYm6Ř8JUF;~K2#|}?^z2Sdq|.LN+OZگ2hܪo߯sV{=jn~x0{xOsQa&<ƺL iV mYstomko7 NmymV9ƶG9e]=9wf?4'q{iA7w#V NTs#d߇}=O`I1?4aZ'ͪÙκ>(Gm fAȷ1e׈>lҀu31_5[[CsJ?<06lg3m׀gh֠ x7c~m4Л^06|\~8?dj\݀Gr:79/ q>oU+,zwUf2(OH@yOwyGyK7yCʼkQUe^Qeev+2/*2+2*2O+K<̓<e+MzeWf2)E)SKM5}B7 g,Hq=~6>c rpx|Ƨ> >^.MZ c|o1 Fkd*Bx>nO8rYf|O}?ƧM혩WheR=>$8sjtQfatAf~̼̘I;OK33Gdj32Gdh2oztZq㴘qTQtL٦Oקņ#<wEڧݡWuH-u ǪD;'DIIHY(QA;H~ Br$?HrI#I" I>:rS$##I> y=wI!y䭺@$yd/$!yIvD" $ϓ<\$H.#!HME;+r)%$$H2HIHƓ#K2b$HF\DBLDH@O A2dP!$đ ;s d$I;s<$E%!C]S֛$H$BܓIwHH$D: t#9.8 70$gt!9L$gt" &HDҁ}]ѐv$$$$~$$>$V N*i Cg?w[ |_g}c|w;Ao ^{2 ^/9,x< +vs'x < ;v ԃV6:PaJ lGFpA7`X k?~PVU> Ŏ/ w;vnevKApWzcBG w2euM]tG;ig3`޽ksp)P=8ܔΎڲA,v;^dq OH<]Wh-bBz?wh.m+2C~:Ҳ]]"3{VnΪ NӲ)pRqNh9:KM9 Y]w8 ^ IVTeʙQQZT̪*G/(_AWET7`fFUATO UA2V`$8ݺ/:Ѐ4'8 #7+'#8~߃5 | )>#!w-&x*x vЯ)A g?v>>l7]=Ln}5(O%LMVr^%wkס-$$KPPp_o*-NV?mj#9]H-4+#^xŋ/^xŋ/^xŋ/^xŋ/^xŋ/^"O)8&'Veo[g b'v\c }"{ K[^Gyg٣<bXÍ%"_T2Q D*D񙇘RGttM8Vi H= Hh!sdZdZؠI2b6xyf@+4ĕ5ѢӪ,Q,Md"TbA^?.U,El T|f,Q[l߾mcJ+*ˊleeyU%e}lӧKWU + +fI<2*lz^IJ[aIUqa-VQ8VUWP8#bL1Z/Ԇll%U8?*ҖWZ ʌ ,();J,F9̙F$i!r,6DEa ɅB M1K N&w7/3--ig1  endstream endobj 208 0 obj <>stream hj`V endstream endobj 209 0 obj <>stream hXn6>&,pMm7-iS d})Ƕ.le- Y9$3gJ+$2Qƿ5LmR` pimw0KQa'3F=M0D"–, HюA%F+zB 47Aa|3PD -]i{Y(8WQ(0̌-&?FmXh4`o ~Hһ{PJqΣY|$::m(ڠ%F4| i|\ԥc"&5<_.N֢l6 Un,dzPu]hfpnV/ 5ӇUG',4^&^qno%. {>Mtqw48ܥUtԟf7q4z|x%so(LG~}NuaѲnYaʫ^/cg1X9iX3غi Cd9&m6ł6.6itH!`B&a]EȷF6'2ƞ颿X4_qN -^0#?&W۱@:]/FRtpw NgV g)iڱ6 BP ȂT@(12D GxK4[) =38 "u$fACO< f*U\2XwYd4f_NhS8U/;cNwNp=kqH.s} yvS@zn7u7e7H!P;um 1R56J/íCɞ fF*AGMw- 5 4&' 9\O e [R*=P:Ff(8@'Ӕ_RJJFN&x-P[z"XXvzvՈ^vZGl/k7AvD浄 m N1I8Gqۖ m^}0Rց`*@l )ju(>"l* bp\HB2OהwNGu 86K8*eu\=",vQK.& лJ9w 7dΰv:ܪtt,/ex(Lޙƹ(:yUN`&6JԙSސ:1&|pדW-6'-sC_O8[p$H:{#H=$Ҝdy7RD=8QqG)Fږ^ؖ+%TX,%Jop|8࠰3wYMN_Ow~s=8,6bkس77klfNS-Yixܳɷi[h4ЦD_#RX̛ۖ:=?  endstream endobj 210 0 obj <>stream h264V0P064Q02P+-(ł]  S endstream endobj 211 0 obj <>stream application/pdf Microsoft Word - LittleCMS2.6 Plugin API.docx mariama 2014-03-15T19:05:05+01:00 PScript5.dll Version 5.2.2 2014-03-15T19:05:05+01:00 Acrobat Distiller 9.5.5 (Windows) uuid:f34aa254-014b-4162-bec1-26d73c06c091 uuid:dee8eb6a-e7e6-42ee-b729-03ebda1fd1f7 endstream endobj 212 0 obj <>stream hޜӽN@W7ޞtE$,DPdw?rQ$E]G4GƸ긺מ$̎EHek>Myڝ^v۪.w+cDip<:˲`a,r +Hi mi t dA+Av&nimtb&{8ulLYx%^57F܉;q'ވ7xA;hG# endstream endobj 213 0 obj <>stream h|0@en&,FPD("l/:;2=y^*$wbtih$լ-lUre\X;O& \78]tLqgGxN8DzgT;UDQfk, Կv+mF endstream endobj 214 0 obj <>/Filter/FlateDecode/ID[]/Info 323 0 R/Length 529/Root 325 0 R/Size 324/Type/XRef/W[1 3 1]>>stream h̔MHQ̽ޟw!Uf( \eH,p#+AНA ]NFZD bMG*CD3~B||gږ*߱ף5@'n&Ii- z_AQָ .iGM9 Ϭ 7XS ~5 K$:A6EN6;A>%*q-gI@6Dr=IsVߑć+|V GD;@ g-/&^&ɏ l*Q?ߊ[jn:|SIfT5Q7 QT_D,]ފ˝_%Ƀ7$΀Y+FIOqj}=?ENcd$vU$q)x|XY'q̉%3}9ȱvgL-si-9VmTR+Gsx# 2!dj>W-EU4giZt)ο,}{B` endstream endobj startxref 116 %%EOF lcms2-2.6/configure0000755002406300000240000222635112311617072013650 0ustar mariamausers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for lcms2 2.6. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='lcms2' PACKAGE_TARNAME='lcms2' PACKAGE_VERSION='2.6' PACKAGE_STRING='lcms2 2.6' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS TIFFICC_DEPLIBS JPEGICC_DEPLIBS LCMS_LIB_DEPLIBS LIB_TIFF HasTIFF_FALSE HasTIFF_TRUE LIB_ZLIB HasZLIB_FALSE HasZLIB_TRUE LIB_JPEG HasJPEG_FALSE HasJPEG_TRUE LIB_THREAD LIB_MATH PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CXX PTHREAD_CC acx_pthread_config inline MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE LIBTOOL_DEPS CXXCPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL OBJDUMP DLLTOOL AS am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBRARY_AGE LIBRARY_REVISION LIBRARY_CURRENT target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock enable_maintainer_mode with_jpeg with_tiff with_zlib with_threads ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures lcms2 2.6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/lcms2] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of lcms2 2.6:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-jpeg=DIR use jpeg installed in DIR --with-tiff=DIR use tiff installed in DIR --without-zlib disable ZLIB support --without-threads disable POSIX threads API support Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF lcms2 configure 2.6 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by lcms2 $as_me 2.6, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Specify directory where m4 macros may be found. # # Libtool library revision control info # See the libtool documentation under the heading "Libtool's versioning # system" in order to understand the meaning of these fields # # Here are a set of rules to help you update your library version # information: # # 1. Start with version information of `0:0:0' for each libtool library. # 2. Update the version information only immediately before a public # release of your software. More frequent updates are unnecessary, and # only guarantee that the current interface number gets larger faster. # 3. If the library source code has changed at all since the last update, # then increment revision (`c:r:a' becomes `c:r+1:a'). # 4. If any interfaces have been added, removed, or changed since the last # update, increment current, and set revision to 0. # 5. If any interfaces have been added since the last public release, then # increment age. # 6. If any interfaces have been removed since the last public release, # then set age to 0. # LIBRARY_CURRENT=2 LIBRARY_REVISION=6 LIBRARY_AGE=0 # Obtain system type by running config.guess ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='lcms2' VERSION='2.6' # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Check for programs DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi case $ac_cv_prog_cc_stdc in #( no) : ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( *) : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 $as_echo_n "checking for $CC option to accept ISO C99... " >&6; } if ${ac_cv_prog_cc_c99+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static void test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str; int number; float fnumber; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); } int main () { // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); ; return 0; } _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c99" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c99" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 $as_echo "$ac_cv_prog_cc_c99" >&6; } ;; esac if test "x$ac_cv_prog_cc_c99" != xno; then : ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 else ac_cv_prog_cc_stdc=no fi fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 $as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } if ${ac_cv_prog_cc_stdc+:} false; then : $as_echo_n "(cached) " >&6 fi case $ac_cv_prog_cc_stdc in #( no) : { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; #( '') : { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; #( *) : { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 $as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi #AM_PROG_LD #AC_SUBST(LD) #AC_PROG_INSTALL #AC_PROG_MAKE_SET #AC_PROG_LN_S # # Tests for Windows # # Configure libtool # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4' macro_revision='1.3294' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options enable_dlopen=no # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' lt_prog_compiler_pic='-Xcompiler -fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld='-rpath $libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; haiku*) version_type=linux need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; haiku*) version_type=linux need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: # Add configure option --enable-maintainer-mode which enables dependency # checking and generation useful to package maintainers. This is made an # option to avoid confusing end users. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # If the C compiler supports the keyword inline, do nothing. Otherwise # define inline to __inline__ or __inline if it accepts one of those, # otherwise define inline to be empty. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac # If words are stored with the most significant byte first (like # Motorola and SPARC CPUs), define `WORDS_BIGENDIAN'. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac # Point to JPEG installed in DIR or disable JPEG with --without-jpeg. # Check whether --with-jpeg was given. if test "${with_jpeg+set}" = set; then : withval=$with_jpeg; if test "x$withval" = "xno" ; then with_jpeg='no' else if test "x$withval" != "xyes" ; then with_jpeg=$withval JPEG_DIR=$withval CPPFLAGS="$CPPFLAGS -I$JPEG_DIR/include" LDFLAGS="$LDFLAGS -L$JPEG_DIR/lib" fi with_jpeg='yes' fi else with_jpeg='yes' fi # Point to TIFF installed in DIR or disable TIFF with --without-tiff. # Check whether --with-tiff was given. if test "${with_tiff+set}" = set; then : withval=$with_tiff; if test "x$withval" = "xno" ; then with_tiff='no' else if test "x$withval" != "xyes" ; then with_tiff=$withval TIFF_DIR=$withval CPPFLAGS="$CPPFLAGS -I$TIFF_DIR/include" LDFLAGS="$LDFLAGS -L$TIFF_DIR/lib" fi with_tiff='yes' fi else with_tiff='yes' fi # Disable ZLIB # Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then : withval=$with_zlib; with_zlib=$withval else with_zlib='yes' fi # # Determine POSIX threads settings # # Enable support for POSIX thread APIs # Check whether --with-threads was given. if test "${with_threads+set}" = set; then : withval=$with_threads; with_threads=$withval else with_threads='yes' fi have_threads=no if test "$with_threads" != 'no' then ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 $as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : acx_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 $as_echo "$acx_pthread_ok" >&6; } if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt lpthread pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: 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 # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${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: acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" ;; # The HP-UX compiler just warns about options it does not understand # but it needs -mt. *-hpux*) acx_pthread_flags="-mt $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 $as_echo_n "checking whether pthreads work without any flags... " >&6; } ;; -*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 $as_echo_n "checking whether pthreads work with $flag... " >&6; } PTHREAD_CFLAGS="$flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_acx_pthread_config+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$acx_pthread_config"; then ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_acx_pthread_config="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" fi fi acx_pthread_config=$ac_cv_prog_acx_pthread_config if test -n "$acx_pthread_config"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5 $as_echo "$acx_pthread_config" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 $as_echo_n "checking for the pthreads library -l$flag... " >&6; } PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { 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); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : acx_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 $as_echo "$acx_pthread_ok" >&6; } if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 $as_echo_n "checking for joinable pthread attribute... " >&6; } attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int attr=$attr; return attr; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : attr_name=$attr; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 $as_echo "$attr_name" >&6; } if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then cat >>confdefs.h <<_ACEOF #define PTHREAD_CREATE_JOINABLE $attr_name _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 $as_echo_n "checking if more special flags are required for pthreads... " >&6; } flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 $as_echo "${flag}" >&6; } if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r case "${host_os}" in aix* ) if test x"$GCC" != xyes; then case "$CC" in *xlc ) # Extract the first word of "xlc_r", so it can be a program name with args. set dummy xlc_r; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PTHREAD_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CC="xlc_r" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_PTHREAD_CC" && ac_cv_prog_PTHREAD_CC="${CC}" fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 $as_echo "$PTHREAD_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *cc ) # Extract the first word of "cc_r", so it can be a program name with args. set dummy cc_r; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PTHREAD_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CC="cc_r" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_PTHREAD_CC" && ac_cv_prog_PTHREAD_CC="${CC}" fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 $as_echo "$PTHREAD_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; esac fi case "$CXX" in *xlC ) # Extract the first word of "xlC_r", so it can be a program name with args. set dummy xlC_r; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PTHREAD_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PTHREAD_CXX"; then ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CXX="xlC_r" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_PTHREAD_CXX" && ac_cv_prog_PTHREAD_CXX="${CXX}" fi fi PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX if test -n "$PTHREAD_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5 $as_echo "$PTHREAD_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; esac ;; esac fi if test "${PTHREAD_CC}x" = "x" then PTHREAD_CC="$CC" fi if test "${PTHREAD_CXX}x" = "x" then PTHREAD_CXX="$CXX" fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h : else acx_pthread_ok=no fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "$acx_pthread_ok" = yes then have_threads=yes DEF_THREAD="$PTHREAD_CFLAGS" CFLAGS="$CFLAGS $DEF_THREAD" CXXFLAGS="$CXXFLAGS $DEF_THREAD" if test "$CC" != "$PTHREAD_CC" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Replacing compiler $CC with compiler $PTHREAD_CC to support pthreads." >&5 $as_echo "$as_me: WARNING: Replacing compiler $CC with compiler $PTHREAD_CC to support pthreads." >&2;} CC="$PTHREAD_CC" fi if test "$CXX" != "$PTHREAD_CXX" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Replacing compiler $CXX with compiler $PTHREAD_CXX to support pthreads." >&5 $as_echo "$as_me: WARNING: Replacing compiler $CXX with compiler $PTHREAD_CXX to support pthreads." >&2;} CXX="$PTHREAD_CXX" fi fi fi # # Find math library # LIB_MATH='' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrt in -lm" >&5 $as_echo_n "checking for sqrt in -lm... " >&6; } if ${ac_cv_lib_m_sqrt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sqrt (); int main () { return sqrt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_sqrt=yes else ac_cv_lib_m_sqrt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sqrt" >&5 $as_echo "$ac_cv_lib_m_sqrt" >&6; } if test "x$ac_cv_lib_m_sqrt" = xyes; then : LIB_MATH="-lm" fi LIBS="$LIB_MATH $LIBS" # # Find Posix threads library # LIB_THREAD='' if test "$with_threads" != 'no' && test "$have_threads" = 'yes' then for lib in pthread pthreads do if test "x$PTHREAD_LIBS" = "x" ; then as_ac_Lib=`$as_echo "ac_cv_lib_$lib''_pthread_mutex_lock" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -l$lib" >&5 $as_echo_n "checking for pthread_mutex_lock in -l$lib... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lib $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_lock (); int main () { return pthread_mutex_lock (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : PTHREAD_LIBS=-l$lib fi fi done LIB_THREAD="$PTHREAD_LIBS" LIBS="$LIBS $LIB_THREAD" $as_echo "#define HasTHREADS 1" >>confdefs.h else $as_echo "#define HasTHREADS 0" >>confdefs.h fi # # Check for JPEG # have_jpeg='no' LIB_JPEG='' if test ! "$with_jpeg" = 'no' then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG support" >&5 $as_echo_n "checking for JPEG support... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } failed=0; passed=0; ac_fn_c_check_header_mongrel "$LINENO" "jconfig.h" "ac_cv_header_jconfig_h" "$ac_includes_default" if test "x$ac_cv_header_jconfig_h" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi ac_fn_c_check_header_mongrel "$LINENO" "jerror.h" "ac_cv_header_jerror_h" "$ac_includes_default" if test "x$ac_cv_header_jerror_h" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi ac_fn_c_check_header_mongrel "$LINENO" "jmorecfg.h" "ac_cv_header_jmorecfg_h" "$ac_includes_default" if test "x$ac_cv_header_jmorecfg_h" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" if test "x$ac_cv_header_jpeglib_h" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_read_header in -ljpeg" >&5 $as_echo_n "checking for jpeg_read_header in -ljpeg... " >&6; } if ${ac_cv_lib_jpeg_jpeg_read_header+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jpeg_read_header (); int main () { return jpeg_read_header (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jpeg_jpeg_read_header=yes else ac_cv_lib_jpeg_jpeg_read_header=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_read_header" >&5 $as_echo "$ac_cv_lib_jpeg_jpeg_read_header" >&6; } if test "x$ac_cv_lib_jpeg_jpeg_read_header" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi # Test for compatible JPEG library if test ! "$ac_cv_jpeg_version_ok" = 'yes' ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JPEG library is version 6b or later" >&5 $as_echo_n "checking for JPEG library is version 6b or later... " >&6; } if ${ac_cv_jpeg_version_ok+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { #if JPEG_LIB_VERSION < 62 #error IJG JPEG library must be version 6b or newer! #endif return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_jpeg_version_ok='yes' else ac_cv_jpeg_version_ok='no' fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_jpeg_version_ok" >&5 $as_echo "$ac_cv_jpeg_version_ok" >&6; } if test "$ac_cv_jpeg_version_ok" = 'yes' ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } passed=`expr $passed + 1` else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } failed=`expr $failed + 1` fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if JPEG package is complete" >&5 $as_echo_n "checking if JPEG package is complete... " >&6; } if test $passed -gt 0 then if test $failed -gt 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 $as_echo "no -- some components failed test" >&6; } have_jpeg='no (failed tests)' else LIB_JPEG='-ljpeg' LIBS="$LIB_JPEG $LIBS" $as_echo "#define HasJPEG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_jpeg='yes' fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$have_jpeg" = 'yes'; then HasJPEG_TRUE= HasJPEG_FALSE='#' else HasJPEG_TRUE='#' HasJPEG_FALSE= fi # # Check for ZLIB # have_zlib='no' if test ! "$with_zlib" = 'no' || test ! "$with_png" = 'no' then LIB_ZLIB='' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZLIB support " >&5 $as_echo_n "checking for ZLIB support ... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } failed=0; passed=0; ac_fn_c_check_header_mongrel "$LINENO" "zconf.h" "ac_cv_header_zconf_h" "$ac_includes_default" if test "x$ac_cv_header_zconf_h" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compress in -lz" >&5 $as_echo_n "checking for compress in -lz... " >&6; } if ${ac_cv_lib_z_compress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char compress (); int main () { return compress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_compress=yes else ac_cv_lib_z_compress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress" >&5 $as_echo "$ac_cv_lib_z_compress" >&6; } if test "x$ac_cv_lib_z_compress" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uncompress in -lz" >&5 $as_echo_n "checking for uncompress in -lz... " >&6; } if ${ac_cv_lib_z_uncompress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char uncompress (); int main () { return uncompress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_uncompress=yes else ac_cv_lib_z_uncompress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_uncompress" >&5 $as_echo "$ac_cv_lib_z_uncompress" >&6; } if test "x$ac_cv_lib_z_uncompress" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for deflate in -lz" >&5 $as_echo_n "checking for deflate in -lz... " >&6; } if ${ac_cv_lib_z_deflate+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char deflate (); int main () { return deflate (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_deflate=yes else ac_cv_lib_z_deflate=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflate" >&5 $as_echo "$ac_cv_lib_z_deflate" >&6; } if test "x$ac_cv_lib_z_deflate" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 $as_echo_n "checking for inflate in -lz... " >&6; } if ${ac_cv_lib_z_inflate+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inflate (); int main () { return inflate (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_inflate=yes else ac_cv_lib_z_inflate=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5 $as_echo "$ac_cv_lib_z_inflate" >&6; } if test "x$ac_cv_lib_z_inflate" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzseek in -lz" >&5 $as_echo_n "checking for gzseek in -lz... " >&6; } if ${ac_cv_lib_z_gzseek+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzseek (); int main () { return gzseek (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gzseek=yes else ac_cv_lib_z_gzseek=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzseek" >&5 $as_echo "$ac_cv_lib_z_gzseek" >&6; } if test "x$ac_cv_lib_z_gzseek" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gztell in -lz" >&5 $as_echo_n "checking for gztell in -lz... " >&6; } if ${ac_cv_lib_z_gztell+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gztell (); int main () { return gztell (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gztell=yes else ac_cv_lib_z_gztell=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gztell" >&5 $as_echo "$ac_cv_lib_z_gztell" >&6; } if test "x$ac_cv_lib_z_gztell" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ZLIB package is complete" >&5 $as_echo_n "checking if ZLIB package is complete... " >&6; } if test $passed -gt 0 then if test $failed -gt 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 $as_echo "no -- some components failed test" >&6; } have_zlib='no (failed tests)' else LIB_ZLIB='-lz' LIBS="$LIB_ZLIB $LIBS" $as_echo "#define HasZLIB 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_zlib='yes' fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$have_zlib" = 'yes'; then HasZLIB_TRUE= HasZLIB_FALSE='#' else HasZLIB_TRUE='#' HasZLIB_FALSE= fi # # Check for TIFF # have_tiff='no' LIB_TIFF='' if test ! "$with_tiff" = 'no' then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFF support" >&5 $as_echo_n "checking for TIFF support... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } failed=0; passed=0; ac_fn_c_check_header_mongrel "$LINENO" "tiff.h" "ac_cv_header_tiff_h" "$ac_includes_default" if test "x$ac_cv_header_tiff_h" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi ac_fn_c_check_header_mongrel "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default" if test "x$ac_cv_header_tiffio_h" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFOpen in -ltiff" >&5 $as_echo_n "checking for TIFFOpen in -ltiff... " >&6; } if ${ac_cv_lib_tiff_TIFFOpen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltiff $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char TIFFOpen (); int main () { return TIFFOpen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_tiff_TIFFOpen=yes else ac_cv_lib_tiff_TIFFOpen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFOpen" >&5 $as_echo "$ac_cv_lib_tiff_TIFFOpen" >&6; } if test "x$ac_cv_lib_tiff_TIFFOpen" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFClientOpen in -ltiff" >&5 $as_echo_n "checking for TIFFClientOpen in -ltiff... " >&6; } if ${ac_cv_lib_tiff_TIFFClientOpen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltiff $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char TIFFClientOpen (); int main () { return TIFFClientOpen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_tiff_TIFFClientOpen=yes else ac_cv_lib_tiff_TIFFClientOpen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFClientOpen" >&5 $as_echo "$ac_cv_lib_tiff_TIFFClientOpen" >&6; } if test "x$ac_cv_lib_tiff_TIFFClientOpen" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFIsByteSwapped in -ltiff" >&5 $as_echo_n "checking for TIFFIsByteSwapped in -ltiff... " >&6; } if ${ac_cv_lib_tiff_TIFFIsByteSwapped+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltiff $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char TIFFIsByteSwapped (); int main () { return TIFFIsByteSwapped (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_tiff_TIFFIsByteSwapped=yes else ac_cv_lib_tiff_TIFFIsByteSwapped=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFIsByteSwapped" >&5 $as_echo "$ac_cv_lib_tiff_TIFFIsByteSwapped" >&6; } if test "x$ac_cv_lib_tiff_TIFFIsByteSwapped" = xyes; then : passed=`expr $passed + 1` else failed=`expr $failed + 1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if TIFF package is complete" >&5 $as_echo_n "checking if TIFF package is complete... " >&6; } if test $passed -gt 0 then if test $failed -gt 0 then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 $as_echo "no -- some components failed test" >&6; } have_tiff='no (failed tests)' else LIB_TIFF='-ltiff' LIBS="$LIB_TIFF $LIBS" $as_echo "#define HasTIFF 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_tiff='yes' for ac_header in tiffconf.h do : ac_fn_c_check_header_mongrel "$LINENO" "tiffconf.h" "ac_cv_header_tiffconf_h" "$ac_includes_default" if test "x$ac_cv_header_tiffconf_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TIFFCONF_H 1 _ACEOF fi done fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$have_tiff" = 'yes'; then HasTIFF_TRUE= HasTIFF_FALSE='#' else HasTIFF_TRUE='#' HasTIFF_FALSE= fi # Libraries that the LCMS library depends on LCMS_LIB_DEPLIBS="$LIB_MATH $LIB_THREAD" LCMS_LIB_DEPLIBS=`echo $LCMS_LIB_DEPLIBS | sed -e 's/ */ /g'` # Libraries that the jpegicc program depends on JPEGICC_DEPLIBS="$LIB_JPEG $LIB_MATH $LIB_THREAD" JPEGICC_DEPLIBS=`echo $JPEGICC_DEPLIBS | sed -e 's/ */ /g'` # Libraries that the tifficc program depends on TIFFICC_DEPLIBS="$LIB_TIFF $LIB_JPEG $LIB_ZLIB $LIB_MATH $LIB_THREAD" TIFFICC_DEPLIBS=`echo $TIFFICC_DEPLIBS | sed -e 's/ */ /g'` LIBS='' # # Perform substitutions # ac_config_files="$ac_config_files Makefile" ac_config_files="$ac_config_files lcms2.pc" ac_config_files="$ac_config_files include/Makefile" ac_config_files="$ac_config_files src/Makefile" ac_config_files="$ac_config_files utils/tificc/Makefile" ac_config_files="$ac_config_files utils/transicc/Makefile" ac_config_files="$ac_config_files utils/linkicc/Makefile" ac_config_files="$ac_config_files utils/jpgicc/Makefile" ac_config_files="$ac_config_files utils/psicc/Makefile" ac_config_files="$ac_config_files testbed/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HasJPEG_TRUE}" && test -z "${HasJPEG_FALSE}"; then as_fn_error $? "conditional \"HasJPEG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HasZLIB_TRUE}" && test -z "${HasZLIB_FALSE}"; then as_fn_error $? "conditional \"HasZLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HasTIFF_TRUE}" && test -z "${HasTIFF_FALSE}"; then as_fn_error $? "conditional \"HasTIFF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by lcms2 $as_me 2.6, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ lcms2 config.status 2.6 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld_CXX='`$ECHO "$hardcode_libdir_flag_spec_ld_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "lcms2.pc") CONFIG_FILES="$CONFIG_FILES lcms2.pc" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "utils/tificc/Makefile") CONFIG_FILES="$CONFIG_FILES utils/tificc/Makefile" ;; "utils/transicc/Makefile") CONFIG_FILES="$CONFIG_FILES utils/transicc/Makefile" ;; "utils/linkicc/Makefile") CONFIG_FILES="$CONFIG_FILES utils/linkicc/Makefile" ;; "utils/jpgicc/Makefile") CONFIG_FILES="$CONFIG_FILES utils/jpgicc/Makefile" ;; "utils/psicc/Makefile") CONFIG_FILES="$CONFIG_FILES utils/psicc/Makefile" ;; "testbed/Makefile") CONFIG_FILES="$CONFIG_FILES testbed/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010 Free Software Foundation, # Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi lcms2-2.6/Projects/0000755002406300000240000000000012311617072013517 5ustar mariamauserslcms2-2.6/Projects/VC2008/0000755002406300000240000000000012311617072014341 5ustar mariamauserslcms2-2.6/Projects/VC2008/lcms2_static/0000755002406300000240000000000012311617072016730 5ustar mariamauserslcms2-2.6/Projects/VC2008/lcms2_static/lcms2_static.vcproj0000644002406300000240000001271512311617072022552 0ustar mariamausers lcms2-2.6/Projects/VC2008/lcms2_DLL/0000755002406300000240000000000012311617072016054 5ustar mariamauserslcms2-2.6/Projects/VC2008/lcms2_DLL/lcms2_DLL.vcproj0000644002406300000240000001516112311617072021020 0ustar mariamausers lcms2-2.6/Projects/VC2008/tifficc/0000755002406300000240000000000012311617072015750 5ustar mariamauserslcms2-2.6/Projects/VC2008/tifficc/tifficc.vcproj0000644002406300000240000001032012311617072020600 0ustar mariamausers lcms2-2.6/Projects/VC2008/psicc/0000755002406300000240000000000012311617072015442 5ustar mariamauserslcms2-2.6/Projects/VC2008/psicc/psicc.vcproj0000644002406300000240000001005512311617072017771 0ustar mariamausers lcms2-2.6/Projects/VC2008/tiffdiff/0000755002406300000240000000000012311617072016122 5ustar mariamauserslcms2-2.6/Projects/VC2008/tiffdiff/tiffdiff.vcproj0000644002406300000240000001021212311617072021124 0ustar mariamausers lcms2-2.6/Projects/VC2008/lcms2.rc0000644002406300000240000000507612311617072015717 0ustar mariamausers//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Spanish (Modern) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESN) #ifdef _WIN32 LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN #pragma code_page(1252) #endif //_WIN32 #ifndef _MAC ///////////////////////////////////////////////////////////////////////////// // // Version // 1 VERSIONINFO FILEVERSION 2,3,0,0 PRODUCTVERSION 2,3,0,0 FILEFLAGSMASK 0x0L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904e4" BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Marti Maria\0" VALUE "FileDescription", "lcms color engine\0" VALUE "FileVersion", "2.3\0" VALUE "InternalName", "lcms\0" VALUE "LegalCopyright", "Copyright () Marti Maria 2011\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "lcms2.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "LittleCMS color engine\0" VALUE "ProductVersion", "2, 0, 3, 0\0" VALUE "SpecialBuild", "\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END #endif // !_MAC #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // Spanish (Modern) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED lcms2-2.6/Projects/VC2008/jpegicc/0000755002406300000240000000000012311617072015745 5ustar mariamauserslcms2-2.6/Projects/VC2008/jpegicc/jpegicc.vcproj0000644002406300000240000001032512311617072020577 0ustar mariamausers lcms2-2.6/Projects/VC2008/linkicc/0000755002406300000240000000000012311617072015755 5ustar mariamauserslcms2-2.6/Projects/VC2008/linkicc/linkicc.vcproj0000644002406300000240000001007112311617072020615 0ustar mariamausers lcms2-2.6/Projects/VC2008/transicc/0000755002406300000240000000000012311617072016147 5ustar mariamauserslcms2-2.6/Projects/VC2008/transicc/transicc.vcproj0000644002406300000240000001021212311617072021176 0ustar mariamausers lcms2-2.6/Projects/VC2008/lcms2.sln0000755002406300000240000003364212311617072016112 0ustar mariamausers Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testbed", "testbed\testbed.vcproj", "{928A3A2B-46EF-4279-959C-513B3652FF0E}" ProjectSection(ProjectDependencies) = postProject {71DEDE59-3F1E-486B-A899-4283000F76B5} = {71DEDE59-3F1E-486B-A899-4283000F76B5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tifficc", "tifficc\tifficc.vcproj", "{2256DE16-ED92-4A6F-9C54-F65BB61E64A2}" ProjectSection(ProjectDependencies) = postProject {71DEDE59-3F1E-486B-A899-4283000F76B5} = {71DEDE59-3F1E-486B-A899-4283000F76B5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_DLL", "lcms2_DLL\lcms2_DLL.vcproj", "{8C51BE48-ADB8-4089-A9EC-F6BF993A0548}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "linkicc", "linkicc\linkicc.vcproj", "{FBFBE1DC-DB84-4BA1-9552-B4780F457849}" ProjectSection(ProjectDependencies) = postProject {71DEDE59-3F1E-486B-A899-4283000F76B5} = {71DEDE59-3F1E-486B-A899-4283000F76B5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "transicc", "transicc\transicc.vcproj", "{9EE22D66-C849-474C-9ED5-C3E141DAB160}" ProjectSection(ProjectDependencies) = postProject {71DEDE59-3F1E-486B-A899-4283000F76B5} = {71DEDE59-3F1E-486B-A899-4283000F76B5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpegicc", "jpegicc\jpegicc.vcproj", "{62812507-F926-4968-96A9-17678460AD90}" ProjectSection(ProjectDependencies) = postProject {71DEDE59-3F1E-486B-A899-4283000F76B5} = {71DEDE59-3F1E-486B-A899-4283000F76B5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiffdiff", "tiffdiff\tiffdiff.vcproj", "{75B91835-CCD7-48BE-A606-A9C997D5DBEE}" ProjectSection(ProjectDependencies) = postProject {71DEDE59-3F1E-486B-A899-4283000F76B5} = {71DEDE59-3F1E-486B-A899-4283000F76B5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_static", "lcms2_static\lcms2_static.vcproj", "{71DEDE59-3F1E-486B-A899-4283000F76B5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psicc", "psicc\psicc.vcproj", "{EF6A8851-65FE-46F5-B9EF-14F0B671F693}" ProjectSection(ProjectDependencies) = postProject {71DEDE59-3F1E-486B-A899-4283000F76B5} = {71DEDE59-3F1E-486B-A899-4283000F76B5} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.ActiveCfg = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.Build.0 = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.ActiveCfg = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.ActiveCfg = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.Build.0 = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.ActiveCfg = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.ActiveCfg = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.Build.0 = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.ActiveCfg = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.ActiveCfg = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.Build.0 = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.ActiveCfg = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.ActiveCfg = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.Build.0 = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.ActiveCfg = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.ActiveCfg = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.Build.0 = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.ActiveCfg = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.ActiveCfg = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.Build.0 = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.ActiveCfg = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.ActiveCfg = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.Build.0 = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.ActiveCfg = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.ActiveCfg = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.Build.0 = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.ActiveCfg = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.ActiveCfg = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.Build.0 = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.ActiveCfg = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.ActiveCfg = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.Build.0 = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.ActiveCfg = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.ActiveCfg = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.Build.0 = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.ActiveCfg = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.ActiveCfg = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.Build.0 = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.ActiveCfg = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.ActiveCfg = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.Build.0 = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.ActiveCfg = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.ActiveCfg = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.Build.0 = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.ActiveCfg = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.ActiveCfg = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.Build.0 = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.ActiveCfg = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.ActiveCfg = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.Build.0 = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.ActiveCfg = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.ActiveCfg = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.Build.0 = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal lcms2-2.6/Projects/VC2008/resource.h0000644002406300000240000000066312311617072016346 0ustar mariamausers//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by lcms.rc // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif lcms2-2.6/Projects/VC2008/testbed/0000755002406300000240000000000012311617072015773 5ustar mariamauserslcms2-2.6/Projects/VC2008/testbed/testbed.vcproj0000644002406300000240000001003312311617072020647 0ustar mariamausers lcms2-2.6/Projects/VC2010/0000755002406300000240000000000012311617072014332 5ustar mariamauserslcms2-2.6/Projects/VC2010/lcms2_static/0000755002406300000240000000000012311617072016721 5ustar mariamauserslcms2-2.6/Projects/VC2010/lcms2_static/lcms2_static.vcproj0000644002406300000240000001216012311617072022535 0ustar mariamausers lcms2-2.6/Projects/VC2010/lcms2_static/lcms2_static.vcxproj0000644002406300000240000002545312311617072022736 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {71DEDE59-3F1E-486B-A899-4283000F76B5} lcms2_static Win32Proj StaticLibrary Unicode true StaticLibrary Unicode true StaticLibrary Unicode StaticLibrary Unicode <_ProjectFileVersion>10.0.21006.1 ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ $(Configuration)\ $(Configuration)\ ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ $(Configuration)\ $(Configuration)\ AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true Full true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase Speed true true OnlyExplicitInline false true Full true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase Speed true true OnlyExplicitInline false true lcms2-2.6/Projects/VC2010/lcms2_static/lcms2_static.vcxproj.filters0000644002406300000240000000737612311617072024411 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Source Files lcms2-2.6/Projects/VC2010/lcms2_DLL/0000755002406300000240000000000012311617072016045 5ustar mariamauserslcms2-2.6/Projects/VC2010/lcms2_DLL/lcms2_DLL.vcproj0000644002406300000240000001434312311617072021012 0ustar mariamausers lcms2-2.6/Projects/VC2010/lcms2_DLL/lcms2_DLL.vcxproj.filters0000644002406300000240000001016712311617072022651 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Source Files Resource Files Resource Files Source Files lcms2-2.6/Projects/VC2010/lcms2_DLL/lcms2_DLL.vcxproj0000644002406300000240000003234712311617072021206 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548} lcms2_DLL Win32Proj DynamicLibrary Unicode true DynamicLibrary Unicode true DynamicLibrary Unicode DynamicLibrary Unicode <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset lcms2 lcms2 lcms2 lcms2 Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true ..\..\..\src\lcms2.def true Windows MachineX86 $(OutDir)$(TargetName)$(TargetExt) Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase true true Windows $(OutDir)$(TargetName)$(TargetExt) Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true OnlyExplicitInline true ..\..\..\src\lcms2.def true Windows true true MachineX86 $(OutDir)$(TargetName)$(TargetExt) Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true OnlyExplicitInline true true Windows true true $(OutDir)$(TargetName)$(TargetExt) lcms2-2.6/Projects/VC2010/tifficc/0000755002406300000240000000000012311617072015741 5ustar mariamauserslcms2-2.6/Projects/VC2010/tifficc/tifficc.vcproj0000644002406300000240000001032612311617072020577 0ustar mariamausers lcms2-2.6/Projects/VC2010/tifficc/tifficc.vcxproj0000644002406300000240000002737312311617072021001 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2} tifficc Win32Proj Application Unicode true Application Unicode true Application Unicode Application Unicode <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset $(IncludePath);;C:\tiff-4.0.2\libtiff $(IncludePath);;C:\tiff-4.0.2\libtiff $(LibraryPath);;C:\tiff-4.0.2\libtiff $(LibraryPath);;C:\tiff-4.0.2\libtiff $(IncludePath);;C:\tiff-4.0.2\libtiff $(IncludePath);;C:\tiff-4.0.2\libtiff $(LibraryPath);;C:\tiff-4.0.2\libtiff $(LibraryPath);;C:\tiff-4.0.2\libtiff Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console true true MachineX86 MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2010/tifficc/tifficc.vcxproj.filters0000644002406300000240000000242212311617072022434 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Header Files lcms2-2.6/Projects/VC2010/psicc/0000755002406300000240000000000012311617072015433 5ustar mariamauserslcms2-2.6/Projects/VC2010/psicc/psicc.vcxproj.filters0000644002406300000240000000220612311617072021620 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.6/Projects/VC2010/psicc/psicc.vcxproj0000644002406300000240000002443512311617072020161 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693} psicc Win32Proj Application Unicode true Application Unicode true Application Unicode Application Unicode <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true Console true true MachineX86 MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2010/psicc/psicc.vcproj0000644002406300000240000001005512311617072017762 0ustar mariamausers lcms2-2.6/Projects/VC2010/tiffdiff/0000755002406300000240000000000012311617072016113 5ustar mariamauserslcms2-2.6/Projects/VC2010/tiffdiff/tiffdiff.vcxproj0000644002406300000240000002756612311617072021331 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE} tiffdiff Win32Proj Application Unicode true Application Unicode true Application Unicode Application Unicode <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset C:\jpeg-8d;c:\tiff-4.0.2\libtiff;$(IncludePath) C:\jpeg-8d;c:\tiff-4.0.2\libtiff;$(IncludePath) C:\jpeg-8d;C:\tiff-4.0.2\libtiff;$(LibraryPath) C:\jpeg-8d;C:\tiff-4.0.2\libtiff;$(LibraryPath) C:\jpeg-8d;c:\tiff-4.0.2\libtiff;$(IncludePath) C:\jpeg-8d;c:\tiff-4.0.2\libtiff;$(IncludePath) C:\jpeg-8d;C:\tiff-4.0.2\libtiff;$(LibraryPath) C:\jpeg-8d;C:\tiff-4.0.2\libtiff;$(LibraryPath) Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console true true MachineX86 $(OutDir)$(TargetName)$(TargetExt) MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console true true $(OutDir)$(TargetName)$(TargetExt) {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2010/tiffdiff/tiffdiff.vcxproj.filters0000644002406300000240000000221112311617072022754 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.6/Projects/VC2010/tiffdiff/tiffdiff.vcproj0000644002406300000240000001022012311617072021114 0ustar mariamausers lcms2-2.6/Projects/VC2010/lcms2.rc0000644002406300000240000000452012311617072015701 0ustar mariamausers// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Spanish (Spain, International Sort) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESN) LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN #pragma code_page(1252) ///////////////////////////////////////////////////////////////////////////// // // Version // 1 VERSIONINFO FILEVERSION 2,5,0,0 PRODUCTVERSION 2,5,0,0 FILEFLAGSMASK 0x0L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "Marti Maria" VALUE "FileDescription", "lcms color engine" VALUE "FileVersion", "2.5.0.0" VALUE "InternalName", "lcms" VALUE "LegalCopyright", "Copyright Marti Maria 2013" VALUE "OriginalFilename", "lcms2.dll" VALUE "ProductName", "LittleCMS color engine" VALUE "ProductVersion", "2.5.0.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // Spanish (Spain, International Sort) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED lcms2-2.6/Projects/VC2010/jpegicc/0000755002406300000240000000000012311617072015736 5ustar mariamauserslcms2-2.6/Projects/VC2010/jpegicc/jpegicc.vcxproj.filters0000644002406300000240000000236712311617072022436 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files lcms2-2.6/Projects/VC2010/jpegicc/jpegicc.vcproj0000644002406300000240000001033412311617072020570 0ustar mariamausers lcms2-2.6/Projects/VC2010/jpegicc/jpegicc.vcxproj0000644002406300000240000002772712311617072020776 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {62812507-F926-4968-96A9-17678460AD90} jpegicc Win32Proj Application Unicode true Application Unicode true Application Unicode Application Unicode <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset $(IncludePath);;C:\jpeg-8d $(IncludePath);;C:\jpeg-8d $(LibraryPath);C:\jpeg-8d\ $(LibraryPath);;C:\jpeg-8d $(IncludePath);;C:\jpeg-8d $(IncludePath);;C:\jpeg-8d $(LibraryPath);C:\jpeg-8d\ $(LibraryPath);;C:\jpeg-8d Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libjpeg.lib;%(AdditionalDependencies) true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true libjpeg.lib;%(AdditionalDependencies) true Console Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase Speed true true true libjpeg.lib;%(AdditionalDependencies) true Console true true MachineX86 Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level3 ProgramDatabase Speed true true true libjpeg.lib;%(AdditionalDependencies) true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2010/linkicc/0000755002406300000240000000000012311617072015746 5ustar mariamauserslcms2-2.6/Projects/VC2010/linkicc/linkicc.vcproj0000644002406300000240000001007112311617072020606 0ustar mariamausers lcms2-2.6/Projects/VC2010/linkicc/linkicc.vcxproj.filters0000644002406300000240000000221212311617072022443 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.6/Projects/VC2010/linkicc/linkicc.vcxproj0000644002406300000240000002444312311617072021006 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849} linkicc Win32Proj Application Unicode true Application Unicode true Application Unicode Application Unicode <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true Console true true MachineX86 MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2010/transicc/0000755002406300000240000000000012311617072016140 5ustar mariamauserslcms2-2.6/Projects/VC2010/transicc/transicc.vcxproj0000644002406300000240000002460512311617072021372 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160} transicc Win32Proj Application Unicode true Application Unicode true Application Unicode Application Unicode <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true Console true true MachineX86 MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2010/transicc/transicc.vcproj0000644002406300000240000001021212311617072021167 0ustar mariamausers lcms2-2.6/Projects/VC2010/transicc/transicc.vcxproj.filters0000644002406300000240000000242612311617072023036 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Header Files lcms2-2.6/Projects/VC2010/lcms2.sln0000755002406300000240000003453212311617072016102 0ustar mariamausers Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testbed", "testbed\testbed.vcxproj", "{928A3A2B-46EF-4279-959C-513B3652FF0E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tifficc", "tifficc\tifficc.vcxproj", "{2256DE16-ED92-4A6F-9C54-F65BB61E64A2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_DLL", "lcms2_DLL\lcms2_DLL.vcxproj", "{8C51BE48-ADB8-4089-A9EC-F6BF993A0548}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "linkicc", "linkicc\linkicc.vcxproj", "{FBFBE1DC-DB84-4BA1-9552-B4780F457849}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "transicc", "transicc\transicc.vcxproj", "{9EE22D66-C849-474C-9ED5-C3E141DAB160}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpegicc", "jpegicc\jpegicc.vcxproj", "{62812507-F926-4968-96A9-17678460AD90}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiffdiff", "tiffdiff\tiffdiff.vcxproj", "{75B91835-CCD7-48BE-A606-A9C997D5DBEE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_static", "lcms2_static\lcms2_static.vcxproj", "{71DEDE59-3F1E-486B-A899-4283000F76B5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psicc", "psicc\psicc.vcxproj", "{EF6A8851-65FE-46F5-B9EF-14F0B671F693}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.ActiveCfg = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.Build.0 = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.ActiveCfg = Debug|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.Build.0 = Debug|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.ActiveCfg = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.Build.0 = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.ActiveCfg = Release|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.Build.0 = Release|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.ActiveCfg = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.Build.0 = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.ActiveCfg = Debug|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.Build.0 = Debug|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.ActiveCfg = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.Build.0 = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.ActiveCfg = Release|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.Build.0 = Release|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.ActiveCfg = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.Build.0 = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.ActiveCfg = Debug|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.Build.0 = Debug|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.ActiveCfg = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.Build.0 = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.ActiveCfg = Release|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.Build.0 = Release|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.ActiveCfg = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.Build.0 = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.ActiveCfg = Debug|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.Build.0 = Debug|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.ActiveCfg = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.Build.0 = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.ActiveCfg = Release|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.Build.0 = Release|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.ActiveCfg = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.Build.0 = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.ActiveCfg = Debug|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.Build.0 = Debug|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.ActiveCfg = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.Build.0 = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.ActiveCfg = Release|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.Build.0 = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.ActiveCfg = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.Build.0 = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.ActiveCfg = Debug|x64 {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.Build.0 = Debug|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.ActiveCfg = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.Build.0 = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.ActiveCfg = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Build.0 = Release|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.ActiveCfg = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.Build.0 = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.ActiveCfg = Debug|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.Build.0 = Debug|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.ActiveCfg = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.Build.0 = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.ActiveCfg = Release|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.Build.0 = Release|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.ActiveCfg = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.Build.0 = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.ActiveCfg = Debug|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.Build.0 = Debug|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.ActiveCfg = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.Build.0 = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.ActiveCfg = Release|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.Build.0 = Release|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.ActiveCfg = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.Build.0 = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.ActiveCfg = Debug|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.Build.0 = Debug|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.ActiveCfg = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.Build.0 = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.ActiveCfg = Release|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal lcms2-2.6/Projects/VC2010/resource.h0000644002406300000240000000065612311617072016341 0ustar mariamausers//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by lcms2.rc // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif lcms2-2.6/Projects/VC2010/testbed/0000755002406300000240000000000012311617072015764 5ustar mariamauserslcms2-2.6/Projects/VC2010/testbed/testbed.vcxproj0000644002406300000240000002624212311617072021041 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {928A3A2B-46EF-4279-959C-513B3652FF0E} testbed Win32Proj Application Unicode true Application Unicode true Application Unicode Application Unicode <_ProjectFileVersion>10.0.21006.1 $(Configuration)\ $(Configuration)\ true true ..\..\..\testbed\ ..\..\..\testbed\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset ..\..\..\testbed\ ..\..\..\testbed\ Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true true Console MachineX86 false Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase true true Console false Full true Speed true true ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL false true NotSet Level3 ProgramDatabase Cdecl true true Console true true MachineX86 false Full true Speed true true ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded false true NotSet Level3 ProgramDatabase Cdecl true true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2010/testbed/testbed.vcxproj.filters0000644002406300000240000000241112311617072022500 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Header Files lcms2-2.6/Projects/VC2010/testbed/testbed.vcproj0000644002406300000240000001003312311617072020640 0ustar mariamausers lcms2-2.6/Projects/.gitignore0000644002406300000240000000006112311617072015504 0ustar mariamausers**.opensdf **.sdf **.suo **.user Debug/ Release/ lcms2-2.6/Projects/mac/0000755002406300000240000000000012311617072014257 5ustar mariamauserslcms2-2.6/Projects/mac/._.DS_Store0000755002406300000240000000000012311617072016150 0ustar mariamauserslcms2-2.6/Projects/mac/.DS_Store0000755002406300000240000001400412311617072015744 0ustar mariamausersBud1leCMSfw LittleCMSfwi0blob2uicnv LittleCMSfwvhshorY  @ @ @ @ EDSDB ` @ @ @lcms2-2.6/Projects/mac/LittleCMS/0000755002406300000240000000000012311617072016057 5ustar mariamauserslcms2-2.6/Projects/mac/LittleCMS/._.DS_Store0000755002406300000240000000000012311617072017750 0ustar mariamauserslcms2-2.6/Projects/mac/LittleCMS/English.lproj/0000755002406300000240000000000012311617072020575 5ustar mariamauserslcms2-2.6/Projects/mac/LittleCMS/English.lproj/InfoPlist.strings0000755002406300000240000000022412311617072024120 0ustar mariamausers/* Localized versions of Info.plist keys */ CFBundleName = "LittleCMS"; lcms2-2.6/Projects/mac/LittleCMS/TestBed-Info.plist0000644002406300000240000000123712311617072021362 0ustar mariamausers CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.yourcompany.TestBed CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType BNDL CFBundleSignature ???? CFBundleVersion 1.0 CSResourcesFileMapped yes lcms2-2.6/Projects/mac/LittleCMS/Info.plist0000644002406300000240000000140112311617072020023 0ustar mariamausers CFBundleDevelopmentRegion English CFBundleExecutable LittleCMS CFBundleIconFile CFBundleIdentifier com.apple.carbonframeworktemplate CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType FMWK CFBundleShortVersionString 1.01 CFBundleSignature lcms CFBundleVersion 2.6 CSResourcesFileMapped lcms2-2.6/Projects/mac/LittleCMS/LittleCMS.xcodeproj/0000755002406300000240000000000012311617072021653 5ustar mariamauserslcms2-2.6/Projects/mac/LittleCMS/LittleCMS.xcodeproj/project.pbxproj0000644002406300000240000006333512311617072024741 0ustar mariamausers// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 44; objects = { /* Begin PBXBuildFile section */ 546B294910AC5E4A0054D33A /* cmscam02.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293110AC5E4A0054D33A /* cmscam02.c */; }; 546B294A10AC5E4A0054D33A /* cmscgats.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293210AC5E4A0054D33A /* cmscgats.c */; }; 546B294B10AC5E4A0054D33A /* cmscnvrt.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293310AC5E4A0054D33A /* cmscnvrt.c */; }; 546B294C10AC5E4A0054D33A /* cmserr.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293410AC5E4A0054D33A /* cmserr.c */; }; 546B294D10AC5E4A0054D33A /* cmsgamma.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293510AC5E4A0054D33A /* cmsgamma.c */; }; 546B294E10AC5E4A0054D33A /* cmsgmt.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293610AC5E4A0054D33A /* cmsgmt.c */; }; 546B294F10AC5E4A0054D33A /* cmsintrp.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293710AC5E4A0054D33A /* cmsintrp.c */; }; 546B295010AC5E4A0054D33A /* cmsio0.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293810AC5E4A0054D33A /* cmsio0.c */; }; 546B295110AC5E4A0054D33A /* cmsio1.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293910AC5E4A0054D33A /* cmsio1.c */; }; 546B295210AC5E4A0054D33A /* cmslut.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293A10AC5E4A0054D33A /* cmslut.c */; }; 546B295310AC5E4A0054D33A /* cmsmd5.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293B10AC5E4A0054D33A /* cmsmd5.c */; }; 546B295410AC5E4A0054D33A /* cmsmtrx.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293C10AC5E4A0054D33A /* cmsmtrx.c */; }; 546B295510AC5E4A0054D33A /* cmsnamed.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293D10AC5E4A0054D33A /* cmsnamed.c */; }; 546B295610AC5E4A0054D33A /* cmsopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293E10AC5E4A0054D33A /* cmsopt.c */; }; 546B295710AC5E4A0054D33A /* cmspack.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B293F10AC5E4A0054D33A /* cmspack.c */; }; 546B295810AC5E4A0054D33A /* cmspcs.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B294010AC5E4A0054D33A /* cmspcs.c */; }; 546B295910AC5E4A0054D33A /* cmsplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B294110AC5E4A0054D33A /* cmsplugin.c */; }; 546B295A10AC5E4A0054D33A /* cmsps2.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B294210AC5E4A0054D33A /* cmsps2.c */; }; 546B295B10AC5E4A0054D33A /* cmssamp.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B294310AC5E4A0054D33A /* cmssamp.c */; }; 546B295C10AC5E4A0054D33A /* cmssm.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B294410AC5E4A0054D33A /* cmssm.c */; }; 546B295D10AC5E4A0054D33A /* cmstypes.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B294510AC5E4A0054D33A /* cmstypes.c */; }; 546B295E10AC5E4A0054D33A /* cmsvirt.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B294610AC5E4A0054D33A /* cmsvirt.c */; }; 546B295F10AC5E4A0054D33A /* cmswtpnt.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B294710AC5E4A0054D33A /* cmswtpnt.c */; }; 546B296010AC5E4A0054D33A /* cmsxform.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B294810AC5E4A0054D33A /* cmsxform.c */; }; 546B296310AC5E600054D33A /* lcms2.h in Headers */ = {isa = PBXBuildFile; fileRef = 546B296110AC5E600054D33A /* lcms2.h */; settings = {ATTRIBUTES = (Public, ); }; }; 546B296410AC5E600054D33A /* lcms2_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 546B296210AC5E600054D33A /* lcms2_plugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; 546B29AE10AC68410054D33A /* testcms2.c in Sources */ = {isa = PBXBuildFile; fileRef = 546B29AD10AC68410054D33A /* testcms2.c */; }; 54DBD06215A202BB00180017 /* cmshalf.c in Sources */ = {isa = PBXBuildFile; fileRef = 54DBD06015A202B200180017 /* cmshalf.c */; }; 54E6DC7E18AE052800445185 /* testplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 54E6DC7D18AE052800445185 /* testplugin.c */; }; 54E6DC8018AE054800445185 /* zoo_icc.c in Sources */ = {isa = PBXBuildFile; fileRef = 54E6DC7F18AE054800445185 /* zoo_icc.c */; }; 8D07F2BE0486CC7A007CD1D0 /* LittleCMS_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 32BAE0B70371A74B00C91783 /* LittleCMS_Prefix.pch */; settings = {ATTRIBUTES = (Private, ); }; }; 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; 8D07F2C40486CC7A007CD1D0 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB77AAFE841565C02AAC07 /* Carbon.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 546B29A710AC67870054D33A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0; remoteInfo = LittleCMS; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 08FB77AAFE841565C02AAC07 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; 32BAE0B70371A74B00C91783 /* LittleCMS_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LittleCMS_Prefix.pch; sourceTree = ""; }; 546B293110AC5E4A0054D33A /* cmscam02.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmscam02.c; path = ../../../src/cmscam02.c; sourceTree = SOURCE_ROOT; }; 546B293210AC5E4A0054D33A /* cmscgats.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmscgats.c; path = ../../../src/cmscgats.c; sourceTree = SOURCE_ROOT; }; 546B293310AC5E4A0054D33A /* cmscnvrt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmscnvrt.c; path = ../../../src/cmscnvrt.c; sourceTree = SOURCE_ROOT; }; 546B293410AC5E4A0054D33A /* cmserr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmserr.c; path = ../../../src/cmserr.c; sourceTree = SOURCE_ROOT; }; 546B293510AC5E4A0054D33A /* cmsgamma.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsgamma.c; path = ../../../src/cmsgamma.c; sourceTree = SOURCE_ROOT; }; 546B293610AC5E4A0054D33A /* cmsgmt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsgmt.c; path = ../../../src/cmsgmt.c; sourceTree = SOURCE_ROOT; }; 546B293710AC5E4A0054D33A /* cmsintrp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsintrp.c; path = ../../../src/cmsintrp.c; sourceTree = SOURCE_ROOT; }; 546B293810AC5E4A0054D33A /* cmsio0.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsio0.c; path = ../../../src/cmsio0.c; sourceTree = SOURCE_ROOT; }; 546B293910AC5E4A0054D33A /* cmsio1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsio1.c; path = ../../../src/cmsio1.c; sourceTree = SOURCE_ROOT; }; 546B293A10AC5E4A0054D33A /* cmslut.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmslut.c; path = ../../../src/cmslut.c; sourceTree = SOURCE_ROOT; }; 546B293B10AC5E4A0054D33A /* cmsmd5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsmd5.c; path = ../../../src/cmsmd5.c; sourceTree = SOURCE_ROOT; }; 546B293C10AC5E4A0054D33A /* cmsmtrx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsmtrx.c; path = ../../../src/cmsmtrx.c; sourceTree = SOURCE_ROOT; }; 546B293D10AC5E4A0054D33A /* cmsnamed.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsnamed.c; path = ../../../src/cmsnamed.c; sourceTree = SOURCE_ROOT; }; 546B293E10AC5E4A0054D33A /* cmsopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsopt.c; path = ../../../src/cmsopt.c; sourceTree = SOURCE_ROOT; }; 546B293F10AC5E4A0054D33A /* cmspack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmspack.c; path = ../../../src/cmspack.c; sourceTree = SOURCE_ROOT; }; 546B294010AC5E4A0054D33A /* cmspcs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmspcs.c; path = ../../../src/cmspcs.c; sourceTree = SOURCE_ROOT; }; 546B294110AC5E4A0054D33A /* cmsplugin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsplugin.c; path = ../../../src/cmsplugin.c; sourceTree = SOURCE_ROOT; }; 546B294210AC5E4A0054D33A /* cmsps2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsps2.c; path = ../../../src/cmsps2.c; sourceTree = SOURCE_ROOT; }; 546B294310AC5E4A0054D33A /* cmssamp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmssamp.c; path = ../../../src/cmssamp.c; sourceTree = SOURCE_ROOT; }; 546B294410AC5E4A0054D33A /* cmssm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmssm.c; path = ../../../src/cmssm.c; sourceTree = SOURCE_ROOT; }; 546B294510AC5E4A0054D33A /* cmstypes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmstypes.c; path = ../../../src/cmstypes.c; sourceTree = SOURCE_ROOT; }; 546B294610AC5E4A0054D33A /* cmsvirt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsvirt.c; path = ../../../src/cmsvirt.c; sourceTree = SOURCE_ROOT; }; 546B294710AC5E4A0054D33A /* cmswtpnt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmswtpnt.c; path = ../../../src/cmswtpnt.c; sourceTree = SOURCE_ROOT; }; 546B294810AC5E4A0054D33A /* cmsxform.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmsxform.c; path = ../../../src/cmsxform.c; sourceTree = SOURCE_ROOT; }; 546B296110AC5E600054D33A /* lcms2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lcms2.h; path = ../../../include/lcms2.h; sourceTree = SOURCE_ROOT; }; 546B296210AC5E600054D33A /* lcms2_plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lcms2_plugin.h; path = ../../../include/lcms2_plugin.h; sourceTree = SOURCE_ROOT; }; 546B296B10AC5EAA0054D33A /* TestBed-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TestBed-Info.plist"; sourceTree = ""; }; 546B29A310AC677E0054D33A /* testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testbed; sourceTree = BUILT_PRODUCTS_DIR; }; 546B29AC10AC682F0054D33A /* lcms2_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lcms2_internal.h; path = ../../../src/lcms2_internal.h; sourceTree = SOURCE_ROOT; }; 546B29AD10AC68410054D33A /* testcms2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testcms2.c; path = ../../../testbed/testcms2.c; sourceTree = SOURCE_ROOT; }; 54DBD06015A202B200180017 /* cmshalf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmshalf.c; path = ../../../src/cmshalf.c; sourceTree = ""; }; 54E6DC7D18AE052800445185 /* testplugin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testplugin.c; path = ../../../testbed/testplugin.c; sourceTree = SOURCE_ROOT; }; 54E6DC7F18AE054800445185 /* zoo_icc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zoo_icc.c; path = ../../../testbed/zoo_icc.c; sourceTree = SOURCE_ROOT; }; 8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D07F2C80486CC7A007CD1D0 /* LittleCMS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LittleCMS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 546B29A110AC677E0054D33A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 8D07F2C30486CC7A007CD1D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8D07F2C40486CC7A007CD1D0 /* Carbon.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 034768DDFF38A45A11DB9C8B /* Products */ = { isa = PBXGroup; children = ( 8D07F2C80486CC7A007CD1D0 /* LittleCMS.framework */, 546B29A310AC677E0054D33A /* testbed */, ); name = Products; sourceTree = ""; }; 0867D691FE84028FC02AAC07 /* LittleCMS */ = { isa = PBXGroup; children = ( 54E6DC7F18AE054800445185 /* zoo_icc.c */, 54E6DC7D18AE052800445185 /* testplugin.c */, 08FB77ACFE841707C02AAC07 /* Source */, 089C1665FE841158C02AAC07 /* Resources */, 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, 034768DDFF38A45A11DB9C8B /* Products */, 546B296B10AC5EAA0054D33A /* TestBed-Info.plist */, ); name = LittleCMS; sourceTree = ""; }; 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { isa = PBXGroup; children = ( 08FB77AAFE841565C02AAC07 /* Carbon.framework */, ); name = "External Frameworks and Libraries"; sourceTree = ""; }; 089C1665FE841158C02AAC07 /* Resources */ = { isa = PBXGroup; children = ( 8D07F2C70486CC7A007CD1D0 /* Info.plist */, 089C1666FE841158C02AAC07 /* InfoPlist.strings */, ); name = Resources; sourceTree = ""; }; 08FB77ACFE841707C02AAC07 /* Source */ = { isa = PBXGroup; children = ( 54DBD06015A202B200180017 /* cmshalf.c */, 546B29AD10AC68410054D33A /* testcms2.c */, 546B29AC10AC682F0054D33A /* lcms2_internal.h */, 546B296110AC5E600054D33A /* lcms2.h */, 546B296210AC5E600054D33A /* lcms2_plugin.h */, 546B293110AC5E4A0054D33A /* cmscam02.c */, 546B293210AC5E4A0054D33A /* cmscgats.c */, 546B293310AC5E4A0054D33A /* cmscnvrt.c */, 546B293410AC5E4A0054D33A /* cmserr.c */, 546B293510AC5E4A0054D33A /* cmsgamma.c */, 546B293610AC5E4A0054D33A /* cmsgmt.c */, 546B293710AC5E4A0054D33A /* cmsintrp.c */, 546B293810AC5E4A0054D33A /* cmsio0.c */, 546B293910AC5E4A0054D33A /* cmsio1.c */, 546B293A10AC5E4A0054D33A /* cmslut.c */, 546B293B10AC5E4A0054D33A /* cmsmd5.c */, 546B293C10AC5E4A0054D33A /* cmsmtrx.c */, 546B293D10AC5E4A0054D33A /* cmsnamed.c */, 546B293E10AC5E4A0054D33A /* cmsopt.c */, 546B293F10AC5E4A0054D33A /* cmspack.c */, 546B294010AC5E4A0054D33A /* cmspcs.c */, 546B294110AC5E4A0054D33A /* cmsplugin.c */, 546B294210AC5E4A0054D33A /* cmsps2.c */, 546B294310AC5E4A0054D33A /* cmssamp.c */, 546B294410AC5E4A0054D33A /* cmssm.c */, 546B294510AC5E4A0054D33A /* cmstypes.c */, 546B294610AC5E4A0054D33A /* cmsvirt.c */, 546B294710AC5E4A0054D33A /* cmswtpnt.c */, 546B294810AC5E4A0054D33A /* cmsxform.c */, 32BAE0B70371A74B00C91783 /* LittleCMS_Prefix.pch */, ); name = Source; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 8D07F2BE0486CC7A007CD1D0 /* LittleCMS_Prefix.pch in Headers */, 546B296310AC5E600054D33A /* lcms2.h in Headers */, 546B296410AC5E600054D33A /* lcms2_plugin.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 546B29A210AC677E0054D33A /* testbed */ = { isa = PBXNativeTarget; buildConfigurationList = 546B29AB10AC67C30054D33A /* Build configuration list for PBXNativeTarget "testbed" */; buildPhases = ( 546B29A010AC677E0054D33A /* Sources */, 546B29A110AC677E0054D33A /* Frameworks */, ); buildRules = ( ); dependencies = ( 546B29A810AC67870054D33A /* PBXTargetDependency */, ); name = testbed; productName = testbed; productReference = 546B29A310AC677E0054D33A /* testbed */; productType = "com.apple.product-type.tool"; }; 8D07F2BC0486CC7A007CD1D0 /* LittleCMS */ = { isa = PBXNativeTarget; buildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "LittleCMS" */; buildPhases = ( 8D07F2BD0486CC7A007CD1D0 /* Headers */, 8D07F2BF0486CC7A007CD1D0 /* Resources */, 8D07F2C10486CC7A007CD1D0 /* Sources */, 8D07F2C30486CC7A007CD1D0 /* Frameworks */, 8D07F2C50486CC7A007CD1D0 /* Rez */, ); buildRules = ( ); dependencies = ( ); name = LittleCMS; productInstallPath = "$(HOME)/Library/Frameworks"; productName = LittleCMS; productReference = 8D07F2C80486CC7A007CD1D0 /* LittleCMS.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "LittleCMS" */; compatibilityVersion = "Xcode 3.0"; hasScannedForEncodings = 1; mainGroup = 0867D691FE84028FC02AAC07 /* LittleCMS */; productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 8D07F2BC0486CC7A007CD1D0 /* LittleCMS */, 546B29A210AC677E0054D33A /* testbed */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXRezBuildPhase section */ 8D07F2C50486CC7A007CD1D0 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXRezBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 546B29A010AC677E0054D33A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 546B29AE10AC68410054D33A /* testcms2.c in Sources */, 54E6DC7E18AE052800445185 /* testplugin.c in Sources */, 54E6DC8018AE054800445185 /* zoo_icc.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 8D07F2C10486CC7A007CD1D0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 546B294910AC5E4A0054D33A /* cmscam02.c in Sources */, 546B294A10AC5E4A0054D33A /* cmscgats.c in Sources */, 546B294B10AC5E4A0054D33A /* cmscnvrt.c in Sources */, 546B294C10AC5E4A0054D33A /* cmserr.c in Sources */, 546B294D10AC5E4A0054D33A /* cmsgamma.c in Sources */, 546B294E10AC5E4A0054D33A /* cmsgmt.c in Sources */, 546B294F10AC5E4A0054D33A /* cmsintrp.c in Sources */, 546B295010AC5E4A0054D33A /* cmsio0.c in Sources */, 546B295110AC5E4A0054D33A /* cmsio1.c in Sources */, 546B295210AC5E4A0054D33A /* cmslut.c in Sources */, 546B295310AC5E4A0054D33A /* cmsmd5.c in Sources */, 546B295410AC5E4A0054D33A /* cmsmtrx.c in Sources */, 546B295510AC5E4A0054D33A /* cmsnamed.c in Sources */, 546B295610AC5E4A0054D33A /* cmsopt.c in Sources */, 546B295710AC5E4A0054D33A /* cmspack.c in Sources */, 546B295810AC5E4A0054D33A /* cmspcs.c in Sources */, 546B295910AC5E4A0054D33A /* cmsplugin.c in Sources */, 546B295A10AC5E4A0054D33A /* cmsps2.c in Sources */, 546B295B10AC5E4A0054D33A /* cmssamp.c in Sources */, 546B295C10AC5E4A0054D33A /* cmssm.c in Sources */, 546B295D10AC5E4A0054D33A /* cmstypes.c in Sources */, 546B295E10AC5E4A0054D33A /* cmsvirt.c in Sources */, 546B295F10AC5E4A0054D33A /* cmswtpnt.c in Sources */, 546B296010AC5E4A0054D33A /* cmsxform.c in Sources */, 54DBD06215A202BB00180017 /* cmshalf.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 546B29A810AC67870054D33A /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8D07F2BC0486CC7A007CD1D0 /* LittleCMS */; targetProxy = 546B29A710AC67870054D33A /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C1667FE841158C02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 4FADC24308B4156D00ABE55E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_CHAR_IS_UNSIGNED_CHAR = YES; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = LittleCMS_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Frameworks"; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = LittleCMS; WRAPPER_EXTENSION = framework; ZERO_LINK = YES; }; name = Debug; }; 4FADC24408B4156D00ABE55E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_CHAR_IS_UNSIGNED_CHAR = YES; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = LittleCMS_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Frameworks"; LIBRARY_STYLE = DYNAMIC; MACH_O_TYPE = mh_dylib; PRODUCT_NAME = LittleCMS; WRAPPER_EXTENSION = framework; }; name = Release; }; 4FADC24708B4156D00ABE55E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; LINK_WITH_STANDARD_LIBRARIES = YES; MACH_O_TYPE = mh_execute; OTHER_LDFLAGS = ""; PREBINDING = NO; SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk"; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static; }; name = Debug; }; 4FADC24808B4156D00ABE55E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; LINK_WITH_STANDARD_LIBRARIES = YES; MACH_O_TYPE = mh_execute; OTHER_LDFLAGS = ""; PREBINDING = NO; SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk"; STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static; }; name = Release; }; 546B29A510AC677F0054D33A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h"; INSTALL_PATH = /usr/local/bin; OTHER_LDFLAGS = ( "-framework", Carbon, "-framework", LittleCMS, ); PREBINDING = NO; PRODUCT_NAME = testbed; ZERO_LINK = YES; }; name = Debug; }; 546B29A610AC677F0054D33A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h"; INSTALL_PATH = /usr/local/bin; OTHER_LDFLAGS = ( "-framework", Carbon, "-framework", LittleCMS, ); PREBINDING = NO; PRODUCT_NAME = testbed; ZERO_LINK = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "LittleCMS" */ = { isa = XCConfigurationList; buildConfigurations = ( 4FADC24308B4156D00ABE55E /* Debug */, 4FADC24408B4156D00ABE55E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "LittleCMS" */ = { isa = XCConfigurationList; buildConfigurations = ( 4FADC24708B4156D00ABE55E /* Debug */, 4FADC24808B4156D00ABE55E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 546B29AB10AC67C30054D33A /* Build configuration list for PBXNativeTarget "testbed" */ = { isa = XCConfigurationList; buildConfigurations = ( 546B29A510AC677F0054D33A /* Debug */, 546B29A610AC677F0054D33A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; } lcms2-2.6/Projects/mac/LittleCMS/LittleCMS.xcodeproj/mariama.mode1v30000644002406300000240000012143412311617072024467 0ustar mariamausers ActivePerspectiveName Project AllowedModules BundleLoadPath MaxInstances n Module PBXSmartGroupTreeModule Name Groups and Files Outline View BundleLoadPath MaxInstances n Module PBXNavigatorGroup Name Editor BundleLoadPath MaxInstances n Module XCTaskListModule Name Task List BundleLoadPath MaxInstances n Module XCDetailModule Name File and Smart Group Detail Viewer BundleLoadPath MaxInstances 1 Module PBXBuildResultsModule Name Detailed Build Results Viewer BundleLoadPath MaxInstances 1 Module PBXProjectFindModule Name Project Batch Find Tool BundleLoadPath MaxInstances n Module XCProjectFormatConflictsModule Name Project Format Conflicts List BundleLoadPath MaxInstances n Module PBXBookmarksModule Name Bookmarks Tool BundleLoadPath MaxInstances n Module PBXClassBrowserModule Name Class Browser BundleLoadPath MaxInstances n Module PBXCVSModule Name Source Code Control Tool BundleLoadPath MaxInstances n Module PBXDebugBreakpointsModule Name Debug Breakpoints Tool BundleLoadPath MaxInstances n Module XCDockableInspector Name Inspector BundleLoadPath MaxInstances n Module PBXOpenQuicklyModule Name Open Quickly Tool BundleLoadPath MaxInstances 1 Module PBXDebugSessionModule Name Debugger BundleLoadPath MaxInstances 1 Module PBXDebugCLIModule Name Debug Console BundleLoadPath MaxInstances n Module XCSnapshotModule Name Snapshots Tool BundlePath /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources Description DefaultDescriptionKey DockingSystemVisible Extension mode1v3 FavBarConfig PBXProjectModuleGUID 546B299810AC669D0054D33A XCBarModuleItemNames XCBarModuleItems FirstTimeWindowDisplayed Identifier com.apple.perspectives.project.mode1v3 MajorVersion 33 MinorVersion 0 Name Default Notifications XCObserverAutoDisconnectKey XCObserverDefintionKey PBXStatusErrorsKey 0 XCObserverFactoryKey XCPerspectivesSpecificationIdentifier XCObserverGUIDKey XCObserverProjectIdentifier XCObserverNotificationKey PBXStatusBuildStateMessageNotification XCObserverTargetKey XCMainBuildResultsModuleGUID XCObserverTriggerKey awakenModuleWithObserver: XCObserverValidationKey PBXStatusErrorsKey 2 XCObserverAutoDisconnectKey XCObserverDefintionKey PBXStatusWarningsKey 0 XCObserverFactoryKey XCPerspectivesSpecificationIdentifier XCObserverGUIDKey XCObserverProjectIdentifier XCObserverNotificationKey PBXStatusBuildStateMessageNotification XCObserverTargetKey XCMainBuildResultsModuleGUID XCObserverTriggerKey awakenModuleWithObserver: XCObserverValidationKey PBXStatusWarningsKey 2 OpenEditors PerspectiveWidths -1 -1 Perspectives ChosenToolbarItems active-target-popup active-buildstyle-popup action NSToolbarFlexibleSpaceItem buildOrClean build-and-goOrGo com.apple.ide.PBXToolbarStopButton get-info toggle-editor NSToolbarFlexibleSpaceItem com.apple.pbx.toolbar.searchfield ControllerClassBaseName IconName WindowOfProjectWithEditor Identifier perspective.project IsVertical Layout BecomeActive ContentConfiguration PBXBottomSmartGroupGIDs 1C37FBAC04509CD000000102 1C37FAAC04509CD000000102 1C08E77C0454961000C914BD 1C37FABC05509CD000000102 1C37FABC05539CD112110102 E2644B35053B69B200211256 1C37FABC04509CD000100104 1CC0EA4004350EF90044410B 1CC0EA4004350EF90041110B PBXProjectModuleGUID 1CE0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided yes PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 389 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 0867D691FE84028FC02AAC07 1C37FBAC04509CD000000102 54E6DC8118AE055400445185 54E6DC8218AE055400445185 1C37FABC05509CD000000102 E2644B35053B69B200211256 PBXSmartGroupTreeModuleOutlineStateSelectionKey 12 10 8 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {389, 899}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch XCSharingToken com.apple.Xcode.GFSharingToken GeometryConfiguration Frame {{0, 0}, {406, 917}} GroupTreeTableConfiguration MainColumn 389 RubberWindowFrame 143 144 1537 958 0 0 1600 1178 Module PBXSmartGroupTreeModule Proportion 406pt Dock ContentConfiguration PBXProjectModuleGUID 1CE0B20306471E060097A5F4 PBXProjectModuleLabel TestBed-Info.plist PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1CE0B20406471E060097A5F4 PBXProjectModuleLabel TestBed-Info.plist _historyCapacity 0 bookmark 54E6DC8318AE055400445185 history 546B29DA10AC6B6E0054D33A 5479A29618AE035D002E61E4 prevStack 546B29E010AC6B6E0054D33A SplitCount 1 StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {1126, 0}} RubberWindowFrame 143 144 1537 958 0 0 1600 1178 Module PBXNavigatorGroup Proportion 0pt ContentConfiguration PBXProjectModuleGUID 1CE0B20506471E060097A5F4 PBXProjectModuleLabel Detail GeometryConfiguration Frame {{0, 5}, {1126, 959}} RubberWindowFrame 143 144 1537 958 0 0 1600 1178 Module XCDetailModule Proportion 959pt Proportion 1126pt Name Project ServiceClasses XCModuleDock PBXSmartGroupTreeModule XCModuleDock PBXNavigatorGroup XCDetailModule TableOfContents 54E6DC8418AE055400445185 1CE0B1FE06471DED0097A5F4 54E6DC8518AE055400445185 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 ToolbarConfiguration xcode.toolbar.config.defaultV3 ControllerClassBaseName IconName WindowOfProject Identifier perspective.morph IsVertical 0 Layout BecomeActive 1 ContentConfiguration PBXBottomSmartGroupGIDs 1C37FBAC04509CD000000102 1C37FAAC04509CD000000102 1C08E77C0454961000C914BD 1C37FABC05509CD000000102 1C37FABC05539CD112110102 E2644B35053B69B200211256 1C37FABC04509CD000100104 1CC0EA4004350EF90044410B 1CC0EA4004350EF90041110B PBXProjectModuleGUID 11E0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided yes PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 186 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 29B97314FDCFA39411CA2CEA 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {186, 337}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch 1 XCSharingToken com.apple.Xcode.GFSharingToken GeometryConfiguration Frame {{0, 0}, {203, 355}} GroupTreeTableConfiguration MainColumn 186 RubberWindowFrame 373 269 690 397 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 100% Name Morph PreferredWidth 300 ServiceClasses XCModuleDock PBXSmartGroupTreeModule TableOfContents 11E0B1FE06471DED0097A5F4 ToolbarConfiguration xcode.toolbar.config.default.shortV3 PerspectivesBarVisible ShelfIsVisible SourceDescription file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' StatusbarIsVisible TimeStamp 414057556.32574099 ToolbarDisplayMode 1 ToolbarIsVisible ToolbarSizeMode 1 Type Perspectives UpdateMessage The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? WindowJustification 5 WindowOrderList /Users/mariama/lcms2-2.6rc0/Projects/mac/LittleCMS/LittleCMS.xcodeproj WindowString 143 144 1537 958 0 0 1600 1178 WindowToolsV3 FirstTimeWindowDisplayed Identifier windowTool.build IsVertical Layout Dock ContentConfiguration PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel <No Editor> StatusBarVisibility GeometryConfiguration Frame {{0, 0}, {897, 417}} RubberWindowFrame 645 255 897 912 0 0 1600 1178 Module PBXNavigatorGroup Proportion 417pt BecomeActive ContentConfiguration PBXProjectModuleGUID XCMainBuildResultsModuleGUID PBXProjectModuleLabel Build XCBuildResultsTrigger_Collapse 1021 XCBuildResultsTrigger_Open 1013 GeometryConfiguration Frame {{0, 422}, {897, 449}} RubberWindowFrame 645 255 897 912 0 0 1600 1178 Module PBXBuildResultsModule Proportion 449pt Proportion 871pt Name Build Results ServiceClasses PBXBuildResultsModule StatusbarIsVisible TableOfContents 546B297610AC61DD0054D33A 5479A28718AE031A002E61E4 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID ToolbarConfiguration xcode.toolbar.config.buildV3 WindowString 645 255 897 912 0 0 1600 1178 WindowToolGUID 546B297610AC61DD0054D33A WindowToolIsVisible FirstTimeWindowDisplayed Identifier windowTool.debugger IsVertical Layout Dock ContentConfiguration Debugger HorizontalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {316, 194}} {{316, 0}, {378, 194}} VerticalSplitView _collapsingFrameDimension 0.0 _indexOfCollapsedView 0 _percentageOfCollapsedView 0.0 isCollapsed yes sizes {{0, 0}, {694, 194}} {{0, 194}, {694, 187}} LauncherConfigVersion 8 PBXProjectModuleGUID 1C162984064C10D400B95A72 PBXProjectModuleLabel Debug - GLUTExamples (Underwater) GeometryConfiguration DebugConsoleVisible None DebugConsoleWindowFrame {{200, 200}, {500, 300}} DebugSTDIOWindowFrame {{200, 200}, {500, 300}} Frame {{0, 0}, {694, 381}} PBXDebugSessionStackFrameViewKey DebugVariablesTableConfiguration Name 120 Value 85 Summary 148 Frame {{316, 0}, {378, 194}} RubberWindowFrame 406 715 694 422 0 0 1600 1178 RubberWindowFrame 406 715 694 422 0 0 1600 1178 Module PBXDebugSessionModule Proportion 381pt Proportion 381pt Name Debugger ServiceClasses PBXDebugSessionModule StatusbarIsVisible TableOfContents 1CD10A99069EF8BA00B06720 5479A28818AE031A002E61E4 1C162984064C10D400B95A72 5479A28918AE031A002E61E4 5479A28A18AE031A002E61E4 5479A28B18AE031A002E61E4 5479A28C18AE031A002E61E4 5479A28D18AE031A002E61E4 ToolbarConfiguration xcode.toolbar.config.debugV3 WindowString 406 715 694 422 0 0 1600 1178 WindowToolGUID 1CD10A99069EF8BA00B06720 WindowToolIsVisible Identifier windowTool.find Layout Dock Dock ContentConfiguration PBXProjectModuleGUID 1CDD528C0622207200134675 PBXProjectModuleLabel <No Editor> PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1CD0528D0623707200166675 SplitCount 1 StatusBarVisibility 1 GeometryConfiguration Frame {{0, 0}, {781, 167}} RubberWindowFrame 62 385 781 470 0 0 1440 878 Module PBXNavigatorGroup Proportion 781pt Proportion 50% BecomeActive 1 ContentConfiguration PBXProjectModuleGUID 1CD0528E0623707200166675 PBXProjectModuleLabel Project Find GeometryConfiguration Frame {{8, 0}, {773, 254}} RubberWindowFrame 62 385 781 470 0 0 1440 878 Module PBXProjectFindModule Proportion 50% Proportion 428pt Name Project Find ServiceClasses PBXProjectFindModule StatusbarIsVisible 1 TableOfContents 1C530D57069F1CE1000CFCEE 1C530D58069F1CE1000CFCEE 1C530D59069F1CE1000CFCEE 1CDD528C0622207200134675 1C530D5A069F1CE1000CFCEE 1CE0B1FE06471DED0097A5F4 1CD0528E0623707200166675 WindowString 62 385 781 470 0 0 1440 878 WindowToolGUID 1C530D57069F1CE1000CFCEE WindowToolIsVisible 0 Identifier MENUSEPARATOR FirstTimeWindowDisplayed Identifier windowTool.debuggerConsole IsVertical Layout Dock ContentConfiguration PBXProjectModuleGUID 1C78EAAC065D492600B07095 PBXProjectModuleLabel Debugger Console GeometryConfiguration Frame {{0, 0}, {814, 470}} RubberWindowFrame 406 626 814 511 0 0 1600 1178 Module PBXDebugCLIModule Proportion 470pt Proportion 470pt Name Debugger Console ServiceClasses PBXDebugCLIModule StatusbarIsVisible TableOfContents 1C78EAAD065D492600B07095 5479A28E18AE031A002E61E4 1C78EAAC065D492600B07095 ToolbarConfiguration xcode.toolbar.config.consoleV3 WindowString 406 626 814 511 0 0 1600 1178 WindowToolGUID 1C78EAAD065D492600B07095 WindowToolIsVisible Identifier windowTool.snapshots Layout Dock Module XCSnapshotModule Proportion 100% Proportion 100% Name Snapshots ServiceClasses XCSnapshotModule StatusbarIsVisible Yes ToolbarConfiguration xcode.toolbar.config.snapshots WindowString 315 824 300 550 0 0 1440 878 WindowToolIsVisible Yes Identifier windowTool.scm Layout Dock ContentConfiguration PBXProjectModuleGUID 1C78EAB2065D492600B07095 PBXProjectModuleLabel <No Editor> PBXSplitModuleInNavigatorKey Split0 PBXProjectModuleGUID 1C78EAB3065D492600B07095 SplitCount 1 StatusBarVisibility 1 GeometryConfiguration Frame {{0, 0}, {452, 0}} RubberWindowFrame 743 379 452 308 0 0 1280 1002 Module PBXNavigatorGroup Proportion 0pt BecomeActive 1 ContentConfiguration PBXProjectModuleGUID 1CD052920623707200166675 PBXProjectModuleLabel SCM GeometryConfiguration ConsoleFrame {{0, 259}, {452, 0}} Frame {{0, 7}, {452, 259}} RubberWindowFrame 743 379 452 308 0 0 1280 1002 TableConfiguration Status 30 FileName 199 Path 197.09500122070312 TableFrame {{0, 0}, {452, 250}} Module PBXCVSModule Proportion 262pt Proportion 266pt Name SCM ServiceClasses PBXCVSModule StatusbarIsVisible 1 TableOfContents 1C78EAB4065D492600B07095 1C78EAB5065D492600B07095 1C78EAB2065D492600B07095 1CD052920623707200166675 ToolbarConfiguration xcode.toolbar.config.scm WindowString 743 379 452 308 0 0 1280 1002 Identifier windowTool.breakpoints IsVertical 0 Layout Dock BecomeActive 1 ContentConfiguration PBXBottomSmartGroupGIDs 1C77FABC04509CD000000102 PBXProjectModuleGUID 1CE0B1FE06471DED0097A5F4 PBXProjectModuleLabel Files PBXProjectStructureProvided no PBXSmartGroupTreeModuleColumnData PBXSmartGroupTreeModuleColumnWidthsKey 168 PBXSmartGroupTreeModuleColumnsKey_v4 MainColumn PBXSmartGroupTreeModuleOutlineStateKey_v7 PBXSmartGroupTreeModuleOutlineStateExpansionKey 1C77FABC04509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey {{0, 0}, {168, 350}} PBXTopSmartGroupGIDs XCIncludePerspectivesSwitch 0 GeometryConfiguration Frame {{0, 0}, {185, 368}} GroupTreeTableConfiguration MainColumn 168 RubberWindowFrame 315 424 744 409 0 0 1440 878 Module PBXSmartGroupTreeModule Proportion 185pt ContentConfiguration PBXProjectModuleGUID 1CA1AED706398EBD00589147 PBXProjectModuleLabel Detail GeometryConfiguration Frame {{190, 0}, {554, 368}} RubberWindowFrame 315 424 744 409 0 0 1440 878 Module XCDetailModule Proportion 554pt Proportion 368pt MajorVersion 3 MinorVersion 0 Name Breakpoints ServiceClasses PBXSmartGroupTreeModule XCDetailModule StatusbarIsVisible 1 TableOfContents 1CDDB66807F98D9800BB5817 1CDDB66907F98D9800BB5817 1CE0B1FE06471DED0097A5F4 1CA1AED706398EBD00589147 ToolbarConfiguration xcode.toolbar.config.breakpointsV3 WindowString 315 424 744 409 0 0 1440 878 WindowToolGUID 1CDDB66807F98D9800BB5817 WindowToolIsVisible 1 Identifier windowTool.debugAnimator Layout Dock Module PBXNavigatorGroup Proportion 100% Proportion 100% Name Debug Visualizer ServiceClasses PBXNavigatorGroup StatusbarIsVisible 1 ToolbarConfiguration xcode.toolbar.config.debugAnimatorV3 WindowString 100 100 700 500 0 0 1280 1002 Identifier windowTool.bookmarks Layout Dock Module PBXBookmarksModule Proportion 100% Proportion 100% Name Bookmarks ServiceClasses PBXBookmarksModule StatusbarIsVisible 0 WindowString 538 42 401 187 0 0 1280 1002 Identifier windowTool.projectFormatConflicts Layout Dock Module XCProjectFormatConflictsModule Proportion 100% Proportion 100% Name Project Format Conflicts ServiceClasses XCProjectFormatConflictsModule StatusbarIsVisible 0 WindowContentMinSize 450 300 WindowString 50 850 472 307 0 0 1440 877 Identifier windowTool.classBrowser Layout Dock BecomeActive 1 ContentConfiguration OptionsSetName Hierarchy, all classes PBXProjectModuleGUID 1CA6456E063B45B4001379D8 PBXProjectModuleLabel Class Browser - NSObject GeometryConfiguration ClassesFrame {{0, 0}, {374, 96}} ClassesTreeTableConfiguration PBXClassNameColumnIdentifier 208 PBXClassBookColumnIdentifier 22 Frame {{0, 0}, {630, 331}} MembersFrame {{0, 105}, {374, 395}} MembersTreeTableConfiguration PBXMemberTypeIconColumnIdentifier 22 PBXMemberNameColumnIdentifier 216 PBXMemberTypeColumnIdentifier 97 PBXMemberBookColumnIdentifier 22 PBXModuleWindowStatusBarHidden2 1 RubberWindowFrame 385 179 630 352 0 0 1440 878 Module PBXClassBrowserModule Proportion 332pt Proportion 332pt Name Class Browser ServiceClasses PBXClassBrowserModule StatusbarIsVisible 0 TableOfContents 1C0AD2AF069F1E9B00FABCE6 1C0AD2B0069F1E9B00FABCE6 1CA6456E063B45B4001379D8 ToolbarConfiguration xcode.toolbar.config.classbrowser WindowString 385 179 630 352 0 0 1440 878 WindowToolGUID 1C0AD2AF069F1E9B00FABCE6 WindowToolIsVisible 0 Identifier windowTool.refactoring IncludeInToolsMenu 0 Layout Dock BecomeActive 1 GeometryConfiguration Frame {0, 0}, {500, 335} RubberWindowFrame {0, 0}, {500, 335} Module XCRefactoringModule Proportion 100% Proportion 100% Name Refactoring ServiceClasses XCRefactoringModule WindowString 200 200 500 356 0 0 1920 1200 lcms2-2.6/Projects/mac/LittleCMS/LittleCMS.xcodeproj/mariama.pbxuser0000644002406300000240000002017512311617072024701 0ustar mariamausers// !$*UTF8*$! { 0867D690FE84028FC02AAC07 /* Project object */ = { activeArchitecture = ppc; activeBuildConfigurationName = Release; activeExecutable = 546B29A410AC677E0054D33A /* testbed */; activeTarget = 546B29A210AC677E0054D33A /* testbed */; addToTargets = ( 546B29A210AC677E0054D33A /* testbed */, ); codeSenseManager = 546B293010AC5E210054D33A /* Code sense */; executables = ( 546B29A410AC677E0054D33A /* testbed */, ); perUserDictionary = { PBXConfiguration.PBXFileTableDataSource3.PBXBookmarksDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXBookmarksDataSource_NameID; PBXFileTableDataSourceColumnWidthsKey = ( 200, 200, 760, ); PBXFileTableDataSourceColumnsKey = ( PBXBookmarksDataSource_LocationID, PBXBookmarksDataSource_NameID, PBXBookmarksDataSource_CommentsID, ); }; PBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_LocationID; PBXFileTableDataSourceColumnWidthsKey = ( 20, 300, 840, ); PBXFileTableDataSourceColumnsKey = ( PBXErrorsWarningsDataSource_TypeID, PBXErrorsWarningsDataSource_MessageID, PBXErrorsWarningsDataSource_LocationID, ); }; PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; PBXFileTableDataSourceColumnWidthsKey = ( 22, 300, 838, ); PBXFileTableDataSourceColumnsKey = ( PBXExecutablesDataSource_ActiveFlagID, PBXExecutablesDataSource_NameID, PBXExecutablesDataSource_CommentsID, ); }; PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, 887, 20, 48, 43, 43, 20, ); PBXFileTableDataSourceColumnsKey = ( PBXFileDataSource_FiletypeID, PBXFileDataSource_Filename_ColumnID, PBXFileDataSource_Built_ColumnID, PBXFileDataSource_ObjectSize_ColumnID, PBXFileDataSource_Errors_ColumnID, PBXFileDataSource_Warnings_ColumnID, PBXFileDataSource_Target_ColumnID, ); }; PBXConfiguration.PBXFileTableDataSource3.PBXFindDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFindDataSource_LocationID; PBXFileTableDataSourceColumnWidthsKey = ( 200, 964, ); PBXFileTableDataSourceColumnsKey = ( PBXFindDataSource_MessageID, PBXFindDataSource_LocationID, ); }; PBXConfiguration.PBXFileTableDataSource3.PBXSymbolsDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXSymbolsDataSource_SymbolNameID; PBXFileTableDataSourceColumnWidthsKey = ( 16, 200, 50, 890, ); PBXFileTableDataSourceColumnsKey = ( PBXSymbolsDataSource_SymbolTypeIconID, PBXSymbolsDataSource_SymbolNameID, PBXSymbolsDataSource_SymbolTypeID, PBXSymbolsDataSource_ReferenceNameID, ); }; PBXConfiguration.PBXFileTableDataSource3.XCSCMDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, 20, 926, 20, 48.16259765625, 43, 43, 20, ); PBXFileTableDataSourceColumnsKey = ( PBXFileDataSource_SCM_ColumnID, PBXFileDataSource_FiletypeID, PBXFileDataSource_Filename_ColumnID, PBXFileDataSource_Built_ColumnID, PBXFileDataSource_ObjectSize_ColumnID, PBXFileDataSource_Errors_ColumnID, PBXFileDataSource_Warnings_ColumnID, PBXFileDataSource_Target_ColumnID, ); }; PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, 847, 60, 20, 48, 43, 43, ); PBXFileTableDataSourceColumnsKey = ( PBXFileDataSource_FiletypeID, PBXFileDataSource_Filename_ColumnID, PBXTargetDataSource_PrimaryAttribute, PBXFileDataSource_Built_ColumnID, PBXFileDataSource_ObjectSize_ColumnID, PBXFileDataSource_Errors_ColumnID, PBXFileDataSource_Warnings_ColumnID, ); }; PBXPerProjectTemplateStateSaveDate = 414057556; PBXWorkspaceStateSaveDate = 414057556; }; perUserProjectItems = { 546B29DA10AC6B6E0054D33A /* PBXTextBookmark */ = 546B29DA10AC6B6E0054D33A /* PBXTextBookmark */; 546B29E010AC6B6E0054D33A /* PBXTextBookmark */ = 546B29E010AC6B6E0054D33A /* PBXTextBookmark */; 5479A29618AE035D002E61E4 /* PBXTextBookmark */ = 5479A29618AE035D002E61E4 /* PBXTextBookmark */; 54E6DC8318AE055400445185 /* PBXTextBookmark */ = 54E6DC8318AE055400445185 /* PBXTextBookmark */; }; sourceControlManager = 546B292F10AC5E210054D33A /* Source Control */; userBuildSettings = { }; }; 546B292F10AC5E210054D33A /* Source Control */ = { isa = PBXSourceControlManager; fallbackIsa = XCSourceControlManager; isSCMEnabled = 0; scmConfiguration = { }; }; 546B293010AC5E210054D33A /* Code sense */ = { isa = PBXCodeSenseManager; indexTemplatePath = ""; }; 546B293810AC5E4A0054D33A /* cmsio0.c */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1065, 24374}}"; sepNavSelRange = "{25921, 0}"; sepNavVisRange = "{0, 0}"; }; }; 546B296B10AC5EAA0054D33A /* TestBed-Info.plist */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1065, 336}}"; sepNavSelRange = "{0, 0}"; sepNavVisRange = "{0, 0}"; }; }; 546B299D10AC672A0054D33A /* RunUnitTests */ = { isa = PBXFileReference; lastKnownFileType = text.script.sh; name = RunUnitTests; path = /Developer/Tools/RunUnitTests; sourceTree = ""; }; 546B29A210AC677E0054D33A /* testbed */ = { activeExec = 0; executables = ( 546B29A410AC677E0054D33A /* testbed */, ); }; 546B29A410AC677E0054D33A /* testbed */ = { isa = PBXExecutable; activeArgIndices = ( ); argumentStrings = ( ); autoAttachOnCrash = 1; breakpointsEnabled = 0; configStateDict = { }; customDataFormattersEnabled = 1; debuggerPlugin = GDBDebugging; disassemblyDisplayState = 0; dylibVariantSuffix = ""; enableDebugStr = 1; environmentEntries = ( ); executableSystemSymbolLevel = 0; executableUserSymbolLevel = 0; libgmallocEnabled = 0; name = testbed; savedGlobals = { }; sourceDirectories = ( ); variableFormatDictionary = { }; }; 546B29AD10AC68410054D33A /* testcms2.c */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1065, 116032}}"; sepNavSelRange = "{0, 0}"; sepNavVisRange = "{0, 0}"; sepNavWindowFrame = "{{61, 247}, {1099, 884}}"; }; }; 546B29DA10AC6B6E0054D33A /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 546B299D10AC672A0054D33A /* RunUnitTests */; name = "RunUnitTests: 298"; rLen = 5; rLoc = 9244; rType = 0; vrLen = 172; vrLoc = 9140; }; 546B29E010AC6B6E0054D33A /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 546B299D10AC672A0054D33A /* RunUnitTests */; name = "RunUnitTests: 298"; rLen = 5; rLoc = 9244; rType = 0; vrLen = 172; vrLoc = 9140; }; 5479A29618AE035D002E61E4 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 546B296B10AC5EAA0054D33A /* TestBed-Info.plist */; name = "TestBed-Info.plist: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 0; vrLoc = 0; }; 54E6DC8318AE055400445185 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 546B296B10AC5EAA0054D33A /* TestBed-Info.plist */; name = "TestBed-Info.plist: 1"; rLen = 0; rLoc = 0; rType = 0; vrLen = 0; vrLoc = 0; }; 8D07F2BC0486CC7A007CD1D0 /* LittleCMS */ = { activeExec = 0; }; } lcms2-2.6/Projects/mac/LittleCMS/.DS_Store0000755002406300000240000001400412311617072017544 0ustar mariamausersBud1%  @ @ @ @ E%DSDB` @ @ @lcms2-2.6/Projects/mac/LittleCMS/LittleCMS_Prefix.pch0000644002406300000240000000017612311617072021674 0ustar mariamausers// // Prefix header for all source files of the 'LittleCMS' target in the 'LittleCMS' project. // #include lcms2-2.6/Projects/cppcheck/0000755002406300000240000000000012311617072015277 5ustar mariamauserslcms2-2.6/Projects/cppcheck/lcms2.cppcheck0000755002406300000240000000032212311617072020021 0ustar mariamausers

lcms2-2.6/Projects/VC2012/0000755002406300000240000000000012311617072014334 5ustar mariamauserslcms2-2.6/Projects/VC2012/lcms2_static/0000755002406300000240000000000012311617072016723 5ustar mariamauserslcms2-2.6/Projects/VC2012/lcms2_static/lcms2_static.vcproj0000755002406300000240000001216012311617072022542 0ustar mariamausers lcms2-2.6/Projects/VC2012/lcms2_static/lcms2_static.vcxproj0000755002406300000240000002654112311617072022742 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {71DEDE59-3F1E-486B-A899-4283000F76B5} lcms2_static Win32Proj StaticLibrary Unicode true v110 StaticLibrary Unicode true v110 StaticLibrary Unicode v110 StaticLibrary Unicode v110 <_ProjectFileVersion>10.0.21006.1 ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ $(Configuration)\ $(Configuration)\ ..\..\..\Lib\MS\ ..\..\..\Lib\MS\ $(Configuration)\ $(Configuration)\ AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks Level4 EditAndContinue true MultiThreadedDebugDLL Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true MaxSpeed true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase Speed true false OnlyExplicitInline false true Precise false false true true MaxSpeed true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase Speed true true OnlyExplicitInline false true true true lcms2-2.6/Projects/VC2012/lcms2_static/lcms2_static.vcxproj.filters0000755002406300000240000000737612311617072024416 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Source Files lcms2-2.6/Projects/VC2012/lcms2_DLL/0000755002406300000240000000000012311617072016047 5ustar mariamauserslcms2-2.6/Projects/VC2012/lcms2_DLL/lcms2_DLL.vcproj0000755002406300000240000001434312311617072021017 0ustar mariamausers lcms2-2.6/Projects/VC2012/lcms2_DLL/lcms2_DLL.vcxproj.filters0000755002406300000240000001016712311617072022656 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Source Files Resource Files Resource Files Source Files lcms2-2.6/Projects/VC2012/lcms2_DLL/lcms2_DLL.vcxproj0000755002406300000240000003322112311617072021203 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548} lcms2_DLL Win32Proj DynamicLibrary Unicode true v110 DynamicLibrary Unicode true v110 DynamicLibrary Unicode v110 DynamicLibrary Unicode v110 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset lcms2 lcms2 lcms2 lcms2 Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true ..\..\..\src\lcms2.def true Windows MachineX86 Disabled ../../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase true true Windows $(OutDir)$(TargetName)$(TargetExt) Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true OnlyExplicitInline true true ..\..\..\src\lcms2.def true Windows true true MachineX86 true Full true Speed true true true ../../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true OnlyExplicitInline true true Windows true true true lcms2-2.6/Projects/VC2012/tifficc/0000755002406300000240000000000012311617072015743 5ustar mariamauserslcms2-2.6/Projects/VC2012/tifficc/tifficc.vcproj0000755002406300000240000001032612311617072020604 0ustar mariamausers lcms2-2.6/Projects/VC2012/tifficc/tifficc.vcxproj0000755002406300000240000003057512311617072021004 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2} tifficc Win32Proj Application Unicode true v110 Application Unicode true v110 Application Unicode v110 Application Unicode v110 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset $(IncludePath);C:\tiff-4.0.2\libtiff $(IncludePath);C:\tiff-4.0.2\libtiff $(LibraryPath);C:\tiff-4.0.2\libtiff $(LibraryPath);C:\tiff-4.0.2\libtiff $(IncludePath);C:\tiff-4.0.2\libtiff $(IncludePath);C:\tiff-4.0.2\libtiff $(LibraryPath);C:\tiff-4.0.2\libtiff $(LibraryPath);C:\tiff-4.0.2\libtiff Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console false MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true libtiff.lib;%(AdditionalDependencies) true Console true true MachineX86 false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2012/tifficc/tifficc.vcxproj.filters0000755002406300000240000000242212311617072022441 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Header Files lcms2-2.6/Projects/VC2012/psicc/0000755002406300000240000000000012311617072015435 5ustar mariamauserslcms2-2.6/Projects/VC2012/psicc/psicc.vcxproj.filters0000755002406300000240000000220612311617072021625 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.6/Projects/VC2012/psicc/psicc.vcxproj0000755002406300000240000002516712311617072020171 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693} psicc Win32Proj Application Unicode true v110 Application Unicode true v110 Application Unicode v110 Application Unicode v110 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2012/psicc/psicc.vcproj0000755002406300000240000001005512311617072017767 0ustar mariamausers lcms2-2.6/Projects/VC2012/tiffdiff/0000755002406300000240000000000012311617072016115 5ustar mariamauserslcms2-2.6/Projects/VC2012/tiffdiff/tiffdiff.vcxproj0000755002406300000240000003100012311617072021310 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE} tiffdiff Win32Proj Application Unicode true v110 Application Unicode true v110 Application Unicode v110 Application Unicode v110 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset C:\jpeg-8d;c:\tiff-4.0.2\libtiff;$(IncludePath) C:\jpeg-8d;c:\tiff-4.0.2\libtiff;$(IncludePath) C:\jpeg-8d;C:\tiff-4.0.2\libtiff;$(LibraryPath) C:\jpeg-8d;C:\tiff-4.0.2\libtiff;$(LibraryPath) C:\jpeg-8d;c:\tiff-4.0.2\libtiff;$(IncludePath) C:\jpeg-8d;c:\tiff-4.0.2\libtiff;$(IncludePath) C:\jpeg-8d;C:\tiff-4.0.2\libtiff;$(LibraryPath) C:\jpeg-8d;C:\tiff-4.0.2\libtiff;$(LibraryPath) Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libtiff.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console false MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true libtiff.lib;%(AdditionalDependencies) true Console true true MachineX86 $(OutDir)$(TargetName)$(TargetExt) false true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true libtiff.lib;%(AdditionalDependencies) true Console true true $(OutDir)$(TargetName)$(TargetExt) false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2012/tiffdiff/tiffdiff.vcxproj.filters0000755002406300000240000000221112311617072022761 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.6/Projects/VC2012/tiffdiff/tiffdiff.vcproj0000755002406300000240000001022012311617072021121 0ustar mariamausers lcms2-2.6/Projects/VC2012/lcms2.rc0000755002406300000240000000467012311617072015714 0ustar mariamausers// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Spanish (Spain, International Sort) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESN) LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN #pragma code_page(1252) ///////////////////////////////////////////////////////////////////////////// // // Version // 1 VERSIONINFO FILEVERSION 2,5,0,0 PRODUCTVERSION 2,5,0,0 FILEFLAGSMASK 0x0L #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "Marti Maria" VALUE "FileDescription", "lcms color engine" VALUE "FileVersion", "2.5.0.0" VALUE "InternalName", "lcms" VALUE "LegalCopyright", "Copyright Marti Maria 2013" VALUE "OriginalFilename", "lcms2.dll" VALUE "ProductName", "LittleCMS color engine" VALUE "ProductVersion", "2.5.0.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // Spanish (Spain, International Sort) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED lcms2-2.6/Projects/VC2012/jpegicc/0000755002406300000240000000000012311617072015740 5ustar mariamauserslcms2-2.6/Projects/VC2012/jpegicc/jpegicc.vcxproj.filters0000755002406300000240000000236712311617072022443 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Source Files lcms2-2.6/Projects/VC2012/jpegicc/jpegicc.vcproj0000755002406300000240000001033412311617072020575 0ustar mariamausers lcms2-2.6/Projects/VC2012/jpegicc/jpegicc.vcxproj0000755002406300000240000003114112311617072020764 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {62812507-F926-4968-96A9-17678460AD90} jpegicc Win32Proj Application Unicode true v110 Application Unicode true v110 Application Unicode v110 Application Unicode v110 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset $(IncludePath);;C:\jpeg-8d $(IncludePath);;C:\jpeg-8d $(LibraryPath);;C:\jpeg-8d $(LibraryPath);;C:\jpeg-8d $(IncludePath);;C:\jpeg-8d $(IncludePath);;C:\jpeg-8d $(LibraryPath);;C:\jpeg-8d $(LibraryPath);;C:\jpeg-8d Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true libjpeg.lib;%(AdditionalDependencies) true Console MachineX86 false Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true libjpeg.lib;%(AdditionalDependencies) true Console false Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase Speed true true true true libjpeg.lib;%(AdditionalDependencies) true Console true true MachineX86 false true Full true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level3 ProgramDatabase Speed true true true libjpeg.lib;%(AdditionalDependencies) true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2012/linkicc/0000755002406300000240000000000012311617072015750 5ustar mariamauserslcms2-2.6/Projects/VC2012/linkicc/linkicc.vcproj0000755002406300000240000001007112311617072020613 0ustar mariamausers lcms2-2.6/Projects/VC2012/linkicc/linkicc.vcxproj.filters0000755002406300000240000000221212311617072022450 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.6/Projects/VC2012/linkicc/linkicc.vcxproj0000755002406300000240000002517512311617072021016 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849} linkicc Win32Proj Application Unicode true v110 Application Unicode true v110 Application Unicode v110 Application Unicode v110 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2012/transicc/0000755002406300000240000000000012311617072016142 5ustar mariamauserslcms2-2.6/Projects/VC2012/transicc/transicc.vcxproj0000755002406300000240000002533712311617072021402 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160} transicc Win32Proj Application Unicode true v110 Application Unicode true v110 Application Unicode v110 Application Unicode v110 <_ProjectFileVersion>10.0.21006.1 ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ true true ..\..\..\bin\ ..\..\..\bin\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level4 EditAndContinue true true Console MachineX86 Disabled ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 ProgramDatabase true true Console MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL true Level4 ProgramDatabase true true true Console true true MachineX86 true MaxSpeed true ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded true Level4 ProgramDatabase true true Console true true {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2012/transicc/transicc.vcproj0000755002406300000240000001021212311617072021174 0ustar mariamausers lcms2-2.6/Projects/VC2012/transicc/transicc.vcxproj.filters0000755002406300000240000000242612311617072023043 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files Header Files lcms2-2.6/Projects/VC2012/lcms2.sln0000755002406300000240000003531212311617072016101 0ustar mariamausers Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testbed", "testbed\testbed.vcxproj", "{928A3A2B-46EF-4279-959C-513B3652FF0E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tifficc", "tifficc\tifficc.vcxproj", "{2256DE16-ED92-4A6F-9C54-F65BB61E64A2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_DLL", "lcms2_DLL\lcms2_DLL.vcxproj", "{8C51BE48-ADB8-4089-A9EC-F6BF993A0548}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "linkicc", "linkicc\linkicc.vcxproj", "{FBFBE1DC-DB84-4BA1-9552-B4780F457849}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "transicc", "transicc\transicc.vcxproj", "{9EE22D66-C849-474C-9ED5-C3E141DAB160}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpegicc", "jpegicc\jpegicc.vcxproj", "{62812507-F926-4968-96A9-17678460AD90}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiffdiff", "tiffdiff\tiffdiff.vcxproj", "{75B91835-CCD7-48BE-A606-A9C997D5DBEE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_static", "lcms2_static\lcms2_static.vcxproj", "{71DEDE59-3F1E-486B-A899-4283000F76B5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psicc", "psicc\psicc.vcxproj", "{EF6A8851-65FE-46F5-B9EF-14F0B671F693}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.ActiveCfg = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.Build.0 = Debug|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.ActiveCfg = Debug|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.Build.0 = Debug|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.ActiveCfg = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.Build.0 = Release|Win32 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.ActiveCfg = Release|x64 {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.Build.0 = Release|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.ActiveCfg = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.Build.0 = Debug|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.ActiveCfg = Debug|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.Build.0 = Debug|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.ActiveCfg = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.Build.0 = Release|Win32 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.ActiveCfg = Release|x64 {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.Build.0 = Release|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.ActiveCfg = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.Build.0 = Debug|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.ActiveCfg = Debug|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.Build.0 = Debug|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.ActiveCfg = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.Build.0 = Release|Win32 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.ActiveCfg = Release|x64 {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.Build.0 = Release|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.ActiveCfg = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.Build.0 = Debug|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.ActiveCfg = Debug|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.Build.0 = Debug|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.ActiveCfg = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.Build.0 = Release|Win32 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.ActiveCfg = Release|x64 {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.Build.0 = Release|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.ActiveCfg = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.Build.0 = Debug|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.ActiveCfg = Debug|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.Build.0 = Debug|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.ActiveCfg = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.Build.0 = Release|Win32 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.ActiveCfg = Release|x64 {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.Build.0 = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.ActiveCfg = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.Build.0 = Debug|Win32 {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.ActiveCfg = Debug|x64 {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.Build.0 = Debug|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.ActiveCfg = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.Build.0 = Release|Win32 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.ActiveCfg = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Build.0 = Release|x64 {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Deploy.0 = Release|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.ActiveCfg = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.Build.0 = Debug|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.ActiveCfg = Debug|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.Build.0 = Debug|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.ActiveCfg = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.Build.0 = Release|Win32 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.ActiveCfg = Release|x64 {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.Build.0 = Release|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.ActiveCfg = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.Build.0 = Debug|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.ActiveCfg = Debug|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.Build.0 = Debug|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.ActiveCfg = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.Build.0 = Release|Win32 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.ActiveCfg = Release|x64 {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.Build.0 = Release|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.ActiveCfg = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.Build.0 = Debug|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.ActiveCfg = Debug|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.Build.0 = Debug|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.ActiveCfg = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.Build.0 = Release|Win32 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.ActiveCfg = Release|x64 {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution QtVersion = $(DefaultQtVersion) EndGlobalSection EndGlobal lcms2-2.6/Projects/VC2012/resource.h0000755002406300000240000000065612311617072016346 0ustar mariamausers//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by lcms2.rc // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif lcms2-2.6/Projects/VC2012/testbed/0000755002406300000240000000000012311617072015766 5ustar mariamauserslcms2-2.6/Projects/VC2012/testbed/testbed.vcxproj0000755002406300000240000002664512311617072021055 0ustar mariamausers Debug Win32 Debug x64 Release Win32 Release x64 {928A3A2B-46EF-4279-959C-513B3652FF0E} testbed Win32Proj Application Unicode true v110 Application Unicode true v110 Application Unicode v110 Application Unicode v110 <_ProjectFileVersion>10.0.21006.1 $(Configuration)\ $(Configuration)\ true true ..\..\..\testbed\ ..\..\..\testbed\ $(Configuration)\ $(Configuration)\ false false AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset ..\..\..\testbed\ ..\..\..\testbed\ Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue true true Console MachineX86 false Disabled ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase true true Console false Full true Speed true false ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreadedDLL false true NotSet Level3 ProgramDatabase Cdecl true true true Console true true MachineX86 false true Full true Speed true true ../../../include;../../../src;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) MultiThreaded false true NotSet Level3 ProgramDatabase Cdecl true true Console true true false {71dede59-3f1e-486b-a899-4283000f76b5} false lcms2-2.6/Projects/VC2012/testbed/testbed.vcxproj.filters0000755002406300000240000000223412311617072022510 0ustar mariamausers {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx Source Files Source Files Source Files lcms2-2.6/Projects/VC2012/testbed/testbed.vcproj0000755002406300000240000001003312311617072020645 0ustar mariamausers lcms2-2.6/Projects/BorlandC_5.5/0000755002406300000240000000000012311617072015572 5ustar mariamauserslcms2-2.6/Projects/BorlandC_5.5/lcmsdll.lk0000644002406300000240000000063312311617072017556 0ustar mariamausers/x/aa/c/Tpd C0D32.OBJ+ cmscam02.obj+ cmscgats.obj+ cmscnvrt.obj+ cmserr.obj+ cmsgamma.obj+ cmsgmt.obj+ cmshalf.obj+ cmsintrp.obj+ cmsio0.obj+ cmsio1.obj+ cmslut.obj+ cmsmd5.obj+ cmsmtrx.obj+ cmsnamed.obj+ cmsopt.obj+ cmspack.obj+ cmspcs.obj+ cmsplugin.obj+ cmsps2.obj+ cmssamp.obj+ cmssm.obj+ cmstypes.obj+ cmsvirt.obj+ cmswtpnt.obj+ cmsxform.obj ..\..\bin\lcms2.dll cw32mt.lib import32.lib ..\..\src\lcms2.deflcms2-2.6/Projects/BorlandC_5.5/lcms2.rc0000644002406300000240000000100712311617072017136 0ustar mariamausers 1 VERSIONINFO FILEVERSION 2, 4, 0, 0 PRODUCTVERSION 2, 4, 0, 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL { BLOCK "StringFileInfo" { BLOCK "040904E4" { VALUE "CompanyName", "Marti Maria\000\000" VALUE "FileDescription", "lcms color engine\000" VALUE "FileVersion", "2.04\000\000" VALUE "InternalName", "lcms2\000" VALUE "LegalCopyright", "Copyright Marti Maria 2012\000\000" VALUE "OriginalFilename", "lcms2.dll\000" } } BLOCK "VarFileInfo" { VALUE "Translation", 0x409, 1252 } } lcms2-2.6/Projects/BorlandC_5.5/lcmsdll.lst0000644002406300000240000000120212311617072017743 0ustar mariamausers-5 -C -DCMS_DLL -DCMS_DLL_BUILD -I..\..\include -K -O2 -a8 -d -ff -w -wucp -wsig -wdef -wnod -wamb -OS -RT- -R- -tWM -tWD -w- -x- -c ..\..\src\cmscam02.c ..\..\src\cmscgats.c ..\..\src\cmscnvrt.c ..\..\src\cmserr.c ..\..\src\cmsgamma.c ..\..\src\cmsgmt.c ..\..\src\cmsintrp.c ..\..\src\cmsio0.c ..\..\src\cmsio1.c ..\..\src\cmslut.c ..\..\src\cmsmd5.c ..\..\src\cmsmtrx.c ..\..\src\cmsnamed.c ..\..\src\cmsopt.c ..\..\src\cmspack.c ..\..\src\cmspcs.c ..\..\src\cmsplugin.c ..\..\src\cmsps2.c ..\..\src\cmssamp.c ..\..\src\cmssm.c ..\..\src\cmstypes.c ..\..\src\cmsvirt.c ..\..\src\cmswtpnt.c ..\..\src\cmsxform.c ..\..\src\cmshalf.c lcms2-2.6/Projects/BorlandC_5.5/mklcmsdll.bat0000644002406300000240000000043412311617072020245 0ustar mariamausers@echo off echo. echo This will build the littlecms DLL using Borland C 5.5 compiler. echo. echo Press Ctrl-C to abort, or pause bcc32 @lcmsdll.lst if errorlevel 0 ilink32 @lcmsdll.lk if errorlevel 0 brc32 -fe ..\..\bin\lcms2.dll lcms2.rc del *.obj del *.res echo Done! lcms2-2.6/configure.ac0000644002406300000240000002407412311617072014223 0ustar mariamausers# # LittleCMS 2 configure script # AC_PREREQ(2.60) # # Set the package name and version # AC_INIT(lcms2,2.6) # Specify directory where m4 macros may be found. AC_CONFIG_MACRO_DIR([m4]) # # Libtool library revision control info # See the libtool documentation under the heading "Libtool's versioning # system" in order to understand the meaning of these fields # # Here are a set of rules to help you update your library version # information: # # 1. Start with version information of `0:0:0' for each libtool library. # 2. Update the version information only immediately before a public # release of your software. More frequent updates are unnecessary, and # only guarantee that the current interface number gets larger faster. # 3. If the library source code has changed at all since the last update, # then increment revision (`c:r:a' becomes `c:r+1:a'). # 4. If any interfaces have been added, removed, or changed since the last # update, increment current, and set revision to 0. # 5. If any interfaces have been added since the last public release, then # increment age. # 6. If any interfaces have been removed since the last public release, # then set age to 0. # LIBRARY_CURRENT=2 LIBRARY_REVISION=6 LIBRARY_AGE=0 AC_SUBST(LIBRARY_CURRENT)dnl AC_SUBST(LIBRARY_REVISION)dnl AC_SUBST(LIBRARY_AGE)dnl # Obtain system type by running config.guess AC_CANONICAL_HOST AM_INIT_AUTOMAKE([foreign 1.7.2 no-define dist-zip]) # Check for programs AC_PROG_CC_STDC AC_PROG_CPP AC_PROG_CXX #AM_PROG_LD #AC_SUBST(LD) #AC_PROG_INSTALL #AC_PROG_MAKE_SET #AC_PROG_LN_S # # Tests for Windows # AC_EXEEXT AC_OBJEXT # Configure libtool AC_ENABLE_SHARED AC_ENABLE_STATIC AC_LIBTOOL_WIN32_DLL AC_LIBTOOL_SETUP AC_PROG_LIBTOOL AC_SUBST(LIBTOOL_DEPS) # Add configure option --enable-maintainer-mode which enables dependency # checking and generation useful to package maintainers. This is made an # option to avoid confusing end users. AM_MAINTAINER_MODE # If the C compiler supports the keyword inline, do nothing. Otherwise # define inline to __inline__ or __inline if it accepts one of those, # otherwise define inline to be empty. AC_C_INLINE AC_SUBST(inline) # If words are stored with the most significant byte first (like # Motorola and SPARC CPUs), define `WORDS_BIGENDIAN'. AC_C_BIGENDIAN # Point to JPEG installed in DIR or disable JPEG with --without-jpeg. AC_ARG_WITH(jpeg, [ --with-jpeg=DIR use jpeg installed in DIR], [ if [ test "x$withval" = "xno" ]; then [with_jpeg='no'] else if [ test "x$withval" != "xyes" ]; then with_jpeg=$withval JPEG_DIR=$withval CPPFLAGS="$CPPFLAGS -I$JPEG_DIR/include" LDFLAGS="$LDFLAGS -L$JPEG_DIR/lib" fi [with_jpeg='yes'] fi ], [with_jpeg='yes']) # Point to TIFF installed in DIR or disable TIFF with --without-tiff. AC_ARG_WITH(tiff, [ --with-tiff=DIR use tiff installed in DIR], [ if [ test "x$withval" = "xno" ]; then [with_tiff='no'] else if [ test "x$withval" != "xyes" ]; then with_tiff=$withval TIFF_DIR=$withval CPPFLAGS="$CPPFLAGS -I$TIFF_DIR/include" LDFLAGS="$LDFLAGS -L$TIFF_DIR/lib" fi [with_tiff='yes'] fi ], [with_tiff='yes']) # Disable ZLIB AC_ARG_WITH(zlib, [ --without-zlib disable ZLIB support], [with_zlib=$withval], [with_zlib='yes']) # # Determine POSIX threads settings # # Enable support for POSIX thread APIs AC_ARG_WITH(threads, AS_HELP_STRING([--without-threads], [disable POSIX threads API support]), [with_threads=$withval], [with_threads='yes']) have_threads=no if test "$with_threads" != 'no' then ACX_PTHREAD() if test "$acx_pthread_ok" = yes then have_threads=yes DEF_THREAD="$PTHREAD_CFLAGS" CFLAGS="$CFLAGS $DEF_THREAD" CXXFLAGS="$CXXFLAGS $DEF_THREAD" if test "$CC" != "$PTHREAD_CC" then AC_MSG_WARN([Replacing compiler $CC with compiler $PTHREAD_CC to support pthreads.]) CC="$PTHREAD_CC" fi if test "$CXX" != "$PTHREAD_CXX" then AC_MSG_WARN([Replacing compiler $CXX with compiler $PTHREAD_CXX to support pthreads.]) CXX="$PTHREAD_CXX" fi fi fi # # Find math library # LIB_MATH='' AC_CHECK_LIB(m,sqrt,LIB_MATH="-lm",,) LIBS="$LIB_MATH $LIBS" AC_SUBST(LIB_MATH) # # Find Posix threads library # LIB_THREAD='' if test "$with_threads" != 'no' && test "$have_threads" = 'yes' then for lib in pthread pthreads do if test "x$PTHREAD_LIBS" = "x" ; then AC_CHECK_LIB([$lib],pthread_mutex_lock,[PTHREAD_LIBS=-l$lib],,) fi done LIB_THREAD="$PTHREAD_LIBS" LIBS="$LIBS $LIB_THREAD" AC_DEFINE(HasTHREADS,1,[Define if you have pthreads library]) else AC_DEFINE(HasTHREADS,0,[Define if you dont have pthreads library]) fi AC_SUBST(LIB_THREAD) # # Check for JPEG # have_jpeg='no' LIB_JPEG='' if test ! "$with_jpeg" = 'no' then AC_MSG_CHECKING([for JPEG support]) AC_MSG_RESULT() failed=0; passed=0; AC_CHECK_HEADER(jconfig.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_HEADER(jerror.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_HEADER(jmorecfg.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_HEADER(jpeglib.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_LIB(jpeg,jpeg_read_header,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) # Test for compatible JPEG library if test ! "$ac_cv_jpeg_version_ok" = 'yes' ; then AC_CACHE_CHECK(for JPEG library is version 6b or later, ac_cv_jpeg_version_ok, [AC_TRY_COMPILE( #include #include #include , changequote(<<, >>)dnl << #if JPEG_LIB_VERSION < 62 #error IJG JPEG library must be version 6b or newer! #endif return 0; >>, changequote([, ])dnl ac_cv_jpeg_version_ok='yes', ac_cv_jpeg_version_ok='no')]) if test "$ac_cv_jpeg_version_ok" = 'yes' ; then AC_MSG_RESULT(yes) passed=`expr $passed + 1` else AC_MSG_RESULT(no) failed=`expr $failed + 1` fi fi AC_MSG_CHECKING(if JPEG package is complete) if test $passed -gt 0 then if test $failed -gt 0 then AC_MSG_RESULT(no -- some components failed test) have_jpeg='no (failed tests)' else LIB_JPEG='-ljpeg' LIBS="$LIB_JPEG $LIBS" AC_DEFINE(HasJPEG,1,Define if you have JPEG library) AC_MSG_RESULT(yes) have_jpeg='yes' fi else AC_MSG_RESULT(no) fi fi AM_CONDITIONAL(HasJPEG, test "$have_jpeg" = 'yes') AC_SUBST(LIB_JPEG) # # Check for ZLIB # have_zlib='no' dnl PNG requires zlib so enable zlib check if PNG is requested if test ! "$with_zlib" = 'no' || test ! "$with_png" = 'no' then LIB_ZLIB='' AC_MSG_CHECKING(for ZLIB support ) AC_MSG_RESULT() failed=0; passed=0; AC_CHECK_HEADER(zconf.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_HEADER(zlib.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_LIB(z,compress,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(z,uncompress,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(z,deflate,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(z,inflate,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(z,gzseek,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(z,gztell,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_MSG_CHECKING(if ZLIB package is complete) if test $passed -gt 0 then if test $failed -gt 0 then AC_MSG_RESULT(no -- some components failed test) have_zlib='no (failed tests)' else LIB_ZLIB='-lz' LIBS="$LIB_ZLIB $LIBS" AC_DEFINE(HasZLIB,1,Define if you have zlib compression library) AC_MSG_RESULT(yes) have_zlib='yes' fi else AC_MSG_RESULT(no) fi fi AM_CONDITIONAL(HasZLIB, test "$have_zlib" = 'yes') AC_SUBST(LIB_ZLIB) # # Check for TIFF # have_tiff='no' LIB_TIFF='' if test ! "$with_tiff" = 'no' then AC_MSG_CHECKING([for TIFF support]) AC_MSG_RESULT() failed=0; passed=0; AC_CHECK_HEADER(tiff.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_HEADER(tiffio.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) AC_CHECK_LIB(tiff,TIFFOpen,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(tiff,TIFFClientOpen,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_CHECK_LIB(tiff,TIFFIsByteSwapped,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) AC_MSG_CHECKING(if TIFF package is complete) if test $passed -gt 0 then if test $failed -gt 0 then AC_MSG_RESULT(no -- some components failed test) have_tiff='no (failed tests)' else LIB_TIFF='-ltiff' LIBS="$LIB_TIFF $LIBS" AC_DEFINE(HasTIFF,1,Define if you have TIFF library) AC_MSG_RESULT(yes) have_tiff='yes' AC_CHECK_HEADERS(tiffconf.h) fi else AC_MSG_RESULT(no) fi fi AM_CONDITIONAL(HasTIFF, test "$have_tiff" = 'yes') AC_SUBST(LIB_TIFF) # Libraries that the LCMS library depends on LCMS_LIB_DEPLIBS="$LIB_MATH $LIB_THREAD" LCMS_LIB_DEPLIBS=`echo $LCMS_LIB_DEPLIBS | sed -e 's/ */ /g'` AC_SUBST(LCMS_LIB_DEPLIBS) # Libraries that the jpegicc program depends on JPEGICC_DEPLIBS="$LIB_JPEG $LIB_MATH $LIB_THREAD" JPEGICC_DEPLIBS=`echo $JPEGICC_DEPLIBS | sed -e 's/ */ /g'` AC_SUBST(JPEGICC_DEPLIBS) # Libraries that the tifficc program depends on TIFFICC_DEPLIBS="$LIB_TIFF $LIB_JPEG $LIB_ZLIB $LIB_MATH $LIB_THREAD" TIFFICC_DEPLIBS=`echo $TIFFICC_DEPLIBS | sed -e 's/ */ /g'` AC_SUBST(TIFFICC_DEPLIBS) LIBS='' # # Perform substitutions # AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([lcms2.pc]) AC_CONFIG_FILES([include/Makefile]) AC_CONFIG_FILES([src/Makefile]) AC_CONFIG_FILES([utils/tificc/Makefile]) AC_CONFIG_FILES([utils/transicc/Makefile]) AC_CONFIG_FILES([utils/linkicc/Makefile]) AC_CONFIG_FILES([utils/jpgicc/Makefile]) AC_CONFIG_FILES([utils/psicc/Makefile]) AC_CONFIG_FILES([testbed/Makefile]) AC_OUTPUT lcms2-2.6/include/0000755002406300000240000000000012311617072013351 5ustar mariamauserslcms2-2.6/include/Makefile.in0000644002406300000240000003533412311617072015426 0ustar mariamausers# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for include directory # Based on a work by Bob Friesenhahn VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = include DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(includedir)" HEADERS = $(include_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ include_HEADERS = lcms2.h lcms2_plugin.h EXTRA_DIST = lcms2.h lcms2_plugin.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: for dir in "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool ctags distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-includeHEADERS install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags uninstall uninstall-am uninstall-includeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lcms2-2.6/include/lcms2_plugin.h0000644002406300000240000006765612311617072016144 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // // This is the plug-in header file. Normal LittleCMS clients should not use it. // It is provided for plug-in writters that may want to access the support // functions to do low level operations. All plug-in related structures // are defined here. Including this file forces to include the standard API too. #ifndef _lcms_plugin_H // Deal with Microsoft's attempt at deprecating C standard runtime functions #ifdef _MSC_VER # if (_MSC_VER >= 1400) # ifndef _CRT_SECURE_NO_DEPRECATE # define _CRT_SECURE_NO_DEPRECATE # endif # ifndef _CRT_SECURE_NO_WARNINGS # define _CRT_SECURE_NO_WARNINGS # endif # endif #endif #ifndef _lcms2_H #include "lcms2.h" #endif // We need some standard C functions. #include #include #include #include #include #ifndef CMS_USE_CPP_API # ifdef __cplusplus extern "C" { # endif #endif // Vector & Matrix operations ----------------------------------------------------------------------- // Axis of the matrix/array. No specific meaning at all. #define VX 0 #define VY 1 #define VZ 2 // Vectors typedef struct { cmsFloat64Number n[3]; } cmsVEC3; // 3x3 Matrix typedef struct { cmsVEC3 v[3]; } cmsMAT3; CMSAPI void CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z); CMSAPI void CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b); CMSAPI void CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v); CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v); CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3length(const cmsVEC3* a); CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b); CMSAPI void CMSEXPORT _cmsMAT3identity(cmsMAT3* a); CMSAPI cmsBool CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a); CMSAPI void CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b); CMSAPI cmsBool CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b); CMSAPI cmsBool CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b); CMSAPI void CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v); // Error logging ------------------------------------------------------------------------------------- CMSAPI void CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...); // Memory management ---------------------------------------------------------------------------------- CMSAPI void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size); CMSAPI void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size); CMSAPI void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size); CMSAPI void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize); CMSAPI void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr); CMSAPI void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size); // I/O handler ---------------------------------------------------------------------------------- struct _cms_io_handler { void* stream; // Associated stream, which is implemented differently depending on media. cmsContext ContextID; cmsUInt32Number UsedSpace; cmsUInt32Number ReportedSize; char PhysicalFile[cmsMAX_PATH]; cmsUInt32Number (* Read)(struct _cms_io_handler* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count); cmsBool (* Seek)(struct _cms_io_handler* iohandler, cmsUInt32Number offset); cmsBool (* Close)(struct _cms_io_handler* iohandler); cmsUInt32Number (* Tell)(struct _cms_io_handler* iohandler); cmsBool (* Write)(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void* Buffer); }; // Endianess adjust functions CMSAPI cmsUInt16Number CMSEXPORT _cmsAdjustEndianess16(cmsUInt16Number Word); CMSAPI cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number Value); CMSAPI void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord); // Helper IO functions CMSAPI cmsBool CMSEXPORT _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n); CMSAPI cmsBool CMSEXPORT _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n); CMSAPI cmsBool CMSEXPORT _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n); CMSAPI cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n); CMSAPI cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n); CMSAPI cmsBool CMSEXPORT _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n); CMSAPI cmsBool CMSEXPORT _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ); CMSAPI cmsBool CMSEXPORT _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n); CMSAPI cmsBool CMSEXPORT _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n); CMSAPI cmsBool CMSEXPORT _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ); CMSAPI cmsBool CMSEXPORT _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array); // ICC base tag typedef struct { cmsTagTypeSignature sig; cmsInt8Number reserved[4]; } _cmsTagBase; // Type base helper functions CMSAPI cmsTagTypeSignature CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io); CMSAPI cmsBool CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig); // Alignment functions CMSAPI cmsBool CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io); CMSAPI cmsBool CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io); // To deal with text streams. 2K at most CMSAPI cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...); // Fixed point helper functions CMSAPI cmsFloat64Number CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8); CMSAPI cmsUInt16Number CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val); CMSAPI cmsFloat64Number CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32); CMSAPI cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v); // Date/time helper functions CMSAPI void CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source); CMSAPI void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest); //---------------------------------------------------------------------------------------------------------- // Shared callbacks for user data typedef void (* _cmsFreeUserDataFn)(cmsContext ContextID, void* Data); typedef void* (* _cmsDupUserDataFn)(cmsContext ContextID, const void* Data); //---------------------------------------------------------------------------------------------------------- // Plug-in foundation #define cmsPluginMagicNumber 0x61637070 // 'acpp' #define cmsPluginMemHandlerSig 0x6D656D48 // 'memH' #define cmsPluginInterpolationSig 0x696E7048 // 'inpH' #define cmsPluginParametricCurveSig 0x70617248 // 'parH' #define cmsPluginFormattersSig 0x66726D48 // 'frmH #define cmsPluginTagTypeSig 0x74797048 // 'typH' #define cmsPluginTagSig 0x74616748 // 'tagH' #define cmsPluginRenderingIntentSig 0x696E7448 // 'intH' #define cmsPluginMultiProcessElementSig 0x6D706548 // 'mpeH' #define cmsPluginOptimizationSig 0x6F707448 // 'optH' #define cmsPluginTransformSig 0x7A666D48 // 'xfmH' #define cmsPluginMutexSig 0x6D747A48 // 'mtxH' typedef struct _cmsPluginBaseStruct { cmsUInt32Number Magic; // 'acpp' signature cmsUInt32Number ExpectedVersion; // Expected version of LittleCMS cmsUInt32Number Type; // Type of plug-in struct _cmsPluginBaseStruct* Next; // For multiple plugin definition. NULL for end of list. } cmsPluginBase; // Maximum number of types in a plugin array #define MAX_TYPES_IN_LCMS_PLUGIN 20 //---------------------------------------------------------------------------------------------------------- // Memory handler. Each new plug-in type replaces current behaviour typedef void* (* _cmsMallocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); typedef void (* _cmsFreeFnPtrType)(cmsContext ContextID, void *Ptr); typedef void* (* _cmsReallocFnPtrType)(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize); typedef void* (* _cmsMalloZerocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); typedef void* (* _cmsCallocFnPtrType)(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size); typedef void* (* _cmsDupFnPtrType)(cmsContext ContextID, const void* Org, cmsUInt32Number size); typedef struct { cmsPluginBase base; // Required _cmsMallocFnPtrType MallocPtr; _cmsFreeFnPtrType FreePtr; _cmsReallocFnPtrType ReallocPtr; // Optional _cmsMalloZerocFnPtrType MallocZeroPtr; _cmsCallocFnPtrType CallocPtr; _cmsDupFnPtrType DupPtr; } cmsPluginMemHandler; // ------------------------------------------------------------------------------------------------------------------ // Interpolation. 16 bits and floating point versions. struct _cms_interp_struc; // Interpolation callbacks // 16 bits forward interpolation. This function performs precision-limited linear interpolation // and is supposed to be quite fast. Implementation may be tetrahedral or trilinear, and plug-ins may // choose to implement any other interpolation algorithm. typedef void (* _cmsInterpFn16)(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const struct _cms_interp_struc* p); // Floating point forward interpolation. Full precision interpolation using floats. This is not a // time critical function. Implementation may be tetrahedral or trilinear, and plug-ins may // choose to implement any other interpolation algorithm. typedef void (* _cmsInterpFnFloat)(cmsFloat32Number const Input[], cmsFloat32Number Output[], const struct _cms_interp_struc* p); // This type holds a pointer to an interpolator that can be either 16 bits or float typedef union { _cmsInterpFn16 Lerp16; // Forward interpolation in 16 bits _cmsInterpFnFloat LerpFloat; // Forward interpolation in floating point } cmsInterpFunction; // Flags for interpolator selection #define CMS_LERP_FLAGS_16BITS 0x0000 // The default #define CMS_LERP_FLAGS_FLOAT 0x0001 // Requires different implementation #define CMS_LERP_FLAGS_TRILINEAR 0x0100 // Hint only #define MAX_INPUT_DIMENSIONS 8 typedef struct _cms_interp_struc { // Used on all interpolations. Supplied by lcms2 when calling the interpolation function cmsContext ContextID; // The calling thread cmsUInt32Number dwFlags; // Keep original flags cmsUInt32Number nInputs; // != 1 only in 3D interpolation cmsUInt32Number nOutputs; // != 1 only in 3D interpolation cmsUInt32Number nSamples[MAX_INPUT_DIMENSIONS]; // Valid on all kinds of tables cmsUInt32Number Domain[MAX_INPUT_DIMENSIONS]; // Domain = nSamples - 1 cmsUInt32Number opta[MAX_INPUT_DIMENSIONS]; // Optimization for 3D CLUT. This is the number of nodes premultiplied for each // dimension. For example, in 7 nodes, 7, 7^2 , 7^3, 7^4, etc. On non-regular // Samplings may vary according of the number of nodes for each dimension. const void *Table; // Points to the actual interpolation table cmsInterpFunction Interpolation; // Points to the function to do the interpolation } cmsInterpParams; // Interpolators factory typedef cmsInterpFunction (* cmsInterpFnFactory)(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags); // The plug-in typedef struct { cmsPluginBase base; // Points to a user-supplied function which implements the factory cmsInterpFnFactory InterpolatorsFactory; } cmsPluginInterpolation; //---------------------------------------------------------------------------------------------------------- // Parametric curves. A negative type means same function but analytically inverted. Max. number of params is 10 // Evaluator callback for user-suplied parametric curves. May implement more than one type typedef cmsFloat64Number (* cmsParametricCurveEvaluator)(cmsInt32Number Type, const cmsFloat64Number Params[10], cmsFloat64Number R); // Plug-in may implement an arbitrary number of parametric curves typedef struct { cmsPluginBase base; cmsUInt32Number nFunctions; // Number of supported functions cmsUInt32Number FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN]; // The identification types cmsUInt32Number ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN]; // Number of parameters for each function cmsParametricCurveEvaluator Evaluator; // The evaluator } cmsPluginParametricCurves; //---------------------------------------------------------------------------------------------------------- // Formatters. This plug-in adds new handlers, replacing them if they already exist. Formatters dealing with // cmsFloat32Number (bps = 4) or double (bps = 0) types are requested via FormatterFloat callback. Others come across // Formatter16 callback struct _cmstransform_struct; typedef cmsUInt8Number* (* cmsFormatter16)(register struct _cmstransform_struct* CMMcargo, register cmsUInt16Number Values[], register cmsUInt8Number* Buffer, register cmsUInt32Number Stride); typedef cmsUInt8Number* (* cmsFormatterFloat)(struct _cmstransform_struct* CMMcargo, cmsFloat32Number Values[], cmsUInt8Number* Buffer, cmsUInt32Number Stride); // This type holds a pointer to a formatter that can be either 16 bits or cmsFloat32Number typedef union { cmsFormatter16 Fmt16; cmsFormatterFloat FmtFloat; } cmsFormatter; #define CMS_PACK_FLAGS_16BITS 0x0000 #define CMS_PACK_FLAGS_FLOAT 0x0001 typedef enum { cmsFormatterInput=0, cmsFormatterOutput=1 } cmsFormatterDirection; typedef cmsFormatter (* cmsFormatterFactory)(cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 cmsFormatterDirection Dir, cmsUInt32Number dwFlags); // precision // Plug-in may implement an arbitrary number of formatters typedef struct { cmsPluginBase base; cmsFormatterFactory FormattersFactory; } cmsPluginFormatters; //---------------------------------------------------------------------------------------------------------- // Tag type handler. Each type is free to return anything it wants, and it is up to the caller to // know in advance what is the type contained in the tag. typedef struct _cms_typehandler_struct { cmsTagTypeSignature Signature; // The signature of the type // Allocates and reads items void * (* ReadPtr)(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag); // Writes n Items cmsBool (* WritePtr)(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems); // Duplicate an item or array of items void* (* DupPtr)(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n); // Free all resources void (* FreePtr)(struct _cms_typehandler_struct* self, void *Ptr); // Additional parameters used by the calling thread cmsContext ContextID; cmsUInt32Number ICCVersion; } cmsTagTypeHandler; // Each plug-in implements a single type typedef struct { cmsPluginBase base; cmsTagTypeHandler Handler; } cmsPluginTagType; //---------------------------------------------------------------------------------------------------------- // This is the tag plugin, which identifies tags. For writing, a pointer to function is provided. // This function should return the desired type for this tag, given the version of profile // and the data being serialized. typedef struct { cmsUInt32Number ElemCount; // If this tag needs an array, how many elements should keep // For reading. cmsUInt32Number nSupportedTypes; // In how many types this tag can come (MAX_TYPES_IN_LCMS_PLUGIN maximum) cmsTagTypeSignature SupportedTypes[MAX_TYPES_IN_LCMS_PLUGIN]; // For writting cmsTagTypeSignature (* DecideType)(cmsFloat64Number ICCVersion, const void *Data); } cmsTagDescriptor; // Plug-in implements a single tag typedef struct { cmsPluginBase base; cmsTagSignature Signature; cmsTagDescriptor Descriptor; } cmsPluginTag; //---------------------------------------------------------------------------------------------------------- // Custom intents. This function should join all profiles specified in the array in // a single LUT. Any custom intent in the chain redirects to custom function. If more than // one custom intent is found, the one located first is invoked. Usually users should use only one // custom intent, so mixing custom intents in same multiprofile transform is not supported. typedef cmsPipeline* (* cmsIntentFn)( cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number Intents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); // Each plug-in defines a single intent number. typedef struct { cmsPluginBase base; cmsUInt32Number Intent; cmsIntentFn Link; char Description[256]; } cmsPluginRenderingIntent; // The default ICC intents (perceptual, saturation, rel.col and abs.col) CMSAPI cmsPipeline* CMSEXPORT _cmsDefaultICCintents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number Intents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); //---------------------------------------------------------------------------------------------------------- // Pipelines, Multi Process Elements. typedef void (* _cmsStageEvalFn) (const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage* mpe); typedef void*(* _cmsStageDupElemFn) (cmsStage* mpe); typedef void (* _cmsStageFreeElemFn) (cmsStage* mpe); // This function allocates a generic MPE CMSAPI cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID, cmsStageSignature Type, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels, _cmsStageEvalFn EvalPtr, // Points to fn that evaluates the element (always in floating point) _cmsStageDupElemFn DupElemPtr, // Points to a fn that duplicates the stage _cmsStageFreeElemFn FreePtr, // Points to a fn that sets the element free void* Data); // A generic pointer to whatever memory needed by the element typedef struct { cmsPluginBase base; cmsTagTypeHandler Handler; } cmsPluginMultiProcessElement; // Data kept in "Element" member of cmsStage // Curves typedef struct { cmsUInt32Number nCurves; cmsToneCurve** TheCurves; } _cmsStageToneCurvesData; // Matrix typedef struct { cmsFloat64Number* Double; // floating point for the matrix cmsFloat64Number* Offset; // The offset } _cmsStageMatrixData; // CLUT typedef struct { union { // Can have only one of both representations at same time cmsUInt16Number* T; // Points to the table 16 bits table cmsFloat32Number* TFloat; // Points to the cmsFloat32Number table } Tab; cmsInterpParams* Params; cmsUInt32Number nEntries; cmsBool HasFloatValues; } _cmsStageCLutData; //---------------------------------------------------------------------------------------------------------- // Optimization. Using this plug-in, additional optimization strategies may be implemented. // The function should return TRUE if any optimization is done on the LUT, this terminates // the optimization search. Or FALSE if it is unable to optimize and want to give a chance // to the rest of optimizers. typedef void (* _cmsOPTeval16Fn)(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register const void* Data); typedef cmsBool (* _cmsOPToptimizeFn)(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); // This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional // duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality. CMSAPI void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut, _cmsOPTeval16Fn Eval16, void* PrivateData, _cmsFreeUserDataFn FreePrivateDataFn, _cmsDupUserDataFn DupPrivateDataFn); typedef struct { cmsPluginBase base; // Optimize entry point _cmsOPToptimizeFn OptimizePtr; } cmsPluginOptimization; //---------------------------------------------------------------------------------------------------------- // Full xform typedef void (* _cmsTransformFn)(struct _cmstransform_struct *CMMcargo, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number Size, cmsUInt32Number Stride); typedef cmsBool (* _cmsTransformFactory)(_cmsTransformFn* xform, void** UserData, _cmsFreeUserDataFn* FreePrivateDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags); // Retrieve user data as specified by the factory CMSAPI void CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn); CMSAPI void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo); // Retrieve formatters CMSAPI void CMSEXPORT _cmsGetTransformFormatters16 (struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput); CMSAPI void CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput); typedef struct { cmsPluginBase base; // Transform entry point _cmsTransformFactory Factory; } cmsPluginTransform; //---------------------------------------------------------------------------------------------------------- // Mutex typedef void* (* _cmsCreateMutexFnPtrType)(cmsContext ContextID); typedef void (* _cmsDestroyMutexFnPtrType)(cmsContext ContextID, void* mtx); typedef cmsBool (* _cmsLockMutexFnPtrType)(cmsContext ContextID, void* mtx); typedef void (* _cmsUnlockMutexFnPtrType)(cmsContext ContextID, void* mtx); typedef struct { cmsPluginBase base; _cmsCreateMutexFnPtrType CreateMutexPtr; _cmsDestroyMutexFnPtrType DestroyMutexPtr; _cmsLockMutexFnPtrType LockMutexPtr; _cmsUnlockMutexFnPtrType UnlockMutexPtr; } cmsPluginMutex; CMSAPI void* CMSEXPORT _cmsCreateMutex(cmsContext ContextID); CMSAPI void CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx); CMSAPI cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx); CMSAPI void CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx); #ifndef CMS_USE_CPP_API # ifdef __cplusplus } # endif #endif #define _lcms_plugin_H #endif lcms2-2.6/include/Makefile.am0000644002406300000240000000022712311617072015406 0ustar mariamausers# # Makefile for include directory # Based on a work by Bob Friesenhahn include_HEADERS = lcms2.h lcms2_plugin.h EXTRA_DIST = lcms2.h lcms2_plugin.h lcms2-2.6/include/lcms2.h0000644002406300000240000030332212311617072014545 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // // Version 2.6 // #ifndef _lcms2_H // ********** Configuration toggles **************************************** // Uncomment this one if you are using big endian machines // #define CMS_USE_BIG_ENDIAN 1 // Uncomment this one if your compiler/machine does NOT support the // "long long" type. // #define CMS_DONT_USE_INT64 1 // Uncomment this if your compiler doesn't work with fast floor function // #define CMS_DONT_USE_FAST_FLOOR 1 // Uncomment this line if you want lcms to use the black point tag in profile, // if commented, lcms will compute the black point by its own. // It is safer to leave it commented out // #define CMS_USE_PROFILE_BLACK_POINT_TAG 1 // Uncomment this line if you are compiling as C++ and want a C++ API // #define CMS_USE_CPP_API // Uncomment this line if you need strict CGATS syntax. Makes CGATS files to // require "KEYWORD" on undefined identifiers, keep it comented out unless needed // #define CMS_STRICT_CGATS 1 // Uncomment to get rid of the tables for "half" float support // #define CMS_NO_HALF_SUPPORT 1 // Uncomment to get rid of pthreads/windows dependency // #define CMS_NO_PTHREADS 1 // ********** End of configuration toggles ****************************** // Needed for streams #include // Needed for portability (C99 per 7.1.2) #include #include #include #ifndef CMS_USE_CPP_API # ifdef __cplusplus extern "C" { # endif #endif // Version/release #define LCMS_VERSION 2060 // I will give the chance of redefining basic types for compilers that are not fully C99 compliant #ifndef CMS_BASIC_TYPES_ALREADY_DEFINED // Base types typedef unsigned char cmsUInt8Number; // That is guaranteed by the C99 spec typedef signed char cmsInt8Number; // That is guaranteed by the C99 spec #if CHAR_BIT != 8 # error "Unable to find 8 bit type, unsupported compiler" #endif // IEEE float storage numbers typedef float cmsFloat32Number; typedef double cmsFloat64Number; // 16-bit base types #if (USHRT_MAX == 65535U) typedef unsigned short cmsUInt16Number; #elif (UINT_MAX == 65535U) typedef unsigned int cmsUInt16Number; #else # error "Unable to find 16 bits unsigned type, unsupported compiler" #endif #if (SHRT_MAX == 32767) typedef short cmsInt16Number; #elif (INT_MAX == 32767) typedef int cmsInt16Number; #else # error "Unable to find 16 bits signed type, unsupported compiler" #endif // 32-bit base type #if (UINT_MAX == 4294967295U) typedef unsigned int cmsUInt32Number; #elif (ULONG_MAX == 4294967295U) typedef unsigned long cmsUInt32Number; #else # error "Unable to find 32 bit unsigned type, unsupported compiler" #endif #if (INT_MAX == +2147483647) typedef int cmsInt32Number; #elif (LONG_MAX == +2147483647) typedef long cmsInt32Number; #else # error "Unable to find 32 bit signed type, unsupported compiler" #endif // 64-bit base types #ifndef CMS_DONT_USE_INT64 # if (ULONG_MAX == 18446744073709551615U) typedef unsigned long cmsUInt64Number; # elif (ULLONG_MAX == 18446744073709551615U) typedef unsigned long long cmsUInt64Number; # else # define CMS_DONT_USE_INT64 1 # endif # if (LONG_MAX == +9223372036854775807) typedef long cmsInt64Number; # elif (LLONG_MAX == +9223372036854775807) typedef long long cmsInt64Number; # else # define CMS_DONT_USE_INT64 1 # endif #endif #endif // In the case 64 bit numbers are not supported by the compiler #ifdef CMS_DONT_USE_INT64 typedef cmsUInt32Number cmsUInt64Number[2]; typedef cmsInt32Number cmsInt64Number[2]; #endif // Derivative types typedef cmsUInt32Number cmsSignature; typedef cmsUInt16Number cmsU8Fixed8Number; typedef cmsInt32Number cmsS15Fixed16Number; typedef cmsUInt32Number cmsU16Fixed16Number; // Boolean type, which will be using the native integer typedef int cmsBool; // Try to detect windows #if defined (_WIN32) || defined(_WIN64) || defined(WIN32) || defined(_WIN32_) # define CMS_IS_WINDOWS_ 1 #endif #ifdef _MSC_VER # define CMS_IS_WINDOWS_ 1 #endif #ifdef __BORLANDC__ # define CMS_IS_WINDOWS_ 1 #endif // Try to detect big endian platforms. This list can be endless, so only some checks are performed over here. // you can pass this toggle to the compiler by using -DCMS_USE_BIG_ENDIAN or something similar #if defined(__sgi__) || defined(__sgi) || defined(sparc) # define CMS_USE_BIG_ENDIAN 1 #endif #if defined(__s390__) || defined(__s390x__) # define CMS_USE_BIG_ENDIAN 1 #endif # ifdef TARGET_CPU_PPC # if TARGET_CPU_PPC # define CMS_USE_BIG_ENDIAN 1 # endif # endif #if defined(__powerpc__) || defined(__ppc__) || defined(TARGET_CPU_PPC) # define CMS_USE_BIG_ENDIAN 1 # if defined (__GNUC__) && defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) # if __BYTE_ORDER == __LITTLE_ENDIAN // // Don't use big endian for PowerPC little endian mode # undef CMS_USE_BIG_ENDIAN # endif # endif #endif // WORDS_BIGENDIAN takes precedence #if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(WORDS_BIGENDIAN) # define CMS_USE_BIG_ENDIAN 1 #endif #ifdef macintosh # ifdef __BIG_ENDIAN__ # define CMS_USE_BIG_ENDIAN 1 # endif # ifdef __LITTLE_ENDIAN__ # undef CMS_USE_BIG_ENDIAN # endif #endif // Calling convention -- this is hardly platform and compiler dependent #ifdef CMS_IS_WINDOWS_ # if defined(CMS_DLL) || defined(CMS_DLL_BUILD) # ifdef __BORLANDC__ # define CMSEXPORT __stdcall _export # define CMSAPI # else # define CMSEXPORT _stdcall # ifdef CMS_DLL_BUILD # define CMSAPI __declspec(dllexport) # else # define CMSAPI __declspec(dllimport) # endif # endif # else # define CMSEXPORT # define CMSAPI # endif #else # define CMSEXPORT # define CMSAPI #endif #ifdef HasTHREADS # if HasTHREADS == 1 # undef CMS_NO_PTHREADS # else # define CMS_NO_PTHREADS 1 # endif #endif // Some common definitions #define cmsMAX_PATH 256 #ifndef FALSE # define FALSE 0 #endif #ifndef TRUE # define TRUE 1 #endif // D50 XYZ normalized to Y=1.0 #define cmsD50X 0.9642 #define cmsD50Y 1.0 #define cmsD50Z 0.8249 // V4 perceptual black #define cmsPERCEPTUAL_BLACK_X 0.00336 #define cmsPERCEPTUAL_BLACK_Y 0.0034731 #define cmsPERCEPTUAL_BLACK_Z 0.00287 // Definitions in ICC spec #define cmsMagicNumber 0x61637370 // 'acsp' #define lcmsSignature 0x6c636d73 // 'lcms' // Base ICC type definitions typedef enum { cmsSigChromaticityType = 0x6368726D, // 'chrm' cmsSigColorantOrderType = 0x636C726F, // 'clro' cmsSigColorantTableType = 0x636C7274, // 'clrt' cmsSigCrdInfoType = 0x63726469, // 'crdi' cmsSigCurveType = 0x63757276, // 'curv' cmsSigDataType = 0x64617461, // 'data' cmsSigDictType = 0x64696374, // 'dict' cmsSigDateTimeType = 0x6474696D, // 'dtim' cmsSigDeviceSettingsType = 0x64657673, // 'devs' cmsSigLut16Type = 0x6d667432, // 'mft2' cmsSigLut8Type = 0x6d667431, // 'mft1' cmsSigLutAtoBType = 0x6d414220, // 'mAB ' cmsSigLutBtoAType = 0x6d424120, // 'mBA ' cmsSigMeasurementType = 0x6D656173, // 'meas' cmsSigMultiLocalizedUnicodeType = 0x6D6C7563, // 'mluc' cmsSigMultiProcessElementType = 0x6D706574, // 'mpet' cmsSigNamedColorType = 0x6E636f6C, // 'ncol' -- DEPRECATED! cmsSigNamedColor2Type = 0x6E636C32, // 'ncl2' cmsSigParametricCurveType = 0x70617261, // 'para' cmsSigProfileSequenceDescType = 0x70736571, // 'pseq' cmsSigProfileSequenceIdType = 0x70736964, // 'psid' cmsSigResponseCurveSet16Type = 0x72637332, // 'rcs2' cmsSigS15Fixed16ArrayType = 0x73663332, // 'sf32' cmsSigScreeningType = 0x7363726E, // 'scrn' cmsSigSignatureType = 0x73696720, // 'sig ' cmsSigTextType = 0x74657874, // 'text' cmsSigTextDescriptionType = 0x64657363, // 'desc' cmsSigU16Fixed16ArrayType = 0x75663332, // 'uf32' cmsSigUcrBgType = 0x62666420, // 'bfd ' cmsSigUInt16ArrayType = 0x75693136, // 'ui16' cmsSigUInt32ArrayType = 0x75693332, // 'ui32' cmsSigUInt64ArrayType = 0x75693634, // 'ui64' cmsSigUInt8ArrayType = 0x75693038, // 'ui08' cmsSigVcgtType = 0x76636774, // 'vcgt' cmsSigViewingConditionsType = 0x76696577, // 'view' cmsSigXYZType = 0x58595A20 // 'XYZ ' } cmsTagTypeSignature; // Base ICC tag definitions typedef enum { cmsSigAToB0Tag = 0x41324230, // 'A2B0' cmsSigAToB1Tag = 0x41324231, // 'A2B1' cmsSigAToB2Tag = 0x41324232, // 'A2B2' cmsSigBlueColorantTag = 0x6258595A, // 'bXYZ' cmsSigBlueMatrixColumnTag = 0x6258595A, // 'bXYZ' cmsSigBlueTRCTag = 0x62545243, // 'bTRC' cmsSigBToA0Tag = 0x42324130, // 'B2A0' cmsSigBToA1Tag = 0x42324131, // 'B2A1' cmsSigBToA2Tag = 0x42324132, // 'B2A2' cmsSigCalibrationDateTimeTag = 0x63616C74, // 'calt' cmsSigCharTargetTag = 0x74617267, // 'targ' cmsSigChromaticAdaptationTag = 0x63686164, // 'chad' cmsSigChromaticityTag = 0x6368726D, // 'chrm' cmsSigColorantOrderTag = 0x636C726F, // 'clro' cmsSigColorantTableTag = 0x636C7274, // 'clrt' cmsSigColorantTableOutTag = 0x636C6F74, // 'clot' cmsSigColorimetricIntentImageStateTag = 0x63696973, // 'ciis' cmsSigCopyrightTag = 0x63707274, // 'cprt' cmsSigCrdInfoTag = 0x63726469, // 'crdi' cmsSigDataTag = 0x64617461, // 'data' cmsSigDateTimeTag = 0x6474696D, // 'dtim' cmsSigDeviceMfgDescTag = 0x646D6E64, // 'dmnd' cmsSigDeviceModelDescTag = 0x646D6464, // 'dmdd' cmsSigDeviceSettingsTag = 0x64657673, // 'devs' cmsSigDToB0Tag = 0x44324230, // 'D2B0' cmsSigDToB1Tag = 0x44324231, // 'D2B1' cmsSigDToB2Tag = 0x44324232, // 'D2B2' cmsSigDToB3Tag = 0x44324233, // 'D2B3' cmsSigBToD0Tag = 0x42324430, // 'B2D0' cmsSigBToD1Tag = 0x42324431, // 'B2D1' cmsSigBToD2Tag = 0x42324432, // 'B2D2' cmsSigBToD3Tag = 0x42324433, // 'B2D3' cmsSigGamutTag = 0x67616D74, // 'gamt' cmsSigGrayTRCTag = 0x6b545243, // 'kTRC' cmsSigGreenColorantTag = 0x6758595A, // 'gXYZ' cmsSigGreenMatrixColumnTag = 0x6758595A, // 'gXYZ' cmsSigGreenTRCTag = 0x67545243, // 'gTRC' cmsSigLuminanceTag = 0x6C756d69, // 'lumi' cmsSigMeasurementTag = 0x6D656173, // 'meas' cmsSigMediaBlackPointTag = 0x626B7074, // 'bkpt' cmsSigMediaWhitePointTag = 0x77747074, // 'wtpt' cmsSigNamedColorTag = 0x6E636f6C, // 'ncol' // Deprecated by the ICC cmsSigNamedColor2Tag = 0x6E636C32, // 'ncl2' cmsSigOutputResponseTag = 0x72657370, // 'resp' cmsSigPerceptualRenderingIntentGamutTag = 0x72696730, // 'rig0' cmsSigPreview0Tag = 0x70726530, // 'pre0' cmsSigPreview1Tag = 0x70726531, // 'pre1' cmsSigPreview2Tag = 0x70726532, // 'pre2' cmsSigProfileDescriptionTag = 0x64657363, // 'desc' cmsSigProfileDescriptionMLTag = 0x6473636d, // 'dscm' cmsSigProfileSequenceDescTag = 0x70736571, // 'pseq' cmsSigProfileSequenceIdTag = 0x70736964, // 'psid' cmsSigPs2CRD0Tag = 0x70736430, // 'psd0' cmsSigPs2CRD1Tag = 0x70736431, // 'psd1' cmsSigPs2CRD2Tag = 0x70736432, // 'psd2' cmsSigPs2CRD3Tag = 0x70736433, // 'psd3' cmsSigPs2CSATag = 0x70733273, // 'ps2s' cmsSigPs2RenderingIntentTag = 0x70733269, // 'ps2i' cmsSigRedColorantTag = 0x7258595A, // 'rXYZ' cmsSigRedMatrixColumnTag = 0x7258595A, // 'rXYZ' cmsSigRedTRCTag = 0x72545243, // 'rTRC' cmsSigSaturationRenderingIntentGamutTag = 0x72696732, // 'rig2' cmsSigScreeningDescTag = 0x73637264, // 'scrd' cmsSigScreeningTag = 0x7363726E, // 'scrn' cmsSigTechnologyTag = 0x74656368, // 'tech' cmsSigUcrBgTag = 0x62666420, // 'bfd ' cmsSigViewingCondDescTag = 0x76756564, // 'vued' cmsSigViewingConditionsTag = 0x76696577, // 'view' cmsSigVcgtTag = 0x76636774, // 'vcgt' cmsSigMetaTag = 0x6D657461 // 'meta' } cmsTagSignature; // ICC Technology tag typedef enum { cmsSigDigitalCamera = 0x6463616D, // 'dcam' cmsSigFilmScanner = 0x6673636E, // 'fscn' cmsSigReflectiveScanner = 0x7273636E, // 'rscn' cmsSigInkJetPrinter = 0x696A6574, // 'ijet' cmsSigThermalWaxPrinter = 0x74776178, // 'twax' cmsSigElectrophotographicPrinter = 0x6570686F, // 'epho' cmsSigElectrostaticPrinter = 0x65737461, // 'esta' cmsSigDyeSublimationPrinter = 0x64737562, // 'dsub' cmsSigPhotographicPaperPrinter = 0x7270686F, // 'rpho' cmsSigFilmWriter = 0x6670726E, // 'fprn' cmsSigVideoMonitor = 0x7669646D, // 'vidm' cmsSigVideoCamera = 0x76696463, // 'vidc' cmsSigProjectionTelevision = 0x706A7476, // 'pjtv' cmsSigCRTDisplay = 0x43525420, // 'CRT ' cmsSigPMDisplay = 0x504D4420, // 'PMD ' cmsSigAMDisplay = 0x414D4420, // 'AMD ' cmsSigPhotoCD = 0x4B504344, // 'KPCD' cmsSigPhotoImageSetter = 0x696D6773, // 'imgs' cmsSigGravure = 0x67726176, // 'grav' cmsSigOffsetLithography = 0x6F666673, // 'offs' cmsSigSilkscreen = 0x73696C6B, // 'silk' cmsSigFlexography = 0x666C6578, // 'flex' cmsSigMotionPictureFilmScanner = 0x6D706673, // 'mpfs' cmsSigMotionPictureFilmRecorder = 0x6D706672, // 'mpfr' cmsSigDigitalMotionPictureCamera = 0x646D7063, // 'dmpc' cmsSigDigitalCinemaProjector = 0x64636A70 // 'dcpj' } cmsTechnologySignature; // ICC Color spaces typedef enum { cmsSigXYZData = 0x58595A20, // 'XYZ ' cmsSigLabData = 0x4C616220, // 'Lab ' cmsSigLuvData = 0x4C757620, // 'Luv ' cmsSigYCbCrData = 0x59436272, // 'YCbr' cmsSigYxyData = 0x59787920, // 'Yxy ' cmsSigRgbData = 0x52474220, // 'RGB ' cmsSigGrayData = 0x47524159, // 'GRAY' cmsSigHsvData = 0x48535620, // 'HSV ' cmsSigHlsData = 0x484C5320, // 'HLS ' cmsSigCmykData = 0x434D594B, // 'CMYK' cmsSigCmyData = 0x434D5920, // 'CMY ' cmsSigMCH1Data = 0x4D434831, // 'MCH1' cmsSigMCH2Data = 0x4D434832, // 'MCH2' cmsSigMCH3Data = 0x4D434833, // 'MCH3' cmsSigMCH4Data = 0x4D434834, // 'MCH4' cmsSigMCH5Data = 0x4D434835, // 'MCH5' cmsSigMCH6Data = 0x4D434836, // 'MCH6' cmsSigMCH7Data = 0x4D434837, // 'MCH7' cmsSigMCH8Data = 0x4D434838, // 'MCH8' cmsSigMCH9Data = 0x4D434839, // 'MCH9' cmsSigMCHAData = 0x4D434841, // 'MCHA' cmsSigMCHBData = 0x4D434842, // 'MCHB' cmsSigMCHCData = 0x4D434843, // 'MCHC' cmsSigMCHDData = 0x4D434844, // 'MCHD' cmsSigMCHEData = 0x4D434845, // 'MCHE' cmsSigMCHFData = 0x4D434846, // 'MCHF' cmsSigNamedData = 0x6e6d636c, // 'nmcl' cmsSig1colorData = 0x31434C52, // '1CLR' cmsSig2colorData = 0x32434C52, // '2CLR' cmsSig3colorData = 0x33434C52, // '3CLR' cmsSig4colorData = 0x34434C52, // '4CLR' cmsSig5colorData = 0x35434C52, // '5CLR' cmsSig6colorData = 0x36434C52, // '6CLR' cmsSig7colorData = 0x37434C52, // '7CLR' cmsSig8colorData = 0x38434C52, // '8CLR' cmsSig9colorData = 0x39434C52, // '9CLR' cmsSig10colorData = 0x41434C52, // 'ACLR' cmsSig11colorData = 0x42434C52, // 'BCLR' cmsSig12colorData = 0x43434C52, // 'CCLR' cmsSig13colorData = 0x44434C52, // 'DCLR' cmsSig14colorData = 0x45434C52, // 'ECLR' cmsSig15colorData = 0x46434C52, // 'FCLR' cmsSigLuvKData = 0x4C75764B // 'LuvK' } cmsColorSpaceSignature; // ICC Profile Class typedef enum { cmsSigInputClass = 0x73636E72, // 'scnr' cmsSigDisplayClass = 0x6D6E7472, // 'mntr' cmsSigOutputClass = 0x70727472, // 'prtr' cmsSigLinkClass = 0x6C696E6B, // 'link' cmsSigAbstractClass = 0x61627374, // 'abst' cmsSigColorSpaceClass = 0x73706163, // 'spac' cmsSigNamedColorClass = 0x6e6d636c // 'nmcl' } cmsProfileClassSignature; // ICC Platforms typedef enum { cmsSigMacintosh = 0x4150504C, // 'APPL' cmsSigMicrosoft = 0x4D534654, // 'MSFT' cmsSigSolaris = 0x53554E57, // 'SUNW' cmsSigSGI = 0x53474920, // 'SGI ' cmsSigTaligent = 0x54474E54, // 'TGNT' cmsSigUnices = 0x2A6E6978 // '*nix' // From argyll -- Not official } cmsPlatformSignature; // Reference gamut #define cmsSigPerceptualReferenceMediumGamut 0x70726d67 //'prmg' // For cmsSigColorimetricIntentImageStateTag #define cmsSigSceneColorimetryEstimates 0x73636F65 //'scoe' #define cmsSigSceneAppearanceEstimates 0x73617065 //'sape' #define cmsSigFocalPlaneColorimetryEstimates 0x66706365 //'fpce' #define cmsSigReflectionHardcopyOriginalColorimetry 0x72686F63 //'rhoc' #define cmsSigReflectionPrintOutputColorimetry 0x72706F63 //'rpoc' // Multi process elements types typedef enum { cmsSigCurveSetElemType = 0x63767374, //'cvst' cmsSigMatrixElemType = 0x6D617466, //'matf' cmsSigCLutElemType = 0x636C7574, //'clut' cmsSigBAcsElemType = 0x62414353, // 'bACS' cmsSigEAcsElemType = 0x65414353, // 'eACS' // Custom from here, not in the ICC Spec cmsSigXYZ2LabElemType = 0x6C327820, // 'l2x ' cmsSigLab2XYZElemType = 0x78326C20, // 'x2l ' cmsSigNamedColorElemType = 0x6E636C20, // 'ncl ' cmsSigLabV2toV4 = 0x32203420, // '2 4 ' cmsSigLabV4toV2 = 0x34203220, // '4 2 ' // Identities cmsSigIdentityElemType = 0x69646E20, // 'idn ' // Float to floatPCS cmsSigLab2FloatPCS = 0x64326C20, // 'd2l ' cmsSigFloatPCS2Lab = 0x6C326420, // 'l2d ' cmsSigXYZ2FloatPCS = 0x64327820, // 'd2x ' cmsSigFloatPCS2XYZ = 0x78326420 // 'x2d ' } cmsStageSignature; // Types of CurveElements typedef enum { cmsSigFormulaCurveSeg = 0x70617266, // 'parf' cmsSigSampledCurveSeg = 0x73616D66, // 'samf' cmsSigSegmentedCurve = 0x63757266 // 'curf' } cmsCurveSegSignature; // Used in ResponseCurveType #define cmsSigStatusA 0x53746141 //'StaA' #define cmsSigStatusE 0x53746145 //'StaE' #define cmsSigStatusI 0x53746149 //'StaI' #define cmsSigStatusT 0x53746154 //'StaT' #define cmsSigStatusM 0x5374614D //'StaM' #define cmsSigDN 0x444E2020 //'DN ' #define cmsSigDNP 0x444E2050 //'DN P' #define cmsSigDNN 0x444E4E20 //'DNN ' #define cmsSigDNNP 0x444E4E50 //'DNNP' // Device attributes, currently defined values correspond to the low 4 bytes // of the 8 byte attribute quantity #define cmsReflective 0 #define cmsTransparency 1 #define cmsGlossy 0 #define cmsMatte 2 // Common structures in ICC tags typedef struct { cmsUInt32Number len; cmsUInt32Number flag; cmsUInt8Number data[1]; } cmsICCData; // ICC date time typedef struct { cmsUInt16Number year; cmsUInt16Number month; cmsUInt16Number day; cmsUInt16Number hours; cmsUInt16Number minutes; cmsUInt16Number seconds; } cmsDateTimeNumber; // ICC XYZ typedef struct { cmsS15Fixed16Number X; cmsS15Fixed16Number Y; cmsS15Fixed16Number Z; } cmsEncodedXYZNumber; // Profile ID as computed by MD5 algorithm typedef union { cmsUInt8Number ID8[16]; cmsUInt16Number ID16[8]; cmsUInt32Number ID32[4]; } cmsProfileID; // ---------------------------------------------------------------------------------------------- // ICC profile internal base types. Strictly, shouldn't be declared in this header, but maybe // somebody want to use this info for accessing profile header directly, so here it is. // Profile header -- it is 32-bit aligned, so no issues are expected on alignment typedef struct { cmsUInt32Number size; // Profile size in bytes cmsSignature cmmId; // CMM for this profile cmsUInt32Number version; // Format version number cmsProfileClassSignature deviceClass; // Type of profile cmsColorSpaceSignature colorSpace; // Color space of data cmsColorSpaceSignature pcs; // PCS, XYZ or Lab only cmsDateTimeNumber date; // Date profile was created cmsSignature magic; // Magic Number to identify an ICC profile cmsPlatformSignature platform; // Primary Platform cmsUInt32Number flags; // Various bit settings cmsSignature manufacturer; // Device manufacturer cmsUInt32Number model; // Device model number cmsUInt64Number attributes; // Device attributes cmsUInt32Number renderingIntent;// Rendering intent cmsEncodedXYZNumber illuminant; // Profile illuminant cmsSignature creator; // Profile creator cmsProfileID profileID; // Profile ID using MD5 cmsInt8Number reserved[28]; // Reserved for future use } cmsICCHeader; // ICC base tag typedef struct { cmsTagTypeSignature sig; cmsInt8Number reserved[4]; } cmsTagBase; // A tag entry in directory typedef struct { cmsTagSignature sig; // The tag signature cmsUInt32Number offset; // Start of tag cmsUInt32Number size; // Size in bytes } cmsTagEntry; // ---------------------------------------------------------------------------------------------- // Little CMS specific typedefs typedef void* cmsHANDLE ; // Generic handle typedef void* cmsHPROFILE; // Opaque typedefs to hide internals typedef void* cmsHTRANSFORM; #define cmsMAXCHANNELS 16 // Maximum number of channels in ICC profiles // Format of pixel is defined by one cmsUInt32Number, using bit fields as follows // // 2 1 0 // 3 2 10987 6 5 4 3 2 1 098 7654 321 // A O TTTTT U Y F P X S EEE CCCC BBB // // A: Floating point -- With this flag we can differentiate 16 bits as float and as int // O: Optimized -- previous optimization already returns the final 8-bit value // T: Pixeltype // F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla) // P: Planar? 0=Chunky, 1=Planar // X: swap 16 bps endianess? // S: Do swap? ie, BGR, KYMC // E: Extra samples // C: Channels (Samples per pixel) // B: bytes per sample // Y: Swap first - changes ABGR to BGRA and KCMY to CMYK #define FLOAT_SH(a) ((a) << 22) #define OPTIMIZED_SH(s) ((s) << 21) #define COLORSPACE_SH(s) ((s) << 16) #define SWAPFIRST_SH(s) ((s) << 14) #define FLAVOR_SH(s) ((s) << 13) #define PLANAR_SH(p) ((p) << 12) #define ENDIAN16_SH(e) ((e) << 11) #define DOSWAP_SH(e) ((e) << 10) #define EXTRA_SH(e) ((e) << 7) #define CHANNELS_SH(c) ((c) << 3) #define BYTES_SH(b) (b) // These macros unpack format specifiers into integers #define T_FLOAT(a) (((a)>>22)&1) #define T_OPTIMIZED(o) (((o)>>21)&1) #define T_COLORSPACE(s) (((s)>>16)&31) #define T_SWAPFIRST(s) (((s)>>14)&1) #define T_FLAVOR(s) (((s)>>13)&1) #define T_PLANAR(p) (((p)>>12)&1) #define T_ENDIAN16(e) (((e)>>11)&1) #define T_DOSWAP(e) (((e)>>10)&1) #define T_EXTRA(e) (((e)>>7)&7) #define T_CHANNELS(c) (((c)>>3)&15) #define T_BYTES(b) ((b)&7) // Pixel types #define PT_ANY 0 // Don't check colorspace // 1 & 2 are reserved #define PT_GRAY 3 #define PT_RGB 4 #define PT_CMY 5 #define PT_CMYK 6 #define PT_YCbCr 7 #define PT_YUV 8 // Lu'v' #define PT_XYZ 9 #define PT_Lab 10 #define PT_YUVK 11 // Lu'v'K #define PT_HSV 12 #define PT_HLS 13 #define PT_Yxy 14 #define PT_MCH1 15 #define PT_MCH2 16 #define PT_MCH3 17 #define PT_MCH4 18 #define PT_MCH5 19 #define PT_MCH6 20 #define PT_MCH7 21 #define PT_MCH8 22 #define PT_MCH9 23 #define PT_MCH10 24 #define PT_MCH11 25 #define PT_MCH12 26 #define PT_MCH13 27 #define PT_MCH14 28 #define PT_MCH15 29 #define PT_LabV2 30 // Identical to PT_Lab, but using the V2 old encoding // Some (not all!) representations #ifndef TYPE_RGB_8 // TYPE_RGB_8 is a very common identifier, so don't include ours // if user has it already defined. #define TYPE_GRAY_8 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)) #define TYPE_GRAY_8_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1)) #define TYPE_GRAY_16 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)) #define TYPE_GRAY_16_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1)) #define TYPE_GRAY_16_SE (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_GRAYA_8 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)) #define TYPE_GRAYA_16 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)) #define TYPE_GRAYA_16_SE (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_GRAYA_8_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_GRAYA_16_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_RGB_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_RGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_BGR_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_BGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1)) #define TYPE_RGB_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_RGB_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_RGB_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_BGR_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_BGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1)) #define TYPE_BGR_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_RGBA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_RGBA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_RGBA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_RGBA_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_RGBA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_ARGB_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)) #define TYPE_ARGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1)) #define TYPE_ARGB_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)) #define TYPE_ABGR_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_ABGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1)) #define TYPE_ABGR_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_ABGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1)) #define TYPE_ABGR_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_BGRA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_BGRA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1)) #define TYPE_BGRA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_BGRA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_CMY_8 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_CMY_8_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_CMY_16 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_CMY_16_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_CMY_16_SE (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_CMYK_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)) #define TYPE_CMYKA_8 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1)) #define TYPE_CMYK_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)) #define TYPE_YUVK_8 TYPE_CMYK_8_REV #define TYPE_CMYK_8_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_CMYK_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)) #define TYPE_CMYK_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)) #define TYPE_YUVK_16 TYPE_CMYK_16_REV #define TYPE_CMYK_16_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_CMYK_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_KCMY_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1)) #define TYPE_KCMY_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1)) #define TYPE_KCMY_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1)) #define TYPE_KCMY_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1)) #define TYPE_KCMY_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1)) #define TYPE_CMYK5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1)) #define TYPE_CMYK5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)) #define TYPE_CMYK5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK6_8 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1)) #define TYPE_CMYK6_8_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_CMYK6_16 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)) #define TYPE_CMYK6_16_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_CMYK6_16_SE (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_CMYK7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1)) #define TYPE_CMYK7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)) #define TYPE_CMYK7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1)) #define TYPE_CMYK8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)) #define TYPE_CMYK8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1)) #define TYPE_CMYK9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)) #define TYPE_CMYK9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1)) #define TYPE_CMYK10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)) #define TYPE_CMYK10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1)) #define TYPE_CMYK11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)) #define TYPE_CMYK11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) #define TYPE_CMYK12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1)) #define TYPE_CMYK12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)) #define TYPE_CMYK12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1)) #define TYPE_KYMC12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1)) #define TYPE_KYMC12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_KYMC12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) // Colorimetric #define TYPE_XYZ_16 (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_Lab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_LabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_ALab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)) #define TYPE_ALabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)) #define TYPE_Lab_16 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_LabV2_16 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_Yxy_16 (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2)) // YCbCr #define TYPE_YCbCr_8 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_YCbCr_8_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_YCbCr_16 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_YCbCr_16_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_YCbCr_16_SE (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) // YUV #define TYPE_YUV_8 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_YUV_8_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_YUV_16 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_YUV_16_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_YUV_16_SE (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) // HLS #define TYPE_HLS_8 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_HLS_8_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_HLS_16 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_HLS_16_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_HLS_16_SE (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) // HSV #define TYPE_HSV_8 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)) #define TYPE_HSV_8_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) #define TYPE_HSV_16 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_HSV_16_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) #define TYPE_HSV_16_SE (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) // Named color index. Only 16 bits allowed (don't check colorspace) #define TYPE_NAMED_COLOR_INDEX (CHANNELS_SH(1)|BYTES_SH(2)) // Float formatters. #define TYPE_XYZ_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_Lab_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_LabA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_GRAY_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4)) #define TYPE_RGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_RGBA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) #define TYPE_ARGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|SWAPFIRST_SH(1)) #define TYPE_BGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)) #define TYPE_BGRA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_ABGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)) #define TYPE_CMYK_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(4)) // Floating point formatters. // NOTE THAT 'BYTES' FIELD IS SET TO ZERO ON DLB because 8 bytes overflows the bitfield #define TYPE_XYZ_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0)) #define TYPE_Lab_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0)) #define TYPE_GRAY_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0)) #define TYPE_RGB_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)) #define TYPE_BGR_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)|DOSWAP_SH(1)) #define TYPE_CMYK_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0)) // IEEE 754-2008 "half" #define TYPE_GRAY_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)) #define TYPE_RGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_CMYK_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)) #define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)) #define TYPE_ARGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)) #define TYPE_BGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) #define TYPE_BGRA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) #define TYPE_ABGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) #endif // Colorspaces typedef struct { cmsFloat64Number X; cmsFloat64Number Y; cmsFloat64Number Z; } cmsCIEXYZ; typedef struct { cmsFloat64Number x; cmsFloat64Number y; cmsFloat64Number Y; } cmsCIExyY; typedef struct { cmsFloat64Number L; cmsFloat64Number a; cmsFloat64Number b; } cmsCIELab; typedef struct { cmsFloat64Number L; cmsFloat64Number C; cmsFloat64Number h; } cmsCIELCh; typedef struct { cmsFloat64Number J; cmsFloat64Number C; cmsFloat64Number h; } cmsJCh; typedef struct { cmsCIEXYZ Red; cmsCIEXYZ Green; cmsCIEXYZ Blue; } cmsCIEXYZTRIPLE; typedef struct { cmsCIExyY Red; cmsCIExyY Green; cmsCIExyY Blue; } cmsCIExyYTRIPLE; // Illuminant types for structs below #define cmsILLUMINANT_TYPE_UNKNOWN 0x0000000 #define cmsILLUMINANT_TYPE_D50 0x0000001 #define cmsILLUMINANT_TYPE_D65 0x0000002 #define cmsILLUMINANT_TYPE_D93 0x0000003 #define cmsILLUMINANT_TYPE_F2 0x0000004 #define cmsILLUMINANT_TYPE_D55 0x0000005 #define cmsILLUMINANT_TYPE_A 0x0000006 #define cmsILLUMINANT_TYPE_E 0x0000007 #define cmsILLUMINANT_TYPE_F8 0x0000008 typedef struct { cmsUInt32Number Observer; // 0 = unknown, 1=CIE 1931, 2=CIE 1964 cmsCIEXYZ Backing; // Value of backing cmsUInt32Number Geometry; // 0=unknown, 1=45/0, 0/45 2=0d, d/0 cmsFloat64Number Flare; // 0..1.0 cmsUInt32Number IlluminantType; } cmsICCMeasurementConditions; typedef struct { cmsCIEXYZ IlluminantXYZ; // Not the same struct as CAM02, cmsCIEXYZ SurroundXYZ; // This is for storing the tag cmsUInt32Number IlluminantType; // viewing condition } cmsICCViewingConditions; // Support of non-standard functions -------------------------------------------------------------------------------------- CMSAPI int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2); CMSAPI long int CMSEXPORT cmsfilelength(FILE* f); // Context handling -------------------------------------------------------------------------------------------------------- // Each context holds its owns globals and its own plug-ins. There is a global context with the id = 0 for lecacy compatibility // though using the global context is not recomended. Proper context handling makes lcms more thread-safe. typedef struct _cmsContext_struct* cmsContext; CMSAPI cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData); CMSAPI void CMSEXPORT cmsDeleteContext(cmsContext ContexID); CMSAPI cmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData); CMSAPI void* CMSEXPORT cmsGetContextUserData(cmsContext ContextID); // Plug-In registering -------------------------------------------------------------------------------------------------- CMSAPI cmsBool CMSEXPORT cmsPlugin(void* Plugin); CMSAPI cmsBool CMSEXPORT cmsPluginTHR(cmsContext ContextID, void* Plugin); CMSAPI void CMSEXPORT cmsUnregisterPlugins(void); CMSAPI void CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID); // Error logging ---------------------------------------------------------------------------------------------------------- // There is no error handling at all. When a function fails, it returns proper value. // For example, all create functions does return NULL on failure. Other may return FALSE. // It may be interesting, for the developer, to know why the function is failing. // for that reason, lcms2 does offer a logging function. This function will get // an ENGLISH string with some clues on what is going wrong. You can show this // info to the end user if you wish, or just create some sort of log on disk. // The logging function should NOT terminate the program, as this obviously can leave // unfreed resources. It is the programmer's responsibility to check each function // return code to make sure it didn't fail. #define cmsERROR_UNDEFINED 0 #define cmsERROR_FILE 1 #define cmsERROR_RANGE 2 #define cmsERROR_INTERNAL 3 #define cmsERROR_NULL 4 #define cmsERROR_READ 5 #define cmsERROR_SEEK 6 #define cmsERROR_WRITE 7 #define cmsERROR_UNKNOWN_EXTENSION 8 #define cmsERROR_COLORSPACE_CHECK 9 #define cmsERROR_ALREADY_DEFINED 10 #define cmsERROR_BAD_SIGNATURE 11 #define cmsERROR_CORRUPTION_DETECTED 12 #define cmsERROR_NOT_SUITABLE 13 // Error logger is called with the ContextID when a message is raised. This gives the // chance to know which thread is responsible of the warning and any environment associated // with it. Non-multithreading applications may safely ignore this parameter. // Note that under certain special circumstances, ContextID may be NULL. typedef void (* cmsLogErrorHandlerFunction)(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text); // Allows user to set any specific logger CMSAPI void CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn); CMSAPI void CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn); // Conversions -------------------------------------------------------------------------------------------------------------- // Returns pointers to constant structs CMSAPI const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void); CMSAPI const cmsCIExyY* CMSEXPORT cmsD50_xyY(void); // Colorimetric space conversions CMSAPI void CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source); CMSAPI void CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source); CMSAPI void CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz); CMSAPI void CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz, const cmsCIELab* Lab); CMSAPI void CMSEXPORT cmsLab2LCh(cmsCIELCh*LCh, const cmsCIELab* Lab); CMSAPI void CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh); // Encoding /Decoding on PCS CMSAPI void CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3]); CMSAPI void CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3]); CMSAPI void CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* Lab); CMSAPI void CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* Lab); CMSAPI void CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fxyz, const cmsUInt16Number XYZ[3]); CMSAPI void CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ); // DeltaE metrics CMSAPI cmsFloat64Number CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2); CMSAPI cmsFloat64Number CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2); CMSAPI cmsFloat64Number CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2); CMSAPI cmsFloat64Number CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c); CMSAPI cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh); // Temperature <-> Chromaticity (Black body) CMSAPI cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK); CMSAPI cmsBool CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint); // Chromatic adaptation CMSAPI cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, const cmsCIEXYZ* SourceWhitePt, const cmsCIEXYZ* Illuminant, const cmsCIEXYZ* Value); // CIECAM02 --------------------------------------------------------------------------------------------------- // Viewing conditions. Please note those are CAM model viewing conditions, and not the ICC tag viewing // conditions, which I'm naming cmsICCViewingConditions to make differences evident. Unfortunately, the tag // cannot deal with surround La, Yb and D value so is basically useless to store CAM02 viewing conditions. #define AVG_SURROUND 1 #define DIM_SURROUND 2 #define DARK_SURROUND 3 #define CUTSHEET_SURROUND 4 #define D_CALCULATE (-1) typedef struct { cmsCIEXYZ whitePoint; cmsFloat64Number Yb; cmsFloat64Number La; int surround; cmsFloat64Number D_value; } cmsViewingConditions; CMSAPI cmsHANDLE CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC); CMSAPI void CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel); CMSAPI void CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut); CMSAPI void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ* pOut); // Tone curves ----------------------------------------------------------------------------------------- // This describes a curve segment. For a table of supported types, see the manual. User can increase the number of // available types by using a proper plug-in. Parametric segments allow 10 parameters at most typedef struct { cmsFloat32Number x0, x1; // Domain; for x0 < x <= x1 cmsInt32Number Type; // Parametric type, Type == 0 means sampled segment. Negative values are reserved cmsFloat64Number Params[10]; // Parameters if Type != 0 cmsUInt32Number nGridPoints; // Number of grid points if Type == 0 cmsFloat32Number* SampledPoints; // Points to an array of floats if Type == 0 } cmsCurveSegment; // The internal representation is none of your business. typedef struct _cms_curve_struct cmsToneCurve; CMSAPI cmsToneCurve* CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID, cmsInt32Number nSegments, const cmsCurveSegment Segments[]); CMSAPI cmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[]); CMSAPI cmsToneCurve* CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma); CMSAPI cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsInt32Number nEntries, const cmsUInt16Number values[]); CMSAPI cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[]); CMSAPI void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve); CMSAPI void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3]); CMSAPI cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* Src); CMSAPI cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma); CMSAPI cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, const cmsToneCurve* InGamma); CMSAPI cmsToneCurve* CMSEXPORT cmsJoinToneCurve(cmsContext ContextID, const cmsToneCurve* X, const cmsToneCurve* Y, cmsUInt32Number nPoints); CMSAPI cmsBool CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda); CMSAPI cmsFloat32Number CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v); CMSAPI cmsUInt16Number CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v); CMSAPI cmsBool CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* InGamma); CMSAPI cmsBool CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve); CMSAPI cmsBool CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t); CMSAPI cmsBool CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t); CMSAPI cmsInt32Number CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t); CMSAPI cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision); // Tone curve tabular estimation CMSAPI cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t); CMSAPI const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t); // Implements pipelines of multi-processing elements ------------------------------------------------------------- // Nothing to see here, move along typedef struct _cmsPipeline_struct cmsPipeline; typedef struct _cmsStage_struct cmsStage; // Those are hi-level pipelines CMSAPI cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels); CMSAPI void CMSEXPORT cmsPipelineFree(cmsPipeline* lut); CMSAPI cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* Orig); CMSAPI cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut); CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut); CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut); CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut); CMSAPI cmsStage* CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut); CMSAPI cmsStage* CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut); CMSAPI void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut); CMSAPI void CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut); CMSAPI cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[], cmsFloat32Number Result[], cmsFloat32Number Hint[], const cmsPipeline* lut); CMSAPI cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2); CMSAPI cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On); // Where to place/locate the stages in the pipeline chain typedef enum { cmsAT_BEGIN, cmsAT_END } cmsStageLoc; CMSAPI int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe); CMSAPI void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe); // This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements // that conform the Pipeline. It should be called with the Pipeline, the number of expected elements and // then a list of expected types followed with a list of double pointers to Stage elements. If // the function founds a match with current pipeline, it fills the pointers and returns TRUE // if not, returns FALSE without touching anything. CMSAPI cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...); // Matrix has double precision and CLUT has only float precision. That is because an ICC profile can encode // matrices with far more precision that CLUTS CMSAPI cmsStage* CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels); CMSAPI cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[]); CMSAPI cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols, const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset); CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table); CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table); CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table); CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table); CMSAPI cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe); CMSAPI void CMSEXPORT cmsStageFree(cmsStage* mpe); CMSAPI cmsStage* CMSEXPORT cmsStageNext(const cmsStage* mpe); CMSAPI cmsUInt32Number CMSEXPORT cmsStageInputChannels(const cmsStage* mpe); CMSAPI cmsUInt32Number CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe); CMSAPI cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe); CMSAPI void* CMSEXPORT cmsStageData(const cmsStage* mpe); // Sampling typedef cmsInt32Number (* cmsSAMPLER16) (register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo); typedef cmsInt32Number (* cmsSAMPLERFLOAT)(register const cmsFloat32Number In[], register cmsFloat32Number Out[], register void * Cargo); // Use this flag to prevent changes being written to destination #define SAMPLER_INSPECT 0x01000000 // For CLUT only CMSAPI cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void* Cargo, cmsUInt32Number dwFlags); CMSAPI cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void* Cargo, cmsUInt32Number dwFlags); // Slicers CMSAPI cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], cmsSAMPLER16 Sampler, void * Cargo); CMSAPI cmsBool CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], cmsSAMPLERFLOAT Sampler, void * Cargo); // Multilocalized Unicode management --------------------------------------------------------------------------------------- typedef struct _cms_MLU_struct cmsMLU; #define cmsNoLanguage "\0\0" #define cmsNoCountry "\0\0" CMSAPI cmsMLU* CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems); CMSAPI void CMSEXPORT cmsMLUfree(cmsMLU* mlu); CMSAPI cmsMLU* CMSEXPORT cmsMLUdup(const cmsMLU* mlu); CMSAPI cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* ASCIIString); CMSAPI cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const wchar_t* WideString); CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize); CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], wchar_t* Buffer, cmsUInt32Number BufferSize); CMSAPI cmsBool CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], char ObtainedLanguage[3], char ObtainedCountry[3]); CMSAPI cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu); CMSAPI cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu, cmsUInt32Number idx, char LanguageCode[3], char CountryCode[3]); // Undercolorremoval & black generation ------------------------------------------------------------------------------------- typedef struct { cmsToneCurve* Ucr; cmsToneCurve* Bg; cmsMLU* Desc; } cmsUcrBg; // Screening ---------------------------------------------------------------------------------------------------------------- #define cmsPRINTER_DEFAULT_SCREENS 0x0001 #define cmsFREQUENCE_UNITS_LINES_CM 0x0000 #define cmsFREQUENCE_UNITS_LINES_INCH 0x0002 #define cmsSPOT_UNKNOWN 0 #define cmsSPOT_PRINTER_DEFAULT 1 #define cmsSPOT_ROUND 2 #define cmsSPOT_DIAMOND 3 #define cmsSPOT_ELLIPSE 4 #define cmsSPOT_LINE 5 #define cmsSPOT_SQUARE 6 #define cmsSPOT_CROSS 7 typedef struct { cmsFloat64Number Frequency; cmsFloat64Number ScreenAngle; cmsUInt32Number SpotShape; } cmsScreeningChannel; typedef struct { cmsUInt32Number Flag; cmsUInt32Number nChannels; cmsScreeningChannel Channels[cmsMAXCHANNELS]; } cmsScreening; // Named color ----------------------------------------------------------------------------------------------------------------- typedef struct _cms_NAMEDCOLORLIST_struct cmsNAMEDCOLORLIST; CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUInt32Number n, cmsUInt32Number ColorantCount, const char* Prefix, const char* Suffix); CMSAPI void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v); CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v); CMSAPI cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* v, const char* Name, cmsUInt16Number PCS[3], cmsUInt16Number Colorant[cmsMAXCHANNELS]); CMSAPI cmsUInt32Number CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* v); CMSAPI cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* v, const char* Name); CMSAPI cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor, char* Name, char* Prefix, char* Suffix, cmsUInt16Number* PCS, cmsUInt16Number* Colorant); // Retrieve named color list from transform CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform); // Profile sequence ----------------------------------------------------------------------------------------------------- // Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others // come from Profile Sequence Identifier Tag typedef struct { cmsSignature deviceMfg; cmsSignature deviceModel; cmsUInt64Number attributes; cmsTechnologySignature technology; cmsProfileID ProfileID; cmsMLU* Manufacturer; cmsMLU* Model; cmsMLU* Description; } cmsPSEQDESC; typedef struct { cmsUInt32Number n; cmsContext ContextID; cmsPSEQDESC* seq; } cmsSEQ; CMSAPI cmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n); CMSAPI cmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq); CMSAPI void CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq); // Dictionaries -------------------------------------------------------------------------------------------------------- typedef struct _cmsDICTentry_struct { struct _cmsDICTentry_struct* Next; cmsMLU *DisplayName; cmsMLU *DisplayValue; wchar_t* Name; wchar_t* Value; } cmsDICTentry; CMSAPI cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID); CMSAPI void CMSEXPORT cmsDictFree(cmsHANDLE hDict); CMSAPI cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict); CMSAPI cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue); CMSAPI const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict); CMSAPI const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e); // Access to Profile data ---------------------------------------------------------------------------------------------- CMSAPI cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID); CMSAPI cmsContext CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile); CMSAPI cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile); CMSAPI cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n); CMSAPI cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig); // Read and write pre-formatted data CMSAPI void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig); CMSAPI cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data); CMSAPI cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest); CMSAPI cmsTagSignature CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig); // Read and write raw data CMSAPI cmsInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* Buffer, cmsUInt32Number BufferSize); CMSAPI cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size); // Access header data #define cmsEmbeddedProfileFalse 0x00000000 #define cmsEmbeddedProfileTrue 0x00000001 #define cmsUseAnywhere 0x00000000 #define cmsUseWithEmbeddedDataOnly 0x00000002 CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags); CMSAPI void CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID); CMSAPI cmsBool CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest); CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags); CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer); CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile); CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model); CMSAPI void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags); CMSAPI void CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID); CMSAPI void CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent); CMSAPI cmsColorSpaceSignature CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs); CMSAPI cmsColorSpaceSignature CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig); CMSAPI cmsProfileClassSignature CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig); CMSAPI void CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version); CMSAPI cmsFloat64Number CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile); CMSAPI cmsUInt32Number CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile); CMSAPI void CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version); // How profiles may be used #define LCMS_USED_AS_INPUT 0 #define LCMS_USED_AS_OUTPUT 1 #define LCMS_USED_AS_PROOF 2 CMSAPI cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection); CMSAPI cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile); CMSAPI cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection); // Translate form/to our notation to ICC CMSAPI cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation); CMSAPI int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace); CMSAPI cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace); // Build a suitable formatter for the colorspace of this profile CMSAPI cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat); CMSAPI cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat); // Localized info typedef enum { cmsInfoDescription = 0, cmsInfoManufacturer = 1, cmsInfoModel = 2, cmsInfoCopyright = 3 } cmsInfoType; CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info, const char LanguageCode[3], const char CountryCode[3], wchar_t* Buffer, cmsUInt32Number BufferSize); CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize); // IO handlers ---------------------------------------------------------------------------------------------------------- typedef struct _cms_io_handler cmsIOHANDLER; CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode); CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream); CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode); CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID); CMSAPI cmsBool CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io); // MD5 message digest -------------------------------------------------------------------------------------------------- CMSAPI cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile); // Profile high level funtions ------------------------------------------------------------------------------------------ CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *ICCProfile, const char *sAccess); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char* sAccess); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void * MemPtr, cmsUInt32Number dwSize); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void * MemPtr, cmsUInt32Number dwSize); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io); CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write); CMSAPI cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile); CMSAPI cmsBool CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName); CMSAPI cmsBool CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream); CMSAPI cmsBool CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded); CMSAPI cmsUInt32Number CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io); // Predefined virtual profiles ------------------------------------------------------------------------------------------ CMSAPI cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries, cmsToneCurve* const TransferFunction[3]); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries, cmsToneCurve* const TransferFunction[3]); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint, const cmsToneCurve* TransferFunction); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint, const cmsToneCurve* TransferFunction); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID, cmsColorSpaceSignature ColorSpace, cmsToneCurve* const TransferFunctions[]); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace, cmsToneCurve* const TransferFunctions[]); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID, cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateXYZProfile(void); CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID); CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID, int nLUTPoints, cmsFloat64Number Bright, cmsFloat64Number Contrast, cmsFloat64Number Hue, cmsFloat64Number Saturation, int TempSrc, int TempDest); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints, cmsFloat64Number Bright, cmsFloat64Number Contrast, cmsFloat64Number Hue, cmsFloat64Number Saturation, int TempSrc, int TempDest); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID); CMSAPI cmsHPROFILE CMSEXPORT cmsCreateNULLProfile(void); // Converts a transform to a devicelink profile CMSAPI cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags); // Intents ---------------------------------------------------------------------------------------------- // ICC Intents #define INTENT_PERCEPTUAL 0 #define INTENT_RELATIVE_COLORIMETRIC 1 #define INTENT_SATURATION 2 #define INTENT_ABSOLUTE_COLORIMETRIC 3 // Non-ICC intents #define INTENT_PRESERVE_K_ONLY_PERCEPTUAL 10 #define INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC 11 #define INTENT_PRESERVE_K_ONLY_SATURATION 12 #define INTENT_PRESERVE_K_PLANE_PERCEPTUAL 13 #define INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC 14 #define INTENT_PRESERVE_K_PLANE_SATURATION 15 // Call with NULL as parameters to get the intent count CMSAPI cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions); CMSAPI cmsUInt32Number CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions); // Flags #define cmsFLAGS_NOCACHE 0x0040 // Inhibit 1-pixel cache #define cmsFLAGS_NOOPTIMIZE 0x0100 // Inhibit optimizations #define cmsFLAGS_NULLTRANSFORM 0x0200 // Don't transform anyway // Proofing flags #define cmsFLAGS_GAMUTCHECK 0x1000 // Out of Gamut alarm #define cmsFLAGS_SOFTPROOFING 0x4000 // Do softproofing // Misc #define cmsFLAGS_BLACKPOINTCOMPENSATION 0x2000 #define cmsFLAGS_NOWHITEONWHITEFIXUP 0x0004 // Don't fix scum dot #define cmsFLAGS_HIGHRESPRECALC 0x0400 // Use more memory to give better accurancy #define cmsFLAGS_LOWRESPRECALC 0x0800 // Use less memory to minimize resouces // For devicelink creation #define cmsFLAGS_8BITS_DEVICELINK 0x0008 // Create 8 bits devicelinks #define cmsFLAGS_GUESSDEVICECLASS 0x0020 // Guess device class (for transform2devicelink) #define cmsFLAGS_KEEP_SEQUENCE 0x0080 // Keep profile sequence for devicelink creation // Specific to a particular optimizations #define cmsFLAGS_FORCE_CLUT 0x0002 // Force CLUT optimization #define cmsFLAGS_CLUT_POST_LINEARIZATION 0x0001 // create postlinearization tables if possible #define cmsFLAGS_CLUT_PRE_LINEARIZATION 0x0010 // create prelinearization tables if possible // Fine-tune control over number of gridpoints #define cmsFLAGS_GRIDPOINTS(n) (((n) & 0xFF) << 16) // CRD special #define cmsFLAGS_NODEFAULTRESOURCEDEF 0x01000000 // Transforms --------------------------------------------------------------------------------------------------- CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID, cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransform(cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID, cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsHPROFILE Proofing, cmsUInt32Number Intent, cmsUInt32Number ProofingIntent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsHPROFILE Proofing, cmsUInt32Number Intent, cmsUInt32Number ProofingIntent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID, cmsHPROFILE hProfiles[], cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[], cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags); CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[], cmsBool BPC[], cmsUInt32Number Intents[], cmsFloat64Number AdaptationStates[], cmsHPROFILE hGamutProfile, cmsUInt32Number nGamutPCSposition, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number dwFlags); CMSAPI void CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform); CMSAPI void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform, const void * InputBuffer, void * OutputBuffer, cmsUInt32Number Size); CMSAPI void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform, const void * InputBuffer, void * OutputBuffer, cmsUInt32Number Size, cmsUInt32Number Stride); CMSAPI void CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS]); CMSAPI void CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number NewAlarm[cmsMAXCHANNELS]); CMSAPI void CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID, const cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]); CMSAPI void CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID, cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]); // Adaptation state for absolute colorimetric intent CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d); CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d); // Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed CMSAPI cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform); // Grab the input/output formats CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform); CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform); // For backwards compatibility CMSAPI cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat); // PostScript ColorRenderingDictionary and ColorSpaceArray ---------------------------------------------------- typedef enum { cmsPS_RESOURCE_CSA, cmsPS_RESOURCE_CRD } cmsPSResourceType; // lcms2 unified method to access postscript color resources CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID, cmsPSResourceType Type, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, cmsIOHANDLER* io); CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen); CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen); // IT8.7 / CGATS.17-200x handling ----------------------------------------------------------------------------- CMSAPI cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID); CMSAPI void CMSEXPORT cmsIT8Free(cmsHANDLE hIT8); // Tables CMSAPI cmsUInt32Number CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8); CMSAPI cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE hIT8, cmsUInt32Number nTable); // Persistence CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName); CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, void *Ptr, cmsUInt32Number len); // CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromIOhandler(cmsContext ContextID, cmsIOHANDLER* io); CMSAPI cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName); CMSAPI cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded); // Properties CMSAPI const char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8); CMSAPI cmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type); CMSAPI cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* cComment); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* cProp, const char *Str); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer); CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer); CMSAPI const char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* cProp); CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp); CMSAPI const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey); CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames); CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames); // Datasets CMSAPI const char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col); CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col); CMSAPI cmsBool CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col, const char* Val); CMSAPI cmsBool CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col, cmsFloat64Number Val); CMSAPI const char* CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample); CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE hIT8, const char* cPatch, const char* cSample); CMSAPI cmsBool CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample, const char *Val); CMSAPI cmsBool CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch, const char* cSample, cmsFloat64Number Val); CMSAPI int CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample); CMSAPI cmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE hIT8, int n, const char *Sample); CMSAPI int CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames); CMSAPI const char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer); CMSAPI int CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch); // The LABEL extension CMSAPI int CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType); CMSAPI cmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample); // Formatter for double CMSAPI void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter); // Gamut boundary description routines ------------------------------------------------------------------------------ CMSAPI cmsHANDLE CMSEXPORT cmsGBDAlloc(cmsContext ContextID); CMSAPI void CMSEXPORT cmsGBDFree(cmsHANDLE hGBD); CMSAPI cmsBool CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab); CMSAPI cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGDB, cmsUInt32Number dwFlags); CMSAPI cmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab); // Feature detection ---------------------------------------------------------------------------------------------- // Estimate the black point CMSAPI cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags); CMSAPI cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags); // Estimate total area coverage CMSAPI cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile); // Poor man's gamut mapping CMSAPI cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab, double amax, double amin, double bmax, double bmin); #ifndef CMS_USE_CPP_API # ifdef __cplusplus } # endif #endif #define _lcms2_H #endif lcms2-2.6/INSTALL0000644002406300000240000000005512311617072012757 0ustar mariamausers Please see the documentation in doc folder lcms2-2.6/src/0000755002406300000240000000000012311617072012515 5ustar mariamauserslcms2-2.6/src/cmsmd5.c0000644002406300000240000002242112311617072014052 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- #include "lcms2_internal.h" #ifdef CMS_USE_BIG_ENDIAN static void byteReverse(cmsUInt8Number * buf, cmsUInt32Number longs) { do { cmsUInt32Number t = _cmsAdjustEndianess32(*(cmsUInt32Number *) buf); *(cmsUInt32Number *) buf = t; buf += sizeof(cmsUInt32Number); } while (--longs); } #else #define byteReverse(buf, len) #endif typedef struct { cmsUInt32Number buf[4]; cmsUInt32Number bits[2]; cmsUInt8Number in[64]; cmsContext ContextID; } _cmsMD5; #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) #define STEP(f, w, x, y, z, data, s) \ ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) static void MD5_Transform(cmsUInt32Number buf[4], cmsUInt32Number in[16]) { register cmsUInt32Number a, b, c, d; a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } // Create a MD5 object static cmsHANDLE MD5alloc(cmsContext ContextID) { _cmsMD5* ctx = (_cmsMD5*) _cmsMallocZero(ContextID, sizeof(_cmsMD5)); if (ctx == NULL) return NULL; ctx ->ContextID = ContextID; ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; ctx->bits[0] = 0; ctx->bits[1] = 0; return (cmsHANDLE) ctx; } static void MD5add(cmsHANDLE Handle, cmsUInt8Number* buf, cmsUInt32Number len) { _cmsMD5* ctx = (_cmsMD5*) Handle; cmsUInt32Number t; t = ctx->bits[0]; if ((ctx->bits[0] = t + (len << 3)) < t) ctx->bits[1]++; ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; if (t) { cmsUInt8Number *p = (cmsUInt8Number *) ctx->in + t; t = 64 - t; if (len < t) { memmove(p, buf, len); return; } memmove(p, buf, t); byteReverse(ctx->in, 16); MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); buf += t; len -= t; } while (len >= 64) { memmove(ctx->in, buf, 64); byteReverse(ctx->in, 16); MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); buf += 64; len -= 64; } memmove(ctx->in, buf, len); } // Destroy the object and return the checksum static void MD5finish(cmsProfileID* ProfileID, cmsHANDLE Handle) { _cmsMD5* ctx = (_cmsMD5*) Handle; cmsUInt32Number count; cmsUInt8Number *p; count = (ctx->bits[0] >> 3) & 0x3F; p = ctx->in + count; *p++ = 0x80; count = 64 - 1 - count; if (count < 8) { memset(p, 0, count); byteReverse(ctx->in, 16); MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); memset(ctx->in, 0, 56); } else { memset(p, 0, count - 8); } byteReverse(ctx->in, 14); ((cmsUInt32Number *) ctx->in)[14] = ctx->bits[0]; ((cmsUInt32Number *) ctx->in)[15] = ctx->bits[1]; MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); byteReverse((cmsUInt8Number *) ctx->buf, 4); memmove(ProfileID ->ID8, ctx->buf, 16); _cmsFree(ctx ->ContextID, ctx); } // Assuming io points to an ICC profile, compute and store MD5 checksum // In the header, rendering intentent, attributes and ID should be set to zero // before computing MD5 checksum (per 6.1.13 in ICC spec) cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile) { cmsContext ContextID; cmsUInt32Number BytesNeeded; cmsUInt8Number* Mem = NULL; cmsHANDLE MD5 = NULL; _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; _cmsICCPROFILE Keep; _cmsAssert(hProfile != NULL); ContextID = cmsGetProfileContextID(hProfile); // Save a copy of the profile header memmove(&Keep, Icc, sizeof(_cmsICCPROFILE)); // Set RI, attributes and ID memset(&Icc ->attributes, 0, sizeof(Icc ->attributes)); Icc ->RenderingIntent = 0; memset(&Icc ->ProfileID, 0, sizeof(Icc ->ProfileID)); // Compute needed storage if (!cmsSaveProfileToMem(hProfile, NULL, &BytesNeeded)) goto Error; // Allocate memory Mem = (cmsUInt8Number*) _cmsMalloc(ContextID, BytesNeeded); if (Mem == NULL) goto Error; // Save to temporary storage if (!cmsSaveProfileToMem(hProfile, Mem, &BytesNeeded)) goto Error; // Create MD5 object MD5 = MD5alloc(ContextID); if (MD5 == NULL) goto Error; // Add all bytes MD5add(MD5, Mem, BytesNeeded); // Temp storage is no longer needed _cmsFree(ContextID, Mem); // Restore header memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); // And store the ID MD5finish(&Icc ->ProfileID, MD5); return TRUE; Error: // Free resources as something went wrong // "MD5" cannot be other than NULL here, so no need to free it if (Mem != NULL) _cmsFree(ContextID, Mem); memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); return FALSE; } lcms2-2.6/src/cmstypes.c0000644002406300000240000054061312311617072014541 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Tag Serialization ----------------------------------------------------------------------------- // This file implements every single tag and tag type as described in the ICC spec. Some types // have been deprecated, like ncl and Data. There is no implementation for those types as there // are no profiles holding them. The programmer can also extend this list by defining his own types // by using the appropiate plug-in. There are three types of plug ins regarding that. First type // allows to define new tags using any existing type. Next plug-in type allows to define new types // and the third one is very specific: allows to extend the number of elements in the multiprocessing // elements special type. //-------------------------------------------------------------------------------------------------- // Some broken types #define cmsCorbisBrokenXYZtype ((cmsTagTypeSignature) 0x17A505B8) #define cmsMonacoBrokenCurveType ((cmsTagTypeSignature) 0x9478ee00) // This is the linked list that keeps track of the defined types typedef struct _cmsTagTypeLinkedList_st { cmsTagTypeHandler Handler; struct _cmsTagTypeLinkedList_st* Next; } _cmsTagTypeLinkedList; // Some macros to define callbacks. #define READ_FN(x) Type_##x##_Read #define WRITE_FN(x) Type_##x##_Write #define FREE_FN(x) Type_##x##_Free #define DUP_FN(x) Type_##x##_Dup // Helper macro to define a handler. Callbacks do have a fixed naming convention. #define TYPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), DUP_FN(x), FREE_FN(x), NULL, 0 } // Helper macro to define a MPE handler. Callbacks do have a fixed naming convention #define TYPE_MPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), GenericMPEdup, GenericMPEfree, NULL, 0 } // Register a new type handler. This routine is shared between normal types and MPE. LinkedList points to the optional list head static cmsBool RegisterTypesPlugin(cmsContext id, cmsPluginBase* Data, _cmsMemoryClient pos) { cmsPluginTagType* Plugin = (cmsPluginTagType*) Data; _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(id, pos); _cmsTagTypeLinkedList *pt; // Calling the function with NULL as plug-in would unregister the plug in. if (Data == NULL) { // There is no need to set free the memory, as pool is destroyed as a whole. ctx ->TagTypes = NULL; return TRUE; } // Registering happens in plug-in memory pool. pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagTypeLinkedList)); if (pt == NULL) return FALSE; pt ->Handler = Plugin ->Handler; pt ->Next = ctx ->TagTypes; ctx ->TagTypes = pt; return TRUE; } // Return handler for a given type or NULL if not found. Shared between normal types and MPE. It first tries the additons // made by plug-ins and then the built-in defaults. static cmsTagTypeHandler* GetHandler(cmsTagTypeSignature sig, _cmsTagTypeLinkedList* PluginLinkedList, _cmsTagTypeLinkedList* DefaultLinkedList) { _cmsTagTypeLinkedList* pt; for (pt = PluginLinkedList; pt != NULL; pt = pt ->Next) { if (sig == pt -> Handler.Signature) return &pt ->Handler; } for (pt = DefaultLinkedList; pt != NULL; pt = pt ->Next) { if (sig == pt -> Handler.Signature) return &pt ->Handler; } return NULL; } // Auxiliar to convert UTF-32 to UTF-16 in some cases static cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t* Array) { cmsUInt32Number i; _cmsAssert(io != NULL); _cmsAssert(!(Array == NULL && n > 0)); for (i=0; i < n; i++) { if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Array[i])) return FALSE; } return TRUE; } // Auxiliar to read an array of wchar_t static cmsBool _cmsReadWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, wchar_t* Array) { cmsUInt32Number i; cmsUInt16Number tmp; _cmsAssert(io != NULL); for (i=0; i < n; i++) { if (Array != NULL) { if (!_cmsReadUInt16Number(io, &tmp)) return FALSE; Array[i] = (wchar_t) tmp; } else { if (!_cmsReadUInt16Number(io, NULL)) return FALSE; } } return TRUE; } // To deal with position tables typedef cmsBool (* PositionTableEntryFn)(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag); // Helper function to deal with position tables as decribed in ICC spec 4.3 // A table of n elements is readed, where first comes n records containing offsets and sizes and // then a block containing the data itself. This allows to reuse same data in more than one entry static cmsBool ReadPositionTable(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Count, cmsUInt32Number BaseOffset, void *Cargo, PositionTableEntryFn ElementFn) { cmsUInt32Number i; cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL; // Let's take the offsets to each element ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); if (ElementOffsets == NULL) goto Error; ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); if (ElementSizes == NULL) goto Error; for (i=0; i < Count; i++) { if (!_cmsReadUInt32Number(io, &ElementOffsets[i])) goto Error; if (!_cmsReadUInt32Number(io, &ElementSizes[i])) goto Error; ElementOffsets[i] += BaseOffset; } // Seek to each element and read it for (i=0; i < Count; i++) { if (!io -> Seek(io, ElementOffsets[i])) goto Error; // This is the reader callback if (!ElementFn(self, io, Cargo, i, ElementSizes[i])) goto Error; } // Success if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); return TRUE; Error: if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); return FALSE; } // Same as anterior, but for write position tables static cmsBool WritePositionTable(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number SizeOfTag, cmsUInt32Number Count, cmsUInt32Number BaseOffset, void *Cargo, PositionTableEntryFn ElementFn) { cmsUInt32Number i; cmsUInt32Number DirectoryPos, CurrentPos, Before; cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL; // Create table ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); if (ElementOffsets == NULL) goto Error; ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); if (ElementSizes == NULL) goto Error; // Keep starting position of curve offsets DirectoryPos = io ->Tell(io); // Write a fake directory to be filled latter on for (i=0; i < Count; i++) { if (!_cmsWriteUInt32Number(io, 0)) goto Error; // Offset if (!_cmsWriteUInt32Number(io, 0)) goto Error; // size } // Write each element. Keep track of the size as well. for (i=0; i < Count; i++) { Before = io ->Tell(io); ElementOffsets[i] = Before - BaseOffset; // Callback to write... if (!ElementFn(self, io, Cargo, i, SizeOfTag)) goto Error; // Now the size ElementSizes[i] = io ->Tell(io) - Before; } // Write the directory CurrentPos = io ->Tell(io); if (!io ->Seek(io, DirectoryPos)) goto Error; for (i=0; i < Count; i++) { if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error; if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error; } if (!io ->Seek(io, CurrentPos)) goto Error; if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); return TRUE; Error: if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); return FALSE; } // ******************************************************************************** // Type XYZ. Only one value is allowed // ******************************************************************************** //The XYZType contains an array of three encoded values for the XYZ tristimulus //values. Tristimulus values must be non-negative. The signed encoding allows for //implementation optimizations by minimizing the number of fixed formats. static void *Type_XYZ_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsCIEXYZ* xyz; *nItems = 0; xyz = (cmsCIEXYZ*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIEXYZ)); if (xyz == NULL) return NULL; if (!_cmsReadXYZNumber(io, xyz)) { _cmsFree(self ->ContextID, xyz); return NULL; } *nItems = 1; return (void*) xyz; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_XYZ_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { return _cmsWriteXYZNumber(io, (cmsCIEXYZ*) Ptr); cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_XYZ_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIEXYZ)); cmsUNUSED_PARAMETER(n); } static void Type_XYZ_Free(struct _cms_typehandler_struct* self, void *Ptr) { _cmsFree(self ->ContextID, Ptr); } static cmsTagTypeSignature DecideXYZtype(cmsFloat64Number ICCVersion, const void *Data) { return cmsSigXYZType; cmsUNUSED_PARAMETER(ICCVersion); cmsUNUSED_PARAMETER(Data); } // ******************************************************************************** // Type chromaticity. Only one value is allowed // ******************************************************************************** // The chromaticity tag type provides basic chromaticity data and type of // phosphors or colorants of a monitor to applications and utilities. static void *Type_Chromaticity_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsCIExyYTRIPLE* chrm; cmsUInt16Number nChans, Table; *nItems = 0; chrm = (cmsCIExyYTRIPLE*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIExyYTRIPLE)); if (chrm == NULL) return NULL; if (!_cmsReadUInt16Number(io, &nChans)) goto Error; // Let's recover from a bug introduced in early versions of lcms1 if (nChans == 0 && SizeOfTag == 32) { if (!_cmsReadUInt16Number(io, NULL)) goto Error; if (!_cmsReadUInt16Number(io, &nChans)) goto Error; } if (nChans != 3) goto Error; if (!_cmsReadUInt16Number(io, &Table)) goto Error; if (!_cmsRead15Fixed16Number(io, &chrm ->Red.x)) goto Error; if (!_cmsRead15Fixed16Number(io, &chrm ->Red.y)) goto Error; chrm ->Red.Y = 1.0; if (!_cmsRead15Fixed16Number(io, &chrm ->Green.x)) goto Error; if (!_cmsRead15Fixed16Number(io, &chrm ->Green.y)) goto Error; chrm ->Green.Y = 1.0; if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.x)) goto Error; if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.y)) goto Error; chrm ->Blue.Y = 1.0; *nItems = 1; return (void*) chrm; Error: _cmsFree(self ->ContextID, (void*) chrm); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool SaveOneChromaticity(cmsFloat64Number x, cmsFloat64Number y, cmsIOHANDLER* io) { if (!_cmsWriteUInt32Number(io, _cmsDoubleTo15Fixed16(x))) return FALSE; if (!_cmsWriteUInt32Number(io, _cmsDoubleTo15Fixed16(y))) return FALSE; return TRUE; } static cmsBool Type_Chromaticity_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsCIExyYTRIPLE* chrm = (cmsCIExyYTRIPLE*) Ptr; if (!_cmsWriteUInt16Number(io, 3)) return FALSE; // nChannels if (!_cmsWriteUInt16Number(io, 0)) return FALSE; // Table if (!SaveOneChromaticity(chrm -> Red.x, chrm -> Red.y, io)) return FALSE; if (!SaveOneChromaticity(chrm -> Green.x, chrm -> Green.y, io)) return FALSE; if (!SaveOneChromaticity(chrm -> Blue.x, chrm -> Blue.y, io)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Chromaticity_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIExyYTRIPLE)); cmsUNUSED_PARAMETER(n); } static void Type_Chromaticity_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigColorantOrderType // ******************************************************************************** // This is an optional tag which specifies the laydown order in which colorants will // be printed on an n-colorant device. The laydown order may be the same as the // channel generation order listed in the colorantTableTag or the channel order of a // colour space such as CMYK, in which case this tag is not needed. When this is not // the case (for example, ink-towers sometimes use the order KCMY), this tag may be // used to specify the laydown order of the colorants. static void *Type_ColorantOrderType_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt8Number* ColorantOrder; cmsUInt32Number Count; *nItems = 0; if (!_cmsReadUInt32Number(io, &Count)) return NULL; if (Count > cmsMAXCHANNELS) return NULL; ColorantOrder = (cmsUInt8Number*) _cmsCalloc(self ->ContextID, cmsMAXCHANNELS, sizeof(cmsUInt8Number)); if (ColorantOrder == NULL) return NULL; // We use FF as end marker memset(ColorantOrder, 0xFF, cmsMAXCHANNELS * sizeof(cmsUInt8Number)); if (io ->Read(io, ColorantOrder, sizeof(cmsUInt8Number), Count) != Count) { _cmsFree(self ->ContextID, (void*) ColorantOrder); return NULL; } *nItems = 1; return (void*) ColorantOrder; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_ColorantOrderType_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt8Number* ColorantOrder = (cmsUInt8Number*) Ptr; cmsUInt32Number i, sz, Count; // Get the length for (Count=i=0; i < cmsMAXCHANNELS; i++) { if (ColorantOrder[i] != 0xFF) Count++; } if (!_cmsWriteUInt32Number(io, Count)) return FALSE; sz = Count * sizeof(cmsUInt8Number); if (!io -> Write(io, sz, ColorantOrder)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_ColorantOrderType_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, cmsMAXCHANNELS * sizeof(cmsUInt8Number)); cmsUNUSED_PARAMETER(n); } static void Type_ColorantOrderType_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigS15Fixed16ArrayType // ******************************************************************************** // This type represents an array of generic 4-byte/32-bit fixed point quantity. // The number of values is determined from the size of the tag. static void *Type_S15Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsFloat64Number* array_double; cmsUInt32Number i, n; *nItems = 0; n = SizeOfTag / sizeof(cmsUInt32Number); array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number)); if (array_double == NULL) return NULL; for (i=0; i < n; i++) { if (!_cmsRead15Fixed16Number(io, &array_double[i])) { _cmsFree(self ->ContextID, array_double); return NULL; } } *nItems = n; return (void*) array_double; } static cmsBool Type_S15Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsFloat64Number* Value = (cmsFloat64Number*) Ptr; cmsUInt32Number i; for (i=0; i < nItems; i++) { if (!_cmsWrite15Fixed16Number(io, Value[i])) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(self); } static void* Type_S15Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number)); } static void Type_S15Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigU16Fixed16ArrayType // ******************************************************************************** // This type represents an array of generic 4-byte/32-bit quantity. // The number of values is determined from the size of the tag. static void *Type_U16Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsFloat64Number* array_double; cmsUInt32Number v; cmsUInt32Number i, n; *nItems = 0; n = SizeOfTag / sizeof(cmsUInt32Number); array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number)); if (array_double == NULL) return NULL; for (i=0; i < n; i++) { if (!_cmsReadUInt32Number(io, &v)) { _cmsFree(self ->ContextID, (void*) array_double); return NULL; } // Convert to cmsFloat64Number array_double[i] = (cmsFloat64Number) (v / 65536.0); } *nItems = n; return (void*) array_double; } static cmsBool Type_U16Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsFloat64Number* Value = (cmsFloat64Number*) Ptr; cmsUInt32Number i; for (i=0; i < nItems; i++) { cmsUInt32Number v = (cmsUInt32Number) floor(Value[i]*65536.0 + 0.5); if (!_cmsWriteUInt32Number(io, v)) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(self); } static void* Type_U16Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number)); } static void Type_U16Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigSignatureType // ******************************************************************************** // // The signatureType contains a four-byte sequence, Sequences of less than four // characters are padded at the end with spaces, 20h. // Typically this type is used for registered tags that can be displayed on many // development systems as a sequence of four characters. static void *Type_Signature_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsSignature* SigPtr = (cmsSignature*) _cmsMalloc(self ->ContextID, sizeof(cmsSignature)); if (SigPtr == NULL) return NULL; if (!_cmsReadUInt32Number(io, SigPtr)) return NULL; *nItems = 1; return SigPtr; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_Signature_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsSignature* SigPtr = (cmsSignature*) Ptr; return _cmsWriteUInt32Number(io, *SigPtr); cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Signature_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsSignature)); } static void Type_Signature_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigTextType // ******************************************************************************** // // The textType is a simple text structure that contains a 7-bit ASCII text string. // The length of the string is obtained by subtracting 8 from the element size portion // of the tag itself. This string must be terminated with a 00h byte. static void *Type_Text_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { char* Text = NULL; cmsMLU* mlu = NULL; // Create a container mlu = cmsMLUalloc(self ->ContextID, 1); if (mlu == NULL) return NULL; *nItems = 0; // We need to store the "\0" at the end, so +1 if (SizeOfTag == UINT_MAX) goto Error; Text = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1); if (Text == NULL) goto Error; if (io -> Read(io, Text, sizeof(char), SizeOfTag) != SizeOfTag) goto Error; // Make sure text is properly ended Text[SizeOfTag] = 0; *nItems = 1; // Keep the result if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error; _cmsFree(self ->ContextID, Text); return (void*) mlu; Error: if (mlu != NULL) cmsMLUfree(mlu); if (Text != NULL) _cmsFree(self ->ContextID, Text); return NULL; } // The conversion implies to choose a language. So, we choose the actual language. static cmsBool Type_Text_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsMLU* mlu = (cmsMLU*) Ptr; cmsUInt32Number size; cmsBool rc; char* Text; // Get the size of the string. Note there is an extra "\0" at the end size = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0); if (size == 0) return FALSE; // Cannot be zero! // Create memory Text = (char*) _cmsMalloc(self ->ContextID, size); if (Text == NULL) return FALSE; cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text, size); // Write it, including separator rc = io ->Write(io, size, Text); _cmsFree(self ->ContextID, Text); return rc; cmsUNUSED_PARAMETER(nItems); } static void* Type_Text_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsMLUdup((cmsMLU*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_Text_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsMLU* mlu = (cmsMLU*) Ptr; cmsMLUfree(mlu); return; cmsUNUSED_PARAMETER(self); } static cmsTagTypeSignature DecideTextType(cmsFloat64Number ICCVersion, const void *Data) { if (ICCVersion >= 4.0) return cmsSigMultiLocalizedUnicodeType; return cmsSigTextType; cmsUNUSED_PARAMETER(Data); } // ******************************************************************************** // Type cmsSigDataType // ******************************************************************************** // General purpose data type static void *Type_Data_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsICCData* BinData; cmsUInt32Number LenOfData; *nItems = 0; if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; LenOfData = SizeOfTag - sizeof(cmsUInt32Number); if (LenOfData > INT_MAX) return NULL; BinData = (cmsICCData*) _cmsMalloc(self ->ContextID, sizeof(cmsICCData) + LenOfData - 1); if (BinData == NULL) return NULL; BinData ->len = LenOfData; if (!_cmsReadUInt32Number(io, &BinData->flag)) { _cmsFree(self ->ContextID, BinData); return NULL; } if (io -> Read(io, BinData ->data, sizeof(cmsUInt8Number), LenOfData) != LenOfData) { _cmsFree(self ->ContextID, BinData); return NULL; } *nItems = 1; return (void*) BinData; } static cmsBool Type_Data_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsICCData* BinData = (cmsICCData*) Ptr; if (!_cmsWriteUInt32Number(io, BinData ->flag)) return FALSE; return io ->Write(io, BinData ->len, BinData ->data); cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Data_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { cmsICCData* BinData = (cmsICCData*) Ptr; return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCData) + BinData ->len - 1); cmsUNUSED_PARAMETER(n); } static void Type_Data_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigTextDescriptionType // ******************************************************************************** static void *Type_Text_Description_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { char* Text = NULL; cmsMLU* mlu = NULL; cmsUInt32Number AsciiCount; cmsUInt32Number i, UnicodeCode, UnicodeCount; cmsUInt16Number ScriptCodeCode, Dummy; cmsUInt8Number ScriptCodeCount; *nItems = 0; // One dword should be there if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; // Read len of ASCII if (!_cmsReadUInt32Number(io, &AsciiCount)) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); // Check for size if (SizeOfTag < AsciiCount) return NULL; // All seems Ok, allocate the container mlu = cmsMLUalloc(self ->ContextID, 1); if (mlu == NULL) return NULL; // As many memory as size of tag Text = (char*) _cmsMalloc(self ->ContextID, AsciiCount + 1); if (Text == NULL) goto Error; // Read it if (io ->Read(io, Text, sizeof(char), AsciiCount) != AsciiCount) goto Error; SizeOfTag -= AsciiCount; // Make sure there is a terminator Text[AsciiCount] = 0; // Set the MLU entry. From here we can be tolerant to wrong types if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error; _cmsFree(self ->ContextID, (void*) Text); Text = NULL; // Skip Unicode code if (SizeOfTag < 2* sizeof(cmsUInt32Number)) goto Done; if (!_cmsReadUInt32Number(io, &UnicodeCode)) goto Done; if (!_cmsReadUInt32Number(io, &UnicodeCount)) goto Done; SizeOfTag -= 2* sizeof(cmsUInt32Number); if (SizeOfTag < UnicodeCount*sizeof(cmsUInt16Number)) goto Done; for (i=0; i < UnicodeCount; i++) { if (!io ->Read(io, &Dummy, sizeof(cmsUInt16Number), 1)) goto Done; } SizeOfTag -= UnicodeCount*sizeof(cmsUInt16Number); // Skip ScriptCode code if present. Some buggy profiles does have less // data that stricttly required. We need to skip it as this type may come // embedded in other types. if (SizeOfTag >= sizeof(cmsUInt16Number) + sizeof(cmsUInt8Number) + 67) { if (!_cmsReadUInt16Number(io, &ScriptCodeCode)) goto Done; if (!_cmsReadUInt8Number(io, &ScriptCodeCount)) goto Done; // Skip rest of tag for (i=0; i < 67; i++) { if (!io ->Read(io, &Dummy, sizeof(cmsUInt8Number), 1)) goto Error; } } Done: *nItems = 1; return mlu; Error: if (Text) _cmsFree(self ->ContextID, (void*) Text); if (mlu) cmsMLUfree(mlu); return NULL; } // This tag can come IN UNALIGNED SIZE. In order to prevent issues, we force zeros on description to align it static cmsBool Type_Text_Description_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsMLU* mlu = (cmsMLU*) Ptr; char *Text = NULL; wchar_t *Wide = NULL; cmsUInt32Number len, len_aligned, len_filler_alignment; cmsBool rc = FALSE; char Filler[68]; // Used below for writting zeroes memset(Filler, 0, sizeof(Filler)); // Get the len of string len = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0); // From ICC3.4: It has been found that textDescriptionType can contain misaligned data //(see clause 4.1 for the definition of aligned). Because the Unicode language // code and Unicode count immediately follow the ASCII description, their // alignment is not correct if the ASCII count is not a multiple of four. The // ScriptCode code is misaligned when the ASCII count is odd. Profile reading and // writing software must be written carefully in order to handle these alignment // problems. // Compute an aligned size len_aligned = _cmsALIGNLONG(len); len_filler_alignment = len_aligned - len; // Null strings if (len <= 0) { Text = (char*) _cmsDupMem(self ->ContextID, "", sizeof(char)); Wide = (wchar_t*) _cmsDupMem(self ->ContextID, L"", sizeof(wchar_t)); } else { // Create independent buffers Text = (char*) _cmsCalloc(self ->ContextID, len, sizeof(char)); if (Text == NULL) goto Error; Wide = (wchar_t*) _cmsCalloc(self ->ContextID, len, sizeof(wchar_t)); if (Wide == NULL) goto Error; // Get both representations. cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text, len * sizeof(char)); cmsMLUgetWide(mlu, cmsNoLanguage, cmsNoCountry, Wide, len * sizeof(wchar_t)); } // * cmsUInt32Number count; * Description length // * cmsInt8Number desc[count] * NULL terminated ascii string // * cmsUInt32Number ucLangCode; * UniCode language code // * cmsUInt32Number ucCount; * UniCode description length // * cmsInt16Number ucDesc[ucCount];* The UniCode description // * cmsUInt16Number scCode; * ScriptCode code // * cmsUInt8Number scCount; * ScriptCode count // * cmsInt8Number scDesc[67]; * ScriptCode Description if (!_cmsWriteUInt32Number(io, len_aligned)) goto Error; if (!io ->Write(io, len, Text)) goto Error; if (!io ->Write(io, len_filler_alignment, Filler)) goto Error; if (!_cmsWriteUInt32Number(io, 0)) goto Error; // ucLanguageCode // This part is tricky: we need an aligned tag size, and the ScriptCode part // takes 70 bytes, so we need 2 extra bytes to do the alignment if (!_cmsWriteUInt32Number(io, len_aligned+1)) goto Error; // Note that in some compilers sizeof(cmsUInt16Number) != sizeof(wchar_t) if (!_cmsWriteWCharArray(io, len, Wide)) goto Error; if (!_cmsWriteUInt16Array(io, len_filler_alignment+1, (cmsUInt16Number*) Filler)) goto Error; // ScriptCode Code & count (unused) if (!_cmsWriteUInt16Number(io, 0)) goto Error; if (!_cmsWriteUInt8Number(io, 0)) goto Error; if (!io ->Write(io, 67, Filler)) goto Error; rc = TRUE; Error: if (Text) _cmsFree(self ->ContextID, Text); if (Wide) _cmsFree(self ->ContextID, Wide); return rc; cmsUNUSED_PARAMETER(nItems); } static void* Type_Text_Description_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsMLUdup((cmsMLU*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_Text_Description_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsMLU* mlu = (cmsMLU*) Ptr; cmsMLUfree(mlu); return; cmsUNUSED_PARAMETER(self); } static cmsTagTypeSignature DecideTextDescType(cmsFloat64Number ICCVersion, const void *Data) { if (ICCVersion >= 4.0) return cmsSigMultiLocalizedUnicodeType; return cmsSigTextDescriptionType; cmsUNUSED_PARAMETER(Data); } // ******************************************************************************** // Type cmsSigCurveType // ******************************************************************************** static void *Type_Curve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number Count; cmsToneCurve* NewGamma; *nItems = 0; if (!_cmsReadUInt32Number(io, &Count)) return NULL; switch (Count) { case 0: // Linear. { cmsFloat64Number SingleGamma = 1.0; NewGamma = cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma); if (!NewGamma) return NULL; *nItems = 1; return NewGamma; } case 1: // Specified as the exponent of gamma function { cmsUInt16Number SingleGammaFixed; cmsFloat64Number SingleGamma; if (!_cmsReadUInt16Number(io, &SingleGammaFixed)) return NULL; SingleGamma = _cms8Fixed8toDouble(SingleGammaFixed); *nItems = 1; return cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma); } default: // Curve if (Count > 0x7FFF) return NULL; // This is to prevent bad guys for doing bad things NewGamma = cmsBuildTabulatedToneCurve16(self ->ContextID, Count, NULL); if (!NewGamma) return NULL; if (!_cmsReadUInt16Array(io, Count, NewGamma -> Table16)) return NULL; *nItems = 1; return NewGamma; } cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_Curve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsToneCurve* Curve = (cmsToneCurve*) Ptr; if (Curve ->nSegments == 1 && Curve ->Segments[0].Type == 1) { // Single gamma, preserve number cmsUInt16Number SingleGammaFixed = _cmsDoubleTo8Fixed8(Curve ->Segments[0].Params[0]); if (!_cmsWriteUInt32Number(io, 1)) return FALSE; if (!_cmsWriteUInt16Number(io, SingleGammaFixed)) return FALSE; return TRUE; } if (!_cmsWriteUInt32Number(io, Curve ->nEntries)) return FALSE; return _cmsWriteUInt16Array(io, Curve ->nEntries, Curve ->Table16); cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Curve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_Curve_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsToneCurve* gamma = (cmsToneCurve*) Ptr; cmsFreeToneCurve(gamma); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigParametricCurveType // ******************************************************************************** // Decide which curve type to use on writting static cmsTagTypeSignature DecideCurveType(cmsFloat64Number ICCVersion, const void *Data) { cmsToneCurve* Curve = (cmsToneCurve*) Data; if (ICCVersion < 4.0) return cmsSigCurveType; if (Curve ->nSegments != 1) return cmsSigCurveType; // Only 1-segment curves can be saved as parametric if (Curve ->Segments[0].Type < 0) return cmsSigCurveType; // Only non-inverted curves if (Curve ->Segments[0].Type > 5) return cmsSigCurveType; // Only ICC parametric curves return cmsSigParametricCurveType; } static void *Type_ParametricCurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { static const int ParamsByType[] = { 1, 3, 4, 5, 7 }; cmsFloat64Number Params[10]; cmsUInt16Number Type; int i, n; cmsToneCurve* NewGamma; if (!_cmsReadUInt16Number(io, &Type)) return NULL; if (!_cmsReadUInt16Number(io, NULL)) return NULL; // Reserved if (Type > 4) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown parametric curve type '%d'", Type); return NULL; } memset(Params, 0, sizeof(Params)); n = ParamsByType[Type]; for (i=0; i < n; i++) { if (!_cmsRead15Fixed16Number(io, &Params[i])) return NULL; } NewGamma = cmsBuildParametricToneCurve(self ->ContextID, Type+1, Params); *nItems = 1; return NewGamma; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_ParametricCurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsToneCurve* Curve = (cmsToneCurve*) Ptr; int i, nParams, typen; static const int ParamsByType[] = { 0, 1, 3, 4, 5, 7 }; typen = Curve -> Segments[0].Type; if (Curve ->nSegments > 1 || typen < 1) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Multisegment or Inverted parametric curves cannot be written"); return FALSE; } if (typen > 5) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported parametric curve"); return FALSE; } nParams = ParamsByType[typen]; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) (Curve ->Segments[0].Type - 1))) return FALSE; if (!_cmsWriteUInt16Number(io, 0)) return FALSE; // Reserved for (i=0; i < nParams; i++) { if (!_cmsWrite15Fixed16Number(io, Curve -> Segments[0].Params[i])) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_ParametricCurve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_ParametricCurve_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsToneCurve* gamma = (cmsToneCurve*) Ptr; cmsFreeToneCurve(gamma); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigDateTimeType // ******************************************************************************** // A 12-byte value representation of the time and date, where the byte usage is assigned // as specified in table 1. The actual values are encoded as 16-bit unsigned integers // (uInt16Number - see 5.1.6). // // All the dateTimeNumber values in a profile shall be in Coordinated Universal Time // (UTC, also known as GMT or ZULU Time). Profile writers are required to convert local // time to UTC when setting these values. Programmes that display these values may show // the dateTimeNumber as UTC, show the equivalent local time (at current locale), or // display both UTC and local versions of the dateTimeNumber. static void *Type_DateTime_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsDateTimeNumber timestamp; struct tm * NewDateTime; *nItems = 0; NewDateTime = (struct tm*) _cmsMalloc(self ->ContextID, sizeof(struct tm)); if (NewDateTime == NULL) return NULL; if (io->Read(io, ×tamp, sizeof(cmsDateTimeNumber), 1) != 1) return NULL; _cmsDecodeDateTimeNumber(×tamp, NewDateTime); *nItems = 1; return NewDateTime; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_DateTime_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { struct tm * DateTime = (struct tm*) Ptr; cmsDateTimeNumber timestamp; _cmsEncodeDateTimeNumber(×tamp, DateTime); if (!io ->Write(io, sizeof(cmsDateTimeNumber), ×tamp)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_DateTime_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, sizeof(struct tm)); cmsUNUSED_PARAMETER(n); } static void Type_DateTime_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type icMeasurementType // ******************************************************************************** /* The measurementType information refers only to the internal profile data and is meant to provide profile makers an alternative to the default measurement specifications. */ static void *Type_Measurement_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsICCMeasurementConditions mc; memset(&mc, 0, sizeof(mc)); if (!_cmsReadUInt32Number(io, &mc.Observer)) return NULL; if (!_cmsReadXYZNumber(io, &mc.Backing)) return NULL; if (!_cmsReadUInt32Number(io, &mc.Geometry)) return NULL; if (!_cmsRead15Fixed16Number(io, &mc.Flare)) return NULL; if (!_cmsReadUInt32Number(io, &mc.IlluminantType)) return NULL; *nItems = 1; return _cmsDupMem(self ->ContextID, &mc, sizeof(cmsICCMeasurementConditions)); cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_Measurement_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsICCMeasurementConditions* mc =(cmsICCMeasurementConditions*) Ptr; if (!_cmsWriteUInt32Number(io, mc->Observer)) return FALSE; if (!_cmsWriteXYZNumber(io, &mc->Backing)) return FALSE; if (!_cmsWriteUInt32Number(io, mc->Geometry)) return FALSE; if (!_cmsWrite15Fixed16Number(io, mc->Flare)) return FALSE; if (!_cmsWriteUInt32Number(io, mc->IlluminantType)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Measurement_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCMeasurementConditions)); cmsUNUSED_PARAMETER(n); } static void Type_Measurement_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigMultiLocalizedUnicodeType // ******************************************************************************** // // Do NOT trust SizeOfTag as there is an issue on the definition of profileSequenceDescTag. See the TechNote from // Max Derhak and Rohit Patil about this: basically the size of the string table should be guessed and cannot be // taken from the size of tag if this tag is embedded as part of bigger structures (profileSequenceDescTag, for instance) // static void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsMLU* mlu; cmsUInt32Number Count, RecLen, NumOfWchar; cmsUInt32Number SizeOfHeader; cmsUInt32Number Len, Offset; cmsUInt32Number i; wchar_t* Block; cmsUInt32Number BeginOfThisString, EndOfThisString, LargestPosition; *nItems = 0; if (!_cmsReadUInt32Number(io, &Count)) return NULL; if (!_cmsReadUInt32Number(io, &RecLen)) return NULL; if (RecLen != 12) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "multiLocalizedUnicodeType of len != 12 is not supported."); return NULL; } mlu = cmsMLUalloc(self ->ContextID, Count); if (mlu == NULL) return NULL; mlu ->UsedEntries = Count; SizeOfHeader = 12 * Count + sizeof(_cmsTagBase); LargestPosition = 0; for (i=0; i < Count; i++) { if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Language)) goto Error; if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Country)) goto Error; // Now deal with Len and offset. if (!_cmsReadUInt32Number(io, &Len)) goto Error; if (!_cmsReadUInt32Number(io, &Offset)) goto Error; // Check for overflow if (Offset < (SizeOfHeader + 8)) goto Error; // True begin of the string BeginOfThisString = Offset - SizeOfHeader - 8; // Ajust to wchar_t elements mlu ->Entries[i].Len = (Len * sizeof(wchar_t)) / sizeof(cmsUInt16Number); mlu ->Entries[i].StrW = (BeginOfThisString * sizeof(wchar_t)) / sizeof(cmsUInt16Number); // To guess maximum size, add offset + len EndOfThisString = BeginOfThisString + Len; if (EndOfThisString > LargestPosition) LargestPosition = EndOfThisString; } // Now read the remaining of tag and fill all strings. Substract the directory SizeOfTag = (LargestPosition * sizeof(wchar_t)) / sizeof(cmsUInt16Number); if (SizeOfTag == 0) { Block = NULL; NumOfWchar = 0; } else { Block = (wchar_t*) _cmsMalloc(self ->ContextID, SizeOfTag); if (Block == NULL) goto Error; NumOfWchar = SizeOfTag / sizeof(wchar_t); if (!_cmsReadWCharArray(io, NumOfWchar, Block)) goto Error; } mlu ->MemPool = Block; mlu ->PoolSize = SizeOfTag; mlu ->PoolUsed = SizeOfTag; *nItems = 1; return (void*) mlu; Error: if (mlu) cmsMLUfree(mlu); return NULL; } static cmsBool Type_MLU_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsMLU* mlu =(cmsMLU*) Ptr; cmsUInt32Number HeaderSize; cmsUInt32Number Len, Offset; int i; if (Ptr == NULL) { // Empty placeholder if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 12)) return FALSE; return TRUE; } if (!_cmsWriteUInt32Number(io, mlu ->UsedEntries)) return FALSE; if (!_cmsWriteUInt32Number(io, 12)) return FALSE; HeaderSize = 12 * mlu ->UsedEntries + sizeof(_cmsTagBase); for (i=0; i < mlu ->UsedEntries; i++) { Len = mlu ->Entries[i].Len; Offset = mlu ->Entries[i].StrW; Len = (Len * sizeof(cmsUInt16Number)) / sizeof(wchar_t); Offset = (Offset * sizeof(cmsUInt16Number)) / sizeof(wchar_t) + HeaderSize + 8; if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Language)) return FALSE; if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Country)) return FALSE; if (!_cmsWriteUInt32Number(io, Len)) return FALSE; if (!_cmsWriteUInt32Number(io, Offset)) return FALSE; } if (!_cmsWriteWCharArray(io, mlu ->PoolUsed / sizeof(wchar_t), (wchar_t*) mlu ->MemPool)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_MLU_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsMLUdup((cmsMLU*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_MLU_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsMLUfree((cmsMLU*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigLut8Type // ******************************************************************************** // Decide which LUT type to use on writting static cmsTagTypeSignature DecideLUTtypeA2B(cmsFloat64Number ICCVersion, const void *Data) { cmsPipeline* Lut = (cmsPipeline*) Data; if (ICCVersion < 4.0) { if (Lut ->SaveAs8Bits) return cmsSigLut8Type; return cmsSigLut16Type; } else { return cmsSigLutAtoBType; } } static cmsTagTypeSignature DecideLUTtypeB2A(cmsFloat64Number ICCVersion, const void *Data) { cmsPipeline* Lut = (cmsPipeline*) Data; if (ICCVersion < 4.0) { if (Lut ->SaveAs8Bits) return cmsSigLut8Type; return cmsSigLut16Type; } else { return cmsSigLutBtoAType; } } /* This structure represents a colour transform using tables of 8-bit precision. This type contains four processing elements: a 3 by 3 matrix (which shall be the identity matrix unless the input colour space is XYZ), a set of one dimensional input tables, a multidimensional lookup table, and a set of one dimensional output tables. Data is processed using these elements via the following sequence: (matrix) -> (1d input tables) -> (multidimensional lookup table - CLUT) -> (1d output tables) Byte Position Field Length (bytes) Content Encoded as... 8 1 Number of Input Channels (i) uInt8Number 9 1 Number of Output Channels (o) uInt8Number 10 1 Number of CLUT grid points (identical for each side) (g) uInt8Number 11 1 Reserved for padding (fill with 00h) 12..15 4 Encoded e00 parameter s15Fixed16Number */ // Read 8 bit tables as gamma functions static cmsBool Read8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels) { cmsUInt8Number* Temp = NULL; int i, j; cmsToneCurve* Tables[cmsMAXCHANNELS]; if (nChannels > cmsMAXCHANNELS) return FALSE; if (nChannels <= 0) return FALSE; memset(Tables, 0, sizeof(Tables)); Temp = (cmsUInt8Number*) _cmsMalloc(ContextID, 256); if (Temp == NULL) return FALSE; for (i=0; i < nChannels; i++) { Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL); if (Tables[i] == NULL) goto Error; } for (i=0; i < nChannels; i++) { if (io ->Read(io, Temp, 256, 1) != 1) goto Error; for (j=0; j < 256; j++) Tables[i]->Table16[j] = (cmsUInt16Number) FROM_8_TO_16(Temp[j]); } _cmsFree(ContextID, Temp); Temp = NULL; if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables))) goto Error; for (i=0; i < nChannels; i++) cmsFreeToneCurve(Tables[i]); return TRUE; Error: for (i=0; i < nChannels; i++) { if (Tables[i]) cmsFreeToneCurve(Tables[i]); } if (Temp) _cmsFree(ContextID, Temp); return FALSE; } static cmsBool Write8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsUInt32Number n, _cmsStageToneCurvesData* Tables) { int j; cmsUInt32Number i; cmsUInt8Number val; for (i=0; i < n; i++) { if (Tables) { // Usual case of identity curves if ((Tables ->TheCurves[i]->nEntries == 2) && (Tables->TheCurves[i]->Table16[0] == 0) && (Tables->TheCurves[i]->Table16[1] == 65535)) { for (j=0; j < 256; j++) { if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) j)) return FALSE; } } else if (Tables ->TheCurves[i]->nEntries != 256) { cmsSignalError(ContextID, cmsERROR_RANGE, "LUT8 needs 256 entries on prelinearization"); return FALSE; } else for (j=0; j < 256; j++) { if (Tables != NULL) val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]); else val = (cmsUInt8Number) j; if (!_cmsWriteUInt8Number(io, val)) return FALSE; } } } return TRUE; } // Check overflow static cmsUInt32Number uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b) { cmsUInt32Number rv = 1, rc; if (a == 0) return 0; if (n == 0) return 0; for (; b > 0; b--) { rv *= a; // Check for overflow if (rv > UINT_MAX / a) return (cmsUInt32Number) -1; } rc = rv * n; if (rv != rc / n) return (cmsUInt32Number) -1; return rc; } // That will create a MPE LUT with Matrix, pre tables, CLUT and post tables. // 8 bit lut may be scaled easely to v4 PCS, but we need also to properly adjust // PCS on BToAxx tags and AtoB if abstract. We need to fix input direction. static void *Type_LUT8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt8Number InputChannels, OutputChannels, CLUTpoints; cmsUInt8Number* Temp = NULL; cmsPipeline* NewLUT = NULL; cmsUInt32Number nTabSize, i; cmsFloat64Number Matrix[3*3]; *nItems = 0; if (!_cmsReadUInt8Number(io, &InputChannels)) goto Error; if (!_cmsReadUInt8Number(io, &OutputChannels)) goto Error; if (!_cmsReadUInt8Number(io, &CLUTpoints)) goto Error; if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least // Padding if (!_cmsReadUInt8Number(io, NULL)) goto Error; // Do some checking if (InputChannels > cmsMAXCHANNELS) goto Error; if (OutputChannels > cmsMAXCHANNELS) goto Error; // Allocates an empty Pipeline NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels); if (NewLUT == NULL) goto Error; // Read the Matrix if (!_cmsRead15Fixed16Number(io, &Matrix[0])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[1])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[2])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[3])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[4])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[5])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[6])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[7])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[8])) goto Error; // Only operates if not identity... if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL))) goto Error; } // Get input tables if (!Read8bitTables(self ->ContextID, io, NewLUT, InputChannels)) goto Error; // Get 3D CLUT. Check the overflow.... nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels); if (nTabSize == (cmsUInt32Number) -1) goto Error; if (nTabSize > 0) { cmsUInt16Number *PtrW, *T; PtrW = T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number)); if (T == NULL) goto Error; Temp = (cmsUInt8Number*) _cmsMalloc(self ->ContextID, nTabSize); if (Temp == NULL) { _cmsFree(self ->ContextID, T); goto Error; } if (io ->Read(io, Temp, nTabSize, 1) != 1) { _cmsFree(self ->ContextID, T); _cmsFree(self ->ContextID, Temp); goto Error; } for (i = 0; i < nTabSize; i++) { *PtrW++ = FROM_8_TO_16(Temp[i]); } _cmsFree(self ->ContextID, Temp); Temp = NULL; if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) goto Error; _cmsFree(self ->ContextID, T); } // Get output tables if (!Read8bitTables(self ->ContextID, io, NewLUT, OutputChannels)) goto Error; *nItems = 1; return NewLUT; Error: if (NewLUT != NULL) cmsPipelineFree(NewLUT); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // We only allow a specific MPE structure: Matrix plus prelin, plus clut, plus post-lin. static cmsBool Type_LUT8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt32Number j, nTabSize; cmsUInt8Number val; cmsPipeline* NewLUT = (cmsPipeline*) Ptr; cmsStage* mpe; _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL; _cmsStageMatrixData* MatMPE = NULL; _cmsStageCLutData* clut = NULL; int clutPoints; // Disassemble the LUT into components. mpe = NewLUT -> Elements; if (mpe ->Type == cmsSigMatrixElemType) { MatMPE = (_cmsStageMatrixData*) mpe ->Data; mpe = mpe -> Next; } if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { PreMPE = (_cmsStageToneCurvesData*) mpe ->Data; mpe = mpe -> Next; } if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) { clut = (_cmsStageCLutData*) mpe -> Data; mpe = mpe ->Next; } if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { PostMPE = (_cmsStageToneCurvesData*) mpe ->Data; mpe = mpe -> Next; } // That should be all if (mpe != NULL) { cmsSignalError(mpe->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT is not suitable to be saved as LUT8"); return FALSE; } if (clut == NULL) clutPoints = 0; else clutPoints = clut->Params->nSamples[0]; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) NewLUT ->InputChannels)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) NewLUT ->OutputChannels)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE; if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding if (MatMPE != NULL) { if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[0])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[1])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[2])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[3])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[4])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[5])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[6])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[7])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[8])) return FALSE; } else { if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; } // The prelinearization table if (!Write8bitTables(self ->ContextID, io, NewLUT ->InputChannels, PreMPE)) return FALSE; nTabSize = uipow(NewLUT->OutputChannels, clutPoints, NewLUT ->InputChannels); if (nTabSize == (cmsUInt32Number) -1) return FALSE; if (nTabSize > 0) { // The 3D CLUT. if (clut != NULL) { for (j=0; j < nTabSize; j++) { val = (cmsUInt8Number) FROM_16_TO_8(clut ->Tab.T[j]); if (!_cmsWriteUInt8Number(io, val)) return FALSE; } } } // The postlinearization table if (!Write8bitTables(self ->ContextID, io, NewLUT ->OutputChannels, PostMPE)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_LUT8_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsPipelineDup((cmsPipeline*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_LUT8_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsPipelineFree((cmsPipeline*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigLut16Type // ******************************************************************************** // Read 16 bit tables as gamma functions static cmsBool Read16bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels, int nEntries) { int i; cmsToneCurve* Tables[cmsMAXCHANNELS]; // Maybe an empty table? (this is a lcms extension) if (nEntries <= 0) return TRUE; // Check for malicious profiles if (nEntries < 2) return FALSE; if (nChannels > cmsMAXCHANNELS) return FALSE; // Init table to zero memset(Tables, 0, sizeof(Tables)); for (i=0; i < nChannels; i++) { Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, nEntries, NULL); if (Tables[i] == NULL) goto Error; if (!_cmsReadUInt16Array(io, nEntries, Tables[i]->Table16)) goto Error; } // Add the table (which may certainly be an identity, but this is up to the optimizer, not the reading code) if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables))) goto Error; for (i=0; i < nChannels; i++) cmsFreeToneCurve(Tables[i]); return TRUE; Error: for (i=0; i < nChannels; i++) { if (Tables[i]) cmsFreeToneCurve(Tables[i]); } return FALSE; } static cmsBool Write16bitTables(cmsContext ContextID, cmsIOHANDLER* io, _cmsStageToneCurvesData* Tables) { int j; cmsUInt32Number i; cmsUInt16Number val; int nEntries; _cmsAssert(Tables != NULL); nEntries = Tables->TheCurves[0]->nEntries; for (i=0; i < Tables ->nCurves; i++) { for (j=0; j < nEntries; j++) { val = Tables->TheCurves[i]->Table16[j]; if (!_cmsWriteUInt16Number(io, val)) return FALSE; } } return TRUE; cmsUNUSED_PARAMETER(ContextID); } static void *Type_LUT16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt8Number InputChannels, OutputChannels, CLUTpoints; cmsPipeline* NewLUT = NULL; cmsUInt32Number nTabSize; cmsFloat64Number Matrix[3*3]; cmsUInt16Number InputEntries, OutputEntries; *nItems = 0; if (!_cmsReadUInt8Number(io, &InputChannels)) return NULL; if (!_cmsReadUInt8Number(io, &OutputChannels)) return NULL; if (!_cmsReadUInt8Number(io, &CLUTpoints)) return NULL; // 255 maximum // Padding if (!_cmsReadUInt8Number(io, NULL)) return NULL; // Do some checking if (InputChannels > cmsMAXCHANNELS) goto Error; if (OutputChannels > cmsMAXCHANNELS) goto Error; // Allocates an empty LUT NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels); if (NewLUT == NULL) goto Error; // Read the Matrix if (!_cmsRead15Fixed16Number(io, &Matrix[0])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[1])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[2])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[3])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[4])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[5])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[6])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[7])) goto Error; if (!_cmsRead15Fixed16Number(io, &Matrix[8])) goto Error; // Only operates on 3 channels if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL))) goto Error; } if (!_cmsReadUInt16Number(io, &InputEntries)) goto Error; if (!_cmsReadUInt16Number(io, &OutputEntries)) goto Error; if (InputEntries > 0x7FFF || OutputEntries > 0x7FFF) goto Error; if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least // Get input tables if (!Read16bitTables(self ->ContextID, io, NewLUT, InputChannels, InputEntries)) goto Error; // Get 3D CLUT nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels); if (nTabSize == (cmsUInt32Number) -1) goto Error; if (nTabSize > 0) { cmsUInt16Number *T; T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number)); if (T == NULL) goto Error; if (!_cmsReadUInt16Array(io, nTabSize, T)) { _cmsFree(self ->ContextID, T); goto Error; } if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) { _cmsFree(self ->ContextID, T); goto Error; } _cmsFree(self ->ContextID, T); } // Get output tables if (!Read16bitTables(self ->ContextID, io, NewLUT, OutputChannels, OutputEntries)) goto Error; *nItems = 1; return NewLUT; Error: if (NewLUT != NULL) cmsPipelineFree(NewLUT); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // We only allow some specific MPE structures: Matrix plus prelin, plus clut, plus post-lin. // Some empty defaults are created for missing parts static cmsBool Type_LUT16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt32Number nTabSize; cmsPipeline* NewLUT = (cmsPipeline*) Ptr; cmsStage* mpe; _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL; _cmsStageMatrixData* MatMPE = NULL; _cmsStageCLutData* clut = NULL; int i, InputChannels, OutputChannels, clutPoints; // Disassemble the LUT into components. mpe = NewLUT -> Elements; if (mpe != NULL && mpe ->Type == cmsSigMatrixElemType) { MatMPE = (_cmsStageMatrixData*) mpe ->Data; mpe = mpe -> Next; } if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { PreMPE = (_cmsStageToneCurvesData*) mpe ->Data; mpe = mpe -> Next; } if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) { clut = (_cmsStageCLutData*) mpe -> Data; mpe = mpe ->Next; } if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { PostMPE = (_cmsStageToneCurvesData*) mpe ->Data; mpe = mpe -> Next; } // That should be all if (mpe != NULL) { cmsSignalError(mpe->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT is not suitable to be saved as LUT16"); return FALSE; } InputChannels = cmsPipelineInputChannels(NewLUT); OutputChannels = cmsPipelineOutputChannels(NewLUT); if (clut == NULL) clutPoints = 0; else clutPoints = clut->Params->nSamples[0]; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) InputChannels)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) OutputChannels)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE; if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding if (MatMPE != NULL) { if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[0])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[1])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[2])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[3])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[4])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[5])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[6])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[7])) return FALSE; if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[8])) return FALSE; } else { if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; } if (PreMPE != NULL) { if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PreMPE ->TheCurves[0]->nEntries)) return FALSE; } else { if (!_cmsWriteUInt16Number(io, 2)) return FALSE; } if (PostMPE != NULL) { if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PostMPE ->TheCurves[0]->nEntries)) return FALSE; } else { if (!_cmsWriteUInt16Number(io, 2)) return FALSE; } // The prelinearization table if (PreMPE != NULL) { if (!Write16bitTables(self ->ContextID, io, PreMPE)) return FALSE; } else { for (i=0; i < InputChannels; i++) { if (!_cmsWriteUInt16Number(io, 0)) return FALSE; if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE; } } nTabSize = uipow(OutputChannels, clutPoints, InputChannels); if (nTabSize == (cmsUInt32Number) -1) return FALSE; if (nTabSize > 0) { // The 3D CLUT. if (clut != NULL) { if (!_cmsWriteUInt16Array(io, nTabSize, clut->Tab.T)) return FALSE; } } // The postlinearization table if (PostMPE != NULL) { if (!Write16bitTables(self ->ContextID, io, PostMPE)) return FALSE; } else { for (i=0; i < OutputChannels; i++) { if (!_cmsWriteUInt16Number(io, 0)) return FALSE; if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE; } } return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_LUT16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsPipelineDup((cmsPipeline*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_LUT16_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsPipelineFree((cmsPipeline*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigLutAToBType // ******************************************************************************** // V4 stuff. Read matrix for LutAtoB and LutBtoA static cmsStage* ReadMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset) { cmsFloat64Number dMat[3*3]; cmsFloat64Number dOff[3]; cmsStage* Mat; // Go to address if (!io -> Seek(io, Offset)) return NULL; // Read the Matrix if (!_cmsRead15Fixed16Number(io, &dMat[0])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[1])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[2])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[3])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[4])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[5])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[6])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[7])) return NULL; if (!_cmsRead15Fixed16Number(io, &dMat[8])) return NULL; if (!_cmsRead15Fixed16Number(io, &dOff[0])) return NULL; if (!_cmsRead15Fixed16Number(io, &dOff[1])) return NULL; if (!_cmsRead15Fixed16Number(io, &dOff[2])) return NULL; Mat = cmsStageAllocMatrix(self ->ContextID, 3, 3, dMat, dOff); return Mat; } // V4 stuff. Read CLUT part for LutAtoB and LutBtoA static cmsStage* ReadCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, int InputChannels, int OutputChannels) { cmsUInt8Number gridPoints8[cmsMAXCHANNELS]; // Number of grid points in each dimension. cmsUInt32Number GridPoints[cmsMAXCHANNELS], i; cmsUInt8Number Precision; cmsStage* CLUT; _cmsStageCLutData* Data; if (!io -> Seek(io, Offset)) return NULL; if (io -> Read(io, gridPoints8, cmsMAXCHANNELS, 1) != 1) return NULL; for (i=0; i < cmsMAXCHANNELS; i++) { if (gridPoints8[i] == 1) return NULL; // Impossible value, 0 for no CLUT and then 2 at least GridPoints[i] = gridPoints8[i]; } if (!_cmsReadUInt8Number(io, &Precision)) return NULL; if (!_cmsReadUInt8Number(io, NULL)) return NULL; if (!_cmsReadUInt8Number(io, NULL)) return NULL; if (!_cmsReadUInt8Number(io, NULL)) return NULL; CLUT = cmsStageAllocCLut16bitGranular(self ->ContextID, GridPoints, InputChannels, OutputChannels, NULL); if (CLUT == NULL) return NULL; Data = (_cmsStageCLutData*) CLUT ->Data; // Precision can be 1 or 2 bytes if (Precision == 1) { cmsUInt8Number v; for (i=0; i < Data ->nEntries; i++) { if (io ->Read(io, &v, sizeof(cmsUInt8Number), 1) != 1) return NULL; Data ->Tab.T[i] = FROM_8_TO_16(v); } } else if (Precision == 2) { if (!_cmsReadUInt16Array(io, Data->nEntries, Data ->Tab.T)) { cmsStageFree(CLUT); return NULL; } } else { cmsStageFree(CLUT); cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision); return NULL; } return CLUT; } static cmsToneCurve* ReadEmbeddedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io) { cmsTagTypeSignature BaseType; cmsUInt32Number nItems; BaseType = _cmsReadTypeBase(io); switch (BaseType) { case cmsSigCurveType: return (cmsToneCurve*) Type_Curve_Read(self, io, &nItems, 0); case cmsSigParametricCurveType: return (cmsToneCurve*) Type_ParametricCurve_Read(self, io, &nItems, 0); default: { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) BaseType); cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String); } return NULL; } } // Read a set of curves from specific offset static cmsStage* ReadSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, cmsUInt32Number nCurves) { cmsToneCurve* Curves[cmsMAXCHANNELS]; cmsUInt32Number i; cmsStage* Lin = NULL; if (nCurves > cmsMAXCHANNELS) return FALSE; if (!io -> Seek(io, Offset)) return FALSE; for (i=0; i < nCurves; i++) Curves[i] = NULL; for (i=0; i < nCurves; i++) { Curves[i] = ReadEmbeddedCurve(self, io); if (Curves[i] == NULL) goto Error; if (!_cmsReadAlignment(io)) goto Error; } Lin = cmsStageAllocToneCurves(self ->ContextID, nCurves, Curves); Error: for (i=0; i < nCurves; i++) cmsFreeToneCurve(Curves[i]); return Lin; } // LutAtoB type // This structure represents a colour transform. The type contains up to five processing // elements which are stored in the AtoBTag tag in the following order: a set of one // dimensional curves, a 3 by 3 matrix with offset terms, a set of one dimensional curves, // a multidimensional lookup table, and a set of one dimensional output curves. // Data are processed using these elements via the following sequence: // //("A" curves) -> (multidimensional lookup table - CLUT) -> ("M" curves) -> (matrix) -> ("B" curves). // /* It is possible to use any or all of these processing elements. At least one processing element must be included.Only the following combinations are allowed: B M - Matrix - B A - CLUT - B A - CLUT - M - Matrix - B */ static void* Type_LUTA2B_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number BaseOffset; cmsUInt8Number inputChan; // Number of input channels cmsUInt8Number outputChan; // Number of output channels cmsUInt32Number offsetB; // Offset to first "B" curve cmsUInt32Number offsetMat; // Offset to matrix cmsUInt32Number offsetM; // Offset to first "M" curve cmsUInt32Number offsetC; // Offset to CLUT cmsUInt32Number offsetA; // Offset to first "A" curve cmsPipeline* NewLUT = NULL; BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); if (!_cmsReadUInt8Number(io, &inputChan)) return NULL; if (!_cmsReadUInt8Number(io, &outputChan)) return NULL; if (!_cmsReadUInt16Number(io, NULL)) return NULL; if (!_cmsReadUInt32Number(io, &offsetB)) return NULL; if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL; if (!_cmsReadUInt32Number(io, &offsetM)) return NULL; if (!_cmsReadUInt32Number(io, &offsetC)) return NULL; if (!_cmsReadUInt32Number(io, &offsetA)) return NULL; // Allocates an empty LUT NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan); if (NewLUT == NULL) return NULL; if (offsetA!= 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan))) goto Error; } if (offsetC != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan))) goto Error; } if (offsetM != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan))) goto Error; } if (offsetMat != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat))) goto Error; } if (offsetB != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan))) goto Error; } *nItems = 1; return NewLUT; Error: cmsPipelineFree(NewLUT); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // Write a set of curves static cmsBool WriteMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsStage* mpe) { _cmsStageMatrixData* m = (_cmsStageMatrixData*) mpe -> Data; // Write the Matrix if (!_cmsWrite15Fixed16Number(io, m -> Double[0])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Double[1])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Double[2])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Double[3])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Double[4])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Double[5])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Double[6])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Double[7])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Double[8])) return FALSE; if (m ->Offset != NULL) { if (!_cmsWrite15Fixed16Number(io, m -> Offset[0])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Offset[1])) return FALSE; if (!_cmsWrite15Fixed16Number(io, m -> Offset[2])) return FALSE; } else { if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(self); } // Write a set of curves static cmsBool WriteSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsTagTypeSignature Type, cmsStage* mpe) { cmsUInt32Number i, n; cmsTagTypeSignature CurrentType; cmsToneCurve** Curves; n = cmsStageOutputChannels(mpe); Curves = _cmsStageGetPtrToCurveSet(mpe); for (i=0; i < n; i++) { // If this is a table-based curve, use curve type even on V4 CurrentType = Type; if ((Curves[i] ->nSegments == 0)|| ((Curves[i]->nSegments == 2) && (Curves[i] ->Segments[1].Type == 0)) ) CurrentType = cmsSigCurveType; else if (Curves[i] ->Segments[0].Type < 0) CurrentType = cmsSigCurveType; if (!_cmsWriteTypeBase(io, CurrentType)) return FALSE; switch (CurrentType) { case cmsSigCurveType: if (!Type_Curve_Write(self, io, Curves[i], 1)) return FALSE; break; case cmsSigParametricCurveType: if (!Type_ParametricCurve_Write(self, io, Curves[i], 1)) return FALSE; break; default: { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) Type); cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String); } return FALSE; } if (!_cmsWriteAlignment(io)) return FALSE; } return TRUE; } static cmsBool WriteCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt8Number Precision, cmsStage* mpe) { cmsUInt8Number gridPoints[cmsMAXCHANNELS]; // Number of grid points in each dimension. cmsUInt32Number i; _cmsStageCLutData* CLUT = ( _cmsStageCLutData*) mpe -> Data; if (CLUT ->HasFloatValues) { cmsSignalError(self ->ContextID, cmsERROR_NOT_SUITABLE, "Cannot save floating point data, CLUT are 8 or 16 bit only"); return FALSE; } memset(gridPoints, 0, sizeof(gridPoints)); for (i=0; i < (cmsUInt32Number) CLUT ->Params ->nInputs; i++) gridPoints[i] = (cmsUInt8Number) CLUT ->Params ->nSamples[i]; if (!io -> Write(io, cmsMAXCHANNELS*sizeof(cmsUInt8Number), gridPoints)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) Precision)) return FALSE; if (!_cmsWriteUInt8Number(io, 0)) return FALSE; if (!_cmsWriteUInt8Number(io, 0)) return FALSE; if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Precision can be 1 or 2 bytes if (Precision == 1) { for (i=0; i < CLUT->nEntries; i++) { if (!_cmsWriteUInt8Number(io, FROM_16_TO_8(CLUT->Tab.T[i]))) return FALSE; } } else if (Precision == 2) { if (!_cmsWriteUInt16Array(io, CLUT->nEntries, CLUT ->Tab.T)) return FALSE; } else { cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision); return FALSE; } if (!_cmsWriteAlignment(io)) return FALSE; return TRUE; } static cmsBool Type_LUTA2B_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsPipeline* Lut = (cmsPipeline*) Ptr; int inputChan, outputChan; cmsStage *A = NULL, *B = NULL, *M = NULL; cmsStage * Matrix = NULL; cmsStage * CLUT = NULL; cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0; cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos; // Get the base for all offsets BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); if (Lut ->Elements != NULL) if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &M, &Matrix, &B)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &A, &CLUT, &B)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &A, &CLUT, &M, &Matrix, &B)) { cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, "LUT is not suitable to be saved as LutAToB"); return FALSE; } // Get input, output channels inputChan = cmsPipelineInputChannels(Lut); outputChan = cmsPipelineOutputChannels(Lut); // Write channel count if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE; if (!_cmsWriteUInt16Number(io, 0)) return FALSE; // Keep directory to be filled latter DirectoryPos = io ->Tell(io); // Write the directory if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (A != NULL) { offsetA = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE; } if (CLUT != NULL) { offsetC = io ->Tell(io) - BaseOffset; if (!WriteCLUT(self, io, Lut ->SaveAs8Bits ? 1 : 2, CLUT)) return FALSE; } if (M != NULL) { offsetM = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE; } if (Matrix != NULL) { offsetMat = io ->Tell(io) - BaseOffset; if (!WriteMatrix(self, io, Matrix)) return FALSE; } if (B != NULL) { offsetB = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE; } CurrentPos = io ->Tell(io); if (!io ->Seek(io, DirectoryPos)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE; if (!io ->Seek(io, CurrentPos)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_LUTA2B_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsPipelineDup((cmsPipeline*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_LUTA2B_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsPipelineFree((cmsPipeline*) Ptr); return; cmsUNUSED_PARAMETER(self); } // LutBToA type static void* Type_LUTB2A_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt8Number inputChan; // Number of input channels cmsUInt8Number outputChan; // Number of output channels cmsUInt32Number BaseOffset; // Actual position in file cmsUInt32Number offsetB; // Offset to first "B" curve cmsUInt32Number offsetMat; // Offset to matrix cmsUInt32Number offsetM; // Offset to first "M" curve cmsUInt32Number offsetC; // Offset to CLUT cmsUInt32Number offsetA; // Offset to first "A" curve cmsPipeline* NewLUT = NULL; BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); if (!_cmsReadUInt8Number(io, &inputChan)) return NULL; if (!_cmsReadUInt8Number(io, &outputChan)) return NULL; // Padding if (!_cmsReadUInt16Number(io, NULL)) return NULL; if (!_cmsReadUInt32Number(io, &offsetB)) return NULL; if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL; if (!_cmsReadUInt32Number(io, &offsetM)) return NULL; if (!_cmsReadUInt32Number(io, &offsetC)) return NULL; if (!_cmsReadUInt32Number(io, &offsetA)) return NULL; // Allocates an empty LUT NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan); if (NewLUT == NULL) return NULL; if (offsetB != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan))) goto Error; } if (offsetMat != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat))) goto Error; } if (offsetM != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan))) goto Error; } if (offsetC != 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan))) goto Error; } if (offsetA!= 0) { if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan))) goto Error; } *nItems = 1; return NewLUT; Error: cmsPipelineFree(NewLUT); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } /* B B - Matrix - M B - CLUT - A B - Matrix - M - CLUT - A */ static cmsBool Type_LUTB2A_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsPipeline* Lut = (cmsPipeline*) Ptr; int inputChan, outputChan; cmsStage *A = NULL, *B = NULL, *M = NULL; cmsStage *Matrix = NULL; cmsStage *CLUT = NULL; cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0; cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos; BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &B, &Matrix, &M)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &CLUT, &A)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &Matrix, &M, &CLUT, &A)) { cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, "LUT is not suitable to be saved as LutBToA"); return FALSE; } inputChan = cmsPipelineInputChannels(Lut); outputChan = cmsPipelineOutputChannels(Lut); if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE; if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE; if (!_cmsWriteUInt16Number(io, 0)) return FALSE; DirectoryPos = io ->Tell(io); if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (A != NULL) { offsetA = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE; } if (CLUT != NULL) { offsetC = io ->Tell(io) - BaseOffset; if (!WriteCLUT(self, io, Lut ->SaveAs8Bits ? 1 : 2, CLUT)) return FALSE; } if (M != NULL) { offsetM = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE; } if (Matrix != NULL) { offsetMat = io ->Tell(io) - BaseOffset; if (!WriteMatrix(self, io, Matrix)) return FALSE; } if (B != NULL) { offsetB = io ->Tell(io) - BaseOffset; if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE; } CurrentPos = io ->Tell(io); if (!io ->Seek(io, DirectoryPos)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE; if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE; if (!io ->Seek(io, CurrentPos)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_LUTB2A_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsPipelineDup((cmsPipeline*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_LUTB2A_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsPipelineFree((cmsPipeline*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigColorantTableType // ******************************************************************************** /* The purpose of this tag is to identify the colorants used in the profile by a unique name and set of XYZ or L*a*b* values to give the colorant an unambiguous value. The first colorant listed is the colorant of the first device channel of a lut tag. The second colorant listed is the colorant of the second device channel of a lut tag, and so on. */ static void *Type_ColorantTable_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number i, Count; cmsNAMEDCOLORLIST* List; char Name[34]; cmsUInt16Number PCS[3]; if (!_cmsReadUInt32Number(io, &Count)) return NULL; if (Count > cmsMAXCHANNELS) { cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many colorants '%d'", Count); return NULL; } List = cmsAllocNamedColorList(self ->ContextID, Count, 0, "", ""); for (i=0; i < Count; i++) { if (io ->Read(io, Name, 32, 1) != 1) goto Error; Name[33] = 0; if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error; if (!cmsAppendNamedColor(List, Name, PCS, NULL)) goto Error; } *nItems = 1; return List; Error: *nItems = 0; cmsFreeNamedColorList(List); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // Saves a colorant table. It is using the named color structure for simplicity sake static cmsBool Type_ColorantTable_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr; int i, nColors; nColors = cmsNamedColorCount(NamedColorList); if (!_cmsWriteUInt32Number(io, nColors)) return FALSE; for (i=0; i < nColors; i++) { char root[33]; cmsUInt16Number PCS[3]; if (!cmsNamedColorInfo(NamedColorList, i, root, NULL, NULL, PCS, NULL)) return 0; root[32] = 0; if (!io ->Write(io, 32, root)) return FALSE; if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_ColorantTable_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr; return (void*) cmsDupNamedColorList(nc); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_ColorantTable_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigNamedColor2Type // ******************************************************************************** // //The namedColor2Type is a count value and array of structures that provide color //coordinates for 7-bit ASCII color names. For each named color, a PCS and optional //device representation of the color are given. Both representations are 16-bit values. //The device representation corresponds to the headers color space of data field. //This representation should be consistent with the number of device components //field in the namedColor2Type. If this field is 0, device coordinates are not provided. //The PCS representation corresponds to the headers PCS field. The PCS representation //is always provided. Color names are fixed-length, 32-byte fields including null //termination. In order to maintain maximum portability, it is strongly recommended //that special characters of the 7-bit ASCII set not be used. static void *Type_NamedColor_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number vendorFlag; // Bottom 16 bits for ICC use cmsUInt32Number count; // Count of named colors cmsUInt32Number nDeviceCoords; // Num of device coordinates char prefix[32]; // Prefix for each color name char suffix[32]; // Suffix for each color name cmsNAMEDCOLORLIST* v; cmsUInt32Number i; *nItems = 0; if (!_cmsReadUInt32Number(io, &vendorFlag)) return NULL; if (!_cmsReadUInt32Number(io, &count)) return NULL; if (!_cmsReadUInt32Number(io, &nDeviceCoords)) return NULL; if (io -> Read(io, prefix, 32, 1) != 1) return NULL; if (io -> Read(io, suffix, 32, 1) != 1) return NULL; prefix[31] = suffix[31] = 0; v = cmsAllocNamedColorList(self ->ContextID, count, nDeviceCoords, prefix, suffix); if (v == NULL) { cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many named colors '%d'", count); return NULL; } if (nDeviceCoords > cmsMAXCHANNELS) { cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many device coordinates '%d'", nDeviceCoords); return 0; } for (i=0; i < count; i++) { cmsUInt16Number PCS[3]; cmsUInt16Number Colorant[cmsMAXCHANNELS]; char Root[33]; memset(Colorant, 0, sizeof(Colorant)); if (io -> Read(io, Root, 32, 1) != 1) return NULL; if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error; if (!_cmsReadUInt16Array(io, nDeviceCoords, Colorant)) goto Error; if (!cmsAppendNamedColor(v, Root, PCS, Colorant)) goto Error; } *nItems = 1; return (void*) v ; Error: cmsFreeNamedColorList(v); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // Saves a named color list into a named color profile static cmsBool Type_NamedColor_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr; char prefix[32]; // Prefix for each color name char suffix[32]; // Suffix for each color name int i, nColors; nColors = cmsNamedColorCount(NamedColorList); if (!_cmsWriteUInt32Number(io, 0)) return FALSE; if (!_cmsWriteUInt32Number(io, nColors)) return FALSE; if (!_cmsWriteUInt32Number(io, NamedColorList ->ColorantCount)) return FALSE; strncpy(prefix, (const char*) NamedColorList->Prefix, 32); strncpy(suffix, (const char*) NamedColorList->Suffix, 32); suffix[31] = prefix[31] = 0; if (!io ->Write(io, 32, prefix)) return FALSE; if (!io ->Write(io, 32, suffix)) return FALSE; for (i=0; i < nColors; i++) { cmsUInt16Number PCS[3]; cmsUInt16Number Colorant[cmsMAXCHANNELS]; char Root[33]; if (!cmsNamedColorInfo(NamedColorList, i, Root, NULL, NULL, PCS, Colorant)) return 0; if (!io ->Write(io, 32 , Root)) return FALSE; if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE; if (!_cmsWriteUInt16Array(io, NamedColorList ->ColorantCount, Colorant)) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_NamedColor_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr; return (void*) cmsDupNamedColorList(nc); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_NamedColor_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigProfileSequenceDescType // ******************************************************************************** // This type is an array of structures, each of which contains information from the // header fields and tags from the original profiles which were combined to create // the final profile. The order of the structures is the order in which the profiles // were combined and includes a structure for the final profile. This provides a // description of the profile sequence from source to destination, // typically used with the DeviceLink profile. static cmsBool ReadEmbeddedText(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU** mlu, cmsUInt32Number SizeOfTag) { cmsTagTypeSignature BaseType; cmsUInt32Number nItems; BaseType = _cmsReadTypeBase(io); switch (BaseType) { case cmsSigTextType: if (*mlu) cmsMLUfree(*mlu); *mlu = (cmsMLU*)Type_Text_Read(self, io, &nItems, SizeOfTag); return (*mlu != NULL); case cmsSigTextDescriptionType: if (*mlu) cmsMLUfree(*mlu); *mlu = (cmsMLU*) Type_Text_Description_Read(self, io, &nItems, SizeOfTag); return (*mlu != NULL); /* TBD: Size is needed for MLU, and we have no idea on which is the available size */ case cmsSigMultiLocalizedUnicodeType: if (*mlu) cmsMLUfree(*mlu); *mlu = (cmsMLU*) Type_MLU_Read(self, io, &nItems, SizeOfTag); return (*mlu != NULL); default: return FALSE; } } static void *Type_ProfileSequenceDesc_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsSEQ* OutSeq; cmsUInt32Number i, Count; *nItems = 0; if (!_cmsReadUInt32Number(io, &Count)) return NULL; if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count); if (OutSeq == NULL) return NULL; OutSeq ->n = Count; // Get structures as well for (i=0; i < Count; i++) { cmsPSEQDESC* sec = &OutSeq -> seq[i]; if (!_cmsReadUInt32Number(io, &sec ->deviceMfg)) goto Error; if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; SizeOfTag -= sizeof(cmsUInt32Number); if (!_cmsReadUInt32Number(io, &sec ->deviceModel)) goto Error; if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; SizeOfTag -= sizeof(cmsUInt32Number); if (!_cmsReadUInt64Number(io, &sec ->attributes)) goto Error; if (SizeOfTag < sizeof(cmsUInt64Number)) goto Error; SizeOfTag -= sizeof(cmsUInt64Number); if (!_cmsReadUInt32Number(io, (cmsUInt32Number *)&sec ->technology)) goto Error; if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; SizeOfTag -= sizeof(cmsUInt32Number); if (!ReadEmbeddedText(self, io, &sec ->Manufacturer, SizeOfTag)) goto Error; if (!ReadEmbeddedText(self, io, &sec ->Model, SizeOfTag)) goto Error; } *nItems = 1; return OutSeq; Error: cmsFreeProfileSequenceDescription(OutSeq); return NULL; } // Aux--Embed a text description type. It can be of type text description or multilocalized unicode // and it depends of the version number passed on cmsTagDescriptor structure instead of stack static cmsBool SaveDescription(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* Text) { if (self ->ICCVersion < 0x4000000) { if (!_cmsWriteTypeBase(io, cmsSigTextDescriptionType)) return FALSE; return Type_Text_Description_Write(self, io, Text, 1); } else { if (!_cmsWriteTypeBase(io, cmsSigMultiLocalizedUnicodeType)) return FALSE; return Type_MLU_Write(self, io, Text, 1); } } static cmsBool Type_ProfileSequenceDesc_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsSEQ* Seq = (cmsSEQ*) Ptr; cmsUInt32Number i; if (!_cmsWriteUInt32Number(io, Seq->n)) return FALSE; for (i=0; i < Seq ->n; i++) { cmsPSEQDESC* sec = &Seq -> seq[i]; if (!_cmsWriteUInt32Number(io, sec ->deviceMfg)) return FALSE; if (!_cmsWriteUInt32Number(io, sec ->deviceModel)) return FALSE; if (!_cmsWriteUInt64Number(io, &sec ->attributes)) return FALSE; if (!_cmsWriteUInt32Number(io, sec ->technology)) return FALSE; if (!SaveDescription(self, io, sec ->Manufacturer)) return FALSE; if (!SaveDescription(self, io, sec ->Model)) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_ProfileSequenceDesc_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_ProfileSequenceDesc_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigProfileSequenceIdType // ******************************************************************************** /* In certain workflows using ICC Device Link Profiles, it is necessary to identify the original profiles that were combined to create the Device Link Profile. This type is an array of structures, each of which contains information for identification of a profile used in a sequence */ static cmsBool ReadSeqID(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag) { cmsSEQ* OutSeq = (cmsSEQ*) Cargo; cmsPSEQDESC* seq = &OutSeq ->seq[n]; if (io -> Read(io, seq ->ProfileID.ID8, 16, 1) != 1) return FALSE; if (!ReadEmbeddedText(self, io, &seq ->Description, SizeOfTag)) return FALSE; return TRUE; } static void *Type_ProfileSequenceId_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsSEQ* OutSeq; cmsUInt32Number Count; cmsUInt32Number BaseOffset; *nItems = 0; // Get actual position as a basis for element offsets BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // Get table count if (!_cmsReadUInt32Number(io, &Count)) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); // Allocate an empty structure OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count); if (OutSeq == NULL) return NULL; // Read the position table if (!ReadPositionTable(self, io, Count, BaseOffset, OutSeq, ReadSeqID)) { cmsFreeProfileSequenceDescription(OutSeq); return NULL; } // Success *nItems = 1; return OutSeq; } static cmsBool WriteSeqID(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag) { cmsSEQ* Seq = (cmsSEQ*) Cargo; if (!io ->Write(io, 16, Seq ->seq[n].ProfileID.ID8)) return FALSE; // Store here the MLU if (!SaveDescription(self, io, Seq ->seq[n].Description)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_ProfileSequenceId_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsSEQ* Seq = (cmsSEQ*) Ptr; cmsUInt32Number BaseOffset; // Keep the base offset BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // This is the table count if (!_cmsWriteUInt32Number(io, Seq ->n)) return FALSE; // This is the position table and content if (!WritePositionTable(self, io, 0, Seq ->n, BaseOffset, Seq, WriteSeqID)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_ProfileSequenceId_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) { return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_ProfileSequenceId_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigUcrBgType // ******************************************************************************** /* This type contains curves representing the under color removal and black generation and a text string which is a general description of the method used for the ucr/bg. */ static void *Type_UcrBg_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUcrBg* n = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg)); cmsUInt32Number CountUcr, CountBg; char* ASCIIString; *nItems = 0; if (n == NULL) return NULL; // First curve is Under color removal if (!_cmsReadUInt32Number(io, &CountUcr)) return NULL; if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); n ->Ucr = cmsBuildTabulatedToneCurve16(self ->ContextID, CountUcr, NULL); if (n ->Ucr == NULL) return NULL; if (!_cmsReadUInt16Array(io, CountUcr, n ->Ucr->Table16)) return NULL; if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; SizeOfTag -= CountUcr * sizeof(cmsUInt16Number); // Second curve is Black generation if (!_cmsReadUInt32Number(io, &CountBg)) return NULL; if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); n ->Bg = cmsBuildTabulatedToneCurve16(self ->ContextID, CountBg, NULL); if (n ->Bg == NULL) return NULL; if (!_cmsReadUInt16Array(io, CountBg, n ->Bg->Table16)) return NULL; if (SizeOfTag < CountBg * sizeof(cmsUInt16Number)) return NULL; SizeOfTag -= CountBg * sizeof(cmsUInt16Number); if (SizeOfTag == UINT_MAX) return NULL; // Now comes the text. The length is specified by the tag size n ->Desc = cmsMLUalloc(self ->ContextID, 1); if (n ->Desc == NULL) return NULL; ASCIIString = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1); if (io ->Read(io, ASCIIString, sizeof(char), SizeOfTag) != SizeOfTag) return NULL; ASCIIString[SizeOfTag] = 0; cmsMLUsetASCII(n ->Desc, cmsNoLanguage, cmsNoCountry, ASCIIString); _cmsFree(self ->ContextID, ASCIIString); *nItems = 1; return (void*) n; } static cmsBool Type_UcrBg_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUcrBg* Value = (cmsUcrBg*) Ptr; cmsUInt32Number TextSize; char* Text; // First curve is Under color removal if (!_cmsWriteUInt32Number(io, Value ->Ucr ->nEntries)) return FALSE; if (!_cmsWriteUInt16Array(io, Value ->Ucr ->nEntries, Value ->Ucr ->Table16)) return FALSE; // Then black generation if (!_cmsWriteUInt32Number(io, Value ->Bg ->nEntries)) return FALSE; if (!_cmsWriteUInt16Array(io, Value ->Bg ->nEntries, Value ->Bg ->Table16)) return FALSE; // Now comes the text. The length is specified by the tag size TextSize = cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, NULL, 0); Text = (char*) _cmsMalloc(self ->ContextID, TextSize); if (cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, Text, TextSize) != TextSize) return FALSE; if (!io ->Write(io, TextSize, Text)) return FALSE; _cmsFree(self ->ContextID, Text); return TRUE; cmsUNUSED_PARAMETER(nItems); } static void* Type_UcrBg_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { cmsUcrBg* Src = (cmsUcrBg*) Ptr; cmsUcrBg* NewUcrBg = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg)); if (NewUcrBg == NULL) return NULL; NewUcrBg ->Bg = cmsDupToneCurve(Src ->Bg); NewUcrBg ->Ucr = cmsDupToneCurve(Src ->Ucr); NewUcrBg ->Desc = cmsMLUdup(Src ->Desc); return (void*) NewUcrBg; cmsUNUSED_PARAMETER(n); } static void Type_UcrBg_Free(struct _cms_typehandler_struct* self, void *Ptr) { cmsUcrBg* Src = (cmsUcrBg*) Ptr; if (Src ->Ucr) cmsFreeToneCurve(Src ->Ucr); if (Src ->Bg) cmsFreeToneCurve(Src ->Bg); if (Src ->Desc) cmsMLUfree(Src ->Desc); _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigCrdInfoType // ******************************************************************************** /* This type contains the PostScript product name to which this profile corresponds and the names of the companion CRDs. Recall that a single profile can generate multiple CRDs. It is implemented as a MLU being the language code "PS" and then country varies for each element: nm: PostScript product name #0: Rendering intent 0 CRD name #1: Rendering intent 1 CRD name #2: Rendering intent 2 CRD name #3: Rendering intent 3 CRD name */ // Auxiliar, read an string specified as count + string static cmsBool ReadCountAndSting(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, cmsUInt32Number* SizeOfTag, const char* Section) { cmsUInt32Number Count; char* Text; if (*SizeOfTag < sizeof(cmsUInt32Number)) return FALSE; if (!_cmsReadUInt32Number(io, &Count)) return FALSE; if (Count > UINT_MAX - sizeof(cmsUInt32Number)) return FALSE; if (*SizeOfTag < Count + sizeof(cmsUInt32Number)) return FALSE; Text = (char*) _cmsMalloc(self ->ContextID, Count+1); if (Text == NULL) return FALSE; if (io ->Read(io, Text, sizeof(cmsUInt8Number), Count) != Count) { _cmsFree(self ->ContextID, Text); return FALSE; } Text[Count] = 0; cmsMLUsetASCII(mlu, "PS", Section, Text); _cmsFree(self ->ContextID, Text); *SizeOfTag -= (Count + sizeof(cmsUInt32Number)); return TRUE; } static cmsBool WriteCountAndSting(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, const char* Section) { cmsUInt32Number TextSize; char* Text; TextSize = cmsMLUgetASCII(mlu, "PS", Section, NULL, 0); Text = (char*) _cmsMalloc(self ->ContextID, TextSize); if (!_cmsWriteUInt32Number(io, TextSize)) return FALSE; if (cmsMLUgetASCII(mlu, "PS", Section, Text, TextSize) == 0) return FALSE; if (!io ->Write(io, TextSize, Text)) return FALSE; _cmsFree(self ->ContextID, Text); return TRUE; } static void *Type_CrdInfo_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsMLU* mlu = cmsMLUalloc(self ->ContextID, 5); *nItems = 0; if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "nm")) goto Error; if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#0")) goto Error; if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#1")) goto Error; if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#2")) goto Error; if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#3")) goto Error; *nItems = 1; return (void*) mlu; Error: cmsMLUfree(mlu); return NULL; } static cmsBool Type_CrdInfo_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsMLU* mlu = (cmsMLU*) Ptr; if (!WriteCountAndSting(self, io, mlu, "nm")) goto Error; if (!WriteCountAndSting(self, io, mlu, "#0")) goto Error; if (!WriteCountAndSting(self, io, mlu, "#1")) goto Error; if (!WriteCountAndSting(self, io, mlu, "#2")) goto Error; if (!WriteCountAndSting(self, io, mlu, "#3")) goto Error; return TRUE; Error: return FALSE; cmsUNUSED_PARAMETER(nItems); } static void* Type_CrdInfo_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsMLUdup((cmsMLU*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_CrdInfo_Free(struct _cms_typehandler_struct* self, void *Ptr) { cmsMLUfree((cmsMLU*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigScreeningType // ******************************************************************************** // //The screeningType describes various screening parameters including screen //frequency, screening angle, and spot shape. static void *Type_Screening_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsScreening* sc = NULL; cmsUInt32Number i; sc = (cmsScreening*) _cmsMallocZero(self ->ContextID, sizeof(cmsScreening)); if (sc == NULL) return NULL; *nItems = 0; if (!_cmsReadUInt32Number(io, &sc ->Flag)) goto Error; if (!_cmsReadUInt32Number(io, &sc ->nChannels)) goto Error; if (sc ->nChannels > cmsMAXCHANNELS - 1) sc ->nChannels = cmsMAXCHANNELS - 1; for (i=0; i < sc ->nChannels; i++) { if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].Frequency)) goto Error; if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].ScreenAngle)) goto Error; if (!_cmsReadUInt32Number(io, &sc ->Channels[i].SpotShape)) goto Error; } *nItems = 1; return (void*) sc; Error: if (sc != NULL) _cmsFree(self ->ContextID, sc); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_Screening_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsScreening* sc = (cmsScreening* ) Ptr; cmsUInt32Number i; if (!_cmsWriteUInt32Number(io, sc ->Flag)) return FALSE; if (!_cmsWriteUInt32Number(io, sc ->nChannels)) return FALSE; for (i=0; i < sc ->nChannels; i++) { if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].Frequency)) return FALSE; if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].ScreenAngle)) return FALSE; if (!_cmsWriteUInt32Number(io, sc ->Channels[i].SpotShape)) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_Screening_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsScreening)); cmsUNUSED_PARAMETER(n); } static void Type_Screening_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigViewingConditionsType // ******************************************************************************** // //This type represents a set of viewing condition parameters including: //CIE absolute illuminant white point tristimulus values and CIE absolute //surround tristimulus values. static void *Type_ViewingConditions_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsICCViewingConditions* vc = NULL; vc = (cmsICCViewingConditions*) _cmsMallocZero(self ->ContextID, sizeof(cmsICCViewingConditions)); if (vc == NULL) return NULL; *nItems = 0; if (!_cmsReadXYZNumber(io, &vc ->IlluminantXYZ)) goto Error; if (!_cmsReadXYZNumber(io, &vc ->SurroundXYZ)) goto Error; if (!_cmsReadUInt32Number(io, &vc ->IlluminantType)) goto Error; *nItems = 1; return (void*) vc; Error: if (vc != NULL) _cmsFree(self ->ContextID, vc); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_ViewingConditions_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsICCViewingConditions* sc = (cmsICCViewingConditions* ) Ptr; if (!_cmsWriteXYZNumber(io, &sc ->IlluminantXYZ)) return FALSE; if (!_cmsWriteXYZNumber(io, &sc ->SurroundXYZ)) return FALSE; if (!_cmsWriteUInt32Number(io, sc ->IlluminantType)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void* Type_ViewingConditions_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsScreening)); cmsUNUSED_PARAMETER(n); } static void Type_ViewingConditions_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigMultiProcessElementType // ******************************************************************************** static void* GenericMPEdup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsStageDup((cmsStage*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void GenericMPEfree(struct _cms_typehandler_struct* self, void *Ptr) { cmsStageFree((cmsStage*) Ptr); return; cmsUNUSED_PARAMETER(self); } // Each curve is stored in one or more curve segments, with break-points specified between curve segments. // The first curve segment always starts at Infinity, and the last curve segment always ends at +Infinity. The // first and last curve segments shall be specified in terms of a formula, whereas the other segments shall be // specified either in terms of a formula, or by a sampled curve. // Read an embedded segmented curve static cmsToneCurve* ReadSegmentedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io) { cmsCurveSegSignature ElementSig; cmsUInt32Number i, j; cmsUInt16Number nSegments; cmsCurveSegment* Segments; cmsToneCurve* Curve; cmsFloat32Number PrevBreak = -1E22F; // - infinite // Take signature and channels for each element. if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return NULL; // That should be a segmented curve if (ElementSig != cmsSigSegmentedCurve) return NULL; if (!_cmsReadUInt32Number(io, NULL)) return NULL; if (!_cmsReadUInt16Number(io, &nSegments)) return NULL; if (!_cmsReadUInt16Number(io, NULL)) return NULL; if (nSegments < 1) return NULL; Segments = (cmsCurveSegment*) _cmsCalloc(self ->ContextID, nSegments, sizeof(cmsCurveSegment)); if (Segments == NULL) return NULL; // Read breakpoints for (i=0; i < (cmsUInt32Number) nSegments - 1; i++) { Segments[i].x0 = PrevBreak; if (!_cmsReadFloat32Number(io, &Segments[i].x1)) goto Error; PrevBreak = Segments[i].x1; } Segments[nSegments-1].x0 = PrevBreak; Segments[nSegments-1].x1 = 1E22F; // A big cmsFloat32Number number // Read segments for (i=0; i < nSegments; i++) { if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) goto Error; if (!_cmsReadUInt32Number(io, NULL)) goto Error; switch (ElementSig) { case cmsSigFormulaCurveSeg: { cmsUInt16Number Type; cmsUInt32Number ParamsByType[] = {4, 5, 5 }; if (!_cmsReadUInt16Number(io, &Type)) goto Error; if (!_cmsReadUInt16Number(io, NULL)) goto Error; Segments[i].Type = Type + 6; if (Type > 2) goto Error; for (j=0; j < ParamsByType[Type]; j++) { cmsFloat32Number f; if (!_cmsReadFloat32Number(io, &f)) goto Error; Segments[i].Params[j] = f; } } break; case cmsSigSampledCurveSeg: { cmsUInt32Number Count; if (!_cmsReadUInt32Number(io, &Count)) return NULL; Segments[i].nGridPoints = Count; Segments[i].SampledPoints = (cmsFloat32Number*) _cmsCalloc(self ->ContextID, Count, sizeof(cmsFloat32Number)); if (Segments[i].SampledPoints == NULL) goto Error; for (j=0; j < Count; j++) { if (!_cmsReadFloat32Number(io, &Segments[i].SampledPoints[j])) goto Error; } } break; default: { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) ElementSig); cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve element type '%s' found.", String); } return NULL; } } Curve = cmsBuildSegmentedToneCurve(self ->ContextID, nSegments, Segments); for (i=0; i < nSegments; i++) { if (Segments[i].SampledPoints) _cmsFree(self ->ContextID, Segments[i].SampledPoints); } _cmsFree(self ->ContextID, Segments); return Curve; Error: if (Segments) _cmsFree(self ->ContextID, Segments); return NULL; } static cmsBool ReadMPECurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag) { cmsToneCurve** GammaTables = ( cmsToneCurve**) Cargo; GammaTables[n] = ReadSegmentedCurve(self, io); return (GammaTables[n] != NULL); cmsUNUSED_PARAMETER(SizeOfTag); } static void *Type_MPEcurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsStage* mpe = NULL; cmsUInt16Number InputChans, OutputChans; cmsUInt32Number i, BaseOffset; cmsToneCurve** GammaTables; *nItems = 0; // Get actual position as a basis for element offsets BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; if (InputChans != OutputChans) return NULL; GammaTables = (cmsToneCurve**) _cmsCalloc(self ->ContextID, InputChans, sizeof(cmsToneCurve*)); if (GammaTables == NULL) return NULL; if (ReadPositionTable(self, io, InputChans, BaseOffset, GammaTables, ReadMPECurve)) { mpe = cmsStageAllocToneCurves(self ->ContextID, InputChans, GammaTables); } else { mpe = NULL; } for (i=0; i < InputChans; i++) { if (GammaTables[i]) cmsFreeToneCurve(GammaTables[i]); } _cmsFree(self ->ContextID, GammaTables); *nItems = (mpe != NULL) ? 1 : 0; return mpe; cmsUNUSED_PARAMETER(SizeOfTag); } // Write a single segmented curve. NO CHECK IS PERFORMED ON VALIDITY static cmsBool WriteSegmentedCurve(cmsIOHANDLER* io, cmsToneCurve* g) { cmsUInt32Number i, j; cmsCurveSegment* Segments = g ->Segments; cmsUInt32Number nSegments = g ->nSegments; if (!_cmsWriteUInt32Number(io, cmsSigSegmentedCurve)) goto Error; if (!_cmsWriteUInt32Number(io, 0)) goto Error; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) nSegments)) goto Error; if (!_cmsWriteUInt16Number(io, 0)) goto Error; // Write the break-points for (i=0; i < nSegments - 1; i++) { if (!_cmsWriteFloat32Number(io, Segments[i].x1)) goto Error; } // Write the segments for (i=0; i < g ->nSegments; i++) { cmsCurveSegment* ActualSeg = Segments + i; if (ActualSeg -> Type == 0) { // This is a sampled curve if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigSampledCurveSeg)) goto Error; if (!_cmsWriteUInt32Number(io, 0)) goto Error; if (!_cmsWriteUInt32Number(io, ActualSeg -> nGridPoints)) goto Error; for (j=0; j < g ->Segments[i].nGridPoints; j++) { if (!_cmsWriteFloat32Number(io, ActualSeg -> SampledPoints[j])) goto Error; } } else { int Type; cmsUInt32Number ParamsByType[] = { 4, 5, 5 }; // This is a formula-based if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigFormulaCurveSeg)) goto Error; if (!_cmsWriteUInt32Number(io, 0)) goto Error; // We only allow 1, 2 and 3 as types Type = ActualSeg ->Type - 6; if (Type > 2 || Type < 0) goto Error; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Type)) goto Error; if (!_cmsWriteUInt16Number(io, 0)) goto Error; for (j=0; j < ParamsByType[Type]; j++) { if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) ActualSeg ->Params[j])) goto Error; } } // It seems there is no need to align. Code is here, and for safety commented out // if (!_cmsWriteAlignment(io)) goto Error; } return TRUE; Error: return FALSE; } static cmsBool WriteMPECurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag) { _cmsStageToneCurvesData* Curves = (_cmsStageToneCurvesData*) Cargo; return WriteSegmentedCurve(io, Curves ->TheCurves[n]); cmsUNUSED_PARAMETER(SizeOfTag); cmsUNUSED_PARAMETER(self); } // Write a curve, checking first for validity static cmsBool Type_MPEcurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt32Number BaseOffset; cmsStage* mpe = (cmsStage*) Ptr; _cmsStageToneCurvesData* Curves = (_cmsStageToneCurvesData*) mpe ->Data; BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // Write the header. Since those are curves, input and output channels are same if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; if (!WritePositionTable(self, io, 0, mpe ->InputChannels, BaseOffset, Curves, WriteMPECurve)) return FALSE; return TRUE; cmsUNUSED_PARAMETER(nItems); } // The matrix is organized as an array of PxQ+Q elements, where P is the number of input channels to the // matrix, and Q is the number of output channels. The matrix elements are each float32Numbers. The array // is organized as follows: // array = [e11, e12, , e1P, e21, e22, , e2P, , eQ1, eQ2, , eQP, e1, e2, , eQ] static void *Type_MPEmatrix_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsStage* mpe; cmsUInt16Number InputChans, OutputChans; cmsUInt32Number nElems, i; cmsFloat64Number* Matrix; cmsFloat64Number* Offsets; if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; nElems = InputChans * OutputChans; // Input and output chans may be ANY (up to 0xffff) Matrix = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, nElems, sizeof(cmsFloat64Number)); if (Matrix == NULL) return NULL; Offsets = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, OutputChans, sizeof(cmsFloat64Number)); if (Offsets == NULL) { _cmsFree(self ->ContextID, Matrix); return NULL; } for (i=0; i < nElems; i++) { cmsFloat32Number v; if (!_cmsReadFloat32Number(io, &v)) return NULL; Matrix[i] = v; } for (i=0; i < OutputChans; i++) { cmsFloat32Number v; if (!_cmsReadFloat32Number(io, &v)) return NULL; Offsets[i] = v; } mpe = cmsStageAllocMatrix(self ->ContextID, OutputChans, InputChans, Matrix, Offsets); _cmsFree(self ->ContextID, Matrix); _cmsFree(self ->ContextID, Offsets); *nItems = 1; return mpe; cmsUNUSED_PARAMETER(SizeOfTag); } static cmsBool Type_MPEmatrix_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt32Number i, nElems; cmsStage* mpe = (cmsStage*) Ptr; _cmsStageMatrixData* Matrix = (_cmsStageMatrixData*) mpe ->Data; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE; nElems = mpe ->InputChannels * mpe ->OutputChannels; for (i=0; i < nElems; i++) { if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Double[i])) return FALSE; } for (i=0; i < mpe ->OutputChannels; i++) { if (Matrix ->Offset == NULL) { if (!_cmsWriteFloat32Number(io, 0)) return FALSE; } else { if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Offset[i])) return FALSE; } } return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } static void *Type_MPEclut_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsStage* mpe = NULL; cmsUInt16Number InputChans, OutputChans; cmsUInt8Number Dimensions8[16]; cmsUInt32Number i, nMaxGrids, GridPoints[MAX_INPUT_DIMENSIONS]; _cmsStageCLutData* clut; if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; if (InputChans == 0) goto Error; if (OutputChans == 0) goto Error; if (io ->Read(io, Dimensions8, sizeof(cmsUInt8Number), 16) != 16) goto Error; // Copy MAX_INPUT_DIMENSIONS at most. Expand to cmsUInt32Number nMaxGrids = InputChans > MAX_INPUT_DIMENSIONS ? MAX_INPUT_DIMENSIONS : InputChans; for (i=0; i < nMaxGrids; i++) GridPoints[i] = (cmsUInt32Number) Dimensions8[i]; // Allocate the true CLUT mpe = cmsStageAllocCLutFloatGranular(self ->ContextID, GridPoints, InputChans, OutputChans, NULL); if (mpe == NULL) goto Error; // Read the data clut = (_cmsStageCLutData*) mpe ->Data; for (i=0; i < clut ->nEntries; i++) { if (!_cmsReadFloat32Number(io, &clut ->Tab.TFloat[i])) goto Error; } *nItems = 1; return mpe; Error: *nItems = 0; if (mpe != NULL) cmsStageFree(mpe); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // Write a CLUT in floating point static cmsBool Type_MPEclut_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt8Number Dimensions8[16]; cmsUInt32Number i; cmsStage* mpe = (cmsStage*) Ptr; _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe ->Data; // Check for maximum number of channels if (mpe -> InputChannels > 15) return FALSE; // Only floats are supported in MPE if (clut ->HasFloatValues == FALSE) return FALSE; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE; memset(Dimensions8, 0, sizeof(Dimensions8)); for (i=0; i < mpe ->InputChannels; i++) Dimensions8[i] = (cmsUInt8Number) clut ->Params ->nSamples[i]; if (!io ->Write(io, 16, Dimensions8)) return FALSE; for (i=0; i < clut ->nEntries; i++) { if (!_cmsWriteFloat32Number(io, clut ->Tab.TFloat[i])) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(nItems); cmsUNUSED_PARAMETER(self); } // This is the list of built-in MPE types static _cmsTagTypeLinkedList SupportedMPEtypes[] = { {{ (cmsTagTypeSignature) cmsSigBAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[1] }, // Ignore those elements for now {{ (cmsTagTypeSignature) cmsSigEAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[2] }, // (That's what the spec says) {TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCurveSetElemType, MPEcurve), &SupportedMPEtypes[3] }, {TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigMatrixElemType, MPEmatrix), &SupportedMPEtypes[4] }, {TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCLutElemType, MPEclut), NULL }, }; _cmsTagTypePluginChunkType _cmsMPETypePluginChunk = { NULL }; static cmsBool ReadMPEElem(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Cargo, cmsUInt32Number n, cmsUInt32Number SizeOfTag) { cmsStageSignature ElementSig; cmsTagTypeHandler* TypeHandler; cmsUInt32Number nItems; cmsPipeline *NewLUT = (cmsPipeline *) Cargo; _cmsTagTypePluginChunkType* MPETypePluginChunk = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin); // Take signature and channels for each element. if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return FALSE; // The reserved placeholder if (!_cmsReadUInt32Number(io, NULL)) return FALSE; // Read diverse MPE types TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk ->TagTypes, SupportedMPEtypes); if (TypeHandler == NULL) { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) ElementSig); // An unknown element was found. cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown MPE type '%s' found.", String); return FALSE; } // If no read method, just ignore the element (valid for cmsSigBAcsElemType and cmsSigEAcsElemType) // Read the MPE. No size is given if (TypeHandler ->ReadPtr != NULL) { // This is a real element which should be read and processed if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag))) return FALSE; } return TRUE; cmsUNUSED_PARAMETER(SizeOfTag); cmsUNUSED_PARAMETER(n); } // This is the main dispatcher for MPE static void *Type_MPE_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt16Number InputChans, OutputChans; cmsUInt32Number ElementCount; cmsPipeline *NewLUT = NULL; cmsUInt32Number BaseOffset; // Get actual position as a basis for element offsets BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // Read channels and element count if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; // Allocates an empty LUT NewLUT = cmsPipelineAlloc(self ->ContextID, InputChans, OutputChans); if (NewLUT == NULL) return NULL; if (!_cmsReadUInt32Number(io, &ElementCount)) return NULL; if (!ReadPositionTable(self, io, ElementCount, BaseOffset, NewLUT, ReadMPEElem)) { if (NewLUT != NULL) cmsPipelineFree(NewLUT); *nItems = 0; return NULL; } // Success *nItems = 1; return NewLUT; cmsUNUSED_PARAMETER(SizeOfTag); } // This one is a liitle bit more complex, so we don't use position tables this time. static cmsBool Type_MPE_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsUInt32Number i, BaseOffset, DirectoryPos, CurrentPos; int inputChan, outputChan; cmsUInt32Number ElemCount; cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL, Before; cmsStageSignature ElementSig; cmsPipeline* Lut = (cmsPipeline*) Ptr; cmsStage* Elem = Lut ->Elements; cmsTagTypeHandler* TypeHandler; _cmsTagTypePluginChunkType* MPETypePluginChunk = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin); BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); inputChan = cmsPipelineInputChannels(Lut); outputChan = cmsPipelineOutputChannels(Lut); ElemCount = cmsPipelineStageCount(Lut); ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number)); if (ElementOffsets == NULL) goto Error; ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number)); if (ElementSizes == NULL) goto Error; // Write the head if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) inputChan)) goto Error; if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) outputChan)) goto Error; if (!_cmsWriteUInt32Number(io, (cmsUInt16Number) ElemCount)) goto Error; DirectoryPos = io ->Tell(io); // Write a fake directory to be filled latter on for (i=0; i < ElemCount; i++) { if (!_cmsWriteUInt32Number(io, 0)) goto Error; // Offset if (!_cmsWriteUInt32Number(io, 0)) goto Error; // size } // Write each single tag. Keep track of the size as well. for (i=0; i < ElemCount; i++) { ElementOffsets[i] = io ->Tell(io) - BaseOffset; ElementSig = Elem ->Type; TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk->TagTypes, SupportedMPEtypes); if (TypeHandler == NULL) { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) ElementSig); // An unknow element was found. cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Found unknown MPE type '%s'", String); goto Error; } if (!_cmsWriteUInt32Number(io, ElementSig)) goto Error; if (!_cmsWriteUInt32Number(io, 0)) goto Error; Before = io ->Tell(io); if (!TypeHandler ->WritePtr(self, io, Elem, 1)) goto Error; if (!_cmsWriteAlignment(io)) goto Error; ElementSizes[i] = io ->Tell(io) - Before; Elem = Elem ->Next; } // Write the directory CurrentPos = io ->Tell(io); if (!io ->Seek(io, DirectoryPos)) goto Error; for (i=0; i < ElemCount; i++) { if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error; if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error; } if (!io ->Seek(io, CurrentPos)) goto Error; if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes); return TRUE; Error: if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets); if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes); return FALSE; cmsUNUSED_PARAMETER(nItems); } static void* Type_MPE_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsPipelineDup((cmsPipeline*) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_MPE_Free(struct _cms_typehandler_struct* self, void *Ptr) { cmsPipelineFree((cmsPipeline*) Ptr); return; cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type cmsSigVcgtType // ******************************************************************************** #define cmsVideoCardGammaTableType 0 #define cmsVideoCardGammaFormulaType 1 // Used internally typedef struct { double Gamma; double Min; double Max; } _cmsVCGTGAMMA; static void *Type_vcgt_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number TagType, n, i; cmsToneCurve** Curves; *nItems = 0; // Read tag type if (!_cmsReadUInt32Number(io, &TagType)) return NULL; // Allocate space for the array Curves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*)); if (Curves == NULL) return NULL; // There are two possible flavors switch (TagType) { // Gamma is stored as a table case cmsVideoCardGammaTableType: { cmsUInt16Number nChannels, nElems, nBytes; // Check channel count, which should be 3 (we don't support monochrome this time) if (!_cmsReadUInt16Number(io, &nChannels)) goto Error; if (nChannels != 3) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported number of channels for VCGT '%d'", nChannels); goto Error; } // Get Table element count and bytes per element if (!_cmsReadUInt16Number(io, &nElems)) goto Error; if (!_cmsReadUInt16Number(io, &nBytes)) goto Error; // Adobe's quirk fixup. Fixing broken profiles... if (nElems == 256 && nBytes == 1 && SizeOfTag == 1576) nBytes = 2; // Populate tone curves for (n=0; n < 3; n++) { Curves[n] = cmsBuildTabulatedToneCurve16(self ->ContextID, nElems, NULL); if (Curves[n] == NULL) goto Error; // On depending on byte depth switch (nBytes) { // One byte, 0..255 case 1: for (i=0; i < nElems; i++) { cmsUInt8Number v; if (!_cmsReadUInt8Number(io, &v)) goto Error; Curves[n] ->Table16[i] = FROM_8_TO_16(v); } break; // One word 0..65535 case 2: if (!_cmsReadUInt16Array(io, nElems, Curves[n]->Table16)) goto Error; break; // Unsupported default: cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported bit depth for VCGT '%d'", nBytes * 8); goto Error; } } // For all 3 channels } break; // In this case, gamma is stored as a formula case cmsVideoCardGammaFormulaType: { _cmsVCGTGAMMA Colorant[3]; // Populate tone curves for (n=0; n < 3; n++) { double Params[10]; if (!_cmsRead15Fixed16Number(io, &Colorant[n].Gamma)) goto Error; if (!_cmsRead15Fixed16Number(io, &Colorant[n].Min)) goto Error; if (!_cmsRead15Fixed16Number(io, &Colorant[n].Max)) goto Error; // Parametric curve type 5 is: // Y = (aX + b)^Gamma + e | X >= d // Y = cX + f | X < d // vcgt formula is: // Y = (Max Min) * (X ^ Gamma) + Min // So, the translation is // a = (Max Min) ^ ( 1 / Gamma) // e = Min // b=c=d=f=0 Params[0] = Colorant[n].Gamma; Params[1] = pow((Colorant[n].Max - Colorant[n].Min), (1.0 / Colorant[n].Gamma)); Params[2] = 0; Params[3] = 0; Params[4] = 0; Params[5] = Colorant[n].Min; Params[6] = 0; Curves[n] = cmsBuildParametricToneCurve(self ->ContextID, 5, Params); if (Curves[n] == NULL) goto Error; } } break; // Unsupported default: cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported tag type for VCGT '%d'", TagType); goto Error; } *nItems = 1; return (void*) Curves; // Regret, free all resources Error: cmsFreeToneCurveTriple(Curves); _cmsFree(self ->ContextID, Curves); return NULL; cmsUNUSED_PARAMETER(SizeOfTag); } // We don't support all flavors, only 16bits tables and formula static cmsBool Type_vcgt_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsToneCurve** Curves = (cmsToneCurve**) Ptr; cmsUInt32Number i, j; if (cmsGetToneCurveParametricType(Curves[0]) == 5 && cmsGetToneCurveParametricType(Curves[1]) == 5 && cmsGetToneCurveParametricType(Curves[2]) == 5) { if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaFormulaType)) return FALSE; // Save parameters for (i=0; i < 3; i++) { _cmsVCGTGAMMA v; v.Gamma = Curves[i] ->Segments[0].Params[0]; v.Min = Curves[i] ->Segments[0].Params[5]; v.Max = pow(Curves[i] ->Segments[0].Params[1], v.Gamma) + v.Min; if (!_cmsWrite15Fixed16Number(io, v.Gamma)) return FALSE; if (!_cmsWrite15Fixed16Number(io, v.Min)) return FALSE; if (!_cmsWrite15Fixed16Number(io, v.Max)) return FALSE; } } else { // Always store as a table of 256 words if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaTableType)) return FALSE; if (!_cmsWriteUInt16Number(io, 3)) return FALSE; if (!_cmsWriteUInt16Number(io, 256)) return FALSE; if (!_cmsWriteUInt16Number(io, 2)) return FALSE; for (i=0; i < 3; i++) { for (j=0; j < 256; j++) { cmsFloat32Number v = cmsEvalToneCurveFloat(Curves[i], (cmsFloat32Number) (j / 255.0)); cmsUInt16Number n = _cmsQuickSaturateWord(v * 65535.0); if (!_cmsWriteUInt16Number(io, n)) return FALSE; } } } return TRUE; cmsUNUSED_PARAMETER(self); cmsUNUSED_PARAMETER(nItems); } static void* Type_vcgt_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { cmsToneCurve** OldCurves = (cmsToneCurve**) Ptr; cmsToneCurve** NewCurves; NewCurves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*)); if (NewCurves == NULL) return NULL; NewCurves[0] = cmsDupToneCurve(OldCurves[0]); NewCurves[1] = cmsDupToneCurve(OldCurves[1]); NewCurves[2] = cmsDupToneCurve(OldCurves[2]); return (void*) NewCurves; cmsUNUSED_PARAMETER(n); } static void Type_vcgt_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsFreeToneCurveTriple((cmsToneCurve**) Ptr); _cmsFree(self ->ContextID, Ptr); } // ******************************************************************************** // Type cmsSigDictType // ******************************************************************************** // Single column of the table can point to wchar or MLUC elements. Holds arrays of data typedef struct { cmsContext ContextID; cmsUInt32Number *Offsets; cmsUInt32Number *Sizes; } _cmsDICelem; typedef struct { _cmsDICelem Name, Value, DisplayName, DisplayValue; } _cmsDICarray; // Allocate an empty array element static cmsBool AllocElem(cmsContext ContextID, _cmsDICelem* e, cmsUInt32Number Count) { e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number)); if (e->Offsets == NULL) return FALSE; e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number)); if (e->Sizes == NULL) { _cmsFree(ContextID, e -> Offsets); return FALSE; } e ->ContextID = ContextID; return TRUE; } // Free an array element static void FreeElem(_cmsDICelem* e) { if (e ->Offsets != NULL) _cmsFree(e -> ContextID, e -> Offsets); if (e ->Sizes != NULL) _cmsFree(e -> ContextID, e -> Sizes); e->Offsets = e ->Sizes = NULL; } // Get rid of whole array static void FreeArray( _cmsDICarray* a) { if (a ->Name.Offsets != NULL) FreeElem(&a->Name); if (a ->Value.Offsets != NULL) FreeElem(&a ->Value); if (a ->DisplayName.Offsets != NULL) FreeElem(&a->DisplayName); if (a ->DisplayValue.Offsets != NULL) FreeElem(&a ->DisplayValue); } // Allocate whole array static cmsBool AllocArray(cmsContext ContextID, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length) { // Empty values memset(a, 0, sizeof(_cmsDICarray)); // On depending on record size, create column arrays if (!AllocElem(ContextID, &a ->Name, Count)) goto Error; if (!AllocElem(ContextID, &a ->Value, Count)) goto Error; if (Length > 16) { if (!AllocElem(ContextID, &a -> DisplayName, Count)) goto Error; } if (Length > 24) { if (!AllocElem(ContextID, &a ->DisplayValue, Count)) goto Error; } return TRUE; Error: FreeArray(a); return FALSE; } // Read one element static cmsBool ReadOneElem(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, cmsUInt32Number BaseOffset) { if (!_cmsReadUInt32Number(io, &e->Offsets[i])) return FALSE; if (!_cmsReadUInt32Number(io, &e ->Sizes[i])) return FALSE; // An offset of zero has special meaning and shal be preserved if (e ->Offsets[i] > 0) e ->Offsets[i] += BaseOffset; return TRUE; } static cmsBool ReadOffsetArray(cmsIOHANDLER* io, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length, cmsUInt32Number BaseOffset) { cmsUInt32Number i; // Read column arrays for (i=0; i < Count; i++) { if (!ReadOneElem(io, &a -> Name, i, BaseOffset)) return FALSE; if (!ReadOneElem(io, &a -> Value, i, BaseOffset)) return FALSE; if (Length > 16) { if (!ReadOneElem(io, &a ->DisplayName, i, BaseOffset)) return FALSE; } if (Length > 24) { if (!ReadOneElem(io, & a -> DisplayValue, i, BaseOffset)) return FALSE; } } return TRUE; } // Write one element static cmsBool WriteOneElem(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i) { if (!_cmsWriteUInt32Number(io, e->Offsets[i])) return FALSE; if (!_cmsWriteUInt32Number(io, e ->Sizes[i])) return FALSE; return TRUE; } static cmsBool WriteOffsetArray(cmsIOHANDLER* io, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length) { cmsUInt32Number i; for (i=0; i < Count; i++) { if (!WriteOneElem(io, &a -> Name, i)) return FALSE; if (!WriteOneElem(io, &a -> Value, i)) return FALSE; if (Length > 16) { if (!WriteOneElem(io, &a -> DisplayName, i)) return FALSE; } if (Length > 24) { if (!WriteOneElem(io, &a -> DisplayValue, i)) return FALSE; } } return TRUE; } static cmsBool ReadOneWChar(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, wchar_t ** wcstr) { cmsUInt32Number nChars; // Special case for undefined strings (see ICC Votable // Proposal Submission, Dictionary Type and Metadata TAG Definition) if (e -> Offsets[i] == 0) { *wcstr = NULL; return TRUE; } if (!io -> Seek(io, e -> Offsets[i])) return FALSE; nChars = e ->Sizes[i] / sizeof(cmsUInt16Number); *wcstr = (wchar_t*) _cmsMallocZero(e ->ContextID, (nChars + 1) * sizeof(wchar_t)); if (*wcstr == NULL) return FALSE; if (!_cmsReadWCharArray(io, nChars, *wcstr)) { _cmsFree(e ->ContextID, *wcstr); return FALSE; } // End of string marker (*wcstr)[nChars] = 0; return TRUE; } static cmsUInt32Number mywcslen(const wchar_t *s) { const wchar_t *p; p = s; while (*p) p++; return (cmsUInt32Number)(p - s); } static cmsBool WriteOneWChar(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, const wchar_t * wcstr, cmsUInt32Number BaseOffset) { cmsUInt32Number Before = io ->Tell(io); cmsUInt32Number n; e ->Offsets[i] = Before - BaseOffset; if (wcstr == NULL) { e ->Sizes[i] = 0; e ->Offsets[i] = 0; return TRUE; } n = mywcslen(wcstr); if (!_cmsWriteWCharArray(io, n, wcstr)) return FALSE; e ->Sizes[i] = io ->Tell(io) - Before; return TRUE; } static cmsBool ReadOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, cmsMLU** mlu) { cmsUInt32Number nItems = 0; // A way to get null MLUCs if (e -> Offsets[i] == 0 || e ->Sizes[i] == 0) { *mlu = NULL; return TRUE; } if (!io -> Seek(io, e -> Offsets[i])) return FALSE; *mlu = (cmsMLU*) Type_MLU_Read(self, io, &nItems, e ->Sizes[i]); return *mlu != NULL; } static cmsBool WriteOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, const cmsMLU* mlu, cmsUInt32Number BaseOffset) { cmsUInt32Number Before; // Special case for undefined strings (see ICC Votable // Proposal Submission, Dictionary Type and Metadata TAG Definition) if (mlu == NULL) { e ->Sizes[i] = 0; e ->Offsets[i] = 0; return TRUE; } Before = io ->Tell(io); e ->Offsets[i] = Before - BaseOffset; if (!Type_MLU_Write(self, io, (void*) mlu, 1)) return FALSE; e ->Sizes[i] = io ->Tell(io) - Before; return TRUE; } static void *Type_Dictionary_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsHANDLE hDict; cmsUInt32Number i, Count, Length; cmsUInt32Number BaseOffset; _cmsDICarray a; wchar_t *NameWCS = NULL, *ValueWCS = NULL; cmsMLU *DisplayNameMLU = NULL, *DisplayValueMLU=NULL; cmsBool rc; *nItems = 0; // Get actual position as a basis for element offsets BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // Get name-value record count if (!_cmsReadUInt32Number(io, &Count)) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); // Get rec length if (!_cmsReadUInt32Number(io, &Length)) return NULL; SizeOfTag -= sizeof(cmsUInt32Number); // Check for valid lengths if (Length != 16 && Length != 24 && Length != 32) { cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown record length in dictionary '%d'", Length); return NULL; } // Creates an empty dictionary hDict = cmsDictAlloc(self -> ContextID); if (hDict == NULL) return NULL; // On depending on record size, create column arrays if (!AllocArray(self -> ContextID, &a, Count, Length)) goto Error; // Read column arrays if (!ReadOffsetArray(io, &a, Count, Length, BaseOffset)) goto Error; // Seek to each element and read it for (i=0; i < Count; i++) { if (!ReadOneWChar(io, &a.Name, i, &NameWCS)) goto Error; if (!ReadOneWChar(io, &a.Value, i, &ValueWCS)) goto Error; if (Length > 16) { if (!ReadOneMLUC(self, io, &a.DisplayName, i, &DisplayNameMLU)) goto Error; } if (Length > 24) { if (!ReadOneMLUC(self, io, &a.DisplayValue, i, &DisplayValueMLU)) goto Error; } if (NameWCS == NULL || ValueWCS == NULL) { cmsSignalError(self->ContextID, cmsERROR_CORRUPTION_DETECTED, "Bad dictionary Name/Value"); rc = FALSE; } else { rc = cmsDictAddEntry(hDict, NameWCS, ValueWCS, DisplayNameMLU, DisplayValueMLU); } if (NameWCS != NULL) _cmsFree(self ->ContextID, NameWCS); if (ValueWCS != NULL) _cmsFree(self ->ContextID, ValueWCS); if (DisplayNameMLU != NULL) cmsMLUfree(DisplayNameMLU); if (DisplayValueMLU != NULL) cmsMLUfree(DisplayValueMLU); if (!rc) goto Error; } FreeArray(&a); *nItems = 1; return (void*) hDict; Error: FreeArray(&a); cmsDictFree(hDict); return NULL; } static cmsBool Type_Dictionary_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { cmsHANDLE hDict = (cmsHANDLE) Ptr; const cmsDICTentry* p; cmsBool AnyName, AnyValue; cmsUInt32Number i, Count, Length; cmsUInt32Number DirectoryPos, CurrentPos, BaseOffset; _cmsDICarray a; if (hDict == NULL) return FALSE; BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); // Let's inspect the dictionary Count = 0; AnyName = FALSE; AnyValue = FALSE; for (p = cmsDictGetEntryList(hDict); p != NULL; p = cmsDictNextEntry(p)) { if (p ->DisplayName != NULL) AnyName = TRUE; if (p ->DisplayValue != NULL) AnyValue = TRUE; Count++; } Length = 16; if (AnyName) Length += 8; if (AnyValue) Length += 8; if (!_cmsWriteUInt32Number(io, Count)) return FALSE; if (!_cmsWriteUInt32Number(io, Length)) return FALSE; // Keep starting position of offsets table DirectoryPos = io ->Tell(io); // Allocate offsets array if (!AllocArray(self ->ContextID, &a, Count, Length)) goto Error; // Write a fake directory to be filled latter on if (!WriteOffsetArray(io, &a, Count, Length)) goto Error; // Write each element. Keep track of the size as well. p = cmsDictGetEntryList(hDict); for (i=0; i < Count; i++) { if (!WriteOneWChar(io, &a.Name, i, p ->Name, BaseOffset)) goto Error; if (!WriteOneWChar(io, &a.Value, i, p ->Value, BaseOffset)) goto Error; if (p ->DisplayName != NULL) { if (!WriteOneMLUC(self, io, &a.DisplayName, i, p ->DisplayName, BaseOffset)) goto Error; } if (p ->DisplayValue != NULL) { if (!WriteOneMLUC(self, io, &a.DisplayValue, i, p ->DisplayValue, BaseOffset)) goto Error; } p = cmsDictNextEntry(p); } // Write the directory CurrentPos = io ->Tell(io); if (!io ->Seek(io, DirectoryPos)) goto Error; if (!WriteOffsetArray(io, &a, Count, Length)) goto Error; if (!io ->Seek(io, CurrentPos)) goto Error; FreeArray(&a); return TRUE; Error: FreeArray(&a); return FALSE; cmsUNUSED_PARAMETER(nItems); } static void* Type_Dictionary_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return (void*) cmsDictDup((cmsHANDLE) Ptr); cmsUNUSED_PARAMETER(n); cmsUNUSED_PARAMETER(self); } static void Type_Dictionary_Free(struct _cms_typehandler_struct* self, void* Ptr) { cmsDictFree((cmsHANDLE) Ptr); cmsUNUSED_PARAMETER(self); } // ******************************************************************************** // Type support main routines // ******************************************************************************** // This is the list of built-in types static _cmsTagTypeLinkedList SupportedTagTypes[] = { {TYPE_HANDLER(cmsSigChromaticityType, Chromaticity), &SupportedTagTypes[1] }, {TYPE_HANDLER(cmsSigColorantOrderType, ColorantOrderType), &SupportedTagTypes[2] }, {TYPE_HANDLER(cmsSigS15Fixed16ArrayType, S15Fixed16), &SupportedTagTypes[3] }, {TYPE_HANDLER(cmsSigU16Fixed16ArrayType, U16Fixed16), &SupportedTagTypes[4] }, {TYPE_HANDLER(cmsSigTextType, Text), &SupportedTagTypes[5] }, {TYPE_HANDLER(cmsSigTextDescriptionType, Text_Description), &SupportedTagTypes[6] }, {TYPE_HANDLER(cmsSigCurveType, Curve), &SupportedTagTypes[7] }, {TYPE_HANDLER(cmsSigParametricCurveType, ParametricCurve), &SupportedTagTypes[8] }, {TYPE_HANDLER(cmsSigDateTimeType, DateTime), &SupportedTagTypes[9] }, {TYPE_HANDLER(cmsSigLut8Type, LUT8), &SupportedTagTypes[10] }, {TYPE_HANDLER(cmsSigLut16Type, LUT16), &SupportedTagTypes[11] }, {TYPE_HANDLER(cmsSigColorantTableType, ColorantTable), &SupportedTagTypes[12] }, {TYPE_HANDLER(cmsSigNamedColor2Type, NamedColor), &SupportedTagTypes[13] }, {TYPE_HANDLER(cmsSigMultiLocalizedUnicodeType, MLU), &SupportedTagTypes[14] }, {TYPE_HANDLER(cmsSigProfileSequenceDescType, ProfileSequenceDesc), &SupportedTagTypes[15] }, {TYPE_HANDLER(cmsSigSignatureType, Signature), &SupportedTagTypes[16] }, {TYPE_HANDLER(cmsSigMeasurementType, Measurement), &SupportedTagTypes[17] }, {TYPE_HANDLER(cmsSigDataType, Data), &SupportedTagTypes[18] }, {TYPE_HANDLER(cmsSigLutAtoBType, LUTA2B), &SupportedTagTypes[19] }, {TYPE_HANDLER(cmsSigLutBtoAType, LUTB2A), &SupportedTagTypes[20] }, {TYPE_HANDLER(cmsSigUcrBgType, UcrBg), &SupportedTagTypes[21] }, {TYPE_HANDLER(cmsSigCrdInfoType, CrdInfo), &SupportedTagTypes[22] }, {TYPE_HANDLER(cmsSigMultiProcessElementType, MPE), &SupportedTagTypes[23] }, {TYPE_HANDLER(cmsSigScreeningType, Screening), &SupportedTagTypes[24] }, {TYPE_HANDLER(cmsSigViewingConditionsType, ViewingConditions), &SupportedTagTypes[25] }, {TYPE_HANDLER(cmsSigXYZType, XYZ), &SupportedTagTypes[26] }, {TYPE_HANDLER(cmsCorbisBrokenXYZtype, XYZ), &SupportedTagTypes[27] }, {TYPE_HANDLER(cmsMonacoBrokenCurveType, Curve), &SupportedTagTypes[28] }, {TYPE_HANDLER(cmsSigProfileSequenceIdType, ProfileSequenceId), &SupportedTagTypes[29] }, {TYPE_HANDLER(cmsSigDictType, Dictionary), &SupportedTagTypes[30] }, {TYPE_HANDLER(cmsSigVcgtType, vcgt), NULL } }; _cmsTagTypePluginChunkType _cmsTagTypePluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupTagTypeList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src, int loc) { _cmsTagTypePluginChunkType newHead = { NULL }; _cmsTagTypeLinkedList* entry; _cmsTagTypeLinkedList* Anterior = NULL; _cmsTagTypePluginChunkType* head = (_cmsTagTypePluginChunkType*) src->chunks[loc]; // Walk the list copying all nodes for (entry = head->TagTypes; entry != NULL; entry = entry ->Next) { _cmsTagTypeLinkedList *newEntry = ( _cmsTagTypeLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagTypeLinkedList)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.TagTypes == NULL) newHead.TagTypes = newEntry; } ctx ->chunks[loc] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagTypePluginChunkType)); } void _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { // Duplicate the LIST DupTagTypeList(ctx, src, TagTypePlugin); } else { static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL }; ctx ->chunks[TagTypePlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType)); } } void _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { // Duplicate the LIST DupTagTypeList(ctx, src, MPEPlugin); } else { static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL }; ctx ->chunks[MPEPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType)); } } // Both kind of plug-ins share same structure cmsBool _cmsRegisterTagTypePlugin(cmsContext id, cmsPluginBase* Data) { return RegisterTypesPlugin(id, Data, TagTypePlugin); } cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext id, cmsPluginBase* Data) { return RegisterTypesPlugin(id, Data,MPEPlugin); } // Wrapper for tag types cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig) { _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(ContextID, TagTypePlugin); return GetHandler(sig, ctx->TagTypes, SupportedTagTypes); } // ******************************************************************************** // Tag support main routines // ******************************************************************************** typedef struct _cmsTagLinkedList_st { cmsTagSignature Signature; cmsTagDescriptor Descriptor; struct _cmsTagLinkedList_st* Next; } _cmsTagLinkedList; // This is the list of built-in tags static _cmsTagLinkedList SupportedTags[] = { { cmsSigAToB0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[1]}, { cmsSigAToB1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[2]}, { cmsSigAToB2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[3]}, { cmsSigBToA0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[4]}, { cmsSigBToA1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[5]}, { cmsSigBToA2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[6]}, // Allow corbis and its broken XYZ type { cmsSigRedColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[7]}, { cmsSigGreenColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[8]}, { cmsSigBlueColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[9]}, { cmsSigRedTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[10]}, { cmsSigGreenTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[11]}, { cmsSigBlueTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[12]}, { cmsSigCalibrationDateTimeTag, { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[13]}, { cmsSigCharTargetTag, { 1, 1, { cmsSigTextType }, NULL}, &SupportedTags[14]}, { cmsSigChromaticAdaptationTag, { 9, 1, { cmsSigS15Fixed16ArrayType }, NULL}, &SupportedTags[15]}, { cmsSigChromaticityTag, { 1, 1, { cmsSigChromaticityType }, NULL}, &SupportedTags[16]}, { cmsSigColorantOrderTag, { 1, 1, { cmsSigColorantOrderType }, NULL}, &SupportedTags[17]}, { cmsSigColorantTableTag, { 1, 1, { cmsSigColorantTableType }, NULL}, &SupportedTags[18]}, { cmsSigColorantTableOutTag, { 1, 1, { cmsSigColorantTableType }, NULL}, &SupportedTags[19]}, { cmsSigCopyrightTag, { 1, 3, { cmsSigTextType, cmsSigMultiLocalizedUnicodeType, cmsSigTextDescriptionType}, DecideTextType}, &SupportedTags[20]}, { cmsSigDateTimeTag, { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[21]}, { cmsSigDeviceMfgDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[22]}, { cmsSigDeviceModelDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[23]}, { cmsSigGamutTag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[24]}, { cmsSigGrayTRCTag, { 1, 2, { cmsSigCurveType, cmsSigParametricCurveType }, DecideCurveType}, &SupportedTags[25]}, { cmsSigLuminanceTag, { 1, 1, { cmsSigXYZType }, NULL}, &SupportedTags[26]}, { cmsSigMediaBlackPointTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[27]}, { cmsSigMediaWhitePointTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[28]}, { cmsSigNamedColor2Tag, { 1, 1, { cmsSigNamedColor2Type }, NULL}, &SupportedTags[29]}, { cmsSigPreview0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[30]}, { cmsSigPreview1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[31]}, { cmsSigPreview2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[32]}, { cmsSigProfileDescriptionTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[33]}, { cmsSigProfileSequenceDescTag, { 1, 1, { cmsSigProfileSequenceDescType }, NULL}, &SupportedTags[34]}, { cmsSigTechnologyTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[35]}, { cmsSigColorimetricIntentImageStateTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[36]}, { cmsSigPerceptualRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[37]}, { cmsSigSaturationRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[38]}, { cmsSigMeasurementTag, { 1, 1, { cmsSigMeasurementType }, NULL}, &SupportedTags[39]}, { cmsSigPs2CRD0Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[40]}, { cmsSigPs2CRD1Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[41]}, { cmsSigPs2CRD2Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[42]}, { cmsSigPs2CRD3Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[43]}, { cmsSigPs2CSATag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[44]}, { cmsSigPs2RenderingIntentTag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[45]}, { cmsSigViewingCondDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[46]}, { cmsSigUcrBgTag, { 1, 1, { cmsSigUcrBgType}, NULL}, &SupportedTags[47]}, { cmsSigCrdInfoTag, { 1, 1, { cmsSigCrdInfoType}, NULL}, &SupportedTags[48]}, { cmsSigDToB0Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[49]}, { cmsSigDToB1Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[50]}, { cmsSigDToB2Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[51]}, { cmsSigDToB3Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[52]}, { cmsSigBToD0Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[53]}, { cmsSigBToD1Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[54]}, { cmsSigBToD2Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[55]}, { cmsSigBToD3Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[56]}, { cmsSigScreeningDescTag, { 1, 1, { cmsSigTextDescriptionType }, NULL}, &SupportedTags[57]}, { cmsSigViewingConditionsTag, { 1, 1, { cmsSigViewingConditionsType }, NULL}, &SupportedTags[58]}, { cmsSigScreeningTag, { 1, 1, { cmsSigScreeningType}, NULL }, &SupportedTags[59]}, { cmsSigVcgtTag, { 1, 1, { cmsSigVcgtType}, NULL }, &SupportedTags[60]}, { cmsSigMetaTag, { 1, 1, { cmsSigDictType}, NULL }, &SupportedTags[61]}, { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL }, &SupportedTags[62]}, { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, NULL} }; /* Not supported Why ======================= ========================================= cmsSigOutputResponseTag ==> WARNING, POSSIBLE PATENT ON THIS SUBJECT! cmsSigNamedColorTag ==> Deprecated cmsSigDataTag ==> Ancient, unused cmsSigDeviceSettingsTag ==> Deprecated, useless */ _cmsTagPluginChunkType _cmsTagPluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupTagList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsTagPluginChunkType newHead = { NULL }; _cmsTagLinkedList* entry; _cmsTagLinkedList* Anterior = NULL; _cmsTagPluginChunkType* head = (_cmsTagPluginChunkType*) src->chunks[TagPlugin]; // Walk the list copying all nodes for (entry = head->Tag; entry != NULL; entry = entry ->Next) { _cmsTagLinkedList *newEntry = ( _cmsTagLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagLinkedList)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.Tag == NULL) newHead.Tag = newEntry; } ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagPluginChunkType)); } void _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { DupTagList(ctx, src); } else { static _cmsTagPluginChunkType TagPluginChunk = { NULL }; ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagPluginChunk, sizeof(_cmsTagPluginChunkType)); } } cmsBool _cmsRegisterTagPlugin(cmsContext id, cmsPluginBase* Data) { cmsPluginTag* Plugin = (cmsPluginTag*) Data; _cmsTagLinkedList *pt; _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(id, TagPlugin); if (Data == NULL) { TagPluginChunk->Tag = NULL; return TRUE; } pt = (_cmsTagLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagLinkedList)); if (pt == NULL) return FALSE; pt ->Signature = Plugin ->Signature; pt ->Descriptor = Plugin ->Descriptor; pt ->Next = TagPluginChunk ->Tag; TagPluginChunk ->Tag = pt; return TRUE; } // Return a descriptor for a given tag or NULL cmsTagDescriptor* _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig) { _cmsTagLinkedList* pt; _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(ContextID, TagPlugin); for (pt = TagPluginChunk->Tag; pt != NULL; pt = pt ->Next) { if (sig == pt -> Signature) return &pt ->Descriptor; } for (pt = SupportedTags; pt != NULL; pt = pt ->Next) { if (sig == pt -> Signature) return &pt ->Descriptor; } return NULL; } lcms2-2.6/src/cmslut.c0000644002406300000240000014314212311617072014175 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Allocates an empty multi profile element cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID, cmsStageSignature Type, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels, _cmsStageEvalFn EvalPtr, _cmsStageDupElemFn DupElemPtr, _cmsStageFreeElemFn FreePtr, void* Data) { cmsStage* ph = (cmsStage*) _cmsMallocZero(ContextID, sizeof(cmsStage)); if (ph == NULL) return NULL; ph ->ContextID = ContextID; ph ->Type = Type; ph ->Implements = Type; // By default, no clue on what is implementing ph ->InputChannels = InputChannels; ph ->OutputChannels = OutputChannels; ph ->EvalPtr = EvalPtr; ph ->DupElemPtr = DupElemPtr; ph ->FreePtr = FreePtr; ph ->Data = Data; return ph; } static void EvaluateIdentity(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { memmove(Out, In, mpe ->InputChannels * sizeof(cmsFloat32Number)); } cmsStage* CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels) { return _cmsStageAllocPlaceholder(ContextID, cmsSigIdentityElemType, nChannels, nChannels, EvaluateIdentity, NULL, NULL, NULL); } // Conversion functions. From floating point to 16 bits static void FromFloatTo16(const cmsFloat32Number In[], cmsUInt16Number Out[], cmsUInt32Number n) { cmsUInt32Number i; for (i=0; i < n; i++) { Out[i] = _cmsQuickSaturateWord(In[i] * 65535.0); } } // From 16 bits to floating point static void From16ToFloat(const cmsUInt16Number In[], cmsFloat32Number Out[], cmsUInt32Number n) { cmsUInt32Number i; for (i=0; i < n; i++) { Out[i] = (cmsFloat32Number) In[i] / 65535.0F; } } // This function is quite useful to analyze the structure of a LUT and retrieve the MPE elements // that conform the LUT. It should be called with the LUT, the number of expected elements and // then a list of expected types followed with a list of cmsFloat64Number pointers to MPE elements. If // the function founds a match with current pipeline, it fills the pointers and returns TRUE // if not, returns FALSE without touching anything. Setting pointers to NULL does bypass // the storage process. cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...) { va_list args; cmsUInt32Number i; cmsStage* mpe; cmsStageSignature Type; void** ElemPtr; // Make sure same number of elements if (cmsPipelineStageCount(Lut) != n) return FALSE; va_start(args, n); // Iterate across asked types mpe = Lut ->Elements; for (i=0; i < n; i++) { // Get asked type Type = (cmsStageSignature)va_arg(args, cmsStageSignature); if (mpe ->Type != Type) { va_end(args); // Mismatch. We are done. return FALSE; } mpe = mpe ->Next; } // Found a combination, fill pointers if not NULL mpe = Lut ->Elements; for (i=0; i < n; i++) { ElemPtr = va_arg(args, void**); if (ElemPtr != NULL) *ElemPtr = mpe; mpe = mpe ->Next; } va_end(args); return TRUE; } // Below there are implementations for several types of elements. Each type may be implemented by a // evaluation function, a duplication function, a function to free resources and a constructor. // ************************************************************************************************* // Type cmsSigCurveSetElemType (curves) // ************************************************************************************************* cmsToneCurve** _cmsStageGetPtrToCurveSet(const cmsStage* mpe) { _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data; return Data ->TheCurves; } static void EvaluateCurves(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { _cmsStageToneCurvesData* Data; cmsUInt32Number i; _cmsAssert(mpe != NULL); Data = (_cmsStageToneCurvesData*) mpe ->Data; if (Data == NULL) return; if (Data ->TheCurves == NULL) return; for (i=0; i < Data ->nCurves; i++) { Out[i] = cmsEvalToneCurveFloat(Data ->TheCurves[i], In[i]); } } static void CurveSetElemTypeFree(cmsStage* mpe) { _cmsStageToneCurvesData* Data; cmsUInt32Number i; _cmsAssert(mpe != NULL); Data = (_cmsStageToneCurvesData*) mpe ->Data; if (Data == NULL) return; if (Data ->TheCurves != NULL) { for (i=0; i < Data ->nCurves; i++) { if (Data ->TheCurves[i] != NULL) cmsFreeToneCurve(Data ->TheCurves[i]); } } _cmsFree(mpe ->ContextID, Data ->TheCurves); _cmsFree(mpe ->ContextID, Data); } static void* CurveSetDup(cmsStage* mpe) { _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data; _cmsStageToneCurvesData* NewElem; cmsUInt32Number i; NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageToneCurvesData)); if (NewElem == NULL) return NULL; NewElem ->nCurves = Data ->nCurves; NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(mpe ->ContextID, NewElem ->nCurves, sizeof(cmsToneCurve*)); if (NewElem ->TheCurves == NULL) goto Error; for (i=0; i < NewElem ->nCurves; i++) { // Duplicate each curve. It may fail. NewElem ->TheCurves[i] = cmsDupToneCurve(Data ->TheCurves[i]); if (NewElem ->TheCurves[i] == NULL) goto Error; } return (void*) NewElem; Error: if (NewElem ->TheCurves != NULL) { for (i=0; i < NewElem ->nCurves; i++) { if (NewElem ->TheCurves[i]) cmsFreeToneCurve(NewElem ->TheCurves[i]); } } _cmsFree(mpe ->ContextID, NewElem ->TheCurves); _cmsFree(mpe ->ContextID, NewElem); return NULL; } // Curves == NULL forces identity curves cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[]) { cmsUInt32Number i; _cmsStageToneCurvesData* NewElem; cmsStage* NewMPE; NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCurveSetElemType, nChannels, nChannels, EvaluateCurves, CurveSetDup, CurveSetElemTypeFree, NULL ); if (NewMPE == NULL) return NULL; NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(ContextID, sizeof(_cmsStageToneCurvesData)); if (NewElem == NULL) { cmsStageFree(NewMPE); return NULL; } NewMPE ->Data = (void*) NewElem; NewElem ->nCurves = nChannels; NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(ContextID, nChannels, sizeof(cmsToneCurve*)); if (NewElem ->TheCurves == NULL) { cmsStageFree(NewMPE); return NULL; } for (i=0; i < nChannels; i++) { if (Curves == NULL) { NewElem ->TheCurves[i] = cmsBuildGamma(ContextID, 1.0); } else { NewElem ->TheCurves[i] = cmsDupToneCurve(Curves[i]); } if (NewElem ->TheCurves[i] == NULL) { cmsStageFree(NewMPE); return NULL; } } return NewMPE; } // Create a bunch of identity curves cmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, int nChannels) { cmsStage* mpe = cmsStageAllocToneCurves(ContextID, nChannels, NULL); if (mpe == NULL) return NULL; mpe ->Implements = cmsSigIdentityElemType; return mpe; } // ************************************************************************************************* // Type cmsSigMatrixElemType (Matrices) // ************************************************************************************************* // Special care should be taken here because precision loss. A temporary cmsFloat64Number buffer is being used static void EvaluateMatrix(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { cmsUInt32Number i, j; _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; cmsFloat64Number Tmp; // Input is already in 0..1.0 notation for (i=0; i < mpe ->OutputChannels; i++) { Tmp = 0; for (j=0; j < mpe->InputChannels; j++) { Tmp += In[j] * Data->Double[i*mpe->InputChannels + j]; } if (Data ->Offset != NULL) Tmp += Data->Offset[i]; Out[i] = (cmsFloat32Number) Tmp; } // Output in 0..1.0 domain } // Duplicate a yet-existing matrix element static void* MatrixElemDup(cmsStage* mpe) { _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; _cmsStageMatrixData* NewElem; cmsUInt32Number sz; NewElem = (_cmsStageMatrixData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageMatrixData)); if (NewElem == NULL) return NULL; sz = mpe ->InputChannels * mpe ->OutputChannels; NewElem ->Double = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID, Data ->Double, sz * sizeof(cmsFloat64Number)) ; if (Data ->Offset) NewElem ->Offset = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID, Data ->Offset, mpe -> OutputChannels * sizeof(cmsFloat64Number)) ; return (void*) NewElem; } static void MatrixElemTypeFree(cmsStage* mpe) { _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; if (Data == NULL) return; if (Data ->Double) _cmsFree(mpe ->ContextID, Data ->Double); if (Data ->Offset) _cmsFree(mpe ->ContextID, Data ->Offset); _cmsFree(mpe ->ContextID, mpe ->Data); } cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols, const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset) { cmsUInt32Number i, n; _cmsStageMatrixData* NewElem; cmsStage* NewMPE; n = Rows * Cols; // Check for overflow if (n == 0) return NULL; if (n >= UINT_MAX / Cols) return NULL; if (n >= UINT_MAX / Rows) return NULL; if (n < Rows || n < Cols) return NULL; NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigMatrixElemType, Cols, Rows, EvaluateMatrix, MatrixElemDup, MatrixElemTypeFree, NULL ); if (NewMPE == NULL) return NULL; NewElem = (_cmsStageMatrixData*) _cmsMallocZero(ContextID, sizeof(_cmsStageMatrixData)); if (NewElem == NULL) return NULL; NewElem ->Double = (cmsFloat64Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat64Number)); if (NewElem->Double == NULL) { MatrixElemTypeFree(NewMPE); return NULL; } for (i=0; i < n; i++) { NewElem ->Double[i] = Matrix[i]; } if (Offset != NULL) { NewElem ->Offset = (cmsFloat64Number*) _cmsCalloc(ContextID, Cols, sizeof(cmsFloat64Number)); if (NewElem->Offset == NULL) { MatrixElemTypeFree(NewMPE); return NULL; } for (i=0; i < Cols; i++) { NewElem ->Offset[i] = Offset[i]; } } NewMPE ->Data = (void*) NewElem; return NewMPE; } // ************************************************************************************************* // Type cmsSigCLutElemType // ************************************************************************************************* // Evaluate in true floating point static void EvaluateCLUTfloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; Data -> Params ->Interpolation.LerpFloat(In, Out, Data->Params); } // Convert to 16 bits, evaluate, and back to floating point static void EvaluateCLUTfloatIn16(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; cmsUInt16Number In16[MAX_STAGE_CHANNELS], Out16[MAX_STAGE_CHANNELS]; _cmsAssert(mpe ->InputChannels <= MAX_STAGE_CHANNELS); _cmsAssert(mpe ->OutputChannels <= MAX_STAGE_CHANNELS); FromFloatTo16(In, In16, mpe ->InputChannels); Data -> Params ->Interpolation.Lerp16(In16, Out16, Data->Params); From16ToFloat(Out16, Out, mpe ->OutputChannels); } // Given an hypercube of b dimensions, with Dims[] number of nodes by dimension, calculate the total amount of nodes static cmsUInt32Number CubeSize(const cmsUInt32Number Dims[], cmsUInt32Number b) { cmsUInt32Number rv, dim; _cmsAssert(Dims != NULL); for (rv = 1; b > 0; b--) { dim = Dims[b-1]; if (dim == 0) return 0; // Error rv *= dim; // Check for overflow if (rv > UINT_MAX / dim) return 0; } return rv; } static void* CLUTElemDup(cmsStage* mpe) { _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; _cmsStageCLutData* NewElem; NewElem = (_cmsStageCLutData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageCLutData)); if (NewElem == NULL) return NULL; NewElem ->nEntries = Data ->nEntries; NewElem ->HasFloatValues = Data ->HasFloatValues; if (Data ->Tab.T) { if (Data ->HasFloatValues) { NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.TFloat, Data ->nEntries * sizeof (cmsFloat32Number)); if (NewElem ->Tab.TFloat == NULL) goto Error; } else { NewElem ->Tab.T = (cmsUInt16Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.T, Data ->nEntries * sizeof (cmsUInt16Number)); if (NewElem ->Tab.TFloat == NULL) goto Error; } } NewElem ->Params = _cmsComputeInterpParamsEx(mpe ->ContextID, Data ->Params ->nSamples, Data ->Params ->nInputs, Data ->Params ->nOutputs, NewElem ->Tab.T, Data ->Params ->dwFlags); if (NewElem->Params != NULL) return (void*) NewElem; Error: if (NewElem->Tab.T) // This works for both types _cmsFree(mpe ->ContextID, NewElem -> Tab.T); _cmsFree(mpe ->ContextID, NewElem); return NULL; } static void CLutElemTypeFree(cmsStage* mpe) { _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; // Already empty if (Data == NULL) return; // This works for both types if (Data -> Tab.T) _cmsFree(mpe ->ContextID, Data -> Tab.T); _cmsFreeInterpParams(Data ->Params); _cmsFree(mpe ->ContextID, mpe ->Data); } // Allocates a 16-bit multidimensional CLUT. This is evaluated at 16-bit precision. Table may have different // granularity on each dimension. cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table) { cmsUInt32Number i, n; _cmsStageCLutData* NewElem; cmsStage* NewMPE; _cmsAssert(clutPoints != NULL); if (inputChan > MAX_INPUT_DIMENSIONS) { cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS); return NULL; } NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan, EvaluateCLUTfloatIn16, CLUTElemDup, CLutElemTypeFree, NULL ); if (NewMPE == NULL) return NULL; NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData)); if (NewElem == NULL) { cmsStageFree(NewMPE); return NULL; } NewMPE ->Data = (void*) NewElem; NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan); NewElem -> HasFloatValues = FALSE; if (n == 0) { cmsStageFree(NewMPE); return NULL; } NewElem ->Tab.T = (cmsUInt16Number*) _cmsCalloc(ContextID, n, sizeof(cmsUInt16Number)); if (NewElem ->Tab.T == NULL) { cmsStageFree(NewMPE); return NULL; } if (Table != NULL) { for (i=0; i < n; i++) { NewElem ->Tab.T[i] = Table[i]; } } NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.T, CMS_LERP_FLAGS_16BITS); if (NewElem ->Params == NULL) { cmsStageFree(NewMPE); return NULL; } return NewMPE; } cmsStage* CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table) { cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; int i; // Our resulting LUT would be same gridpoints on all dimensions for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nGridPoints; return cmsStageAllocCLut16bitGranular(ContextID, Dimensions, inputChan, outputChan, Table); } cmsStage* CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table) { cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; int i; // Our resulting LUT would be same gridpoints on all dimensions for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nGridPoints; return cmsStageAllocCLutFloatGranular(ContextID, Dimensions, inputChan, outputChan, Table); } cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table) { cmsUInt32Number i, n; _cmsStageCLutData* NewElem; cmsStage* NewMPE; _cmsAssert(clutPoints != NULL); if (inputChan > MAX_INPUT_DIMENSIONS) { cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS); return NULL; } NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan, EvaluateCLUTfloat, CLUTElemDup, CLutElemTypeFree, NULL); if (NewMPE == NULL) return NULL; NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData)); if (NewElem == NULL) { cmsStageFree(NewMPE); return NULL; } NewMPE ->Data = (void*) NewElem; // There is a potential integer overflow on conputing n and nEntries. NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan); NewElem -> HasFloatValues = TRUE; if (n == 0) { cmsStageFree(NewMPE); return NULL; } NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat32Number)); if (NewElem ->Tab.TFloat == NULL) { cmsStageFree(NewMPE); return NULL; } if (Table != NULL) { for (i=0; i < n; i++) { NewElem ->Tab.TFloat[i] = Table[i]; } } NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.TFloat, CMS_LERP_FLAGS_FLOAT); if (NewElem ->Params == NULL) { cmsStageFree(NewMPE); return NULL; } return NewMPE; } static int IdentitySampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo) { int nChan = *(int*) Cargo; int i; for (i=0; i < nChan; i++) Out[i] = In[i]; return 1; } // Creates an MPE that just copies input to output cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan) { cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; cmsStage* mpe ; int i; for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = 2; mpe = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, nChan, nChan, NULL); if (mpe == NULL) return NULL; if (!cmsStageSampleCLut16bit(mpe, IdentitySampler, &nChan, 0)) { cmsStageFree(mpe); return NULL; } mpe ->Implements = cmsSigIdentityElemType; return mpe; } // Quantize a value 0 <= i < MaxSamples to 0..0xffff cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, int MaxSamples) { cmsFloat64Number x; x = ((cmsFloat64Number) i * 65535.) / (cmsFloat64Number) (MaxSamples - 1); return _cmsQuickSaturateWord(x); } // This routine does a sweep on whole input space, and calls its callback // function on knots. returns TRUE if all ok, FALSE otherwise. cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void * Cargo, cmsUInt32Number dwFlags) { int i, t, nTotalPoints, index, rest; int nInputs, nOutputs; cmsUInt32Number* nSamples; cmsUInt16Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS]; _cmsStageCLutData* clut; if (mpe == NULL) return FALSE; clut = (_cmsStageCLutData*) mpe->Data; if (clut == NULL) return FALSE; nSamples = clut->Params ->nSamples; nInputs = clut->Params ->nInputs; nOutputs = clut->Params ->nOutputs; if (nInputs <= 0) return FALSE; if (nOutputs <= 0) return FALSE; if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE; if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE; nTotalPoints = CubeSize(nSamples, nInputs); if (nTotalPoints == 0) return FALSE; index = 0; for (i = 0; i < nTotalPoints; i++) { rest = i; for (t = nInputs-1; t >=0; --t) { cmsUInt32Number Colorant = rest % nSamples[t]; rest /= nSamples[t]; In[t] = _cmsQuantizeVal(Colorant, nSamples[t]); } if (clut ->Tab.T != NULL) { for (t=0; t < nOutputs; t++) Out[t] = clut->Tab.T[index + t]; } if (!Sampler(In, Out, Cargo)) return FALSE; if (!(dwFlags & SAMPLER_INSPECT)) { if (clut ->Tab.T != NULL) { for (t=0; t < nOutputs; t++) clut->Tab.T[index + t] = Out[t]; } } index += nOutputs; } return TRUE; } // Same as anterior, but for floting point cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void * Cargo, cmsUInt32Number dwFlags) { int i, t, nTotalPoints, index, rest; int nInputs, nOutputs; cmsUInt32Number* nSamples; cmsFloat32Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS]; _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe->Data; nSamples = clut->Params ->nSamples; nInputs = clut->Params ->nInputs; nOutputs = clut->Params ->nOutputs; if (nInputs <= 0) return FALSE; if (nOutputs <= 0) return FALSE; if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE; if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE; nTotalPoints = CubeSize(nSamples, nInputs); if (nTotalPoints == 0) return FALSE; index = 0; for (i = 0; i < nTotalPoints; i++) { rest = i; for (t = nInputs-1; t >=0; --t) { cmsUInt32Number Colorant = rest % nSamples[t]; rest /= nSamples[t]; In[t] = (cmsFloat32Number) (_cmsQuantizeVal(Colorant, nSamples[t]) / 65535.0); } if (clut ->Tab.TFloat != NULL) { for (t=0; t < nOutputs; t++) Out[t] = clut->Tab.TFloat[index + t]; } if (!Sampler(In, Out, Cargo)) return FALSE; if (!(dwFlags & SAMPLER_INSPECT)) { if (clut ->Tab.TFloat != NULL) { for (t=0; t < nOutputs; t++) clut->Tab.TFloat[index + t] = Out[t]; } } index += nOutputs; } return TRUE; } // This routine does a sweep on whole input space, and calls its callback // function on knots. returns TRUE if all ok, FALSE otherwise. cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], cmsSAMPLER16 Sampler, void * Cargo) { int i, t, nTotalPoints, rest; cmsUInt16Number In[cmsMAXCHANNELS]; if (nInputs >= cmsMAXCHANNELS) return FALSE; nTotalPoints = CubeSize(clutPoints, nInputs); if (nTotalPoints == 0) return FALSE; for (i = 0; i < nTotalPoints; i++) { rest = i; for (t = nInputs-1; t >=0; --t) { cmsUInt32Number Colorant = rest % clutPoints[t]; rest /= clutPoints[t]; In[t] = _cmsQuantizeVal(Colorant, clutPoints[t]); } if (!Sampler(In, NULL, Cargo)) return FALSE; } return TRUE; } cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], cmsSAMPLERFLOAT Sampler, void * Cargo) { int i, t, nTotalPoints, rest; cmsFloat32Number In[cmsMAXCHANNELS]; if (nInputs >= cmsMAXCHANNELS) return FALSE; nTotalPoints = CubeSize(clutPoints, nInputs); if (nTotalPoints == 0) return FALSE; for (i = 0; i < nTotalPoints; i++) { rest = i; for (t = nInputs-1; t >=0; --t) { cmsUInt32Number Colorant = rest % clutPoints[t]; rest /= clutPoints[t]; In[t] = (cmsFloat32Number) (_cmsQuantizeVal(Colorant, clutPoints[t]) / 65535.0); } if (!Sampler(In, NULL, Cargo)) return FALSE; } return TRUE; } // ******************************************************************************** // Type cmsSigLab2XYZElemType // ******************************************************************************** static void EvaluateLab2XYZ(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { cmsCIELab Lab; cmsCIEXYZ XYZ; const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ; // V4 rules Lab.L = In[0] * 100.0; Lab.a = In[1] * 255.0 - 128.0; Lab.b = In[2] * 255.0 - 128.0; cmsLab2XYZ(NULL, &XYZ, &Lab); // From XYZ, range 0..19997 to 0..1.0, note that 1.99997 comes from 0xffff // encoded as 1.15 fixed point, so 1 + (32767.0 / 32768.0) Out[0] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.X / XYZadj); Out[1] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Y / XYZadj); Out[2] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Z / XYZadj); return; cmsUNUSED_PARAMETER(mpe); } // No dup or free routines needed, as the structure has no pointers in it. cmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID) { return _cmsStageAllocPlaceholder(ContextID, cmsSigLab2XYZElemType, 3, 3, EvaluateLab2XYZ, NULL, NULL, NULL); } // ******************************************************************************** // v2 L=100 is supposed to be placed on 0xFF00. There is no reasonable // number of gridpoints that would make exact match. However, a prelinearization // of 258 entries, would map 0xFF00 exactly on entry 257, and this is good to avoid scum dot. // Almost all what we need but unfortunately, the rest of entries should be scaled by // (255*257/256) and this is not exact. cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID) { cmsStage* mpe; cmsToneCurve* LabTable[3]; int i, j; LabTable[0] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL); LabTable[1] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL); LabTable[2] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL); for (j=0; j < 3; j++) { if (LabTable[j] == NULL) { cmsFreeToneCurveTriple(LabTable); return NULL; } // We need to map * (0xffff / 0xff00), thats same as (257 / 256) // So we can use 258-entry tables to do the trick (i / 257) * (255 * 257) * (257 / 256); for (i=0; i < 257; i++) { LabTable[j]->Table16[i] = (cmsUInt16Number) ((i * 0xffff + 0x80) >> 8); } LabTable[j] ->Table16[257] = 0xffff; } mpe = cmsStageAllocToneCurves(ContextID, 3, LabTable); cmsFreeToneCurveTriple(LabTable); if (mpe == NULL) return NULL; mpe ->Implements = cmsSigLabV2toV4; return mpe; } // ******************************************************************************** // Matrix-based conversion, which is more accurate, but slower and cannot properly be saved in devicelink profiles cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID) { static const cmsFloat64Number V2ToV4[] = { 65535.0/65280.0, 0, 0, 0, 65535.0/65280.0, 0, 0, 0, 65535.0/65280.0 }; cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V2ToV4, NULL); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigLabV2toV4; return mpe; } // Reverse direction cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID) { static const cmsFloat64Number V4ToV2[] = { 65280.0/65535.0, 0, 0, 0, 65280.0/65535.0, 0, 0, 0, 65280.0/65535.0 }; cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V4ToV2, NULL); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigLabV4toV2; return mpe; } // To Lab to float. Note that the MPE gives numbers in normal Lab range // and we need 0..1.0 range for the formatters // L* : 0...100 => 0...1.0 (L* / 100) // ab* : -128..+127 to 0..1 ((ab* + 128) / 255) cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID) { static const cmsFloat64Number a1[] = { 1.0/100.0, 0, 0, 0, 1.0/255.0, 0, 0, 0, 1.0/255.0 }; static const cmsFloat64Number o1[] = { 0, 128.0/255.0, 128.0/255.0 }; cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigLab2FloatPCS; return mpe; } // Fom XYZ to floating point PCS cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID) { #define n (32768.0/65535.0) static const cmsFloat64Number a1[] = { n, 0, 0, 0, n, 0, 0, 0, n }; #undef n cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigXYZ2FloatPCS; return mpe; } cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID) { static const cmsFloat64Number a1[] = { 100.0, 0, 0, 0, 255.0, 0, 0, 0, 255.0 }; static const cmsFloat64Number o1[] = { 0, -128.0, -128.0 }; cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigFloatPCS2Lab; return mpe; } cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID) { #define n (65535.0/32768.0) static const cmsFloat64Number a1[] = { n, 0, 0, 0, n, 0, 0, 0, n }; #undef n cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL); if (mpe == NULL) return mpe; mpe ->Implements = cmsSigFloatPCS2XYZ; return mpe; } // ******************************************************************************** // Type cmsSigXYZ2LabElemType // ******************************************************************************** static void EvaluateXYZ2Lab(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { cmsCIELab Lab; cmsCIEXYZ XYZ; const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ; // From 0..1.0 to XYZ XYZ.X = In[0] * XYZadj; XYZ.Y = In[1] * XYZadj; XYZ.Z = In[2] * XYZadj; cmsXYZ2Lab(NULL, &Lab, &XYZ); // From V4 Lab to 0..1.0 Out[0] = (cmsFloat32Number) (Lab.L / 100.0); Out[1] = (cmsFloat32Number) ((Lab.a + 128.0) / 255.0); Out[2] = (cmsFloat32Number) ((Lab.b + 128.0) / 255.0); return; cmsUNUSED_PARAMETER(mpe); } cmsStage* _cmsStageAllocXYZ2Lab(cmsContext ContextID) { return _cmsStageAllocPlaceholder(ContextID, cmsSigXYZ2LabElemType, 3, 3, EvaluateXYZ2Lab, NULL, NULL, NULL); } // ******************************************************************************** // For v4, S-Shaped curves are placed in a/b axis to increase resolution near gray cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID) { cmsToneCurve* LabTable[3]; cmsFloat64Number Params[1] = {2.4} ; LabTable[0] = cmsBuildGamma(ContextID, 1.0); LabTable[1] = cmsBuildParametricToneCurve(ContextID, 108, Params); LabTable[2] = cmsBuildParametricToneCurve(ContextID, 108, Params); return cmsStageAllocToneCurves(ContextID, 3, LabTable); } // Free a single MPE void CMSEXPORT cmsStageFree(cmsStage* mpe) { if (mpe ->FreePtr) mpe ->FreePtr(mpe); _cmsFree(mpe ->ContextID, mpe); } cmsUInt32Number CMSEXPORT cmsStageInputChannels(const cmsStage* mpe) { return mpe ->InputChannels; } cmsUInt32Number CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe) { return mpe ->OutputChannels; } cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe) { return mpe -> Type; } void* CMSEXPORT cmsStageData(const cmsStage* mpe) { return mpe -> Data; } cmsStage* CMSEXPORT cmsStageNext(const cmsStage* mpe) { return mpe -> Next; } // Duplicates an MPE cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe) { cmsStage* NewMPE; if (mpe == NULL) return NULL; NewMPE = _cmsStageAllocPlaceholder(mpe ->ContextID, mpe ->Type, mpe ->InputChannels, mpe ->OutputChannels, mpe ->EvalPtr, mpe ->DupElemPtr, mpe ->FreePtr, NULL); if (NewMPE == NULL) return NULL; NewMPE ->Implements = mpe ->Implements; if (mpe ->DupElemPtr) { NewMPE ->Data = mpe ->DupElemPtr(mpe); if (NewMPE->Data == NULL) { cmsStageFree(NewMPE); return NULL; } } else { NewMPE ->Data = NULL; } return NewMPE; } // *********************************************************************************************************** // This function sets up the channel count static void BlessLUT(cmsPipeline* lut) { // We can set the input/ouput channels only if we have elements. if (lut ->Elements != NULL) { cmsStage *First, *Last; First = cmsPipelineGetPtrToFirstStage(lut); Last = cmsPipelineGetPtrToLastStage(lut); if (First != NULL)lut ->InputChannels = First ->InputChannels; if (Last != NULL) lut ->OutputChannels = Last ->OutputChannels; } } // Default to evaluate the LUT on 16 bit-basis. Precision is retained. static void _LUTeval16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register const void* D) { cmsPipeline* lut = (cmsPipeline*) D; cmsStage *mpe; cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS]; int Phase = 0, NextPhase; From16ToFloat(In, &Storage[Phase][0], lut ->InputChannels); for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) { NextPhase = Phase ^ 1; mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe); Phase = NextPhase; } FromFloatTo16(&Storage[Phase][0], Out, lut ->OutputChannels); } // Does evaluate the LUT on cmsFloat32Number-basis. static void _LUTevalFloat(register const cmsFloat32Number In[], register cmsFloat32Number Out[], const void* D) { cmsPipeline* lut = (cmsPipeline*) D; cmsStage *mpe; cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS]; int Phase = 0, NextPhase; memmove(&Storage[Phase][0], In, lut ->InputChannels * sizeof(cmsFloat32Number)); for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) { NextPhase = Phase ^ 1; mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe); Phase = NextPhase; } memmove(Out, &Storage[Phase][0], lut ->OutputChannels * sizeof(cmsFloat32Number)); } // LUT Creation & Destruction cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels) { cmsPipeline* NewLUT; if (InputChannels >= cmsMAXCHANNELS || OutputChannels >= cmsMAXCHANNELS) return NULL; NewLUT = (cmsPipeline*) _cmsMallocZero(ContextID, sizeof(cmsPipeline)); if (NewLUT == NULL) return NULL; NewLUT -> InputChannels = InputChannels; NewLUT -> OutputChannels = OutputChannels; NewLUT ->Eval16Fn = _LUTeval16; NewLUT ->EvalFloatFn = _LUTevalFloat; NewLUT ->DupDataFn = NULL; NewLUT ->FreeDataFn = NULL; NewLUT ->Data = NewLUT; NewLUT ->ContextID = ContextID; BlessLUT(NewLUT); return NewLUT; } cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut) { _cmsAssert(lut != NULL); return lut ->ContextID; } cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut) { _cmsAssert(lut != NULL); return lut ->InputChannels; } cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut) { _cmsAssert(lut != NULL); return lut ->OutputChannels; } // Free a profile elements LUT void CMSEXPORT cmsPipelineFree(cmsPipeline* lut) { cmsStage *mpe, *Next; if (lut == NULL) return; for (mpe = lut ->Elements; mpe != NULL; mpe = Next) { Next = mpe ->Next; cmsStageFree(mpe); } if (lut ->FreeDataFn) lut ->FreeDataFn(lut ->ContextID, lut ->Data); _cmsFree(lut ->ContextID, lut); } // Default to evaluate the LUT on 16 bit-basis. void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut) { _cmsAssert(lut != NULL); lut ->Eval16Fn(In, Out, lut->Data); } // Does evaluate the LUT on cmsFloat32Number-basis. void CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut) { _cmsAssert(lut != NULL); lut ->EvalFloatFn(In, Out, lut); } // Duplicates a LUT cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* lut) { cmsPipeline* NewLUT; cmsStage *NewMPE, *Anterior = NULL, *mpe; cmsBool First = TRUE; if (lut == NULL) return NULL; NewLUT = cmsPipelineAlloc(lut ->ContextID, lut ->InputChannels, lut ->OutputChannels); if (NewLUT == NULL) return NULL; for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) { NewMPE = cmsStageDup(mpe); if (NewMPE == NULL) { cmsPipelineFree(NewLUT); return NULL; } if (First) { NewLUT ->Elements = NewMPE; First = FALSE; } else { Anterior ->Next = NewMPE; } Anterior = NewMPE; } NewLUT ->Eval16Fn = lut ->Eval16Fn; NewLUT ->EvalFloatFn = lut ->EvalFloatFn; NewLUT ->DupDataFn = lut ->DupDataFn; NewLUT ->FreeDataFn = lut ->FreeDataFn; if (NewLUT ->DupDataFn != NULL) NewLUT ->Data = NewLUT ->DupDataFn(lut ->ContextID, lut->Data); NewLUT ->SaveAs8Bits = lut ->SaveAs8Bits; BlessLUT(NewLUT); return NewLUT; } int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe) { cmsStage* Anterior = NULL, *pt; if (lut == NULL || mpe == NULL) return FALSE; switch (loc) { case cmsAT_BEGIN: mpe ->Next = lut ->Elements; lut ->Elements = mpe; break; case cmsAT_END: if (lut ->Elements == NULL) lut ->Elements = mpe; else { for (pt = lut ->Elements; pt != NULL; pt = pt -> Next) Anterior = pt; Anterior ->Next = mpe; mpe ->Next = NULL; } break; default:; return FALSE; } BlessLUT(lut); return TRUE; } // Unlink an element and return the pointer to it void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe) { cmsStage *Anterior, *pt, *Last; cmsStage *Unlinked = NULL; // If empty LUT, there is nothing to remove if (lut ->Elements == NULL) { if (mpe) *mpe = NULL; return; } // On depending on the strategy... switch (loc) { case cmsAT_BEGIN: { cmsStage* elem = lut ->Elements; lut ->Elements = elem -> Next; elem ->Next = NULL; Unlinked = elem; } break; case cmsAT_END: Anterior = Last = NULL; for (pt = lut ->Elements; pt != NULL; pt = pt -> Next) { Anterior = Last; Last = pt; } Unlinked = Last; // Next already points to NULL // Truncate the chain if (Anterior) Anterior ->Next = NULL; else lut ->Elements = NULL; break; default:; } if (mpe) *mpe = Unlinked; else cmsStageFree(Unlinked); BlessLUT(lut); } // Concatenate two LUT into a new single one cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2) { cmsStage* mpe; // If both LUTS does not have elements, we need to inherit // the number of channels if (l1 ->Elements == NULL && l2 ->Elements == NULL) { l1 ->InputChannels = l2 ->InputChannels; l1 ->OutputChannels = l2 ->OutputChannels; } // Cat second for (mpe = l2 ->Elements; mpe != NULL; mpe = mpe ->Next) { // We have to dup each element if (!cmsPipelineInsertStage(l1, cmsAT_END, cmsStageDup(mpe))) return FALSE; } BlessLUT(l1); return TRUE; } cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On) { cmsBool Anterior = lut ->SaveAs8Bits; lut ->SaveAs8Bits = On; return Anterior; } cmsStage* CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut) { return lut ->Elements; } cmsStage* CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut) { cmsStage *mpe, *Anterior = NULL; for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) Anterior = mpe; return Anterior; } cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut) { cmsStage *mpe; cmsUInt32Number n; for (n=0, mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) n++; return n; } // This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional // duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality. void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut, _cmsOPTeval16Fn Eval16, void* PrivateData, _cmsFreeUserDataFn FreePrivateDataFn, _cmsDupUserDataFn DupPrivateDataFn) { Lut ->Eval16Fn = Eval16; Lut ->DupDataFn = DupPrivateDataFn; Lut ->FreeDataFn = FreePrivateDataFn; Lut ->Data = PrivateData; } // ----------------------------------------------------------- Reverse interpolation // Here's how it goes. The derivative Df(x) of the function f is the linear // transformation that best approximates f near the point x. It can be represented // by a matrix A whose entries are the partial derivatives of the components of f // with respect to all the coordinates. This is know as the Jacobian // // The best linear approximation to f is given by the matrix equation: // // y-y0 = A (x-x0) // // So, if x0 is a good "guess" for the zero of f, then solving for the zero of this // linear approximation will give a "better guess" for the zero of f. Thus let y=0, // and since y0=f(x0) one can solve the above equation for x. This leads to the // Newton's method formula: // // xn+1 = xn - A-1 f(xn) // // where xn+1 denotes the (n+1)-st guess, obtained from the n-th guess xn in the // fashion described above. Iterating this will give better and better approximations // if you have a "good enough" initial guess. #define JACOBIAN_EPSILON 0.001f #define INVERSION_MAX_ITERATIONS 30 // Increment with reflexion on boundary static void IncDelta(cmsFloat32Number *Val) { if (*Val < (1.0 - JACOBIAN_EPSILON)) *Val += JACOBIAN_EPSILON; else *Val -= JACOBIAN_EPSILON; } // Euclidean distance between two vectors of n elements each one static cmsFloat32Number EuclideanDistance(cmsFloat32Number a[], cmsFloat32Number b[], int n) { cmsFloat32Number sum = 0; int i; for (i=0; i < n; i++) { cmsFloat32Number dif = b[i] - a[i]; sum += dif * dif; } return sqrtf(sum); } // Evaluate a LUT in reverse direction. It only searches on 3->3 LUT. Uses Newton method // // x1 <- x - [J(x)]^-1 * f(x) // // lut: The LUT on where to do the search // Target: LabK, 3 values of Lab plus destination K which is fixed // Result: The obtained CMYK // Hint: Location where begin the search cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[], cmsFloat32Number Result[], cmsFloat32Number Hint[], const cmsPipeline* lut) { cmsUInt32Number i, j; cmsFloat64Number error, LastError = 1E20; cmsFloat32Number fx[4], x[4], xd[4], fxd[4]; cmsVEC3 tmp, tmp2; cmsMAT3 Jacobian; // Only 3->3 and 4->3 are supported if (lut ->InputChannels != 3 && lut ->InputChannels != 4) return FALSE; if (lut ->OutputChannels != 3) return FALSE; // Take the hint as starting point if specified if (Hint == NULL) { // Begin at any point, we choose 1/3 of CMY axis x[0] = x[1] = x[2] = 0.3f; } else { // Only copy 3 channels from hint... for (j=0; j < 3; j++) x[j] = Hint[j]; } // If Lut is 4-dimensions, then grab target[3], which is fixed if (lut ->InputChannels == 4) { x[3] = Target[3]; } else x[3] = 0; // To keep lint happy // Iterate for (i = 0; i < INVERSION_MAX_ITERATIONS; i++) { // Get beginning fx cmsPipelineEvalFloat(x, fx, lut); // Compute error error = EuclideanDistance(fx, Target, 3); // If not convergent, return last safe value if (error >= LastError) break; // Keep latest values LastError = error; for (j=0; j < lut ->InputChannels; j++) Result[j] = x[j]; // Found an exact match? if (error <= 0) break; // Obtain slope (the Jacobian) for (j = 0; j < 3; j++) { xd[0] = x[0]; xd[1] = x[1]; xd[2] = x[2]; xd[3] = x[3]; // Keep fixed channel IncDelta(&xd[j]); cmsPipelineEvalFloat(xd, fxd, lut); Jacobian.v[0].n[j] = ((fxd[0] - fx[0]) / JACOBIAN_EPSILON); Jacobian.v[1].n[j] = ((fxd[1] - fx[1]) / JACOBIAN_EPSILON); Jacobian.v[2].n[j] = ((fxd[2] - fx[2]) / JACOBIAN_EPSILON); } // Solve system tmp2.n[0] = fx[0] - Target[0]; tmp2.n[1] = fx[1] - Target[1]; tmp2.n[2] = fx[2] - Target[2]; if (!_cmsMAT3solve(&tmp, &Jacobian, &tmp2)) return FALSE; // Move our guess x[0] -= (cmsFloat32Number) tmp.n[0]; x[1] -= (cmsFloat32Number) tmp.n[1]; x[2] -= (cmsFloat32Number) tmp.n[2]; // Some clipping.... for (j=0; j < 3; j++) { if (x[j] < 0) x[j] = 0; else if (x[j] > 1.0) x[j] = 1.0; } } return TRUE; } lcms2-2.6/src/cmsio1.c0000644002406300000240000010374312311617072014064 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Read tags using low-level functions, provides necessary glue code to adapt versions, etc. // LUT tags static const cmsTagSignature Device2PCS16[] = {cmsSigAToB0Tag, // Perceptual cmsSigAToB1Tag, // Relative colorimetric cmsSigAToB2Tag, // Saturation cmsSigAToB1Tag }; // Absolute colorimetric static const cmsTagSignature Device2PCSFloat[] = {cmsSigDToB0Tag, // Perceptual cmsSigDToB1Tag, // Relative colorimetric cmsSigDToB2Tag, // Saturation cmsSigDToB3Tag }; // Absolute colorimetric static const cmsTagSignature PCS2Device16[] = {cmsSigBToA0Tag, // Perceptual cmsSigBToA1Tag, // Relative colorimetric cmsSigBToA2Tag, // Saturation cmsSigBToA1Tag }; // Absolute colorimetric static const cmsTagSignature PCS2DeviceFloat[] = {cmsSigBToD0Tag, // Perceptual cmsSigBToD1Tag, // Relative colorimetric cmsSigBToD2Tag, // Saturation cmsSigBToD3Tag }; // Absolute colorimetric // Factors to convert from 1.15 fixed point to 0..1.0 range and vice-versa #define InpAdj (1.0/MAX_ENCODEABLE_XYZ) // (65536.0/(65535.0*2.0)) #define OutpAdj (MAX_ENCODEABLE_XYZ) // ((2.0*65535.0)/65536.0) // Several resources for gray conversions. static const cmsFloat64Number GrayInputMatrix[] = { (InpAdj*cmsD50X), (InpAdj*cmsD50Y), (InpAdj*cmsD50Z) }; static const cmsFloat64Number OneToThreeInputMatrix[] = { 1, 1, 1 }; static const cmsFloat64Number PickYMatrix[] = { 0, (OutpAdj*cmsD50Y), 0 }; static const cmsFloat64Number PickLstarMatrix[] = { 1, 0, 0 }; // Get a media white point fixing some issues found in certain old profiles cmsBool _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile) { cmsCIEXYZ* Tag; _cmsAssert(Dest != NULL); Tag = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag); // If no wp, take D50 if (Tag == NULL) { *Dest = *cmsD50_XYZ(); return TRUE; } // V2 display profiles should give D50 if (cmsGetEncodedICCversion(hProfile) < 0x4000000) { if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) { *Dest = *cmsD50_XYZ(); return TRUE; } } // All seems ok *Dest = *Tag; return TRUE; } // Chromatic adaptation matrix. Fix some issues as well cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile) { cmsMAT3* Tag; _cmsAssert(Dest != NULL); Tag = (cmsMAT3*) cmsReadTag(hProfile, cmsSigChromaticAdaptationTag); if (Tag != NULL) { *Dest = *Tag; return TRUE; } // No CHAD available, default it to identity _cmsMAT3identity(Dest); // V2 display profiles should give D50 if (cmsGetEncodedICCversion(hProfile) < 0x4000000) { if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) { cmsCIEXYZ* White = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag); if (White == NULL) { _cmsMAT3identity(Dest); return TRUE; } return _cmsAdaptationMatrix(Dest, NULL, White, cmsD50_XYZ()); } } return TRUE; } // Auxiliar, read colorants as a MAT3 structure. Used by any function that needs a matrix-shaper static cmsBool ReadICCMatrixRGB2XYZ(cmsMAT3* r, cmsHPROFILE hProfile) { cmsCIEXYZ *PtrRed, *PtrGreen, *PtrBlue; _cmsAssert(r != NULL); PtrRed = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigRedColorantTag); PtrGreen = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigGreenColorantTag); PtrBlue = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigBlueColorantTag); if (PtrRed == NULL || PtrGreen == NULL || PtrBlue == NULL) return FALSE; _cmsVEC3init(&r -> v[0], PtrRed -> X, PtrGreen -> X, PtrBlue -> X); _cmsVEC3init(&r -> v[1], PtrRed -> Y, PtrGreen -> Y, PtrBlue -> Y); _cmsVEC3init(&r -> v[2], PtrRed -> Z, PtrGreen -> Z, PtrBlue -> Z); return TRUE; } // Gray input pipeline static cmsPipeline* BuildGrayInputMatrixPipeline(cmsHPROFILE hProfile) { cmsToneCurve *GrayTRC; cmsPipeline* Lut; cmsContext ContextID = cmsGetProfileContextID(hProfile); GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag); if (GrayTRC == NULL) return NULL; Lut = cmsPipelineAlloc(ContextID, 1, 3); if (Lut == NULL) goto Error; if (cmsGetPCS(hProfile) == cmsSigLabData) { // In this case we implement the profile as an identity matrix plus 3 tone curves cmsUInt16Number Zero[2] = { 0x8080, 0x8080 }; cmsToneCurve* EmptyTab; cmsToneCurve* LabCurves[3]; EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero); if (EmptyTab == NULL) goto Error; LabCurves[0] = GrayTRC; LabCurves[1] = EmptyTab; LabCurves[2] = EmptyTab; if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, OneToThreeInputMatrix, NULL)) || !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves))) { cmsFreeToneCurve(EmptyTab); goto Error; } cmsFreeToneCurve(EmptyTab); } else { if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC)) || !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, GrayInputMatrix, NULL))) goto Error; } return Lut; Error: cmsFreeToneCurve(GrayTRC); cmsPipelineFree(Lut); return NULL; } // RGB Matrix shaper static cmsPipeline* BuildRGBInputMatrixShaper(cmsHPROFILE hProfile) { cmsPipeline* Lut; cmsMAT3 Mat; cmsToneCurve *Shapes[3]; cmsContext ContextID = cmsGetProfileContextID(hProfile); int i, j; if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile)) return NULL; // XYZ PCS in encoded in 1.15 format, and the matrix output comes in 0..0xffff range, so // we need to adjust the output by a factor of (0x10000/0xffff) to put data in // a 1.16 range, and then a >> 1 to obtain 1.15. The total factor is (65536.0)/(65535.0*2) for (i=0; i < 3; i++) for (j=0; j < 3; j++) Mat.v[i].n[j] *= InpAdj; Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag); Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag); Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag); if (!Shapes[0] || !Shapes[1] || !Shapes[2]) return NULL; Lut = cmsPipelineAlloc(ContextID, 3, 3); if (Lut != NULL) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes)) || !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL))) goto Error; // Note that it is certainly possible a single profile would have a LUT based // tag for output working in lab and a matrix-shaper for the fallback cases. // This is not allowed by the spec, but this code is tolerant to those cases if (cmsGetPCS(hProfile) == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID))) goto Error; } } return Lut; Error: cmsPipelineFree(Lut); return NULL; } // Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded static cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) { cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile); cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); if (Lut == NULL) return NULL; // input and output of transform are in lcms 0..1 encoding. If XYZ or Lab spaces are used, // these need to be normalized into the appropriate ranges (Lab = 100,0,0, XYZ=1.0,1.0,1.0) if ( spc == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID))) goto Error; } else if (spc == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID))) goto Error; } if ( PCS == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID))) goto Error; } else if( PCS == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID))) goto Error; } return Lut; Error: cmsPipelineFree(Lut); return NULL; } // Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc // is adjusted here in order to create a LUT that takes care of all those details. // We add intent = -1 as a way to read matrix shaper always, no matter of other LUT cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent) { cmsTagTypeSignature OriginalType; cmsTagSignature tag16 = Device2PCS16[Intent]; cmsTagSignature tagFloat = Device2PCSFloat[Intent]; cmsContext ContextID = cmsGetProfileContextID(hProfile); // On named color, take the appropiate tag if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { cmsPipeline* Lut; cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag); if (nc == NULL) return NULL; Lut = cmsPipelineAlloc(ContextID, 0, 0); if (Lut == NULL) { cmsFreeNamedColorList(nc); return NULL; } if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE)) || !cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) { cmsPipelineFree(Lut); return NULL; } return Lut; } // This is an attempt to reuse this funtion to retrieve the matrix-shaper as pipeline no // matter other LUT are present and have precedence. Intent = -1 means just this. if (Intent != -1) { if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence // Floating point LUT are always V4, but the encoding range is no // longer 0..1.0, so we need to add an stage depending on the color space return _cmsReadFloatInputTag(hProfile, tagFloat); } // Revert to perceptual if no tag is found if (!cmsIsTag(hProfile, tag16)) { tag16 = Device2PCS16[0]; } if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table? // Check profile version and LUT type. Do the necessary adjustments if needed // First read the tag cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16); if (Lut == NULL) return NULL; // After reading it, we have now info about the original type OriginalType = _cmsGetTagTrueType(hProfile, tag16); // The profile owns the Lut, so we need to copy it Lut = cmsPipelineDup(Lut); // We need to adjust data only for Lab16 on output if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData) return Lut; // If the input is Lab, add also a conversion at the begin if (cmsGetColorSpace(hProfile) == cmsSigLabData && !cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID))) goto Error; // Add a matrix for conversion V2 to V4 Lab PCS if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) goto Error; return Lut; Error: cmsPipelineFree(Lut); return NULL; } } // Lut was not found, try to create a matrix-shaper // Check if this is a grayscale profile. if (cmsGetColorSpace(hProfile) == cmsSigGrayData) { // if so, build appropiate conversion tables. // The tables are the PCS iluminant, scaled across GrayTRC return BuildGrayInputMatrixPipeline(hProfile); } // Not gray, create a normal matrix-shaper return BuildRGBInputMatrixShaper(hProfile); } // --------------------------------------------------------------------------------------------------------------- // Gray output pipeline. // XYZ -> Gray or Lab -> Gray. Since we only know the GrayTRC, we need to do some assumptions. Gray component will be // given by Y on XYZ PCS and by L* on Lab PCS, Both across inverse TRC curve. // The complete pipeline on XYZ is Matrix[3:1] -> Tone curve and in Lab Matrix[3:1] -> Tone Curve as well. static cmsPipeline* BuildGrayOutputPipeline(cmsHPROFILE hProfile) { cmsToneCurve *GrayTRC, *RevGrayTRC; cmsPipeline* Lut; cmsContext ContextID = cmsGetProfileContextID(hProfile); GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag); if (GrayTRC == NULL) return NULL; RevGrayTRC = cmsReverseToneCurve(GrayTRC); if (RevGrayTRC == NULL) return NULL; Lut = cmsPipelineAlloc(ContextID, 3, 1); if (Lut == NULL) { cmsFreeToneCurve(RevGrayTRC); return NULL; } if (cmsGetPCS(hProfile) == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL))) goto Error; } else { if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickYMatrix, NULL))) goto Error; } if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC))) goto Error; cmsFreeToneCurve(RevGrayTRC); return Lut; Error: cmsFreeToneCurve(RevGrayTRC); cmsPipelineFree(Lut); return NULL; } static cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile) { cmsPipeline* Lut; cmsToneCurve *Shapes[3], *InvShapes[3]; cmsMAT3 Mat, Inv; int i, j; cmsContext ContextID = cmsGetProfileContextID(hProfile); if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile)) return NULL; if (!_cmsMAT3inverse(&Mat, &Inv)) return NULL; // XYZ PCS in encoded in 1.15 format, and the matrix input should come in 0..0xffff range, so // we need to adjust the input by a << 1 to obtain a 1.16 fixed and then by a factor of // (0xffff/0x10000) to put data in 0..0xffff range. Total factor is (2.0*65535.0)/65536.0; for (i=0; i < 3; i++) for (j=0; j < 3; j++) Inv.v[i].n[j] *= OutpAdj; Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag); Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag); Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag); if (!Shapes[0] || !Shapes[1] || !Shapes[2]) return NULL; InvShapes[0] = cmsReverseToneCurve(Shapes[0]); InvShapes[1] = cmsReverseToneCurve(Shapes[1]); InvShapes[2] = cmsReverseToneCurve(Shapes[2]); if (!InvShapes[0] || !InvShapes[1] || !InvShapes[2]) { return NULL; } Lut = cmsPipelineAlloc(ContextID, 3, 3); if (Lut != NULL) { // Note that it is certainly possible a single profile would have a LUT based // tag for output working in lab and a matrix-shaper for the fallback cases. // This is not allowed by the spec, but this code is tolerant to those cases if (cmsGetPCS(hProfile) == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID))) goto Error; } if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL)) || !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes))) goto Error; } cmsFreeToneCurveTriple(InvShapes); return Lut; Error: cmsFreeToneCurveTriple(InvShapes); cmsPipelineFree(Lut); return NULL; } // Change CLUT interpolation to trilinear static void ChangeInterpolationToTrilinear(cmsPipeline* Lut) { cmsStage* Stage; for (Stage = cmsPipelineGetPtrToFirstStage(Lut); Stage != NULL; Stage = cmsStageNext(Stage)) { if (cmsStageType(Stage) == cmsSigCLutElemType) { _cmsStageCLutData* CLUT = (_cmsStageCLutData*) Stage ->Data; CLUT ->Params->dwFlags |= CMS_LERP_FLAGS_TRILINEAR; _cmsSetInterpolationRoutine(Lut->ContextID, CLUT ->Params); } } } // Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded static cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) { cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); cmsColorSpaceSignature dataSpace = cmsGetColorSpace(hProfile); if (Lut == NULL) return NULL; // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding, // and since the formatter has already accomodated to 0..1.0, we should undo this change if ( PCS == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID))) goto Error; } else if (PCS == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID))) goto Error; } // the output can be Lab or XYZ, in which case normalisation is needed on the end of the pipeline if ( dataSpace == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID))) goto Error; } else if (dataSpace == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID))) goto Error; } return Lut; Error: cmsPipelineFree(Lut); return NULL; } // Create an output MPE LUT from agiven profile. Version mismatches are handled here cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent) { cmsTagTypeSignature OriginalType; cmsTagSignature tag16 = PCS2Device16[Intent]; cmsTagSignature tagFloat = PCS2DeviceFloat[Intent]; cmsContext ContextID = cmsGetProfileContextID(hProfile); if (Intent != -1) { if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence // Floating point LUT are always V4 return _cmsReadFloatOutputTag(hProfile, tagFloat); } // Revert to perceptual if no tag is found if (!cmsIsTag(hProfile, tag16)) { tag16 = PCS2Device16[0]; } if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table? // Check profile version and LUT type. Do the necessary adjustments if needed // First read the tag cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16); if (Lut == NULL) return NULL; // After reading it, we have info about the original type OriginalType = _cmsGetTagTrueType(hProfile, tag16); // The profile owns the Lut, so we need to copy it Lut = cmsPipelineDup(Lut); if (Lut == NULL) return NULL; // Now it is time for a controversial stuff. I found that for 3D LUTS using // Lab used as indexer space, trilinear interpolation should be used if (cmsGetPCS(hProfile) == cmsSigLabData) ChangeInterpolationToTrilinear(Lut); // We need to adjust data only for Lab and Lut16 type if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData) return Lut; // Add a matrix for conversion V4 to V2 Lab PCS if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID))) goto Error; // If the output is Lab, add also a conversion at the end if (cmsGetColorSpace(hProfile) == cmsSigLabData) if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) goto Error; return Lut; Error: cmsPipelineFree(Lut); return NULL; } } // Lut not found, try to create a matrix-shaper // Check if this is a grayscale profile. if (cmsGetColorSpace(hProfile) == cmsSigGrayData) { // if so, build appropiate conversion tables. // The tables are the PCS iluminant, scaled across GrayTRC return BuildGrayOutputPipeline(hProfile); } // Not gray, create a normal matrix-shaper, which only operates in XYZ space return BuildRGBOutputMatrixShaper(hProfile); } // --------------------------------------------------------------------------------------------------------------- // Read the AToD0 tag, adjusting the encoding of Lab or XYZ if neded static cmsPipeline* _cmsReadFloatDevicelinkTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) { cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile); if (Lut == NULL) return NULL; if (spc == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID))) goto Error; } else if (spc == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID))) goto Error; } if (PCS == cmsSigLabData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID))) goto Error; } else if (PCS == cmsSigXYZData) { if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID))) goto Error; } return Lut; Error: cmsPipelineFree(Lut); return NULL; } // This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The // tag name here may default to AToB0 cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent) { cmsPipeline* Lut; cmsTagTypeSignature OriginalType; cmsTagSignature tag16 = Device2PCS16[Intent]; cmsTagSignature tagFloat = Device2PCSFloat[Intent]; cmsContext ContextID = cmsGetProfileContextID(hProfile); // On named color, take the appropiate tag if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag); if (nc == NULL) return NULL; Lut = cmsPipelineAlloc(ContextID, 0, 0); if (Lut == NULL) goto Error; if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE))) goto Error; if (cmsGetColorSpace(hProfile) == cmsSigLabData) if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) goto Error; return Lut; Error: cmsPipelineFree(Lut); cmsFreeNamedColorList(nc); return NULL; } if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence // Floating point LUT are always V return _cmsReadFloatDevicelinkTag(hProfile, tagFloat); } tagFloat = Device2PCSFloat[0]; if (cmsIsTag(hProfile, tagFloat)) { return cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); } if (!cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table? tag16 = Device2PCS16[0]; if (!cmsIsTag(hProfile, tag16)) return NULL; } // Check profile version and LUT type. Do the necessary adjustments if needed // Read the tag Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16); if (Lut == NULL) return NULL; // The profile owns the Lut, so we need to copy it Lut = cmsPipelineDup(Lut); if (Lut == NULL) return NULL; // Now it is time for a controversial stuff. I found that for 3D LUTS using // Lab used as indexer space, trilinear interpolation should be used if (cmsGetPCS(hProfile) == cmsSigLabData) ChangeInterpolationToTrilinear(Lut); // After reading it, we have info about the original type OriginalType = _cmsGetTagTrueType(hProfile, tag16); // We need to adjust data for Lab16 on output if (OriginalType != cmsSigLut16Type) return Lut; // Here it is possible to get Lab on both sides if (cmsGetColorSpace(hProfile) == cmsSigLabData) { if(!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID))) goto Error2; } if (cmsGetPCS(hProfile) == cmsSigLabData) { if(!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) goto Error2; } return Lut; Error2: cmsPipelineFree(Lut); return NULL; } // --------------------------------------------------------------------------------------------------------------- // Returns TRUE if the profile is implemented as matrix-shaper cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile) { switch (cmsGetColorSpace(hProfile)) { case cmsSigGrayData: return cmsIsTag(hProfile, cmsSigGrayTRCTag); case cmsSigRgbData: return (cmsIsTag(hProfile, cmsSigRedColorantTag) && cmsIsTag(hProfile, cmsSigGreenColorantTag) && cmsIsTag(hProfile, cmsSigBlueColorantTag) && cmsIsTag(hProfile, cmsSigRedTRCTag) && cmsIsTag(hProfile, cmsSigGreenTRCTag) && cmsIsTag(hProfile, cmsSigBlueTRCTag)); default: return FALSE; } } // Returns TRUE if the intent is implemented as CLUT cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection) { const cmsTagSignature* TagTable; // For devicelinks, the supported intent is that one stated in the header if (cmsGetDeviceClass(hProfile) == cmsSigLinkClass) { return (cmsGetHeaderRenderingIntent(hProfile) == Intent); } switch (UsedDirection) { case LCMS_USED_AS_INPUT: TagTable = Device2PCS16; break; case LCMS_USED_AS_OUTPUT:TagTable = PCS2Device16; break; // For proofing, we need rel. colorimetric in output. Let's do some recursion case LCMS_USED_AS_PROOF: return cmsIsIntentSupported(hProfile, Intent, LCMS_USED_AS_INPUT) && cmsIsIntentSupported(hProfile, INTENT_RELATIVE_COLORIMETRIC, LCMS_USED_AS_OUTPUT); default: cmsSignalError(cmsGetProfileContextID(hProfile), cmsERROR_RANGE, "Unexpected direction (%d)", UsedDirection); return FALSE; } return cmsIsTag(hProfile, TagTable[Intent]); } // Return info about supported intents cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection) { if (cmsIsCLUT(hProfile, Intent, UsedDirection)) return TRUE; // Is there any matrix-shaper? If so, the intent is supported. This is a bit odd, since V2 matrix shaper // does not fully support relative colorimetric because they cannot deal with non-zero black points, but // many profiles claims that, and this is certainly not true for V4 profiles. Lets answer "yes" no matter // the accuracy would be less than optimal in rel.col and v2 case. return cmsIsMatrixShaper(hProfile); } // --------------------------------------------------------------------------------------------------------------- // Read both, profile sequence description and profile sequence id if present. Then combine both to // create qa unique structure holding both. Shame on ICC to store things in such complicated way. cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile) { cmsSEQ* ProfileSeq; cmsSEQ* ProfileId; cmsSEQ* NewSeq; cmsUInt32Number i; // Take profile sequence description first ProfileSeq = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceDescTag); // Take profile sequence ID ProfileId = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceIdTag); if (ProfileSeq == NULL && ProfileId == NULL) return NULL; if (ProfileSeq == NULL) return cmsDupProfileSequenceDescription(ProfileId); if (ProfileId == NULL) return cmsDupProfileSequenceDescription(ProfileSeq); // We have to mix both together. For that they must agree if (ProfileSeq ->n != ProfileId ->n) return cmsDupProfileSequenceDescription(ProfileSeq); NewSeq = cmsDupProfileSequenceDescription(ProfileSeq); // Ok, proceed to the mixing if (NewSeq != NULL) { for (i=0; i < ProfileSeq ->n; i++) { memmove(&NewSeq ->seq[i].ProfileID, &ProfileId ->seq[i].ProfileID, sizeof(cmsProfileID)); NewSeq ->seq[i].Description = cmsMLUdup(ProfileId ->seq[i].Description); } } return NewSeq; } // Dump the contents of profile sequence in both tags (if v4 available) cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq) { if (!cmsWriteTag(hProfile, cmsSigProfileSequenceDescTag, seq)) return FALSE; if (cmsGetProfileVersion(hProfile) >= 4.0) { if (!cmsWriteTag(hProfile, cmsSigProfileSequenceIdTag, seq)) return FALSE; } return TRUE; } // Auxiliar, read and duplicate a MLU if found. static cmsMLU* GetMLUFromProfile(cmsHPROFILE h, cmsTagSignature sig) { cmsMLU* mlu = (cmsMLU*) cmsReadTag(h, sig); if (mlu == NULL) return NULL; return cmsMLUdup(mlu); } // Create a sequence description out of an array of profiles cmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[]) { cmsUInt32Number i; cmsSEQ* seq = cmsAllocProfileSequenceDescription(ContextID, nProfiles); if (seq == NULL) return NULL; for (i=0; i < nProfiles; i++) { cmsPSEQDESC* ps = &seq ->seq[i]; cmsHPROFILE h = hProfiles[i]; cmsTechnologySignature* techpt; cmsGetHeaderAttributes(h, &ps ->attributes); cmsGetHeaderProfileID(h, ps ->ProfileID.ID8); ps ->deviceMfg = cmsGetHeaderManufacturer(h); ps ->deviceModel = cmsGetHeaderModel(h); techpt = (cmsTechnologySignature*) cmsReadTag(h, cmsSigTechnologyTag); if (techpt == NULL) ps ->technology = (cmsTechnologySignature) 0; else ps ->technology = *techpt; ps ->Manufacturer = GetMLUFromProfile(h, cmsSigDeviceMfgDescTag); ps ->Model = GetMLUFromProfile(h, cmsSigDeviceModelDescTag); ps ->Description = GetMLUFromProfile(h, cmsSigProfileDescriptionTag); } return seq; } // ------------------------------------------------------------------------------------------------------------------- static const cmsMLU* GetInfo(cmsHPROFILE hProfile, cmsInfoType Info) { cmsTagSignature sig; switch (Info) { case cmsInfoDescription: sig = cmsSigProfileDescriptionTag; break; case cmsInfoManufacturer: sig = cmsSigDeviceMfgDescTag; break; case cmsInfoModel: sig = cmsSigDeviceModelDescTag; break; case cmsInfoCopyright: sig = cmsSigCopyrightTag; break; default: return NULL; } return (cmsMLU*) cmsReadTag(hProfile, sig); } cmsUInt32Number CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info, const char LanguageCode[3], const char CountryCode[3], wchar_t* Buffer, cmsUInt32Number BufferSize) { const cmsMLU* mlu = GetInfo(hProfile, Info); if (mlu == NULL) return 0; return cmsMLUgetWide(mlu, LanguageCode, CountryCode, Buffer, BufferSize); } cmsUInt32Number CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize) { const cmsMLU* mlu = GetInfo(hProfile, Info); if (mlu == NULL) return 0; return cmsMLUgetASCII(mlu, LanguageCode, CountryCode, Buffer, BufferSize); } lcms2-2.6/src/cmsmtrx.c0000644002406300000240000001306312311617072014361 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" #define DSWAP(x, y) {cmsFloat64Number tmp = (x); (x)=(y); (y)=tmp;} // Initiate a vector void CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z) { r -> n[VX] = x; r -> n[VY] = y; r -> n[VZ] = z; } // Vector substraction void CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b) { r -> n[VX] = a -> n[VX] - b -> n[VX]; r -> n[VY] = a -> n[VY] - b -> n[VY]; r -> n[VZ] = a -> n[VZ] - b -> n[VZ]; } // Vector cross product void CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v) { r ->n[VX] = u->n[VY] * v->n[VZ] - v->n[VY] * u->n[VZ]; r ->n[VY] = u->n[VZ] * v->n[VX] - v->n[VZ] * u->n[VX]; r ->n[VZ] = u->n[VX] * v->n[VY] - v->n[VX] * u->n[VY]; } // Vector dot product cmsFloat64Number CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v) { return u->n[VX] * v->n[VX] + u->n[VY] * v->n[VY] + u->n[VZ] * v->n[VZ]; } // Euclidean length cmsFloat64Number CMSEXPORT _cmsVEC3length(const cmsVEC3* a) { return sqrt(a ->n[VX] * a ->n[VX] + a ->n[VY] * a ->n[VY] + a ->n[VZ] * a ->n[VZ]); } // Euclidean distance cmsFloat64Number CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b) { cmsFloat64Number d1 = a ->n[VX] - b ->n[VX]; cmsFloat64Number d2 = a ->n[VY] - b ->n[VY]; cmsFloat64Number d3 = a ->n[VZ] - b ->n[VZ]; return sqrt(d1*d1 + d2*d2 + d3*d3); } // 3x3 Identity void CMSEXPORT _cmsMAT3identity(cmsMAT3* a) { _cmsVEC3init(&a-> v[0], 1.0, 0.0, 0.0); _cmsVEC3init(&a-> v[1], 0.0, 1.0, 0.0); _cmsVEC3init(&a-> v[2], 0.0, 0.0, 1.0); } static cmsBool CloseEnough(cmsFloat64Number a, cmsFloat64Number b) { return fabs(b - a) < (1.0 / 65535.0); } cmsBool CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a) { cmsMAT3 Identity; int i, j; _cmsMAT3identity(&Identity); for (i=0; i < 3; i++) for (j=0; j < 3; j++) if (!CloseEnough(a ->v[i].n[j], Identity.v[i].n[j])) return FALSE; return TRUE; } // Multiply two matrices void CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b) { #define ROWCOL(i, j) \ a->v[i].n[0]*b->v[0].n[j] + a->v[i].n[1]*b->v[1].n[j] + a->v[i].n[2]*b->v[2].n[j] _cmsVEC3init(&r-> v[0], ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2)); _cmsVEC3init(&r-> v[1], ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2)); _cmsVEC3init(&r-> v[2], ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2)); #undef ROWCOL //(i, j) } // Inverse of a matrix b = a^(-1) cmsBool CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b) { cmsFloat64Number det, c0, c1, c2; c0 = a -> v[1].n[1]*a -> v[2].n[2] - a -> v[1].n[2]*a -> v[2].n[1]; c1 = -a -> v[1].n[0]*a -> v[2].n[2] + a -> v[1].n[2]*a -> v[2].n[0]; c2 = a -> v[1].n[0]*a -> v[2].n[1] - a -> v[1].n[1]*a -> v[2].n[0]; det = a -> v[0].n[0]*c0 + a -> v[0].n[1]*c1 + a -> v[0].n[2]*c2; if (fabs(det) < MATRIX_DET_TOLERANCE) return FALSE; // singular matrix; can't invert b -> v[0].n[0] = c0/det; b -> v[0].n[1] = (a -> v[0].n[2]*a -> v[2].n[1] - a -> v[0].n[1]*a -> v[2].n[2])/det; b -> v[0].n[2] = (a -> v[0].n[1]*a -> v[1].n[2] - a -> v[0].n[2]*a -> v[1].n[1])/det; b -> v[1].n[0] = c1/det; b -> v[1].n[1] = (a -> v[0].n[0]*a -> v[2].n[2] - a -> v[0].n[2]*a -> v[2].n[0])/det; b -> v[1].n[2] = (a -> v[0].n[2]*a -> v[1].n[0] - a -> v[0].n[0]*a -> v[1].n[2])/det; b -> v[2].n[0] = c2/det; b -> v[2].n[1] = (a -> v[0].n[1]*a -> v[2].n[0] - a -> v[0].n[0]*a -> v[2].n[1])/det; b -> v[2].n[2] = (a -> v[0].n[0]*a -> v[1].n[1] - a -> v[0].n[1]*a -> v[1].n[0])/det; return TRUE; } // Solve a system in the form Ax = b cmsBool CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b) { cmsMAT3 m, a_1; memmove(&m, a, sizeof(cmsMAT3)); if (!_cmsMAT3inverse(&m, &a_1)) return FALSE; // Singular matrix _cmsMAT3eval(x, &a_1, b); return TRUE; } // Evaluate a vector across a matrix void CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v) { r->n[VX] = a->v[0].n[VX]*v->n[VX] + a->v[0].n[VY]*v->n[VY] + a->v[0].n[VZ]*v->n[VZ]; r->n[VY] = a->v[1].n[VX]*v->n[VX] + a->v[1].n[VY]*v->n[VY] + a->v[1].n[VZ]*v->n[VZ]; r->n[VZ] = a->v[2].n[VX]*v->n[VX] + a->v[2].n[VY]*v->n[VY] + a->v[2].n[VZ]*v->n[VZ]; } lcms2-2.6/src/cmsopt.c0000644002406300000240000016312012311617072014171 0ustar mariamausers //--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" //---------------------------------------------------------------------------------- // Optimization for 8 bits, Shaper-CLUT (3 inputs only) typedef struct { cmsContext ContextID; const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. cmsUInt16Number rx[256], ry[256], rz[256]; cmsUInt32Number X0[256], Y0[256], Z0[256]; // Precomputed nodes and offsets for 8-bit input data } Prelin8Data; // Generic optimization for 16 bits Shaper-CLUT-Shaper (any inputs) typedef struct { cmsContext ContextID; // Number of channels int nInputs; int nOutputs; _cmsInterpFn16 EvalCurveIn16[MAX_INPUT_DIMENSIONS]; // The maximum number of input channels is known in advance cmsInterpParams* ParamsCurveIn16[MAX_INPUT_DIMENSIONS]; _cmsInterpFn16 EvalCLUT; // The evaluator for 3D grid const cmsInterpParams* CLUTparams; // (not-owned pointer) _cmsInterpFn16* EvalCurveOut16; // Points to an array of curve evaluators in 16 bits (not-owned pointer) cmsInterpParams** ParamsCurveOut16; // Points to an array of references to interpolation params (not-owned pointer) } Prelin16Data; // Optimization for matrix-shaper in 8 bits. Numbers are operated in n.14 signed, tables are stored in 1.14 fixed typedef cmsInt32Number cmsS1Fixed14Number; // Note that this may hold more than 16 bits! #define DOUBLE_TO_1FIXED14(x) ((cmsS1Fixed14Number) floor((x) * 16384.0 + 0.5)) typedef struct { cmsContext ContextID; cmsS1Fixed14Number Shaper1R[256]; // from 0..255 to 1.14 (0.0...1.0) cmsS1Fixed14Number Shaper1G[256]; cmsS1Fixed14Number Shaper1B[256]; cmsS1Fixed14Number Mat[3][3]; // n.14 to n.14 (needs a saturation after that) cmsS1Fixed14Number Off[3]; cmsUInt16Number Shaper2R[16385]; // 1.14 to 0..255 cmsUInt16Number Shaper2G[16385]; cmsUInt16Number Shaper2B[16385]; } MatShaper8Data; // Curves, optimization is shared between 8 and 16 bits typedef struct { cmsContext ContextID; int nCurves; // Number of curves int nElements; // Elements in curves cmsUInt16Number** Curves; // Points to a dynamically allocated array } Curves16Data; // Simple optimizations ---------------------------------------------------------------------------------------------------------- // Remove an element in linked chain static void _RemoveElement(cmsStage** head) { cmsStage* mpe = *head; cmsStage* next = mpe ->Next; *head = next; cmsStageFree(mpe); } // Remove all identities in chain. Note that pt actually is a double pointer to the element that holds the pointer. static cmsBool _Remove1Op(cmsPipeline* Lut, cmsStageSignature UnaryOp) { cmsStage** pt = &Lut ->Elements; cmsBool AnyOpt = FALSE; while (*pt != NULL) { if ((*pt) ->Implements == UnaryOp) { _RemoveElement(pt); AnyOpt = TRUE; } else pt = &((*pt) -> Next); } return AnyOpt; } // Same, but only if two adjacent elements are found static cmsBool _Remove2Op(cmsPipeline* Lut, cmsStageSignature Op1, cmsStageSignature Op2) { cmsStage** pt1; cmsStage** pt2; cmsBool AnyOpt = FALSE; pt1 = &Lut ->Elements; if (*pt1 == NULL) return AnyOpt; while (*pt1 != NULL) { pt2 = &((*pt1) -> Next); if (*pt2 == NULL) return AnyOpt; if ((*pt1) ->Implements == Op1 && (*pt2) ->Implements == Op2) { _RemoveElement(pt2); _RemoveElement(pt1); AnyOpt = TRUE; } else pt1 = &((*pt1) -> Next); } return AnyOpt; } // Preoptimize just gets rif of no-ops coming paired. Conversion from v2 to v4 followed // by a v4 to v2 and vice-versa. The elements are then discarded. static cmsBool PreOptimize(cmsPipeline* Lut) { cmsBool AnyOpt = FALSE, Opt; do { Opt = FALSE; // Remove all identities Opt |= _Remove1Op(Lut, cmsSigIdentityElemType); // Remove XYZ2Lab followed by Lab2XYZ Opt |= _Remove2Op(Lut, cmsSigXYZ2LabElemType, cmsSigLab2XYZElemType); // Remove Lab2XYZ followed by XYZ2Lab Opt |= _Remove2Op(Lut, cmsSigLab2XYZElemType, cmsSigXYZ2LabElemType); // Remove V4 to V2 followed by V2 to V4 Opt |= _Remove2Op(Lut, cmsSigLabV4toV2, cmsSigLabV2toV4); // Remove V2 to V4 followed by V4 to V2 Opt |= _Remove2Op(Lut, cmsSigLabV2toV4, cmsSigLabV4toV2); // Remove float pcs Lab conversions Opt |= _Remove2Op(Lut, cmsSigLab2FloatPCS, cmsSigFloatPCS2Lab); // Remove float pcs Lab conversions Opt |= _Remove2Op(Lut, cmsSigXYZ2FloatPCS, cmsSigFloatPCS2XYZ); if (Opt) AnyOpt = TRUE; } while (Opt); return AnyOpt; } static void Eval16nop1D(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const struct _cms_interp_struc* p) { Output[0] = Input[0]; cmsUNUSED_PARAMETER(p); } static void PrelinEval16(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const void* D) { Prelin16Data* p16 = (Prelin16Data*) D; cmsUInt16Number StageABC[MAX_INPUT_DIMENSIONS]; cmsUInt16Number StageDEF[cmsMAXCHANNELS]; int i; for (i=0; i < p16 ->nInputs; i++) { p16 ->EvalCurveIn16[i](&Input[i], &StageABC[i], p16 ->ParamsCurveIn16[i]); } p16 ->EvalCLUT(StageABC, StageDEF, p16 ->CLUTparams); for (i=0; i < p16 ->nOutputs; i++) { p16 ->EvalCurveOut16[i](&StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]); } } static void PrelinOpt16free(cmsContext ContextID, void* ptr) { Prelin16Data* p16 = (Prelin16Data*) ptr; _cmsFree(ContextID, p16 ->EvalCurveOut16); _cmsFree(ContextID, p16 ->ParamsCurveOut16); _cmsFree(ContextID, p16); } static void* Prelin16dup(cmsContext ContextID, const void* ptr) { Prelin16Data* p16 = (Prelin16Data*) ptr; Prelin16Data* Duped = _cmsDupMem(ContextID, p16, sizeof(Prelin16Data)); if (Duped == NULL) return NULL; Duped ->EvalCurveOut16 = _cmsDupMem(ContextID, p16 ->EvalCurveOut16, p16 ->nOutputs * sizeof(_cmsInterpFn16)); Duped ->ParamsCurveOut16 = _cmsDupMem(ContextID, p16 ->ParamsCurveOut16, p16 ->nOutputs * sizeof(cmsInterpParams* )); return Duped; } static Prelin16Data* PrelinOpt16alloc(cmsContext ContextID, const cmsInterpParams* ColorMap, int nInputs, cmsToneCurve** In, int nOutputs, cmsToneCurve** Out ) { int i; Prelin16Data* p16 = _cmsMallocZero(ContextID, sizeof(Prelin16Data)); if (p16 == NULL) return NULL; p16 ->nInputs = nInputs; p16 -> nOutputs = nOutputs; for (i=0; i < nInputs; i++) { if (In == NULL) { p16 -> ParamsCurveIn16[i] = NULL; p16 -> EvalCurveIn16[i] = Eval16nop1D; } else { p16 -> ParamsCurveIn16[i] = In[i] ->InterpParams; p16 -> EvalCurveIn16[i] = p16 ->ParamsCurveIn16[i]->Interpolation.Lerp16; } } p16 ->CLUTparams = ColorMap; p16 ->EvalCLUT = ColorMap ->Interpolation.Lerp16; p16 -> EvalCurveOut16 = (_cmsInterpFn16*) _cmsCalloc(ContextID, nOutputs, sizeof(_cmsInterpFn16)); p16 -> ParamsCurveOut16 = (cmsInterpParams**) _cmsCalloc(ContextID, nOutputs, sizeof(cmsInterpParams* )); for (i=0; i < nOutputs; i++) { if (Out == NULL) { p16 ->ParamsCurveOut16[i] = NULL; p16 -> EvalCurveOut16[i] = Eval16nop1D; } else { p16 ->ParamsCurveOut16[i] = Out[i] ->InterpParams; p16 -> EvalCurveOut16[i] = p16 ->ParamsCurveOut16[i]->Interpolation.Lerp16; } } return p16; } // Resampling --------------------------------------------------------------------------------- #define PRELINEARIZATION_POINTS 4096 // Sampler implemented by another LUT. This is a clean way to precalculate the devicelink 3D CLUT for // almost any transform. We use floating point precision and then convert from floating point to 16 bits. static int XFormSampler16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { cmsPipeline* Lut = (cmsPipeline*) Cargo; cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS]; cmsUInt32Number i; _cmsAssert(Lut -> InputChannels < cmsMAXCHANNELS); _cmsAssert(Lut -> OutputChannels < cmsMAXCHANNELS); // From 16 bit to floating point for (i=0; i < Lut ->InputChannels; i++) InFloat[i] = (cmsFloat32Number) (In[i] / 65535.0); // Evaluate in floating point cmsPipelineEvalFloat(InFloat, OutFloat, Lut); // Back to 16 bits representation for (i=0; i < Lut ->OutputChannels; i++) Out[i] = _cmsQuickSaturateWord(OutFloat[i] * 65535.0); // Always succeed return TRUE; } // Try to see if the curves of a given MPE are linear static cmsBool AllCurvesAreLinear(cmsStage* mpe) { cmsToneCurve** Curves; cmsUInt32Number i, n; Curves = _cmsStageGetPtrToCurveSet(mpe); if (Curves == NULL) return FALSE; n = cmsStageOutputChannels(mpe); for (i=0; i < n; i++) { if (!cmsIsToneCurveLinear(Curves[i])) return FALSE; } return TRUE; } // This function replaces a specific node placed in "At" by the "Value" numbers. Its purpose // is to fix scum dot on broken profiles/transforms. Works on 1, 3 and 4 channels static cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[], int nChannelsOut, int nChannelsIn) { _cmsStageCLutData* Grid = (_cmsStageCLutData*) CLUT ->Data; cmsInterpParams* p16 = Grid ->Params; cmsFloat64Number px, py, pz, pw; int x0, y0, z0, w0; int i, index; if (CLUT -> Type != cmsSigCLutElemType) { cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) Attempt to PatchLUT on non-lut stage"); return FALSE; } if (nChannelsIn == 4) { px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0; pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0; pw = ((cmsFloat64Number) At[3] * (p16->Domain[3])) / 65535.0; x0 = (int) floor(px); y0 = (int) floor(py); z0 = (int) floor(pz); w0 = (int) floor(pw); if (((px - x0) != 0) || ((py - y0) != 0) || ((pz - z0) != 0) || ((pw - w0) != 0)) return FALSE; // Not on exact node index = p16 -> opta[3] * x0 + p16 -> opta[2] * y0 + p16 -> opta[1] * z0 + p16 -> opta[0] * w0; } else if (nChannelsIn == 3) { px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0; pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0; x0 = (int) floor(px); y0 = (int) floor(py); z0 = (int) floor(pz); if (((px - x0) != 0) || ((py - y0) != 0) || ((pz - z0) != 0)) return FALSE; // Not on exact node index = p16 -> opta[2] * x0 + p16 -> opta[1] * y0 + p16 -> opta[0] * z0; } else if (nChannelsIn == 1) { px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; x0 = (int) floor(px); if (((px - x0) != 0)) return FALSE; // Not on exact node index = p16 -> opta[0] * x0; } else { cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) %d Channels are not supported on PatchLUT", nChannelsIn); return FALSE; } for (i=0; i < nChannelsOut; i++) Grid -> Tab.T[index + i] = Value[i]; return TRUE; } // Auxiliar, to see if two values are equal or very different static cmsBool WhitesAreEqual(int n, cmsUInt16Number White1[], cmsUInt16Number White2[] ) { int i; for (i=0; i < n; i++) { if (abs(White1[i] - White2[i]) > 0xf000) return TRUE; // Values are so extremly different that the fixup should be avoided if (White1[i] != White2[i]) return FALSE; } return TRUE; } // Locate the node for the white point and fix it to pure white in order to avoid scum dot. static cmsBool FixWhiteMisalignment(cmsPipeline* Lut, cmsColorSpaceSignature EntryColorSpace, cmsColorSpaceSignature ExitColorSpace) { cmsUInt16Number *WhitePointIn, *WhitePointOut; cmsUInt16Number WhiteIn[cmsMAXCHANNELS], WhiteOut[cmsMAXCHANNELS], ObtainedOut[cmsMAXCHANNELS]; cmsUInt32Number i, nOuts, nIns; cmsStage *PreLin = NULL, *CLUT = NULL, *PostLin = NULL; if (!_cmsEndPointsBySpace(EntryColorSpace, &WhitePointIn, NULL, &nIns)) return FALSE; if (!_cmsEndPointsBySpace(ExitColorSpace, &WhitePointOut, NULL, &nOuts)) return FALSE; // It needs to be fixed? if (Lut ->InputChannels != nIns) return FALSE; if (Lut ->OutputChannels != nOuts) return FALSE; cmsPipelineEval16(WhitePointIn, ObtainedOut, Lut); if (WhitesAreEqual(nOuts, WhitePointOut, ObtainedOut)) return TRUE; // whites already match // Check if the LUT comes as Prelin, CLUT or Postlin. We allow all combinations if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &PreLin, &CLUT, &PostLin)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCurveSetElemType, cmsSigCLutElemType, &PreLin, &CLUT)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCLutElemType, cmsSigCurveSetElemType, &CLUT, &PostLin)) if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCLutElemType, &CLUT)) return FALSE; // We need to interpolate white points of both, pre and post curves if (PreLin) { cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PreLin); for (i=0; i < nIns; i++) { WhiteIn[i] = cmsEvalToneCurve16(Curves[i], WhitePointIn[i]); } } else { for (i=0; i < nIns; i++) WhiteIn[i] = WhitePointIn[i]; } // If any post-linearization, we need to find how is represented white before the curve, do // a reverse interpolation in this case. if (PostLin) { cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PostLin); for (i=0; i < nOuts; i++) { cmsToneCurve* InversePostLin = cmsReverseToneCurve(Curves[i]); if (InversePostLin == NULL) { WhiteOut[i] = WhitePointOut[i]; } else { WhiteOut[i] = cmsEvalToneCurve16(InversePostLin, WhitePointOut[i]); cmsFreeToneCurve(InversePostLin); } } } else { for (i=0; i < nOuts; i++) WhiteOut[i] = WhitePointOut[i]; } // Ok, proceed with patching. May fail and we don't care if it fails PatchLUT(CLUT, WhiteIn, WhiteOut, nOuts, nIns); return TRUE; } // ----------------------------------------------------------------------------------------------------------------------------------------------- // This function creates simple LUT from complex ones. The generated LUT has an optional set of // prelinearization curves, a CLUT of nGridPoints and optional postlinearization tables. // These curves have to exist in the original LUT in order to be used in the simplified output. // Caller may also use the flags to allow this feature. // LUTS with all curves will be simplified to a single curve. Parametric curves are lost. // This function should be used on 16-bits LUTS only, as floating point losses precision when simplified // ----------------------------------------------------------------------------------------------------------------------------------------------- static cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsPipeline* Src = NULL; cmsPipeline* Dest = NULL; cmsStage* mpe; cmsStage* CLUT; cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL; int nGridPoints; cmsColorSpaceSignature ColorSpace, OutputColorSpace; cmsStage *NewPreLin = NULL; cmsStage *NewPostLin = NULL; _cmsStageCLutData* DataCLUT; cmsToneCurve** DataSetIn; cmsToneCurve** DataSetOut; Prelin16Data* p16; // This is a loosy optimization! does not apply in floating-point cases if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; ColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*InputFormat)); OutputColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*OutputFormat)); nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags); // For empty LUTs, 2 points are enough if (cmsPipelineStageCount(*Lut) == 0) nGridPoints = 2; Src = *Lut; // Named color pipelines cannot be optimized either for (mpe = cmsPipelineGetPtrToFirstStage(Src); mpe != NULL; mpe = cmsStageNext(mpe)) { if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE; } // Allocate an empty LUT Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels); if (!Dest) return FALSE; // Prelinearization tables are kept unless indicated by flags if (*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION) { // Get a pointer to the prelinearization element cmsStage* PreLin = cmsPipelineGetPtrToFirstStage(Src); // Check if suitable if (PreLin ->Type == cmsSigCurveSetElemType) { // Maybe this is a linear tram, so we can avoid the whole stuff if (!AllCurvesAreLinear(PreLin)) { // All seems ok, proceed. NewPreLin = cmsStageDup(PreLin); if(!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin)) goto Error; // Remove prelinearization. Since we have duplicated the curve // in destination LUT, the sampling shoud be applied after this stage. cmsPipelineUnlinkStage(Src, cmsAT_BEGIN, &KeepPreLin); } } } // Allocate the CLUT CLUT = cmsStageAllocCLut16bit(Src ->ContextID, nGridPoints, Src ->InputChannels, Src->OutputChannels, NULL); if (CLUT == NULL) return FALSE; // Add the CLUT to the destination LUT if (!cmsPipelineInsertStage(Dest, cmsAT_END, CLUT)) { goto Error; } // Postlinearization tables are kept unless indicated by flags if (*dwFlags & cmsFLAGS_CLUT_POST_LINEARIZATION) { // Get a pointer to the postlinearization if present cmsStage* PostLin = cmsPipelineGetPtrToLastStage(Src); // Check if suitable if (cmsStageType(PostLin) == cmsSigCurveSetElemType) { // Maybe this is a linear tram, so we can avoid the whole stuff if (!AllCurvesAreLinear(PostLin)) { // All seems ok, proceed. NewPostLin = cmsStageDup(PostLin); if (!cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin)) goto Error; // In destination LUT, the sampling shoud be applied after this stage. cmsPipelineUnlinkStage(Src, cmsAT_END, &KeepPostLin); } } } // Now its time to do the sampling. We have to ignore pre/post linearization // The source LUT whithout pre/post curves is passed as parameter. if (!cmsStageSampleCLut16bit(CLUT, XFormSampler16, (void*) Src, 0)) { Error: // Ops, something went wrong, Restore stages if (KeepPreLin != NULL) { if (!cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin)) { _cmsAssert(0); // This never happens } } if (KeepPostLin != NULL) { if (!cmsPipelineInsertStage(Src, cmsAT_END, KeepPostLin)) { _cmsAssert(0); // This never happens } } cmsPipelineFree(Dest); return FALSE; } // Done. if (KeepPreLin != NULL) cmsStageFree(KeepPreLin); if (KeepPostLin != NULL) cmsStageFree(KeepPostLin); cmsPipelineFree(Src); DataCLUT = (_cmsStageCLutData*) CLUT ->Data; if (NewPreLin == NULL) DataSetIn = NULL; else DataSetIn = ((_cmsStageToneCurvesData*) NewPreLin ->Data) ->TheCurves; if (NewPostLin == NULL) DataSetOut = NULL; else DataSetOut = ((_cmsStageToneCurvesData*) NewPostLin ->Data) ->TheCurves; if (DataSetIn == NULL && DataSetOut == NULL) { _cmsPipelineSetOptimizationParameters(Dest, (_cmsOPTeval16Fn) DataCLUT->Params->Interpolation.Lerp16, DataCLUT->Params, NULL, NULL); } else { p16 = PrelinOpt16alloc(Dest ->ContextID, DataCLUT ->Params, Dest ->InputChannels, DataSetIn, Dest ->OutputChannels, DataSetOut); _cmsPipelineSetOptimizationParameters(Dest, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup); } // Don't fix white on absolute colorimetric if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP; if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) { FixWhiteMisalignment(Dest, ColorSpace, OutputColorSpace); } *Lut = Dest; return TRUE; cmsUNUSED_PARAMETER(Intent); } // ----------------------------------------------------------------------------------------------------------------------------------------------- // Fixes the gamma balancing of transform. This is described in my paper "Prelinearization Stages on // Color-Management Application-Specific Integrated Circuits (ASICs)" presented at NIP24. It only works // for RGB transforms. See the paper for more details // ----------------------------------------------------------------------------------------------------------------------------------------------- // Normalize endpoints by slope limiting max and min. This assures endpoints as well. // Descending curves are handled as well. static void SlopeLimiting(cmsToneCurve* g) { int BeginVal, EndVal; int AtBegin = (int) floor((cmsFloat64Number) g ->nEntries * 0.02 + 0.5); // Cutoff at 2% int AtEnd = g ->nEntries - AtBegin - 1; // And 98% cmsFloat64Number Val, Slope, beta; int i; if (cmsIsToneCurveDescending(g)) { BeginVal = 0xffff; EndVal = 0; } else { BeginVal = 0; EndVal = 0xffff; } // Compute slope and offset for begin of curve Val = g ->Table16[AtBegin]; Slope = (Val - BeginVal) / AtBegin; beta = Val - Slope * AtBegin; for (i=0; i < AtBegin; i++) g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta); // Compute slope and offset for the end Val = g ->Table16[AtEnd]; Slope = (EndVal - Val) / AtBegin; // AtBegin holds the X interval, which is same in both cases beta = Val - Slope * AtEnd; for (i = AtEnd; i < (int) g ->nEntries; i++) g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta); } // Precomputes tables for 8-bit on input devicelink. static Prelin8Data* PrelinOpt8alloc(cmsContext ContextID, const cmsInterpParams* p, cmsToneCurve* G[3]) { int i; cmsUInt16Number Input[3]; cmsS15Fixed16Number v1, v2, v3; Prelin8Data* p8; p8 = _cmsMallocZero(ContextID, sizeof(Prelin8Data)); if (p8 == NULL) return NULL; // Since this only works for 8 bit input, values comes always as x * 257, // we can safely take msb byte (x << 8 + x) for (i=0; i < 256; i++) { if (G != NULL) { // Get 16-bit representation Input[0] = cmsEvalToneCurve16(G[0], FROM_8_TO_16(i)); Input[1] = cmsEvalToneCurve16(G[1], FROM_8_TO_16(i)); Input[2] = cmsEvalToneCurve16(G[2], FROM_8_TO_16(i)); } else { Input[0] = FROM_8_TO_16(i); Input[1] = FROM_8_TO_16(i); Input[2] = FROM_8_TO_16(i); } // Move to 0..1.0 in fixed domain v1 = _cmsToFixedDomain(Input[0] * p -> Domain[0]); v2 = _cmsToFixedDomain(Input[1] * p -> Domain[1]); v3 = _cmsToFixedDomain(Input[2] * p -> Domain[2]); // Store the precalculated table of nodes p8 ->X0[i] = (p->opta[2] * FIXED_TO_INT(v1)); p8 ->Y0[i] = (p->opta[1] * FIXED_TO_INT(v2)); p8 ->Z0[i] = (p->opta[0] * FIXED_TO_INT(v3)); // Store the precalculated table of offsets p8 ->rx[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v1); p8 ->ry[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v2); p8 ->rz[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v3); } p8 ->ContextID = ContextID; p8 ->p = p; return p8; } static void Prelin8free(cmsContext ContextID, void* ptr) { _cmsFree(ContextID, ptr); } static void* Prelin8dup(cmsContext ContextID, const void* ptr) { return _cmsDupMem(ContextID, ptr, sizeof(Prelin8Data)); } // A optimized interpolation for 8-bit input. #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) static void PrelinEval8(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const void* D) { cmsUInt8Number r, g, b; cmsS15Fixed16Number rx, ry, rz; cmsS15Fixed16Number c0, c1, c2, c3, Rest; int OutChan; register cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; Prelin8Data* p8 = (Prelin8Data*) D; register const cmsInterpParams* p = p8 ->p; int TotalOut = p -> nOutputs; const cmsUInt16Number* LutTable = p -> Table; r = Input[0] >> 8; g = Input[1] >> 8; b = Input[2] >> 8; X0 = X1 = p8->X0[r]; Y0 = Y1 = p8->Y0[g]; Z0 = Z1 = p8->Z0[b]; rx = p8 ->rx[r]; ry = p8 ->ry[g]; rz = p8 ->rz[b]; X1 = X0 + ((rx == 0) ? 0 : p ->opta[2]); Y1 = Y0 + ((ry == 0) ? 0 : p ->opta[1]); Z1 = Z0 + ((rz == 0) ? 0 : p ->opta[0]); // These are the 6 Tetrahedral for (OutChan=0; OutChan < TotalOut; OutChan++) { c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; Output[OutChan] = (cmsUInt16Number)c0 + ((Rest + (Rest>>16))>>16); } } #undef DENS // Curves that contain wide empty areas are not optimizeable static cmsBool IsDegenerated(const cmsToneCurve* g) { int i, Zeros = 0, Poles = 0; int nEntries = g ->nEntries; for (i=0; i < nEntries; i++) { if (g ->Table16[i] == 0x0000) Zeros++; if (g ->Table16[i] == 0xffff) Poles++; } if (Zeros == 1 && Poles == 1) return FALSE; // For linear tables if (Zeros > (nEntries / 4)) return TRUE; // Degenerated, mostly zeros if (Poles > (nEntries / 4)) return TRUE; // Degenerated, mostly poles return FALSE; } // -------------------------------------------------------------------------------------------------------------- // We need xput over here static cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsPipeline* OriginalLut; int nGridPoints; cmsToneCurve *Trans[cmsMAXCHANNELS], *TransReverse[cmsMAXCHANNELS]; cmsUInt32Number t, i; cmsFloat32Number v, In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS]; cmsBool lIsSuitable, lIsLinear; cmsPipeline* OptimizedLUT = NULL, *LutPlusCurves = NULL; cmsStage* OptimizedCLUTmpe; cmsColorSpaceSignature ColorSpace, OutputColorSpace; cmsStage* OptimizedPrelinMpe; cmsStage* mpe; cmsToneCurve** OptimizedPrelinCurves; _cmsStageCLutData* OptimizedPrelinCLUT; // This is a loosy optimization! does not apply in floating-point cases if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; // Only on RGB if (T_COLORSPACE(*InputFormat) != PT_RGB) return FALSE; if (T_COLORSPACE(*OutputFormat) != PT_RGB) return FALSE; // On 16 bits, user has to specify the feature if (!_cmsFormatterIs8bit(*InputFormat)) { if (!(*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION)) return FALSE; } OriginalLut = *Lut; // Named color pipelines cannot be optimized either for (mpe = cmsPipelineGetPtrToFirstStage(OriginalLut); mpe != NULL; mpe = cmsStageNext(mpe)) { if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE; } ColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*InputFormat)); OutputColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*OutputFormat)); nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags); // Empty gamma containers memset(Trans, 0, sizeof(Trans)); memset(TransReverse, 0, sizeof(TransReverse)); for (t = 0; t < OriginalLut ->InputChannels; t++) { Trans[t] = cmsBuildTabulatedToneCurve16(OriginalLut ->ContextID, PRELINEARIZATION_POINTS, NULL); if (Trans[t] == NULL) goto Error; } // Populate the curves for (i=0; i < PRELINEARIZATION_POINTS; i++) { v = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1)); // Feed input with a gray ramp for (t=0; t < OriginalLut ->InputChannels; t++) In[t] = v; // Evaluate the gray value cmsPipelineEvalFloat(In, Out, OriginalLut); // Store result in curve for (t=0; t < OriginalLut ->InputChannels; t++) Trans[t] ->Table16[i] = _cmsQuickSaturateWord(Out[t] * 65535.0); } // Slope-limit the obtained curves for (t = 0; t < OriginalLut ->InputChannels; t++) SlopeLimiting(Trans[t]); // Check for validity lIsSuitable = TRUE; lIsLinear = TRUE; for (t=0; (lIsSuitable && (t < OriginalLut ->InputChannels)); t++) { // Exclude if already linear if (!cmsIsToneCurveLinear(Trans[t])) lIsLinear = FALSE; // Exclude if non-monotonic if (!cmsIsToneCurveMonotonic(Trans[t])) lIsSuitable = FALSE; if (IsDegenerated(Trans[t])) lIsSuitable = FALSE; } // If it is not suitable, just quit if (!lIsSuitable) goto Error; // Invert curves if possible for (t = 0; t < OriginalLut ->InputChannels; t++) { TransReverse[t] = cmsReverseToneCurveEx(PRELINEARIZATION_POINTS, Trans[t]); if (TransReverse[t] == NULL) goto Error; } // Now inset the reversed curves at the begin of transform LutPlusCurves = cmsPipelineDup(OriginalLut); if (LutPlusCurves == NULL) goto Error; if (!cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse))) goto Error; // Create the result LUT OptimizedLUT = cmsPipelineAlloc(OriginalLut ->ContextID, OriginalLut ->InputChannels, OriginalLut ->OutputChannels); if (OptimizedLUT == NULL) goto Error; OptimizedPrelinMpe = cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, Trans); // Create and insert the curves at the beginning if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe)) goto Error; // Allocate the CLUT for result OptimizedCLUTmpe = cmsStageAllocCLut16bit(OriginalLut ->ContextID, nGridPoints, OriginalLut ->InputChannels, OriginalLut ->OutputChannels, NULL); // Add the CLUT to the destination LUT if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe)) goto Error; // Resample the LUT if (!cmsStageSampleCLut16bit(OptimizedCLUTmpe, XFormSampler16, (void*) LutPlusCurves, 0)) goto Error; // Free resources for (t = 0; t < OriginalLut ->InputChannels; t++) { if (Trans[t]) cmsFreeToneCurve(Trans[t]); if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]); } cmsPipelineFree(LutPlusCurves); OptimizedPrelinCurves = _cmsStageGetPtrToCurveSet(OptimizedPrelinMpe); OptimizedPrelinCLUT = (_cmsStageCLutData*) OptimizedCLUTmpe ->Data; // Set the evaluator if 8-bit if (_cmsFormatterIs8bit(*InputFormat)) { Prelin8Data* p8 = PrelinOpt8alloc(OptimizedLUT ->ContextID, OptimizedPrelinCLUT ->Params, OptimizedPrelinCurves); if (p8 == NULL) return FALSE; _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval8, (void*) p8, Prelin8free, Prelin8dup); } else { Prelin16Data* p16 = PrelinOpt16alloc(OptimizedLUT ->ContextID, OptimizedPrelinCLUT ->Params, 3, OptimizedPrelinCurves, 3, NULL); if (p16 == NULL) return FALSE; _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup); } // Don't fix white on absolute colorimetric if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP; if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) { if (!FixWhiteMisalignment(OptimizedLUT, ColorSpace, OutputColorSpace)) { return FALSE; } } // And return the obtained LUT cmsPipelineFree(OriginalLut); *Lut = OptimizedLUT; return TRUE; Error: for (t = 0; t < OriginalLut ->InputChannels; t++) { if (Trans[t]) cmsFreeToneCurve(Trans[t]); if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]); } if (LutPlusCurves != NULL) cmsPipelineFree(LutPlusCurves); if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT); return FALSE; cmsUNUSED_PARAMETER(Intent); } // Curves optimizer ------------------------------------------------------------------------------------------------------------------ static void CurvesFree(cmsContext ContextID, void* ptr) { Curves16Data* Data = (Curves16Data*) ptr; int i; for (i=0; i < Data -> nCurves; i++) { _cmsFree(ContextID, Data ->Curves[i]); } _cmsFree(ContextID, Data ->Curves); _cmsFree(ContextID, ptr); } static void* CurvesDup(cmsContext ContextID, const void* ptr) { Curves16Data* Data = _cmsDupMem(ContextID, ptr, sizeof(Curves16Data)); int i; if (Data == NULL) return NULL; Data ->Curves = _cmsDupMem(ContextID, Data ->Curves, Data ->nCurves * sizeof(cmsUInt16Number*)); for (i=0; i < Data -> nCurves; i++) { Data ->Curves[i] = _cmsDupMem(ContextID, Data ->Curves[i], Data -> nElements * sizeof(cmsUInt16Number)); } return (void*) Data; } // Precomputes tables for 8-bit on input devicelink. static Curves16Data* CurvesAlloc(cmsContext ContextID, int nCurves, int nElements, cmsToneCurve** G) { int i, j; Curves16Data* c16; c16 = _cmsMallocZero(ContextID, sizeof(Curves16Data)); if (c16 == NULL) return NULL; c16 ->nCurves = nCurves; c16 ->nElements = nElements; c16 ->Curves = _cmsCalloc(ContextID, nCurves, sizeof(cmsUInt16Number*)); if (c16 ->Curves == NULL) return NULL; for (i=0; i < nCurves; i++) { c16->Curves[i] = _cmsCalloc(ContextID, nElements, sizeof(cmsUInt16Number)); if (c16->Curves[i] == NULL) { for (j=0; j < i; j++) { _cmsFree(ContextID, c16->Curves[j]); } _cmsFree(ContextID, c16->Curves); _cmsFree(ContextID, c16); return NULL; } if (nElements == 256) { for (j=0; j < nElements; j++) { c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], FROM_8_TO_16(j)); } } else { for (j=0; j < nElements; j++) { c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], (cmsUInt16Number) j); } } } return c16; } static void FastEvaluateCurves8(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register const void* D) { Curves16Data* Data = (Curves16Data*) D; cmsUInt8Number x; int i; for (i=0; i < Data ->nCurves; i++) { x = (In[i] >> 8); Out[i] = Data -> Curves[i][x]; } } static void FastEvaluateCurves16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register const void* D) { Curves16Data* Data = (Curves16Data*) D; int i; for (i=0; i < Data ->nCurves; i++) { Out[i] = Data -> Curves[i][In[i]]; } } static void FastIdentity16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register const void* D) { cmsPipeline* Lut = (cmsPipeline*) D; cmsUInt32Number i; for (i=0; i < Lut ->InputChannels; i++) { Out[i] = In[i]; } } // If the target LUT holds only curves, the optimization procedure is to join all those // curves together. That only works on curves and does not work on matrices. static cmsBool OptimizeByJoiningCurves(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsToneCurve** GammaTables = NULL; cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS]; cmsUInt32Number i, j; cmsPipeline* Src = *Lut; cmsPipeline* Dest = NULL; cmsStage* mpe; cmsStage* ObtainedCurves = NULL; // This is a loosy optimization! does not apply in floating-point cases if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; // Only curves in this LUT? for (mpe = cmsPipelineGetPtrToFirstStage(Src); mpe != NULL; mpe = cmsStageNext(mpe)) { if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE; } // Allocate an empty LUT Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels); if (Dest == NULL) return FALSE; // Create target curves GammaTables = (cmsToneCurve**) _cmsCalloc(Src ->ContextID, Src ->InputChannels, sizeof(cmsToneCurve*)); if (GammaTables == NULL) goto Error; for (i=0; i < Src ->InputChannels; i++) { GammaTables[i] = cmsBuildTabulatedToneCurve16(Src ->ContextID, PRELINEARIZATION_POINTS, NULL); if (GammaTables[i] == NULL) goto Error; } // Compute 16 bit result by using floating point for (i=0; i < PRELINEARIZATION_POINTS; i++) { for (j=0; j < Src ->InputChannels; j++) InFloat[j] = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1)); cmsPipelineEvalFloat(InFloat, OutFloat, Src); for (j=0; j < Src ->InputChannels; j++) GammaTables[j] -> Table16[i] = _cmsQuickSaturateWord(OutFloat[j] * 65535.0); } ObtainedCurves = cmsStageAllocToneCurves(Src ->ContextID, Src ->InputChannels, GammaTables); if (ObtainedCurves == NULL) goto Error; for (i=0; i < Src ->InputChannels; i++) { cmsFreeToneCurve(GammaTables[i]); GammaTables[i] = NULL; } if (GammaTables != NULL) _cmsFree(Src ->ContextID, GammaTables); // Maybe the curves are linear at the end if (!AllCurvesAreLinear(ObtainedCurves)) { if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves)) goto Error; // If the curves are to be applied in 8 bits, we can save memory if (_cmsFormatterIs8bit(*InputFormat)) { _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) ObtainedCurves ->Data; Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 256, Data ->TheCurves); if (c16 == NULL) goto Error; *dwFlags |= cmsFLAGS_NOCACHE; _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves8, c16, CurvesFree, CurvesDup); } else { _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves); Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 65536, Data ->TheCurves); if (c16 == NULL) goto Error; *dwFlags |= cmsFLAGS_NOCACHE; _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves16, c16, CurvesFree, CurvesDup); } } else { // LUT optimizes to nothing. Set the identity LUT cmsStageFree(ObtainedCurves); if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels))) goto Error; *dwFlags |= cmsFLAGS_NOCACHE; _cmsPipelineSetOptimizationParameters(Dest, FastIdentity16, (void*) Dest, NULL, NULL); } // We are done. cmsPipelineFree(Src); *Lut = Dest; return TRUE; Error: if (ObtainedCurves != NULL) cmsStageFree(ObtainedCurves); if (GammaTables != NULL) { for (i=0; i < Src ->InputChannels; i++) { if (GammaTables[i] != NULL) cmsFreeToneCurve(GammaTables[i]); } _cmsFree(Src ->ContextID, GammaTables); } if (Dest != NULL) cmsPipelineFree(Dest); return FALSE; cmsUNUSED_PARAMETER(Intent); cmsUNUSED_PARAMETER(InputFormat); cmsUNUSED_PARAMETER(OutputFormat); cmsUNUSED_PARAMETER(dwFlags); } // ------------------------------------------------------------------------------------------------------------------------------------- // LUT is Shaper - Matrix - Matrix - Shaper, which is very frequent when combining two matrix-shaper profiles static void FreeMatShaper(cmsContext ContextID, void* Data) { if (Data != NULL) _cmsFree(ContextID, Data); } static void* DupMatShaper(cmsContext ContextID, const void* Data) { return _cmsDupMem(ContextID, Data, sizeof(MatShaper8Data)); } // A fast matrix-shaper evaluator for 8 bits. This is a bit ticky since I'm using 1.14 signed fixed point // to accomplish some performance. Actually it takes 256x3 16 bits tables and 16385 x 3 tables of 8 bits, // in total about 50K, and the performance boost is huge! static void MatShaperEval16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register const void* D) { MatShaper8Data* p = (MatShaper8Data*) D; cmsS1Fixed14Number l1, l2, l3, r, g, b; cmsUInt32Number ri, gi, bi; // In this case (and only in this case!) we can use this simplification since // In[] is assured to come from a 8 bit number. (a << 8 | a) ri = In[0] & 0xFF; gi = In[1] & 0xFF; bi = In[2] & 0xFF; // Across first shaper, which also converts to 1.14 fixed point r = p->Shaper1R[ri]; g = p->Shaper1G[gi]; b = p->Shaper1B[bi]; // Evaluate the matrix in 1.14 fixed point l1 = (p->Mat[0][0] * r + p->Mat[0][1] * g + p->Mat[0][2] * b + p->Off[0] + 0x2000) >> 14; l2 = (p->Mat[1][0] * r + p->Mat[1][1] * g + p->Mat[1][2] * b + p->Off[1] + 0x2000) >> 14; l3 = (p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b + p->Off[2] + 0x2000) >> 14; // Now we have to clip to 0..1.0 range ri = (l1 < 0) ? 0 : ((l1 > 16384) ? 16384 : l1); gi = (l2 < 0) ? 0 : ((l2 > 16384) ? 16384 : l2); bi = (l3 < 0) ? 0 : ((l3 > 16384) ? 16384 : l3); // And across second shaper, Out[0] = p->Shaper2R[ri]; Out[1] = p->Shaper2G[gi]; Out[2] = p->Shaper2B[bi]; } // This table converts from 8 bits to 1.14 after applying the curve static void FillFirstShaper(cmsS1Fixed14Number* Table, cmsToneCurve* Curve) { int i; cmsFloat32Number R, y; for (i=0; i < 256; i++) { R = (cmsFloat32Number) (i / 255.0); y = cmsEvalToneCurveFloat(Curve, R); Table[i] = DOUBLE_TO_1FIXED14(y); } } // This table converts form 1.14 (being 0x4000 the last entry) to 8 bits after applying the curve static void FillSecondShaper(cmsUInt16Number* Table, cmsToneCurve* Curve, cmsBool Is8BitsOutput) { int i; cmsFloat32Number R, Val; for (i=0; i < 16385; i++) { R = (cmsFloat32Number) (i / 16384.0); Val = cmsEvalToneCurveFloat(Curve, R); // Val comes 0..1.0 if (Is8BitsOutput) { // If 8 bits output, we can optimize further by computing the / 257 part. // first we compute the resulting byte and then we store the byte times // 257. This quantization allows to round very quick by doing a >> 8, but // since the low byte is always equal to msb, we can do a & 0xff and this works! cmsUInt16Number w = _cmsQuickSaturateWord(Val * 65535.0); cmsUInt8Number b = FROM_16_TO_8(w); Table[i] = FROM_8_TO_16(b); } else Table[i] = _cmsQuickSaturateWord(Val * 65535.0); } } // Compute the matrix-shaper structure static cmsBool SetMatShaper(cmsPipeline* Dest, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3], cmsUInt32Number* OutputFormat) { MatShaper8Data* p; int i, j; cmsBool Is8Bits = _cmsFormatterIs8bit(*OutputFormat); // Allocate a big chuck of memory to store precomputed tables p = (MatShaper8Data*) _cmsMalloc(Dest ->ContextID, sizeof(MatShaper8Data)); if (p == NULL) return FALSE; p -> ContextID = Dest -> ContextID; // Precompute tables FillFirstShaper(p ->Shaper1R, Curve1[0]); FillFirstShaper(p ->Shaper1G, Curve1[1]); FillFirstShaper(p ->Shaper1B, Curve1[2]); FillSecondShaper(p ->Shaper2R, Curve2[0], Is8Bits); FillSecondShaper(p ->Shaper2G, Curve2[1], Is8Bits); FillSecondShaper(p ->Shaper2B, Curve2[2], Is8Bits); // Convert matrix to nFixed14. Note that those values may take more than 16 bits as for (i=0; i < 3; i++) { for (j=0; j < 3; j++) { p ->Mat[i][j] = DOUBLE_TO_1FIXED14(Mat->v[i].n[j]); } } for (i=0; i < 3; i++) { if (Off == NULL) { p ->Off[i] = 0; } else { p ->Off[i] = DOUBLE_TO_1FIXED14(Off->n[i]); } } // Mark as optimized for faster formatter if (Is8Bits) *OutputFormat |= OPTIMIZED_SH(1); // Fill function pointers _cmsPipelineSetOptimizationParameters(Dest, MatShaperEval16, (void*) p, FreeMatShaper, DupMatShaper); return TRUE; } // 8 bits on input allows matrix-shaper boot up to 25 Mpixels per second on RGB. That's fast! // TODO: Allow a third matrix for abs. colorimetric static cmsBool OptimizeMatrixShaper(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsStage* Curve1, *Curve2; cmsStage* Matrix1, *Matrix2; _cmsStageMatrixData* Data1; _cmsStageMatrixData* Data2; cmsMAT3 res; cmsBool IdentityMat; cmsPipeline* Dest, *Src; // Only works on RGB to RGB if (T_CHANNELS(*InputFormat) != 3 || T_CHANNELS(*OutputFormat) != 3) return FALSE; // Only works on 8 bit input if (!_cmsFormatterIs8bit(*InputFormat)) return FALSE; // Seems suitable, proceed Src = *Lut; // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for if (!cmsPipelineCheckAndRetreiveStages(Src, 4, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE; // Get both matrices Data1 = (_cmsStageMatrixData*) cmsStageData(Matrix1); Data2 = (_cmsStageMatrixData*) cmsStageData(Matrix2); // Input offset should be zero if (Data1 ->Offset != NULL) return FALSE; // Multiply both matrices to get the result _cmsMAT3per(&res, (cmsMAT3*) Data2 ->Double, (cmsMAT3*) Data1 ->Double); // Now the result is in res + Data2 -> Offset. Maybe is a plain identity? IdentityMat = FALSE; if (_cmsMAT3isIdentity(&res) && Data2 ->Offset == NULL) { // We can get rid of full matrix IdentityMat = TRUE; } // Allocate an empty LUT Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels); if (!Dest) return FALSE; // Assamble the new LUT if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1))) goto Error; if (!IdentityMat) if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest ->ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset))) goto Error; if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2))) goto Error; // If identity on matrix, we can further optimize the curves, so call the join curves routine if (IdentityMat) { OptimizeByJoiningCurves(&Dest, Intent, InputFormat, OutputFormat, dwFlags); } else { _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1); _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2); // In this particular optimization, cach does not help as it takes more time to deal with // the cach that with the pixel handling *dwFlags |= cmsFLAGS_NOCACHE; // Setup the optimizarion routines SetMatShaper(Dest, mpeC1 ->TheCurves, &res, (cmsVEC3*) Data2 ->Offset, mpeC2->TheCurves, OutputFormat); } cmsPipelineFree(Src); *Lut = Dest; return TRUE; Error: // Leave Src unchanged cmsPipelineFree(Dest); return FALSE; } // ------------------------------------------------------------------------------------------------------------------------------------- // Optimization plug-ins // List of optimizations typedef struct _cmsOptimizationCollection_st { _cmsOPToptimizeFn OptimizePtr; struct _cmsOptimizationCollection_st *Next; } _cmsOptimizationCollection; // The built-in list. We currently implement 4 types of optimizations. Joining of curves, matrix-shaper, linearization and resampling static _cmsOptimizationCollection DefaultOptimization[] = { { OptimizeByJoiningCurves, &DefaultOptimization[1] }, { OptimizeMatrixShaper, &DefaultOptimization[2] }, { OptimizeByComputingLinearization, &DefaultOptimization[3] }, { OptimizeByResampling, NULL } }; // The linked list head _cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupPluginOptimizationList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsOptimizationPluginChunkType newHead = { NULL }; _cmsOptimizationCollection* entry; _cmsOptimizationCollection* Anterior = NULL; _cmsOptimizationPluginChunkType* head = (_cmsOptimizationPluginChunkType*) src->chunks[OptimizationPlugin]; _cmsAssert(ctx != NULL); _cmsAssert(head != NULL); // Walk the list copying all nodes for (entry = head->OptimizationCollection; entry != NULL; entry = entry ->Next) { _cmsOptimizationCollection *newEntry = ( _cmsOptimizationCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsOptimizationCollection)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.OptimizationCollection == NULL) newHead.OptimizationCollection = newEntry; } ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsOptimizationPluginChunkType)); } void _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { // Copy all linked list DupPluginOptimizationList(ctx, src); } else { static _cmsOptimizationPluginChunkType OptimizationPluginChunkType = { NULL }; ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx ->MemPool, &OptimizationPluginChunkType, sizeof(_cmsOptimizationPluginChunkType)); } } // Register new ways to optimize cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Data) { cmsPluginOptimization* Plugin = (cmsPluginOptimization*) Data; _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin); _cmsOptimizationCollection* fl; if (Data == NULL) { ctx->OptimizationCollection = NULL; return TRUE; } // Optimizer callback is required if (Plugin ->OptimizePtr == NULL) return FALSE; fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsOptimizationCollection)); if (fl == NULL) return FALSE; // Copy the parameters fl ->OptimizePtr = Plugin ->OptimizePtr; // Keep linked list fl ->Next = ctx->OptimizationCollection; // Set the head ctx ->OptimizationCollection = fl; // All is ok return TRUE; } // The entry point for LUT optimization cmsBool _cmsOptimizePipeline(cmsContext ContextID, cmsPipeline** PtrLut, int Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin); _cmsOptimizationCollection* Opts; cmsBool AnySuccess = FALSE; // A CLUT is being asked, so force this specific optimization if (*dwFlags & cmsFLAGS_FORCE_CLUT) { PreOptimize(*PtrLut); return OptimizeByResampling(PtrLut, Intent, InputFormat, OutputFormat, dwFlags); } // Anything to optimize? if ((*PtrLut) ->Elements == NULL) { _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL); return TRUE; } // Try to get rid of identities and trivial conversions. AnySuccess = PreOptimize(*PtrLut); // After removal do we end with an identity? if ((*PtrLut) ->Elements == NULL) { _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL); return TRUE; } // Do not optimize, keep all precision if (*dwFlags & cmsFLAGS_NOOPTIMIZE) return FALSE; // Try plug-in optimizations for (Opts = ctx->OptimizationCollection; Opts != NULL; Opts = Opts ->Next) { // If one schema succeeded, we are done if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) { return TRUE; // Optimized! } } // Try built-in optimizations for (Opts = DefaultOptimization; Opts != NULL; Opts = Opts ->Next) { if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) { return TRUE; } } // Only simple optimizations succeeded return AnySuccess; } lcms2-2.6/src/cmsgamma.c0000644002406300000240000011063312311617072014452 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2013 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Tone curves are powerful constructs that can contain curves specified in diverse ways. // The curve is stored in segments, where each segment can be sampled or specified by parameters. // a 16.bit simplification of the *whole* curve is kept for optimization purposes. For float operation, // each segment is evaluated separately. Plug-ins may be used to define new parametric schemes, // each plug-in may define up to MAX_TYPES_IN_LCMS_PLUGIN functions types. For defining a function, // the plug-in should provide the type id, how many parameters each type has, and a pointer to // a procedure that evaluates the function. In the case of reverse evaluation, the evaluator will // be called with the type id as a negative value, and a sampled version of the reversed curve // will be built. // ----------------------------------------------------------------- Implementation // Maxim number of nodes #define MAX_NODES_IN_CURVE 4097 #define MINUS_INF (-1E22F) #define PLUS_INF (+1E22F) // The list of supported parametric curves typedef struct _cmsParametricCurvesCollection_st { int nFunctions; // Number of supported functions in this chunk int FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN]; // The identification types int ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN]; // Number of parameters for each function cmsParametricCurveEvaluator Evaluator; // The evaluator struct _cmsParametricCurvesCollection_st* Next; // Next in list } _cmsParametricCurvesCollection; // This is the default (built-in) evaluator static cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R); // The built-in list static _cmsParametricCurvesCollection DefaultCurves = { 9, // # of curve types { 1, 2, 3, 4, 5, 6, 7, 8, 108 }, // Parametric curve ID { 1, 3, 4, 5, 7, 4, 5, 5, 1 }, // Parameters by type DefaultEvalParametricFn, // Evaluator NULL // Next in chain }; // Duplicates the zone of memory used by the plug-in in the new context static void DupPluginCurvesList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsCurvesPluginChunkType newHead = { NULL }; _cmsParametricCurvesCollection* entry; _cmsParametricCurvesCollection* Anterior = NULL; _cmsCurvesPluginChunkType* head = (_cmsCurvesPluginChunkType*) src->chunks[CurvesPlugin]; _cmsAssert(head != NULL); // Walk the list copying all nodes for (entry = head->ParametricCurves; entry != NULL; entry = entry ->Next) { _cmsParametricCurvesCollection *newEntry = ( _cmsParametricCurvesCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsParametricCurvesCollection)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.ParametricCurves == NULL) newHead.ParametricCurves = newEntry; } ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsCurvesPluginChunkType)); } // The allocator have to follow the chain void _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsAssert(ctx != NULL); if (src != NULL) { // Copy all linked list DupPluginCurvesList(ctx, src); } else { static _cmsCurvesPluginChunkType CurvesPluginChunk = { NULL }; ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx ->MemPool, &CurvesPluginChunk, sizeof(_cmsCurvesPluginChunkType)); } } // The linked list head _cmsCurvesPluginChunkType _cmsCurvesPluginChunk = { NULL }; // As a way to install new parametric curves cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Data) { _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin); cmsPluginParametricCurves* Plugin = (cmsPluginParametricCurves*) Data; _cmsParametricCurvesCollection* fl; if (Data == NULL) { ctx -> ParametricCurves = NULL; return TRUE; } fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsParametricCurvesCollection)); if (fl == NULL) return FALSE; // Copy the parameters fl ->Evaluator = Plugin ->Evaluator; fl ->nFunctions = Plugin ->nFunctions; // Make sure no mem overwrites if (fl ->nFunctions > MAX_TYPES_IN_LCMS_PLUGIN) fl ->nFunctions = MAX_TYPES_IN_LCMS_PLUGIN; // Copy the data memmove(fl->FunctionTypes, Plugin ->FunctionTypes, fl->nFunctions * sizeof(cmsUInt32Number)); memmove(fl->ParameterCount, Plugin ->ParameterCount, fl->nFunctions * sizeof(cmsUInt32Number)); // Keep linked list fl ->Next = ctx->ParametricCurves; ctx->ParametricCurves = fl; // All is ok return TRUE; } // Search in type list, return position or -1 if not found static int IsInSet(int Type, _cmsParametricCurvesCollection* c) { int i; for (i=0; i < c ->nFunctions; i++) if (abs(Type) == c ->FunctionTypes[i]) return i; return -1; } // Search for the collection which contains a specific type static _cmsParametricCurvesCollection *GetParametricCurveByType(cmsContext ContextID, int Type, int* index) { _cmsParametricCurvesCollection* c; int Position; _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin); for (c = ctx->ParametricCurves; c != NULL; c = c ->Next) { Position = IsInSet(Type, c); if (Position != -1) { if (index != NULL) *index = Position; return c; } } // If none found, revert for defaults for (c = &DefaultCurves; c != NULL; c = c ->Next) { Position = IsInSet(Type, c); if (Position != -1) { if (index != NULL) *index = Position; return c; } } return NULL; } // Low level allocate, which takes care of memory details. nEntries may be zero, and in this case // no optimation curve is computed. nSegments may also be zero in the inverse case, where only the // optimization curve is given. Both features simultaneously is an error static cmsToneCurve* AllocateToneCurveStruct(cmsContext ContextID, cmsInt32Number nEntries, cmsInt32Number nSegments, const cmsCurveSegment* Segments, const cmsUInt16Number* Values) { cmsToneCurve* p; int i; // We allow huge tables, which are then restricted for smoothing operations if (nEntries > 65530 || nEntries < 0) { cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't create tone curve of more than 65530 entries"); return NULL; } if (nEntries <= 0 && nSegments <= 0) { cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't create tone curve with zero segments and no table"); return NULL; } // Allocate all required pointers, etc. p = (cmsToneCurve*) _cmsMallocZero(ContextID, sizeof(cmsToneCurve)); if (!p) return NULL; // In this case, there are no segments if (nSegments <= 0) { p ->Segments = NULL; p ->Evals = NULL; } else { p ->Segments = (cmsCurveSegment*) _cmsCalloc(ContextID, nSegments, sizeof(cmsCurveSegment)); if (p ->Segments == NULL) goto Error; p ->Evals = (cmsParametricCurveEvaluator*) _cmsCalloc(ContextID, nSegments, sizeof(cmsParametricCurveEvaluator)); if (p ->Evals == NULL) goto Error; } p -> nSegments = nSegments; // This 16-bit table contains a limited precision representation of the whole curve and is kept for // increasing xput on certain operations. if (nEntries <= 0) { p ->Table16 = NULL; } else { p ->Table16 = (cmsUInt16Number*) _cmsCalloc(ContextID, nEntries, sizeof(cmsUInt16Number)); if (p ->Table16 == NULL) goto Error; } p -> nEntries = nEntries; // Initialize members if requested if (Values != NULL && (nEntries > 0)) { for (i=0; i < nEntries; i++) p ->Table16[i] = Values[i]; } // Initialize the segments stuff. The evaluator for each segment is located and a pointer to it // is placed in advance to maximize performance. if (Segments != NULL && (nSegments > 0)) { _cmsParametricCurvesCollection *c; p ->SegInterp = (cmsInterpParams**) _cmsCalloc(ContextID, nSegments, sizeof(cmsInterpParams*)); if (p ->SegInterp == NULL) goto Error; for (i=0; i< nSegments; i++) { // Type 0 is a special marker for table-based curves if (Segments[i].Type == 0) p ->SegInterp[i] = _cmsComputeInterpParams(ContextID, Segments[i].nGridPoints, 1, 1, NULL, CMS_LERP_FLAGS_FLOAT); memmove(&p ->Segments[i], &Segments[i], sizeof(cmsCurveSegment)); if (Segments[i].Type == 0 && Segments[i].SampledPoints != NULL) p ->Segments[i].SampledPoints = (cmsFloat32Number*) _cmsDupMem(ContextID, Segments[i].SampledPoints, sizeof(cmsFloat32Number) * Segments[i].nGridPoints); else p ->Segments[i].SampledPoints = NULL; c = GetParametricCurveByType(ContextID, Segments[i].Type, NULL); if (c != NULL) p ->Evals[i] = c ->Evaluator; } } p ->InterpParams = _cmsComputeInterpParams(ContextID, p ->nEntries, 1, 1, p->Table16, CMS_LERP_FLAGS_16BITS); if (p->InterpParams != NULL) return p; Error: if (p -> Segments) _cmsFree(ContextID, p ->Segments); if (p -> Evals) _cmsFree(ContextID, p -> Evals); if (p ->Table16) _cmsFree(ContextID, p ->Table16); _cmsFree(ContextID, p); return NULL; } // Parametric Fn using floating point static cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R) { cmsFloat64Number e, Val, disc; switch (Type) { // X = Y ^ Gamma case 1: if (R < 0) { if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE) Val = R; else Val = 0; } else Val = pow(R, Params[0]); break; // Type 1 Reversed: X = Y ^1/gamma case -1: if (R < 0) { if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE) Val = R; else Val = 0; } else Val = pow(R, 1/Params[0]); break; // CIE 122-1966 // Y = (aX + b)^Gamma | X >= -b/a // Y = 0 | else case 2: disc = -Params[2] / Params[1]; if (R >= disc ) { e = Params[1]*R + Params[2]; if (e > 0) Val = pow(e, Params[0]); else Val = 0; } else Val = 0; break; // Type 2 Reversed // X = (Y ^1/g - b) / a case -2: if (R < 0) Val = 0; else Val = (pow(R, 1.0/Params[0]) - Params[2]) / Params[1]; if (Val < 0) Val = 0; break; // IEC 61966-3 // Y = (aX + b)^Gamma | X <= -b/a // Y = c | else case 3: disc = -Params[2] / Params[1]; if (disc < 0) disc = 0; if (R >= disc) { e = Params[1]*R + Params[2]; if (e > 0) Val = pow(e, Params[0]) + Params[3]; else Val = 0; } else Val = Params[3]; break; // Type 3 reversed // X=((Y-c)^1/g - b)/a | (Y>=c) // X=-b/a | (Y= Params[3]) { e = R - Params[3]; if (e > 0) Val = (pow(e, 1/Params[0]) - Params[2]) / Params[1]; else Val = 0; } else { Val = -Params[2] / Params[1]; } break; // IEC 61966-2.1 (sRGB) // Y = (aX + b)^Gamma | X >= d // Y = cX | X < d case 4: if (R >= Params[4]) { e = Params[1]*R + Params[2]; if (e > 0) Val = pow(e, Params[0]); else Val = 0; } else Val = R * Params[3]; break; // Type 4 reversed // X=((Y^1/g-b)/a) | Y >= (ad+b)^g // X=Y/c | Y< (ad+b)^g case -4: e = Params[1] * Params[4] + Params[2]; if (e < 0) disc = 0; else disc = pow(e, Params[0]); if (R >= disc) { Val = (pow(R, 1.0/Params[0]) - Params[2]) / Params[1]; } else { Val = R / Params[3]; } break; // Y = (aX + b)^Gamma + e | X >= d // Y = cX + f | X < d case 5: if (R >= Params[4]) { e = Params[1]*R + Params[2]; if (e > 0) Val = pow(e, Params[0]) + Params[5]; else Val = Params[5]; } else Val = R*Params[3] + Params[6]; break; // Reversed type 5 // X=((Y-e)1/g-b)/a | Y >=(ad+b)^g+e), cd+f // X=(Y-f)/c | else case -5: disc = Params[3] * Params[4] + Params[6]; if (R >= disc) { e = R - Params[5]; if (e < 0) Val = 0; else Val = (pow(e, 1.0/Params[0]) - Params[2]) / Params[1]; } else { Val = (R - Params[6]) / Params[3]; } break; // Types 6,7,8 comes from segmented curves as described in ICCSpecRevision_02_11_06_Float.pdf // Type 6 is basically identical to type 5 without d // Y = (a * X + b) ^ Gamma + c case 6: e = Params[1]*R + Params[2]; if (e < 0) Val = Params[3]; else Val = pow(e, Params[0]) + Params[3]; break; // ((Y - c) ^1/Gamma - b) / a case -6: e = R - Params[3]; if (e < 0) Val = 0; else Val = (pow(e, 1.0/Params[0]) - Params[2]) / Params[1]; break; // Y = a * log (b * X^Gamma + c) + d case 7: e = Params[2] * pow(R, Params[0]) + Params[3]; if (e <= 0) Val = Params[4]; else Val = Params[1]*log10(e) + Params[4]; break; // (Y - d) / a = log(b * X ^Gamma + c) // pow(10, (Y-d) / a) = b * X ^Gamma + c // pow((pow(10, (Y-d) / a) - c) / b, 1/g) = X case -7: Val = pow((pow(10.0, (R-Params[4]) / Params[1]) - Params[3]) / Params[2], 1.0 / Params[0]); break; //Y = a * b^(c*X+d) + e case 8: Val = (Params[0] * pow(Params[1], Params[2] * R + Params[3]) + Params[4]); break; // Y = (log((y-e) / a) / log(b) - d ) / c // a=0, b=1, c=2, d=3, e=4, case -8: disc = R - Params[4]; if (disc < 0) Val = 0; else Val = (log(disc / Params[0]) / log(Params[1]) - Params[3]) / Params[2]; break; // S-Shaped: (1 - (1-x)^1/g)^1/g case 108: Val = pow(1.0 - pow(1 - R, 1/Params[0]), 1/Params[0]); break; // y = (1 - (1-x)^1/g)^1/g // y^g = (1 - (1-x)^1/g) // 1 - y^g = (1-x)^1/g // (1 - y^g)^g = 1 - x // 1 - (1 - y^g)^g case -108: Val = 1 - pow(1 - pow(R, Params[0]), Params[0]); break; default: // Unsupported parametric curve. Should never reach here return 0; } return Val; } // Evaluate a segmented funtion for a single value. Return -1 if no valid segment found . // If fn type is 0, perform an interpolation on the table static cmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R) { int i; for (i = g ->nSegments-1; i >= 0 ; --i) { // Check for domain if ((R > g ->Segments[i].x0) && (R <= g ->Segments[i].x1)) { // Type == 0 means segment is sampled if (g ->Segments[i].Type == 0) { cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0) / (g ->Segments[i].x1 - g ->Segments[i].x0); cmsFloat32Number Out; // Setup the table (TODO: clean that) g ->SegInterp[i]-> Table = g ->Segments[i].SampledPoints; g ->SegInterp[i] -> Interpolation.LerpFloat(&R1, &Out, g ->SegInterp[i]); return Out; } else return g ->Evals[i](g->Segments[i].Type, g ->Segments[i].Params, R); } } return MINUS_INF; } // Access to estimated low-res table cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t) { _cmsAssert(t != NULL); return t ->nEntries; } const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t) { _cmsAssert(t != NULL); return t ->Table16; } // Create an empty gamma curve, by using tables. This specifies only the limited-precision part, and leaves the // floating point description empty. cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsInt32Number nEntries, const cmsUInt16Number Values[]) { return AllocateToneCurveStruct(ContextID, nEntries, 0, NULL, Values); } static int EntriesByGamma(cmsFloat64Number Gamma) { if (fabs(Gamma - 1.0) < 0.001) return 2; return 4096; } // Create a segmented gamma, fill the table cmsToneCurve* CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID, cmsInt32Number nSegments, const cmsCurveSegment Segments[]) { int i; cmsFloat64Number R, Val; cmsToneCurve* g; int nGridPoints = 4096; _cmsAssert(Segments != NULL); // Optimizatin for identity curves. if (nSegments == 1 && Segments[0].Type == 1) { nGridPoints = EntriesByGamma(Segments[0].Params[0]); } g = AllocateToneCurveStruct(ContextID, nGridPoints, nSegments, Segments, NULL); if (g == NULL) return NULL; // Once we have the floating point version, we can approximate a 16 bit table of 4096 entries // for performance reasons. This table would normally not be used except on 8/16 bits transforms. for (i=0; i < nGridPoints; i++) { R = (cmsFloat64Number) i / (nGridPoints-1); Val = EvalSegmentedFn(g, R); // Round and saturate g ->Table16[i] = _cmsQuickSaturateWord(Val * 65535.0); } return g; } // Use a segmented curve to store the floating point table cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[]) { cmsCurveSegment Seg[3]; // A segmented tone curve should have function segments in the first and last positions // Initialize segmented curve part up to 0 to constant value = samples[0] Seg[0].x0 = MINUS_INF; Seg[0].x1 = 0; Seg[0].Type = 6; Seg[0].Params[0] = 1; Seg[0].Params[1] = 0; Seg[0].Params[2] = 0; Seg[0].Params[3] = values[0]; Seg[0].Params[4] = 0; // From zero to 1 Seg[1].x0 = 0; Seg[1].x1 = 1.0; Seg[1].Type = 0; Seg[1].nGridPoints = nEntries; Seg[1].SampledPoints = (cmsFloat32Number*) values; // Final segment is constant = lastsample Seg[2].x0 = 1.0; Seg[2].x1 = PLUS_INF; Seg[2].Type = 6; Seg[2].Params[0] = 1; Seg[2].Params[1] = 0; Seg[2].Params[2] = 0; Seg[2].Params[3] = values[nEntries-1]; Seg[2].Params[4] = 0; return cmsBuildSegmentedToneCurve(ContextID, 3, Seg); } // Parametric curves // // Parameters goes as: Curve, a, b, c, d, e, f // Type is the ICC type +1 // if type is negative, then the curve is analyticaly inverted cmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[]) { cmsCurveSegment Seg0; int Pos = 0; cmsUInt32Number size; _cmsParametricCurvesCollection* c = GetParametricCurveByType(ContextID, Type, &Pos); _cmsAssert(Params != NULL); if (c == NULL) { cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Invalid parametric curve type %d", Type); return NULL; } memset(&Seg0, 0, sizeof(Seg0)); Seg0.x0 = MINUS_INF; Seg0.x1 = PLUS_INF; Seg0.Type = Type; size = c->ParameterCount[Pos] * sizeof(cmsFloat64Number); memmove(Seg0.Params, Params, size); return cmsBuildSegmentedToneCurve(ContextID, 1, &Seg0); } // Build a gamma table based on gamma constant cmsToneCurve* CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma) { return cmsBuildParametricToneCurve(ContextID, 1, &Gamma); } // Free all memory taken by the gamma curve void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve) { cmsContext ContextID; if (Curve == NULL) return; ContextID = Curve ->InterpParams->ContextID; _cmsFreeInterpParams(Curve ->InterpParams); if (Curve -> Table16) _cmsFree(ContextID, Curve ->Table16); if (Curve ->Segments) { cmsUInt32Number i; for (i=0; i < Curve ->nSegments; i++) { if (Curve ->Segments[i].SampledPoints) { _cmsFree(ContextID, Curve ->Segments[i].SampledPoints); } if (Curve ->SegInterp[i] != 0) _cmsFreeInterpParams(Curve->SegInterp[i]); } _cmsFree(ContextID, Curve ->Segments); _cmsFree(ContextID, Curve ->SegInterp); } if (Curve -> Evals) _cmsFree(ContextID, Curve -> Evals); if (Curve) _cmsFree(ContextID, Curve); } // Utility function, free 3 gamma tables void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3]) { _cmsAssert(Curve != NULL); if (Curve[0] != NULL) cmsFreeToneCurve(Curve[0]); if (Curve[1] != NULL) cmsFreeToneCurve(Curve[1]); if (Curve[2] != NULL) cmsFreeToneCurve(Curve[2]); Curve[0] = Curve[1] = Curve[2] = NULL; } // Duplicate a gamma table cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* In) { if (In == NULL) return NULL; return AllocateToneCurveStruct(In ->InterpParams ->ContextID, In ->nEntries, In ->nSegments, In ->Segments, In ->Table16); } // Joins two curves for X and Y. Curves should be monotonic. // We want to get // // y = Y^-1(X(t)) // cmsToneCurve* CMSEXPORT cmsJoinToneCurve(cmsContext ContextID, const cmsToneCurve* X, const cmsToneCurve* Y, cmsUInt32Number nResultingPoints) { cmsToneCurve* out = NULL; cmsToneCurve* Yreversed = NULL; cmsFloat32Number t, x; cmsFloat32Number* Res = NULL; cmsUInt32Number i; _cmsAssert(X != NULL); _cmsAssert(Y != NULL); Yreversed = cmsReverseToneCurveEx(nResultingPoints, Y); if (Yreversed == NULL) goto Error; Res = (cmsFloat32Number*) _cmsCalloc(ContextID, nResultingPoints, sizeof(cmsFloat32Number)); if (Res == NULL) goto Error; //Iterate for (i=0; i < nResultingPoints; i++) { t = (cmsFloat32Number) i / (nResultingPoints-1); x = cmsEvalToneCurveFloat(X, t); Res[i] = cmsEvalToneCurveFloat(Yreversed, x); } // Allocate space for output out = cmsBuildTabulatedToneCurveFloat(ContextID, nResultingPoints, Res); Error: if (Res != NULL) _cmsFree(ContextID, Res); if (Yreversed != NULL) cmsFreeToneCurve(Yreversed); return out; } // Get the surrounding nodes. This is tricky on non-monotonic tables static int GetInterval(cmsFloat64Number In, const cmsUInt16Number LutTable[], const struct _cms_interp_struc* p) { int i; int y0, y1; // A 1 point table is not allowed if (p -> Domain[0] < 1) return -1; // Let's see if ascending or descending. if (LutTable[0] < LutTable[p ->Domain[0]]) { // Table is overall ascending for (i=p->Domain[0]-1; i >=0; --i) { y0 = LutTable[i]; y1 = LutTable[i+1]; if (y0 <= y1) { // Increasing if (In >= y0 && In <= y1) return i; } else if (y1 < y0) { // Decreasing if (In >= y1 && In <= y0) return i; } } } else { // Table is overall descending for (i=0; i < (int) p -> Domain[0]; i++) { y0 = LutTable[i]; y1 = LutTable[i+1]; if (y0 <= y1) { // Increasing if (In >= y0 && In <= y1) return i; } else if (y1 < y0) { // Decreasing if (In >= y1 && In <= y0) return i; } } } return -1; } // Reverse a gamma table cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, const cmsToneCurve* InCurve) { cmsToneCurve *out; cmsFloat64Number a = 0, b = 0, y, x1, y1, x2, y2; int i, j; int Ascending; _cmsAssert(InCurve != NULL); // Try to reverse it analytically whatever possible if (InCurve ->nSegments == 1 && InCurve ->Segments[0].Type > 0 && /* InCurve -> Segments[0].Type <= 5 */ GetParametricCurveByType(InCurve ->InterpParams->ContextID, InCurve ->Segments[0].Type, NULL) != NULL) { return cmsBuildParametricToneCurve(InCurve ->InterpParams->ContextID, -(InCurve -> Segments[0].Type), InCurve -> Segments[0].Params); } // Nope, reverse the table. out = cmsBuildTabulatedToneCurve16(InCurve ->InterpParams->ContextID, nResultSamples, NULL); if (out == NULL) return NULL; // We want to know if this is an ascending or descending table Ascending = !cmsIsToneCurveDescending(InCurve); // Iterate across Y axis for (i=0; i < nResultSamples; i++) { y = (cmsFloat64Number) i * 65535.0 / (nResultSamples - 1); // Find interval in which y is within. j = GetInterval(y, InCurve->Table16, InCurve->InterpParams); if (j >= 0) { // Get limits of interval x1 = InCurve ->Table16[j]; x2 = InCurve ->Table16[j+1]; y1 = (cmsFloat64Number) (j * 65535.0) / (InCurve ->nEntries - 1); y2 = (cmsFloat64Number) ((j+1) * 65535.0 ) / (InCurve ->nEntries - 1); // If collapsed, then use any if (x1 == x2) { out ->Table16[i] = _cmsQuickSaturateWord(Ascending ? y2 : y1); continue; } else { // Interpolate a = (y2 - y1) / (x2 - x1); b = y2 - a * x2; } } out ->Table16[i] = _cmsQuickSaturateWord(a* y + b); } return out; } // Reverse a gamma table cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma) { _cmsAssert(InGamma != NULL); return cmsReverseToneCurveEx(4096, InGamma); } // From: Eilers, P.H.C. (1994) Smoothing and interpolation with finite // differences. in: Graphic Gems IV, Heckbert, P.S. (ed.), Academic press. // // Smoothing and interpolation with second differences. // // Input: weights (w), data (y): vector from 1 to m. // Input: smoothing parameter (lambda), length (m). // Output: smoothed vector (z): vector from 1 to m. static cmsBool smooth2(cmsContext ContextID, cmsFloat32Number w[], cmsFloat32Number y[], cmsFloat32Number z[], cmsFloat32Number lambda, int m) { int i, i1, i2; cmsFloat32Number *c, *d, *e; cmsBool st; c = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number)); d = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number)); e = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number)); if (c != NULL && d != NULL && e != NULL) { d[1] = w[1] + lambda; c[1] = -2 * lambda / d[1]; e[1] = lambda /d[1]; z[1] = w[1] * y[1]; d[2] = w[2] + 5 * lambda - d[1] * c[1] * c[1]; c[2] = (-4 * lambda - d[1] * c[1] * e[1]) / d[2]; e[2] = lambda / d[2]; z[2] = w[2] * y[2] - c[1] * z[1]; for (i = 3; i < m - 1; i++) { i1 = i - 1; i2 = i - 2; d[i]= w[i] + 6 * lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2]; c[i] = (-4 * lambda -d[i1] * c[i1] * e[i1])/ d[i]; e[i] = lambda / d[i]; z[i] = w[i] * y[i] - c[i1] * z[i1] - e[i2] * z[i2]; } i1 = m - 2; i2 = m - 3; d[m - 1] = w[m - 1] + 5 * lambda -c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2]; c[m - 1] = (-2 * lambda - d[i1] * c[i1] * e[i1]) / d[m - 1]; z[m - 1] = w[m - 1] * y[m - 1] - c[i1] * z[i1] - e[i2] * z[i2]; i1 = m - 1; i2 = m - 2; d[m] = w[m] + lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2]; z[m] = (w[m] * y[m] - c[i1] * z[i1] - e[i2] * z[i2]) / d[m]; z[m - 1] = z[m - 1] / d[m - 1] - c[m - 1] * z[m]; for (i = m - 2; 1<= i; i--) z[i] = z[i] / d[i] - c[i] * z[i + 1] - e[i] * z[i + 2]; st = TRUE; } else st = FALSE; if (c != NULL) _cmsFree(ContextID, c); if (d != NULL) _cmsFree(ContextID, d); if (e != NULL) _cmsFree(ContextID, e); return st; } // Smooths a curve sampled at regular intervals. cmsBool CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda) { cmsFloat32Number w[MAX_NODES_IN_CURVE], y[MAX_NODES_IN_CURVE], z[MAX_NODES_IN_CURVE]; int i, nItems, Zeros, Poles; if (Tab == NULL) return FALSE; if (cmsIsToneCurveLinear(Tab)) return TRUE; // Nothing to do nItems = Tab -> nEntries; if (nItems >= MAX_NODES_IN_CURVE) { cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: too many points."); return FALSE; } memset(w, 0, nItems * sizeof(cmsFloat32Number)); memset(y, 0, nItems * sizeof(cmsFloat32Number)); memset(z, 0, nItems * sizeof(cmsFloat32Number)); for (i=0; i < nItems; i++) { y[i+1] = (cmsFloat32Number) Tab -> Table16[i]; w[i+1] = 1.0; } if (!smooth2(Tab ->InterpParams->ContextID, w, y, z, (cmsFloat32Number) lambda, nItems)) return FALSE; // Do some reality - checking... Zeros = Poles = 0; for (i=nItems; i > 1; --i) { if (z[i] == 0.) Zeros++; if (z[i] >= 65535.) Poles++; if (z[i] < z[i-1]) { cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Non-Monotonic."); return FALSE; } } if (Zeros > (nItems / 3)) { cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly zeros."); return FALSE; } if (Poles > (nItems / 3)) { cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly poles."); return FALSE; } // Seems ok for (i=0; i < nItems; i++) { // Clamp to cmsUInt16Number Tab -> Table16[i] = _cmsQuickSaturateWord(z[i+1]); } return TRUE; } // Is a table linear? Do not use parametric since we cannot guarantee some weird parameters resulting // in a linear table. This way assures it is linear in 12 bits, which should be enought in most cases. cmsBool CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve) { cmsUInt32Number i; int diff; _cmsAssert(Curve != NULL); for (i=0; i < Curve ->nEntries; i++) { diff = abs((int) Curve->Table16[i] - (int) _cmsQuantizeVal(i, Curve ->nEntries)); if (diff > 0x0f) return FALSE; } return TRUE; } // Same, but for monotonicity cmsBool CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t) { int n; int i, last; cmsBool lDescending; _cmsAssert(t != NULL); // Degenerated curves are monotonic? Ok, let's pass them n = t ->nEntries; if (n < 2) return TRUE; // Curve direction lDescending = cmsIsToneCurveDescending(t); if (lDescending) { last = t ->Table16[0]; for (i = 1; i < n; i++) { if (t ->Table16[i] - last > 2) // We allow some ripple return FALSE; else last = t ->Table16[i]; } } else { last = t ->Table16[n-1]; for (i = n-2; i >= 0; --i) { if (t ->Table16[i] - last > 2) return FALSE; else last = t ->Table16[i]; } } return TRUE; } // Same, but for descending tables cmsBool CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t) { _cmsAssert(t != NULL); return t ->Table16[0] > t ->Table16[t ->nEntries-1]; } // Another info fn: is out gamma table multisegment? cmsBool CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* t) { _cmsAssert(t != NULL); return t -> nSegments > 1; } cmsInt32Number CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t) { _cmsAssert(t != NULL); if (t -> nSegments != 1) return 0; return t ->Segments[0].Type; } // We need accuracy this time cmsFloat32Number CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v) { _cmsAssert(Curve != NULL); // Check for 16 bits table. If so, this is a limited-precision tone curve if (Curve ->nSegments == 0) { cmsUInt16Number In, Out; In = (cmsUInt16Number) _cmsQuickSaturateWord(v * 65535.0); Out = cmsEvalToneCurve16(Curve, In); return (cmsFloat32Number) (Out / 65535.0); } return (cmsFloat32Number) EvalSegmentedFn(Curve, v); } // We need xput over here cmsUInt16Number CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v) { cmsUInt16Number out; _cmsAssert(Curve != NULL); Curve ->InterpParams ->Interpolation.Lerp16(&v, &out, Curve ->InterpParams); return out; } // Least squares fitting. // A mathematical procedure for finding the best-fitting curve to a given set of points by // minimizing the sum of the squares of the offsets ("the residuals") of the points from the curve. // The sum of the squares of the offsets is used instead of the offset absolute values because // this allows the residuals to be treated as a continuous differentiable quantity. // // y = f(x) = x ^ g // // R = (yi - (xi^g)) // R2 = (yi - (xi^g))2 // SUM R2 = SUM (yi - (xi^g))2 // // dR2/dg = -2 SUM x^g log(x)(y - x^g) // solving for dR2/dg = 0 // // g = 1/n * SUM(log(y) / log(x)) cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision) { cmsFloat64Number gamma, sum, sum2; cmsFloat64Number n, x, y, Std; cmsUInt32Number i; _cmsAssert(t != NULL); sum = sum2 = n = 0; // Excluding endpoints for (i=1; i < (MAX_NODES_IN_CURVE-1); i++) { x = (cmsFloat64Number) i / (MAX_NODES_IN_CURVE-1); y = (cmsFloat64Number) cmsEvalToneCurveFloat(t, (cmsFloat32Number) x); // Avoid 7% on lower part to prevent // artifacts due to linear ramps if (y > 0. && y < 1. && x > 0.07) { gamma = log(y) / log(x); sum += gamma; sum2 += gamma * gamma; n++; } } // Take a look on SD to see if gamma isn't exponential at all Std = sqrt((n * sum2 - sum * sum) / (n*(n-1))); if (Std > Precision) return -1.0; return (sum / n); // The mean } lcms2-2.6/src/cmsintrp.c0000644002406300000240000012621712311617072014531 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // This module incorporates several interpolation routines, for 1 to 8 channels on input and // up to 65535 channels on output. The user may change those by using the interpolation plug-in // Interpolation routines by default static cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags); // This is the default factory _cmsInterpPluginChunkType _cmsInterpPluginChunk = { NULL }; // The interpolation plug-in memory chunk allocator/dup void _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { void* from; _cmsAssert(ctx != NULL); if (src != NULL) { from = src ->chunks[InterpPlugin]; } else { static _cmsInterpPluginChunkType InterpPluginChunk = { NULL }; from = &InterpPluginChunk; } _cmsAssert(from != NULL); ctx ->chunks[InterpPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsInterpPluginChunkType)); } // Main plug-in entry cmsBool _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Data) { cmsPluginInterpolation* Plugin = (cmsPluginInterpolation*) Data; _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin); if (Data == NULL) { ptr ->Interpolators = NULL; return TRUE; } // Set replacement functions ptr ->Interpolators = Plugin ->InterpolatorsFactory; return TRUE; } // Set the interpolation method cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p) { _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin); p ->Interpolation.Lerp16 = NULL; // Invoke factory, possibly in the Plug-in if (ptr ->Interpolators != NULL) p ->Interpolation = ptr->Interpolators(p -> nInputs, p ->nOutputs, p ->dwFlags); // If unsupported by the plug-in, go for the LittleCMS default. // If happens only if an extern plug-in is being used if (p ->Interpolation.Lerp16 == NULL) p ->Interpolation = DefaultInterpolatorsFactory(p ->nInputs, p ->nOutputs, p ->dwFlags); // Check for valid interpolator (we just check one member of the union) if (p ->Interpolation.Lerp16 == NULL) { return FALSE; } return TRUE; } // This function precalculates as many parameters as possible to speed up the interpolation. cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], int InputChan, int OutputChan, const void *Table, cmsUInt32Number dwFlags) { cmsInterpParams* p; int i; // Check for maximum inputs if (InputChan > MAX_INPUT_DIMENSIONS) { cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", InputChan, MAX_INPUT_DIMENSIONS); return NULL; } // Creates an empty object p = (cmsInterpParams*) _cmsMallocZero(ContextID, sizeof(cmsInterpParams)); if (p == NULL) return NULL; // Keep original parameters p -> dwFlags = dwFlags; p -> nInputs = InputChan; p -> nOutputs = OutputChan; p ->Table = Table; p ->ContextID = ContextID; // Fill samples per input direction and domain (which is number of nodes minus one) for (i=0; i < InputChan; i++) { p -> nSamples[i] = nSamples[i]; p -> Domain[i] = nSamples[i] - 1; } // Compute factors to apply to each component to index the grid array p -> opta[0] = p -> nOutputs; for (i=1; i < InputChan; i++) p ->opta[i] = p ->opta[i-1] * nSamples[InputChan-i]; if (!_cmsSetInterpolationRoutine(ContextID, p)) { cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported interpolation (%d->%d channels)", InputChan, OutputChan); _cmsFree(ContextID, p); return NULL; } // All seems ok return p; } // This one is a wrapper on the anterior, but assuming all directions have same number of nodes cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags) { int i; cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS]; // Fill the auxiliar array for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Samples[i] = nSamples; // Call the extended function return _cmsComputeInterpParamsEx(ContextID, Samples, InputChan, OutputChan, Table, dwFlags); } // Free all associated memory void _cmsFreeInterpParams(cmsInterpParams* p) { if (p != NULL) _cmsFree(p ->ContextID, p); } // Inline fixed point interpolation cmsINLINE cmsUInt16Number LinearInterp(cmsS15Fixed16Number a, cmsS15Fixed16Number l, cmsS15Fixed16Number h) { cmsUInt32Number dif = (cmsUInt32Number) (h - l) * a + 0x8000; dif = (dif >> 16) + l; return (cmsUInt16Number) (dif); } // Linear interpolation (Fixed-point optimized) static void LinLerp1D(register const cmsUInt16Number Value[], register cmsUInt16Number Output[], register const cmsInterpParams* p) { cmsUInt16Number y1, y0; int cell0, rest; int val3; const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; // if last value... if (Value[0] == 0xffff) { Output[0] = LutTable[p -> Domain[0]]; return; } val3 = p -> Domain[0] * Value[0]; val3 = _cmsToFixedDomain(val3); // To fixed 15.16 cell0 = FIXED_TO_INT(val3); // Cell is 16 MSB bits rest = FIXED_REST_TO_INT(val3); // Rest is 16 LSB bits y0 = LutTable[cell0]; y1 = LutTable[cell0+1]; Output[0] = LinearInterp(rest, y0, y1); } // To prevent out of bounds indexing cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v) { return v < 0.0f ? 0.0f : (v > 1.0f ? 1.0f : v); } // Floating-point version of 1D interpolation static void LinLerp1Dfloat(const cmsFloat32Number Value[], cmsFloat32Number Output[], const cmsInterpParams* p) { cmsFloat32Number y1, y0; cmsFloat32Number val2, rest; int cell0, cell1; const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; val2 = fclamp(Value[0]); // if last value... if (val2 == 1.0) { Output[0] = LutTable[p -> Domain[0]]; return; } val2 *= p -> Domain[0]; cell0 = (int) floor(val2); cell1 = (int) ceil(val2); // Rest is 16 LSB bits rest = val2 - cell0; y0 = LutTable[cell0] ; y1 = LutTable[cell1] ; Output[0] = y0 + (y1 - y0) * rest; } // Eval gray LUT having only one input channel static void Eval1Input(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const cmsInterpParams* p16) { cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, k1, rk, K0, K1; int v; cmsUInt32Number OutChan; const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; v = Input[0] * p16 -> Domain[0]; fk = _cmsToFixedDomain(v); k0 = FIXED_TO_INT(fk); rk = (cmsUInt16Number) FIXED_REST_TO_INT(fk); k1 = k0 + (Input[0] != 0xFFFFU ? 1 : 0); K0 = p16 -> opta[0] * k0; K1 = p16 -> opta[0] * k1; for (OutChan=0; OutChan < p16->nOutputs; OutChan++) { Output[OutChan] = LinearInterp(rk, LutTable[K0+OutChan], LutTable[K1+OutChan]); } } // Eval gray LUT having only one input channel static void Eval1InputFloat(const cmsFloat32Number Value[], cmsFloat32Number Output[], const cmsInterpParams* p) { cmsFloat32Number y1, y0; cmsFloat32Number val2, rest; int cell0, cell1; cmsUInt32Number OutChan; const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; val2 = fclamp(Value[0]); // if last value... if (val2 == 1.0) { Output[0] = LutTable[p -> Domain[0]]; return; } val2 *= p -> Domain[0]; cell0 = (int) floor(val2); cell1 = (int) ceil(val2); // Rest is 16 LSB bits rest = val2 - cell0; cell0 *= p -> opta[0]; cell1 *= p -> opta[0]; for (OutChan=0; OutChan < p->nOutputs; OutChan++) { y0 = LutTable[cell0 + OutChan] ; y1 = LutTable[cell1 + OutChan] ; Output[OutChan] = y0 + (y1 - y0) * rest; } } // Bilinear interpolation (16 bits) - cmsFloat32Number version static void BilinearInterpFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { # define LERP(a,l,h) (cmsFloat32Number) ((l)+(((h)-(l))*(a))) # define DENS(i,j) (LutTable[(i)+(j)+OutChan]) const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; cmsFloat32Number px, py; int x0, y0, X0, Y0, X1, Y1; int TotalOut, OutChan; cmsFloat32Number fx, fy, d00, d01, d10, d11, dx0, dx1, dxy; TotalOut = p -> nOutputs; px = fclamp(Input[0]) * p->Domain[0]; py = fclamp(Input[1]) * p->Domain[1]; x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0; y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0; X0 = p -> opta[1] * x0; X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[1]); Y0 = p -> opta[0] * y0; Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[0]); for (OutChan = 0; OutChan < TotalOut; OutChan++) { d00 = DENS(X0, Y0); d01 = DENS(X0, Y1); d10 = DENS(X1, Y0); d11 = DENS(X1, Y1); dx0 = LERP(fx, d00, d10); dx1 = LERP(fx, d01, d11); dxy = LERP(fy, dx0, dx1); Output[OutChan] = dxy; } # undef LERP # undef DENS } // Bilinear interpolation (16 bits) - optimized version static void BilinearInterp16(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const cmsInterpParams* p) { #define DENS(i,j) (LutTable[(i)+(j)+OutChan]) #define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a))) const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; int OutChan, TotalOut; cmsS15Fixed16Number fx, fy; register int rx, ry; int x0, y0; register int X0, X1, Y0, Y1; int d00, d01, d10, d11, dx0, dx1, dxy; TotalOut = p -> nOutputs; fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); x0 = FIXED_TO_INT(fx); rx = FIXED_REST_TO_INT(fx); // Rest in 0..1.0 domain fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); y0 = FIXED_TO_INT(fy); ry = FIXED_REST_TO_INT(fy); X0 = p -> opta[1] * x0; X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[1]); Y0 = p -> opta[0] * y0; Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[0]); for (OutChan = 0; OutChan < TotalOut; OutChan++) { d00 = DENS(X0, Y0); d01 = DENS(X0, Y1); d10 = DENS(X1, Y0); d11 = DENS(X1, Y1); dx0 = LERP(rx, d00, d10); dx1 = LERP(rx, d01, d11); dxy = LERP(ry, dx0, dx1); Output[OutChan] = (cmsUInt16Number) dxy; } # undef LERP # undef DENS } // Trilinear interpolation (16 bits) - cmsFloat32Number version static void TrilinearInterpFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { # define LERP(a,l,h) (cmsFloat32Number) ((l)+(((h)-(l))*(a))) # define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; cmsFloat32Number px, py, pz; int x0, y0, z0, X0, Y0, Z0, X1, Y1, Z1; int TotalOut, OutChan; cmsFloat32Number fx, fy, fz, d000, d001, d010, d011, d100, d101, d110, d111, dx00, dx01, dx10, dx11, dxy0, dxy1, dxyz; TotalOut = p -> nOutputs; // We need some clipping here px = fclamp(Input[0]) * p->Domain[0]; py = fclamp(Input[1]) * p->Domain[1]; pz = fclamp(Input[2]) * p->Domain[2]; x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0; y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0; z0 = (int) _cmsQuickFloor(pz); fz = pz - (cmsFloat32Number) z0; X0 = p -> opta[2] * x0; X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[2]); Y0 = p -> opta[1] * y0; Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[1]); Z0 = p -> opta[0] * z0; Z1 = Z0 + (Input[2] >= 1.0 ? 0 : p->opta[0]); for (OutChan = 0; OutChan < TotalOut; OutChan++) { d000 = DENS(X0, Y0, Z0); d001 = DENS(X0, Y0, Z1); d010 = DENS(X0, Y1, Z0); d011 = DENS(X0, Y1, Z1); d100 = DENS(X1, Y0, Z0); d101 = DENS(X1, Y0, Z1); d110 = DENS(X1, Y1, Z0); d111 = DENS(X1, Y1, Z1); dx00 = LERP(fx, d000, d100); dx01 = LERP(fx, d001, d101); dx10 = LERP(fx, d010, d110); dx11 = LERP(fx, d011, d111); dxy0 = LERP(fy, dx00, dx10); dxy1 = LERP(fy, dx01, dx11); dxyz = LERP(fz, dxy0, dxy1); Output[OutChan] = dxyz; } # undef LERP # undef DENS } // Trilinear interpolation (16 bits) - optimized version static void TrilinearInterp16(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const cmsInterpParams* p) { #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) #define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a))) const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; int OutChan, TotalOut; cmsS15Fixed16Number fx, fy, fz; register int rx, ry, rz; int x0, y0, z0; register int X0, X1, Y0, Y1, Z0, Z1; int d000, d001, d010, d011, d100, d101, d110, d111, dx00, dx01, dx10, dx11, dxy0, dxy1, dxyz; TotalOut = p -> nOutputs; fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); x0 = FIXED_TO_INT(fx); rx = FIXED_REST_TO_INT(fx); // Rest in 0..1.0 domain fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); y0 = FIXED_TO_INT(fy); ry = FIXED_REST_TO_INT(fy); fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]); z0 = FIXED_TO_INT(fz); rz = FIXED_REST_TO_INT(fz); X0 = p -> opta[2] * x0; X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[2]); Y0 = p -> opta[1] * y0; Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[1]); Z0 = p -> opta[0] * z0; Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta[0]); for (OutChan = 0; OutChan < TotalOut; OutChan++) { d000 = DENS(X0, Y0, Z0); d001 = DENS(X0, Y0, Z1); d010 = DENS(X0, Y1, Z0); d011 = DENS(X0, Y1, Z1); d100 = DENS(X1, Y0, Z0); d101 = DENS(X1, Y0, Z1); d110 = DENS(X1, Y1, Z0); d111 = DENS(X1, Y1, Z1); dx00 = LERP(rx, d000, d100); dx01 = LERP(rx, d001, d101); dx10 = LERP(rx, d010, d110); dx11 = LERP(rx, d011, d111); dxy0 = LERP(ry, dx00, dx10); dxy1 = LERP(ry, dx01, dx11); dxyz = LERP(rz, dxy0, dxy1); Output[OutChan] = (cmsUInt16Number) dxyz; } # undef LERP # undef DENS } // Tetrahedral interpolation, using Sakamoto algorithm. #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) static void TetrahedralInterpFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; cmsFloat32Number px, py, pz; int x0, y0, z0, X0, Y0, Z0, X1, Y1, Z1; cmsFloat32Number rx, ry, rz; cmsFloat32Number c0, c1=0, c2=0, c3=0; int OutChan, TotalOut; TotalOut = p -> nOutputs; // We need some clipping here px = fclamp(Input[0]) * p->Domain[0]; py = fclamp(Input[1]) * p->Domain[1]; pz = fclamp(Input[2]) * p->Domain[2]; x0 = (int) _cmsQuickFloor(px); rx = (px - (cmsFloat32Number) x0); y0 = (int) _cmsQuickFloor(py); ry = (py - (cmsFloat32Number) y0); z0 = (int) _cmsQuickFloor(pz); rz = (pz - (cmsFloat32Number) z0); X0 = p -> opta[2] * x0; X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[2]); Y0 = p -> opta[1] * y0; Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[1]); Z0 = p -> opta[0] * z0; Z1 = Z0 + (Input[2] >= 1.0 ? 0 : p->opta[0]); for (OutChan=0; OutChan < TotalOut; OutChan++) { // These are the 6 Tetrahedral c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } Output[OutChan] = c0 + c1 * rx + c2 * ry + c3 * rz; } } #undef DENS static void TetrahedralInterp16(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const cmsInterpParams* p) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p -> Table; cmsS15Fixed16Number fx, fy, fz; cmsS15Fixed16Number rx, ry, rz; int x0, y0, z0; cmsS15Fixed16Number c0, c1, c2, c3, Rest; cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; cmsUInt32Number TotalOut = p -> nOutputs; fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]); x0 = FIXED_TO_INT(fx); y0 = FIXED_TO_INT(fy); z0 = FIXED_TO_INT(fz); rx = FIXED_REST_TO_INT(fx); ry = FIXED_REST_TO_INT(fy); rz = FIXED_REST_TO_INT(fz); X0 = p -> opta[2] * x0; X1 = (Input[0] == 0xFFFFU ? 0 : p->opta[2]); Y0 = p -> opta[1] * y0; Y1 = (Input[1] == 0xFFFFU ? 0 : p->opta[1]); Z0 = p -> opta[0] * z0; Z1 = (Input[2] == 0xFFFFU ? 0 : p->opta[0]); LutTable = &LutTable[X0+Y0+Z0]; // Output should be computed as x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)) // which expands as: x = (Rest + ((Rest+0x7fff)/0xFFFF) + 0x8000)>>16 // This can be replaced by: t = Rest+0x8001, x = (t + (t>>16))>>16 // at the cost of being off by one at 7fff and 17ffe. if (rx >= ry) { if (ry >= rz) { Y1 += X1; Z1 += Y1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c3 -= c2; c2 -= c1; c1 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } else if (rz >= rx) { X1 += Z1; Y1 += X1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c2 -= c1; c1 -= c3; c3 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } else { Z1 += X1; Y1 += Z1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c2 -= c3; c3 -= c1; c1 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } } else { if (rx >= rz) { X1 += Y1; Z1 += X1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c3 -= c1; c1 -= c2; c2 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } else if (ry >= rz) { Z1 += Y1; X1 += Z1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c1 -= c3; c3 -= c2; c2 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } else { Y1 += Z1; X1 += Y1; for (; TotalOut; TotalOut--) { c1 = LutTable[X1]; c2 = LutTable[Y1]; c3 = LutTable[Z1]; c0 = *LutTable++; c1 -= c2; c2 -= c3; c3 -= c0; Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); } } } } #define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) static void Eval4Inputs(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const cmsInterpParams* p16) { const cmsUInt16Number* LutTable; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1; cmsS15Fixed16Number fx, fy, fz; cmsS15Fixed16Number rx, ry, rz; int x0, y0, z0; cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; cmsUInt32Number i; cmsS15Fixed16Number c0, c1, c2, c3, Rest; cmsUInt32Number OutChan; cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; fk = _cmsToFixedDomain((int) Input[0] * p16 -> Domain[0]); fx = _cmsToFixedDomain((int) Input[1] * p16 -> Domain[1]); fy = _cmsToFixedDomain((int) Input[2] * p16 -> Domain[2]); fz = _cmsToFixedDomain((int) Input[3] * p16 -> Domain[3]); k0 = FIXED_TO_INT(fk); x0 = FIXED_TO_INT(fx); y0 = FIXED_TO_INT(fy); z0 = FIXED_TO_INT(fz); rk = FIXED_REST_TO_INT(fk); rx = FIXED_REST_TO_INT(fx); ry = FIXED_REST_TO_INT(fy); rz = FIXED_REST_TO_INT(fz); K0 = p16 -> opta[3] * k0; K1 = K0 + (Input[0] == 0xFFFFU ? 0 : p16->opta[3]); X0 = p16 -> opta[2] * x0; X1 = X0 + (Input[1] == 0xFFFFU ? 0 : p16->opta[2]); Y0 = p16 -> opta[1] * y0; Y1 = Y0 + (Input[2] == 0xFFFFU ? 0 : p16->opta[1]); Z0 = p16 -> opta[0] * z0; Z1 = Z0 + (Input[3] == 0xFFFFU ? 0 : p16->opta[0]); LutTable = (cmsUInt16Number*) p16 -> Table; LutTable += K0; for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) { c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } Rest = c1 * rx + c2 * ry + c3 * rz; Tmp1[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)); } LutTable = (cmsUInt16Number*) p16 -> Table; LutTable += K1; for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) { c0 = DENS(X0, Y0, Z0); if (rx >= ry && ry >= rz) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (rx >= rz && rz >= ry) { c1 = DENS(X1, Y0, Z0) - c0; c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); } else if (rz >= rx && rx >= ry) { c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else if (ry >= rx && rx >= rz) { c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); } else if (ry >= rz && rz >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z0) - c0; c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); } else if (rz >= ry && ry >= rx) { c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); c3 = DENS(X0, Y0, Z1) - c0; } else { c1 = c2 = c3 = 0; } Rest = c1 * rx + c2 * ry + c3 * rz; Tmp2[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)); } for (i=0; i < p16 -> nOutputs; i++) { Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]); } } #undef DENS // For more that 3 inputs (i.e., CMYK) // evaluate two 3-dimensional interpolations and then linearly interpolate between them. static void Eval4InputsFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; cmsFloat32Number rest; cmsFloat32Number pk; int k0, K0, K1; const cmsFloat32Number* T; cmsUInt32Number i; cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; cmsInterpParams p1; pk = fclamp(Input[0]) * p->Domain[0]; k0 = _cmsQuickFloor(pk); rest = pk - (cmsFloat32Number) k0; K0 = p -> opta[3] * k0; K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[3]); p1 = *p; memmove(&p1.Domain[0], &p ->Domain[1], 3*sizeof(cmsUInt32Number)); T = LutTable + K0; p1.Table = T; TetrahedralInterpFloat(Input + 1, Tmp1, &p1); T = LutTable + K1; p1.Table = T; TetrahedralInterpFloat(Input + 1, Tmp2, &p1); for (i=0; i < p -> nOutputs; i++) { cmsFloat32Number y0 = Tmp1[i]; cmsFloat32Number y1 = Tmp2[i]; Output[i] = y0 + (y1 - y0) * rest; } } static void Eval5Inputs(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1; const cmsUInt16Number* T; cmsUInt32Number i; cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; cmsInterpParams p1; fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); k0 = FIXED_TO_INT(fk); rk = FIXED_REST_TO_INT(fk); K0 = p16 -> opta[4] * k0; K1 = p16 -> opta[4] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0)); p1 = *p16; memmove(&p1.Domain[0], &p16 ->Domain[1], 4*sizeof(cmsUInt32Number)); T = LutTable + K0; p1.Table = T; Eval4Inputs(Input + 1, Tmp1, &p1); T = LutTable + K1; p1.Table = T; Eval4Inputs(Input + 1, Tmp2, &p1); for (i=0; i < p16 -> nOutputs; i++) { Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]); } } static void Eval5InputsFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; cmsFloat32Number rest; cmsFloat32Number pk; int k0, K0, K1; const cmsFloat32Number* T; cmsUInt32Number i; cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; cmsInterpParams p1; pk = fclamp(Input[0]) * p->Domain[0]; k0 = _cmsQuickFloor(pk); rest = pk - (cmsFloat32Number) k0; K0 = p -> opta[4] * k0; K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[4]); p1 = *p; memmove(&p1.Domain[0], &p ->Domain[1], 4*sizeof(cmsUInt32Number)); T = LutTable + K0; p1.Table = T; Eval4InputsFloat(Input + 1, Tmp1, &p1); T = LutTable + K1; p1.Table = T; Eval4InputsFloat(Input + 1, Tmp2, &p1); for (i=0; i < p -> nOutputs; i++) { cmsFloat32Number y0 = Tmp1[i]; cmsFloat32Number y1 = Tmp2[i]; Output[i] = y0 + (y1 - y0) * rest; } } static void Eval6Inputs(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1; const cmsUInt16Number* T; cmsUInt32Number i; cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; cmsInterpParams p1; fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); k0 = FIXED_TO_INT(fk); rk = FIXED_REST_TO_INT(fk); K0 = p16 -> opta[5] * k0; K1 = p16 -> opta[5] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0)); p1 = *p16; memmove(&p1.Domain[0], &p16 ->Domain[1], 5*sizeof(cmsUInt32Number)); T = LutTable + K0; p1.Table = T; Eval5Inputs(Input + 1, Tmp1, &p1); T = LutTable + K1; p1.Table = T; Eval5Inputs(Input + 1, Tmp2, &p1); for (i=0; i < p16 -> nOutputs; i++) { Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]); } } static void Eval6InputsFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; cmsFloat32Number rest; cmsFloat32Number pk; int k0, K0, K1; const cmsFloat32Number* T; cmsUInt32Number i; cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; cmsInterpParams p1; pk = fclamp(Input[0]) * p->Domain[0]; k0 = _cmsQuickFloor(pk); rest = pk - (cmsFloat32Number) k0; K0 = p -> opta[5] * k0; K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[5]); p1 = *p; memmove(&p1.Domain[0], &p ->Domain[1], 5*sizeof(cmsUInt32Number)); T = LutTable + K0; p1.Table = T; Eval5InputsFloat(Input + 1, Tmp1, &p1); T = LutTable + K1; p1.Table = T; Eval5InputsFloat(Input + 1, Tmp2, &p1); for (i=0; i < p -> nOutputs; i++) { cmsFloat32Number y0 = Tmp1[i]; cmsFloat32Number y1 = Tmp2[i]; Output[i] = y0 + (y1 - y0) * rest; } } static void Eval7Inputs(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1; const cmsUInt16Number* T; cmsUInt32Number i; cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; cmsInterpParams p1; fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); k0 = FIXED_TO_INT(fk); rk = FIXED_REST_TO_INT(fk); K0 = p16 -> opta[6] * k0; K1 = p16 -> opta[6] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0)); p1 = *p16; memmove(&p1.Domain[0], &p16 ->Domain[1], 6*sizeof(cmsUInt32Number)); T = LutTable + K0; p1.Table = T; Eval6Inputs(Input + 1, Tmp1, &p1); T = LutTable + K1; p1.Table = T; Eval6Inputs(Input + 1, Tmp2, &p1); for (i=0; i < p16 -> nOutputs; i++) { Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]); } } static void Eval7InputsFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; cmsFloat32Number rest; cmsFloat32Number pk; int k0, K0, K1; const cmsFloat32Number* T; cmsUInt32Number i; cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; cmsInterpParams p1; pk = fclamp(Input[0]) * p->Domain[0]; k0 = _cmsQuickFloor(pk); rest = pk - (cmsFloat32Number) k0; K0 = p -> opta[6] * k0; K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[6]); p1 = *p; memmove(&p1.Domain[0], &p ->Domain[1], 6*sizeof(cmsUInt32Number)); T = LutTable + K0; p1.Table = T; Eval6InputsFloat(Input + 1, Tmp1, &p1); T = LutTable + K1; p1.Table = T; Eval6InputsFloat(Input + 1, Tmp2, &p1); for (i=0; i < p -> nOutputs; i++) { cmsFloat32Number y0 = Tmp1[i]; cmsFloat32Number y1 = Tmp2[i]; Output[i] = y0 + (y1 - y0) * rest; } } static void Eval8Inputs(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const cmsInterpParams* p16) { const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; cmsS15Fixed16Number fk; cmsS15Fixed16Number k0, rk; int K0, K1; const cmsUInt16Number* T; cmsUInt32Number i; cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; cmsInterpParams p1; fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]); k0 = FIXED_TO_INT(fk); rk = FIXED_REST_TO_INT(fk); K0 = p16 -> opta[7] * k0; K1 = p16 -> opta[7] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0)); p1 = *p16; memmove(&p1.Domain[0], &p16 ->Domain[1], 7*sizeof(cmsUInt32Number)); T = LutTable + K0; p1.Table = T; Eval7Inputs(Input + 1, Tmp1, &p1); T = LutTable + K1; p1.Table = T; Eval7Inputs(Input + 1, Tmp2, &p1); for (i=0; i < p16 -> nOutputs; i++) { Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]); } } static void Eval8InputsFloat(const cmsFloat32Number Input[], cmsFloat32Number Output[], const cmsInterpParams* p) { const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; cmsFloat32Number rest; cmsFloat32Number pk; int k0, K0, K1; const cmsFloat32Number* T; cmsUInt32Number i; cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; cmsInterpParams p1; pk = fclamp(Input[0]) * p->Domain[0]; k0 = _cmsQuickFloor(pk); rest = pk - (cmsFloat32Number) k0; K0 = p -> opta[7] * k0; K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[7]); p1 = *p; memmove(&p1.Domain[0], &p ->Domain[1], 7*sizeof(cmsUInt32Number)); T = LutTable + K0; p1.Table = T; Eval7InputsFloat(Input + 1, Tmp1, &p1); T = LutTable + K1; p1.Table = T; Eval7InputsFloat(Input + 1, Tmp2, &p1); for (i=0; i < p -> nOutputs; i++) { cmsFloat32Number y0 = Tmp1[i]; cmsFloat32Number y1 = Tmp2[i]; Output[i] = y0 + (y1 - y0) * rest; } } // The default factory static cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags) { cmsInterpFunction Interpolation; cmsBool IsFloat = (dwFlags & CMS_LERP_FLAGS_FLOAT); cmsBool IsTrilinear = (dwFlags & CMS_LERP_FLAGS_TRILINEAR); memset(&Interpolation, 0, sizeof(Interpolation)); // Safety check if (nInputChannels >= 4 && nOutputChannels >= MAX_STAGE_CHANNELS) return Interpolation; switch (nInputChannels) { case 1: // Gray LUT / linear if (nOutputChannels == 1) { if (IsFloat) Interpolation.LerpFloat = LinLerp1Dfloat; else Interpolation.Lerp16 = LinLerp1D; } else { if (IsFloat) Interpolation.LerpFloat = Eval1InputFloat; else Interpolation.Lerp16 = Eval1Input; } break; case 2: // Duotone if (IsFloat) Interpolation.LerpFloat = BilinearInterpFloat; else Interpolation.Lerp16 = BilinearInterp16; break; case 3: // RGB et al if (IsTrilinear) { if (IsFloat) Interpolation.LerpFloat = TrilinearInterpFloat; else Interpolation.Lerp16 = TrilinearInterp16; } else { if (IsFloat) Interpolation.LerpFloat = TetrahedralInterpFloat; else { Interpolation.Lerp16 = TetrahedralInterp16; } } break; case 4: // CMYK lut if (IsFloat) Interpolation.LerpFloat = Eval4InputsFloat; else Interpolation.Lerp16 = Eval4Inputs; break; case 5: // 5 Inks if (IsFloat) Interpolation.LerpFloat = Eval5InputsFloat; else Interpolation.Lerp16 = Eval5Inputs; break; case 6: // 6 Inks if (IsFloat) Interpolation.LerpFloat = Eval6InputsFloat; else Interpolation.Lerp16 = Eval6Inputs; break; case 7: // 7 inks if (IsFloat) Interpolation.LerpFloat = Eval7InputsFloat; else Interpolation.Lerp16 = Eval7Inputs; break; case 8: // 8 inks if (IsFloat) Interpolation.LerpFloat = Eval8InputsFloat; else Interpolation.Lerp16 = Eval8Inputs; break; break; default: Interpolation.Lerp16 = NULL; } return Interpolation; } lcms2-2.6/src/cmsvirt.c0000644002406300000240000010713412311617072014356 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Virtual (built-in) profiles // ----------------------------------------------------------------------------------- static cmsBool SetTextTags(cmsHPROFILE hProfile, const wchar_t* Description) { cmsMLU *DescriptionMLU, *CopyrightMLU; cmsBool rc = FALSE; cmsContext ContextID = cmsGetProfileContextID(hProfile); DescriptionMLU = cmsMLUalloc(ContextID, 1); CopyrightMLU = cmsMLUalloc(ContextID, 1); if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error; if (!cmsMLUsetWide(DescriptionMLU, "en", "US", Description)) goto Error; if (!cmsMLUsetWide(CopyrightMLU, "en", "US", L"No copyright, use freely")) goto Error; if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Error; if (!cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU)) goto Error; rc = TRUE; Error: if (DescriptionMLU) cmsMLUfree(DescriptionMLU); if (CopyrightMLU) cmsMLUfree(CopyrightMLU); return rc; } static cmsBool SetSeqDescTag(cmsHPROFILE hProfile, const char* Model) { cmsBool rc = FALSE; cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsSEQ* Seq = cmsAllocProfileSequenceDescription(ContextID, 1); if (Seq == NULL) return FALSE; Seq->seq[0].deviceMfg = (cmsSignature) 0; Seq->seq[0].deviceModel = (cmsSignature) 0; #ifdef CMS_DONT_USE_INT64 Seq->seq[0].attributes[0] = 0; Seq->seq[0].attributes[1] = 0; #else Seq->seq[0].attributes = 0; #endif Seq->seq[0].technology = (cmsTechnologySignature) 0; cmsMLUsetASCII( Seq->seq[0].Manufacturer, cmsNoLanguage, cmsNoCountry, "Little CMS"); cmsMLUsetASCII( Seq->seq[0].Model, cmsNoLanguage, cmsNoCountry, Model); if (!_cmsWriteProfileSequence(hProfile, Seq)) goto Error; rc = TRUE; Error: if (Seq) cmsFreeProfileSequenceDescription(Seq); return rc; } // This function creates a profile based on White point, primaries and // transfer functions. cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries, cmsToneCurve* const TransferFunction[3]) { cmsHPROFILE hICC; cmsMAT3 MColorants; cmsCIEXYZTRIPLE Colorants; cmsCIExyY MaxWhite; cmsMAT3 CHAD; cmsCIEXYZ WhitePointXYZ; hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) // can't allocate return NULL; cmsSetProfileVersion(hICC, 4.3); cmsSetDeviceClass(hICC, cmsSigDisplayClass); cmsSetColorSpace(hICC, cmsSigRgbData); cmsSetPCS(hICC, cmsSigXYZData); cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); // Implement profile using following tags: // // 1 cmsSigProfileDescriptionTag // 2 cmsSigMediaWhitePointTag // 3 cmsSigRedColorantTag // 4 cmsSigGreenColorantTag // 5 cmsSigBlueColorantTag // 6 cmsSigRedTRCTag // 7 cmsSigGreenTRCTag // 8 cmsSigBlueTRCTag // 9 Chromatic adaptation Tag // This conforms a standard RGB DisplayProfile as says ICC, and then I add (As per addendum II) // 10 cmsSigChromaticityTag if (!SetTextTags(hICC, L"RGB built-in")) goto Error; if (WhitePoint) { if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error; cmsxyY2XYZ(&WhitePointXYZ, WhitePoint); _cmsAdaptationMatrix(&CHAD, NULL, &WhitePointXYZ, cmsD50_XYZ()); // This is a V4 tag, but many CMM does read and understand it no matter which version if (!cmsWriteTag(hICC, cmsSigChromaticAdaptationTag, (void*) &CHAD)) goto Error; } if (WhitePoint && Primaries) { MaxWhite.x = WhitePoint -> x; MaxWhite.y = WhitePoint -> y; MaxWhite.Y = 1.0; if (!_cmsBuildRGB2XYZtransferMatrix(&MColorants, &MaxWhite, Primaries)) goto Error; Colorants.Red.X = MColorants.v[0].n[0]; Colorants.Red.Y = MColorants.v[1].n[0]; Colorants.Red.Z = MColorants.v[2].n[0]; Colorants.Green.X = MColorants.v[0].n[1]; Colorants.Green.Y = MColorants.v[1].n[1]; Colorants.Green.Z = MColorants.v[2].n[1]; Colorants.Blue.X = MColorants.v[0].n[2]; Colorants.Blue.Y = MColorants.v[1].n[2]; Colorants.Blue.Z = MColorants.v[2].n[2]; if (!cmsWriteTag(hICC, cmsSigRedColorantTag, (void*) &Colorants.Red)) goto Error; if (!cmsWriteTag(hICC, cmsSigBlueColorantTag, (void*) &Colorants.Blue)) goto Error; if (!cmsWriteTag(hICC, cmsSigGreenColorantTag, (void*) &Colorants.Green)) goto Error; } if (TransferFunction) { // Tries to minimize space. Thanks to Richard Hughes for this nice idea if (!cmsWriteTag(hICC, cmsSigRedTRCTag, (void*) TransferFunction[0])) goto Error; if (TransferFunction[1] == TransferFunction[0]) { if (!cmsLinkTag (hICC, cmsSigGreenTRCTag, cmsSigRedTRCTag)) goto Error; } else { if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error; } if (TransferFunction[2] == TransferFunction[0]) { if (!cmsLinkTag (hICC, cmsSigBlueTRCTag, cmsSigRedTRCTag)) goto Error; } else { if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error; } } if (Primaries) { if (!cmsWriteTag(hICC, cmsSigChromaticityTag, (void*) Primaries)) goto Error; } return hICC; Error: if (hICC) cmsCloseProfile(hICC); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries, cmsToneCurve* const TransferFunction[3]) { return cmsCreateRGBProfileTHR(NULL, WhitePoint, Primaries, TransferFunction); } // This function creates a profile based on White point and transfer function. cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint, const cmsToneCurve* TransferFunction) { cmsHPROFILE hICC; cmsCIEXYZ tmp; hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) // can't allocate return NULL; cmsSetProfileVersion(hICC, 4.3); cmsSetDeviceClass(hICC, cmsSigDisplayClass); cmsSetColorSpace(hICC, cmsSigGrayData); cmsSetPCS(hICC, cmsSigXYZData); cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); // Implement profile using following tags: // // 1 cmsSigProfileDescriptionTag // 2 cmsSigMediaWhitePointTag // 3 cmsSigGrayTRCTag // This conforms a standard Gray DisplayProfile // Fill-in the tags if (!SetTextTags(hICC, L"gray built-in")) goto Error; if (WhitePoint) { cmsxyY2XYZ(&tmp, WhitePoint); if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) &tmp)) goto Error; } if (TransferFunction) { if (!cmsWriteTag(hICC, cmsSigGrayTRCTag, (void*) TransferFunction)) goto Error; } return hICC; Error: if (hICC) cmsCloseProfile(hICC); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint, const cmsToneCurve* TransferFunction) { return cmsCreateGrayProfileTHR(NULL, WhitePoint, TransferFunction); } // This is a devicelink operating in the target colorspace with as many transfer functions as components cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID, cmsColorSpaceSignature ColorSpace, cmsToneCurve* const TransferFunctions[]) { cmsHPROFILE hICC; cmsPipeline* Pipeline; int nChannels; hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) return NULL; cmsSetProfileVersion(hICC, 4.3); cmsSetDeviceClass(hICC, cmsSigLinkClass); cmsSetColorSpace(hICC, ColorSpace); cmsSetPCS(hICC, ColorSpace); cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); // Set up channels nChannels = cmsChannelsOf(ColorSpace); // Creates a Pipeline with prelinearization step only Pipeline = cmsPipelineAlloc(ContextID, nChannels, nChannels); if (Pipeline == NULL) goto Error; // Copy tables to Pipeline if (!cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions))) goto Error; // Create tags if (!SetTextTags(hICC, L"Linearization built-in")) goto Error; if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline)) goto Error; if (!SetSeqDescTag(hICC, "Linearization built-in")) goto Error; // Pipeline is already on virtual profile cmsPipelineFree(Pipeline); // Ok, done return hICC; Error: cmsPipelineFree(Pipeline); if (hICC) cmsCloseProfile(hICC); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace, cmsToneCurve* const TransferFunctions[]) { return cmsCreateLinearizationDeviceLinkTHR(NULL, ColorSpace, TransferFunctions); } // Ink-limiting algorithm // // Sum = C + M + Y + K // If Sum > InkLimit // Ratio= 1 - (Sum - InkLimit) / (C + M + Y) // if Ratio <0 // Ratio=0 // endif // Else // Ratio=1 // endif // // C = Ratio * C // M = Ratio * M // Y = Ratio * Y // K: Does not change static int InkLimitingSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { cmsFloat64Number InkLimit = *(cmsFloat64Number *) Cargo; cmsFloat64Number SumCMY, SumCMYK, Ratio; InkLimit = (InkLimit * 655.35); SumCMY = In[0] + In[1] + In[2]; SumCMYK = SumCMY + In[3]; if (SumCMYK > InkLimit) { Ratio = 1 - ((SumCMYK - InkLimit) / SumCMY); if (Ratio < 0) Ratio = 0; } else Ratio = 1; Out[0] = _cmsQuickSaturateWord(In[0] * Ratio); // C Out[1] = _cmsQuickSaturateWord(In[1] * Ratio); // M Out[2] = _cmsQuickSaturateWord(In[2] * Ratio); // Y Out[3] = In[3]; // K (untouched) return TRUE; } // This is a devicelink operating in CMYK for ink-limiting cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID, cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit) { cmsHPROFILE hICC; cmsPipeline* LUT; cmsStage* CLUT; int nChannels; if (ColorSpace != cmsSigCmykData) { cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "InkLimiting: Only CMYK currently supported"); return NULL; } if (Limit < 0.0 || Limit > 400) { cmsSignalError(ContextID, cmsERROR_RANGE, "InkLimiting: Limit should be between 0..400"); if (Limit < 0) Limit = 0; if (Limit > 400) Limit = 400; } hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) // can't allocate return NULL; cmsSetProfileVersion(hICC, 4.3); cmsSetDeviceClass(hICC, cmsSigLinkClass); cmsSetColorSpace(hICC, ColorSpace); cmsSetPCS(hICC, ColorSpace); cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); // Creates a Pipeline with 3D grid only LUT = cmsPipelineAlloc(ContextID, 4, 4); if (LUT == NULL) goto Error; nChannels = cmsChannelsOf(ColorSpace); CLUT = cmsStageAllocCLut16bit(ContextID, 17, nChannels, nChannels, NULL); if (CLUT == NULL) goto Error; if (!cmsStageSampleCLut16bit(CLUT, InkLimitingSampler, (void*) &Limit, 0)) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels)) || !cmsPipelineInsertStage(LUT, cmsAT_END, CLUT) || !cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels))) goto Error; // Create tags if (!SetTextTags(hICC, L"ink-limiting built-in")) goto Error; if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) LUT)) goto Error; if (!SetSeqDescTag(hICC, "ink-limiting built-in")) goto Error; // cmsPipeline is already on virtual profile cmsPipelineFree(LUT); // Ok, done return hICC; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hICC != NULL) cmsCloseProfile(hICC); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit) { return cmsCreateInkLimitingDeviceLinkTHR(NULL, ColorSpace, Limit); } // Creates a fake Lab identity. cmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint) { cmsHPROFILE hProfile; cmsPipeline* LUT = NULL; hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL); if (hProfile == NULL) return NULL; cmsSetProfileVersion(hProfile, 2.1); cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, cmsSigLabData); cmsSetPCS(hProfile, cmsSigLabData); if (!SetTextTags(hProfile, L"Lab identity built-in")) return NULL; // An identity LUT is all we need LUT = cmsPipelineAlloc(ContextID, 3, 3); if (LUT == NULL) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3))) goto Error; if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error; cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hProfile != NULL) cmsCloseProfile(hProfile); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint) { return cmsCreateLab2ProfileTHR(NULL, WhitePoint); } // Creates a fake Lab V4 identity. cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint) { cmsHPROFILE hProfile; cmsPipeline* LUT = NULL; hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL); if (hProfile == NULL) return NULL; cmsSetProfileVersion(hProfile, 4.3); cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, cmsSigLabData); cmsSetPCS(hProfile, cmsSigLabData); if (!SetTextTags(hProfile, L"Lab identity built-in")) goto Error; // An empty LUTs is all we need LUT = cmsPipelineAlloc(ContextID, 3, 3); if (LUT == NULL) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3))) goto Error; if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error; cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hProfile != NULL) cmsCloseProfile(hProfile); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint) { return cmsCreateLab4ProfileTHR(NULL, WhitePoint); } // Creates a fake XYZ identity cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID) { cmsHPROFILE hProfile; cmsPipeline* LUT = NULL; hProfile = cmsCreateRGBProfileTHR(ContextID, cmsD50_xyY(), NULL, NULL); if (hProfile == NULL) return NULL; cmsSetProfileVersion(hProfile, 4.3); cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, cmsSigXYZData); cmsSetPCS(hProfile, cmsSigXYZData); if (!SetTextTags(hProfile, L"XYZ identity built-in")) goto Error; // An identity LUT is all we need LUT = cmsPipelineAlloc(ContextID, 3, 3); if (LUT == NULL) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3))) goto Error; if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error; cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hProfile != NULL) cmsCloseProfile(hProfile); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateXYZProfile(void) { return cmsCreateXYZProfileTHR(NULL); } //sRGB Curves are defined by: // //If RsRGB,GsRGB, BsRGB < 0.04045 // // R = RsRGB / 12.92 // G = GsRGB / 12.92 // B = BsRGB / 12.92 // // //else if RsRGB,GsRGB, BsRGB >= 0.04045 // // R = ((RsRGB + 0.055) / 1.055)^2.4 // G = ((GsRGB + 0.055) / 1.055)^2.4 // B = ((BsRGB + 0.055) / 1.055)^2.4 static cmsToneCurve* Build_sRGBGamma(cmsContext ContextID) { cmsFloat64Number Parameters[5]; Parameters[0] = 2.4; Parameters[1] = 1. / 1.055; Parameters[2] = 0.055 / 1.055; Parameters[3] = 1. / 12.92; Parameters[4] = 0.04045; return cmsBuildParametricToneCurve(ContextID, 4, Parameters); } // Create the ICC virtual profile for sRGB space cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID) { cmsCIExyY D65; cmsCIExyYTRIPLE Rec709Primaries = { {0.6400, 0.3300, 1.0}, {0.3000, 0.6000, 1.0}, {0.1500, 0.0600, 1.0} }; cmsToneCurve* Gamma22[3]; cmsHPROFILE hsRGB; cmsWhitePointFromTemp(&D65, 6504); Gamma22[0] = Gamma22[1] = Gamma22[2] = Build_sRGBGamma(ContextID); if (Gamma22[0] == NULL) return NULL; hsRGB = cmsCreateRGBProfileTHR(ContextID, &D65, &Rec709Primaries, Gamma22); cmsFreeToneCurve(Gamma22[0]); if (hsRGB == NULL) return NULL; if (!SetTextTags(hsRGB, L"sRGB built-in")) { cmsCloseProfile(hsRGB); return NULL; } return hsRGB; } cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void) { return cmsCreate_sRGBProfileTHR(NULL); } typedef struct { cmsFloat64Number Brightness; cmsFloat64Number Contrast; cmsFloat64Number Hue; cmsFloat64Number Saturation; cmsCIEXYZ WPsrc, WPdest; } BCHSWADJUSTS, *LPBCHSWADJUSTS; static int bchswSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { cmsCIELab LabIn, LabOut; cmsCIELCh LChIn, LChOut; cmsCIEXYZ XYZ; LPBCHSWADJUSTS bchsw = (LPBCHSWADJUSTS) Cargo; cmsLabEncoded2Float(&LabIn, In); cmsLab2LCh(&LChIn, &LabIn); // Do some adjusts on LCh LChOut.L = LChIn.L * bchsw ->Contrast + bchsw ->Brightness; LChOut.C = LChIn.C + bchsw -> Saturation; LChOut.h = LChIn.h + bchsw -> Hue; cmsLCh2Lab(&LabOut, &LChOut); // Move white point in Lab cmsLab2XYZ(&bchsw ->WPsrc, &XYZ, &LabOut); cmsXYZ2Lab(&bchsw ->WPdest, &LabOut, &XYZ); // Back to encoded cmsFloat2LabEncoded(Out, &LabOut); return TRUE; } // Creates an abstract profile operating in Lab space for Brightness, // contrast, Saturation and white point displacement cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID, int nLUTPoints, cmsFloat64Number Bright, cmsFloat64Number Contrast, cmsFloat64Number Hue, cmsFloat64Number Saturation, int TempSrc, int TempDest) { cmsHPROFILE hICC; cmsPipeline* Pipeline; BCHSWADJUSTS bchsw; cmsCIExyY WhitePnt; cmsStage* CLUT; cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; int i; bchsw.Brightness = Bright; bchsw.Contrast = Contrast; bchsw.Hue = Hue; bchsw.Saturation = Saturation; cmsWhitePointFromTemp(&WhitePnt, TempSrc ); cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt); cmsWhitePointFromTemp(&WhitePnt, TempDest); cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt); hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) // can't allocate return NULL; cmsSetDeviceClass(hICC, cmsSigAbstractClass); cmsSetColorSpace(hICC, cmsSigLabData); cmsSetPCS(hICC, cmsSigLabData); cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); // Creates a Pipeline with 3D grid only Pipeline = cmsPipelineAlloc(ContextID, 3, 3); if (Pipeline == NULL) { cmsCloseProfile(hICC); return NULL; } for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints; CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL); if (CLUT == NULL) return NULL; if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) { // Shouldn't reach here goto Error; } if (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) { goto Error; } // Create tags if (!SetTextTags(hICC, L"BCHS built-in")) return NULL; cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ()); cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline); // Pipeline is already on virtual profile cmsPipelineFree(Pipeline); // Ok, done return hICC; Error: cmsPipelineFree(Pipeline); cmsCloseProfile(hICC); return NULL; } CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints, cmsFloat64Number Bright, cmsFloat64Number Contrast, cmsFloat64Number Hue, cmsFloat64Number Saturation, int TempSrc, int TempDest) { return cmsCreateBCHSWabstractProfileTHR(NULL, nLUTPoints, Bright, Contrast, Hue, Saturation, TempSrc, TempDest); } // Creates a fake NULL profile. This profile return 1 channel as always 0. // Is useful only for gamut checking tricks cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID) { cmsHPROFILE hProfile; cmsPipeline* LUT = NULL; cmsStage* PostLin; cmsToneCurve* EmptyTab; cmsUInt16Number Zero[2] = { 0, 0 }; hProfile = cmsCreateProfilePlaceholder(ContextID); if (!hProfile) // can't allocate return NULL; cmsSetProfileVersion(hProfile, 4.3); if (!SetTextTags(hProfile, L"NULL profile built-in")) goto Error; cmsSetDeviceClass(hProfile, cmsSigOutputClass); cmsSetColorSpace(hProfile, cmsSigGrayData); cmsSetPCS(hProfile, cmsSigLabData); // An empty LUTs is all we need LUT = cmsPipelineAlloc(ContextID, 1, 1); if (LUT == NULL) goto Error; EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero); PostLin = cmsStageAllocToneCurves(ContextID, 1, &EmptyTab); cmsFreeToneCurve(EmptyTab); if (!cmsPipelineInsertStage(LUT, cmsAT_END, PostLin)) goto Error; if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, (void*) LUT)) goto Error; if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error; cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hProfile != NULL) cmsCloseProfile(hProfile); return NULL; } cmsHPROFILE CMSEXPORT cmsCreateNULLProfile(void) { return cmsCreateNULLProfileTHR(NULL); } static int IsPCS(cmsColorSpaceSignature ColorSpace) { return (ColorSpace == cmsSigXYZData || ColorSpace == cmsSigLabData); } static void FixColorSpaces(cmsHPROFILE hProfile, cmsColorSpaceSignature ColorSpace, cmsColorSpaceSignature PCS, cmsUInt32Number dwFlags) { if (dwFlags & cmsFLAGS_GUESSDEVICECLASS) { if (IsPCS(ColorSpace) && IsPCS(PCS)) { cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, ColorSpace); cmsSetPCS(hProfile, PCS); return; } if (IsPCS(ColorSpace) && !IsPCS(PCS)) { cmsSetDeviceClass(hProfile, cmsSigOutputClass); cmsSetPCS(hProfile, ColorSpace); cmsSetColorSpace(hProfile, PCS); return; } if (IsPCS(PCS) && !IsPCS(ColorSpace)) { cmsSetDeviceClass(hProfile, cmsSigInputClass); cmsSetColorSpace(hProfile, ColorSpace); cmsSetPCS(hProfile, PCS); return; } } cmsSetDeviceClass(hProfile, cmsSigLinkClass); cmsSetColorSpace(hProfile, ColorSpace); cmsSetPCS(hProfile, PCS); } // This function creates a named color profile dumping all the contents of transform to a single profile // In this way, LittleCMS may be used to "group" several named color databases into a single profile. // It has, however, several minor limitations. PCS is always Lab, which is not very critic since this // is the normal PCS for named color profiles. static cmsHPROFILE CreateNamedColorDevicelink(cmsHTRANSFORM xform) { _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform; cmsHPROFILE hICC = NULL; int i, nColors; cmsNAMEDCOLORLIST *nc2 = NULL, *Original = NULL; // Create an empty placeholder hICC = cmsCreateProfilePlaceholder(v->ContextID); if (hICC == NULL) return NULL; // Critical information cmsSetDeviceClass(hICC, cmsSigNamedColorClass); cmsSetColorSpace(hICC, v ->ExitColorSpace); cmsSetPCS(hICC, cmsSigLabData); // Tag profile with information if (!SetTextTags(hICC, L"Named color devicelink")) goto Error; Original = cmsGetNamedColorList(xform); if (Original == NULL) goto Error; nColors = cmsNamedColorCount(Original); nc2 = cmsDupNamedColorList(Original); if (nc2 == NULL) goto Error; // Colorant count now depends on the output space nc2 ->ColorantCount = cmsPipelineOutputChannels(v ->Lut); // Make sure we have proper formatters cmsChangeBuffersFormat(xform, TYPE_NAMED_COLOR_INDEX, FLOAT_SH(0) | COLORSPACE_SH(_cmsLCMScolorSpace(v ->ExitColorSpace)) | BYTES_SH(2) | CHANNELS_SH(cmsChannelsOf(v ->ExitColorSpace))); // Apply the transfor to colorants. for (i=0; i < nColors; i++) { cmsDoTransform(xform, &i, nc2 ->List[i].DeviceColorant, 1); } if (!cmsWriteTag(hICC, cmsSigNamedColor2Tag, (void*) nc2)) goto Error; cmsFreeNamedColorList(nc2); return hICC; Error: if (hICC != NULL) cmsCloseProfile(hICC); return NULL; } // This structure holds information about which MPU can be stored on a profile based on the version typedef struct { cmsBool IsV4; // Is a V4 tag? cmsTagSignature RequiredTag; // Set to 0 for both types cmsTagTypeSignature LutType; // The LUT type int nTypes; // Number of types (up to 5) cmsStageSignature MpeTypes[5]; // 5 is the maximum number } cmsAllowedLUT; static const cmsAllowedLUT AllowedLUTTypes[] = { { FALSE, 0, cmsSigLut16Type, 4, { cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}}, { FALSE, 0, cmsSigLut16Type, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}}, { FALSE, 0, cmsSigLut16Type, 2, { cmsSigCurveSetElemType, cmsSigCLutElemType}}, { TRUE , 0, cmsSigLutAtoBType, 1, { cmsSigCurveSetElemType }}, { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } }, { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } }, { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 5, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }}, { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 1, { cmsSigCurveSetElemType }}, { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }}, { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }}, { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 5, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }} }; #define SIZE_OF_ALLOWED_LUT (sizeof(AllowedLUTTypes)/sizeof(cmsAllowedLUT)) // Check a single entry static cmsBool CheckOne(const cmsAllowedLUT* Tab, const cmsPipeline* Lut) { cmsStage* mpe; int n; for (n=0, mpe = Lut ->Elements; mpe != NULL; mpe = mpe ->Next, n++) { if (n > Tab ->nTypes) return FALSE; if (cmsStageType(mpe) != Tab ->MpeTypes[n]) return FALSE; } return (n == Tab ->nTypes); } static const cmsAllowedLUT* FindCombination(const cmsPipeline* Lut, cmsBool IsV4, cmsTagSignature DestinationTag) { cmsUInt32Number n; for (n=0; n < SIZE_OF_ALLOWED_LUT; n++) { const cmsAllowedLUT* Tab = AllowedLUTTypes + n; if (IsV4 ^ Tab -> IsV4) continue; if ((Tab ->RequiredTag != 0) && (Tab ->RequiredTag != DestinationTag)) continue; if (CheckOne(Tab, Lut)) return Tab; } return NULL; } // Does convert a transform into a device link profile cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags) { cmsHPROFILE hProfile = NULL; cmsUInt32Number FrmIn, FrmOut, ChansIn, ChansOut; cmsUInt32Number ColorSpaceBitsIn, ColorSpaceBitsOut; _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; cmsPipeline* LUT = NULL; cmsStage* mpe; cmsContext ContextID = cmsGetTransformContextID(hTransform); const cmsAllowedLUT* AllowedLUT; cmsTagSignature DestinationTag; cmsProfileClassSignature deviceClass; _cmsAssert(hTransform != NULL); // Get the first mpe to check for named color mpe = cmsPipelineGetPtrToFirstStage(xform ->Lut); // Check if is a named color transform if (mpe != NULL) { if (cmsStageType(mpe) == cmsSigNamedColorElemType) { return CreateNamedColorDevicelink(hTransform); } } // First thing to do is to get a copy of the transformation LUT = cmsPipelineDup(xform ->Lut); if (LUT == NULL) return NULL; // Time to fix the Lab2/Lab4 issue. if ((xform ->EntryColorSpace == cmsSigLabData) && (Version < 4.0)) { if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID))) goto Error; } // On the output side too if ((xform ->ExitColorSpace) == cmsSigLabData && (Version < 4.0)) { if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID))) goto Error; } hProfile = cmsCreateProfilePlaceholder(ContextID); if (!hProfile) goto Error; // can't allocate cmsSetProfileVersion(hProfile, Version); FixColorSpaces(hProfile, xform -> EntryColorSpace, xform -> ExitColorSpace, dwFlags); // Optimize the LUT and precalculate a devicelink ChansIn = cmsChannelsOf(xform -> EntryColorSpace); ChansOut = cmsChannelsOf(xform -> ExitColorSpace); ColorSpaceBitsIn = _cmsLCMScolorSpace(xform -> EntryColorSpace); ColorSpaceBitsOut = _cmsLCMScolorSpace(xform -> ExitColorSpace); FrmIn = COLORSPACE_SH(ColorSpaceBitsIn) | CHANNELS_SH(ChansIn)|BYTES_SH(2); FrmOut = COLORSPACE_SH(ColorSpaceBitsOut) | CHANNELS_SH(ChansOut)|BYTES_SH(2); deviceClass = cmsGetDeviceClass(hProfile); if (deviceClass == cmsSigOutputClass) DestinationTag = cmsSigBToA0Tag; else DestinationTag = cmsSigAToB0Tag; // Check if the profile/version can store the result if (dwFlags & cmsFLAGS_FORCE_CLUT) AllowedLUT = NULL; else AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); if (AllowedLUT == NULL) { // Try to optimize _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags); AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); } // If no way, then force CLUT that for sure can be written if (AllowedLUT == NULL) { dwFlags |= cmsFLAGS_FORCE_CLUT; _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags); // Put identity curves if needed if (cmsPipelineGetPtrToFirstStage(LUT) ->Type != cmsSigCurveSetElemType) if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn))) goto Error; if (cmsPipelineGetPtrToLastStage(LUT) ->Type != cmsSigCurveSetElemType) if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut))) goto Error; AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); } // Somethings is wrong... if (AllowedLUT == NULL) { goto Error; } if (dwFlags & cmsFLAGS_8BITS_DEVICELINK) cmsPipelineSetSaveAs8bitsFlag(LUT, TRUE); // Tag profile with information if (!SetTextTags(hProfile, L"devicelink")) goto Error; // Store result if (!cmsWriteTag(hProfile, DestinationTag, LUT)) goto Error; if (xform -> InputColorant != NULL) { if (!cmsWriteTag(hProfile, cmsSigColorantTableTag, xform->InputColorant)) goto Error; } if (xform -> OutputColorant != NULL) { if (!cmsWriteTag(hProfile, cmsSigColorantTableOutTag, xform->OutputColorant)) goto Error; } if ((deviceClass == cmsSigLinkClass) && (xform ->Sequence != NULL)) { if (!_cmsWriteProfileSequence(hProfile, xform ->Sequence)) goto Error; } // Set the white point if (deviceClass == cmsSigInputClass) { if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->EntryWhitePoint)) goto Error; } else { if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->ExitWhitePoint)) goto Error; } // Per 7.2.15 in spec 4.3 cmsSetHeaderRenderingIntent(hProfile, xform ->RenderingIntent); cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); cmsCloseProfile(hProfile); return NULL; } lcms2-2.6/src/cmsnamed.c0000644002406300000240000006652612311617072014467 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Multilocalized unicode objects. That is an attempt to encapsulate i18n. // Allocates an empty multi localizad unicode object cmsMLU* CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems) { cmsMLU* mlu; // nItems should be positive if given if (nItems <= 0) nItems = 2; // Create the container mlu = (cmsMLU*) _cmsMallocZero(ContextID, sizeof(cmsMLU)); if (mlu == NULL) return NULL; mlu ->ContextID = ContextID; // Create entry array mlu ->Entries = (_cmsMLUentry*) _cmsCalloc(ContextID, nItems, sizeof(_cmsMLUentry)); if (mlu ->Entries == NULL) { _cmsFree(ContextID, mlu); return NULL; } // Ok, keep indexes up to date mlu ->AllocatedEntries = nItems; mlu ->UsedEntries = 0; return mlu; } // Grows a mempool table for a MLU. Each time this function is called, mempool size is multiplied times two. static cmsBool GrowMLUpool(cmsMLU* mlu) { cmsUInt32Number size; void *NewPtr; // Sanity check if (mlu == NULL) return FALSE; if (mlu ->PoolSize == 0) size = 256; else size = mlu ->PoolSize * 2; // Check for overflow if (size < mlu ->PoolSize) return FALSE; // Reallocate the pool NewPtr = _cmsRealloc(mlu ->ContextID, mlu ->MemPool, size); if (NewPtr == NULL) return FALSE; mlu ->MemPool = NewPtr; mlu ->PoolSize = size; return TRUE; } // Grows a entry table for a MLU. Each time this function is called, table size is multiplied times two. static cmsBool GrowMLUtable(cmsMLU* mlu) { int AllocatedEntries; _cmsMLUentry *NewPtr; // Sanity check if (mlu == NULL) return FALSE; AllocatedEntries = mlu ->AllocatedEntries * 2; // Check for overflow if (AllocatedEntries / 2 != mlu ->AllocatedEntries) return FALSE; // Reallocate the memory NewPtr = (_cmsMLUentry*)_cmsRealloc(mlu ->ContextID, mlu ->Entries, AllocatedEntries*sizeof(_cmsMLUentry)); if (NewPtr == NULL) return FALSE; mlu ->Entries = NewPtr; mlu ->AllocatedEntries = AllocatedEntries; return TRUE; } // Search for a specific entry in the structure. Language and Country are used. static int SearchMLUEntry(cmsMLU* mlu, cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode) { int i; // Sanity check if (mlu == NULL) return -1; // Iterate whole table for (i=0; i < mlu ->UsedEntries; i++) { if (mlu ->Entries[i].Country == CountryCode && mlu ->Entries[i].Language == LanguageCode) return i; } // Not found return -1; } // Add a block of characters to the intended MLU. Language and country are specified. // Only one entry for Language/country pair is allowed. static cmsBool AddMLUBlock(cmsMLU* mlu, cmsUInt32Number size, const wchar_t *Block, cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode) { cmsUInt32Number Offset; cmsUInt8Number* Ptr; // Sanity check if (mlu == NULL) return FALSE; // Is there any room available? if (mlu ->UsedEntries >= mlu ->AllocatedEntries) { if (!GrowMLUtable(mlu)) return FALSE; } // Only one ASCII string if (SearchMLUEntry(mlu, LanguageCode, CountryCode) >= 0) return FALSE; // Only one is allowed! // Check for size while ((mlu ->PoolSize - mlu ->PoolUsed) < size) { if (!GrowMLUpool(mlu)) return FALSE; } Offset = mlu ->PoolUsed; Ptr = (cmsUInt8Number*) mlu ->MemPool; if (Ptr == NULL) return FALSE; // Set the entry memmove(Ptr + Offset, Block, size); mlu ->PoolUsed += size; mlu ->Entries[mlu ->UsedEntries].StrW = Offset; mlu ->Entries[mlu ->UsedEntries].Len = size; mlu ->Entries[mlu ->UsedEntries].Country = CountryCode; mlu ->Entries[mlu ->UsedEntries].Language = LanguageCode; mlu ->UsedEntries++; return TRUE; } // Add an ASCII entry. cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* ASCIIString) { cmsUInt32Number i, len = (cmsUInt32Number) strlen(ASCIIString)+1; wchar_t* WStr; cmsBool rc; cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode); cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode); if (mlu == NULL) return FALSE; WStr = (wchar_t*) _cmsCalloc(mlu ->ContextID, len, sizeof(wchar_t)); if (WStr == NULL) return FALSE; for (i=0; i < len; i++) WStr[i] = (wchar_t) ASCIIString[i]; rc = AddMLUBlock(mlu, len * sizeof(wchar_t), WStr, Lang, Cntry); _cmsFree(mlu ->ContextID, WStr); return rc; } // We don't need any wcs support library static cmsUInt32Number mywcslen(const wchar_t *s) { const wchar_t *p; p = s; while (*p) p++; return (cmsUInt32Number)(p - s); } // Add a wide entry cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char Language[3], const char Country[3], const wchar_t* WideString) { cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) Language); cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) Country); cmsUInt32Number len; if (mlu == NULL) return FALSE; if (WideString == NULL) return FALSE; len = (cmsUInt32Number) (mywcslen(WideString) + 1) * sizeof(wchar_t); return AddMLUBlock(mlu, len, WideString, Lang, Cntry); } // Duplicating a MLU is as easy as copying all members cmsMLU* CMSEXPORT cmsMLUdup(const cmsMLU* mlu) { cmsMLU* NewMlu = NULL; // Duplicating a NULL obtains a NULL if (mlu == NULL) return NULL; NewMlu = cmsMLUalloc(mlu ->ContextID, mlu ->UsedEntries); if (NewMlu == NULL) return NULL; // Should never happen if (NewMlu ->AllocatedEntries < mlu ->UsedEntries) goto Error; // Sanitize... if (NewMlu ->Entries == NULL || mlu ->Entries == NULL) goto Error; memmove(NewMlu ->Entries, mlu ->Entries, mlu ->UsedEntries * sizeof(_cmsMLUentry)); NewMlu ->UsedEntries = mlu ->UsedEntries; // The MLU may be empty if (mlu ->PoolUsed == 0) { NewMlu ->MemPool = NULL; } else { // It is not empty NewMlu ->MemPool = _cmsMalloc(mlu ->ContextID, mlu ->PoolUsed); if (NewMlu ->MemPool == NULL) goto Error; } NewMlu ->PoolSize = mlu ->PoolUsed; if (NewMlu ->MemPool == NULL || mlu ->MemPool == NULL) goto Error; memmove(NewMlu ->MemPool, mlu->MemPool, mlu ->PoolUsed); NewMlu ->PoolUsed = mlu ->PoolUsed; return NewMlu; Error: if (NewMlu != NULL) cmsMLUfree(NewMlu); return NULL; } // Free any used memory void CMSEXPORT cmsMLUfree(cmsMLU* mlu) { if (mlu) { if (mlu -> Entries) _cmsFree(mlu ->ContextID, mlu->Entries); if (mlu -> MemPool) _cmsFree(mlu ->ContextID, mlu->MemPool); _cmsFree(mlu ->ContextID, mlu); } } // The algorithm first searches for an exact match of country and language, if not found it uses // the Language. If none is found, first entry is used instead. static const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu, cmsUInt32Number *len, cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode, cmsUInt16Number* UsedLanguageCode, cmsUInt16Number* UsedCountryCode) { int i; int Best = -1; _cmsMLUentry* v; if (mlu == NULL) return NULL; if (mlu -> AllocatedEntries <= 0) return NULL; for (i=0; i < mlu ->UsedEntries; i++) { v = mlu ->Entries + i; if (v -> Language == LanguageCode) { if (Best == -1) Best = i; if (v -> Country == CountryCode) { if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language; if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country; if (len != NULL) *len = v ->Len; return (wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v -> StrW); // Found exact match } } } // No string found. Return First one if (Best == -1) Best = 0; v = mlu ->Entries + Best; if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language; if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country; if (len != NULL) *len = v ->Len; return(wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v ->StrW); } // Obtain an ASCII representation of the wide string. Setting buffer to NULL returns the len cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], char* Buffer, cmsUInt32Number BufferSize) { const wchar_t *Wide; cmsUInt32Number StrLen = 0; cmsUInt32Number ASCIIlen, i; cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode); cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode); // Sanitize if (mlu == NULL) return 0; // Get WideChar Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL); if (Wide == NULL) return 0; ASCIIlen = StrLen / sizeof(wchar_t); // Maybe we want only to know the len? if (Buffer == NULL) return ASCIIlen + 1; // Note the zero at the end // No buffer size means no data if (BufferSize <= 0) return 0; // Some clipping may be required if (BufferSize < ASCIIlen + 1) ASCIIlen = BufferSize - 1; // Precess each character for (i=0; i < ASCIIlen; i++) { if (Wide[i] == 0) Buffer[i] = 0; else Buffer[i] = (char) Wide[i]; } // We put a termination "\0" Buffer[ASCIIlen] = 0; return ASCIIlen + 1; } // Obtain a wide representation of the MLU, on depending on current locale settings cmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], wchar_t* Buffer, cmsUInt32Number BufferSize) { const wchar_t *Wide; cmsUInt32Number StrLen = 0; cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode); cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode); // Sanitize if (mlu == NULL) return 0; Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL); if (Wide == NULL) return 0; // Maybe we want only to know the len? if (Buffer == NULL) return StrLen + sizeof(wchar_t); // No buffer size means no data if (BufferSize <= 0) return 0; // Some clipping may be required if (BufferSize < StrLen + sizeof(wchar_t)) StrLen = BufferSize - + sizeof(wchar_t); memmove(Buffer, Wide, StrLen); Buffer[StrLen / sizeof(wchar_t)] = 0; return StrLen + sizeof(wchar_t); } // Get also the language and country CMSAPI cmsBool CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], char ObtainedLanguage[3], char ObtainedCountry[3]) { const wchar_t *Wide; cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode); cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode); cmsUInt16Number ObtLang, ObtCode; // Sanitize if (mlu == NULL) return FALSE; Wide = _cmsMLUgetWide(mlu, NULL, Lang, Cntry, &ObtLang, &ObtCode); if (Wide == NULL) return FALSE; // Get used language and code *(cmsUInt16Number *)ObtainedLanguage = _cmsAdjustEndianess16(ObtLang); *(cmsUInt16Number *)ObtainedCountry = _cmsAdjustEndianess16(ObtCode); ObtainedLanguage[2] = ObtainedCountry[2] = 0; return TRUE; } // Get the number of translations in the MLU object cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu) { if (mlu == NULL) return 0; return mlu->UsedEntries; } // Get the language and country codes for a specific MLU index cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu, cmsUInt32Number idx, char LanguageCode[3], char CountryCode[3]) { _cmsMLUentry *entry; if (mlu == NULL) return FALSE; if (idx >= (cmsUInt32Number) mlu->UsedEntries) return FALSE; entry = &mlu->Entries[idx]; *(cmsUInt16Number *)LanguageCode = _cmsAdjustEndianess16(entry->Language); *(cmsUInt16Number *)CountryCode = _cmsAdjustEndianess16(entry->Country); return TRUE; } // Named color lists -------------------------------------------------------------------------------------------- // Grow the list to keep at least NumElements static cmsBool GrowNamedColorList(cmsNAMEDCOLORLIST* v) { cmsUInt32Number size; _cmsNAMEDCOLOR * NewPtr; if (v == NULL) return FALSE; if (v ->Allocated == 0) size = 64; // Initial guess else size = v ->Allocated * 2; // Keep a maximum color lists can grow, 100K entries seems reasonable if (size > 1024*100) return FALSE; NewPtr = (_cmsNAMEDCOLOR*) _cmsRealloc(v ->ContextID, v ->List, size * sizeof(_cmsNAMEDCOLOR)); if (NewPtr == NULL) return FALSE; v ->List = NewPtr; v ->Allocated = size; return TRUE; } // Allocate a list for n elements cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUInt32Number n, cmsUInt32Number ColorantCount, const char* Prefix, const char* Suffix) { cmsNAMEDCOLORLIST* v = (cmsNAMEDCOLORLIST*) _cmsMallocZero(ContextID, sizeof(cmsNAMEDCOLORLIST)); if (v == NULL) return NULL; v ->List = NULL; v ->nColors = 0; v ->ContextID = ContextID; while (v -> Allocated < n) GrowNamedColorList(v); strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1); strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1); v->Prefix[32] = v->Suffix[32] = 0; v -> ColorantCount = ColorantCount; return v; } // Free a list void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v) { if (v == NULL) return; if (v ->List) _cmsFree(v ->ContextID, v ->List); _cmsFree(v ->ContextID, v); } cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v) { cmsNAMEDCOLORLIST* NewNC; if (v == NULL) return NULL; NewNC= cmsAllocNamedColorList(v ->ContextID, v -> nColors, v ->ColorantCount, v ->Prefix, v ->Suffix); if (NewNC == NULL) return NULL; // For really large tables we need this while (NewNC ->Allocated < v ->Allocated) GrowNamedColorList(NewNC); memmove(NewNC ->Prefix, v ->Prefix, sizeof(v ->Prefix)); memmove(NewNC ->Suffix, v ->Suffix, sizeof(v ->Suffix)); NewNC ->ColorantCount = v ->ColorantCount; memmove(NewNC->List, v ->List, v->nColors * sizeof(_cmsNAMEDCOLOR)); NewNC ->nColors = v ->nColors; return NewNC; } // Append a color to a list. List pointer may change if reallocated cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* NamedColorList, const char* Name, cmsUInt16Number PCS[3], cmsUInt16Number Colorant[cmsMAXCHANNELS]) { cmsUInt32Number i; if (NamedColorList == NULL) return FALSE; if (NamedColorList ->nColors + 1 > NamedColorList ->Allocated) { if (!GrowNamedColorList(NamedColorList)) return FALSE; } for (i=0; i < NamedColorList ->ColorantCount; i++) NamedColorList ->List[NamedColorList ->nColors].DeviceColorant[i] = Colorant == NULL? 0 : Colorant[i]; for (i=0; i < 3; i++) NamedColorList ->List[NamedColorList ->nColors].PCS[i] = PCS == NULL ? 0 : PCS[i]; if (Name != NULL) { strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name, cmsMAX_PATH-1); NamedColorList ->List[NamedColorList ->nColors].Name[cmsMAX_PATH-1] = 0; } else NamedColorList ->List[NamedColorList ->nColors].Name[0] = 0; NamedColorList ->nColors++; return TRUE; } // Returns number of elements cmsUInt32Number CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* NamedColorList) { if (NamedColorList == NULL) return 0; return NamedColorList ->nColors; } // Info aboout a given color cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor, char* Name, char* Prefix, char* Suffix, cmsUInt16Number* PCS, cmsUInt16Number* Colorant) { if (NamedColorList == NULL) return FALSE; if (nColor >= cmsNamedColorCount(NamedColorList)) return FALSE; if (Name) strcpy(Name, NamedColorList->List[nColor].Name); if (Prefix) strcpy(Prefix, NamedColorList->Prefix); if (Suffix) strcpy(Suffix, NamedColorList->Suffix); if (PCS) memmove(PCS, NamedColorList ->List[nColor].PCS, 3*sizeof(cmsUInt16Number)); if (Colorant) memmove(Colorant, NamedColorList ->List[nColor].DeviceColorant, sizeof(cmsUInt16Number) * NamedColorList ->ColorantCount); return TRUE; } // Search for a given color name (no prefix or suffix) cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* NamedColorList, const char* Name) { int i, n; if (NamedColorList == NULL) return -1; n = cmsNamedColorCount(NamedColorList); for (i=0; i < n; i++) { if (cmsstrcasecmp(Name, NamedColorList->List[i].Name) == 0) return i; } return -1; } // MPE support ----------------------------------------------------------------------------------------------------------------- static void FreeNamedColorList(cmsStage* mpe) { cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data; cmsFreeNamedColorList(List); } static void* DupNamedColorList(cmsStage* mpe) { cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data; return cmsDupNamedColorList(List); } static void EvalNamedColorPCS(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data; cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0); if (index >= NamedColorList-> nColors) { cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range; ignored", index); } else { // Named color always uses Lab Out[0] = (cmsFloat32Number) (NamedColorList->List[index].PCS[0] / 65535.0); Out[1] = (cmsFloat32Number) (NamedColorList->List[index].PCS[1] / 65535.0); Out[2] = (cmsFloat32Number) (NamedColorList->List[index].PCS[2] / 65535.0); } } static void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data; cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0); cmsUInt32Number j; if (index >= NamedColorList-> nColors) { cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range; ignored", index); } else { for (j=0; j < NamedColorList ->ColorantCount; j++) Out[j] = (cmsFloat32Number) (NamedColorList->List[index].DeviceColorant[j] / 65535.0); } } // Named color lookup element cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS) { return _cmsStageAllocPlaceholder(NamedColorList ->ContextID, cmsSigNamedColorElemType, 1, UsePCS ? 3 : NamedColorList ->ColorantCount, UsePCS ? EvalNamedColorPCS : EvalNamedColor, DupNamedColorList, FreeNamedColorList, cmsDupNamedColorList(NamedColorList)); } // Retrieve the named color list from a transform. Should be first element in the LUT cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform) { _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform; cmsStage* mpe = v ->Lut->Elements; if (mpe ->Type != cmsSigNamedColorElemType) return NULL; return (cmsNAMEDCOLORLIST*) mpe ->Data; } // Profile sequence description routines ------------------------------------------------------------------------------------- cmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n) { cmsSEQ* Seq; cmsUInt32Number i; if (n == 0) return NULL; // In a absolutely arbitrary way, I hereby decide to allow a maxim of 255 profiles linked // in a devicelink. It makes not sense anyway and may be used for exploits, so let's close the door! if (n > 255) return NULL; Seq = (cmsSEQ*) _cmsMallocZero(ContextID, sizeof(cmsSEQ)); if (Seq == NULL) return NULL; Seq -> ContextID = ContextID; Seq -> seq = (cmsPSEQDESC*) _cmsCalloc(ContextID, n, sizeof(cmsPSEQDESC)); Seq -> n = n; if (Seq -> seq == NULL) { _cmsFree(ContextID, Seq); return NULL; } for (i=0; i < n; i++) { Seq -> seq[i].Manufacturer = NULL; Seq -> seq[i].Model = NULL; Seq -> seq[i].Description = NULL; } return Seq; } void CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq) { cmsUInt32Number i; for (i=0; i < pseq ->n; i++) { if (pseq ->seq[i].Manufacturer != NULL) cmsMLUfree(pseq ->seq[i].Manufacturer); if (pseq ->seq[i].Model != NULL) cmsMLUfree(pseq ->seq[i].Model); if (pseq ->seq[i].Description != NULL) cmsMLUfree(pseq ->seq[i].Description); } if (pseq ->seq != NULL) _cmsFree(pseq ->ContextID, pseq ->seq); _cmsFree(pseq -> ContextID, pseq); } cmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq) { cmsSEQ *NewSeq; cmsUInt32Number i; if (pseq == NULL) return NULL; NewSeq = (cmsSEQ*) _cmsMalloc(pseq -> ContextID, sizeof(cmsSEQ)); if (NewSeq == NULL) return NULL; NewSeq -> seq = (cmsPSEQDESC*) _cmsCalloc(pseq ->ContextID, pseq ->n, sizeof(cmsPSEQDESC)); if (NewSeq ->seq == NULL) goto Error; NewSeq -> ContextID = pseq ->ContextID; NewSeq -> n = pseq ->n; for (i=0; i < pseq->n; i++) { memmove(&NewSeq ->seq[i].attributes, &pseq ->seq[i].attributes, sizeof(cmsUInt64Number)); NewSeq ->seq[i].deviceMfg = pseq ->seq[i].deviceMfg; NewSeq ->seq[i].deviceModel = pseq ->seq[i].deviceModel; memmove(&NewSeq ->seq[i].ProfileID, &pseq ->seq[i].ProfileID, sizeof(cmsProfileID)); NewSeq ->seq[i].technology = pseq ->seq[i].technology; NewSeq ->seq[i].Manufacturer = cmsMLUdup(pseq ->seq[i].Manufacturer); NewSeq ->seq[i].Model = cmsMLUdup(pseq ->seq[i].Model); NewSeq ->seq[i].Description = cmsMLUdup(pseq ->seq[i].Description); } return NewSeq; Error: cmsFreeProfileSequenceDescription(NewSeq); return NULL; } // Dictionaries -------------------------------------------------------------------------------------------------------- // Dictionaries are just very simple linked lists typedef struct _cmsDICT_struct { cmsDICTentry* head; cmsContext ContextID; } _cmsDICT; // Allocate an empty dictionary cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID) { _cmsDICT* dict = (_cmsDICT*) _cmsMallocZero(ContextID, sizeof(_cmsDICT)); if (dict == NULL) return NULL; dict ->ContextID = ContextID; return (cmsHANDLE) dict; } // Dispose resources void CMSEXPORT cmsDictFree(cmsHANDLE hDict) { _cmsDICT* dict = (_cmsDICT*) hDict; cmsDICTentry *entry, *next; _cmsAssert(dict != NULL); // Walk the list freeing all nodes entry = dict ->head; while (entry != NULL) { if (entry ->DisplayName != NULL) cmsMLUfree(entry ->DisplayName); if (entry ->DisplayValue != NULL) cmsMLUfree(entry ->DisplayValue); if (entry ->Name != NULL) _cmsFree(dict ->ContextID, entry -> Name); if (entry ->Value != NULL) _cmsFree(dict ->ContextID, entry -> Value); // Don't fall in the habitual trap... next = entry ->Next; _cmsFree(dict ->ContextID, entry); entry = next; } _cmsFree(dict ->ContextID, dict); } // Duplicate a wide char string static wchar_t* DupWcs(cmsContext ContextID, const wchar_t* ptr) { if (ptr == NULL) return NULL; return (wchar_t*) _cmsDupMem(ContextID, ptr, (mywcslen(ptr) + 1) * sizeof(wchar_t)); } // Add a new entry to the linked list cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue) { _cmsDICT* dict = (_cmsDICT*) hDict; cmsDICTentry *entry; _cmsAssert(dict != NULL); _cmsAssert(Name != NULL); entry = (cmsDICTentry*) _cmsMallocZero(dict ->ContextID, sizeof(cmsDICTentry)); if (entry == NULL) return FALSE; entry ->DisplayName = cmsMLUdup(DisplayName); entry ->DisplayValue = cmsMLUdup(DisplayValue); entry ->Name = DupWcs(dict ->ContextID, Name); entry ->Value = DupWcs(dict ->ContextID, Value); entry ->Next = dict ->head; dict ->head = entry; return TRUE; } // Duplicates an existing dictionary cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict) { _cmsDICT* old_dict = (_cmsDICT*) hDict; cmsHANDLE hNew; cmsDICTentry *entry; _cmsAssert(old_dict != NULL); hNew = cmsDictAlloc(old_dict ->ContextID); if (hNew == NULL) return NULL; // Walk the list freeing all nodes entry = old_dict ->head; while (entry != NULL) { if (!cmsDictAddEntry(hNew, entry ->Name, entry ->Value, entry ->DisplayName, entry ->DisplayValue)) { cmsDictFree(hNew); return NULL; } entry = entry -> Next; } return hNew; } // Get a pointer to the linked list const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict) { _cmsDICT* dict = (_cmsDICT*) hDict; if (dict == NULL) return NULL; return dict ->head; } // Helper For external languages const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e) { if (e == NULL) return NULL; return e ->Next; } lcms2-2.6/src/cmserr.c0000644002406300000240000005045512311617072014165 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- #include "lcms2_internal.h" // I am so tired about incompatibilities on those functions that here are some replacements // that hopefully would be fully portable. // compare two strings ignoring case int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2) { register const unsigned char *us1 = (const unsigned char *)s1, *us2 = (const unsigned char *)s2; while (toupper(*us1) == toupper(*us2++)) if (*us1++ == '\0') return 0; return (toupper(*us1) - toupper(*--us2)); } // long int because C99 specifies ftell in such way (7.19.9.2) long int CMSEXPORT cmsfilelength(FILE* f) { long int p , n; p = ftell(f); // register current file position if (fseek(f, 0, SEEK_END) != 0) { return -1; } n = ftell(f); fseek(f, p, SEEK_SET); // file position restored return n; } // Memory handling ------------------------------------------------------------------ // // This is the interface to low-level memory management routines. By default a simple // wrapping to malloc/free/realloc is provided, although there is a limit on the max // amount of memoy that can be reclaimed. This is mostly as a safety feature to prevent // bogus or evil code to allocate huge blocks that otherwise lcms would never need. #define MAX_MEMORY_FOR_ALLOC ((cmsUInt32Number)(1024U*1024U*512U)) // User may override this behaviour by using a memory plug-in, which basically replaces // the default memory management functions. In this case, no check is performed and it // is up to the plug-in writter to keep in the safe side. There are only three functions // required to be implemented: malloc, realloc and free, although the user may want to // replace the optional mallocZero, calloc and dup as well. cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // ********************************************************************************* // This is the default memory allocation function. It does a very coarse // check of amout of memory, just to prevent exploits static void* _cmsMallocDefaultFn(cmsContext ContextID, cmsUInt32Number size) { if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never allow over maximum return (void*) malloc(size); cmsUNUSED_PARAMETER(ContextID); } // Generic allocate & zero static void* _cmsMallocZeroDefaultFn(cmsContext ContextID, cmsUInt32Number size) { void *pt = _cmsMalloc(ContextID, size); if (pt == NULL) return NULL; memset(pt, 0, size); return pt; } // The default free function. The only check proformed is against NULL pointers static void _cmsFreeDefaultFn(cmsContext ContextID, void *Ptr) { // free(NULL) is defined a no-op by C99, therefore it is safe to // avoid the check, but it is here just in case... if (Ptr) free(Ptr); cmsUNUSED_PARAMETER(ContextID); } // The default realloc function. Again it checks for exploits. If Ptr is NULL, // realloc behaves the same way as malloc and allocates a new block of size bytes. static void* _cmsReallocDefaultFn(cmsContext ContextID, void* Ptr, cmsUInt32Number size) { if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never realloc over 512Mb return realloc(Ptr, size); cmsUNUSED_PARAMETER(ContextID); } // The default calloc function. Allocates an array of num elements, each one of size bytes // all memory is initialized to zero. static void* _cmsCallocDefaultFn(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size) { cmsUInt32Number Total = num * size; // Preserve calloc behaviour if (Total == 0) return NULL; // Safe check for overflow. if (num >= UINT_MAX / size) return NULL; // Check for overflow if (Total < num || Total < size) { return NULL; } if (Total > MAX_MEMORY_FOR_ALLOC) return NULL; // Never alloc over 512Mb return _cmsMallocZero(ContextID, Total); } // Generic block duplication static void* _cmsDupDefaultFn(cmsContext ContextID, const void* Org, cmsUInt32Number size) { void* mem; if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never dup over 512Mb mem = _cmsMalloc(ContextID, size); if (mem != NULL && Org != NULL) memmove(mem, Org, size); return mem; } // Pointers to memory manager functions in Context0 _cmsMemPluginChunkType _cmsMemPluginChunk = { _cmsMallocDefaultFn, _cmsMallocZeroDefaultFn, _cmsFreeDefaultFn, _cmsReallocDefaultFn, _cmsCallocDefaultFn, _cmsDupDefaultFn }; // Reset and duplicate memory manager void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsAssert(ctx != NULL); if (src != NULL) { // Duplicate ctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType)); } else { // To reset it, we use the default allocators, which cannot be overriden ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager; } } // Auxiliar to fill memory management functions from plugin (or context 0 defaults) void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr) { if (Plugin == NULL) { memcpy(ptr, &_cmsMemPluginChunk, sizeof(_cmsMemPluginChunk)); } else { ptr ->MallocPtr = Plugin -> MallocPtr; ptr ->FreePtr = Plugin -> FreePtr; ptr ->ReallocPtr = Plugin -> ReallocPtr; // Make sure we revert to defaults ptr ->MallocZeroPtr= _cmsMallocZeroDefaultFn; ptr ->CallocPtr = _cmsCallocDefaultFn; ptr ->DupPtr = _cmsDupDefaultFn; if (Plugin ->MallocZeroPtr != NULL) ptr ->MallocZeroPtr = Plugin -> MallocZeroPtr; if (Plugin ->CallocPtr != NULL) ptr ->CallocPtr = Plugin -> CallocPtr; if (Plugin ->DupPtr != NULL) ptr ->DupPtr = Plugin -> DupPtr; } } // Plug-in replacement entry cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase *Data) { cmsPluginMemHandler* Plugin = (cmsPluginMemHandler*) Data; _cmsMemPluginChunkType* ptr; // NULL forces to reset to defaults. In this special case, the defaults are stored in the context structure. // Remaining plug-ins does NOT have any copy in the context structure, but this is somehow special as the // context internal data should be malloce'd by using those functions. if (Data == NULL) { struct _cmsContext_struct* ctx = ( struct _cmsContext_struct*) ContextID; // Return to the default allocators if (ContextID != NULL) { ctx->chunks[MemPlugin] = (void*) &ctx->DefaultMemoryManager; } return TRUE; } // Check for required callbacks if (Plugin -> MallocPtr == NULL || Plugin -> FreePtr == NULL || Plugin -> ReallocPtr == NULL) return FALSE; // Set replacement functions ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); if (ptr == NULL) return FALSE; _cmsInstallAllocFunctions(Plugin, ptr); return TRUE; } // Generic allocate void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); return ptr ->MallocPtr(ContextID, size); } // Generic allocate & zero void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); return ptr->MallocZeroPtr(ContextID, size); } // Generic calloc void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); return ptr->CallocPtr(ContextID, num, size); } // Generic reallocate void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number size) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); return ptr->ReallocPtr(ContextID, Ptr, size); } // Generic free memory void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr) { if (Ptr != NULL) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); ptr ->FreePtr(ContextID, Ptr); } } // Generic block duplication void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size) { _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); return ptr ->DupPtr(ContextID, Org, size); } // ******************************************************************************************** // Sub allocation takes care of many pointers of small size. The memory allocated in // this way have be freed at once. Next function allocates a single chunk for linked list // I prefer this method over realloc due to the big inpact on xput realloc may have if // memory is being swapped to disk. This approach is safer (although that may not be true on all platforms) static _cmsSubAllocator_chunk* _cmsCreateSubAllocChunk(cmsContext ContextID, cmsUInt32Number Initial) { _cmsSubAllocator_chunk* chunk; // 20K by default if (Initial == 0) Initial = 20*1024; // Create the container chunk = (_cmsSubAllocator_chunk*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator_chunk)); if (chunk == NULL) return NULL; // Initialize values chunk ->Block = (cmsUInt8Number*) _cmsMalloc(ContextID, Initial); if (chunk ->Block == NULL) { // Something went wrong _cmsFree(ContextID, chunk); return NULL; } chunk ->BlockSize = Initial; chunk ->Used = 0; chunk ->next = NULL; return chunk; } // The suballocated is nothing but a pointer to the first element in the list. We also keep // the thread ID in this structure. _cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial) { _cmsSubAllocator* sub; // Create the container sub = (_cmsSubAllocator*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator)); if (sub == NULL) return NULL; sub ->ContextID = ContextID; sub ->h = _cmsCreateSubAllocChunk(ContextID, Initial); if (sub ->h == NULL) { _cmsFree(ContextID, sub); return NULL; } return sub; } // Get rid of whole linked list void _cmsSubAllocDestroy(_cmsSubAllocator* sub) { _cmsSubAllocator_chunk *chunk, *n; for (chunk = sub ->h; chunk != NULL; chunk = n) { n = chunk->next; if (chunk->Block != NULL) _cmsFree(sub ->ContextID, chunk->Block); _cmsFree(sub ->ContextID, chunk); } // Free the header _cmsFree(sub ->ContextID, sub); } // Get a pointer to small memory block. void* _cmsSubAlloc(_cmsSubAllocator* sub, cmsUInt32Number size) { cmsUInt32Number Free = sub -> h ->BlockSize - sub -> h -> Used; cmsUInt8Number* ptr; size = _cmsALIGNMEM(size); // Check for memory. If there is no room, allocate a new chunk of double memory size. if (size > Free) { _cmsSubAllocator_chunk* chunk; cmsUInt32Number newSize; newSize = sub -> h ->BlockSize * 2; if (newSize < size) newSize = size; chunk = _cmsCreateSubAllocChunk(sub -> ContextID, newSize); if (chunk == NULL) return NULL; // Link list chunk ->next = sub ->h; sub ->h = chunk; } ptr = sub -> h ->Block + sub -> h ->Used; sub -> h -> Used += size; return (void*) ptr; } // Duplicate in pool void* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size) { void *NewPtr; // Dup of null pointer is also NULL if (ptr == NULL) return NULL; NewPtr = _cmsSubAlloc(s, size); if (ptr != NULL && NewPtr != NULL) { memcpy(NewPtr, ptr, size); } return NewPtr; } // Error logging ****************************************************************** // There is no error handling at all. When a funtion fails, it returns proper value. // For example, all create functions does return NULL on failure. Other return FALSE // It may be interesting, for the developer, to know why the function is failing. // for that reason, lcms2 does offer a logging function. This function does recive // a ENGLISH string with some clues on what is going wrong. You can show this // info to the end user, or just create some sort of log. // The logging function should NOT terminate the program, as this obviously can leave // resources. It is the programmer's responsability to check each function return code // to make sure it didn't fail. // Error messages are limited to MAX_ERROR_MESSAGE_LEN #define MAX_ERROR_MESSAGE_LEN 1024 // --------------------------------------------------------------------------------------------------------- // This is our default log error static void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text); // Context0 storage, which is global _cmsLogErrorChunkType _cmsLogErrorChunk = { DefaultLogErrorHandlerFunction }; // Allocates and inits error logger container for a given context. If src is NULL, only initializes the value // to the default. Otherwise, it duplicates the value. The interface is standard across all context clients void _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { static _cmsLogErrorChunkType LogErrorChunk = { DefaultLogErrorHandlerFunction }; void* from; if (src != NULL) { from = src ->chunks[Logger]; } else { from = &LogErrorChunk; } ctx ->chunks[Logger] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsLogErrorChunkType)); } // The default error logger does nothing. static void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { // fprintf(stderr, "[lcms]: %s\n", Text); // fflush(stderr); cmsUNUSED_PARAMETER(ContextID); cmsUNUSED_PARAMETER(ErrorCode); cmsUNUSED_PARAMETER(Text); } // Change log error, context based void CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn) { _cmsLogErrorChunkType* lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger); if (lhg != NULL) { if (Fn == NULL) lhg -> LogErrorHandler = DefaultLogErrorHandlerFunction; else lhg -> LogErrorHandler = Fn; } } // Change log error, legacy void CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn) { cmsSetLogErrorHandlerTHR(NULL, Fn); } // Log an error // ErrorText is a text holding an english description of error. void CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...) { va_list args; char Buffer[MAX_ERROR_MESSAGE_LEN]; _cmsLogErrorChunkType* lhg; va_start(args, ErrorText); vsnprintf(Buffer, MAX_ERROR_MESSAGE_LEN-1, ErrorText, args); va_end(args); // Check for the context, if specified go there. If not, go for the global lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger); if (lhg ->LogErrorHandler) { lhg ->LogErrorHandler(ContextID, ErrorCode, Buffer); } } // Utility function to print signatures void _cmsTagSignature2String(char String[5], cmsTagSignature sig) { cmsUInt32Number be; // Convert to big endian be = _cmsAdjustEndianess32((cmsUInt32Number) sig); // Move chars memmove(String, &be, 4); // Make sure of terminator String[4] = 0; } //-------------------------------------------------------------------------------------------------- static void* defMtxCreate(cmsContext id) { _cmsMutex* ptr_mutex = (_cmsMutex*) _cmsMalloc(id, sizeof(_cmsMutex)); _cmsInitMutexPrimitive(ptr_mutex); return (void*) ptr_mutex; } static void defMtxDestroy(cmsContext id, void* mtx) { _cmsDestroyMutexPrimitive((_cmsMutex *) mtx); _cmsFree(id, mtx); } static cmsBool defMtxLock(cmsContext id, void* mtx) { cmsUNUSED_PARAMETER(id); return _cmsLockPrimitive((_cmsMutex *) mtx) == 0; } static void defMtxUnlock(cmsContext id, void* mtx) { cmsUNUSED_PARAMETER(id); _cmsUnlockPrimitive((_cmsMutex *) mtx); } // Pointers to memory manager functions in Context0 _cmsMutexPluginChunkType _cmsMutexPluginChunk = { defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock }; // Allocate and init mutex container. void _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { static _cmsMutexPluginChunkType MutexChunk = {defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock }; void* from; if (src != NULL) { from = src ->chunks[MutexPlugin]; } else { from = &MutexChunk; } ctx ->chunks[MutexPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsMutexPluginChunkType)); } // Register new ways to transform cmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Data) { cmsPluginMutex* Plugin = (cmsPluginMutex*) Data; _cmsMutexPluginChunkType* ctx = ( _cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); if (Data == NULL) { // No lock routines ctx->CreateMutexPtr = NULL; ctx->DestroyMutexPtr = NULL; ctx->LockMutexPtr = NULL; ctx ->UnlockMutexPtr = NULL; return TRUE; } // Factory callback is required if (Plugin ->CreateMutexPtr == NULL || Plugin ->DestroyMutexPtr == NULL || Plugin ->LockMutexPtr == NULL || Plugin ->UnlockMutexPtr == NULL) return FALSE; ctx->CreateMutexPtr = Plugin->CreateMutexPtr; ctx->DestroyMutexPtr = Plugin ->DestroyMutexPtr; ctx ->LockMutexPtr = Plugin ->LockMutexPtr; ctx ->UnlockMutexPtr = Plugin ->UnlockMutexPtr; // All is ok return TRUE; } // Generic Mutex fns void* CMSEXPORT _cmsCreateMutex(cmsContext ContextID) { _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); if (ptr ->CreateMutexPtr == NULL) return NULL; return ptr ->CreateMutexPtr(ContextID); } void CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx) { _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); if (ptr ->DestroyMutexPtr != NULL) { ptr ->DestroyMutexPtr(ContextID, mtx); } } cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx) { _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); if (ptr ->LockMutexPtr == NULL) return TRUE; return ptr ->LockMutexPtr(ContextID, mtx); } void CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx) { _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); if (ptr ->UnlockMutexPtr != NULL) { ptr ->UnlockMutexPtr(ContextID, mtx); } } lcms2-2.6/src/cmsxform.c0000644002406300000240000012032012311617072014515 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Transformations stuff // ----------------------------------------------------------------------- #define DEFAULT_OBSERVER_ADAPTATION_STATE 1.0 // The Context0 observer adaptation state. _cmsAdaptationStateChunkType _cmsAdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE }; // Init and duplicate observer adaptation state void _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { static _cmsAdaptationStateChunkType AdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE }; void* from; if (src != NULL) { from = src ->chunks[AdaptationStateContext]; } else { from = &AdaptationStateChunk; } ctx ->chunks[AdaptationStateContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAdaptationStateChunkType)); } // Sets adaptation state for absolute colorimetric intent in the given context. Adaptation state applies on all // but cmsCreateExtendedTransformTHR(). Little CMS can handle incomplete adaptation states. cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d) { cmsFloat64Number prev; _cmsAdaptationStateChunkType* ptr = (_cmsAdaptationStateChunkType*) _cmsContextGetClientChunk(ContextID, AdaptationStateContext); // Get previous value for return prev = ptr ->AdaptationState; // Set the value if d is positive or zero if (d >= 0.0) { ptr ->AdaptationState = d; } // Always return previous value return prev; } // The adaptation state may be defaulted by this function. If you don't like it, use the extended transform routine cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d) { return cmsSetAdaptationStateTHR(NULL, d); } // ----------------------------------------------------------------------- // Alarm codes for 16-bit transformations, because the fixed range of containers there are // no values left to mark out of gamut. #define DEFAULT_ALARM_CODES_VALUE {0x7F00, 0x7F00, 0x7F00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} _cmsAlarmCodesChunkType _cmsAlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE }; // Sets the codes used to mark out-out-gamut on Proofing transforms for a given context. Values are meant to be // encoded in 16 bits. void CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID, const cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS]) { _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext); _cmsAssert(ContextAlarmCodes != NULL); // Can't happen memcpy(ContextAlarmCodes->AlarmCodes, AlarmCodesP, sizeof(ContextAlarmCodes->AlarmCodes)); } // Gets the current codes used to mark out-out-gamut on Proofing transforms for the given context. // Values are meant to be encoded in 16 bits. void CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID, cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS]) { _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext); _cmsAssert(ContextAlarmCodes != NULL); // Can't happen memcpy(AlarmCodesP, ContextAlarmCodes->AlarmCodes, sizeof(ContextAlarmCodes->AlarmCodes)); } void CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS]) { _cmsAssert(NewAlarm != NULL); cmsSetAlarmCodesTHR(NULL, NewAlarm); } void CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number OldAlarm[cmsMAXCHANNELS]) { _cmsAssert(OldAlarm != NULL); cmsGetAlarmCodesTHR(NULL, OldAlarm); } // Init and duplicate alarm codes void _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { static _cmsAlarmCodesChunkType AlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE }; void* from; if (src != NULL) { from = src ->chunks[AlarmCodesContext]; } else { from = &AlarmCodesChunk; } ctx ->chunks[AlarmCodesContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAlarmCodesChunkType)); } // ----------------------------------------------------------------------- // Get rid of transform resources void CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* p = (_cmsTRANSFORM*) hTransform; _cmsAssert(p != NULL); if (p -> GamutCheck) cmsPipelineFree(p -> GamutCheck); if (p -> Lut) cmsPipelineFree(p -> Lut); if (p ->InputColorant) cmsFreeNamedColorList(p ->InputColorant); if (p -> OutputColorant) cmsFreeNamedColorList(p ->OutputColorant); if (p ->Sequence) cmsFreeProfileSequenceDescription(p ->Sequence); if (p ->UserData) p ->FreeUserData(p ->ContextID, p ->UserData); _cmsFree(p ->ContextID, (void *) p); } // Apply transform. void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number Size) { _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform; p -> xform(p, InputBuffer, OutputBuffer, Size, Size); } // Apply transform. void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number Size, cmsUInt32Number Stride) { _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform; p -> xform(p, InputBuffer, OutputBuffer, Size, Stride); } // Transform routines ---------------------------------------------------------------------------------------------------------- // Float xform converts floats. Since there are no performance issues, one routine does all job, including gamut check. // Note that because extended range, we can use a -1.0 value for out of gamut in this case. static void FloatXFORM(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsFloat32Number fIn[cmsMAXCHANNELS], fOut[cmsMAXCHANNELS]; cmsFloat32Number OutOfGamut; cmsUInt32Number i, j; accum = (cmsUInt8Number*) in; output = (cmsUInt8Number*) out; for (i=0; i < Size; i++) { accum = p -> FromInputFloat(p, fIn, accum, Stride); // Any gamut chack to do? if (p ->GamutCheck != NULL) { // Evaluate gamut marker. cmsPipelineEvalFloat( fIn, &OutOfGamut, p ->GamutCheck); // Is current color out of gamut? if (OutOfGamut > 0.0) { // Certainly, out of gamut for (j=0; j < cmsMAXCHANNELS; j++) fOut[j] = -1.0; } else { // No, proceed normally cmsPipelineEvalFloat(fIn, fOut, p -> Lut); } } else { // No gamut check at all cmsPipelineEvalFloat(fIn, fOut, p -> Lut); } // Back to asked representation output = p -> ToOutputFloat(p, fOut, output, Stride); } } static void NullFloatXFORM(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsFloat32Number fIn[cmsMAXCHANNELS]; cmsUInt32Number i, n; accum = (cmsUInt8Number*) in; output = (cmsUInt8Number*) out; n = Size; for (i=0; i < n; i++) { accum = p -> FromInputFloat(p, fIn, accum, Stride); output = p -> ToOutputFloat(p, fIn, output, Stride); } } // 16 bit precision ----------------------------------------------------------------------------------------------------------- // Null transformation, only applies formatters. No cach static void NullXFORM(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS]; cmsUInt32Number i, n; accum = (cmsUInt8Number*) in; output = (cmsUInt8Number*) out; n = Size; // Buffer len for (i=0; i < n; i++) { accum = p -> FromInput(p, wIn, accum, Stride); output = p -> ToOutput(p, wIn, output, Stride); } } // No gamut check, no cache, 16 bits static void PrecalculatedXFORM(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { register cmsUInt8Number* accum; register cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; cmsUInt32Number i, n; accum = (cmsUInt8Number*) in; output = (cmsUInt8Number*) out; n = Size; for (i=0; i < n; i++) { accum = p -> FromInput(p, wIn, accum, Stride); p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data); output = p -> ToOutput(p, wOut, output, Stride); } } // Auxiliar: Handle precalculated gamut check. The retrieval of context may be alittle bit slow, but this function is not critical. static void TransformOnePixelWithGamutCheck(_cmsTRANSFORM* p, const cmsUInt16Number wIn[], cmsUInt16Number wOut[]) { cmsUInt16Number wOutOfGamut; p ->GamutCheck ->Eval16Fn(wIn, &wOutOfGamut, p ->GamutCheck ->Data); if (wOutOfGamut >= 1) { cmsUInt16Number i; _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(p->ContextID, AlarmCodesContext); for (i=0; i < p ->Lut->OutputChannels; i++) { wOut[i] = ContextAlarmCodes ->AlarmCodes[i]; } } else p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data); } // Gamut check, No cach, 16 bits. static void PrecalculatedXFORMGamutCheck(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; cmsUInt32Number i, n; accum = (cmsUInt8Number*) in; output = (cmsUInt8Number*) out; n = Size; // Buffer len for (i=0; i < n; i++) { accum = p -> FromInput(p, wIn, accum, Stride); TransformOnePixelWithGamutCheck(p, wIn, wOut); output = p -> ToOutput(p, wOut, output, Stride); } } // No gamut check, Cach, 16 bits, static void CachedXFORM(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; cmsUInt32Number i, n; _cmsCACHE Cache; accum = (cmsUInt8Number*) in; output = (cmsUInt8Number*) out; n = Size; // Buffer len // Empty buffers for quick memcmp memset(wIn, 0, sizeof(wIn)); memset(wOut, 0, sizeof(wOut)); // Get copy of zero cache memcpy(&Cache, &p ->Cache, sizeof(Cache)); for (i=0; i < n; i++) { accum = p -> FromInput(p, wIn, accum, Stride); if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) { memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut)); } else { p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data); memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn)); memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut)); } output = p -> ToOutput(p, wOut, output, Stride); } } // All those nice features together static void CachedXFORMGamutCheck(_cmsTRANSFORM* p, const void* in, void* out, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt8Number* accum; cmsUInt8Number* output; cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; cmsUInt32Number i, n; _cmsCACHE Cache; accum = (cmsUInt8Number*) in; output = (cmsUInt8Number*) out; n = Size; // Buffer len // Empty buffers for quick memcmp memset(wIn, 0, sizeof(cmsUInt16Number) * cmsMAXCHANNELS); memset(wOut, 0, sizeof(cmsUInt16Number) * cmsMAXCHANNELS); // Get copy of zero cache memcpy(&Cache, &p ->Cache, sizeof(Cache)); for (i=0; i < n; i++) { accum = p -> FromInput(p, wIn, accum, Stride); if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) { memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut)); } else { TransformOnePixelWithGamutCheck(p, wIn, wOut); memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn)); memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut)); } output = p -> ToOutput(p, wOut, output, Stride); } } // ------------------------------------------------------------------------------------------------------------- // List of used-defined transform factories typedef struct _cmsTransformCollection_st { _cmsTransformFactory Factory; struct _cmsTransformCollection_st *Next; } _cmsTransformCollection; // The linked list head _cmsTransformPluginChunkType _cmsTransformPluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupPluginTransformList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsTransformPluginChunkType newHead = { NULL }; _cmsTransformCollection* entry; _cmsTransformCollection* Anterior = NULL; _cmsTransformPluginChunkType* head = (_cmsTransformPluginChunkType*) src->chunks[TransformPlugin]; // Walk the list copying all nodes for (entry = head->TransformCollection; entry != NULL; entry = entry ->Next) { _cmsTransformCollection *newEntry = ( _cmsTransformCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTransformCollection)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.TransformCollection == NULL) newHead.TransformCollection = newEntry; } ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTransformPluginChunkType)); } void _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { // Copy all linked list DupPluginTransformList(ctx, src); } else { static _cmsTransformPluginChunkType TransformPluginChunkType = { NULL }; ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TransformPluginChunkType, sizeof(_cmsTransformPluginChunkType)); } } // Register new ways to transform cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Data) { cmsPluginTransform* Plugin = (cmsPluginTransform*) Data; _cmsTransformCollection* fl; _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID,TransformPlugin); if (Data == NULL) { // Free the chain. Memory is safely freed at exit ctx->TransformCollection = NULL; return TRUE; } // Factory callback is required if (Plugin ->Factory == NULL) return FALSE; fl = (_cmsTransformCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsTransformCollection)); if (fl == NULL) return FALSE; // Copy the parameters fl ->Factory = Plugin ->Factory; // Keep linked list fl ->Next = ctx->TransformCollection; ctx->TransformCollection = fl; // All is ok return TRUE; } void CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn) { _cmsAssert(CMMcargo != NULL); CMMcargo ->UserData = ptr; CMMcargo ->FreeUserData = FreePrivateDataFn; } // returns the pointer defined by the plug-in to store private data void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo) { _cmsAssert(CMMcargo != NULL); return CMMcargo ->UserData; } // returns the current formatters void CMSEXPORT _cmsGetTransformFormatters16(struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput) { _cmsAssert(CMMcargo != NULL); if (FromInput) *FromInput = CMMcargo ->FromInput; if (ToOutput) *ToOutput = CMMcargo ->ToOutput; } void CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput) { _cmsAssert(CMMcargo != NULL); if (FromInput) *FromInput = CMMcargo ->FromInputFloat; if (ToOutput) *ToOutput = CMMcargo ->ToOutputFloat; } // Allocate transform struct and set it to defaults. Ask the optimization plug-in about if those formats are proper // for separated transforms. If this is the case, static _cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID, TransformPlugin); _cmsTransformCollection* Plugin; // Allocate needed memory _cmsTRANSFORM* p = (_cmsTRANSFORM*) _cmsMallocZero(ContextID, sizeof(_cmsTRANSFORM)); if (!p) return NULL; // Store the proposed pipeline p ->Lut = lut; // Let's see if any plug-in want to do the transform by itself for (Plugin = ctx ->TransformCollection; Plugin != NULL; Plugin = Plugin ->Next) { if (Plugin ->Factory(&p->xform, &p->UserData, &p ->FreeUserData, &p ->Lut, InputFormat, OutputFormat, dwFlags)) { // Last plugin in the declaration order takes control. We just keep // the original parameters as a logging. // Note that cmsFLAGS_CAN_CHANGE_FORMATTER is not set, so by default // an optimized transform is not reusable. The plug-in can, however, change // the flags and make it suitable. p ->ContextID = ContextID; p ->InputFormat = *InputFormat; p ->OutputFormat = *OutputFormat; p ->dwOriginalFlags = *dwFlags; // Fill the formatters just in case the optimized routine is interested. // No error is thrown if the formatter doesn't exist. It is up to the optimization // factory to decide what to do in those cases. p ->FromInput = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; p ->ToOutput = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; p ->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat; p ->ToOutputFloat = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat; return p; } } // Not suitable for the transform plug-in, let's check the pipeline plug-in if (p ->Lut != NULL) _cmsOptimizePipeline(ContextID, &p->Lut, Intent, InputFormat, OutputFormat, dwFlags); // Check whatever this is a true floating point transform if (_cmsFormatterIsFloat(*InputFormat) && _cmsFormatterIsFloat(*OutputFormat)) { // Get formatter function always return a valid union, but the contents of this union may be NULL. p ->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat; p ->ToOutputFloat = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat; *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; if (p ->FromInputFloat == NULL || p ->ToOutputFloat == NULL) { cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); _cmsFree(ContextID, p); return NULL; } if (*dwFlags & cmsFLAGS_NULLTRANSFORM) { p ->xform = NullFloatXFORM; } else { // Float transforms don't use cach, always are non-NULL p ->xform = FloatXFORM; } } else { if (*InputFormat == 0 && *OutputFormat == 0) { p ->FromInput = p ->ToOutput = NULL; *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; } else { int BytesPerPixelInput; p ->FromInput = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; p ->ToOutput = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; if (p ->FromInput == NULL || p ->ToOutput == NULL) { cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); _cmsFree(ContextID, p); return NULL; } BytesPerPixelInput = T_BYTES(p ->InputFormat); if (BytesPerPixelInput == 0 || BytesPerPixelInput >= 2) *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; } if (*dwFlags & cmsFLAGS_NULLTRANSFORM) { p ->xform = NullXFORM; } else { if (*dwFlags & cmsFLAGS_NOCACHE) { if (*dwFlags & cmsFLAGS_GAMUTCHECK) p ->xform = PrecalculatedXFORMGamutCheck; // Gamut check, no cach else p ->xform = PrecalculatedXFORM; // No cach, no gamut check } else { if (*dwFlags & cmsFLAGS_GAMUTCHECK) p ->xform = CachedXFORMGamutCheck; // Gamut check, cach else p ->xform = CachedXFORM; // No gamut check, cach } } } p ->InputFormat = *InputFormat; p ->OutputFormat = *OutputFormat; p ->dwOriginalFlags = *dwFlags; p ->ContextID = ContextID; p ->UserData = NULL; return p; } static cmsBool GetXFormColorSpaces(int nProfiles, cmsHPROFILE hProfiles[], cmsColorSpaceSignature* Input, cmsColorSpaceSignature* Output) { cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut; cmsColorSpaceSignature PostColorSpace; int i; if (nProfiles <= 0) return FALSE; if (hProfiles[0] == NULL) return FALSE; *Input = PostColorSpace = cmsGetColorSpace(hProfiles[0]); for (i=0; i < nProfiles; i++) { cmsProfileClassSignature cls; cmsHPROFILE hProfile = hProfiles[i]; int lIsInput = (PostColorSpace != cmsSigXYZData) && (PostColorSpace != cmsSigLabData); if (hProfile == NULL) return FALSE; cls = cmsGetDeviceClass(hProfile); if (cls == cmsSigNamedColorClass) { ColorSpaceIn = cmsSig1colorData; ColorSpaceOut = (nProfiles > 1) ? cmsGetPCS(hProfile) : cmsGetColorSpace(hProfile); } else if (lIsInput || (cls == cmsSigLinkClass)) { ColorSpaceIn = cmsGetColorSpace(hProfile); ColorSpaceOut = cmsGetPCS(hProfile); } else { ColorSpaceIn = cmsGetPCS(hProfile); ColorSpaceOut = cmsGetColorSpace(hProfile); } if (i==0) *Input = ColorSpaceIn; PostColorSpace = ColorSpaceOut; } *Output = PostColorSpace; return TRUE; } // Check colorspace static cmsBool IsProperColorSpace(cmsColorSpaceSignature Check, cmsUInt32Number dwFormat) { int Space1 = T_COLORSPACE(dwFormat); int Space2 = _cmsLCMScolorSpace(Check); if (Space1 == PT_ANY) return TRUE; if (Space1 == Space2) return TRUE; if (Space1 == PT_LabV2 && Space2 == PT_Lab) return TRUE; if (Space1 == PT_Lab && Space2 == PT_LabV2) return TRUE; return FALSE; } // ---------------------------------------------------------------------------------------------------------------- static void SetWhitePoint(cmsCIEXYZ* wtPt, const cmsCIEXYZ* src) { if (src == NULL) { wtPt ->X = cmsD50X; wtPt ->Y = cmsD50Y; wtPt ->Z = cmsD50Z; } else { wtPt ->X = src->X; wtPt ->Y = src->Y; wtPt ->Z = src->Z; } } // New to lcms 2.0 -- have all parameters available. cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[], cmsBool BPC[], cmsUInt32Number Intents[], cmsFloat64Number AdaptationStates[], cmsHPROFILE hGamutProfile, cmsUInt32Number nGamutPCSposition, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number dwFlags) { _cmsTRANSFORM* xform; cmsColorSpaceSignature EntryColorSpace; cmsColorSpaceSignature ExitColorSpace; cmsPipeline* Lut; cmsUInt32Number LastIntent = Intents[nProfiles-1]; // If it is a fake transform if (dwFlags & cmsFLAGS_NULLTRANSFORM) { return AllocEmptyTransform(ContextID, NULL, INTENT_PERCEPTUAL, &InputFormat, &OutputFormat, &dwFlags); } // If gamut check is requested, make sure we have a gamut profile if (dwFlags & cmsFLAGS_GAMUTCHECK) { if (hGamutProfile == NULL) dwFlags &= ~cmsFLAGS_GAMUTCHECK; } // On floating point transforms, inhibit cache if (_cmsFormatterIsFloat(InputFormat) || _cmsFormatterIsFloat(OutputFormat)) dwFlags |= cmsFLAGS_NOCACHE; // Mark entry/exit spaces if (!GetXFormColorSpaces(nProfiles, hProfiles, &EntryColorSpace, &ExitColorSpace)) { cmsSignalError(ContextID, cmsERROR_NULL, "NULL input profiles on transform"); return NULL; } // Check if proper colorspaces if (!IsProperColorSpace(EntryColorSpace, InputFormat)) { cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Wrong input color space on transform"); return NULL; } if (!IsProperColorSpace(ExitColorSpace, OutputFormat)) { cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Wrong output color space on transform"); return NULL; } // Create a pipeline with all transformations Lut = _cmsLinkProfiles(ContextID, nProfiles, Intents, hProfiles, BPC, AdaptationStates, dwFlags); if (Lut == NULL) { cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Couldn't link the profiles"); return NULL; } // Check channel count if ((cmsChannelsOf(EntryColorSpace) != cmsPipelineInputChannels(Lut)) || (cmsChannelsOf(ExitColorSpace) != cmsPipelineOutputChannels(Lut))) { cmsPipelineFree(Lut); cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Channel count doesn't match. Profile is corrupted"); return NULL; } // All seems ok xform = AllocEmptyTransform(ContextID, Lut, LastIntent, &InputFormat, &OutputFormat, &dwFlags); if (xform == NULL) { return NULL; } // Keep values xform ->EntryColorSpace = EntryColorSpace; xform ->ExitColorSpace = ExitColorSpace; xform ->RenderingIntent = Intents[nProfiles-1]; // Take white points SetWhitePoint(&xform->EntryWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[0], cmsSigMediaWhitePointTag)); SetWhitePoint(&xform->ExitWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[nProfiles-1], cmsSigMediaWhitePointTag)); // Create a gamut check LUT if requested if (hGamutProfile != NULL && (dwFlags & cmsFLAGS_GAMUTCHECK)) xform ->GamutCheck = _cmsCreateGamutCheckPipeline(ContextID, hProfiles, BPC, Intents, AdaptationStates, nGamutPCSposition, hGamutProfile); // Try to read input and output colorant table if (cmsIsTag(hProfiles[0], cmsSigColorantTableTag)) { // Input table can only come in this way. xform ->InputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[0], cmsSigColorantTableTag)); } // Output is a little bit more complex. if (cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigLinkClass) { // This tag may exist only on devicelink profiles. if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag)) { // It may be NULL if error xform ->OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag)); } } else { if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableTag)) { xform -> OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableTag)); } } // Store the sequence of profiles if (dwFlags & cmsFLAGS_KEEP_SEQUENCE) { xform ->Sequence = _cmsCompileProfileSequence(ContextID, nProfiles, hProfiles); } else xform ->Sequence = NULL; // If this is a cached transform, init first value, which is zero (16 bits only) if (!(dwFlags & cmsFLAGS_NOCACHE)) { memset(&xform ->Cache.CacheIn, 0, sizeof(xform ->Cache.CacheIn)); if (xform ->GamutCheck != NULL) { TransformOnePixelWithGamutCheck(xform, xform ->Cache.CacheIn, xform->Cache.CacheOut); } else { xform ->Lut ->Eval16Fn(xform ->Cache.CacheIn, xform->Cache.CacheOut, xform -> Lut->Data); } } return (cmsHTRANSFORM) xform; } // Multiprofile transforms: Gamut check is not available here, as it is unclear from which profile the gamut comes. cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID, cmsHPROFILE hProfiles[], cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsUInt32Number i; cmsBool BPC[256]; cmsUInt32Number Intents[256]; cmsFloat64Number AdaptationStates[256]; if (nProfiles <= 0 || nProfiles > 255) { cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles); return NULL; } for (i=0; i < nProfiles; i++) { BPC[i] = dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION ? TRUE : FALSE; Intents[i] = Intent; AdaptationStates[i] = cmsSetAdaptationStateTHR(ContextID, -1); } return cmsCreateExtendedTransform(ContextID, nProfiles, hProfiles, BPC, Intents, AdaptationStates, NULL, 0, InputFormat, OutputFormat, dwFlags); } cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[], cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { if (nProfiles <= 0 || nProfiles > 255) { cmsSignalError(NULL, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles); return NULL; } return cmsCreateMultiprofileTransformTHR(cmsGetProfileContextID(hProfiles[0]), hProfiles, nProfiles, InputFormat, OutputFormat, Intent, dwFlags); } cmsHTRANSFORM CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID, cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsHPROFILE hArray[2]; hArray[0] = Input; hArray[1] = Output; return cmsCreateMultiprofileTransformTHR(ContextID, hArray, Output == NULL ? 1 : 2, InputFormat, OutputFormat, Intent, dwFlags); } CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransform(cmsHPROFILE Input, cmsUInt32Number InputFormat, cmsHPROFILE Output, cmsUInt32Number OutputFormat, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { return cmsCreateTransformTHR(cmsGetProfileContextID(Input), Input, InputFormat, Output, OutputFormat, Intent, dwFlags); } cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID, cmsHPROFILE InputProfile, cmsUInt32Number InputFormat, cmsHPROFILE OutputProfile, cmsUInt32Number OutputFormat, cmsHPROFILE ProofingProfile, cmsUInt32Number nIntent, cmsUInt32Number ProofingIntent, cmsUInt32Number dwFlags) { cmsHPROFILE hArray[4]; cmsUInt32Number Intents[4]; cmsBool BPC[4]; cmsFloat64Number Adaptation[4]; cmsBool DoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION) ? TRUE : FALSE; hArray[0] = InputProfile; hArray[1] = ProofingProfile; hArray[2] = ProofingProfile; hArray[3] = OutputProfile; Intents[0] = nIntent; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = ProofingIntent; BPC[0] = DoBPC; BPC[1] = DoBPC; BPC[2] = 0; BPC[3] = 0; Adaptation[0] = Adaptation[1] = Adaptation[2] = Adaptation[3] = cmsSetAdaptationStateTHR(ContextID, -1); if (!(dwFlags & (cmsFLAGS_SOFTPROOFING|cmsFLAGS_GAMUTCHECK))) return cmsCreateTransformTHR(ContextID, InputProfile, InputFormat, OutputProfile, OutputFormat, nIntent, dwFlags); return cmsCreateExtendedTransform(ContextID, 4, hArray, BPC, Intents, Adaptation, ProofingProfile, 1, InputFormat, OutputFormat, dwFlags); } cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile, cmsUInt32Number InputFormat, cmsHPROFILE OutputProfile, cmsUInt32Number OutputFormat, cmsHPROFILE ProofingProfile, cmsUInt32Number nIntent, cmsUInt32Number ProofingIntent, cmsUInt32Number dwFlags) { return cmsCreateProofingTransformTHR(cmsGetProfileContextID(InputProfile), InputProfile, InputFormat, OutputProfile, OutputFormat, ProofingProfile, nIntent, ProofingIntent, dwFlags); } // Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; if (xform == NULL) return NULL; return xform -> ContextID; } // Grab the input/output formats cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; if (xform == NULL) return 0; return xform->InputFormat; } cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; if (xform == NULL) return 0; return xform->OutputFormat; } // For backwards compatibility cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat) { _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; cmsFormatter16 FromInput, ToOutput; // We only can afford to change formatters if previous transform is at least 16 bits if (!(xform ->dwOriginalFlags & cmsFLAGS_CAN_CHANGE_FORMATTER)) { cmsSignalError(xform ->ContextID, cmsERROR_NOT_SUITABLE, "cmsChangeBuffersFormat works only on transforms created originally with at least 16 bits of precision"); return FALSE; } FromInput = _cmsGetFormatter(xform->ContextID, InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; ToOutput = _cmsGetFormatter(xform->ContextID, OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; if (FromInput == NULL || ToOutput == NULL) { cmsSignalError(xform -> ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); return FALSE; } xform ->InputFormat = InputFormat; xform ->OutputFormat = OutputFormat; xform ->FromInput = FromInput; xform ->ToOutput = ToOutput; return TRUE; } lcms2-2.6/src/cmscnvrt.c0000644002406300000240000012160312311617072014523 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Link several profiles to obtain a single LUT modelling the whole color transform. Intents, Black point // compensation and Adaptation parameters may vary across profiles. BPC and Adaptation refers to the PCS // after the profile. I.e, BPC[0] refers to connexion between profile(0) and profile(1) cmsPipeline* _cmsLinkProfiles(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number Intents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); //--------------------------------------------------------------------------------- // This is the default routine for ICC-style intents. A user may decide to override it by using a plugin. // Supported intents are perceptual, relative colorimetric, saturation and ICC-absolute colorimetric static cmsPipeline* DefaultICCintents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number Intents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); //--------------------------------------------------------------------------------- // This is the entry for black-preserving K-only intents, which are non-ICC. Last profile have to be a output profile // to do the trick (no devicelinks allowed at that position) static cmsPipeline* BlackPreservingKOnlyIntents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number Intents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); //--------------------------------------------------------------------------------- // This is the entry for black-plane preserving, which are non-ICC. Again, Last profile have to be a output profile // to do the trick (no devicelinks allowed at that position) static cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number Intents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); //--------------------------------------------------------------------------------- // This is a structure holding implementations for all supported intents. typedef struct _cms_intents_list { cmsUInt32Number Intent; char Description[256]; cmsIntentFn Link; struct _cms_intents_list* Next; } cmsIntentsList; // Built-in intents static cmsIntentsList DefaultIntents[] = { { INTENT_PERCEPTUAL, "Perceptual", DefaultICCintents, &DefaultIntents[1] }, { INTENT_RELATIVE_COLORIMETRIC, "Relative colorimetric", DefaultICCintents, &DefaultIntents[2] }, { INTENT_SATURATION, "Saturation", DefaultICCintents, &DefaultIntents[3] }, { INTENT_ABSOLUTE_COLORIMETRIC, "Absolute colorimetric", DefaultICCintents, &DefaultIntents[4] }, { INTENT_PRESERVE_K_ONLY_PERCEPTUAL, "Perceptual preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[5] }, { INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC, "Relative colorimetric preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[6] }, { INTENT_PRESERVE_K_ONLY_SATURATION, "Saturation preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[7] }, { INTENT_PRESERVE_K_PLANE_PERCEPTUAL, "Perceptual preserving black plane", BlackPreservingKPlaneIntents, &DefaultIntents[8] }, { INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC,"Relative colorimetric preserving black plane", BlackPreservingKPlaneIntents, &DefaultIntents[9] }, { INTENT_PRESERVE_K_PLANE_SATURATION, "Saturation preserving black plane", BlackPreservingKPlaneIntents, NULL } }; // A pointer to the begining of the list _cmsIntentsPluginChunkType _cmsIntentsPluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupPluginIntentsList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsIntentsPluginChunkType newHead = { NULL }; cmsIntentsList* entry; cmsIntentsList* Anterior = NULL; _cmsIntentsPluginChunkType* head = (_cmsIntentsPluginChunkType*) src->chunks[IntentPlugin]; // Walk the list copying all nodes for (entry = head->Intents; entry != NULL; entry = entry ->Next) { cmsIntentsList *newEntry = ( cmsIntentsList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsIntentsList)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.Intents == NULL) newHead.Intents = newEntry; } ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsIntentsPluginChunkType)); } void _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { if (src != NULL) { // Copy all linked list DupPluginIntentsList(ctx, src); } else { static _cmsIntentsPluginChunkType IntentsPluginChunkType = { NULL }; ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx ->MemPool, &IntentsPluginChunkType, sizeof(_cmsIntentsPluginChunkType)); } } // Search the list for a suitable intent. Returns NULL if not found static cmsIntentsList* SearchIntent(cmsContext ContextID, cmsUInt32Number Intent) { _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin); cmsIntentsList* pt; for (pt = ctx -> Intents; pt != NULL; pt = pt -> Next) if (pt ->Intent == Intent) return pt; for (pt = DefaultIntents; pt != NULL; pt = pt -> Next) if (pt ->Intent == Intent) return pt; return NULL; } // Black point compensation. Implemented as a linear scaling in XYZ. Black points // should come relative to the white point. Fills an matrix/offset element m // which is organized as a 4x4 matrix. static void ComputeBlackPointCompensation(const cmsCIEXYZ* BlackPointIn, const cmsCIEXYZ* BlackPointOut, cmsMAT3* m, cmsVEC3* off) { cmsFloat64Number ax, ay, az, bx, by, bz, tx, ty, tz; // Now we need to compute a matrix plus an offset m and of such of // [m]*bpin + off = bpout // [m]*D50 + off = D50 // // This is a linear scaling in the form ax+b, where // a = (bpout - D50) / (bpin - D50) // b = - D50* (bpout - bpin) / (bpin - D50) tx = BlackPointIn->X - cmsD50_XYZ()->X; ty = BlackPointIn->Y - cmsD50_XYZ()->Y; tz = BlackPointIn->Z - cmsD50_XYZ()->Z; ax = (BlackPointOut->X - cmsD50_XYZ()->X) / tx; ay = (BlackPointOut->Y - cmsD50_XYZ()->Y) / ty; az = (BlackPointOut->Z - cmsD50_XYZ()->Z) / tz; bx = - cmsD50_XYZ()-> X * (BlackPointOut->X - BlackPointIn->X) / tx; by = - cmsD50_XYZ()-> Y * (BlackPointOut->Y - BlackPointIn->Y) / ty; bz = - cmsD50_XYZ()-> Z * (BlackPointOut->Z - BlackPointIn->Z) / tz; _cmsVEC3init(&m ->v[0], ax, 0, 0); _cmsVEC3init(&m ->v[1], 0, ay, 0); _cmsVEC3init(&m ->v[2], 0, 0, az); _cmsVEC3init(off, bx, by, bz); } // Approximate a blackbody illuminant based on CHAD information static cmsFloat64Number CHAD2Temp(const cmsMAT3* Chad) { // Convert D50 across inverse CHAD to get the absolute white point cmsVEC3 d, s; cmsCIEXYZ Dest; cmsCIExyY DestChromaticity; cmsFloat64Number TempK; cmsMAT3 m1, m2; m1 = *Chad; if (!_cmsMAT3inverse(&m1, &m2)) return FALSE; s.n[VX] = cmsD50_XYZ() -> X; s.n[VY] = cmsD50_XYZ() -> Y; s.n[VZ] = cmsD50_XYZ() -> Z; _cmsMAT3eval(&d, &m2, &s); Dest.X = d.n[VX]; Dest.Y = d.n[VY]; Dest.Z = d.n[VZ]; cmsXYZ2xyY(&DestChromaticity, &Dest); if (!cmsTempFromWhitePoint(&TempK, &DestChromaticity)) return -1.0; return TempK; } // Compute a CHAD based on a given temperature static void Temp2CHAD(cmsMAT3* Chad, cmsFloat64Number Temp) { cmsCIEXYZ White; cmsCIExyY ChromaticityOfWhite; cmsWhitePointFromTemp(&ChromaticityOfWhite, Temp); cmsxyY2XYZ(&White, &ChromaticityOfWhite); _cmsAdaptationMatrix(Chad, NULL, &White, cmsD50_XYZ()); } // Join scalings to obtain relative input to absolute and then to relative output. // Result is stored in a 3x3 matrix static cmsBool ComputeAbsoluteIntent(cmsFloat64Number AdaptationState, const cmsCIEXYZ* WhitePointIn, const cmsMAT3* ChromaticAdaptationMatrixIn, const cmsCIEXYZ* WhitePointOut, const cmsMAT3* ChromaticAdaptationMatrixOut, cmsMAT3* m) { cmsMAT3 Scale, m1, m2, m3, m4; // Adaptation state if (AdaptationState == 1.0) { // Observer is fully adapted. Keep chromatic adaptation. // That is the standard V4 behaviour _cmsVEC3init(&m->v[0], WhitePointIn->X / WhitePointOut->X, 0, 0); _cmsVEC3init(&m->v[1], 0, WhitePointIn->Y / WhitePointOut->Y, 0); _cmsVEC3init(&m->v[2], 0, 0, WhitePointIn->Z / WhitePointOut->Z); } else { // Incomplete adaptation. This is an advanced feature. _cmsVEC3init(&Scale.v[0], WhitePointIn->X / WhitePointOut->X, 0, 0); _cmsVEC3init(&Scale.v[1], 0, WhitePointIn->Y / WhitePointOut->Y, 0); _cmsVEC3init(&Scale.v[2], 0, 0, WhitePointIn->Z / WhitePointOut->Z); if (AdaptationState == 0.0) { m1 = *ChromaticAdaptationMatrixOut; _cmsMAT3per(&m2, &m1, &Scale); // m2 holds CHAD from output white to D50 times abs. col. scaling // Observer is not adapted, undo the chromatic adaptation _cmsMAT3per(m, &m2, ChromaticAdaptationMatrixOut); m3 = *ChromaticAdaptationMatrixIn; if (!_cmsMAT3inverse(&m3, &m4)) return FALSE; _cmsMAT3per(m, &m2, &m4); } else { cmsMAT3 MixedCHAD; cmsFloat64Number TempSrc, TempDest, Temp; m1 = *ChromaticAdaptationMatrixIn; if (!_cmsMAT3inverse(&m1, &m2)) return FALSE; _cmsMAT3per(&m3, &m2, &Scale); // m3 holds CHAD from input white to D50 times abs. col. scaling TempSrc = CHAD2Temp(ChromaticAdaptationMatrixIn); TempDest = CHAD2Temp(ChromaticAdaptationMatrixOut); if (TempSrc < 0.0 || TempDest < 0.0) return FALSE; // Something went wrong if (_cmsMAT3isIdentity(&Scale) && fabs(TempSrc - TempDest) < 0.01) { _cmsMAT3identity(m); return TRUE; } Temp = (1.0 - AdaptationState) * TempDest + AdaptationState * TempSrc; // Get a CHAD from whatever output temperature to D50. This replaces output CHAD Temp2CHAD(&MixedCHAD, Temp); _cmsMAT3per(m, &m3, &MixedCHAD); } } return TRUE; } // Just to see if m matrix should be applied static cmsBool IsEmptyLayer(cmsMAT3* m, cmsVEC3* off) { cmsFloat64Number diff = 0; cmsMAT3 Ident; int i; if (m == NULL && off == NULL) return TRUE; // NULL is allowed as an empty layer if (m == NULL && off != NULL) return FALSE; // This is an internal error _cmsMAT3identity(&Ident); for (i=0; i < 3*3; i++) diff += fabs(((cmsFloat64Number*)m)[i] - ((cmsFloat64Number*)&Ident)[i]); for (i=0; i < 3; i++) diff += fabs(((cmsFloat64Number*)off)[i]); return (diff < 0.002); } // Compute the conversion layer static cmsBool ComputeConversion(int i, cmsHPROFILE hProfiles[], cmsUInt32Number Intent, cmsBool BPC, cmsFloat64Number AdaptationState, cmsMAT3* m, cmsVEC3* off) { int k; // m and off are set to identity and this is detected latter on _cmsMAT3identity(m); _cmsVEC3init(off, 0, 0, 0); // If intent is abs. colorimetric, if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) { cmsCIEXYZ WhitePointIn, WhitePointOut; cmsMAT3 ChromaticAdaptationMatrixIn, ChromaticAdaptationMatrixOut; _cmsReadMediaWhitePoint(&WhitePointIn, hProfiles[i-1]); _cmsReadCHAD(&ChromaticAdaptationMatrixIn, hProfiles[i-1]); _cmsReadMediaWhitePoint(&WhitePointOut, hProfiles[i]); _cmsReadCHAD(&ChromaticAdaptationMatrixOut, hProfiles[i]); if (!ComputeAbsoluteIntent(AdaptationState, &WhitePointIn, &ChromaticAdaptationMatrixIn, &WhitePointOut, &ChromaticAdaptationMatrixOut, m)) return FALSE; } else { // Rest of intents may apply BPC. if (BPC) { cmsCIEXYZ BlackPointIn, BlackPointOut; cmsDetectBlackPoint(&BlackPointIn, hProfiles[i-1], Intent, 0); cmsDetectDestinationBlackPoint(&BlackPointOut, hProfiles[i], Intent, 0); // If black points are equal, then do nothing if (BlackPointIn.X != BlackPointOut.X || BlackPointIn.Y != BlackPointOut.Y || BlackPointIn.Z != BlackPointOut.Z) ComputeBlackPointCompensation(&BlackPointIn, &BlackPointOut, m, off); } } // Offset should be adjusted because the encoding. We encode XYZ normalized to 0..1.0, // to do that, we divide by MAX_ENCODEABLE_XZY. The conversion stage goes XYZ -> XYZ so // we have first to convert from encoded to XYZ and then convert back to encoded. // y = Mx + Off // x = x'c // y = M x'c + Off // y = y'c; y' = y / c // y' = (Mx'c + Off) /c = Mx' + (Off / c) for (k=0; k < 3; k++) { off ->n[k] /= MAX_ENCODEABLE_XYZ; } return TRUE; } // Add a conversion stage if needed. If a matrix/offset m is given, it applies to XYZ space static cmsBool AddConversion(cmsPipeline* Result, cmsColorSpaceSignature InPCS, cmsColorSpaceSignature OutPCS, cmsMAT3* m, cmsVEC3* off) { cmsFloat64Number* m_as_dbl = (cmsFloat64Number*) m; cmsFloat64Number* off_as_dbl = (cmsFloat64Number*) off; // Handle PCS mismatches. A specialized stage is added to the LUT in such case switch (InPCS) { case cmsSigXYZData: // Input profile operates in XYZ switch (OutPCS) { case cmsSigXYZData: // XYZ -> XYZ if (!IsEmptyLayer(m, off) && !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl))) return FALSE; break; case cmsSigLabData: // XYZ -> Lab if (!IsEmptyLayer(m, off) && !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl))) return FALSE; if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID))) return FALSE; break; default: return FALSE; // Colorspace mismatch } break; case cmsSigLabData: // Input profile operates in Lab switch (OutPCS) { case cmsSigXYZData: // Lab -> XYZ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID))) return FALSE; if (!IsEmptyLayer(m, off) && !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl))) return FALSE; break; case cmsSigLabData: // Lab -> Lab if (!IsEmptyLayer(m, off)) { if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)) || !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)) || !cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID))) return FALSE; } break; default: return FALSE; // Mismatch } break; // On colorspaces other than PCS, check for same space default: if (InPCS != OutPCS) return FALSE; break; } return TRUE; } // Is a given space compatible with another? static cmsBool ColorSpaceIsCompatible(cmsColorSpaceSignature a, cmsColorSpaceSignature b) { // If they are same, they are compatible. if (a == b) return TRUE; // Check for MCH4 substitution of CMYK if ((a == cmsSig4colorData) && (b == cmsSigCmykData)) return TRUE; if ((a == cmsSigCmykData) && (b == cmsSig4colorData)) return TRUE; // Check for XYZ/Lab. Those spaces are interchangeable as they can be computed one from other. if ((a == cmsSigXYZData) && (b == cmsSigLabData)) return TRUE; if ((a == cmsSigLabData) && (b == cmsSigXYZData)) return TRUE; return FALSE; } // Default handler for ICC-style intents static cmsPipeline* DefaultICCintents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsPipeline* Lut = NULL; cmsPipeline* Result; cmsHPROFILE hProfile; cmsMAT3 m; cmsVEC3 off; cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut, CurrentColorSpace; cmsProfileClassSignature ClassSig; cmsUInt32Number i, Intent; // For safety if (nProfiles == 0) return NULL; // Allocate an empty LUT for holding the result. 0 as channel count means 'undefined' Result = cmsPipelineAlloc(ContextID, 0, 0); if (Result == NULL) return NULL; CurrentColorSpace = cmsGetColorSpace(hProfiles[0]); for (i=0; i < nProfiles; i++) { cmsBool lIsDeviceLink, lIsInput; hProfile = hProfiles[i]; ClassSig = cmsGetDeviceClass(hProfile); lIsDeviceLink = (ClassSig == cmsSigLinkClass || ClassSig == cmsSigAbstractClass ); // First profile is used as input unless devicelink or abstract if ((i == 0) && !lIsDeviceLink) { lIsInput = TRUE; } else { // Else use profile in the input direction if current space is not PCS lIsInput = (CurrentColorSpace != cmsSigXYZData) && (CurrentColorSpace != cmsSigLabData); } Intent = TheIntents[i]; if (lIsInput || lIsDeviceLink) { ColorSpaceIn = cmsGetColorSpace(hProfile); ColorSpaceOut = cmsGetPCS(hProfile); } else { ColorSpaceIn = cmsGetPCS(hProfile); ColorSpaceOut = cmsGetColorSpace(hProfile); } if (!ColorSpaceIsCompatible(ColorSpaceIn, CurrentColorSpace)) { cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "ColorSpace mismatch"); goto Error; } // If devicelink is found, then no custom intent is allowed and we can // read the LUT to be applied. Settings don't apply here. if (lIsDeviceLink || ((ClassSig == cmsSigNamedColorClass) && (nProfiles == 1))) { // Get the involved LUT from the profile Lut = _cmsReadDevicelinkLUT(hProfile, Intent); if (Lut == NULL) goto Error; // What about abstract profiles? if (ClassSig == cmsSigAbstractClass && i > 0) { if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error; } else { _cmsMAT3identity(&m); _cmsVEC3init(&off, 0, 0, 0); } if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error; } else { if (lIsInput) { // Input direction means non-pcs connection, so proceed like devicelinks Lut = _cmsReadInputLUT(hProfile, Intent); if (Lut == NULL) goto Error; } else { // Output direction means PCS connection. Intent may apply here Lut = _cmsReadOutputLUT(hProfile, Intent); if (Lut == NULL) goto Error; if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error; if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error; } } // Concatenate to the output LUT if (!cmsPipelineCat(Result, Lut)) goto Error; cmsPipelineFree(Lut); Lut = NULL; // Update current space CurrentColorSpace = ColorSpaceOut; } return Result; Error: if (Lut != NULL) cmsPipelineFree(Lut); if (Result != NULL) cmsPipelineFree(Result); return NULL; cmsUNUSED_PARAMETER(dwFlags); } // Wrapper for DLL calling convention cmsPipeline* CMSEXPORT _cmsDefaultICCintents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { return DefaultICCintents(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags); } // Black preserving intents --------------------------------------------------------------------------------------------- // Translate black-preserving intents to ICC ones static int TranslateNonICCIntents(int Intent) { switch (Intent) { case INTENT_PRESERVE_K_ONLY_PERCEPTUAL: case INTENT_PRESERVE_K_PLANE_PERCEPTUAL: return INTENT_PERCEPTUAL; case INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC: case INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC: return INTENT_RELATIVE_COLORIMETRIC; case INTENT_PRESERVE_K_ONLY_SATURATION: case INTENT_PRESERVE_K_PLANE_SATURATION: return INTENT_SATURATION; default: return Intent; } } // Sampler for Black-only preserving CMYK->CMYK transforms typedef struct { cmsPipeline* cmyk2cmyk; // The original transform cmsToneCurve* KTone; // Black-to-black tone curve } GrayOnlyParams; // Preserve black only if that is the only ink used static int BlackPreservingGrayOnlySampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { GrayOnlyParams* bp = (GrayOnlyParams*) Cargo; // If going across black only, keep black only if (In[0] == 0 && In[1] == 0 && In[2] == 0) { // TAC does not apply because it is black ink! Out[0] = Out[1] = Out[2] = 0; Out[3] = cmsEvalToneCurve16(bp->KTone, In[3]); return TRUE; } // Keep normal transform for other colors bp ->cmyk2cmyk ->Eval16Fn(In, Out, bp ->cmyk2cmyk->Data); return TRUE; } // This is the entry for black-preserving K-only intents, which are non-ICC static cmsPipeline* BlackPreservingKOnlyIntents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { GrayOnlyParams bp; cmsPipeline* Result; cmsUInt32Number ICCIntents[256]; cmsStage* CLUT; cmsUInt32Number i, nGridPoints; // Sanity check if (nProfiles < 1 || nProfiles > 255) return NULL; // Translate black-preserving intents to ICC ones for (i=0; i < nProfiles; i++) ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]); // Check for non-cmyk profiles if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData || cmsGetColorSpace(hProfiles[nProfiles-1]) != cmsSigCmykData) return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); memset(&bp, 0, sizeof(bp)); // Allocate an empty LUT for holding the result Result = cmsPipelineAlloc(ContextID, 4, 4); if (Result == NULL) return NULL; // Create a LUT holding normal ICC transform bp.cmyk2cmyk = DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); if (bp.cmyk2cmyk == NULL) goto Error; // Now, compute the tone curve bp.KTone = _cmsBuildKToneCurve(ContextID, 4096, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); if (bp.KTone == NULL) goto Error; // How many gridpoints are we going to use? nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags); // Create the CLUT. 16 bits CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL); if (CLUT == NULL) goto Error; // This is the one and only MPE in this LUT if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT)) goto Error; // Sample it. We cannot afford pre/post linearization this time. if (!cmsStageSampleCLut16bit(CLUT, BlackPreservingGrayOnlySampler, (void*) &bp, 0)) goto Error; // Get rid of xform and tone curve cmsPipelineFree(bp.cmyk2cmyk); cmsFreeToneCurve(bp.KTone); return Result; Error: if (bp.cmyk2cmyk != NULL) cmsPipelineFree(bp.cmyk2cmyk); if (bp.KTone != NULL) cmsFreeToneCurve(bp.KTone); if (Result != NULL) cmsPipelineFree(Result); return NULL; } // K Plane-preserving CMYK to CMYK ------------------------------------------------------------------------------------ typedef struct { cmsPipeline* cmyk2cmyk; // The original transform cmsHTRANSFORM hProofOutput; // Output CMYK to Lab (last profile) cmsHTRANSFORM cmyk2Lab; // The input chain cmsToneCurve* KTone; // Black-to-black tone curve cmsPipeline* LabK2cmyk; // The output profile cmsFloat64Number MaxError; cmsHTRANSFORM hRoundTrip; cmsFloat64Number MaxTAC; } PreserveKPlaneParams; // The CLUT will be stored at 16 bits, but calculations are performed at cmsFloat32Number precision static int BlackPreservingSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { int i; cmsFloat32Number Inf[4], Outf[4]; cmsFloat32Number LabK[4]; cmsFloat64Number SumCMY, SumCMYK, Error, Ratio; cmsCIELab ColorimetricLab, BlackPreservingLab; PreserveKPlaneParams* bp = (PreserveKPlaneParams*) Cargo; // Convert from 16 bits to floating point for (i=0; i < 4; i++) Inf[i] = (cmsFloat32Number) (In[i] / 65535.0); // Get the K across Tone curve LabK[3] = cmsEvalToneCurveFloat(bp ->KTone, Inf[3]); // If going across black only, keep black only if (In[0] == 0 && In[1] == 0 && In[2] == 0) { Out[0] = Out[1] = Out[2] = 0; Out[3] = _cmsQuickSaturateWord(LabK[3] * 65535.0); return TRUE; } // Try the original transform, cmsPipelineEvalFloat( Inf, Outf, bp ->cmyk2cmyk); // Store a copy of the floating point result into 16-bit for (i=0; i < 4; i++) Out[i] = _cmsQuickSaturateWord(Outf[i] * 65535.0); // Maybe K is already ok (mostly on K=0) if ( fabs(Outf[3] - LabK[3]) < (3.0 / 65535.0) ) { return TRUE; } // K differ, mesure and keep Lab measurement for further usage // this is done in relative colorimetric intent cmsDoTransform(bp->hProofOutput, Out, &ColorimetricLab, 1); // Is not black only and the transform doesn't keep black. // Obtain the Lab of output CMYK. After that we have Lab + K cmsDoTransform(bp ->cmyk2Lab, Outf, LabK, 1); // Obtain the corresponding CMY using reverse interpolation // (K is fixed in LabK[3]) if (!cmsPipelineEvalReverseFloat(LabK, Outf, Outf, bp ->LabK2cmyk)) { // Cannot find a suitable value, so use colorimetric xform // which is already stored in Out[] return TRUE; } // Make sure to pass thru K (which now is fixed) Outf[3] = LabK[3]; // Apply TAC if needed SumCMY = Outf[0] + Outf[1] + Outf[2]; SumCMYK = SumCMY + Outf[3]; if (SumCMYK > bp ->MaxTAC) { Ratio = 1 - ((SumCMYK - bp->MaxTAC) / SumCMY); if (Ratio < 0) Ratio = 0; } else Ratio = 1.0; Out[0] = _cmsQuickSaturateWord(Outf[0] * Ratio * 65535.0); // C Out[1] = _cmsQuickSaturateWord(Outf[1] * Ratio * 65535.0); // M Out[2] = _cmsQuickSaturateWord(Outf[2] * Ratio * 65535.0); // Y Out[3] = _cmsQuickSaturateWord(Outf[3] * 65535.0); // Estimate the error (this goes 16 bits to Lab DBL) cmsDoTransform(bp->hProofOutput, Out, &BlackPreservingLab, 1); Error = cmsDeltaE(&ColorimetricLab, &BlackPreservingLab); if (Error > bp -> MaxError) bp->MaxError = Error; return TRUE; } // This is the entry for black-plane preserving, which are non-ICC static cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { PreserveKPlaneParams bp; cmsPipeline* Result = NULL; cmsUInt32Number ICCIntents[256]; cmsStage* CLUT; cmsUInt32Number i, nGridPoints; cmsHPROFILE hLab; // Sanity check if (nProfiles < 1 || nProfiles > 255) return NULL; // Translate black-preserving intents to ICC ones for (i=0; i < nProfiles; i++) ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]); // Check for non-cmyk profiles if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData || !(cmsGetColorSpace(hProfiles[nProfiles-1]) == cmsSigCmykData || cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigOutputClass)) return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); // Allocate an empty LUT for holding the result Result = cmsPipelineAlloc(ContextID, 4, 4); if (Result == NULL) return NULL; memset(&bp, 0, sizeof(bp)); // We need the input LUT of the last profile, assuming this one is responsible of // black generation. This LUT will be seached in inverse order. bp.LabK2cmyk = _cmsReadInputLUT(hProfiles[nProfiles-1], INTENT_RELATIVE_COLORIMETRIC); if (bp.LabK2cmyk == NULL) goto Cleanup; // Get total area coverage (in 0..1 domain) bp.MaxTAC = cmsDetectTAC(hProfiles[nProfiles-1]) / 100.0; if (bp.MaxTAC <= 0) goto Cleanup; // Create a LUT holding normal ICC transform bp.cmyk2cmyk = DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); if (bp.cmyk2cmyk == NULL) goto Cleanup; // Now the tone curve bp.KTone = _cmsBuildKToneCurve(ContextID, 4096, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); if (bp.KTone == NULL) goto Cleanup; // To measure the output, Last profile to Lab hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); bp.hProofOutput = cmsCreateTransformTHR(ContextID, hProfiles[nProfiles-1], CHANNELS_SH(4)|BYTES_SH(2), hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); if ( bp.hProofOutput == NULL) goto Cleanup; // Same as anterior, but lab in the 0..1 range bp.cmyk2Lab = cmsCreateTransformTHR(ContextID, hProfiles[nProfiles-1], FLOAT_SH(1)|CHANNELS_SH(4)|BYTES_SH(4), hLab, FLOAT_SH(1)|CHANNELS_SH(3)|BYTES_SH(4), INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); if (bp.cmyk2Lab == NULL) goto Cleanup; cmsCloseProfile(hLab); // Error estimation (for debug only) bp.MaxError = 0; // How many gridpoints are we going to use? nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags); CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL); if (CLUT == NULL) goto Cleanup; if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT)) goto Cleanup; cmsStageSampleCLut16bit(CLUT, BlackPreservingSampler, (void*) &bp, 0); Cleanup: if (bp.cmyk2cmyk) cmsPipelineFree(bp.cmyk2cmyk); if (bp.cmyk2Lab) cmsDeleteTransform(bp.cmyk2Lab); if (bp.hProofOutput) cmsDeleteTransform(bp.hProofOutput); if (bp.KTone) cmsFreeToneCurve(bp.KTone); if (bp.LabK2cmyk) cmsPipelineFree(bp.LabK2cmyk); return Result; } // Link routines ------------------------------------------------------------------------------------------------------ // Chain several profiles into a single LUT. It just checks the parameters and then calls the handler // for the first intent in chain. The handler may be user-defined. Is up to the handler to deal with the // rest of intents in chain. A maximum of 255 profiles at time are supported, which is pretty reasonable. cmsPipeline* _cmsLinkProfiles(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsUInt32Number i; cmsIntentsList* Intent; // Make sure a reasonable number of profiles is provided if (nProfiles <= 0 || nProfiles > 255) { cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't link '%d' profiles", nProfiles); return NULL; } for (i=0; i < nProfiles; i++) { // Check if black point is really needed or allowed. Note that // following Adobe's document: // BPC does not apply to devicelink profiles, nor to abs colorimetric, // and applies always on V4 perceptual and saturation. if (TheIntents[i] == INTENT_ABSOLUTE_COLORIMETRIC) BPC[i] = FALSE; if (TheIntents[i] == INTENT_PERCEPTUAL || TheIntents[i] == INTENT_SATURATION) { // Force BPC for V4 profiles in perceptual and saturation if (cmsGetProfileVersion(hProfiles[i]) >= 4.0) BPC[i] = TRUE; } } // Search for a handler. The first intent in the chain defines the handler. That would // prevent using multiple custom intents in a multiintent chain, but the behaviour of // this case would present some issues if the custom intent tries to do things like // preserve primaries. This solution is not perfect, but works well on most cases. Intent = SearchIntent(ContextID, TheIntents[0]); if (Intent == NULL) { cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported intent '%d'", TheIntents[0]); return NULL; } // Call the handler return Intent ->Link(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags); } // ------------------------------------------------------------------------------------------------- // Get information about available intents. nMax is the maximum space for the supplied "Codes" // and "Descriptions" the function returns the total number of intents, which may be greater // than nMax, although the matrices are not populated beyond this level. cmsUInt32Number CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions) { _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin); cmsIntentsList* pt; cmsUInt32Number nIntents; for (nIntents=0, pt = ctx->Intents; pt != NULL; pt = pt -> Next) { if (nIntents < nMax) { if (Codes != NULL) Codes[nIntents] = pt ->Intent; if (Descriptions != NULL) Descriptions[nIntents] = pt ->Description; } nIntents++; } for (nIntents=0, pt = DefaultIntents; pt != NULL; pt = pt -> Next) { if (nIntents < nMax) { if (Codes != NULL) Codes[nIntents] = pt ->Intent; if (Descriptions != NULL) Descriptions[nIntents] = pt ->Description; } nIntents++; } return nIntents; } cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions) { return cmsGetSupportedIntentsTHR(NULL, nMax, Codes, Descriptions); } // The plug-in registration. User can add new intents or override default routines cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext id, cmsPluginBase* Data) { _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(id, IntentPlugin); cmsPluginRenderingIntent* Plugin = (cmsPluginRenderingIntent*) Data; cmsIntentsList* fl; // Do we have to reset the custom intents? if (Data == NULL) { ctx->Intents = NULL; return TRUE; } fl = (cmsIntentsList*) _cmsPluginMalloc(id, sizeof(cmsIntentsList)); if (fl == NULL) return FALSE; fl ->Intent = Plugin ->Intent; strncpy(fl ->Description, Plugin ->Description, sizeof(fl ->Description)-1); fl ->Description[sizeof(fl ->Description)-1] = 0; fl ->Link = Plugin ->Link; fl ->Next = ctx ->Intents; ctx ->Intents = fl; return TRUE; } lcms2-2.6/src/cmsplugin.c0000644002406300000240000006663412311617072014701 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // ---------------------------------------------------------------------------------- // Encoding & Decoding support functions // ---------------------------------------------------------------------------------- // Little-Endian to Big-Endian // Adjust a word value after being readed/ before being written from/to an ICC profile cmsUInt16Number CMSEXPORT _cmsAdjustEndianess16(cmsUInt16Number Word) { #ifndef CMS_USE_BIG_ENDIAN cmsUInt8Number* pByte = (cmsUInt8Number*) &Word; cmsUInt8Number tmp; tmp = pByte[0]; pByte[0] = pByte[1]; pByte[1] = tmp; #endif return Word; } // Transports to properly encoded values - note that icc profiles does use big endian notation. // 1 2 3 4 // 4 3 2 1 cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number DWord) { #ifndef CMS_USE_BIG_ENDIAN cmsUInt8Number* pByte = (cmsUInt8Number*) &DWord; cmsUInt8Number temp1; cmsUInt8Number temp2; temp1 = *pByte++; temp2 = *pByte++; *(pByte-1) = *pByte; *pByte++ = temp2; *(pByte-3) = *pByte; *pByte = temp1; #endif return DWord; } // 1 2 3 4 5 6 7 8 // 8 7 6 5 4 3 2 1 void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord) { #ifndef CMS_USE_BIG_ENDIAN cmsUInt8Number* pIn = (cmsUInt8Number*) QWord; cmsUInt8Number* pOut = (cmsUInt8Number*) Result; _cmsAssert(Result != NULL); pOut[7] = pIn[0]; pOut[6] = pIn[1]; pOut[5] = pIn[2]; pOut[4] = pIn[3]; pOut[3] = pIn[4]; pOut[2] = pIn[5]; pOut[1] = pIn[6]; pOut[0] = pIn[7]; #else _cmsAssert(Result != NULL); # ifdef CMS_DONT_USE_INT64 (*Result)[0] = QWord[0]; (*Result)[1] = QWord[1]; # else *Result = *QWord; # endif #endif } // Auxiliar -- read 8, 16 and 32-bit numbers cmsBool CMSEXPORT _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n) { cmsUInt8Number tmp; _cmsAssert(io != NULL); if (io -> Read(io, &tmp, sizeof(cmsUInt8Number), 1) != 1) return FALSE; if (n != NULL) *n = tmp; return TRUE; } cmsBool CMSEXPORT _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n) { cmsUInt16Number tmp; _cmsAssert(io != NULL); if (io -> Read(io, &tmp, sizeof(cmsUInt16Number), 1) != 1) return FALSE; if (n != NULL) *n = _cmsAdjustEndianess16(tmp); return TRUE; } cmsBool CMSEXPORT _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array) { cmsUInt32Number i; _cmsAssert(io != NULL); for (i=0; i < n; i++) { if (Array != NULL) { if (!_cmsReadUInt16Number(io, Array + i)) return FALSE; } else { if (!_cmsReadUInt16Number(io, NULL)) return FALSE; } } return TRUE; } cmsBool CMSEXPORT _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n) { cmsUInt32Number tmp; _cmsAssert(io != NULL); if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1) return FALSE; if (n != NULL) *n = _cmsAdjustEndianess32(tmp); return TRUE; } cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n) { cmsUInt32Number tmp; _cmsAssert(io != NULL); if (io -> Read(io, &tmp, sizeof(cmsFloat32Number), 1) != 1) return FALSE; if (n != NULL) { tmp = _cmsAdjustEndianess32(tmp); *n = *(cmsFloat32Number*) &tmp; } return TRUE; } cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n) { cmsUInt64Number tmp; _cmsAssert(io != NULL); if (io -> Read(io, &tmp, sizeof(cmsUInt64Number), 1) != 1) return FALSE; if (n != NULL) _cmsAdjustEndianess64(n, &tmp); return TRUE; } cmsBool CMSEXPORT _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n) { cmsUInt32Number tmp; _cmsAssert(io != NULL); if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1) return FALSE; if (n != NULL) { *n = _cms15Fixed16toDouble(_cmsAdjustEndianess32(tmp)); } return TRUE; } // Jun-21-2000: Some profiles (those that comes with W2K) comes // with the media white (media black?) x 100. Add a sanity check static void NormalizeXYZ(cmsCIEXYZ* Dest) { while (Dest -> X > 2. && Dest -> Y > 2. && Dest -> Z > 2.) { Dest -> X /= 10.; Dest -> Y /= 10.; Dest -> Z /= 10.; } } cmsBool CMSEXPORT _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ) { cmsEncodedXYZNumber xyz; _cmsAssert(io != NULL); if (io ->Read(io, &xyz, sizeof(cmsEncodedXYZNumber), 1) != 1) return FALSE; if (XYZ != NULL) { XYZ->X = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.X)); XYZ->Y = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Y)); XYZ->Z = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Z)); NormalizeXYZ(XYZ); } return TRUE; } cmsBool CMSEXPORT _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n) { _cmsAssert(io != NULL); if (io -> Write(io, sizeof(cmsUInt8Number), &n) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n) { cmsUInt16Number tmp; _cmsAssert(io != NULL); tmp = _cmsAdjustEndianess16(n); if (io -> Write(io, sizeof(cmsUInt16Number), &tmp) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array) { cmsUInt32Number i; _cmsAssert(io != NULL); _cmsAssert(Array != NULL); for (i=0; i < n; i++) { if (!_cmsWriteUInt16Number(io, Array[i])) return FALSE; } return TRUE; } cmsBool CMSEXPORT _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n) { cmsUInt32Number tmp; _cmsAssert(io != NULL); tmp = _cmsAdjustEndianess32(n); if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n) { cmsUInt32Number tmp; _cmsAssert(io != NULL); tmp = *(cmsUInt32Number*) &n; tmp = _cmsAdjustEndianess32(tmp); if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n) { cmsUInt64Number tmp; _cmsAssert(io != NULL); _cmsAdjustEndianess64(&tmp, n); if (io -> Write(io, sizeof(cmsUInt64Number), &tmp) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n) { cmsUInt32Number tmp; _cmsAssert(io != NULL); tmp = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(n)); if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1) return FALSE; return TRUE; } cmsBool CMSEXPORT _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ) { cmsEncodedXYZNumber xyz; _cmsAssert(io != NULL); _cmsAssert(XYZ != NULL); xyz.X = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->X)); xyz.Y = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->Y)); xyz.Z = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->Z)); return io -> Write(io, sizeof(cmsEncodedXYZNumber), &xyz); } // from Fixed point 8.8 to double cmsFloat64Number CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8) { cmsUInt8Number msb, lsb; lsb = (cmsUInt8Number) (fixed8 & 0xff); msb = (cmsUInt8Number) (((cmsUInt16Number) fixed8 >> 8) & 0xff); return (cmsFloat64Number) ((cmsFloat64Number) msb + ((cmsFloat64Number) lsb / 256.0)); } cmsUInt16Number CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val) { cmsS15Fixed16Number GammaFixed32 = _cmsDoubleTo15Fixed16(val); return (cmsUInt16Number) ((GammaFixed32 >> 8) & 0xFFFF); } // from Fixed point 15.16 to double cmsFloat64Number CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32) { cmsFloat64Number floater, sign, mid; int Whole, FracPart; sign = (fix32 < 0 ? -1 : 1); fix32 = abs(fix32); Whole = (cmsUInt16Number)(fix32 >> 16) & 0xffff; FracPart = (cmsUInt16Number)(fix32 & 0xffff); mid = (cmsFloat64Number) FracPart / 65536.0; floater = (cmsFloat64Number) Whole + mid; return sign * floater; } // from double to Fixed point 15.16 cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v) { return ((cmsS15Fixed16Number) floor((v)*65536.0 + 0.5)); } // Date/Time functions void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest) { _cmsAssert(Dest != NULL); _cmsAssert(Source != NULL); Dest->tm_sec = _cmsAdjustEndianess16(Source->seconds); Dest->tm_min = _cmsAdjustEndianess16(Source->minutes); Dest->tm_hour = _cmsAdjustEndianess16(Source->hours); Dest->tm_mday = _cmsAdjustEndianess16(Source->day); Dest->tm_mon = _cmsAdjustEndianess16(Source->month) - 1; Dest->tm_year = _cmsAdjustEndianess16(Source->year) - 1900; Dest->tm_wday = -1; Dest->tm_yday = -1; Dest->tm_isdst = 0; } void CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source) { _cmsAssert(Dest != NULL); _cmsAssert(Source != NULL); Dest->seconds = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_sec); Dest->minutes = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_min); Dest->hours = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_hour); Dest->day = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_mday); Dest->month = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_mon + 1)); Dest->year = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_year + 1900)); } // Read base and return type base cmsTagTypeSignature CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io) { _cmsTagBase Base; _cmsAssert(io != NULL); if (io -> Read(io, &Base, sizeof(_cmsTagBase), 1) != 1) return (cmsTagTypeSignature) 0; return (cmsTagTypeSignature) _cmsAdjustEndianess32(Base.sig); } // Setup base marker cmsBool CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig) { _cmsTagBase Base; _cmsAssert(io != NULL); Base.sig = (cmsTagTypeSignature) _cmsAdjustEndianess32(sig); memset(&Base.reserved, 0, sizeof(Base.reserved)); return io -> Write(io, sizeof(_cmsTagBase), &Base); } cmsBool CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io) { cmsUInt8Number Buffer[4]; cmsUInt32Number NextAligned, At; cmsUInt32Number BytesToNextAlignedPos; _cmsAssert(io != NULL); At = io -> Tell(io); NextAligned = _cmsALIGNLONG(At); BytesToNextAlignedPos = NextAligned - At; if (BytesToNextAlignedPos == 0) return TRUE; if (BytesToNextAlignedPos > 4) return FALSE; return (io ->Read(io, Buffer, BytesToNextAlignedPos, 1) == 1); } cmsBool CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io) { cmsUInt8Number Buffer[4]; cmsUInt32Number NextAligned, At; cmsUInt32Number BytesToNextAlignedPos; _cmsAssert(io != NULL); At = io -> Tell(io); NextAligned = _cmsALIGNLONG(At); BytesToNextAlignedPos = NextAligned - At; if (BytesToNextAlignedPos == 0) return TRUE; if (BytesToNextAlignedPos > 4) return FALSE; memset(Buffer, 0, BytesToNextAlignedPos); return io -> Write(io, BytesToNextAlignedPos, Buffer); } // To deal with text streams. 2K at most cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...) { va_list args; int len; cmsUInt8Number Buffer[2048]; cmsBool rc; _cmsAssert(io != NULL); _cmsAssert(frm != NULL); va_start(args, frm); len = vsnprintf((char*) Buffer, 2047, frm, args); if (len < 0) return FALSE; // Truncated, which is a fatal error for us rc = io ->Write(io, len, Buffer); va_end(args); return rc; } // Plugin memory management ------------------------------------------------------------------------------------------------- // Specialized malloc for plug-ins, that is freed upon exit. void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size) { struct _cmsContext_struct* ctx = _cmsGetContext(ContextID); if (ctx ->MemPool == NULL) { if (ContextID == NULL) { ctx->MemPool = _cmsCreateSubAlloc(0, 2*1024); } else { cmsSignalError(ContextID, cmsERROR_CORRUPTION_DETECTED, "NULL memory pool on context"); return NULL; } } return _cmsSubAlloc(ctx->MemPool, size); } // Main plug-in dispatcher cmsBool CMSEXPORT cmsPlugin(void* Plug_in) { return cmsPluginTHR(NULL, Plug_in); } cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in) { cmsPluginBase* Plugin; for (Plugin = (cmsPluginBase*) Plug_in; Plugin != NULL; Plugin = Plugin -> Next) { if (Plugin -> Magic != cmsPluginMagicNumber) { cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized plugin"); return FALSE; } if (Plugin ->ExpectedVersion > LCMS_VERSION) { cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "plugin needs Little CMS %d, current version is %d", Plugin ->ExpectedVersion, LCMS_VERSION); return FALSE; } switch (Plugin -> Type) { case cmsPluginMemHandlerSig: if (!_cmsRegisterMemHandlerPlugin(id, Plugin)) return FALSE; break; case cmsPluginInterpolationSig: if (!_cmsRegisterInterpPlugin(id, Plugin)) return FALSE; break; case cmsPluginTagTypeSig: if (!_cmsRegisterTagTypePlugin(id, Plugin)) return FALSE; break; case cmsPluginTagSig: if (!_cmsRegisterTagPlugin(id, Plugin)) return FALSE; break; case cmsPluginFormattersSig: if (!_cmsRegisterFormattersPlugin(id, Plugin)) return FALSE; break; case cmsPluginRenderingIntentSig: if (!_cmsRegisterRenderingIntentPlugin(id, Plugin)) return FALSE; break; case cmsPluginParametricCurveSig: if (!_cmsRegisterParametricCurvesPlugin(id, Plugin)) return FALSE; break; case cmsPluginMultiProcessElementSig: if (!_cmsRegisterMultiProcessElementPlugin(id, Plugin)) return FALSE; break; case cmsPluginOptimizationSig: if (!_cmsRegisterOptimizationPlugin(id, Plugin)) return FALSE; break; case cmsPluginTransformSig: if (!_cmsRegisterTransformPlugin(id, Plugin)) return FALSE; break; case cmsPluginMutexSig: if (!_cmsRegisterMutexPlugin(id, Plugin)) return FALSE; break; default: cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized plugin type '%X'", Plugin -> Type); return FALSE; } } // Keep a reference to the plug-in return TRUE; } // Revert all plug-ins to default void CMSEXPORT cmsUnregisterPlugins(void) { cmsUnregisterPluginsTHR(NULL); } // The Global storage for system context. This is the one and only global variable // pointers structure. All global vars are referenced here. static struct _cmsContext_struct globalContext = { NULL, // Not in the linked list NULL, // No suballocator { NULL, // UserPtr, &_cmsLogErrorChunk, // Logger, &_cmsAlarmCodesChunk, // AlarmCodes, &_cmsAdaptationStateChunk, // AdaptationState, &_cmsMemPluginChunk, // MemPlugin, &_cmsInterpPluginChunk, // InterpPlugin, &_cmsCurvesPluginChunk, // CurvesPlugin, &_cmsFormattersPluginChunk, // FormattersPlugin, &_cmsTagTypePluginChunk, // TagTypePlugin, &_cmsTagPluginChunk, // TagPlugin, &_cmsIntentsPluginChunk, // IntentPlugin, &_cmsMPETypePluginChunk, // MPEPlugin, &_cmsOptimizationPluginChunk, // OptimizationPlugin, &_cmsTransformPluginChunk, // TransformPlugin, &_cmsMutexPluginChunk // MutexPlugin }, { NULL, NULL, NULL, NULL, NULL, NULL } // The default memory allocator is not used for context 0 }; // The context pool (linked list head) static _cmsMutex _cmsContextPoolHeadMutex = CMS_MUTEX_INITIALIZER; static struct _cmsContext_struct* _cmsContextPoolHead = NULL; // Internal, get associated pointer, with guessing. Never returns NULL. struct _cmsContext_struct* _cmsGetContext(cmsContext ContextID) { struct _cmsContext_struct* id = (struct _cmsContext_struct*) ContextID; struct _cmsContext_struct* ctx; // On 0, use global settings if (id == NULL) return &globalContext; // Search for (ctx = _cmsContextPoolHead; ctx != NULL; ctx = ctx ->Next) { // Found it? if (id == ctx) return ctx; // New-style context, } return &globalContext; } // Internal: get the memory area associanted with each context client // Returns the block assigned to the specific zone. void* _cmsContextGetClientChunk(cmsContext ContextID, _cmsMemoryClient mc) { struct _cmsContext_struct* ctx; void *ptr; if (mc < 0 || mc >= MemoryClientMax) { cmsSignalError(ContextID, cmsERROR_RANGE, "Bad context client"); return NULL; } ctx = _cmsGetContext(ContextID); ptr = ctx ->chunks[mc]; if (ptr != NULL) return ptr; // A null ptr means no special settings for that context, and this // reverts to Context0 globals return globalContext.chunks[mc]; } // This function returns the given context its default pristine state, // as no plug-ins were declared. There is no way to unregister a single // plug-in, as a single call to cmsPluginTHR() function may register // many different plug-ins simultaneously, then there is no way to // identify which plug-in to unregister. void CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID) { _cmsRegisterMemHandlerPlugin(ContextID, NULL); _cmsRegisterInterpPlugin(ContextID, NULL); _cmsRegisterTagTypePlugin(ContextID, NULL); _cmsRegisterTagPlugin(ContextID, NULL); _cmsRegisterFormattersPlugin(ContextID, NULL); _cmsRegisterRenderingIntentPlugin(ContextID, NULL); _cmsRegisterParametricCurvesPlugin(ContextID, NULL); _cmsRegisterMultiProcessElementPlugin(ContextID, NULL); _cmsRegisterOptimizationPlugin(ContextID, NULL); _cmsRegisterTransformPlugin(ContextID, NULL); _cmsRegisterMutexPlugin(ContextID, NULL); } // Returns the memory manager plug-in, if any, from the Plug-in bundle static cmsPluginMemHandler* _cmsFindMemoryPlugin(void* PluginBundle) { cmsPluginBase* Plugin; for (Plugin = (cmsPluginBase*) PluginBundle; Plugin != NULL; Plugin = Plugin -> Next) { if (Plugin -> Magic == cmsPluginMagicNumber && Plugin -> ExpectedVersion <= LCMS_VERSION && Plugin -> Type == cmsPluginMemHandlerSig) { // Found! return (cmsPluginMemHandler*) Plugin; } } // Nope, revert to defaults return NULL; } // Creates a new context with optional associated plug-ins. Caller may also specify an optional pointer to user-defined // data that will be forwarded to plug-ins and logger. cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData) { struct _cmsContext_struct* ctx; struct _cmsContext_struct fakeContext; _cmsInstallAllocFunctions(_cmsFindMemoryPlugin(Plugin), &fakeContext.DefaultMemoryManager); fakeContext.chunks[UserPtr] = UserData; fakeContext.chunks[MemPlugin] = &fakeContext.DefaultMemoryManager; // Create the context structure. ctx = (struct _cmsContext_struct*) _cmsMalloc(&fakeContext, sizeof(struct _cmsContext_struct)); if (ctx == NULL) return NULL; // Something very wrong happened! // Init the structure and the memory manager memset(ctx, 0, sizeof(struct _cmsContext_struct)); // Keep memory manager memcpy(&ctx->DefaultMemoryManager, &fakeContext.DefaultMemoryManager, sizeof(_cmsMemPluginChunk)); // Maintain the linked list (with proper locking) _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); ctx ->Next = _cmsContextPoolHead; _cmsContextPoolHead = ctx; _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); ctx ->chunks[UserPtr] = UserData; ctx ->chunks[MemPlugin] = &ctx->DefaultMemoryManager; // Now we can allocate the pool by using default memory manager ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*)); // default size about 32 pointers if (ctx ->MemPool == NULL) { cmsDeleteContext(ctx); return NULL; } _cmsAllocLogErrorChunk(ctx, NULL); _cmsAllocAlarmCodesChunk(ctx, NULL); _cmsAllocAdaptationStateChunk(ctx, NULL); _cmsAllocMemPluginChunk(ctx, NULL); _cmsAllocInterpPluginChunk(ctx, NULL); _cmsAllocCurvesPluginChunk(ctx, NULL); _cmsAllocFormattersPluginChunk(ctx, NULL); _cmsAllocTagTypePluginChunk(ctx, NULL); _cmsAllocMPETypePluginChunk(ctx, NULL); _cmsAllocTagPluginChunk(ctx, NULL); _cmsAllocIntentsPluginChunk(ctx, NULL); _cmsAllocOptimizationPluginChunk(ctx, NULL); _cmsAllocTransformPluginChunk(ctx, NULL); _cmsAllocMutexPluginChunk(ctx, NULL); // Setup the plug-ins if (!cmsPluginTHR(ctx, Plugin)) { cmsDeleteContext(ctx); return NULL; } return (cmsContext) ctx; } // Duplicates a context with all associated plug-ins. // Caller may specify an optional pointer to user-defined // data that will be forwarded to plug-ins and logger. cmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData) { int i; struct _cmsContext_struct* ctx; const struct _cmsContext_struct* src = _cmsGetContext(ContextID); void* userData = (NewUserData != NULL) ? NewUserData : src -> chunks[UserPtr]; ctx = (struct _cmsContext_struct*) _cmsMalloc(ContextID, sizeof(struct _cmsContext_struct)); if (ctx == NULL) return NULL; // Something very wrong happened // Setup default memory allocators memcpy(&ctx->DefaultMemoryManager, &src->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager)); // Maintain the linked list _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); ctx ->Next = _cmsContextPoolHead; _cmsContextPoolHead = ctx; _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); ctx ->chunks[UserPtr] = userData; ctx ->chunks[MemPlugin] = &ctx->DefaultMemoryManager; ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*)); if (ctx ->MemPool == NULL) { cmsDeleteContext(ctx); return NULL; } // Allocate all required chunks. _cmsAllocLogErrorChunk(ctx, src); _cmsAllocAlarmCodesChunk(ctx, src); _cmsAllocAdaptationStateChunk(ctx, src); _cmsAllocMemPluginChunk(ctx, src); _cmsAllocInterpPluginChunk(ctx, src); _cmsAllocCurvesPluginChunk(ctx, src); _cmsAllocFormattersPluginChunk(ctx, src); _cmsAllocTagTypePluginChunk(ctx, src); _cmsAllocMPETypePluginChunk(ctx, src); _cmsAllocTagPluginChunk(ctx, src); _cmsAllocIntentsPluginChunk(ctx, src); _cmsAllocOptimizationPluginChunk(ctx, src); _cmsAllocTransformPluginChunk(ctx, src); _cmsAllocMutexPluginChunk(ctx, src); // Make sure no one failed for (i=Logger; i < MemoryClientMax; i++) { if (src ->chunks[i] == NULL) { cmsDeleteContext((cmsContext) ctx); return NULL; } } return (cmsContext) ctx; } static struct _cmsContext_struct* FindPrev(struct _cmsContext_struct* id) { struct _cmsContext_struct* prev; // Search for previous for (prev = _cmsContextPoolHead; prev != NULL; prev = prev ->Next) { if (prev ->Next == id) return prev; } return NULL; // List is empty or only one element! } // Frees any resources associated with the given context, // and destroys the context placeholder. // The ContextID can no longer be used in any THR operation. void CMSEXPORT cmsDeleteContext(cmsContext ContextID) { if (ContextID != NULL) { struct _cmsContext_struct* ctx = (struct _cmsContext_struct*) ContextID; struct _cmsContext_struct fakeContext; struct _cmsContext_struct* prev; memcpy(&fakeContext.DefaultMemoryManager, &ctx->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager)); fakeContext.chunks[UserPtr] = ctx ->chunks[UserPtr]; fakeContext.chunks[MemPlugin] = &fakeContext.DefaultMemoryManager; // Get rid of plugins cmsUnregisterPluginsTHR(ContextID); // Since all memory is allocated in the private pool, all what we need to do is destroy the pool if (ctx -> MemPool != NULL) _cmsSubAllocDestroy(ctx ->MemPool); ctx -> MemPool = NULL; // Maintain list _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); if (_cmsContextPoolHead == ctx) { _cmsContextPoolHead = ctx->Next; } else { // Search for previous for (prev = _cmsContextPoolHead; prev != NULL; prev = prev ->Next) { if (prev -> Next == ctx) { prev -> Next = ctx ->Next; break; } } } _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); // free the memory block itself _cmsFree(&fakeContext, ctx); } } // Returns the user data associated to the given ContextID, or NULL if no user data was attached on context creation void* CMSEXPORT cmsGetContextUserData(cmsContext ContextID) { return _cmsContextGetClientChunk(ContextID, UserPtr); } lcms2-2.6/src/lcms2_internal.h0000644002406300000240000010476412311617072015616 0ustar mariamausers // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #ifndef _lcms_internal_H // Include plug-in foundation #ifndef _lcms_plugin_H # include "lcms2_plugin.h" #endif // ctype is part of C99 as per 7.1.2 #include // assert macro is part of C99 as per 7.2 #include // Some needed constants #ifndef M_PI # define M_PI 3.14159265358979323846 #endif #ifndef M_LOG10E # define M_LOG10E 0.434294481903251827651 #endif // BorlandC 5.5, VC2003 are broken on that #if defined(__BORLANDC__) || (_MSC_VER < 1400) // 1400 == VC++ 8.0 #define sinf(x) (float)sin((float)x) #define sqrtf(x) (float)sqrt((float)x) #endif // Alignment of ICC file format uses 4 bytes (cmsUInt32Number) #define _cmsALIGNLONG(x) (((x)+(sizeof(cmsUInt32Number)-1)) & ~(sizeof(cmsUInt32Number)-1)) // Alignment to memory pointer #define _cmsALIGNMEM(x) (((x)+(sizeof(void *) - 1)) & ~(sizeof(void *) - 1)) // Maximum encodeable values in floating point #define MAX_ENCODEABLE_XYZ (1.0 + 32767.0/32768.0) #define MIN_ENCODEABLE_ab2 (-128.0) #define MAX_ENCODEABLE_ab2 ((65535.0/256.0) - 128.0) #define MIN_ENCODEABLE_ab4 (-128.0) #define MAX_ENCODEABLE_ab4 (127.0) // Maximum of channels for internal pipeline evaluation #define MAX_STAGE_CHANNELS 128 // Unused parameter warning supression #define cmsUNUSED_PARAMETER(x) ((void)x) // The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999). // unfortunately VisualC++ does not conform that #if defined(_MSC_VER) || defined(__BORLANDC__) # define cmsINLINE __inline #else # define cmsINLINE static inline #endif // Other replacement functions #ifdef _MSC_VER # ifndef snprintf # define snprintf _snprintf # endif # ifndef vsnprintf # define vsnprintf _vsnprintf # endif #endif // A fast way to convert from/to 16 <-> 8 bits #define FROM_8_TO_16(rgb) (cmsUInt16Number) ((((cmsUInt16Number) (rgb)) << 8)|(rgb)) #define FROM_16_TO_8(rgb) (cmsUInt8Number) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF) // Code analysis is broken on asserts #ifdef _MSC_VER # if (_MSC_VER >= 1500) # define _cmsAssert(a) { assert((a)); __analysis_assume((a)); } # else # define _cmsAssert(a) assert((a)) # endif #else # define _cmsAssert(a) assert((a)) #endif //--------------------------------------------------------------------------------- // Determinant lower than that are assumed zero (used on matrix invert) #define MATRIX_DET_TOLERANCE 0.0001 //--------------------------------------------------------------------------------- // Fixed point #define FIXED_TO_INT(x) ((x)>>16) #define FIXED_REST_TO_INT(x) ((x)&0xFFFFU) #define ROUND_FIXED_TO_INT(x) (((x)+0x8000)>>16) cmsINLINE cmsS15Fixed16Number _cmsToFixedDomain(int a) { return a + ((a + 0x7fff) / 0xffff); } cmsINLINE int _cmsFromFixedDomain(cmsS15Fixed16Number a) { return a - ((a + 0x7fff) >> 16); } // ----------------------------------------------------------------------------------------------------------- // Fast floor conversion logic. Thanks to Sree Kotay and Stuart Nixon // note than this only works in the range ..-32767...+32767 because // mantissa is interpreted as 15.16 fixed point. // The union is to avoid pointer aliasing overoptimization. cmsINLINE int _cmsQuickFloor(cmsFloat64Number val) { #ifdef CMS_DONT_USE_FAST_FLOOR return (int) floor(val); #else const cmsFloat64Number _lcms_double2fixmagic = 68719476736.0 * 1.5; // 2^36 * 1.5, (52-16=36) uses limited precision to floor union { cmsFloat64Number val; int halves[2]; } temp; temp.val = val + _lcms_double2fixmagic; #ifdef CMS_USE_BIG_ENDIAN return temp.halves[1] >> 16; #else return temp.halves[0] >> 16; #endif #endif } // Fast floor restricted to 0..65535.0 cmsINLINE cmsUInt16Number _cmsQuickFloorWord(cmsFloat64Number d) { return (cmsUInt16Number) _cmsQuickFloor(d - 32767.0) + 32767U; } // Floor to word, taking care of saturation cmsINLINE cmsUInt16Number _cmsQuickSaturateWord(cmsFloat64Number d) { d += 0.5; if (d <= 0) return 0; if (d >= 65535.0) return 0xffff; return _cmsQuickFloorWord(d); } // Pthread support -------------------------------------------------------------------- #ifndef CMS_NO_PTHREADS // This is the threading support. Unfortunately, it has to be platform-dependent because // windows does not support pthreads. #ifdef CMS_IS_WINDOWS_ #define WIN32_LEAN_AND_MEAN 1 #include // From: http://locklessinc.com/articles/pthreads_on_windows/ // The pthreads API has an initialization macro that has no correspondence to anything in // the windows API. By investigating the internal definition of the critical section type, // one may work out how to initialize one without calling InitializeCriticalSection(). // The trick here is that InitializeCriticalSection() is not allowed to fail. It tries // to allocate a critical section debug object, but if no memory is available, it sets // the pointer to a specific value. (One would expect that value to be NULL, but it is // actually (void *)-1 for some reason.) Thus we can use this special value for that // pointer, and the critical section code will work. // The other important part of the critical section type to initialize is the number // of waiters. This controls whether or not the mutex is locked. Fortunately, this // part of the critical section is unlikely to change. Apparently, many programs // already test critical sections to see if they are locked using this value, so // Microsoft felt that it was necessary to keep it set at -1 for an unlocked critical // section, even when they changed the underlying algorithm to be more scalable. // The final parts of the critical section object are unimportant, and can be set // to zero for their defaults. This yields an initialization macro: typedef CRITICAL_SECTION _cmsMutex; #define CMS_MUTEX_INITIALIZER {(void*) -1,-1,0,0,0,0} cmsINLINE int _cmsLockPrimitive(_cmsMutex *m) { EnterCriticalSection(m); return 0; } cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m) { LeaveCriticalSection(m); return 0; } cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m) { InitializeCriticalSection(m); return 0; } cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m) { DeleteCriticalSection(m); return 0; } cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m) { EnterCriticalSection(m); return 0; } cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m) { LeaveCriticalSection(m); return 0; } #else // Rest of the wide world #include #define CMS_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER typedef pthread_mutex_t _cmsMutex; cmsINLINE int _cmsLockPrimitive(_cmsMutex *m) { return pthread_mutex_lock(m); } cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m) { return pthread_mutex_unlock(m); } cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m) { return pthread_mutex_init(m, NULL); } cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m) { return pthread_mutex_destroy(m); } cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m) { return pthread_mutex_lock(m); } cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m) { return pthread_mutex_unlock(m); } #endif #else #define CMS_MUTEX_INITIALIZER 0 typedef int _cmsMutex; cmsINLINE int _cmsLockPrimitive(_cmsMutex *m) { return 0; cmsUNUSED_PARAMETER(m); } cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m) { return 0; cmsUNUSED_PARAMETER(m); } cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m) { return 0; cmsUNUSED_PARAMETER(m); } cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m) { return 0; cmsUNUSED_PARAMETER(m); } cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m) { return 0; cmsUNUSED_PARAMETER(m); } cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m) { return 0; cmsUNUSED_PARAMETER(m); } #endif // Plug-In registration --------------------------------------------------------------- // Specialized function for plug-in memory management. No pairing free() since whole pool is freed at once. void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size); // Memory management cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Interpolation cmsBool _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Parametric curves cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Formatters management cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Tag type management cmsBool _cmsRegisterTagTypePlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Tag management cmsBool _cmsRegisterTagPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Intent management cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Multi Process elements cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Optimization cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Transform cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // Mutex cmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Plugin); // --------------------------------------------------------------------------------------------------------- // Suballocators. typedef struct _cmsSubAllocator_chunk_st { cmsUInt8Number* Block; cmsUInt32Number BlockSize; cmsUInt32Number Used; struct _cmsSubAllocator_chunk_st* next; } _cmsSubAllocator_chunk; typedef struct { cmsContext ContextID; _cmsSubAllocator_chunk* h; } _cmsSubAllocator; _cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial); void _cmsSubAllocDestroy(_cmsSubAllocator* s); void* _cmsSubAlloc(_cmsSubAllocator* s, cmsUInt32Number size); void* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size); // ---------------------------------------------------------------------------------- // The context clients. typedef enum { UserPtr, // User-defined pointer Logger, AlarmCodesContext, AdaptationStateContext, MemPlugin, InterpPlugin, CurvesPlugin, FormattersPlugin, TagTypePlugin, TagPlugin, IntentPlugin, MPEPlugin, OptimizationPlugin, TransformPlugin, MutexPlugin, // Last in list MemoryClientMax } _cmsMemoryClient; // Container for memory management plug-in. typedef struct { _cmsMallocFnPtrType MallocPtr; _cmsMalloZerocFnPtrType MallocZeroPtr; _cmsFreeFnPtrType FreePtr; _cmsReallocFnPtrType ReallocPtr; _cmsCallocFnPtrType CallocPtr; _cmsDupFnPtrType DupPtr; } _cmsMemPluginChunkType; // Copy memory management function pointers from plug-in to chunk, taking care of missing routines void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr); // Internal structure for context struct _cmsContext_struct { struct _cmsContext_struct* Next; // Points to next context in the new style _cmsSubAllocator* MemPool; // The memory pool that stores context data void* chunks[MemoryClientMax]; // array of pointers to client chunks. Memory itself is hold in the suballocator. // If NULL, then it reverts to global Context0 _cmsMemPluginChunkType DefaultMemoryManager; // The allocators used for creating the context itself. Cannot be overriden }; // Returns a pointer to a valid context structure, including the global one if id is zero. // Verifies the magic number. struct _cmsContext_struct* _cmsGetContext(cmsContext ContextID); // Returns the block assigned to the specific zone. void* _cmsContextGetClientChunk(cmsContext id, _cmsMemoryClient mc); // Chunks of context memory by plug-in client ------------------------------------------------------- // Those structures encapsulates all variables needed by the several context clients (mostly plug-ins) // Container for error logger -- not a plug-in typedef struct { cmsLogErrorHandlerFunction LogErrorHandler; // Set to NULL for Context0 fallback } _cmsLogErrorChunkType; // The global Context0 storage for error logger extern _cmsLogErrorChunkType _cmsLogErrorChunk; // Allocate and init error logger container. void _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for alarm codes -- not a plug-in typedef struct { cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]; } _cmsAlarmCodesChunkType; // The global Context0 storage for alarm codes extern _cmsAlarmCodesChunkType _cmsAlarmCodesChunk; // Allocate and init alarm codes container. void _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for adaptation state -- not a plug-in typedef struct { cmsFloat64Number AdaptationState; } _cmsAdaptationStateChunkType; // The global Context0 storage for adaptation state extern _cmsAdaptationStateChunkType _cmsAdaptationStateChunk; // Allocate and init adaptation state container. void _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // The global Context0 storage for memory management extern _cmsMemPluginChunkType _cmsMemPluginChunk; // Allocate and init memory management container. void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for interpolation plug-in typedef struct { cmsInterpFnFactory Interpolators; } _cmsInterpPluginChunkType; // The global Context0 storage for interpolation plug-in extern _cmsInterpPluginChunkType _cmsInterpPluginChunk; // Allocate and init interpolation container. void _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for parametric curves plug-in typedef struct { struct _cmsParametricCurvesCollection_st* ParametricCurves; } _cmsCurvesPluginChunkType; // The global Context0 storage for tone curves plug-in extern _cmsCurvesPluginChunkType _cmsCurvesPluginChunk; // Allocate and init parametric curves container. void _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for formatters plug-in typedef struct { struct _cms_formatters_factory_list* FactoryList; } _cmsFormattersPluginChunkType; // The global Context0 storage for formatters plug-in extern _cmsFormattersPluginChunkType _cmsFormattersPluginChunk; // Allocate and init formatters container. void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // This chunk type is shared by TagType plug-in and MPE Plug-in typedef struct { struct _cmsTagTypeLinkedList_st* TagTypes; } _cmsTagTypePluginChunkType; // The global Context0 storage for tag types plug-in extern _cmsTagTypePluginChunkType _cmsTagTypePluginChunk; // The global Context0 storage for mult process elements plug-in extern _cmsTagTypePluginChunkType _cmsMPETypePluginChunk; // Allocate and init Tag types container. void _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Allocate and init MPE container. void _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for tag plug-in typedef struct { struct _cmsTagLinkedList_st* Tag; } _cmsTagPluginChunkType; // The global Context0 storage for tag plug-in extern _cmsTagPluginChunkType _cmsTagPluginChunk; // Allocate and init Tag container. void _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for intents plug-in typedef struct { struct _cms_intents_list* Intents; } _cmsIntentsPluginChunkType; // The global Context0 storage for intents plug-in extern _cmsIntentsPluginChunkType _cmsIntentsPluginChunk; // Allocate and init intents container. void _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for optimization plug-in typedef struct { struct _cmsOptimizationCollection_st* OptimizationCollection; } _cmsOptimizationPluginChunkType; // The global Context0 storage for optimizers plug-in extern _cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk; // Allocate and init optimizers container. void _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for transform plug-in typedef struct { struct _cmsTransformCollection_st* TransformCollection; } _cmsTransformPluginChunkType; // The global Context0 storage for full-transform replacement plug-in extern _cmsTransformPluginChunkType _cmsTransformPluginChunk; // Allocate and init transform container. void _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // Container for mutex plug-in typedef struct { _cmsCreateMutexFnPtrType CreateMutexPtr; _cmsDestroyMutexFnPtrType DestroyMutexPtr; _cmsLockMutexFnPtrType LockMutexPtr; _cmsUnlockMutexFnPtrType UnlockMutexPtr; } _cmsMutexPluginChunkType; // The global Context0 storage for mutex plug-in extern _cmsMutexPluginChunkType _cmsMutexPluginChunk; // Allocate and init mutex container. void _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src); // ---------------------------------------------------------------------------------- // MLU internal representation typedef struct { cmsUInt16Number Language; cmsUInt16Number Country; cmsUInt32Number StrW; // Offset to current unicode string cmsUInt32Number Len; // Length in bytes } _cmsMLUentry; struct _cms_MLU_struct { cmsContext ContextID; // The directory int AllocatedEntries; int UsedEntries; _cmsMLUentry* Entries; // Array of pointers to strings allocated in MemPool // The Pool cmsUInt32Number PoolSize; // The maximum allocated size cmsUInt32Number PoolUsed; // The used size void* MemPool; // Pointer to begin of memory pool }; // Named color list internal representation typedef struct { char Name[cmsMAX_PATH]; cmsUInt16Number PCS[3]; cmsUInt16Number DeviceColorant[cmsMAXCHANNELS]; } _cmsNAMEDCOLOR; struct _cms_NAMEDCOLORLIST_struct { cmsUInt32Number nColors; cmsUInt32Number Allocated; cmsUInt32Number ColorantCount; char Prefix[33]; // Prefix and suffix are defined to be 32 characters at most char Suffix[33]; _cmsNAMEDCOLOR* List; cmsContext ContextID; }; // ---------------------------------------------------------------------------------- // This is the internal struct holding profile details. // Maximum supported tags in a profile #define MAX_TABLE_TAG 100 typedef struct _cms_iccprofile_struct { // I/O handler cmsIOHANDLER* IOhandler; // The thread ID cmsContext ContextID; // Creation time struct tm Created; // Only most important items found in ICC profiles cmsUInt32Number Version; cmsProfileClassSignature DeviceClass; cmsColorSpaceSignature ColorSpace; cmsColorSpaceSignature PCS; cmsUInt32Number RenderingIntent; cmsUInt32Number flags; cmsUInt32Number manufacturer, model; cmsUInt64Number attributes; cmsUInt32Number creator; cmsProfileID ProfileID; // Dictionary cmsUInt32Number TagCount; cmsTagSignature TagNames[MAX_TABLE_TAG]; cmsTagSignature TagLinked[MAX_TABLE_TAG]; // The tag to wich is linked (0=none) cmsUInt32Number TagSizes[MAX_TABLE_TAG]; // Size on disk cmsUInt32Number TagOffsets[MAX_TABLE_TAG]; cmsBool TagSaveAsRaw[MAX_TABLE_TAG]; // True to write uncooked void * TagPtrs[MAX_TABLE_TAG]; cmsTagTypeHandler* TagTypeHandlers[MAX_TABLE_TAG]; // Same structure may be serialized on different types // depending on profile version, so we keep track of the // type handler for each tag in the list. // Special cmsBool IsWrite; // Keep a mutex for cmsReadTag -- Note that this only works if the user includes a mutex plugin void * UsrMutex; } _cmsICCPROFILE; // IO helpers for profiles cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc); cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace); int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks); // Tag types cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig); cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig); cmsTagDescriptor* _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig); // Error logging --------------------------------------------------------------------------------------------------------- void _cmsTagSignature2String(char String[5], cmsTagSignature sig); // Interpolation --------------------------------------------------------------------------------------------------------- cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags); cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags); void _cmsFreeInterpParams(cmsInterpParams* p); cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p); // Curves ---------------------------------------------------------------------------------------------------------------- // This struct holds information about a segment, plus a pointer to the function that implements the evaluation. // In the case of table-based, Eval pointer is set to NULL // The gamma function main structure struct _cms_curve_struct { cmsInterpParams* InterpParams; // Private optimizations for interpolation cmsUInt32Number nSegments; // Number of segments in the curve. Zero for a 16-bit based tables cmsCurveSegment* Segments; // The segments cmsInterpParams** SegInterp; // Array of private optimizations for interpolation in table-based segments cmsParametricCurveEvaluator* Evals; // Evaluators (one per segment) // 16 bit Table-based representation follows cmsUInt32Number nEntries; // Number of table elements cmsUInt16Number* Table16; // The table itself. }; // Pipelines & Stages --------------------------------------------------------------------------------------------- // A single stage struct _cmsStage_struct { cmsContext ContextID; cmsStageSignature Type; // Identifies the stage cmsStageSignature Implements; // Identifies the *function* of the stage (for optimizations) cmsUInt32Number InputChannels; // Input channels -- for optimization purposes cmsUInt32Number OutputChannels; // Output channels -- for optimization purposes _cmsStageEvalFn EvalPtr; // Points to fn that evaluates the stage (always in floating point) _cmsStageDupElemFn DupElemPtr; // Points to a fn that duplicates the *data* of the stage _cmsStageFreeElemFn FreePtr; // Points to a fn that sets the *data* of the stage free // A generic pointer to whatever memory needed by the stage void* Data; // Maintains linked list (used internally) struct _cmsStage_struct* Next; }; // Special Stages (cannot be saved) cmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID); cmsStage* _cmsStageAllocXYZ2Lab(cmsContext ContextID); cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID); cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID); cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID); cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID); cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS); cmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, int nChannels); cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan); cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID); cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID); cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID); cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID); // For curve set only cmsToneCurve** _cmsStageGetPtrToCurveSet(const cmsStage* mpe); // Pipeline Evaluator (in floating point) typedef void (* _cmsPipelineEvalFloatFn)(const cmsFloat32Number In[], cmsFloat32Number Out[], const void* Data); struct _cmsPipeline_struct { cmsStage* Elements; // Points to elements chain cmsUInt32Number InputChannels, OutputChannels; // Data & evaluators void *Data; _cmsOPTeval16Fn Eval16Fn; _cmsPipelineEvalFloatFn EvalFloatFn; _cmsFreeUserDataFn FreeDataFn; _cmsDupUserDataFn DupDataFn; cmsContext ContextID; // Environment cmsBool SaveAs8Bits; // Implementation-specific: save as 8 bits if possible }; // LUT reading & creation ------------------------------------------------------------------------------------------- // Read tags using low-level function, provide necessary glue code to adapt versions, etc. All those return a brand new copy // of the LUTS, since ownership of original is up to the profile. The user should free allocated resources. cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent); cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent); cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent); // Special values cmsBool _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile); cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile); // Profile linker -------------------------------------------------------------------------------------------------- cmsPipeline* _cmsLinkProfiles(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); // Sequence -------------------------------------------------------------------------------------------------------- cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile); cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq); cmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[]); // LUT optimization ------------------------------------------------------------------------------------------------ cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, int MaxSamples); int _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags); cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space, cmsUInt16Number **White, cmsUInt16Number **Black, cmsUInt32Number *nOutputs); cmsBool _cmsOptimizePipeline(cmsContext ContextID, cmsPipeline** Lut, int Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags ); // Hi level LUT building ---------------------------------------------------------------------------------------------- cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, cmsHPROFILE hProfiles[], cmsBool BPC[], cmsUInt32Number Intents[], cmsFloat64Number AdaptationStates[], cmsUInt32Number nGamutPCSposition, cmsHPROFILE hGamut); // Formatters ------------------------------------------------------------------------------------------------------------ #define cmsFLAGS_CAN_CHANGE_FORMATTER 0x02000000 // Allow change buffer format cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type); cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type); cmsFormatter _cmsGetFormatter(cmsContext ContextID, cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 cmsFormatterDirection Dir, cmsUInt32Number dwFlags); #ifndef CMS_NO_HALF_SUPPORT // Half float cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h); cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt); #endif // Transform logic ------------------------------------------------------------------------------------------------------ struct _cmstransform_struct; typedef struct { // 1-pixel cache (16 bits only) cmsUInt16Number CacheIn[cmsMAXCHANNELS]; cmsUInt16Number CacheOut[cmsMAXCHANNELS]; } _cmsCACHE; // Transformation typedef struct _cmstransform_struct { cmsUInt32Number InputFormat, OutputFormat; // Keep formats for further reference // Points to transform code _cmsTransformFn xform; // Formatters, cannot be embedded into LUT because cache cmsFormatter16 FromInput; cmsFormatter16 ToOutput; cmsFormatterFloat FromInputFloat; cmsFormatterFloat ToOutputFloat; // 1-pixel cache seed for zero as input (16 bits, read only) _cmsCACHE Cache; // A Pipeline holding the full (optimized) transform cmsPipeline* Lut; // A Pipeline holding the gamut check. It goes from the input space to bilevel cmsPipeline* GamutCheck; // Colorant tables cmsNAMEDCOLORLIST* InputColorant; // Input Colorant table cmsNAMEDCOLORLIST* OutputColorant; // Colorant table (for n chans > CMYK) // Informational only cmsColorSpaceSignature EntryColorSpace; cmsColorSpaceSignature ExitColorSpace; // White points (informative only) cmsCIEXYZ EntryWhitePoint; cmsCIEXYZ ExitWhitePoint; // Profiles used to create the transform cmsSEQ* Sequence; cmsUInt32Number dwOriginalFlags; cmsFloat64Number AdaptationState; // The intent of this transform. That is usually the last intent in the profilechain, but may differ cmsUInt32Number RenderingIntent; // An id that uniquely identifies the running context. May be null. cmsContext ContextID; // A user-defined pointer that can be used to store data for transform plug-ins void* UserData; _cmsFreeUserDataFn FreeUserData; } _cmsTRANSFORM; // -------------------------------------------------------------------------------------------------- cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, const cmsUInt32Number Intents[], const cmsHPROFILE hProfiles[], const cmsBool BPC[], const cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID, cmsUInt32Number nPoints, cmsUInt32Number nProfiles, const cmsUInt32Number Intents[], const cmsHPROFILE hProfiles[], const cmsBool BPC[], const cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags); cmsBool _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll); cmsBool _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries); #define _lcms_internal_H #endif lcms2-2.6/src/Makefile.in0000644002406300000240000005042712311617072014572 0ustar mariamausers# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building lcms 2 library # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = liblcms2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_liblcms2_la_OBJECTS = cmscnvrt.lo cmserr.lo cmsgamma.lo cmsgmt.lo \ cmsintrp.lo cmsio0.lo cmsio1.lo cmslut.lo cmsplugin.lo \ cmssm.lo cmsmd5.lo cmsmtrx.lo cmspack.lo cmspcs.lo cmswtpnt.lo \ cmsxform.lo cmssamp.lo cmsnamed.lo cmscam02.lo cmsvirt.lo \ cmstypes.lo cmscgats.lo cmsps2.lo cmsopt.lo cmshalf.lo liblcms2_la_OBJECTS = $(am_liblcms2_la_OBJECTS) liblcms2_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(liblcms2_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(liblcms2_la_SOURCES) DIST_SOURCES = $(liblcms2_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ # CFLAGS = -pedantic -Wall -std=c99 -O3 includedir = ${prefix}/include infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign # Shared libraries built in this directory lib_LTLIBRARIES = liblcms2.la INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include liblcms2_la_LDFLAGS = -no-undefined \ -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) liblcms2_la_LIBADD = $(LCMS_LIB_DEPLIBS) liblcms2_la_SOURCES = \ cmscnvrt.c cmserr.c cmsgamma.c cmsgmt.c cmsintrp.c cmsio0.c cmsio1.c cmslut.c \ cmsplugin.c cmssm.c cmsmd5.c cmsmtrx.c cmspack.c cmspcs.c cmswtpnt.c cmsxform.c \ cmssamp.c cmsnamed.c cmscam02.c cmsvirt.c cmstypes.c cmscgats.c cmsps2.c cmsopt.c \ cmshalf.c lcms2_internal.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done liblcms2.la: $(liblcms2_la_OBJECTS) $(liblcms2_la_DEPENDENCIES) $(EXTRA_liblcms2_la_DEPENDENCIES) $(liblcms2_la_LINK) -rpath $(libdir) $(liblcms2_la_OBJECTS) $(liblcms2_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmscam02.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmscgats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmscnvrt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmserr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsgamma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsgmt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmshalf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsintrp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsio0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsio1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmslut.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsmd5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsmtrx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsnamed.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsopt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmspack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmspcs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsplugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsps2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmssamp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmssm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmstypes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsvirt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmswtpnt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsxform.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lcms2-2.6/src/cmswtpnt.c0000644002406300000240000002534312311617072014547 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // D50 - Widely used const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void) { static cmsCIEXYZ D50XYZ = {cmsD50X, cmsD50Y, cmsD50Z}; return &D50XYZ; } const cmsCIExyY* CMSEXPORT cmsD50_xyY(void) { static cmsCIExyY D50xyY; cmsXYZ2xyY(&D50xyY, cmsD50_XYZ()); return &D50xyY; } // Obtains WhitePoint from Temperature cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK) { cmsFloat64Number x, y; cmsFloat64Number T, T2, T3; // cmsFloat64Number M1, M2; _cmsAssert(WhitePoint != NULL); T = TempK; T2 = T*T; // Square T3 = T2*T; // Cube // For correlated color temperature (T) between 4000K and 7000K: if (T >= 4000. && T <= 7000.) { x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063; } else // or for correlated color temperature (T) between 7000K and 25000K: if (T > 7000.0 && T <= 25000.0) { x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040; } else { cmsSignalError(0, cmsERROR_RANGE, "cmsWhitePointFromTemp: invalid temp"); return FALSE; } // Obtain y(x) y = -3.000*(x*x) + 2.870*x - 0.275; // wave factors (not used, but here for futures extensions) // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y); // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y); WhitePoint -> x = x; WhitePoint -> y = y; WhitePoint -> Y = 1.0; return TRUE; } typedef struct { cmsFloat64Number mirek; // temp (in microreciprocal kelvin) cmsFloat64Number ut; // u coord of intersection w/ blackbody locus cmsFloat64Number vt; // v coord of intersection w/ blackbody locus cmsFloat64Number tt; // slope of ISOTEMPERATURE. line } ISOTEMPERATURE; static ISOTEMPERATURE isotempdata[] = { // {Mirek, Ut, Vt, Tt } {0, 0.18006, 0.26352, -0.24341}, {10, 0.18066, 0.26589, -0.25479}, {20, 0.18133, 0.26846, -0.26876}, {30, 0.18208, 0.27119, -0.28539}, {40, 0.18293, 0.27407, -0.30470}, {50, 0.18388, 0.27709, -0.32675}, {60, 0.18494, 0.28021, -0.35156}, {70, 0.18611, 0.28342, -0.37915}, {80, 0.18740, 0.28668, -0.40955}, {90, 0.18880, 0.28997, -0.44278}, {100, 0.19032, 0.29326, -0.47888}, {125, 0.19462, 0.30141, -0.58204}, {150, 0.19962, 0.30921, -0.70471}, {175, 0.20525, 0.31647, -0.84901}, {200, 0.21142, 0.32312, -1.0182 }, {225, 0.21807, 0.32909, -1.2168 }, {250, 0.22511, 0.33439, -1.4512 }, {275, 0.23247, 0.33904, -1.7298 }, {300, 0.24010, 0.34308, -2.0637 }, {325, 0.24702, 0.34655, -2.4681 }, {350, 0.25591, 0.34951, -2.9641 }, {375, 0.26400, 0.35200, -3.5814 }, {400, 0.27218, 0.35407, -4.3633 }, {425, 0.28039, 0.35577, -5.3762 }, {450, 0.28863, 0.35714, -6.7262 }, {475, 0.29685, 0.35823, -8.5955 }, {500, 0.30505, 0.35907, -11.324 }, {525, 0.31320, 0.35968, -15.628 }, {550, 0.32129, 0.36011, -23.325 }, {575, 0.32931, 0.36038, -40.770 }, {600, 0.33724, 0.36051, -116.45 } }; #define NISO sizeof(isotempdata)/sizeof(ISOTEMPERATURE) // Robertson's method cmsBool CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint) { cmsUInt32Number j; cmsFloat64Number us,vs; cmsFloat64Number uj,vj,tj,di,dj,mi,mj; cmsFloat64Number xs, ys; _cmsAssert(WhitePoint != NULL); _cmsAssert(TempK != NULL); di = mi = 0; xs = WhitePoint -> x; ys = WhitePoint -> y; // convert (x,y) to CIE 1960 (u,WhitePoint) us = (2*xs) / (-xs + 6*ys + 1.5); vs = (3*ys) / (-xs + 6*ys + 1.5); for (j=0; j < NISO; j++) { uj = isotempdata[j].ut; vj = isotempdata[j].vt; tj = isotempdata[j].tt; mj = isotempdata[j].mirek; dj = ((vs - vj) - tj * (us - uj)) / sqrt(1.0 + tj * tj); if ((j != 0) && (di/dj < 0.0)) { // Found a match *TempK = 1000000.0 / (mi + (di / (di - dj)) * (mj - mi)); return TRUE; } di = dj; mi = mj; } // Not found return FALSE; } // Compute chromatic adaptation matrix using Chad as cone matrix static cmsBool ComputeChromaticAdaptation(cmsMAT3* Conversion, const cmsCIEXYZ* SourceWhitePoint, const cmsCIEXYZ* DestWhitePoint, const cmsMAT3* Chad) { cmsMAT3 Chad_Inv; cmsVEC3 ConeSourceXYZ, ConeSourceRGB; cmsVEC3 ConeDestXYZ, ConeDestRGB; cmsMAT3 Cone, Tmp; Tmp = *Chad; if (!_cmsMAT3inverse(&Tmp, &Chad_Inv)) return FALSE; _cmsVEC3init(&ConeSourceXYZ, SourceWhitePoint -> X, SourceWhitePoint -> Y, SourceWhitePoint -> Z); _cmsVEC3init(&ConeDestXYZ, DestWhitePoint -> X, DestWhitePoint -> Y, DestWhitePoint -> Z); _cmsMAT3eval(&ConeSourceRGB, Chad, &ConeSourceXYZ); _cmsMAT3eval(&ConeDestRGB, Chad, &ConeDestXYZ); // Build matrix _cmsVEC3init(&Cone.v[0], ConeDestRGB.n[0]/ConeSourceRGB.n[0], 0.0, 0.0); _cmsVEC3init(&Cone.v[1], 0.0, ConeDestRGB.n[1]/ConeSourceRGB.n[1], 0.0); _cmsVEC3init(&Cone.v[2], 0.0, 0.0, ConeDestRGB.n[2]/ConeSourceRGB.n[2]); // Normalize _cmsMAT3per(&Tmp, &Cone, Chad); _cmsMAT3per(Conversion, &Chad_Inv, &Tmp); return TRUE; } // Returns the final chrmatic adaptation from illuminant FromIll to Illuminant ToIll // The cone matrix can be specified in ConeMatrix. If NULL, Bradford is assumed cmsBool _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll) { cmsMAT3 LamRigg = {{ // Bradford matrix {{ 0.8951, 0.2664, -0.1614 }}, {{ -0.7502, 1.7135, 0.0367 }}, {{ 0.0389, -0.0685, 1.0296 }} }}; if (ConeMatrix == NULL) ConeMatrix = &LamRigg; return ComputeChromaticAdaptation(r, FromIll, ToIll, ConeMatrix); } // Same as anterior, but assuming D50 destination. White point is given in xyY static cmsBool _cmsAdaptMatrixToD50(cmsMAT3* r, const cmsCIExyY* SourceWhitePt) { cmsCIEXYZ Dn; cmsMAT3 Bradford; cmsMAT3 Tmp; cmsxyY2XYZ(&Dn, SourceWhitePt); if (!_cmsAdaptationMatrix(&Bradford, NULL, &Dn, cmsD50_XYZ())) return FALSE; Tmp = *r; _cmsMAT3per(r, &Bradford, &Tmp); return TRUE; } // Build a White point, primary chromas transfer matrix from RGB to CIE XYZ // This is just an approximation, I am not handling all the non-linear // aspects of the RGB to XYZ process, and assumming that the gamma correction // has transitive property in the tranformation chain. // // the alghoritm: // // - First I build the absolute conversion matrix using // primaries in XYZ. This matrix is next inverted // - Then I eval the source white point across this matrix // obtaining the coeficients of the transformation // - Then, I apply these coeficients to the original matrix // cmsBool _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePt, const cmsCIExyYTRIPLE* Primrs) { cmsVEC3 WhitePoint, Coef; cmsMAT3 Result, Primaries; cmsFloat64Number xn, yn; cmsFloat64Number xr, yr; cmsFloat64Number xg, yg; cmsFloat64Number xb, yb; xn = WhitePt -> x; yn = WhitePt -> y; xr = Primrs -> Red.x; yr = Primrs -> Red.y; xg = Primrs -> Green.x; yg = Primrs -> Green.y; xb = Primrs -> Blue.x; yb = Primrs -> Blue.y; // Build Primaries matrix _cmsVEC3init(&Primaries.v[0], xr, xg, xb); _cmsVEC3init(&Primaries.v[1], yr, yg, yb); _cmsVEC3init(&Primaries.v[2], (1-xr-yr), (1-xg-yg), (1-xb-yb)); // Result = Primaries ^ (-1) inverse matrix if (!_cmsMAT3inverse(&Primaries, &Result)) return FALSE; _cmsVEC3init(&WhitePoint, xn/yn, 1.0, (1.0-xn-yn)/yn); // Across inverse primaries ... _cmsMAT3eval(&Coef, &Result, &WhitePoint); // Give us the Coefs, then I build transformation matrix _cmsVEC3init(&r -> v[0], Coef.n[VX]*xr, Coef.n[VY]*xg, Coef.n[VZ]*xb); _cmsVEC3init(&r -> v[1], Coef.n[VX]*yr, Coef.n[VY]*yg, Coef.n[VZ]*yb); _cmsVEC3init(&r -> v[2], Coef.n[VX]*(1.0-xr-yr), Coef.n[VY]*(1.0-xg-yg), Coef.n[VZ]*(1.0-xb-yb)); return _cmsAdaptMatrixToD50(r, WhitePt); } // Adapts a color to a given illuminant. Original color is expected to have // a SourceWhitePt white point. cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, const cmsCIEXYZ* SourceWhitePt, const cmsCIEXYZ* Illuminant, const cmsCIEXYZ* Value) { cmsMAT3 Bradford; cmsVEC3 In, Out; _cmsAssert(Result != NULL); _cmsAssert(SourceWhitePt != NULL); _cmsAssert(Illuminant != NULL); _cmsAssert(Value != NULL); if (!_cmsAdaptationMatrix(&Bradford, NULL, SourceWhitePt, Illuminant)) return FALSE; _cmsVEC3init(&In, Value -> X, Value -> Y, Value -> Z); _cmsMAT3eval(&Out, &Bradford, &In); Result -> X = Out.n[0]; Result -> Y = Out.n[1]; Result -> Z = Out.n[2]; return TRUE; } lcms2-2.6/src/cmspack.c0000644002406300000240000032466312311617072014320 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // This module handles all formats supported by lcms. There are two flavors, 16 bits and // floating point. Floating point is supported only in a subset, those formats holding // cmsFloat32Number (4 bytes per component) and double (marked as 0 bytes per component // as special case) // --------------------------------------------------------------------------- // This macro return words stored as big endian #define CHANGE_ENDIAN(w) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8)) // These macros handles reversing (negative) #define REVERSE_FLAVOR_8(x) ((cmsUInt8Number) (0xff-(x))) #define REVERSE_FLAVOR_16(x) ((cmsUInt16Number)(0xffff-(x))) // * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256 cmsINLINE cmsUInt16Number FomLabV2ToLabV4(cmsUInt16Number x) { int a = (x << 8 | x) >> 8; // * 257 / 256 if ( a > 0xffff) return 0xffff; return (cmsUInt16Number) a; } // * 0xf00 / 0xffff = * 256 / 257 cmsINLINE cmsUInt16Number FomLabV4ToLabV2(cmsUInt16Number x) { return (cmsUInt16Number) (((x << 8) + 0x80) / 257); } typedef struct { cmsUInt32Number Type; cmsUInt32Number Mask; cmsFormatter16 Frm; } cmsFormatters16; typedef struct { cmsUInt32Number Type; cmsUInt32Number Mask; cmsFormatterFloat Frm; } cmsFormattersFloat; #define ANYSPACE COLORSPACE_SH(31) #define ANYCHANNELS CHANNELS_SH(15) #define ANYEXTRA EXTRA_SH(7) #define ANYPLANAR PLANAR_SH(1) #define ANYENDIAN ENDIAN16_SH(1) #define ANYSWAP DOSWAP_SH(1) #define ANYSWAPFIRST SWAPFIRST_SH(1) #define ANYFLAVOR FLAVOR_SH(1) // Supress waning about info never being used #ifdef _MSC_VER #pragma warning(disable : 4100) #endif // Unpacking routines (16 bits) ---------------------------------------------------------------------------------------- // Does almost everything but is slow static cmsUInt8Number* UnrollChunkyBytes(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> InputFormat); int DoSwap = T_DOSWAP(info ->InputFormat); int Reverse = T_FLAVOR(info ->InputFormat); int SwapFirst = T_SWAPFIRST(info -> InputFormat); int Extra = T_EXTRA(info -> InputFormat); int ExtraFirst = DoSwap ^ SwapFirst; cmsUInt16Number v; int i; if (ExtraFirst) { accum += Extra; } for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; v = FROM_8_TO_16(*accum); v = Reverse ? REVERSE_FLAVOR_16(v) : v; wIn[index] = v; accum++; } if (!ExtraFirst) { accum += Extra; } if (Extra == 0 && SwapFirst) { cmsUInt16Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); wIn[nChan-1] = tmp; } return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // Extra channels are just ignored because come in the next planes static cmsUInt8Number* UnrollPlanarBytes(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> InputFormat); int DoSwap = T_DOSWAP(info ->InputFormat); int SwapFirst = T_SWAPFIRST(info ->InputFormat); int Reverse = T_FLAVOR(info ->InputFormat); int i; cmsUInt8Number* Init = accum; if (DoSwap ^ SwapFirst) { accum += T_EXTRA(info -> InputFormat) * Stride; } for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; cmsUInt16Number v = FROM_8_TO_16(*accum); wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; accum += Stride; } return (Init + 1); } // Special cases, provided for performance static cmsUInt8Number* Unroll4Bytes(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = FROM_8_TO_16(*accum); accum++; // C wIn[1] = FROM_8_TO_16(*accum); accum++; // M wIn[2] = FROM_8_TO_16(*accum); accum++; // Y wIn[3] = FROM_8_TO_16(*accum); accum++; // K return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4BytesReverse(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // C wIn[1] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // M wIn[2] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // Y wIn[3] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // K return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4BytesSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[3] = FROM_8_TO_16(*accum); accum++; // K wIn[0] = FROM_8_TO_16(*accum); accum++; // C wIn[1] = FROM_8_TO_16(*accum); accum++; // M wIn[2] = FROM_8_TO_16(*accum); accum++; // Y return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // KYMC static cmsUInt8Number* Unroll4BytesSwap(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[3] = FROM_8_TO_16(*accum); accum++; // K wIn[2] = FROM_8_TO_16(*accum); accum++; // Y wIn[1] = FROM_8_TO_16(*accum); accum++; // M wIn[0] = FROM_8_TO_16(*accum); accum++; // C return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4BytesSwapSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[2] = FROM_8_TO_16(*accum); accum++; // K wIn[1] = FROM_8_TO_16(*accum); accum++; // Y wIn[0] = FROM_8_TO_16(*accum); accum++; // M wIn[3] = FROM_8_TO_16(*accum); accum++; // C return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3Bytes(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = FROM_8_TO_16(*accum); accum++; // R wIn[1] = FROM_8_TO_16(*accum); accum++; // G wIn[2] = FROM_8_TO_16(*accum); accum++; // B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3BytesSkip1Swap(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { accum++; // A wIn[2] = FROM_8_TO_16(*accum); accum++; // B wIn[1] = FROM_8_TO_16(*accum); accum++; // G wIn[0] = FROM_8_TO_16(*accum); accum++; // R return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3BytesSkip1SwapSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[2] = FROM_8_TO_16(*accum); accum++; // B wIn[1] = FROM_8_TO_16(*accum); accum++; // G wIn[0] = FROM_8_TO_16(*accum); accum++; // R accum++; // A return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3BytesSkip1SwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { accum++; // A wIn[0] = FROM_8_TO_16(*accum); accum++; // R wIn[1] = FROM_8_TO_16(*accum); accum++; // G wIn[2] = FROM_8_TO_16(*accum); accum++; // B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // BRG static cmsUInt8Number* Unroll3BytesSwap(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[2] = FROM_8_TO_16(*accum); accum++; // B wIn[1] = FROM_8_TO_16(*accum); accum++; // G wIn[0] = FROM_8_TO_16(*accum); accum++; // R return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollLabV2_8(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollALabV2_8(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { accum++; // A wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollLabV2_16(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // L wIn[1] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // a wIn[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // b return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // for duplex static cmsUInt8Number* Unroll2Bytes(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = FROM_8_TO_16(*accum); accum++; // ch1 wIn[1] = FROM_8_TO_16(*accum); accum++; // ch2 return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // Monochrome duplicates L into RGB for null-transforms static cmsUInt8Number* Unroll1Byte(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1ByteSkip1(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L accum += 1; return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1ByteSkip2(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L accum += 2; return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1ByteReversed(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(FROM_8_TO_16(*accum)); accum++; // L return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollAnyWords(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> InputFormat); int SwapEndian = T_ENDIAN16(info -> InputFormat); int DoSwap = T_DOSWAP(info ->InputFormat); int Reverse = T_FLAVOR(info ->InputFormat); int SwapFirst = T_SWAPFIRST(info -> InputFormat); int Extra = T_EXTRA(info -> InputFormat); int ExtraFirst = DoSwap ^ SwapFirst; int i; if (ExtraFirst) { accum += Extra * sizeof(cmsUInt16Number); } for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; cmsUInt16Number v = *(cmsUInt16Number*) accum; if (SwapEndian) v = CHANGE_ENDIAN(v); wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; accum += sizeof(cmsUInt16Number); } if (!ExtraFirst) { accum += Extra * sizeof(cmsUInt16Number); } if (Extra == 0 && SwapFirst) { cmsUInt16Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); wIn[nChan-1] = tmp; } return accum; cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* UnrollPlanarWords(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> InputFormat); int DoSwap= T_DOSWAP(info ->InputFormat); int Reverse= T_FLAVOR(info ->InputFormat); int SwapEndian = T_ENDIAN16(info -> InputFormat); int i; cmsUInt8Number* Init = accum; if (DoSwap) { accum += T_EXTRA(info -> InputFormat) * Stride * sizeof(cmsUInt16Number); } for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; cmsUInt16Number v = *(cmsUInt16Number*) accum; if (SwapEndian) v = CHANGE_ENDIAN(v); wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; accum += Stride * sizeof(cmsUInt16Number); } return (Init + sizeof(cmsUInt16Number)); } static cmsUInt8Number* Unroll4Words(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4WordsReverse(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // C wIn[1] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // M wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // Y wIn[3] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // K return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4WordsSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // KYMC static cmsUInt8Number* Unroll4WordsSwap(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll4WordsSwapSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // K wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // Y wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // M wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // C return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3Words(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C R wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3WordsSwap(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // C R wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // Y B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3WordsSkip1Swap(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { accum += 2; // A wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // R wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll3WordsSkip1SwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { accum += 2; // A wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // R wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // B return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1Word(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // L return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1WordReversed(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll1WordSkip3(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum += 8; return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Unroll2Words(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // ch1 wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // ch2 return accum; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // This is a conversion of Lab double to 16 bits static cmsUInt8Number* UnrollLabDoubleTo16(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { if (T_PLANAR(info -> InputFormat)) { cmsFloat64Number* Pt = (cmsFloat64Number*) accum; cmsCIELab Lab; Lab.L = Pt[0]; Lab.a = Pt[Stride]; Lab.b = Pt[Stride*2]; cmsFloat2LabEncoded(wIn, &Lab); return accum + sizeof(cmsFloat64Number); } else { cmsFloat2LabEncoded(wIn, (cmsCIELab*) accum); accum += sizeof(cmsCIELab) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number); return accum; } } // This is a conversion of Lab float to 16 bits static cmsUInt8Number* UnrollLabFloatTo16(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { cmsCIELab Lab; if (T_PLANAR(info -> InputFormat)) { cmsFloat32Number* Pt = (cmsFloat32Number*) accum; Lab.L = Pt[0]; Lab.a = Pt[Stride]; Lab.b = Pt[Stride*2]; cmsFloat2LabEncoded(wIn, &Lab); return accum + sizeof(cmsFloat32Number); } else { Lab.L = ((cmsFloat32Number*) accum)[0]; Lab.a = ((cmsFloat32Number*) accum)[1]; Lab.b = ((cmsFloat32Number*) accum)[2]; cmsFloat2LabEncoded(wIn, &Lab); accum += (3 + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat32Number); return accum; } } // This is a conversion of XYZ double to 16 bits static cmsUInt8Number* UnrollXYZDoubleTo16(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { if (T_PLANAR(info -> InputFormat)) { cmsFloat64Number* Pt = (cmsFloat64Number*) accum; cmsCIEXYZ XYZ; XYZ.X = Pt[0]; XYZ.Y = Pt[Stride]; XYZ.Z = Pt[Stride*2]; cmsFloat2XYZEncoded(wIn, &XYZ); return accum + sizeof(cmsFloat64Number); } else { cmsFloat2XYZEncoded(wIn, (cmsCIEXYZ*) accum); accum += sizeof(cmsCIEXYZ) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number); return accum; } } // This is a conversion of XYZ float to 16 bits static cmsUInt8Number* UnrollXYZFloatTo16(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { if (T_PLANAR(info -> InputFormat)) { cmsFloat32Number* Pt = (cmsFloat32Number*) accum; cmsCIEXYZ XYZ; XYZ.X = Pt[0]; XYZ.Y = Pt[Stride]; XYZ.Z = Pt[Stride*2]; cmsFloat2XYZEncoded(wIn, &XYZ); return accum + sizeof(cmsFloat32Number); } else { cmsFloat32Number* Pt = (cmsFloat32Number*) accum; cmsCIEXYZ XYZ; XYZ.X = Pt[0]; XYZ.Y = Pt[1]; XYZ.Z = Pt[2]; cmsFloat2XYZEncoded(wIn, &XYZ); accum += 3 * sizeof(cmsFloat32Number) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat32Number); return accum; } } // Check if space is marked as ink cmsINLINE cmsBool IsInkSpace(cmsUInt32Number Type) { switch (T_COLORSPACE(Type)) { case PT_CMY: case PT_CMYK: case PT_MCH5: case PT_MCH6: case PT_MCH7: case PT_MCH8: case PT_MCH9: case PT_MCH10: case PT_MCH11: case PT_MCH12: case PT_MCH13: case PT_MCH14: case PT_MCH15: return TRUE; default: return FALSE; } } // Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits static cmsUInt8Number* UnrollDoubleTo16(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> InputFormat); int DoSwap = T_DOSWAP(info ->InputFormat); int Reverse = T_FLAVOR(info ->InputFormat); int SwapFirst = T_SWAPFIRST(info -> InputFormat); int Extra = T_EXTRA(info -> InputFormat); int ExtraFirst = DoSwap ^ SwapFirst; int Planar = T_PLANAR(info -> InputFormat); cmsFloat64Number v; cmsUInt16Number vi; int i, start = 0; cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[(i + start) * Stride]; else v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[i + start]; vi = _cmsQuickSaturateWord(v * maximum); if (Reverse) vi = REVERSE_FLAVOR_16(vi); wIn[index] = vi; } if (Extra == 0 && SwapFirst) { cmsUInt16Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat64Number); else return accum + (nChan + Extra) * sizeof(cmsFloat64Number); } static cmsUInt8Number* UnrollFloatTo16(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> InputFormat); int DoSwap = T_DOSWAP(info ->InputFormat); int Reverse = T_FLAVOR(info ->InputFormat); int SwapFirst = T_SWAPFIRST(info -> InputFormat); int Extra = T_EXTRA(info -> InputFormat); int ExtraFirst = DoSwap ^ SwapFirst; int Planar = T_PLANAR(info -> InputFormat); cmsFloat32Number v; cmsUInt16Number vi; int i, start = 0; cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride]; else v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start]; vi = _cmsQuickSaturateWord(v * maximum); if (Reverse) vi = REVERSE_FLAVOR_16(vi); wIn[index] = vi; } if (Extra == 0 && SwapFirst) { cmsUInt16Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat32Number); else return accum + (nChan + Extra) * sizeof(cmsFloat32Number); } // For 1 channel, we need to duplicate data (it comes in 0..1.0 range) static cmsUInt8Number* UnrollDouble1Chan(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { cmsFloat64Number* Inks = (cmsFloat64Number*) accum; wIn[0] = wIn[1] = wIn[2] = _cmsQuickSaturateWord(Inks[0] * 65535.0); return accum + sizeof(cmsFloat64Number); cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } //------------------------------------------------------------------------------------------------------------------- // For anything going from cmsFloat32Number static cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> InputFormat); int DoSwap = T_DOSWAP(info ->InputFormat); int Reverse = T_FLAVOR(info ->InputFormat); int SwapFirst = T_SWAPFIRST(info -> InputFormat); int Extra = T_EXTRA(info -> InputFormat); int ExtraFirst = DoSwap ^ SwapFirst; int Planar = T_PLANAR(info -> InputFormat); cmsFloat32Number v; int i, start = 0; cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride]; else v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start]; v /= maximum; wIn[index] = Reverse ? 1 - v : v; } if (Extra == 0 && SwapFirst) { cmsFloat32Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat32Number); else return accum + (nChan + Extra) * sizeof(cmsFloat32Number); } // For anything going from double static cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> InputFormat); int DoSwap = T_DOSWAP(info ->InputFormat); int Reverse = T_FLAVOR(info ->InputFormat); int SwapFirst = T_SWAPFIRST(info -> InputFormat); int Extra = T_EXTRA(info -> InputFormat); int ExtraFirst = DoSwap ^ SwapFirst; int Planar = T_PLANAR(info -> InputFormat); cmsFloat64Number v; int i, start = 0; cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[(i + start) * Stride]; else v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[i + start]; v /= maximum; wIn[index] = (cmsFloat32Number) (Reverse ? 1.0 - v : v); } if (Extra == 0 && SwapFirst) { cmsFloat32Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsFloat64Number); else return accum + (nChan + Extra) * sizeof(cmsFloat64Number); } // From Lab double to cmsFloat32Number static cmsUInt8Number* UnrollLabDoubleToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsFloat64Number* Pt = (cmsFloat64Number*) accum; if (T_PLANAR(info -> InputFormat)) { wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); return accum + sizeof(cmsFloat64Number); } else { wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0); accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } // From Lab double to cmsFloat32Number static cmsUInt8Number* UnrollLabFloatToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsFloat32Number* Pt = (cmsFloat32Number*) accum; if (T_PLANAR(info -> InputFormat)) { wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); return accum + sizeof(cmsFloat32Number); } else { wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1 wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0); accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } // 1.15 fixed point, that means maximum value is MAX_ENCODEABLE_XYZ (0xFFFF) static cmsUInt8Number* UnrollXYZDoubleToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsFloat64Number* Pt = (cmsFloat64Number*) accum; if (T_PLANAR(info -> InputFormat)) { wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); return accum + sizeof(cmsFloat64Number); } else { wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ); accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } static cmsUInt8Number* UnrollXYZFloatToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { cmsFloat32Number* Pt = (cmsFloat32Number*) accum; if (T_PLANAR(info -> InputFormat)) { wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); return accum + sizeof(cmsFloat32Number); } else { wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ); wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ); accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat)); return accum; } } // Packing routines ----------------------------------------------------------------------------------------------------------- // Generic chunky for byte static cmsUInt8Number* PackAnyBytes(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> OutputFormat); int DoSwap = T_DOSWAP(info ->OutputFormat); int Reverse = T_FLAVOR(info ->OutputFormat); int Extra = T_EXTRA(info -> OutputFormat); int SwapFirst = T_SWAPFIRST(info -> OutputFormat); int ExtraFirst = DoSwap ^ SwapFirst; cmsUInt8Number* swap1; cmsUInt8Number v = 0; int i; swap1 = output; if (ExtraFirst) { output += Extra; } for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; v = FROM_16_TO_8(wOut[index]); if (Reverse) v = REVERSE_FLAVOR_8(v); *output++ = v; } if (!ExtraFirst) { output += Extra; } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, nChan-1); *swap1 = v; } return output; cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackAnyWords(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> OutputFormat); int SwapEndian = T_ENDIAN16(info -> InputFormat); int DoSwap = T_DOSWAP(info ->OutputFormat); int Reverse = T_FLAVOR(info ->OutputFormat); int Extra = T_EXTRA(info -> OutputFormat); int SwapFirst = T_SWAPFIRST(info -> OutputFormat); int ExtraFirst = DoSwap ^ SwapFirst; cmsUInt16Number* swap1; cmsUInt16Number v = 0; int i; swap1 = (cmsUInt16Number*) output; if (ExtraFirst) { output += Extra * sizeof(cmsUInt16Number); } for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; v = wOut[index]; if (SwapEndian) v = CHANGE_ENDIAN(v); if (Reverse) v = REVERSE_FLAVOR_16(v); *(cmsUInt16Number*) output = v; output += sizeof(cmsUInt16Number); } if (!ExtraFirst) { output += Extra * sizeof(cmsUInt16Number); } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number)); *swap1 = v; } return output; cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackPlanarBytes(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> OutputFormat); int DoSwap = T_DOSWAP(info ->OutputFormat); int SwapFirst = T_SWAPFIRST(info ->OutputFormat); int Reverse = T_FLAVOR(info ->OutputFormat); int i; cmsUInt8Number* Init = output; if (DoSwap ^ SwapFirst) { output += T_EXTRA(info -> OutputFormat) * Stride; } for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; cmsUInt8Number v = FROM_16_TO_8(wOut[index]); *(cmsUInt8Number*) output = (cmsUInt8Number) (Reverse ? REVERSE_FLAVOR_8(v) : v); output += Stride; } return (Init + 1); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackPlanarWords(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> OutputFormat); int DoSwap = T_DOSWAP(info ->OutputFormat); int Reverse= T_FLAVOR(info ->OutputFormat); int SwapEndian = T_ENDIAN16(info -> OutputFormat); int i; cmsUInt8Number* Init = output; cmsUInt16Number v; if (DoSwap) { output += T_EXTRA(info -> OutputFormat) * Stride * sizeof(cmsUInt16Number); } for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; v = wOut[index]; if (SwapEndian) v = CHANGE_ENDIAN(v); if (Reverse) v = REVERSE_FLAVOR_16(v); *(cmsUInt16Number*) output = v; output += (Stride * sizeof(cmsUInt16Number)); } return (Init + sizeof(cmsUInt16Number)); } // CMYKcm (unrolled for speed) static cmsUInt8Number* Pack6Bytes(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[3]); *output++ = FROM_16_TO_8(wOut[4]); *output++ = FROM_16_TO_8(wOut[5]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // KCMYcm static cmsUInt8Number* Pack6BytesSwap(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[5]); *output++ = FROM_16_TO_8(wOut[4]); *output++ = FROM_16_TO_8(wOut[3]); *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // CMYKcm static cmsUInt8Number* Pack6Words(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[3]; output+= 2; *(cmsUInt16Number*) output = wOut[4]; output+= 2; *(cmsUInt16Number*) output = wOut[5]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // KCMYcm static cmsUInt8Number* Pack6WordsSwap(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[5]; output+= 2; *(cmsUInt16Number*) output = wOut[4]; output+= 2; *(cmsUInt16Number*) output = wOut[3]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4Bytes(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[3]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4BytesReverse(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[0])); *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[1])); *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[2])); *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[3])); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4BytesSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[3]); *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // ABGR static cmsUInt8Number* Pack4BytesSwap(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[3]); *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4BytesSwapSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[3]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4Words(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[3]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack4WordsReverse(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]); output+= 2; *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[1]); output+= 2; *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[2]); output+= 2; *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[3]); output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // ABGR static cmsUInt8Number* Pack4WordsSwap(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[3]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // CMYK static cmsUInt8Number* Pack4WordsBigEndian(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); output+= 2; *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]); output+= 2; *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]); output+= 2; *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[3]); output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackLabV2_8(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0])); *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1])); *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2])); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackALabV2_8(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { output++; *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0])); *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1])); *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2])); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* PackLabV2_16(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[0]); output += 2; *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[1]); output += 2; *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[2]); output += 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3Bytes(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesOptimized(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = (wOut[0] & 0xFF); *output++ = (wOut[1] & 0xFF); *output++ = (wOut[2] & 0xFF); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesSwap(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesSwapOptimized(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = (wOut[2] & 0xFF); *output++ = (wOut[1] & 0xFF); *output++ = (wOut[0] & 0xFF); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3Words(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsSwap(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsBigEndian(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); output+= 2; *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]); output+= 2; *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]); output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); output++; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1Optimized(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = (wOut[0] & 0xFF); *output++ = (wOut[1] & 0xFF); *output++ = (wOut[2] & 0xFF); output++; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1SwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { output++; *output++ = FROM_16_TO_8(wOut[0]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[2]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1SwapFirstOptimized(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { output++; *output++ = (wOut[0] & 0xFF); *output++ = (wOut[1] & 0xFF); *output++ = (wOut[2] & 0xFF); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1Swap(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { output++; *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1SwapOptimized(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { output++; *output++ = (wOut[2] & 0xFF); *output++ = (wOut[1] & 0xFF); *output++ = (wOut[0] & 0xFF); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[2]); *output++ = FROM_16_TO_8(wOut[1]); *output++ = FROM_16_TO_8(wOut[0]); output++; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirstOptimized(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = (wOut[2] & 0xFF); *output++ = (wOut[1] & 0xFF); *output++ = (wOut[0] & 0xFF); output++; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsAndSkip1(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsAndSkip1Swap(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsAndSkip1SwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[2]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack3WordsAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[2]; output+= 2; *(cmsUInt16Number*) output = wOut[1]; output+= 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1Byte(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1ByteReversed(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(REVERSE_FLAVOR_16(wOut[0])); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1ByteSkip1(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *output++ = FROM_16_TO_8(wOut[0]); output++; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1ByteSkip1SwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { output++; *output++ = FROM_16_TO_8(wOut[0]); return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1Word(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1WordReversed(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]); output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1WordBigEndian(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1WordSkip1(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { *(cmsUInt16Number*) output = wOut[0]; output+= 4; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } static cmsUInt8Number* Pack1WordSkip1SwapFirst(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { output += 2; *(cmsUInt16Number*) output = wOut[0]; output+= 2; return output; cmsUNUSED_PARAMETER(info); cmsUNUSED_PARAMETER(Stride); } // Unencoded Float values -- don't try optimize speed static cmsUInt8Number* PackLabDoubleFrom16(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { if (T_PLANAR(info -> OutputFormat)) { cmsCIELab Lab; cmsFloat64Number* Out = (cmsFloat64Number*) output; cmsLabEncoded2Float(&Lab, wOut); Out[0] = Lab.L; Out[Stride] = Lab.a; Out[Stride*2] = Lab.b; return output + sizeof(cmsFloat64Number); } else { cmsLabEncoded2Float((cmsCIELab*) output, wOut); return output + (sizeof(cmsCIELab) + T_EXTRA(info ->OutputFormat) * sizeof(cmsFloat64Number)); } } static cmsUInt8Number* PackLabFloatFrom16(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { cmsCIELab Lab; cmsLabEncoded2Float(&Lab, wOut); if (T_PLANAR(info -> OutputFormat)) { cmsFloat32Number* Out = (cmsFloat32Number*) output; Out[0] = (cmsFloat32Number)Lab.L; Out[Stride] = (cmsFloat32Number)Lab.a; Out[Stride*2] = (cmsFloat32Number)Lab.b; return output + sizeof(cmsFloat32Number); } else { ((cmsFloat32Number*) output)[0] = (cmsFloat32Number) Lab.L; ((cmsFloat32Number*) output)[1] = (cmsFloat32Number) Lab.a; ((cmsFloat32Number*) output)[2] = (cmsFloat32Number) Lab.b; return output + (3 + T_EXTRA(info ->OutputFormat)) * sizeof(cmsFloat32Number); } } static cmsUInt8Number* PackXYZDoubleFrom16(register _cmsTRANSFORM* Info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { if (T_PLANAR(Info -> OutputFormat)) { cmsCIEXYZ XYZ; cmsFloat64Number* Out = (cmsFloat64Number*) output; cmsXYZEncoded2Float(&XYZ, wOut); Out[0] = XYZ.X; Out[Stride] = XYZ.Y; Out[Stride*2] = XYZ.Z; return output + sizeof(cmsFloat64Number); } else { cmsXYZEncoded2Float((cmsCIEXYZ*) output, wOut); return output + (sizeof(cmsCIEXYZ) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); } } static cmsUInt8Number* PackXYZFloatFrom16(register _cmsTRANSFORM* Info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { if (T_PLANAR(Info -> OutputFormat)) { cmsCIEXYZ XYZ; cmsFloat32Number* Out = (cmsFloat32Number*) output; cmsXYZEncoded2Float(&XYZ, wOut); Out[0] = (cmsFloat32Number) XYZ.X; Out[Stride] = (cmsFloat32Number) XYZ.Y; Out[Stride*2] = (cmsFloat32Number) XYZ.Z; return output + sizeof(cmsFloat32Number); } else { cmsCIEXYZ XYZ; cmsFloat32Number* Out = (cmsFloat32Number*) output; cmsXYZEncoded2Float(&XYZ, wOut); Out[0] = (cmsFloat32Number) XYZ.X; Out[1] = (cmsFloat32Number) XYZ.Y; Out[2] = (cmsFloat32Number) XYZ.Z; return output + (3 * sizeof(cmsFloat32Number) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); } } static cmsUInt8Number* PackDoubleFrom16(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> OutputFormat); int DoSwap = T_DOSWAP(info ->OutputFormat); int Reverse = T_FLAVOR(info ->OutputFormat); int Extra = T_EXTRA(info -> OutputFormat); int SwapFirst = T_SWAPFIRST(info -> OutputFormat); int Planar = T_PLANAR(info -> OutputFormat); int ExtraFirst = DoSwap ^ SwapFirst; cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0; cmsFloat64Number v = 0; cmsFloat64Number* swap1 = (cmsFloat64Number*) output; int i, start = 0; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; v = (cmsFloat64Number) wOut[index] / maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsFloat64Number*) output)[(i + start) * Stride]= v; else ((cmsFloat64Number*) output)[i + start] = v; } if (!ExtraFirst) { output += Extra * sizeof(cmsFloat64Number); } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number)); *swap1 = v; } if (T_PLANAR(info -> OutputFormat)) return output + sizeof(cmsFloat64Number); else return output + nChan * sizeof(cmsFloat64Number); } static cmsUInt8Number* PackFloatFrom16(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> OutputFormat); int DoSwap = T_DOSWAP(info ->OutputFormat); int Reverse = T_FLAVOR(info ->OutputFormat); int Extra = T_EXTRA(info -> OutputFormat); int SwapFirst = T_SWAPFIRST(info -> OutputFormat); int Planar = T_PLANAR(info -> OutputFormat); int ExtraFirst = DoSwap ^ SwapFirst; cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0; cmsFloat64Number v = 0; cmsFloat32Number* swap1 = (cmsFloat32Number*) output; int i, start = 0; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; v = (cmsFloat64Number) wOut[index] / maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsFloat32Number*) output)[(i + start ) * Stride]= (cmsFloat32Number) v; else ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v; } if (!ExtraFirst) { output += Extra * sizeof(cmsFloat32Number); } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number)); *swap1 = (cmsFloat32Number) v; } if (T_PLANAR(info -> OutputFormat)) return output + sizeof(cmsFloat32Number); else return output + nChan * sizeof(cmsFloat32Number); } // -------------------------------------------------------------------------------------------------------- static cmsUInt8Number* PackFloatsFromFloat(_cmsTRANSFORM* info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> OutputFormat); int DoSwap = T_DOSWAP(info ->OutputFormat); int Reverse = T_FLAVOR(info ->OutputFormat); int Extra = T_EXTRA(info -> OutputFormat); int SwapFirst = T_SWAPFIRST(info -> OutputFormat); int Planar = T_PLANAR(info -> OutputFormat); int ExtraFirst = DoSwap ^ SwapFirst; cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0; cmsFloat32Number* swap1 = (cmsFloat32Number*) output; cmsFloat64Number v = 0; int i, start = 0; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; v = wOut[index] * maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsFloat32Number*) output)[(i + start)* Stride]= (cmsFloat32Number) v; else ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v; } if (!ExtraFirst) { output += Extra * sizeof(cmsFloat32Number); } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number)); *swap1 = (cmsFloat32Number) v; } if (T_PLANAR(info -> OutputFormat)) return output + sizeof(cmsFloat32Number); else return output + nChan * sizeof(cmsFloat32Number); } static cmsUInt8Number* PackDoublesFromFloat(_cmsTRANSFORM* info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> OutputFormat); int DoSwap = T_DOSWAP(info ->OutputFormat); int Reverse = T_FLAVOR(info ->OutputFormat); int Extra = T_EXTRA(info -> OutputFormat); int SwapFirst = T_SWAPFIRST(info -> OutputFormat); int Planar = T_PLANAR(info -> OutputFormat); int ExtraFirst = DoSwap ^ SwapFirst; cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0; cmsFloat64Number v = 0; cmsFloat64Number* swap1 = (cmsFloat64Number*) output; int i, start = 0; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; v = wOut[index] * maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsFloat64Number*) output)[(i + start) * Stride] = v; else ((cmsFloat64Number*) output)[i + start] = v; } if (!ExtraFirst) { output += Extra * sizeof(cmsFloat64Number); } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number)); *swap1 = v; } if (T_PLANAR(info -> OutputFormat)) return output + sizeof(cmsFloat64Number); else return output + nChan * sizeof(cmsFloat64Number); } static cmsUInt8Number* PackLabFloatFromFloat(_cmsTRANSFORM* Info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsFloat32Number* Out = (cmsFloat32Number*) output; if (T_PLANAR(Info -> OutputFormat)) { Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); Out[Stride] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0); Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0); return output + sizeof(cmsFloat32Number); } else { Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); Out[1] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0); Out[2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0); return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); } } static cmsUInt8Number* PackLabDoubleFromFloat(_cmsTRANSFORM* Info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsFloat64Number* Out = (cmsFloat64Number*) output; if (T_PLANAR(Info -> OutputFormat)) { Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); Out[Stride] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0); Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0); return output + sizeof(cmsFloat64Number); } else { Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); Out[1] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0); Out[2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0); return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); } } // From 0..1 range to 0..MAX_ENCODEABLE_XYZ static cmsUInt8Number* PackXYZFloatFromFloat(_cmsTRANSFORM* Info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsFloat32Number* Out = (cmsFloat32Number*) output; if (T_PLANAR(Info -> OutputFormat)) { Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[Stride] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ); return output + sizeof(cmsFloat32Number); } else { Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[1] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ); return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); } } // Same, but convert to double static cmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { cmsFloat64Number* Out = (cmsFloat64Number*) output; if (T_PLANAR(Info -> OutputFormat)) { Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[Stride] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ); return output + sizeof(cmsFloat64Number); } else { Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); Out[1] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ); Out[2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ); return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); } } // ---------------------------------------------------------------------------------------------------------------- #ifndef CMS_NO_HALF_SUPPORT // Decodes an stream of half floats to wIn[] described by input format static cmsUInt8Number* UnrollHalfTo16(register _cmsTRANSFORM* info, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> InputFormat); int DoSwap = T_DOSWAP(info ->InputFormat); int Reverse = T_FLAVOR(info ->InputFormat); int SwapFirst = T_SWAPFIRST(info -> InputFormat); int Extra = T_EXTRA(info -> InputFormat); int ExtraFirst = DoSwap ^ SwapFirst; int Planar = T_PLANAR(info -> InputFormat); cmsFloat32Number v; int i, start = 0; cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] ); else v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ; if (Reverse) v = maximum - v; wIn[index] = _cmsQuickSaturateWord(v * maximum); } if (Extra == 0 && SwapFirst) { cmsUInt16Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsUInt16Number); else return accum + (nChan + Extra) * sizeof(cmsUInt16Number); } // Decodes an stream of half floats to wIn[] described by input format static cmsUInt8Number* UnrollHalfToFloat(_cmsTRANSFORM* info, cmsFloat32Number wIn[], cmsUInt8Number* accum, cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> InputFormat); int DoSwap = T_DOSWAP(info ->InputFormat); int Reverse = T_FLAVOR(info ->InputFormat); int SwapFirst = T_SWAPFIRST(info -> InputFormat); int Extra = T_EXTRA(info -> InputFormat); int ExtraFirst = DoSwap ^ SwapFirst; int Planar = T_PLANAR(info -> InputFormat); cmsFloat32Number v; int i, start = 0; cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; if (Planar) v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] ); else v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ; v /= maximum; wIn[index] = Reverse ? 1 - v : v; } if (Extra == 0 && SwapFirst) { cmsFloat32Number tmp = wIn[0]; memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); wIn[nChan-1] = tmp; } if (T_PLANAR(info -> InputFormat)) return accum + sizeof(cmsUInt16Number); else return accum + (nChan + Extra) * sizeof(cmsUInt16Number); } static cmsUInt8Number* PackHalfFrom16(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> OutputFormat); int DoSwap = T_DOSWAP(info ->OutputFormat); int Reverse = T_FLAVOR(info ->OutputFormat); int Extra = T_EXTRA(info -> OutputFormat); int SwapFirst = T_SWAPFIRST(info -> OutputFormat); int Planar = T_PLANAR(info -> OutputFormat); int ExtraFirst = DoSwap ^ SwapFirst; cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35F : 65535.0F; cmsFloat32Number v = 0; cmsUInt16Number* swap1 = (cmsUInt16Number*) output; int i, start = 0; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; v = (cmsFloat32Number) wOut[index] / maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsUInt16Number*) output)[(i + start ) * Stride]= _cmsFloat2Half(v); else ((cmsUInt16Number*) output)[i + start] = _cmsFloat2Half(v); } if (!ExtraFirst) { output += Extra * sizeof(cmsUInt16Number); } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number)); *swap1 = _cmsFloat2Half(v); } if (T_PLANAR(info -> OutputFormat)) return output + sizeof(cmsUInt16Number); else return output + nChan * sizeof(cmsUInt16Number); } static cmsUInt8Number* PackHalfFromFloat(_cmsTRANSFORM* info, cmsFloat32Number wOut[], cmsUInt8Number* output, cmsUInt32Number Stride) { int nChan = T_CHANNELS(info -> OutputFormat); int DoSwap = T_DOSWAP(info ->OutputFormat); int Reverse = T_FLAVOR(info ->OutputFormat); int Extra = T_EXTRA(info -> OutputFormat); int SwapFirst = T_SWAPFIRST(info -> OutputFormat); int Planar = T_PLANAR(info -> OutputFormat); int ExtraFirst = DoSwap ^ SwapFirst; cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0F : 1.0F; cmsUInt16Number* swap1 = (cmsUInt16Number*) output; cmsFloat32Number v = 0; int i, start = 0; if (ExtraFirst) start = Extra; for (i=0; i < nChan; i++) { int index = DoSwap ? (nChan - i - 1) : i; v = wOut[index] * maximum; if (Reverse) v = maximum - v; if (Planar) ((cmsUInt16Number*) output)[(i + start)* Stride]= _cmsFloat2Half( v ); else ((cmsUInt16Number*) output)[i + start] = _cmsFloat2Half( v ); } if (!ExtraFirst) { output += Extra * sizeof(cmsUInt16Number); } if (Extra == 0 && SwapFirst) { memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number)); *swap1 = (cmsUInt16Number) _cmsFloat2Half( v ); } if (T_PLANAR(info -> OutputFormat)) return output + sizeof(cmsUInt16Number); else return output + nChan * sizeof(cmsUInt16Number); } #endif // ---------------------------------------------------------------------------------------------------------------- static cmsFormatters16 InputFormatters16[] = { // Type Mask Function // ---------------------------- ------------------------------------ ---------------------------- { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleTo16}, { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleTo16}, { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatTo16}, { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatTo16}, { TYPE_GRAY_DBL, 0, UnrollDouble1Chan}, { FLOAT_SH(1)|BYTES_SH(0), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| ANYSWAP|ANYEXTRA|ANYSPACE, UnrollDoubleTo16}, { FLOAT_SH(1)|BYTES_SH(4), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| ANYSWAP|ANYEXTRA|ANYSPACE, UnrollFloatTo16}, #ifndef CMS_NO_HALF_SUPPORT { FLOAT_SH(1)|BYTES_SH(2), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| ANYEXTRA|ANYSWAP|ANYSPACE, UnrollHalfTo16}, #endif { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Unroll1Byte}, { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Unroll1ByteSkip1}, { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(2), ANYSPACE, Unroll1ByteSkip2}, { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll1ByteReversed}, { COLORSPACE_SH(PT_MCH2)|CHANNELS_SH(2)|BYTES_SH(1), 0, Unroll2Bytes}, { TYPE_LabV2_8, 0, UnrollLabV2_8 }, { TYPE_ALabV2_8, 0, UnrollALabV2_8 }, { TYPE_LabV2_16, 0, UnrollLabV2_16 }, { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Unroll3Bytes}, { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSwap}, { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSkip1Swap}, { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3BytesSkip1SwapFirst}, { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3BytesSkip1SwapSwapFirst}, { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Unroll4Bytes}, { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll4BytesReverse}, { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapFirst}, { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll4BytesSwap}, { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapSwapFirst}, { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST| ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarBytes}, { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollChunkyBytes}, { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Unroll1Word}, { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll1WordReversed}, { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(3), ANYSPACE, Unroll1WordSkip3}, { CHANNELS_SH(2)|BYTES_SH(2), ANYSPACE, Unroll2Words}, { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Unroll3Words}, { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Unroll4Words}, { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSwap}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3WordsSkip1SwapFirst}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSkip1Swap}, { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll4WordsReverse}, { CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapFirst}, { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll4WordsSwap}, { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapSwapFirst}, { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarWords}, { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollAnyWords}, }; static cmsFormattersFloat InputFormattersFloat[] = { // Type Mask Function // ---------------------------- ------------------------------------ ---------------------------- { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleToFloat}, { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatToFloat}, { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleToFloat}, { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatToFloat}, { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| ANYCHANNELS|ANYSPACE, UnrollFloatsToFloat}, { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| ANYCHANNELS|ANYSPACE, UnrollDoublesToFloat}, #ifndef CMS_NO_HALF_SUPPORT { FLOAT_SH(1)|BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| ANYCHANNELS|ANYSPACE, UnrollHalfToFloat}, #endif }; // Bit fields set to one in the mask are not compared static cmsFormatter _cmsGetStockInputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags) { cmsUInt32Number i; cmsFormatter fr; switch (dwFlags) { case CMS_PACK_FLAGS_16BITS: { for (i=0; i < sizeof(InputFormatters16) / sizeof(cmsFormatters16); i++) { cmsFormatters16* f = InputFormatters16 + i; if ((dwInput & ~f ->Mask) == f ->Type) { fr.Fmt16 = f ->Frm; return fr; } } } break; case CMS_PACK_FLAGS_FLOAT: { for (i=0; i < sizeof(InputFormattersFloat) / sizeof(cmsFormattersFloat); i++) { cmsFormattersFloat* f = InputFormattersFloat + i; if ((dwInput & ~f ->Mask) == f ->Type) { fr.FmtFloat = f ->Frm; return fr; } } } break; default:; } fr.Fmt16 = NULL; return fr; } static cmsFormatters16 OutputFormatters16[] = { // Type Mask Function // ---------------------------- ------------------------------------ ---------------------------- { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFrom16}, { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFrom16}, { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFrom16}, { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFrom16}, { FLOAT_SH(1)|BYTES_SH(0), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackDoubleFrom16}, { FLOAT_SH(1)|BYTES_SH(4), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackFloatFrom16}, #ifndef CMS_NO_HALF_SUPPORT { FLOAT_SH(1)|BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackHalfFrom16}, #endif { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Pack1Byte}, { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack1ByteSkip1}, { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1ByteSkip1SwapFirst}, { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack1ByteReversed}, { TYPE_LabV2_8, 0, PackLabV2_8 }, { TYPE_ALabV2_8, 0, PackALabV2_8 }, { TYPE_LabV2_16, 0, PackLabV2_16 }, { CHANNELS_SH(3)|BYTES_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesOptimized}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1Optimized}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapFirstOptimized}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapSwapFirstOptimized}, { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapOptimized}, { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesSwapOptimized}, { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Pack3Bytes}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapFirst}, { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapSwapFirst}, { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1Swap}, { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3BytesSwap}, { CHANNELS_SH(6)|BYTES_SH(1), ANYSPACE, Pack6Bytes}, { CHANNELS_SH(6)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack6BytesSwap}, { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Pack4Bytes}, { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack4BytesReverse}, { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapFirst}, { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack4BytesSwap}, { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapSwapFirst}, { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackAnyBytes}, { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarBytes}, { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Pack1Word}, { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack1WordSkip1}, { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1WordSkip1SwapFirst}, { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack1WordReversed}, { CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack1WordBigEndian}, { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Pack3Words}, { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack3WordsSwap}, { CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack3WordsBigEndian}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack3WordsAndSkip1}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3WordsAndSkip1Swap}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3WordsAndSkip1SwapFirst}, { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3WordsAndSkip1SwapSwapFirst}, { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Pack4Words}, { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack4WordsReverse}, { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack4WordsSwap}, { CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack4WordsBigEndian}, { CHANNELS_SH(6)|BYTES_SH(2), ANYSPACE, Pack6Words}, { CHANNELS_SH(6)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack6WordsSwap}, { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYENDIAN|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarWords}, { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackAnyWords} }; static cmsFormattersFloat OutputFormattersFloat[] = { // Type Mask Function // ---------------------------- --------------------------------------------------- ---------------------------- { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFromFloat}, { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFromFloat}, { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFromFloat}, { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFromFloat}, { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR| ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackFloatsFromFloat }, { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR| ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackDoublesFromFloat }, #ifndef CMS_NO_HALF_SUPPORT { FLOAT_SH(1)|BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackHalfFromFloat }, #endif }; // Bit fields set to one in the mask are not compared static cmsFormatter _cmsGetStockOutputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags) { cmsUInt32Number i; cmsFormatter fr; switch (dwFlags) { case CMS_PACK_FLAGS_16BITS: { for (i=0; i < sizeof(OutputFormatters16) / sizeof(cmsFormatters16); i++) { cmsFormatters16* f = OutputFormatters16 + i; if ((dwInput & ~f ->Mask) == f ->Type) { fr.Fmt16 = f ->Frm; return fr; } } } break; case CMS_PACK_FLAGS_FLOAT: { for (i=0; i < sizeof(OutputFormattersFloat) / sizeof(cmsFormattersFloat); i++) { cmsFormattersFloat* f = OutputFormattersFloat + i; if ((dwInput & ~f ->Mask) == f ->Type) { fr.FmtFloat = f ->Frm; return fr; } } } break; default:; } fr.Fmt16 = NULL; return fr; } typedef struct _cms_formatters_factory_list { cmsFormatterFactory Factory; struct _cms_formatters_factory_list *Next; } cmsFormattersFactoryList; _cmsFormattersPluginChunkType _cmsFormattersPluginChunk = { NULL }; // Duplicates the zone of memory used by the plug-in in the new context static void DupFormatterFactoryList(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsFormattersPluginChunkType newHead = { NULL }; cmsFormattersFactoryList* entry; cmsFormattersFactoryList* Anterior = NULL; _cmsFormattersPluginChunkType* head = (_cmsFormattersPluginChunkType*) src->chunks[FormattersPlugin]; _cmsAssert(head != NULL); // Walk the list copying all nodes for (entry = head->FactoryList; entry != NULL; entry = entry ->Next) { cmsFormattersFactoryList *newEntry = ( cmsFormattersFactoryList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsFormattersFactoryList)); if (newEntry == NULL) return; // We want to keep the linked list order, so this is a little bit tricky newEntry -> Next = NULL; if (Anterior) Anterior -> Next = newEntry; Anterior = newEntry; if (newHead.FactoryList == NULL) newHead.FactoryList = newEntry; } ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsFormattersPluginChunkType)); } // The interpolation plug-in memory chunk allocator/dup void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) { _cmsAssert(ctx != NULL); if (src != NULL) { // Duplicate the LIST DupFormatterFactoryList(ctx, src); } else { static _cmsFormattersPluginChunkType FormattersPluginChunk = { NULL }; ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx ->MemPool, &FormattersPluginChunk, sizeof(_cmsFormattersPluginChunkType)); } } // Formatters management cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Data) { _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin); cmsPluginFormatters* Plugin = (cmsPluginFormatters*) Data; cmsFormattersFactoryList* fl ; // Reset to built-in defaults if (Data == NULL) { ctx ->FactoryList = NULL; return TRUE; } fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(ContextID, sizeof(cmsFormattersFactoryList)); if (fl == NULL) return FALSE; fl ->Factory = Plugin ->FormattersFactory; fl ->Next = ctx -> FactoryList; ctx ->FactoryList = fl; return TRUE; } cmsFormatter _cmsGetFormatter(cmsContext ContextID, cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 cmsFormatterDirection Dir, cmsUInt32Number dwFlags) { _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin); cmsFormattersFactoryList* f; for (f =ctx->FactoryList; f != NULL; f = f ->Next) { cmsFormatter fn = f ->Factory(Type, Dir, dwFlags); if (fn.Fmt16 != NULL) return fn; } // Revert to default if (Dir == cmsFormatterInput) return _cmsGetStockInputFormatter(Type, dwFlags); else return _cmsGetStockOutputFormatter(Type, dwFlags); } // Return whatever given formatter refers to float values cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type) { return T_FLOAT(Type) ? TRUE : FALSE; } // Return whatever given formatter refers to 8 bits cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type) { int Bytes = T_BYTES(Type); return (Bytes == 1); } // Build a suitable formatter for the colorspace of this profile cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat) { cmsColorSpaceSignature ColorSpace = cmsGetColorSpace(hProfile); cmsUInt32Number ColorSpaceBits = _cmsLCMScolorSpace(ColorSpace); cmsUInt32Number nOutputChans = cmsChannelsOf(ColorSpace); cmsUInt32Number Float = lIsFloat ? 1 : 0; // Create a fake formatter for result return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans); } // Build a suitable formatter for the colorspace of this profile cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat) { cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile); int ColorSpaceBits = _cmsLCMScolorSpace(ColorSpace); cmsUInt32Number nOutputChans = cmsChannelsOf(ColorSpace); cmsUInt32Number Float = lIsFloat ? 1 : 0; // Create a fake formatter for result return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans); } lcms2-2.6/src/cmscam02.c0000644002406300000240000003320112311617072014265 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // CIECAM 02 appearance model. Many thanks to Jordi Vilar for the debugging. // ---------- Implementation -------------------------------------------- typedef struct { cmsFloat64Number XYZ[3]; cmsFloat64Number RGB[3]; cmsFloat64Number RGBc[3]; cmsFloat64Number RGBp[3]; cmsFloat64Number RGBpa[3]; cmsFloat64Number a, b, h, e, H, A, J, Q, s, t, C, M; cmsFloat64Number abC[2]; cmsFloat64Number abs[2]; cmsFloat64Number abM[2]; } CAM02COLOR; typedef struct { CAM02COLOR adoptedWhite; cmsFloat64Number LA, Yb; cmsFloat64Number F, c, Nc; cmsUInt32Number surround; cmsFloat64Number n, Nbb, Ncb, z, FL, D; cmsContext ContextID; } cmsCIECAM02; static cmsFloat64Number compute_n(cmsCIECAM02* pMod) { return (pMod -> Yb / pMod -> adoptedWhite.XYZ[1]); } static cmsFloat64Number compute_z(cmsCIECAM02* pMod) { return (1.48 + pow(pMod -> n, 0.5)); } static cmsFloat64Number computeNbb(cmsCIECAM02* pMod) { return (0.725 * pow((1.0 / pMod -> n), 0.2)); } static cmsFloat64Number computeFL(cmsCIECAM02* pMod) { cmsFloat64Number k, FL; k = 1.0 / ((5.0 * pMod->LA) + 1.0); FL = 0.2 * pow(k, 4.0) * (5.0 * pMod->LA) + 0.1 * (pow((1.0 - pow(k, 4.0)), 2.0)) * (pow((5.0 * pMod->LA), (1.0 / 3.0))); return FL; } static cmsFloat64Number computeD(cmsCIECAM02* pMod) { cmsFloat64Number D; D = pMod->F - (1.0/3.6)*(exp(((-pMod ->LA-42) / 92.0))); return D; } static CAM02COLOR XYZtoCAT02(CAM02COLOR clr) { clr.RGB[0] = (clr.XYZ[0] * 0.7328) + (clr.XYZ[1] * 0.4296) + (clr.XYZ[2] * -0.1624); clr.RGB[1] = (clr.XYZ[0] * -0.7036) + (clr.XYZ[1] * 1.6975) + (clr.XYZ[2] * 0.0061); clr.RGB[2] = (clr.XYZ[0] * 0.0030) + (clr.XYZ[1] * 0.0136) + (clr.XYZ[2] * 0.9834); return clr; } static CAM02COLOR ChromaticAdaptation(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsUInt32Number i; for (i = 0; i < 3; i++) { clr.RGBc[i] = ((pMod -> adoptedWhite.XYZ[1] * (pMod->D / pMod -> adoptedWhite.RGB[i])) + (1.0 - pMod->D)) * clr.RGB[i]; } return clr; } static CAM02COLOR CAT02toHPE(CAM02COLOR clr) { cmsFloat64Number M[9]; M[0] =(( 0.38971 * 1.096124) + (0.68898 * 0.454369) + (-0.07868 * -0.009628)); M[1] =(( 0.38971 * -0.278869) + (0.68898 * 0.473533) + (-0.07868 * -0.005698)); M[2] =(( 0.38971 * 0.182745) + (0.68898 * 0.072098) + (-0.07868 * 1.015326)); M[3] =((-0.22981 * 1.096124) + (1.18340 * 0.454369) + ( 0.04641 * -0.009628)); M[4] =((-0.22981 * -0.278869) + (1.18340 * 0.473533) + ( 0.04641 * -0.005698)); M[5] =((-0.22981 * 0.182745) + (1.18340 * 0.072098) + ( 0.04641 * 1.015326)); M[6] =(-0.009628); M[7] =(-0.005698); M[8] =( 1.015326); clr.RGBp[0] = (clr.RGBc[0] * M[0]) + (clr.RGBc[1] * M[1]) + (clr.RGBc[2] * M[2]); clr.RGBp[1] = (clr.RGBc[0] * M[3]) + (clr.RGBc[1] * M[4]) + (clr.RGBc[2] * M[5]); clr.RGBp[2] = (clr.RGBc[0] * M[6]) + (clr.RGBc[1] * M[7]) + (clr.RGBc[2] * M[8]); return clr; } static CAM02COLOR NonlinearCompression(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsUInt32Number i; cmsFloat64Number temp; for (i = 0; i < 3; i++) { if (clr.RGBp[i] < 0) { temp = pow((-1.0 * pMod->FL * clr.RGBp[i] / 100.0), 0.42); clr.RGBpa[i] = (-1.0 * 400.0 * temp) / (temp + 27.13) + 0.1; } else { temp = pow((pMod->FL * clr.RGBp[i] / 100.0), 0.42); clr.RGBpa[i] = (400.0 * temp) / (temp + 27.13) + 0.1; } } clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] + (clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb; return clr; } static CAM02COLOR ComputeCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsFloat64Number a, b, temp, e, t, r2d, d2r; a = clr.RGBpa[0] - (12.0 * clr.RGBpa[1] / 11.0) + (clr.RGBpa[2] / 11.0); b = (clr.RGBpa[0] + clr.RGBpa[1] - (2.0 * clr.RGBpa[2])) / 9.0; r2d = (180.0 / 3.141592654); if (a == 0) { if (b == 0) clr.h = 0; else if (b > 0) clr.h = 90; else clr.h = 270; } else if (a > 0) { temp = b / a; if (b > 0) clr.h = (r2d * atan(temp)); else if (b == 0) clr.h = 0; else clr.h = (r2d * atan(temp)) + 360; } else { temp = b / a; clr.h = (r2d * atan(temp)) + 180; } d2r = (3.141592654 / 180.0); e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) * (cos((clr.h * d2r + 2.0)) + 3.8); if (clr.h < 20.14) { temp = ((clr.h + 122.47)/1.2) + ((20.14 - clr.h)/0.8); clr.H = 300 + (100*((clr.h + 122.47)/1.2)) / temp; } else if (clr.h < 90.0) { temp = ((clr.h - 20.14)/0.8) + ((90.00 - clr.h)/0.7); clr.H = (100*((clr.h - 20.14)/0.8)) / temp; } else if (clr.h < 164.25) { temp = ((clr.h - 90.00)/0.7) + ((164.25 - clr.h)/1.0); clr.H = 100 + ((100*((clr.h - 90.00)/0.7)) / temp); } else if (clr.h < 237.53) { temp = ((clr.h - 164.25)/1.0) + ((237.53 - clr.h)/1.2); clr.H = 200 + ((100*((clr.h - 164.25)/1.0)) / temp); } else { temp = ((clr.h - 237.53)/1.2) + ((360 - clr.h + 20.14)/0.8); clr.H = 300 + ((100*((clr.h - 237.53)/1.2)) / temp); } clr.J = 100.0 * pow((clr.A / pMod->adoptedWhite.A), (pMod->c * pMod->z)); clr.Q = (4.0 / pMod->c) * pow((clr.J / 100.0), 0.5) * (pMod->adoptedWhite.A + 4.0) * pow(pMod->FL, 0.25); t = (e * pow(((a * a) + (b * b)), 0.5)) / (clr.RGBpa[0] + clr.RGBpa[1] + ((21.0 / 20.0) * clr.RGBpa[2])); clr.C = pow(t, 0.9) * pow((clr.J / 100.0), 0.5) * pow((1.64 - pow(0.29, pMod->n)), 0.73); clr.M = clr.C * pow(pMod->FL, 0.25); clr.s = 100.0 * pow((clr.M / clr.Q), 0.5); return clr; } static CAM02COLOR InverseCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsFloat64Number t, e, p1, p2, p3, p4, p5, hr, d2r; d2r = 3.141592654 / 180.0; t = pow( (clr.C / (pow((clr.J / 100.0), 0.5) * (pow((1.64 - pow(0.29, pMod->n)), 0.73)))), (1.0 / 0.9) ); e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) * (cos((clr.h * d2r + 2.0)) + 3.8); clr.A = pMod->adoptedWhite.A * pow( (clr.J / 100.0), (1.0 / (pMod->c * pMod->z))); p1 = e / t; p2 = (clr.A / pMod->Nbb) + 0.305; p3 = 21.0 / 20.0; hr = clr.h * d2r; if (fabs(sin(hr)) >= fabs(cos(hr))) { p4 = p1 / sin(hr); clr.b = (p2 * (2.0 + p3) * (460.0 / 1403.0)) / (p4 + (2.0 + p3) * (220.0 / 1403.0) * (cos(hr) / sin(hr)) - (27.0 / 1403.0) + p3 * (6300.0 / 1403.0)); clr.a = clr.b * (cos(hr) / sin(hr)); } else { p5 = p1 / cos(hr); clr.a = (p2 * (2.0 + p3) * (460.0 / 1403.0)) / (p5 + (2.0 + p3) * (220.0 / 1403.0) - ((27.0 / 1403.0) - p3 * (6300.0 / 1403.0)) * (sin(hr) / cos(hr))); clr.b = clr.a * (sin(hr) / cos(hr)); } clr.RGBpa[0] = ((460.0 / 1403.0) * p2) + ((451.0 / 1403.0) * clr.a) + ((288.0 / 1403.0) * clr.b); clr.RGBpa[1] = ((460.0 / 1403.0) * p2) - ((891.0 / 1403.0) * clr.a) - ((261.0 / 1403.0) * clr.b); clr.RGBpa[2] = ((460.0 / 1403.0) * p2) - ((220.0 / 1403.0) * clr.a) - ((6300.0 / 1403.0) * clr.b); return clr; } static CAM02COLOR InverseNonlinearity(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsUInt32Number i; cmsFloat64Number c1; for (i = 0; i < 3; i++) { if ((clr.RGBpa[i] - 0.1) < 0) c1 = -1; else c1 = 1; clr.RGBp[i] = c1 * (100.0 / pMod->FL) * pow(((27.13 * fabs(clr.RGBpa[i] - 0.1)) / (400.0 - fabs(clr.RGBpa[i] - 0.1))), (1.0 / 0.42)); } return clr; } static CAM02COLOR HPEtoCAT02(CAM02COLOR clr) { cmsFloat64Number M[9]; M[0] = (( 0.7328 * 1.910197) + (0.4296 * 0.370950)); M[1] = (( 0.7328 * -1.112124) + (0.4296 * 0.629054)); M[2] = (( 0.7328 * 0.201908) + (0.4296 * 0.000008) - 0.1624); M[3] = ((-0.7036 * 1.910197) + (1.6975 * 0.370950)); M[4] = ((-0.7036 * -1.112124) + (1.6975 * 0.629054)); M[5] = ((-0.7036 * 0.201908) + (1.6975 * 0.000008) + 0.0061); M[6] = (( 0.0030 * 1.910197) + (0.0136 * 0.370950)); M[7] = (( 0.0030 * -1.112124) + (0.0136 * 0.629054)); M[8] = (( 0.0030 * 0.201908) + (0.0136 * 0.000008) + 0.9834);; clr.RGBc[0] = (clr.RGBp[0] * M[0]) + (clr.RGBp[1] * M[1]) + (clr.RGBp[2] * M[2]); clr.RGBc[1] = (clr.RGBp[0] * M[3]) + (clr.RGBp[1] * M[4]) + (clr.RGBp[2] * M[5]); clr.RGBc[2] = (clr.RGBp[0] * M[6]) + (clr.RGBp[1] * M[7]) + (clr.RGBp[2] * M[8]); return clr; } static CAM02COLOR InverseChromaticAdaptation(CAM02COLOR clr, cmsCIECAM02* pMod) { cmsUInt32Number i; for (i = 0; i < 3; i++) { clr.RGB[i] = clr.RGBc[i] / ((pMod->adoptedWhite.XYZ[1] * pMod->D / pMod->adoptedWhite.RGB[i]) + 1.0 - pMod->D); } return clr; } static CAM02COLOR CAT02toXYZ(CAM02COLOR clr) { clr.XYZ[0] = (clr.RGB[0] * 1.096124) + (clr.RGB[1] * -0.278869) + (clr.RGB[2] * 0.182745); clr.XYZ[1] = (clr.RGB[0] * 0.454369) + (clr.RGB[1] * 0.473533) + (clr.RGB[2] * 0.072098); clr.XYZ[2] = (clr.RGB[0] * -0.009628) + (clr.RGB[1] * -0.005698) + (clr.RGB[2] * 1.015326); return clr; } cmsHANDLE CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC) { cmsCIECAM02* lpMod; _cmsAssert(pVC != NULL); if((lpMod = (cmsCIECAM02*) _cmsMallocZero(ContextID, sizeof(cmsCIECAM02))) == NULL) { return NULL; } lpMod ->ContextID = ContextID; lpMod ->adoptedWhite.XYZ[0] = pVC ->whitePoint.X; lpMod ->adoptedWhite.XYZ[1] = pVC ->whitePoint.Y; lpMod ->adoptedWhite.XYZ[2] = pVC ->whitePoint.Z; lpMod -> LA = pVC ->La; lpMod -> Yb = pVC ->Yb; lpMod -> D = pVC ->D_value; lpMod -> surround = pVC ->surround; switch (lpMod -> surround) { case CUTSHEET_SURROUND: lpMod->F = 0.8; lpMod->c = 0.41; lpMod->Nc = 0.8; break; case DARK_SURROUND: lpMod -> F = 0.8; lpMod -> c = 0.525; lpMod -> Nc = 0.8; break; case DIM_SURROUND: lpMod -> F = 0.9; lpMod -> c = 0.59; lpMod -> Nc = 0.95; break; default: // Average surround lpMod -> F = 1.0; lpMod -> c = 0.69; lpMod -> Nc = 1.0; } lpMod -> n = compute_n(lpMod); lpMod -> z = compute_z(lpMod); lpMod -> Nbb = computeNbb(lpMod); lpMod -> FL = computeFL(lpMod); if (lpMod -> D == D_CALCULATE) { lpMod -> D = computeD(lpMod); } lpMod -> Ncb = lpMod -> Nbb; lpMod -> adoptedWhite = XYZtoCAT02(lpMod -> adoptedWhite); lpMod -> adoptedWhite = ChromaticAdaptation(lpMod -> adoptedWhite, lpMod); lpMod -> adoptedWhite = CAT02toHPE(lpMod -> adoptedWhite); lpMod -> adoptedWhite = NonlinearCompression(lpMod -> adoptedWhite, lpMod); return (cmsHANDLE) lpMod; } void CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel) { cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel; if (lpMod) _cmsFree(lpMod ->ContextID, lpMod); } void CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut) { CAM02COLOR clr; cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel; _cmsAssert(lpMod != NULL); _cmsAssert(pIn != NULL); _cmsAssert(pOut != NULL); memset(&clr, 0, sizeof(clr)); clr.XYZ[0] = pIn ->X; clr.XYZ[1] = pIn ->Y; clr.XYZ[2] = pIn ->Z; clr = XYZtoCAT02(clr); clr = ChromaticAdaptation(clr, lpMod); clr = CAT02toHPE(clr); clr = NonlinearCompression(clr, lpMod); clr = ComputeCorrelates(clr, lpMod); pOut ->J = clr.J; pOut ->C = clr.C; pOut ->h = clr.h; } void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ* pOut) { CAM02COLOR clr; cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel; _cmsAssert(lpMod != NULL); _cmsAssert(pIn != NULL); _cmsAssert(pOut != NULL); memset(&clr, 0, sizeof(clr)); clr.J = pIn -> J; clr.C = pIn -> C; clr.h = pIn -> h; clr = InverseCorrelates(clr, lpMod); clr = InverseNonlinearity(clr, lpMod); clr = HPEtoCAT02(clr); clr = InverseChromaticAdaptation(clr, lpMod); clr = CAT02toXYZ(clr); pOut ->X = clr.XYZ[0]; pOut ->Y = clr.XYZ[1]; pOut ->Z = clr.XYZ[2]; } lcms2-2.6/src/Makefile.am0000644002406300000240000000160412311617072014552 0ustar mariamausers# # Makefile for building lcms 2 library # # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign # CFLAGS = -pedantic -Wall -std=c99 -O3 includedir = ${prefix}/include # Shared libraries built in this directory lib_LTLIBRARIES = liblcms2.la LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBRARY_AGE = @LIBRARY_AGE@ INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include liblcms2_la_LDFLAGS = -no-undefined \ -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) liblcms2_la_LIBADD = $(LCMS_LIB_DEPLIBS) liblcms2_la_SOURCES = \ cmscnvrt.c cmserr.c cmsgamma.c cmsgmt.c cmsintrp.c cmsio0.c cmsio1.c cmslut.c \ cmsplugin.c cmssm.c cmsmd5.c cmsmtrx.c cmspack.c cmspcs.c cmswtpnt.c cmsxform.c \ cmssamp.c cmsnamed.c cmscam02.c cmsvirt.c cmstypes.c cmscgats.c cmsps2.c cmsopt.c \ cmshalf.c lcms2_internal.h lcms2-2.6/src/cmsio0.c0000644002406300000240000015563112311617072014066 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Generic I/O, tag dictionary management, profile struct // IOhandlers are abstractions used by littleCMS to read from whatever file, stream, // memory block or any storage. Each IOhandler provides implementations for read, // write, seek and tell functions. LittleCMS code deals with IO across those objects. // In this way, is easier to add support for new storage media. // NULL stream, for taking care of used space ------------------------------------- // NULL IOhandler basically does nothing but keep track on how many bytes have been // written. This is handy when creating profiles, where the file size is needed in the // header. Then, whole profile is serialized across NULL IOhandler and a second pass // writes the bytes to the pertinent IOhandler. typedef struct { cmsUInt32Number Pointer; // Points to current location } FILENULL; static cmsUInt32Number NULLRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count) { FILENULL* ResData = (FILENULL*) iohandler ->stream; cmsUInt32Number len = size * count; ResData -> Pointer += len; return count; cmsUNUSED_PARAMETER(Buffer); } static cmsBool NULLSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset) { FILENULL* ResData = (FILENULL*) iohandler ->stream; ResData ->Pointer = offset; return TRUE; } static cmsUInt32Number NULLTell(cmsIOHANDLER* iohandler) { FILENULL* ResData = (FILENULL*) iohandler ->stream; return ResData -> Pointer; } static cmsBool NULLWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void *Ptr) { FILENULL* ResData = (FILENULL*) iohandler ->stream; ResData ->Pointer += size; if (ResData ->Pointer > iohandler->UsedSpace) iohandler->UsedSpace = ResData ->Pointer; return TRUE; cmsUNUSED_PARAMETER(Ptr); } static cmsBool NULLClose(cmsIOHANDLER* iohandler) { FILENULL* ResData = (FILENULL*) iohandler ->stream; _cmsFree(iohandler ->ContextID, ResData); _cmsFree(iohandler ->ContextID, iohandler); return TRUE; } // The NULL IOhandler creator cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID) { struct _cms_io_handler* iohandler = NULL; FILENULL* fm = NULL; iohandler = (struct _cms_io_handler*) _cmsMallocZero(ContextID, sizeof(struct _cms_io_handler)); if (iohandler == NULL) return NULL; fm = (FILENULL*) _cmsMallocZero(ContextID, sizeof(FILENULL)); if (fm == NULL) goto Error; fm ->Pointer = 0; iohandler ->ContextID = ContextID; iohandler ->stream = (void*) fm; iohandler ->UsedSpace = 0; iohandler ->ReportedSize = 0; iohandler ->PhysicalFile[0] = 0; iohandler ->Read = NULLRead; iohandler ->Seek = NULLSeek; iohandler ->Close = NULLClose; iohandler ->Tell = NULLTell; iohandler ->Write = NULLWrite; return iohandler; Error: if (iohandler) _cmsFree(ContextID, iohandler); return NULL; } // Memory-based stream -------------------------------------------------------------- // Those functions implements an iohandler which takes a block of memory as storage medium. typedef struct { cmsUInt8Number* Block; // Points to allocated memory cmsUInt32Number Size; // Size of allocated memory cmsUInt32Number Pointer; // Points to current location int FreeBlockOnClose; // As title } FILEMEM; static cmsUInt32Number MemoryRead(struct _cms_io_handler* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count) { FILEMEM* ResData = (FILEMEM*) iohandler ->stream; cmsUInt8Number* Ptr; cmsUInt32Number len = size * count; if (ResData -> Pointer + len > ResData -> Size){ len = (ResData -> Size - ResData -> Pointer); cmsSignalError(iohandler ->ContextID, cmsERROR_READ, "Read from memory error. Got %d bytes, block should be of %d bytes", len, count * size); return 0; } Ptr = ResData -> Block; Ptr += ResData -> Pointer; memmove(Buffer, Ptr, len); ResData -> Pointer += len; return count; } // SEEK_CUR is assumed static cmsBool MemorySeek(struct _cms_io_handler* iohandler, cmsUInt32Number offset) { FILEMEM* ResData = (FILEMEM*) iohandler ->stream; if (offset > ResData ->Size) { cmsSignalError(iohandler ->ContextID, cmsERROR_SEEK, "Too few data; probably corrupted profile"); return FALSE; } ResData ->Pointer = offset; return TRUE; } // Tell for memory static cmsUInt32Number MemoryTell(struct _cms_io_handler* iohandler) { FILEMEM* ResData = (FILEMEM*) iohandler ->stream; if (ResData == NULL) return 0; return ResData -> Pointer; } // Writes data to memory, also keeps used space for further reference. static cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr) { FILEMEM* ResData = (FILEMEM*) iohandler ->stream; if (ResData == NULL) return FALSE; // Housekeeping // Check for available space. Clip. if (ResData->Pointer + size > ResData->Size) { size = ResData ->Size - ResData->Pointer; } if (size == 0) return TRUE; // Write zero bytes is ok, but does nothing memmove(ResData ->Block + ResData ->Pointer, Ptr, size); ResData ->Pointer += size; if (ResData ->Pointer > iohandler->UsedSpace) iohandler->UsedSpace = ResData ->Pointer; return TRUE; } static cmsBool MemoryClose(struct _cms_io_handler* iohandler) { FILEMEM* ResData = (FILEMEM*) iohandler ->stream; if (ResData ->FreeBlockOnClose) { if (ResData ->Block) _cmsFree(iohandler ->ContextID, ResData ->Block); } _cmsFree(iohandler ->ContextID, ResData); _cmsFree(iohandler ->ContextID, iohandler); return TRUE; } // Create a iohandler for memory block. AccessMode=='r' assumes the iohandler is going to read, and makes // a copy of the memory block for letting user to free the memory after invoking open profile. In write // mode ("w"), Buffere points to the begin of memory block to be written. cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode) { cmsIOHANDLER* iohandler = NULL; FILEMEM* fm = NULL; _cmsAssert(AccessMode != NULL); iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER)); if (iohandler == NULL) return NULL; switch (*AccessMode) { case 'r': fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM)); if (fm == NULL) goto Error; if (Buffer == NULL) { cmsSignalError(ContextID, cmsERROR_READ, "Couldn't read profile from NULL pointer"); goto Error; } fm ->Block = (cmsUInt8Number*) _cmsMalloc(ContextID, size); if (fm ->Block == NULL) { _cmsFree(ContextID, fm); _cmsFree(ContextID, iohandler); cmsSignalError(ContextID, cmsERROR_READ, "Couldn't allocate %ld bytes for profile", size); return NULL; } memmove(fm->Block, Buffer, size); fm ->FreeBlockOnClose = TRUE; fm ->Size = size; fm ->Pointer = 0; iohandler -> ReportedSize = size; break; case 'w': fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM)); if (fm == NULL) goto Error; fm ->Block = (cmsUInt8Number*) Buffer; fm ->FreeBlockOnClose = FALSE; fm ->Size = size; fm ->Pointer = 0; iohandler -> ReportedSize = 0; break; default: cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown access mode '%c'", *AccessMode); return NULL; } iohandler ->ContextID = ContextID; iohandler ->stream = (void*) fm; iohandler ->UsedSpace = 0; iohandler ->PhysicalFile[0] = 0; iohandler ->Read = MemoryRead; iohandler ->Seek = MemorySeek; iohandler ->Close = MemoryClose; iohandler ->Tell = MemoryTell; iohandler ->Write = MemoryWrite; return iohandler; Error: if (fm) _cmsFree(ContextID, fm); if (iohandler) _cmsFree(ContextID, iohandler); return NULL; } // File-based stream ------------------------------------------------------- // Read count elements of size bytes each. Return number of elements read static cmsUInt32Number FileRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count) { cmsUInt32Number nReaded = (cmsUInt32Number) fread(Buffer, size, count, (FILE*) iohandler->stream); if (nReaded != count) { cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size); return 0; } return nReaded; } // Postion file pointer in the file static cmsBool FileSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset) { if (fseek((FILE*) iohandler ->stream, (long) offset, SEEK_SET) != 0) { cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, "Seek error; probably corrupted file"); return FALSE; } return TRUE; } // Returns file pointer position static cmsUInt32Number FileTell(cmsIOHANDLER* iohandler) { return (cmsUInt32Number) ftell((FILE*)iohandler ->stream); } // Writes data to stream, also keeps used space for further reference. Returns TRUE on success, FALSE on error static cmsBool FileWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void* Buffer) { if (size == 0) return TRUE; // We allow to write 0 bytes, but nothing is written iohandler->UsedSpace += size; return (fwrite(Buffer, size, 1, (FILE*) iohandler->stream) == 1); } // Closes the file static cmsBool FileClose(cmsIOHANDLER* iohandler) { if (fclose((FILE*) iohandler ->stream) != 0) return FALSE; _cmsFree(iohandler ->ContextID, iohandler); return TRUE; } // Create a iohandler for disk based files. cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode) { cmsIOHANDLER* iohandler = NULL; FILE* fm = NULL; _cmsAssert(FileName != NULL); _cmsAssert(AccessMode != NULL); iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER)); if (iohandler == NULL) return NULL; switch (*AccessMode) { case 'r': fm = fopen(FileName, "rb"); if (fm == NULL) { _cmsFree(ContextID, iohandler); cmsSignalError(ContextID, cmsERROR_FILE, "File '%s' not found", FileName); return NULL; } iohandler -> ReportedSize = (cmsUInt32Number) cmsfilelength(fm); break; case 'w': fm = fopen(FileName, "wb"); if (fm == NULL) { _cmsFree(ContextID, iohandler); cmsSignalError(ContextID, cmsERROR_FILE, "Couldn't create '%s'", FileName); return NULL; } iohandler -> ReportedSize = 0; break; default: _cmsFree(ContextID, iohandler); cmsSignalError(ContextID, cmsERROR_FILE, "Unknown access mode '%c'", *AccessMode); return NULL; } iohandler ->ContextID = ContextID; iohandler ->stream = (void*) fm; iohandler ->UsedSpace = 0; // Keep track of the original file strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1); iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0; iohandler ->Read = FileRead; iohandler ->Seek = FileSeek; iohandler ->Close = FileClose; iohandler ->Tell = FileTell; iohandler ->Write = FileWrite; return iohandler; } // Create a iohandler for stream based files cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream) { cmsIOHANDLER* iohandler = NULL; iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER)); if (iohandler == NULL) return NULL; iohandler -> ContextID = ContextID; iohandler -> stream = (void*) Stream; iohandler -> UsedSpace = 0; iohandler -> ReportedSize = (cmsUInt32Number) cmsfilelength(Stream); iohandler -> PhysicalFile[0] = 0; iohandler ->Read = FileRead; iohandler ->Seek = FileSeek; iohandler ->Close = FileClose; iohandler ->Tell = FileTell; iohandler ->Write = FileWrite; return iohandler; } // Close an open IO handler cmsBool CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io) { return io -> Close(io); } // ------------------------------------------------------------------------------------------------------- // Creates an empty structure holding all required parameters cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID) { time_t now = time(NULL); _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) _cmsMallocZero(ContextID, sizeof(_cmsICCPROFILE)); if (Icc == NULL) return NULL; Icc ->ContextID = ContextID; // Set it to empty Icc -> TagCount = 0; // Set default version Icc ->Version = 0x02100000; // Set creation date/time memmove(&Icc ->Created, gmtime(&now), sizeof(Icc ->Created)); // Create a mutex if the user provided proper plugin. NULL otherwise Icc ->UsrMutex = _cmsCreateMutex(ContextID); // Return the handle return (cmsHPROFILE) Icc; } cmsContext CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; if (Icc == NULL) return NULL; return Icc -> ContextID; } // Return the number of tags cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; if (Icc == NULL) return -1; return Icc->TagCount; } // Return the tag signature of a given tag number cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; if (n > Icc->TagCount) return (cmsTagSignature) 0; // Mark as not available if (n >= MAX_TABLE_TAG) return (cmsTagSignature) 0; // As double check return Icc ->TagNames[n]; } static int SearchOneTag(_cmsICCPROFILE* Profile, cmsTagSignature sig) { cmsUInt32Number i; for (i=0; i < Profile -> TagCount; i++) { if (sig == Profile -> TagNames[i]) return i; } return -1; } // Search for a specific tag in tag dictionary. Returns position or -1 if tag not found. // If followlinks is turned on, then the position of the linked tag is returned int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks) { int n; cmsTagSignature LinkedSig; do { // Search for given tag in ICC profile directory n = SearchOneTag(Icc, sig); if (n < 0) return -1; // Not found if (!lFollowLinks) return n; // Found, don't follow links // Is this a linked tag? LinkedSig = Icc ->TagLinked[n]; // Yes, follow link if (LinkedSig != (cmsTagSignature) 0) { sig = LinkedSig; } } while (LinkedSig != (cmsTagSignature) 0); return n; } // Deletes a tag entry static void _cmsDeleteTagByPos(_cmsICCPROFILE* Icc, int i) { _cmsAssert(Icc != NULL); _cmsAssert(i >= 0); if (Icc -> TagPtrs[i] != NULL) { // Free previous version if (Icc ->TagSaveAsRaw[i]) { _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]); } else { cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i]; if (TypeHandler != NULL) { cmsTagTypeHandler LocalTypeHandler = *TypeHandler; LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameter LocalTypeHandler.ICCVersion = Icc ->Version; LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]); Icc ->TagPtrs[i] = NULL; } } } } // Creates a new tag entry static cmsBool _cmsNewTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, int* NewPos) { int i; // Search for the tag i = _cmsSearchTag(Icc, sig, FALSE); if (i >= 0) { // Already exists? delete it _cmsDeleteTagByPos(Icc, i); *NewPos = i; } else { // No, make a new one if (Icc -> TagCount >= MAX_TABLE_TAG) { cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, "Too many tags (%d)", MAX_TABLE_TAG); return FALSE; } *NewPos = Icc ->TagCount; Icc -> TagCount++; } return TRUE; } // Check existance cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) (void*) hProfile; return _cmsSearchTag(Icc, sig, FALSE) >= 0; } // Read profile header and validate it cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc) { cmsTagEntry Tag; cmsICCHeader Header; cmsUInt32Number i, j; cmsUInt32Number HeaderSize; cmsIOHANDLER* io = Icc ->IOhandler; cmsUInt32Number TagCount; // Read the header if (io -> Read(io, &Header, sizeof(cmsICCHeader), 1) != 1) { return FALSE; } // Validate file as an ICC profile if (_cmsAdjustEndianess32(Header.magic) != cmsMagicNumber) { cmsSignalError(Icc ->ContextID, cmsERROR_BAD_SIGNATURE, "not an ICC profile, invalid signature"); return FALSE; } // Adjust endianess of the used parameters Icc -> DeviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Header.deviceClass); Icc -> ColorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.colorSpace); Icc -> PCS = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.pcs); Icc -> RenderingIntent = _cmsAdjustEndianess32(Header.renderingIntent); Icc -> flags = _cmsAdjustEndianess32(Header.flags); Icc -> manufacturer = _cmsAdjustEndianess32(Header.manufacturer); Icc -> model = _cmsAdjustEndianess32(Header.model); Icc -> creator = _cmsAdjustEndianess32(Header.creator); _cmsAdjustEndianess64(&Icc -> attributes, &Header.attributes); Icc -> Version = _cmsAdjustEndianess32(Header.version); // Get size as reported in header HeaderSize = _cmsAdjustEndianess32(Header.size); // Make sure HeaderSize is lower than profile size if (HeaderSize >= Icc ->IOhandler ->ReportedSize) HeaderSize = Icc ->IOhandler ->ReportedSize; // Get creation date/time _cmsDecodeDateTimeNumber(&Header.date, &Icc ->Created); // The profile ID are 32 raw bytes memmove(Icc ->ProfileID.ID32, Header.profileID.ID32, 16); // Read tag directory if (!_cmsReadUInt32Number(io, &TagCount)) return FALSE; if (TagCount > MAX_TABLE_TAG) { cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, "Too many tags (%d)", TagCount); return FALSE; } // Read tag directory Icc -> TagCount = 0; for (i=0; i < TagCount; i++) { if (!_cmsReadUInt32Number(io, (cmsUInt32Number *) &Tag.sig)) return FALSE; if (!_cmsReadUInt32Number(io, &Tag.offset)) return FALSE; if (!_cmsReadUInt32Number(io, &Tag.size)) return FALSE; // Perform some sanity check. Offset + size should fall inside file. if (Tag.offset + Tag.size > HeaderSize || Tag.offset + Tag.size < Tag.offset) continue; Icc -> TagNames[Icc ->TagCount] = Tag.sig; Icc -> TagOffsets[Icc ->TagCount] = Tag.offset; Icc -> TagSizes[Icc ->TagCount] = Tag.size; // Search for links for (j=0; j < Icc ->TagCount; j++) { if ((Icc ->TagOffsets[j] == Tag.offset) && (Icc ->TagSizes[j] == Tag.size)) { Icc ->TagLinked[Icc ->TagCount] = Icc ->TagNames[j]; } } Icc ->TagCount++; } return TRUE; } // Saves profile header cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace) { cmsICCHeader Header; cmsUInt32Number i; cmsTagEntry Tag; cmsInt32Number Count = 0; Header.size = _cmsAdjustEndianess32(UsedSpace); Header.cmmId = _cmsAdjustEndianess32(lcmsSignature); Header.version = _cmsAdjustEndianess32(Icc ->Version); Header.deviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Icc -> DeviceClass); Header.colorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> ColorSpace); Header.pcs = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> PCS); // NOTE: in v4 Timestamp must be in UTC rather than in local time _cmsEncodeDateTimeNumber(&Header.date, &Icc ->Created); Header.magic = _cmsAdjustEndianess32(cmsMagicNumber); #ifdef CMS_IS_WINDOWS_ Header.platform = (cmsPlatformSignature) _cmsAdjustEndianess32(cmsSigMicrosoft); #else Header.platform = (cmsPlatformSignature) _cmsAdjustEndianess32(cmsSigMacintosh); #endif Header.flags = _cmsAdjustEndianess32(Icc -> flags); Header.manufacturer = _cmsAdjustEndianess32(Icc -> manufacturer); Header.model = _cmsAdjustEndianess32(Icc -> model); _cmsAdjustEndianess64(&Header.attributes, &Icc -> attributes); // Rendering intent in the header (for embedded profiles) Header.renderingIntent = _cmsAdjustEndianess32(Icc -> RenderingIntent); // Illuminant is always D50 Header.illuminant.X = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->X)); Header.illuminant.Y = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->Y)); Header.illuminant.Z = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->Z)); // Created by LittleCMS (that's me!) Header.creator = _cmsAdjustEndianess32(lcmsSignature); memset(&Header.reserved, 0, sizeof(Header.reserved)); // Set profile ID. Endianess is always big endian memmove(&Header.profileID, &Icc ->ProfileID, 16); // Dump the header if (!Icc -> IOhandler->Write(Icc->IOhandler, sizeof(cmsICCHeader), &Header)) return FALSE; // Saves Tag directory // Get true count for (i=0; i < Icc -> TagCount; i++) { if (Icc ->TagNames[i] != 0) Count++; } // Store number of tags if (!_cmsWriteUInt32Number(Icc ->IOhandler, Count)) return FALSE; for (i=0; i < Icc -> TagCount; i++) { if (Icc ->TagNames[i] == 0) continue; // It is just a placeholder Tag.sig = (cmsTagSignature) _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagNames[i]); Tag.offset = _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagOffsets[i]); Tag.size = _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagSizes[i]); if (!Icc ->IOhandler -> Write(Icc-> IOhandler, sizeof(cmsTagEntry), &Tag)) return FALSE; } return TRUE; } // ----------------------------------------------------------------------- Set/Get several struct members cmsUInt32Number CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc -> RenderingIntent; } void CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> RenderingIntent = RenderingIntent; } cmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return (cmsUInt32Number) Icc -> flags; } void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> flags = (cmsUInt32Number) Flags; } cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc ->manufacturer; } void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> manufacturer = manufacturer; } cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc ->creator; } cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc ->model; } void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> model = model; } void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; memmove(Flags, &Icc -> attributes, sizeof(cmsUInt64Number)); } void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; memmove(&Icc -> attributes, &Flags, sizeof(cmsUInt64Number)); } void CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; memmove(ProfileID, Icc ->ProfileID.ID8, 16); } void CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; memmove(&Icc -> ProfileID, ProfileID, 16); } cmsBool CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; memmove(Dest, &Icc ->Created, sizeof(struct tm)); return TRUE; } cmsColorSpaceSignature CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc -> PCS; } void CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> PCS = pcs; } cmsColorSpaceSignature CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc -> ColorSpace; } void CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> ColorSpace = sig; } cmsProfileClassSignature CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc -> DeviceClass; } void CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> DeviceClass = sig; } cmsUInt32Number CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; return Icc -> Version; } void CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; Icc -> Version = Version; } // Get an hexadecimal number with same digits as v static cmsUInt32Number BaseToBase(cmsUInt32Number in, int BaseIn, int BaseOut) { char Buff[100]; int i, len; cmsUInt32Number out; for (len=0; in > 0 && len < 100; len++) { Buff[len] = (char) (in % BaseIn); in /= BaseIn; } for (i=len-1, out=0; i >= 0; --i) { out = out * BaseOut + Buff[i]; } return out; } void CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; // 4.2 -> 0x4200000 Icc -> Version = BaseToBase((cmsUInt32Number) floor(Version * 100.0 + 0.5), 10, 16) << 16; } cmsFloat64Number CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; cmsUInt32Number n = Icc -> Version >> 16; return BaseToBase(n, 16, 10) / 100.0; } // -------------------------------------------------------------------------------------------------------------- // Create profile from IOhandler cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io) { _cmsICCPROFILE* NewIcc; cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); if (hEmpty == NULL) return NULL; NewIcc = (_cmsICCPROFILE*) hEmpty; NewIcc ->IOhandler = io; if (!_cmsReadHeader(NewIcc)) goto Error; return hEmpty; Error: cmsCloseProfile(hEmpty); return NULL; } // Create profile from IOhandler cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write) { _cmsICCPROFILE* NewIcc; cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); if (hEmpty == NULL) return NULL; NewIcc = (_cmsICCPROFILE*) hEmpty; NewIcc ->IOhandler = io; if (write) { NewIcc -> IsWrite = TRUE; return hEmpty; } if (!_cmsReadHeader(NewIcc)) goto Error; return hEmpty; Error: cmsCloseProfile(hEmpty); return NULL; } // Create profile from disk file cmsHPROFILE CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *lpFileName, const char *sAccess) { _cmsICCPROFILE* NewIcc; cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); if (hEmpty == NULL) return NULL; NewIcc = (_cmsICCPROFILE*) hEmpty; NewIcc ->IOhandler = cmsOpenIOhandlerFromFile(ContextID, lpFileName, sAccess); if (NewIcc ->IOhandler == NULL) goto Error; if (*sAccess == 'W' || *sAccess == 'w') { NewIcc -> IsWrite = TRUE; return hEmpty; } if (!_cmsReadHeader(NewIcc)) goto Error; return hEmpty; Error: cmsCloseProfile(hEmpty); return NULL; } cmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess) { return cmsOpenProfileFromFileTHR(NULL, ICCProfile, sAccess); } cmsHPROFILE CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char *sAccess) { _cmsICCPROFILE* NewIcc; cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); if (hEmpty == NULL) return NULL; NewIcc = (_cmsICCPROFILE*) hEmpty; NewIcc ->IOhandler = cmsOpenIOhandlerFromStream(ContextID, ICCProfile); if (NewIcc ->IOhandler == NULL) goto Error; if (*sAccess == 'w') { NewIcc -> IsWrite = TRUE; return hEmpty; } if (!_cmsReadHeader(NewIcc)) goto Error; return hEmpty; Error: cmsCloseProfile(hEmpty); return NULL; } cmsHPROFILE CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char *sAccess) { return cmsOpenProfileFromStreamTHR(NULL, ICCProfile, sAccess); } // Open from memory block cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void* MemPtr, cmsUInt32Number dwSize) { _cmsICCPROFILE* NewIcc; cmsHPROFILE hEmpty; hEmpty = cmsCreateProfilePlaceholder(ContextID); if (hEmpty == NULL) return NULL; NewIcc = (_cmsICCPROFILE*) hEmpty; // Ok, in this case const void* is casted to void* just because open IO handler // shares read and writting modes. Don't abuse this feature! NewIcc ->IOhandler = cmsOpenIOhandlerFromMem(ContextID, (void*) MemPtr, dwSize, "r"); if (NewIcc ->IOhandler == NULL) goto Error; if (!_cmsReadHeader(NewIcc)) goto Error; return hEmpty; Error: cmsCloseProfile(hEmpty); return NULL; } cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void* MemPtr, cmsUInt32Number dwSize) { return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize); } // Dump tag contents. If the profile is being modified, untouched tags are copied from FileOrig static cmsBool SaveTags(_cmsICCPROFILE* Icc, _cmsICCPROFILE* FileOrig) { cmsUInt8Number* Data; cmsUInt32Number i; cmsUInt32Number Begin; cmsIOHANDLER* io = Icc ->IOhandler; cmsTagDescriptor* TagDescriptor; cmsTagTypeSignature TypeBase; cmsTagTypeSignature Type; cmsTagTypeHandler* TypeHandler; cmsFloat64Number Version = cmsGetProfileVersion((cmsHPROFILE) Icc); cmsTagTypeHandler LocalTypeHandler; for (i=0; i < Icc -> TagCount; i++) { if (Icc ->TagNames[i] == 0) continue; // Linked tags are not written if (Icc ->TagLinked[i] != (cmsTagSignature) 0) continue; Icc -> TagOffsets[i] = Begin = io ->UsedSpace; Data = (cmsUInt8Number*) Icc -> TagPtrs[i]; if (!Data) { // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user. // In this case a blind copy of the block data is performed if (FileOrig != NULL && Icc -> TagOffsets[i]) { cmsUInt32Number TagSize = FileOrig -> TagSizes[i]; cmsUInt32Number TagOffset = FileOrig -> TagOffsets[i]; void* Mem; if (!FileOrig ->IOhandler->Seek(FileOrig ->IOhandler, TagOffset)) return FALSE; Mem = _cmsMalloc(Icc ->ContextID, TagSize); if (Mem == NULL) return FALSE; if (FileOrig ->IOhandler->Read(FileOrig->IOhandler, Mem, TagSize, 1) != 1) return FALSE; if (!io ->Write(io, TagSize, Mem)) return FALSE; _cmsFree(Icc ->ContextID, Mem); Icc -> TagSizes[i] = (io ->UsedSpace - Begin); // Align to 32 bit boundary. if (! _cmsWriteAlignment(io)) return FALSE; } continue; } // Should this tag be saved as RAW? If so, tagsizes should be specified in advance (no further cooking is done) if (Icc ->TagSaveAsRaw[i]) { if (io -> Write(io, Icc ->TagSizes[i], Data) != 1) return FALSE; } else { // Search for support on this tag TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, Icc -> TagNames[i]); if (TagDescriptor == NULL) continue; // Unsupported, ignore it if (TagDescriptor ->DecideType != NULL) { Type = TagDescriptor ->DecideType(Version, Data); } else { Type = TagDescriptor ->SupportedTypes[0]; } TypeHandler = _cmsGetTagTypeHandler(Icc->ContextID, Type); if (TypeHandler == NULL) { cmsSignalError(Icc ->ContextID, cmsERROR_INTERNAL, "(Internal) no handler for tag %x", Icc -> TagNames[i]); continue; } TypeBase = TypeHandler ->Signature; if (!_cmsWriteTypeBase(io, TypeBase)) return FALSE; LocalTypeHandler = *TypeHandler; LocalTypeHandler.ContextID = Icc ->ContextID; LocalTypeHandler.ICCVersion = Icc ->Version; if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, io, Data, TagDescriptor ->ElemCount)) { char String[5]; _cmsTagSignature2String(String, (cmsTagSignature) TypeBase); cmsSignalError(Icc ->ContextID, cmsERROR_WRITE, "Couldn't write type '%s'", String); return FALSE; } } Icc -> TagSizes[i] = (io ->UsedSpace - Begin); // Align to 32 bit boundary. if (! _cmsWriteAlignment(io)) return FALSE; } return TRUE; } // Fill the offset and size fields for all linked tags static cmsBool SetLinks( _cmsICCPROFILE* Icc) { cmsUInt32Number i; for (i=0; i < Icc -> TagCount; i++) { cmsTagSignature lnk = Icc ->TagLinked[i]; if (lnk != (cmsTagSignature) 0) { int j = _cmsSearchTag(Icc, lnk, FALSE); if (j >= 0) { Icc ->TagOffsets[i] = Icc ->TagOffsets[j]; Icc ->TagSizes[i] = Icc ->TagSizes[j]; } } } return TRUE; } // Low-level save to IOHANDLER. It returns the number of bytes used to // store the profile, or zero on error. io may be NULL and in this case // no data is written--only sizes are calculated cmsUInt32Number CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; _cmsICCPROFILE Keep; cmsIOHANDLER* PrevIO = NULL; cmsUInt32Number UsedSpace; cmsContext ContextID; _cmsAssert(hProfile != NULL); memmove(&Keep, Icc, sizeof(_cmsICCPROFILE)); ContextID = cmsGetProfileContextID(hProfile); PrevIO = Icc ->IOhandler = cmsOpenIOhandlerFromNULL(ContextID); if (PrevIO == NULL) return 0; // Pass #1 does compute offsets if (!_cmsWriteHeader(Icc, 0)) goto Error; if (!SaveTags(Icc, &Keep)) goto Error; UsedSpace = PrevIO ->UsedSpace; // Pass #2 does save to iohandler if (io != NULL) { Icc ->IOhandler = io; if (!SetLinks(Icc)) goto Error; if (!_cmsWriteHeader(Icc, UsedSpace)) goto Error; if (!SaveTags(Icc, &Keep)) goto Error; } memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); if (!cmsCloseIOhandler(PrevIO)) return 0; return UsedSpace; Error: cmsCloseIOhandler(PrevIO); memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); return 0; } // Low-level save to disk. cmsBool CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName) { cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsIOHANDLER* io = cmsOpenIOhandlerFromFile(ContextID, FileName, "w"); cmsBool rc; if (io == NULL) return FALSE; rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0); rc &= cmsCloseIOhandler(io); if (rc == FALSE) { // remove() is C99 per 7.19.4.1 remove(FileName); // We have to IGNORE return value in this case } return rc; } // Same as anterior, but for streams cmsBool CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream) { cmsBool rc; cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsIOHANDLER* io = cmsOpenIOhandlerFromStream(ContextID, Stream); if (io == NULL) return FALSE; rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0); rc &= cmsCloseIOhandler(io); return rc; } // Same as anterior, but for memory blocks. In this case, a NULL as MemPtr means calculate needed space only cmsBool CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded) { cmsBool rc; cmsIOHANDLER* io; cmsContext ContextID = cmsGetProfileContextID(hProfile); _cmsAssert(BytesNeeded != NULL); // Should we just calculate the needed space? if (MemPtr == NULL) { *BytesNeeded = cmsSaveProfileToIOhandler(hProfile, NULL); return (*BytesNeeded == 0) ? FALSE : TRUE; } // That is a real write operation io = cmsOpenIOhandlerFromMem(ContextID, MemPtr, *BytesNeeded, "w"); if (io == NULL) return FALSE; rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0); rc &= cmsCloseIOhandler(io); return rc; } // Closes a profile freeing any involved resources cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; cmsBool rc = TRUE; cmsUInt32Number i; if (!Icc) return FALSE; // Was open in write mode? if (Icc ->IsWrite) { Icc ->IsWrite = FALSE; // Assure no further writting rc &= cmsSaveProfileToFile(hProfile, Icc ->IOhandler->PhysicalFile); } for (i=0; i < Icc -> TagCount; i++) { if (Icc -> TagPtrs[i]) { cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i]; if (TypeHandler != NULL) { cmsTagTypeHandler LocalTypeHandler = *TypeHandler; LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameters LocalTypeHandler.ICCVersion = Icc ->Version; LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]); } else _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]); } } if (Icc ->IOhandler != NULL) { rc &= cmsCloseIOhandler(Icc->IOhandler); } _cmsDestroyMutex(Icc->ContextID, Icc->UsrMutex); _cmsFree(Icc ->ContextID, Icc); // Free placeholder memory return rc; } // ------------------------------------------------------------------------------------------------------------------- // Returns TRUE if a given tag is supported by a plug-in static cmsBool IsTypeSupported(cmsTagDescriptor* TagDescriptor, cmsTagTypeSignature Type) { cmsUInt32Number i, nMaxTypes; nMaxTypes = TagDescriptor->nSupportedTypes; if (nMaxTypes >= MAX_TYPES_IN_LCMS_PLUGIN) nMaxTypes = MAX_TYPES_IN_LCMS_PLUGIN; for (i=0; i < nMaxTypes; i++) { if (Type == TagDescriptor ->SupportedTypes[i]) return TRUE; } return FALSE; } // That's the main read function void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; cmsIOHANDLER* io = Icc ->IOhandler; cmsTagTypeHandler* TypeHandler; cmsTagTypeHandler LocalTypeHandler; cmsTagDescriptor* TagDescriptor; cmsTagTypeSignature BaseType; cmsUInt32Number Offset, TagSize; cmsUInt32Number ElemCount; int n; if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return NULL; n = _cmsSearchTag(Icc, sig, TRUE); if (n < 0) goto Error; // Not found, return NULL // If the element is already in memory, return the pointer if (Icc -> TagPtrs[n]) { if (Icc ->TagSaveAsRaw[n]) goto Error; // We don't support read raw tags as cooked _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return Icc -> TagPtrs[n]; } // We need to read it. Get the offset and size to the file Offset = Icc -> TagOffsets[n]; TagSize = Icc -> TagSizes[n]; // Seek to its location if (!io -> Seek(io, Offset)) goto Error; // Search for support on this tag TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig); if (TagDescriptor == NULL) { char String[5]; _cmsTagSignature2String(String, sig); // An unknown element was found. cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown tag type '%s' found.", String); goto Error; // Unsupported. } // if supported, get type and check if in list BaseType = _cmsReadTypeBase(io); if (BaseType == 0) goto Error; if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error; TagSize -= 8; // Alredy read by the type base logic // Get type handler TypeHandler = _cmsGetTagTypeHandler(Icc ->ContextID, BaseType); if (TypeHandler == NULL) goto Error; LocalTypeHandler = *TypeHandler; // Read the tag Icc -> TagTypeHandlers[n] = TypeHandler; LocalTypeHandler.ContextID = Icc ->ContextID; LocalTypeHandler.ICCVersion = Icc ->Version; Icc -> TagPtrs[n] = LocalTypeHandler.ReadPtr(&LocalTypeHandler, io, &ElemCount, TagSize); // The tag type is supported, but something wrong happend and we cannot read the tag. // let know the user about this (although it is just a warning) if (Icc -> TagPtrs[n] == NULL) { char String[5]; _cmsTagSignature2String(String, sig); cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "Corrupted tag '%s'", String); goto Error; } // This is a weird error that may be a symptom of something more serious, the number of // stored item is actually less than the number of required elements. if (ElemCount < TagDescriptor ->ElemCount) { char String[5]; _cmsTagSignature2String(String, sig); cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "'%s' Inconsistent number of items: expected %d, got %d", String, TagDescriptor ->ElemCount, ElemCount); } // Return the data _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return Icc -> TagPtrs[n]; // Return error and unlock tha data Error: _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return NULL; } // Get true type of data cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; cmsTagTypeHandler* TypeHandler; int n; // Search for given tag in ICC profile directory n = _cmsSearchTag(Icc, sig, TRUE); if (n < 0) return (cmsTagTypeSignature) 0; // Not found, return NULL // Get the handler. The true type is there TypeHandler = Icc -> TagTypeHandlers[n]; return TypeHandler ->Signature; } // Write a single tag. This just keeps track of the tak into a list of "to be written". If the tag is already // in that list, the previous version is deleted. cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; cmsTagTypeHandler* TypeHandler = NULL; cmsTagTypeHandler LocalTypeHandler; cmsTagDescriptor* TagDescriptor = NULL; cmsTagTypeSignature Type; int i; cmsFloat64Number Version; char TypeString[5], SigString[5]; if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE; // To delete tags. if (data == NULL) { // Delete the tag i = _cmsSearchTag(Icc, sig, FALSE); if (i >= 0) { // Use zero as a mark of deleted _cmsDeleteTagByPos(Icc, i); Icc ->TagNames[i] = (cmsTagSignature) 0; _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return TRUE; } // Didn't find the tag goto Error; } if (!_cmsNewTag(Icc, sig, &i)) goto Error; // This is not raw Icc ->TagSaveAsRaw[i] = FALSE; // This is not a link Icc ->TagLinked[i] = (cmsTagSignature) 0; // Get information about the TAG. TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig); if (TagDescriptor == NULL){ cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported tag '%x'", sig); goto Error; } // Now we need to know which type to use. It depends on the version. Version = cmsGetProfileVersion(hProfile); if (TagDescriptor ->DecideType != NULL) { // Let the tag descriptor to decide the type base on depending on // the data. This is useful for example on parametric curves, where // curves specified by a table cannot be saved as parametric and needs // to be casted to single v2-curves, even on v4 profiles. Type = TagDescriptor ->DecideType(Version, data); } else { Type = TagDescriptor ->SupportedTypes[0]; } // Does the tag support this type? if (!IsTypeSupported(TagDescriptor, Type)) { _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); _cmsTagSignature2String(SigString, sig); cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString); goto Error; } // Does we have a handler for this type? TypeHandler = _cmsGetTagTypeHandler(Icc->ContextID, Type); if (TypeHandler == NULL) { _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); _cmsTagSignature2String(SigString, sig); cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString); goto Error; // Should never happen } // Fill fields on icc structure Icc ->TagTypeHandlers[i] = TypeHandler; Icc ->TagNames[i] = sig; Icc ->TagSizes[i] = 0; Icc ->TagOffsets[i] = 0; LocalTypeHandler = *TypeHandler; LocalTypeHandler.ContextID = Icc ->ContextID; LocalTypeHandler.ICCVersion = Icc ->Version; Icc ->TagPtrs[i] = LocalTypeHandler.DupPtr(&LocalTypeHandler, data, TagDescriptor ->ElemCount); if (Icc ->TagPtrs[i] == NULL) { _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); _cmsTagSignature2String(SigString, sig); cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "Malformed struct in type '%s' for tag '%s'", TypeString, SigString); goto Error; } _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return TRUE; Error: _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return FALSE; } // Read and write raw data. The only way those function would work and keep consistence with normal read and write // is to do an additional step of serialization. That means, readRaw would issue a normal read and then convert the obtained // data to raw bytes by using the "write" serialization logic. And vice-versa. I know this may end in situations where // raw data written does not exactly correspond with the raw data proposed to cmsWriteRaw data, but this approach allows // to write a tag as raw data and the read it as handled. cmsInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* data, cmsUInt32Number BufferSize) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; void *Object; int i; cmsIOHANDLER* MemIO; cmsTagTypeHandler* TypeHandler = NULL; cmsTagTypeHandler LocalTypeHandler; cmsTagDescriptor* TagDescriptor = NULL; cmsUInt32Number rc; cmsUInt32Number Offset, TagSize; if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0; // Search for given tag in ICC profile directory i = _cmsSearchTag(Icc, sig, TRUE); if (i < 0) goto Error; // Not found, // It is already read? if (Icc -> TagPtrs[i] == NULL) { // No yet, get original position Offset = Icc ->TagOffsets[i]; TagSize = Icc ->TagSizes[i]; // read the data directly, don't keep copy if (data != NULL) { if (BufferSize < TagSize) TagSize = BufferSize; if (!Icc ->IOhandler ->Seek(Icc ->IOhandler, Offset)) goto Error; if (!Icc ->IOhandler ->Read(Icc ->IOhandler, data, 1, TagSize)) goto Error; _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return TagSize; } _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return Icc ->TagSizes[i]; } // The data has been already read, or written. But wait!, maybe the user choosed to save as // raw data. In this case, return the raw data directly if (Icc ->TagSaveAsRaw[i]) { if (data != NULL) { TagSize = Icc ->TagSizes[i]; if (BufferSize < TagSize) TagSize = BufferSize; memmove(data, Icc ->TagPtrs[i], TagSize); _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return TagSize; } _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return Icc ->TagSizes[i]; } // Already readed, or previously set by cmsWriteTag(). We need to serialize that // data to raw in order to maintain consistency. _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); Object = cmsReadTag(hProfile, sig); if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0; if (Object == NULL) goto Error; // Now we need to serialize to a memory block: just use a memory iohandler if (data == NULL) { MemIO = cmsOpenIOhandlerFromNULL(cmsGetProfileContextID(hProfile)); } else{ MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w"); } if (MemIO == NULL) goto Error; // Obtain type handling for the tag TypeHandler = Icc ->TagTypeHandlers[i]; TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig); if (TagDescriptor == NULL) { cmsCloseIOhandler(MemIO); goto Error; } if (TypeHandler == NULL) goto Error; // Serialize LocalTypeHandler = *TypeHandler; LocalTypeHandler.ContextID = Icc ->ContextID; LocalTypeHandler.ICCVersion = Icc ->Version; if (!_cmsWriteTypeBase(MemIO, TypeHandler ->Signature)) { cmsCloseIOhandler(MemIO); goto Error; } if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) { cmsCloseIOhandler(MemIO); goto Error; } // Get Size and close rc = MemIO ->Tell(MemIO); cmsCloseIOhandler(MemIO); // Ignore return code this time _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return rc; Error: _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return 0; } // Similar to the anterior. This function allows to write directly to the ICC profile any data, without // checking anything. As a rule, mixing Raw with cooked doesn't work, so writting a tag as raw and then reading // it as cooked without serializing does result into an error. If that is wha you want, you will need to dump // the profile to memry or disk and then reopen it. cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; int i; if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0; if (!_cmsNewTag(Icc, sig, &i)) { _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return FALSE; } // Mark the tag as being written as RAW Icc ->TagSaveAsRaw[i] = TRUE; Icc ->TagNames[i] = sig; Icc ->TagLinked[i] = (cmsTagSignature) 0; // Keep a copy of the block Icc ->TagPtrs[i] = _cmsDupMem(Icc ->ContextID, data, Size); Icc ->TagSizes[i] = Size; _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return TRUE; } // Using this function you can collapse several tag entries to the same block in the profile cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; int i; if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE; if (!_cmsNewTag(Icc, sig, &i)) { _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return FALSE; } // Keep necessary information Icc ->TagSaveAsRaw[i] = FALSE; Icc ->TagNames[i] = sig; Icc ->TagLinked[i] = dest; Icc ->TagPtrs[i] = NULL; Icc ->TagSizes[i] = 0; Icc ->TagOffsets[i] = 0; _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); return TRUE; } // Returns the tag linked to sig, in the case two tags are sharing same resource cmsTagSignature CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig) { _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; int i; // Search for given tag in ICC profile directory i = _cmsSearchTag(Icc, sig, FALSE); if (i < 0) return (cmsTagSignature) 0; // Not found, return 0 return Icc -> TagLinked[i]; } lcms2-2.6/src/cmssm.c0000644002406300000240000004510412311617072014007 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // ------------------------------------------------------------------------ // Gamut boundary description by using Jan Morovic's Segment maxima method // Many thanks to Jan for allowing me to use his algorithm. // r = C* // alpha = Hab // theta = L* #define SECTORS 16 // number of divisions in alpha and theta // Spherical coordinates typedef struct { cmsFloat64Number r; cmsFloat64Number alpha; cmsFloat64Number theta; } cmsSpherical; typedef enum { GP_EMPTY, GP_SPECIFIED, GP_MODELED } GDBPointType; typedef struct { GDBPointType Type; cmsSpherical p; // Keep also alpha & theta of maximum } cmsGDBPoint; typedef struct { cmsContext ContextID; cmsGDBPoint Gamut[SECTORS][SECTORS]; } cmsGDB; // A line using the parametric form // P = a + t*u typedef struct { cmsVEC3 a; cmsVEC3 u; } cmsLine; // A plane using the parametric form // Q = b + r*v + s*w typedef struct { cmsVEC3 b; cmsVEC3 v; cmsVEC3 w; } cmsPlane; // -------------------------------------------------------------------------------------------- // ATAN2() which always returns degree positive numbers static cmsFloat64Number _cmsAtan2(cmsFloat64Number y, cmsFloat64Number x) { cmsFloat64Number a; // Deal with undefined case if (x == 0.0 && y == 0.0) return 0; a = (atan2(y, x) * 180.0) / M_PI; while (a < 0) { a += 360; } return a; } // Convert to spherical coordinates static void ToSpherical(cmsSpherical* sp, const cmsVEC3* v) { cmsFloat64Number L, a, b; L = v ->n[VX]; a = v ->n[VY]; b = v ->n[VZ]; sp ->r = sqrt( L*L + a*a + b*b ); if (sp ->r == 0) { sp ->alpha = sp ->theta = 0; return; } sp ->alpha = _cmsAtan2(a, b); sp ->theta = _cmsAtan2(sqrt(a*a + b*b), L); } // Convert to cartesian from spherical static void ToCartesian(cmsVEC3* v, const cmsSpherical* sp) { cmsFloat64Number sin_alpha; cmsFloat64Number cos_alpha; cmsFloat64Number sin_theta; cmsFloat64Number cos_theta; cmsFloat64Number L, a, b; sin_alpha = sin((M_PI * sp ->alpha) / 180.0); cos_alpha = cos((M_PI * sp ->alpha) / 180.0); sin_theta = sin((M_PI * sp ->theta) / 180.0); cos_theta = cos((M_PI * sp ->theta) / 180.0); a = sp ->r * sin_theta * sin_alpha; b = sp ->r * sin_theta * cos_alpha; L = sp ->r * cos_theta; v ->n[VX] = L; v ->n[VY] = a; v ->n[VZ] = b; } // Quantize sector of a spherical coordinate. Saturate 360, 180 to last sector // The limits are the centers of each sector, so static void QuantizeToSector(const cmsSpherical* sp, int* alpha, int* theta) { *alpha = (int) floor(((sp->alpha * (SECTORS)) / 360.0) ); *theta = (int) floor(((sp->theta * (SECTORS)) / 180.0) ); if (*alpha >= SECTORS) *alpha = SECTORS-1; if (*theta >= SECTORS) *theta = SECTORS-1; } // Line determined by 2 points static void LineOf2Points(cmsLine* line, cmsVEC3* a, cmsVEC3* b) { _cmsVEC3init(&line ->a, a ->n[VX], a ->n[VY], a ->n[VZ]); _cmsVEC3init(&line ->u, b ->n[VX] - a ->n[VX], b ->n[VY] - a ->n[VY], b ->n[VZ] - a ->n[VZ]); } // Evaluate parametric line static void GetPointOfLine(cmsVEC3* p, const cmsLine* line, cmsFloat64Number t) { p ->n[VX] = line ->a.n[VX] + t * line->u.n[VX]; p ->n[VY] = line ->a.n[VY] + t * line->u.n[VY]; p ->n[VZ] = line ->a.n[VZ] + t * line->u.n[VZ]; } /* Closest point in sector line1 to sector line2 (both are defined as 0 <=t <= 1) http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm Copyright 2001, softSurfer (www.softsurfer.com) This code may be freely used and modified for any purpose providing that this copyright notice is included with it. SoftSurfer makes no warranty for this code, and cannot be held liable for any real or imagined damage resulting from its use. Users of this code must verify correctness for their application. */ static cmsBool ClosestLineToLine(cmsVEC3* r, const cmsLine* line1, const cmsLine* line2) { cmsFloat64Number a, b, c, d, e, D; cmsFloat64Number sc, sN, sD; cmsFloat64Number tc, tN, tD; cmsVEC3 w0; _cmsVEC3minus(&w0, &line1 ->a, &line2 ->a); a = _cmsVEC3dot(&line1 ->u, &line1 ->u); b = _cmsVEC3dot(&line1 ->u, &line2 ->u); c = _cmsVEC3dot(&line2 ->u, &line2 ->u); d = _cmsVEC3dot(&line1 ->u, &w0); e = _cmsVEC3dot(&line2 ->u, &w0); D = a*c - b * b; // Denominator sD = tD = D; // default sD = D >= 0 if (D < MATRIX_DET_TOLERANCE) { // the lines are almost parallel sN = 0.0; // force using point P0 on segment S1 sD = 1.0; // to prevent possible division by 0.0 later tN = e; tD = c; } else { // get the closest points on the infinite lines sN = (b*e - c*d); tN = (a*e - b*d); if (sN < 0.0) { // sc < 0 => the s=0 edge is visible sN = 0.0; tN = e; tD = c; } else if (sN > sD) { // sc > 1 => the s=1 edge is visible sN = sD; tN = e + b; tD = c; } } if (tN < 0.0) { // tc < 0 => the t=0 edge is visible tN = 0.0; // recompute sc for this edge if (-d < 0.0) sN = 0.0; else if (-d > a) sN = sD; else { sN = -d; sD = a; } } else if (tN > tD) { // tc > 1 => the t=1 edge is visible tN = tD; // recompute sc for this edge if ((-d + b) < 0.0) sN = 0; else if ((-d + b) > a) sN = sD; else { sN = (-d + b); sD = a; } } // finally do the division to get sc and tc sc = (fabs(sN) < MATRIX_DET_TOLERANCE ? 0.0 : sN / sD); tc = (fabs(tN) < MATRIX_DET_TOLERANCE ? 0.0 : tN / tD); GetPointOfLine(r, line1, sc); return TRUE; } // ------------------------------------------------------------------ Wrapper // Allocate & free structure cmsHANDLE CMSEXPORT cmsGBDAlloc(cmsContext ContextID) { cmsGDB* gbd = (cmsGDB*) _cmsMallocZero(ContextID, sizeof(cmsGDB)); if (gbd == NULL) return NULL; gbd -> ContextID = ContextID; return (cmsHANDLE) gbd; } void CMSEXPORT cmsGBDFree(cmsHANDLE hGBD) { cmsGDB* gbd = (cmsGDB*) hGBD; if (hGBD != NULL) _cmsFree(gbd->ContextID, (void*) gbd); } // Auxiliar to retrieve a pointer to the segmentr containing the Lab value static cmsGDBPoint* GetPoint(cmsGDB* gbd, const cmsCIELab* Lab, cmsSpherical* sp) { cmsVEC3 v; int alpha, theta; // Housekeeping _cmsAssert(gbd != NULL); _cmsAssert(Lab != NULL); _cmsAssert(sp != NULL); // Center L* by substracting half of its domain, that's 50 _cmsVEC3init(&v, Lab ->L - 50.0, Lab ->a, Lab ->b); // Convert to spherical coordinates ToSpherical(sp, &v); if (sp ->r < 0 || sp ->alpha < 0 || sp->theta < 0) { cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, "spherical value out of range"); return NULL; } // On which sector it falls? QuantizeToSector(sp, &alpha, &theta); if (alpha < 0 || theta < 0 || alpha >= SECTORS || theta >= SECTORS) { cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, " quadrant out of range"); return NULL; } // Get pointer to the sector return &gbd ->Gamut[theta][alpha]; } // Add a point to gamut descriptor. Point to add is in Lab color space. // GBD is centered on a=b=0 and L*=50 cmsBool CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab) { cmsGDB* gbd = (cmsGDB*) hGBD; cmsGDBPoint* ptr; cmsSpherical sp; // Get pointer to the sector ptr = GetPoint(gbd, Lab, &sp); if (ptr == NULL) return FALSE; // If no samples at this sector, add it if (ptr ->Type == GP_EMPTY) { ptr -> Type = GP_SPECIFIED; ptr -> p = sp; } else { // Substitute only if radius is greater if (sp.r > ptr -> p.r) { ptr -> Type = GP_SPECIFIED; ptr -> p = sp; } } return TRUE; } // Check if a given point falls inside gamut cmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab) { cmsGDB* gbd = (cmsGDB*) hGBD; cmsGDBPoint* ptr; cmsSpherical sp; // Get pointer to the sector ptr = GetPoint(gbd, Lab, &sp); if (ptr == NULL) return FALSE; // If no samples at this sector, return no data if (ptr ->Type == GP_EMPTY) return FALSE; // In gamut only if radius is greater return (sp.r <= ptr -> p.r); } // ----------------------------------------------------------------------------------------------------------------------- // Find near sectors. The list of sectors found is returned on Close[]. // The function returns the number of sectors as well. // 24 9 10 11 12 // 23 8 1 2 13 // 22 7 * 3 14 // 21 6 5 4 15 // 20 19 18 17 16 // // Those are the relative movements // {-2,-2}, {-1, -2}, {0, -2}, {+1, -2}, {+2, -2}, // {-2,-1}, {-1, -1}, {0, -1}, {+1, -1}, {+2, -1}, // {-2, 0}, {-1, 0}, {0, 0}, {+1, 0}, {+2, 0}, // {-2,+1}, {-1, +1}, {0, +1}, {+1, +1}, {+2, +1}, // {-2,+2}, {-1, +2}, {0, +2}, {+1, +2}, {+2, +2}}; static const struct _spiral { int AdvX, AdvY; } Spiral[] = { {0, -1}, {+1, -1}, {+1, 0}, {+1, +1}, {0, +1}, {-1, +1}, {-1, 0}, {-1, -1}, {-1, -2}, {0, -2}, {+1, -2}, {+2, -2}, {+2, -1}, {+2, 0}, {+2, +1}, {+2, +2}, {+1, +2}, {0, +2}, {-1, +2}, {-2, +2}, {-2, +1}, {-2, 0}, {-2, -1}, {-2, -2} }; #define NSTEPS (sizeof(Spiral) / sizeof(struct _spiral)) static int FindNearSectors(cmsGDB* gbd, int alpha, int theta, cmsGDBPoint* Close[]) { int nSectors = 0; int a, t; cmsUInt32Number i; cmsGDBPoint* pt; for (i=0; i < NSTEPS; i++) { a = alpha + Spiral[i].AdvX; t = theta + Spiral[i].AdvY; // Cycle at the end a %= SECTORS; t %= SECTORS; // Cycle at the begin if (a < 0) a = SECTORS + a; if (t < 0) t = SECTORS + t; pt = &gbd ->Gamut[t][a]; if (pt -> Type != GP_EMPTY) { Close[nSectors++] = pt; } } return nSectors; } // Interpolate a missing sector. Method identifies whatever this is top, bottom or mid static cmsBool InterpolateMissingSector(cmsGDB* gbd, int alpha, int theta) { cmsSpherical sp; cmsVEC3 Lab; cmsVEC3 Centre; cmsLine ray; int nCloseSectors; cmsGDBPoint* Close[NSTEPS + 1]; cmsSpherical closel, templ; cmsLine edge; int k, m; // Is that point already specified? if (gbd ->Gamut[theta][alpha].Type != GP_EMPTY) return TRUE; // Fill close points nCloseSectors = FindNearSectors(gbd, alpha, theta, Close); // Find a central point on the sector sp.alpha = (cmsFloat64Number) ((alpha + 0.5) * 360.0) / (SECTORS); sp.theta = (cmsFloat64Number) ((theta + 0.5) * 180.0) / (SECTORS); sp.r = 50.0; // Convert to Cartesian ToCartesian(&Lab, &sp); // Create a ray line from centre to this point _cmsVEC3init(&Centre, 50.0, 0, 0); LineOf2Points(&ray, &Lab, &Centre); // For all close sectors closel.r = 0.0; closel.alpha = 0; closel.theta = 0; for (k=0; k < nCloseSectors; k++) { for(m = k+1; m < nCloseSectors; m++) { cmsVEC3 temp, a1, a2; // A line from sector to sector ToCartesian(&a1, &Close[k]->p); ToCartesian(&a2, &Close[m]->p); LineOf2Points(&edge, &a1, &a2); // Find a line ClosestLineToLine(&temp, &ray, &edge); // Convert to spherical ToSpherical(&templ, &temp); if ( templ.r > closel.r && templ.theta >= (theta*180.0/SECTORS) && templ.theta <= ((theta+1)*180.0/SECTORS) && templ.alpha >= (alpha*360.0/SECTORS) && templ.alpha <= ((alpha+1)*360.0/SECTORS)) { closel = templ; } } } gbd ->Gamut[theta][alpha].p = closel; gbd ->Gamut[theta][alpha].Type = GP_MODELED; return TRUE; } // Interpolate missing parts. The algorithm fist computes slices at // theta=0 and theta=Max. cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGBD, cmsUInt32Number dwFlags) { int alpha, theta; cmsGDB* gbd = (cmsGDB*) hGBD; _cmsAssert(hGBD != NULL); // Interpolate black for (alpha = 0; alpha < SECTORS; alpha++) { if (!InterpolateMissingSector(gbd, alpha, 0)) return FALSE; } // Interpolate white for (alpha = 0; alpha < SECTORS; alpha++) { if (!InterpolateMissingSector(gbd, alpha, SECTORS-1)) return FALSE; } // Interpolate Mid for (theta = 1; theta < SECTORS; theta++) { for (alpha = 0; alpha < SECTORS; alpha++) { if (!InterpolateMissingSector(gbd, alpha, theta)) return FALSE; } } // Done return TRUE; cmsUNUSED_PARAMETER(dwFlags); } // -------------------------------------------------------------------------------------------------------- // Great for debug, but not suitable for real use #if 0 cmsBool cmsGBDdumpVRML(cmsHANDLE hGBD, const char* fname) { FILE* fp; int i, j; cmsGDB* gbd = (cmsGDB*) hGBD; cmsGDBPoint* pt; fp = fopen (fname, "wt"); if (fp == NULL) return FALSE; fprintf (fp, "#VRML V2.0 utf8\n"); // set the viewing orientation and distance fprintf (fp, "DEF CamTest Group {\n"); fprintf (fp, "\tchildren [\n"); fprintf (fp, "\t\tDEF Cameras Group {\n"); fprintf (fp, "\t\t\tchildren [\n"); fprintf (fp, "\t\t\t\tDEF DefaultView Viewpoint {\n"); fprintf (fp, "\t\t\t\t\tposition 0 0 340\n"); fprintf (fp, "\t\t\t\t\torientation 0 0 1 0\n"); fprintf (fp, "\t\t\t\t\tdescription \"default view\"\n"); fprintf (fp, "\t\t\t\t}\n"); fprintf (fp, "\t\t\t]\n"); fprintf (fp, "\t\t},\n"); fprintf (fp, "\t]\n"); fprintf (fp, "}\n"); // Output the background stuff fprintf (fp, "Background {\n"); fprintf (fp, "\tskyColor [\n"); fprintf (fp, "\t\t.5 .5 .5\n"); fprintf (fp, "\t]\n"); fprintf (fp, "}\n"); // Output the shape stuff fprintf (fp, "Transform {\n"); fprintf (fp, "\tscale .3 .3 .3\n"); fprintf (fp, "\tchildren [\n"); // Draw the axes as a shape: fprintf (fp, "\t\tShape {\n"); fprintf (fp, "\t\t\tappearance Appearance {\n"); fprintf (fp, "\t\t\t\tmaterial Material {\n"); fprintf (fp, "\t\t\t\t\tdiffuseColor 0 0.8 0\n"); fprintf (fp, "\t\t\t\t\temissiveColor 1.0 1.0 1.0\n"); fprintf (fp, "\t\t\t\t\tshininess 0.8\n"); fprintf (fp, "\t\t\t\t}\n"); fprintf (fp, "\t\t\t}\n"); fprintf (fp, "\t\t\tgeometry IndexedLineSet {\n"); fprintf (fp, "\t\t\t\tcoord Coordinate {\n"); fprintf (fp, "\t\t\t\t\tpoint [\n"); fprintf (fp, "\t\t\t\t\t0.0 0.0 0.0,\n"); fprintf (fp, "\t\t\t\t\t%f 0.0 0.0,\n", 255.0); fprintf (fp, "\t\t\t\t\t0.0 %f 0.0,\n", 255.0); fprintf (fp, "\t\t\t\t\t0.0 0.0 %f]\n", 255.0); fprintf (fp, "\t\t\t\t}\n"); fprintf (fp, "\t\t\t\tcoordIndex [\n"); fprintf (fp, "\t\t\t\t\t0, 1, -1\n"); fprintf (fp, "\t\t\t\t\t0, 2, -1\n"); fprintf (fp, "\t\t\t\t\t0, 3, -1]\n"); fprintf (fp, "\t\t\t}\n"); fprintf (fp, "\t\t}\n"); fprintf (fp, "\t\tShape {\n"); fprintf (fp, "\t\t\tappearance Appearance {\n"); fprintf (fp, "\t\t\t\tmaterial Material {\n"); fprintf (fp, "\t\t\t\t\tdiffuseColor 0 0.8 0\n"); fprintf (fp, "\t\t\t\t\temissiveColor 1 1 1\n"); fprintf (fp, "\t\t\t\t\tshininess 0.8\n"); fprintf (fp, "\t\t\t\t}\n"); fprintf (fp, "\t\t\t}\n"); fprintf (fp, "\t\t\tgeometry PointSet {\n"); // fill in the points here fprintf (fp, "\t\t\t\tcoord Coordinate {\n"); fprintf (fp, "\t\t\t\t\tpoint [\n"); // We need to transverse all gamut hull. for (i=0; i < SECTORS; i++) for (j=0; j < SECTORS; j++) { cmsVEC3 v; pt = &gbd ->Gamut[i][j]; ToCartesian(&v, &pt ->p); fprintf (fp, "\t\t\t\t\t%g %g %g", v.n[0]+50, v.n[1], v.n[2]); if ((j == SECTORS - 1) && (i == SECTORS - 1)) fprintf (fp, "]\n"); else fprintf (fp, ",\n"); } fprintf (fp, "\t\t\t\t}\n"); // fill in the face colors fprintf (fp, "\t\t\t\tcolor Color {\n"); fprintf (fp, "\t\t\t\t\tcolor [\n"); for (i=0; i < SECTORS; i++) for (j=0; j < SECTORS; j++) { cmsVEC3 v; pt = &gbd ->Gamut[i][j]; ToCartesian(&v, &pt ->p); if (pt ->Type == GP_EMPTY) fprintf (fp, "\t\t\t\t\t%g %g %g", 0.0, 0.0, 0.0); else if (pt ->Type == GP_MODELED) fprintf (fp, "\t\t\t\t\t%g %g %g", 1.0, .5, .5); else { fprintf (fp, "\t\t\t\t\t%g %g %g", 1.0, 1.0, 1.0); } if ((j == SECTORS - 1) && (i == SECTORS - 1)) fprintf (fp, "]\n"); else fprintf (fp, ",\n"); } fprintf (fp, "\t\t\t}\n"); fprintf (fp, "\t\t\t}\n"); fprintf (fp, "\t\t}\n"); fprintf (fp, "\t]\n"); fprintf (fp, "}\n"); fclose (fp); return TRUE; } #endif lcms2-2.6/src/cmsgmt.c0000644002406300000240000005012612311617072014157 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // Auxiliar: append a Lab identity after the given sequence of profiles // and return the transform. Lab profile is closed, rest of profiles are kept open. cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number InputFormat, cmsUInt32Number OutputFormat, const cmsUInt32Number Intents[], const cmsHPROFILE hProfiles[], const cmsBool BPC[], const cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsHTRANSFORM xform; cmsHPROFILE hLab; cmsHPROFILE ProfileList[256]; cmsBool BPCList[256]; cmsFloat64Number AdaptationList[256]; cmsUInt32Number IntentList[256]; cmsUInt32Number i; // This is a rather big number and there is no need of dynamic memory // since we are adding a profile, 254 + 1 = 255 and this is the limit if (nProfiles > 254) return NULL; // The output space hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); if (hLab == NULL) return NULL; // Create a copy of parameters for (i=0; i < nProfiles; i++) { ProfileList[i] = hProfiles[i]; BPCList[i] = BPC[i]; AdaptationList[i] = AdaptationStates[i]; IntentList[i] = Intents[i]; } // Place Lab identity at chain's end. ProfileList[nProfiles] = hLab; BPCList[nProfiles] = 0; AdaptationList[nProfiles] = 1.0; IntentList[nProfiles] = INTENT_RELATIVE_COLORIMETRIC; // Create the transform xform = cmsCreateExtendedTransform(ContextID, nProfiles + 1, ProfileList, BPCList, IntentList, AdaptationList, NULL, 0, InputFormat, OutputFormat, dwFlags); cmsCloseProfile(hLab); return xform; } // Compute K -> L* relationship. Flags may include black point compensation. In this case, // the relationship is assumed from the profile with BPC to a black point zero. static cmsToneCurve* ComputeKToLstar(cmsContext ContextID, cmsUInt32Number nPoints, cmsUInt32Number nProfiles, const cmsUInt32Number Intents[], const cmsHPROFILE hProfiles[], const cmsBool BPC[], const cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsToneCurve* out = NULL; cmsUInt32Number i; cmsHTRANSFORM xform; cmsCIELab Lab; cmsFloat32Number cmyk[4]; cmsFloat32Number* SampledPoints; xform = _cmsChain2Lab(ContextID, nProfiles, TYPE_CMYK_FLT, TYPE_Lab_DBL, Intents, hProfiles, BPC, AdaptationStates, dwFlags); if (xform == NULL) return NULL; SampledPoints = (cmsFloat32Number*) _cmsCalloc(ContextID, nPoints, sizeof(cmsFloat32Number)); if (SampledPoints == NULL) goto Error; for (i=0; i < nPoints; i++) { cmyk[0] = 0; cmyk[1] = 0; cmyk[2] = 0; cmyk[3] = (cmsFloat32Number) ((i * 100.0) / (nPoints-1)); cmsDoTransform(xform, cmyk, &Lab, 1); SampledPoints[i]= (cmsFloat32Number) (1.0 - Lab.L / 100.0); // Negate K for easier operation } out = cmsBuildTabulatedToneCurveFloat(ContextID, nPoints, SampledPoints); Error: cmsDeleteTransform(xform); if (SampledPoints) _cmsFree(ContextID, SampledPoints); return out; } // Compute Black tone curve on a CMYK -> CMYK transform. This is done by // using the proof direction on both profiles to find K->L* relationship // then joining both curves. dwFlags may include black point compensation. cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID, cmsUInt32Number nPoints, cmsUInt32Number nProfiles, const cmsUInt32Number Intents[], const cmsHPROFILE hProfiles[], const cmsBool BPC[], const cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsToneCurve *in, *out, *KTone; // Make sure CMYK -> CMYK if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData || cmsGetColorSpace(hProfiles[nProfiles-1])!= cmsSigCmykData) return NULL; // Make sure last is an output profile if (cmsGetDeviceClass(hProfiles[nProfiles - 1]) != cmsSigOutputClass) return NULL; // Create individual curves. BPC works also as each K to L* is // computed as a BPC to zero black point in case of L* in = ComputeKToLstar(ContextID, nPoints, nProfiles - 1, Intents, hProfiles, BPC, AdaptationStates, dwFlags); if (in == NULL) return NULL; out = ComputeKToLstar(ContextID, nPoints, 1, Intents + (nProfiles - 1), &hProfiles [nProfiles - 1], BPC + (nProfiles - 1), AdaptationStates + (nProfiles - 1), dwFlags); if (out == NULL) { cmsFreeToneCurve(in); return NULL; } // Build the relationship. This effectively limits the maximum accuracy to 16 bits, but // since this is used on black-preserving LUTs, we are not loosing accuracy in any case KTone = cmsJoinToneCurve(ContextID, in, out, nPoints); // Get rid of components cmsFreeToneCurve(in); cmsFreeToneCurve(out); // Something went wrong... if (KTone == NULL) return NULL; // Make sure it is monotonic if (!cmsIsToneCurveMonotonic(KTone)) { cmsFreeToneCurve(KTone); return NULL; } return KTone; } // Gamut LUT Creation ----------------------------------------------------------------------------------------- // Used by gamut & softproofing typedef struct { cmsHTRANSFORM hInput; // From whatever input color space. 16 bits to DBL cmsHTRANSFORM hForward, hReverse; // Transforms going from Lab to colorant and back cmsFloat64Number Thereshold; // The thereshold after which is considered out of gamut } GAMUTCHAIN; // This sampler does compute gamut boundaries by comparing original // values with a transform going back and forth. Values above ERR_THERESHOLD // of maximum are considered out of gamut. #define ERR_THERESHOLD 5 static int GamutSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { GAMUTCHAIN* t = (GAMUTCHAIN* ) Cargo; cmsCIELab LabIn1, LabOut1; cmsCIELab LabIn2, LabOut2; cmsUInt16Number Proof[cmsMAXCHANNELS], Proof2[cmsMAXCHANNELS]; cmsFloat64Number dE1, dE2, ErrorRatio; // Assume in-gamut by default. ErrorRatio = 1.0; // Convert input to Lab cmsDoTransform(t -> hInput, In, &LabIn1, 1); // converts from PCS to colorant. This always // does return in-gamut values, cmsDoTransform(t -> hForward, &LabIn1, Proof, 1); // Now, do the inverse, from colorant to PCS. cmsDoTransform(t -> hReverse, Proof, &LabOut1, 1); memmove(&LabIn2, &LabOut1, sizeof(cmsCIELab)); // Try again, but this time taking Check as input cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1); cmsDoTransform(t -> hReverse, Proof2, &LabOut2, 1); // Take difference of direct value dE1 = cmsDeltaE(&LabIn1, &LabOut1); // Take difference of converted value dE2 = cmsDeltaE(&LabIn2, &LabOut2); // if dE1 is small and dE2 is small, value is likely to be in gamut if (dE1 < t->Thereshold && dE2 < t->Thereshold) Out[0] = 0; else { // if dE1 is small and dE2 is big, undefined. Assume in gamut if (dE1 < t->Thereshold && dE2 > t->Thereshold) Out[0] = 0; else // dE1 is big and dE2 is small, clearly out of gamut if (dE1 > t->Thereshold && dE2 < t->Thereshold) Out[0] = (cmsUInt16Number) _cmsQuickFloor((dE1 - t->Thereshold) + .5); else { // dE1 is big and dE2 is also big, could be due to perceptual mapping // so take error ratio if (dE2 == 0.0) ErrorRatio = dE1; else ErrorRatio = dE1 / dE2; if (ErrorRatio > t->Thereshold) Out[0] = (cmsUInt16Number) _cmsQuickFloor((ErrorRatio - t->Thereshold) + .5); else Out[0] = 0; } } return TRUE; } // Does compute a gamut LUT going back and forth across pcs -> relativ. colorimetric intent -> pcs // the dE obtained is then annotated on the LUT. Values truely out of gamut are clipped to dE = 0xFFFE // and values changed are supposed to be handled by any gamut remapping, so, are out of gamut as well. // // **WARNING: This algorithm does assume that gamut remapping algorithms does NOT move in-gamut colors, // of course, many perceptual and saturation intents does not work in such way, but relativ. ones should. cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, cmsHPROFILE hProfiles[], cmsBool BPC[], cmsUInt32Number Intents[], cmsFloat64Number AdaptationStates[], cmsUInt32Number nGamutPCSposition, cmsHPROFILE hGamut) { cmsHPROFILE hLab; cmsPipeline* Gamut; cmsStage* CLUT; cmsUInt32Number dwFormat; GAMUTCHAIN Chain; int nChannels, nGridpoints; cmsColorSpaceSignature ColorSpace; cmsUInt32Number i; cmsHPROFILE ProfileList[256]; cmsBool BPCList[256]; cmsFloat64Number AdaptationList[256]; cmsUInt32Number IntentList[256]; memset(&Chain, 0, sizeof(GAMUTCHAIN)); if (nGamutPCSposition <= 0 || nGamutPCSposition > 255) { cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong position of PCS. 1..255 expected, %d found.", nGamutPCSposition); return NULL; } hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); if (hLab == NULL) return NULL; // The figure of merit. On matrix-shaper profiles, should be almost zero as // the conversion is pretty exact. On LUT based profiles, different resolutions // of input and output CLUT may result in differences. if (cmsIsMatrixShaper(hGamut)) { Chain.Thereshold = 1.0; } else { Chain.Thereshold = ERR_THERESHOLD; } // Create a copy of parameters for (i=0; i < nGamutPCSposition; i++) { ProfileList[i] = hProfiles[i]; BPCList[i] = BPC[i]; AdaptationList[i] = AdaptationStates[i]; IntentList[i] = Intents[i]; } // Fill Lab identity ProfileList[nGamutPCSposition] = hLab; BPCList[nGamutPCSposition] = 0; AdaptationList[nGamutPCSposition] = 1.0; IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC; ColorSpace = cmsGetColorSpace(hGamut); nChannels = cmsChannelsOf(ColorSpace); nGridpoints = _cmsReasonableGridpointsByColorspace(ColorSpace, cmsFLAGS_HIGHRESPRECALC); dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2)); // 16 bits to Lab double Chain.hInput = cmsCreateExtendedTransform(ContextID, nGamutPCSposition + 1, ProfileList, BPCList, IntentList, AdaptationList, NULL, 0, dwFormat, TYPE_Lab_DBL, cmsFLAGS_NOCACHE); // Does create the forward step. Lab double to device dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2)); Chain.hForward = cmsCreateTransformTHR(ContextID, hLab, TYPE_Lab_DBL, hGamut, dwFormat, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE); // Does create the backwards step Chain.hReverse = cmsCreateTransformTHR(ContextID, hGamut, dwFormat, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE); // All ok? if (Chain.hInput && Chain.hForward && Chain.hReverse) { // Go on, try to compute gamut LUT from PCS. This consist on a single channel containing // dE when doing a transform back and forth on the colorimetric intent. Gamut = cmsPipelineAlloc(ContextID, 3, 1); if (Gamut != NULL) { CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL); if (!cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT)) { cmsPipelineFree(Gamut); Gamut = NULL; } else { cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0); } } } else Gamut = NULL; // Didn't work... // Free all needed stuff. if (Chain.hInput) cmsDeleteTransform(Chain.hInput); if (Chain.hForward) cmsDeleteTransform(Chain.hForward); if (Chain.hReverse) cmsDeleteTransform(Chain.hReverse); if (hLab) cmsCloseProfile(hLab); // And return computed hull return Gamut; } // Total Area Coverage estimation ---------------------------------------------------------------- typedef struct { cmsUInt32Number nOutputChans; cmsHTRANSFORM hRoundTrip; cmsFloat32Number MaxTAC; cmsFloat32Number MaxInput[cmsMAXCHANNELS]; } cmsTACestimator; // This callback just accounts the maximum ink dropped in the given node. It does not populate any // memory, as the destination table is NULL. Its only purpose it to know the global maximum. static int EstimateTAC(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo) { cmsTACestimator* bp = (cmsTACestimator*) Cargo; cmsFloat32Number RoundTrip[cmsMAXCHANNELS]; cmsUInt32Number i; cmsFloat32Number Sum; // Evaluate the xform cmsDoTransform(bp->hRoundTrip, In, RoundTrip, 1); // All all amounts of ink for (Sum=0, i=0; i < bp ->nOutputChans; i++) Sum += RoundTrip[i]; // If above maximum, keep track of input values if (Sum > bp ->MaxTAC) { bp ->MaxTAC = Sum; for (i=0; i < bp ->nOutputChans; i++) { bp ->MaxInput[i] = In[i]; } } return TRUE; cmsUNUSED_PARAMETER(Out); } // Detect Total area coverage of the profile cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile) { cmsTACestimator bp; cmsUInt32Number dwFormatter; cmsUInt32Number GridPoints[MAX_INPUT_DIMENSIONS]; cmsHPROFILE hLab; cmsContext ContextID = cmsGetProfileContextID(hProfile); // TAC only works on output profiles if (cmsGetDeviceClass(hProfile) != cmsSigOutputClass) { return 0; } // Create a fake formatter for result dwFormatter = cmsFormatterForColorspaceOfProfile(hProfile, 4, TRUE); bp.nOutputChans = T_CHANNELS(dwFormatter); bp.MaxTAC = 0; // Initial TAC is 0 // for safety if (bp.nOutputChans >= cmsMAXCHANNELS) return 0; hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); if (hLab == NULL) return 0; // Setup a roundtrip on perceptual intent in output profile for TAC estimation bp.hRoundTrip = cmsCreateTransformTHR(ContextID, hLab, TYPE_Lab_16, hProfile, dwFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); cmsCloseProfile(hLab); if (bp.hRoundTrip == NULL) return 0; // For L* we only need black and white. For C* we need many points GridPoints[0] = 6; GridPoints[1] = 74; GridPoints[2] = 74; if (!cmsSliceSpace16(3, GridPoints, EstimateTAC, &bp)) { bp.MaxTAC = 0; } cmsDeleteTransform(bp.hRoundTrip); // Results in % return bp.MaxTAC; } // Carefully, clamp on CIELab space. cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab, double amax, double amin, double bmax, double bmin) { // Whole Luma surface to zero if (Lab -> L < 0) { Lab-> L = Lab->a = Lab-> b = 0.0; return FALSE; } // Clamp white, DISCARD HIGHLIGHTS. This is done // in such way because icc spec doesn't allow the // use of L>100 as a highlight means. if (Lab->L > 100) Lab -> L = 100; // Check out gamut prism, on a, b faces if (Lab -> a < amin || Lab->a > amax|| Lab -> b < bmin || Lab->b > bmax) { cmsCIELCh LCh; double h, slope; // Falls outside a, b limits. Transports to LCh space, // and then do the clipping if (Lab -> a == 0.0) { // Is hue exactly 90? // atan will not work, so clamp here Lab -> b = Lab->b < 0 ? bmin : bmax; return TRUE; } cmsLab2LCh(&LCh, Lab); slope = Lab -> b / Lab -> a; h = LCh.h; // There are 4 zones if ((h >= 0. && h < 45.) || (h >= 315 && h <= 360.)) { // clip by amax Lab -> a = amax; Lab -> b = amax * slope; } else if (h >= 45. && h < 135.) { // clip by bmax Lab -> b = bmax; Lab -> a = bmax / slope; } else if (h >= 135. && h < 225.) { // clip by amin Lab -> a = amin; Lab -> b = amin * slope; } else if (h >= 225. && h < 315.) { // clip by bmin Lab -> b = bmin; Lab -> a = bmin / slope; } else { cmsSignalError(0, cmsERROR_RANGE, "Invalid angle"); return FALSE; } } return TRUE; } lcms2-2.6/src/cmscgats.c0000644002406300000240000021512712311617072014475 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // IT8.7 / CGATS.17-200x handling ----------------------------------------------------------------------------- #define MAXID 128 // Max length of identifier #define MAXSTR 1024 // Max length of string #define MAXTABLES 255 // Max Number of tables in a single stream #define MAXINCLUDE 20 // Max number of nested includes #define DEFAULT_DBL_FORMAT "%.10g" // Double formatting #ifdef CMS_IS_WINDOWS_ # include # define DIR_CHAR '\\' #else # define DIR_CHAR '/' #endif // Symbols typedef enum { SNONE, SINUM, // Integer SDNUM, // Real SIDENT, // Identifier SSTRING, // string SCOMMENT, // comment SEOLN, // End of line SEOF, // End of stream SSYNERROR, // Syntax error found on stream // Keywords SBEGIN_DATA, SBEGIN_DATA_FORMAT, SEND_DATA, SEND_DATA_FORMAT, SKEYWORD, SDATA_FORMAT_ID, SINCLUDE } SYMBOL; // How to write the value typedef enum { WRITE_UNCOOKED, WRITE_STRINGIFY, WRITE_HEXADECIMAL, WRITE_BINARY, WRITE_PAIR } WRITEMODE; // Linked list of variable names typedef struct _KeyVal { struct _KeyVal* Next; char* Keyword; // Name of variable struct _KeyVal* NextSubkey; // If key is a dictionary, points to the next item char* Subkey; // If key is a dictionary, points to the subkey name char* Value; // Points to value WRITEMODE WriteAs; // How to write the value } KEYVALUE; // Linked list of memory chunks (Memory sink) typedef struct _OwnedMem { struct _OwnedMem* Next; void * Ptr; // Point to value } OWNEDMEM; // Suballocator typedef struct _SubAllocator { cmsUInt8Number* Block; cmsUInt32Number BlockSize; cmsUInt32Number Used; } SUBALLOCATOR; // Table. Each individual table can hold properties and rows & cols typedef struct _Table { char SheetType[MAXSTR]; // The first row of the IT8 (the type) int nSamples, nPatches; // Cols, Rows int SampleID; // Pos of ID KEYVALUE* HeaderList; // The properties char** DataFormat; // The binary stream descriptor char** Data; // The binary stream } TABLE; // File stream being parsed typedef struct _FileContext { char FileName[cmsMAX_PATH]; // File name if being readed from file FILE* Stream; // File stream or NULL if holded in memory } FILECTX; // This struct hold all information about an open IT8 handler. typedef struct { cmsUInt32Number TablesCount; // How many tables in this stream cmsUInt32Number nTable; // The actual table TABLE Tab[MAXTABLES]; // Memory management OWNEDMEM* MemorySink; // The storage backend SUBALLOCATOR Allocator; // String suballocator -- just to keep it fast // Parser state machine SYMBOL sy; // Current symbol int ch; // Current character int inum; // integer value cmsFloat64Number dnum; // real value char id[MAXID]; // identifier char str[MAXSTR]; // string // Allowed keywords & datasets. They have visibility on whole stream KEYVALUE* ValidKeywords; KEYVALUE* ValidSampleID; char* Source; // Points to loc. being parsed int lineno; // line counter for error reporting FILECTX* FileStack[MAXINCLUDE]; // Stack of files being parsed int IncludeSP; // Include Stack Pointer char* MemoryBlock; // The stream if holded in memory char DoubleFormatter[MAXID];// Printf-like 'cmsFloat64Number' formatter cmsContext ContextID; // The threading context } cmsIT8; // The stream for save operations typedef struct { FILE* stream; // For save-to-file behaviour cmsUInt8Number* Base; cmsUInt8Number* Ptr; // For save-to-mem behaviour cmsUInt32Number Used; cmsUInt32Number Max; } SAVESTREAM; // ------------------------------------------------------ cmsIT8 parsing routines // A keyword typedef struct { const char *id; SYMBOL sy; } KEYWORD; // The keyword->symbol translation table. Sorting is required. static const KEYWORD TabKeys[] = { {"$INCLUDE", SINCLUDE}, // This is an extension! {".INCLUDE", SINCLUDE}, // This is an extension! {"BEGIN_DATA", SBEGIN_DATA }, {"BEGIN_DATA_FORMAT", SBEGIN_DATA_FORMAT }, {"DATA_FORMAT_IDENTIFIER", SDATA_FORMAT_ID}, {"END_DATA", SEND_DATA}, {"END_DATA_FORMAT", SEND_DATA_FORMAT}, {"KEYWORD", SKEYWORD} }; #define NUMKEYS (sizeof(TabKeys)/sizeof(KEYWORD)) // Predefined properties // A property typedef struct { const char *id; // The identifier WRITEMODE as; // How is supposed to be written } PROPERTY; static PROPERTY PredefinedProperties[] = { {"NUMBER_OF_FIELDS", WRITE_UNCOOKED}, // Required - NUMBER OF FIELDS {"NUMBER_OF_SETS", WRITE_UNCOOKED}, // Required - NUMBER OF SETS {"ORIGINATOR", WRITE_STRINGIFY}, // Required - Identifies the specific system, organization or individual that created the data file. {"FILE_DESCRIPTOR", WRITE_STRINGIFY}, // Required - Describes the purpose or contents of the data file. {"CREATED", WRITE_STRINGIFY}, // Required - Indicates date of creation of the data file. {"DESCRIPTOR", WRITE_STRINGIFY}, // Required - Describes the purpose or contents of the data file. {"DIFFUSE_GEOMETRY", WRITE_STRINGIFY}, // The diffuse geometry used. Allowed values are "sphere" or "opal". {"MANUFACTURER", WRITE_STRINGIFY}, {"MANUFACTURE", WRITE_STRINGIFY}, // Some broken Fuji targets does store this value {"PROD_DATE", WRITE_STRINGIFY}, // Identifies year and month of production of the target in the form yyyy:mm. {"SERIAL", WRITE_STRINGIFY}, // Uniquely identifies individual physical target. {"MATERIAL", WRITE_STRINGIFY}, // Identifies the material on which the target was produced using a code // uniquely identifying th e material. This is intend ed to be used for IT8.7 // physical targets only (i.e . IT8.7/1 a nd IT8.7/2). {"INSTRUMENTATION", WRITE_STRINGIFY}, // Used to report the specific instrumentation used (manufacturer and // model number) to generate the data reported. This data will often // provide more information about the particular data collected than an // extensive list of specific details. This is particularly important for // spectral data or data derived from spectrophotometry. {"MEASUREMENT_SOURCE", WRITE_STRINGIFY}, // Illumination used for spectral measurements. This data helps provide // a guide to the potential for issues of paper fluorescence, etc. {"PRINT_CONDITIONS", WRITE_STRINGIFY}, // Used to define the characteristics of the printed sheet being reported. // Where standard conditions have been defined (e.g., SWOP at nominal) // named conditions may suffice. Otherwise, detailed information is // needed. {"SAMPLE_BACKING", WRITE_STRINGIFY}, // Identifies the backing material used behind the sample during // measurement. Allowed values are black, white, or {"na". {"CHISQ_DOF", WRITE_STRINGIFY}, // Degrees of freedom associated with the Chi squared statistic // below properties are new in recent specs: {"MEASUREMENT_GEOMETRY", WRITE_STRINGIFY}, // The type of measurement, either reflection or transmission, should be indicated // along with details of the geometry and the aperture size and shape. For example, // for transmission measurements it is important to identify 0/diffuse, diffuse/0, // opal or integrating sphere, etc. For reflection it is important to identify 0/45, // 45/0, sphere (specular included or excluded), etc. {"FILTER", WRITE_STRINGIFY}, // Identifies the use of physical filter(s) during measurement. Typically used to // denote the use of filters such as none, D65, Red, Green or Blue. {"POLARIZATION", WRITE_STRINGIFY}, // Identifies the use of a physical polarization filter during measurement. Allowed // values are {"yes, white, none or na. {"WEIGHTING_FUNCTION", WRITE_PAIR}, // Indicates such functions as: the CIE standard observer functions used in the // calculation of various data parameters (2 degree and 10 degree), CIE standard // illuminant functions used in the calculation of various data parameters (e.g., D50, // D65, etc.), density status response, etc. If used there shall be at least one // name-value pair following the WEIGHTING_FUNCTION tag/keyword. The first attribute // in the set shall be {"name" and shall identify the particular parameter used. // The second shall be {"value" and shall provide the value associated with that name. // For ASCII data, a string containing the Name and Value attribute pairs shall follow // the weighting function keyword. A semi-colon separates attribute pairs from each // other and within the attribute the name and value are separated by a comma. {"COMPUTATIONAL_PARAMETER", WRITE_PAIR}, // Parameter that is used in computing a value from measured data. Name is the name // of the calculation, parameter is the name of the parameter used in the calculation // and value is the value of the parameter. {"TARGET_TYPE", WRITE_STRINGIFY}, // The type of target being measured, e.g. IT8.7/1, IT8.7/3, user defined, etc. {"COLORANT", WRITE_STRINGIFY}, // Identifies the colorant(s) used in creating the target. {"TABLE_DESCRIPTOR", WRITE_STRINGIFY}, // Describes the purpose or contents of a data table. {"TABLE_NAME", WRITE_STRINGIFY} // Provides a short name for a data table. }; #define NUMPREDEFINEDPROPS (sizeof(PredefinedProperties)/sizeof(PROPERTY)) // Predefined sample types on dataset static const char* PredefinedSampleID[] = { "SAMPLE_ID", // Identifies sample that data represents "STRING", // Identifies label, or other non-machine readable value. // Value must begin and end with a " symbol "CMYK_C", // Cyan component of CMYK data expressed as a percentage "CMYK_M", // Magenta component of CMYK data expressed as a percentage "CMYK_Y", // Yellow component of CMYK data expressed as a percentage "CMYK_K", // Black component of CMYK data expressed as a percentage "D_RED", // Red filter density "D_GREEN", // Green filter density "D_BLUE", // Blue filter density "D_VIS", // Visual filter density "D_MAJOR_FILTER", // Major filter d ensity "RGB_R", // Red component of RGB data "RGB_G", // Green component of RGB data "RGB_B", // Blue com ponent of RGB data "SPECTRAL_NM", // Wavelength of measurement expressed in nanometers "SPECTRAL_PCT", // Percentage reflectance/transmittance "SPECTRAL_DEC", // Reflectance/transmittance "XYZ_X", // X component of tristimulus data "XYZ_Y", // Y component of tristimulus data "XYZ_Z", // Z component of tristimulus data "XYY_X" // x component of chromaticity data "XYY_Y", // y component of chromaticity data "XYY_CAPY", // Y component of tristimulus data "LAB_L", // L* component of Lab data "LAB_A", // a* component of Lab data "LAB_B", // b* component of Lab data "LAB_C", // C*ab component of Lab data "LAB_H", // hab component of Lab data "LAB_DE", // CIE dE "LAB_DE_94", // CIE dE using CIE 94 "LAB_DE_CMC", // dE using CMC "LAB_DE_2000", // CIE dE using CIE DE 2000 "MEAN_DE", // Mean Delta E (LAB_DE) of samples compared to batch average // (Used for data files for ANSI IT8.7/1 and IT8.7/2 targets) "STDEV_X", // Standard deviation of X (tristimulus data) "STDEV_Y", // Standard deviation of Y (tristimulus data) "STDEV_Z", // Standard deviation of Z (tristimulus data) "STDEV_L", // Standard deviation of L* "STDEV_A", // Standard deviation of a* "STDEV_B", // Standard deviation of b* "STDEV_DE", // Standard deviation of CIE dE "CHI_SQD_PAR"}; // The average of the standard deviations of L*, a* and b*. It is // used to derive an estimate of the chi-squared parameter which is // recommended as the predictor of the variability of dE #define NUMPREDEFINEDSAMPLEID (sizeof(PredefinedSampleID)/sizeof(char *)) //Forward declaration of some internal functions static void* AllocChunk(cmsIT8* it8, cmsUInt32Number size); // Checks whatever c is a separator static cmsBool isseparator(int c) { return (c == ' ') || (c == '\t') ; } // Checks whatever c is a valid identifier char static cmsBool ismiddle(int c) { return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127)); } // Checks whatsever c is a valid identifier middle char. static cmsBool isidchar(int c) { return isalnum(c) || ismiddle(c); } // Checks whatsever c is a valid identifier first char. static cmsBool isfirstidchar(int c) { return !isdigit(c) && ismiddle(c); } // Guess whether the supplied path looks like an absolute path static cmsBool isabsolutepath(const char *path) { char ThreeChars[4]; if(path == NULL) return FALSE; if (path[0] == 0) return FALSE; strncpy(ThreeChars, path, 3); ThreeChars[3] = 0; if(ThreeChars[0] == DIR_CHAR) return TRUE; #ifdef CMS_IS_WINDOWS_ if (isalpha((int) ThreeChars[0]) && ThreeChars[1] == ':') return TRUE; #endif return FALSE; } // Makes a file path based on a given reference path // NOTE: this function doesn't check if the path exists or even if it's legal static cmsBool BuildAbsolutePath(const char *relPath, const char *basePath, char *buffer, cmsUInt32Number MaxLen) { char *tail; cmsUInt32Number len; // Already absolute? if (isabsolutepath(relPath)) { strncpy(buffer, relPath, MaxLen); buffer[MaxLen-1] = 0; return TRUE; } // No, search for last strncpy(buffer, basePath, MaxLen); buffer[MaxLen-1] = 0; tail = strrchr(buffer, DIR_CHAR); if (tail == NULL) return FALSE; // Is not absolute and has no separators?? len = (cmsUInt32Number) (tail - buffer); if (len >= MaxLen) return FALSE; // No need to assure zero terminator over here strncpy(tail + 1, relPath, MaxLen - len); return TRUE; } // Make sure no exploit is being even tried static const char* NoMeta(const char* str) { if (strchr(str, '%') != NULL) return "**** CORRUPTED FORMAT STRING ***"; return str; } // Syntax error static cmsBool SynError(cmsIT8* it8, const char *Txt, ...) { char Buffer[256], ErrMsg[1024]; va_list args; va_start(args, Txt); vsnprintf(Buffer, 255, Txt, args); Buffer[255] = 0; va_end(args); snprintf(ErrMsg, 1023, "%s: Line %d, %s", it8->FileStack[it8 ->IncludeSP]->FileName, it8->lineno, Buffer); ErrMsg[1023] = 0; it8->sy = SSYNERROR; cmsSignalError(it8 ->ContextID, cmsERROR_CORRUPTION_DETECTED, "%s", ErrMsg); return FALSE; } // Check if current symbol is same as specified. issue an error else. static cmsBool Check(cmsIT8* it8, SYMBOL sy, const char* Err) { if (it8 -> sy != sy) return SynError(it8, NoMeta(Err)); return TRUE; } // Read Next character from stream static void NextCh(cmsIT8* it8) { if (it8 -> FileStack[it8 ->IncludeSP]->Stream) { it8 ->ch = fgetc(it8 ->FileStack[it8 ->IncludeSP]->Stream); if (feof(it8 -> FileStack[it8 ->IncludeSP]->Stream)) { if (it8 ->IncludeSP > 0) { fclose(it8 ->FileStack[it8->IncludeSP--]->Stream); it8 -> ch = ' '; // Whitespace to be ignored } else it8 ->ch = 0; // EOF } } else { it8->ch = *it8->Source; if (it8->ch) it8->Source++; } } // Try to see if current identifier is a keyword, if so return the referred symbol static SYMBOL BinSrchKey(const char *id) { int l = 1; int r = NUMKEYS; int x, res; while (r >= l) { x = (l+r)/2; res = cmsstrcasecmp(id, TabKeys[x-1].id); if (res == 0) return TabKeys[x-1].sy; if (res < 0) r = x - 1; else l = x + 1; } return SNONE; } // 10 ^n static cmsFloat64Number xpow10(int n) { return pow(10, (cmsFloat64Number) n); } // Reads a Real number, tries to follow from integer number static void ReadReal(cmsIT8* it8, int inum) { it8->dnum = (cmsFloat64Number) inum; while (isdigit(it8->ch)) { it8->dnum = it8->dnum * 10.0 + (it8->ch - '0'); NextCh(it8); } if (it8->ch == '.') { // Decimal point cmsFloat64Number frac = 0.0; // fraction int prec = 0; // precision NextCh(it8); // Eats dec. point while (isdigit(it8->ch)) { frac = frac * 10.0 + (it8->ch - '0'); prec++; NextCh(it8); } it8->dnum = it8->dnum + (frac / xpow10(prec)); } // Exponent, example 34.00E+20 if (toupper(it8->ch) == 'E') { int e; int sgn; NextCh(it8); sgn = 1; if (it8->ch == '-') { sgn = -1; NextCh(it8); } else if (it8->ch == '+') { sgn = +1; NextCh(it8); } e = 0; while (isdigit(it8->ch)) { if ((cmsFloat64Number) e * 10L < INT_MAX) e = e * 10 + (it8->ch - '0'); NextCh(it8); } e = sgn*e; it8 -> dnum = it8 -> dnum * xpow10(e); } } // Parses a float number // This can not call directly atof because it uses locale dependant // parsing, while CCMX files always use . as decimal separator static cmsFloat64Number ParseFloatNumber(const char *Buffer) { cmsFloat64Number dnum = 0.0; int sign = 1; // keep safe if (Buffer == NULL) return 0.0; if (*Buffer == '-' || *Buffer == '+') { sign = (*Buffer == '-') ? -1 : 1; Buffer++; } while (*Buffer && isdigit((int) *Buffer)) { dnum = dnum * 10.0 + (*Buffer - '0'); if (*Buffer) Buffer++; } if (*Buffer == '.') { cmsFloat64Number frac = 0.0; // fraction int prec = 0; // precission if (*Buffer) Buffer++; while (*Buffer && isdigit((int) *Buffer)) { frac = frac * 10.0 + (*Buffer - '0'); prec++; if (*Buffer) Buffer++; } dnum = dnum + (frac / xpow10(prec)); } // Exponent, example 34.00E+20 if (*Buffer && toupper(*Buffer) == 'E') { int e; int sgn; if (*Buffer) Buffer++; sgn = 1; if (*Buffer == '-') { sgn = -1; if (*Buffer) Buffer++; } else if (*Buffer == '+') { sgn = +1; if (*Buffer) Buffer++; } e = 0; while (*Buffer && isdigit((int) *Buffer)) { if ((cmsFloat64Number) e * 10L < INT_MAX) e = e * 10 + (*Buffer - '0'); if (*Buffer) Buffer++; } e = sgn*e; dnum = dnum * xpow10(e); } return sign * dnum; } // Reads next symbol static void InSymbol(cmsIT8* it8) { register char *idptr; register int k; SYMBOL key; int sng; do { while (isseparator(it8->ch)) NextCh(it8); if (isfirstidchar(it8->ch)) { // Identifier k = 0; idptr = it8->id; do { if (++k < MAXID) *idptr++ = (char) it8->ch; NextCh(it8); } while (isidchar(it8->ch)); *idptr = '\0'; key = BinSrchKey(it8->id); if (key == SNONE) it8->sy = SIDENT; else it8->sy = key; } else // Is a number? if (isdigit(it8->ch) || it8->ch == '.' || it8->ch == '-' || it8->ch == '+') { int sign = 1; if (it8->ch == '-') { sign = -1; NextCh(it8); } it8->inum = 0; it8->sy = SINUM; if (it8->ch == '0') { // 0xnnnn (Hexa) or 0bnnnn (Binary) NextCh(it8); if (toupper(it8->ch) == 'X') { int j; NextCh(it8); while (isxdigit(it8->ch)) { it8->ch = toupper(it8->ch); if (it8->ch >= 'A' && it8->ch <= 'F') j = it8->ch -'A'+10; else j = it8->ch - '0'; if ((long) it8->inum * 16L > (long) INT_MAX) { SynError(it8, "Invalid hexadecimal number"); return; } it8->inum = it8->inum * 16 + j; NextCh(it8); } return; } if (toupper(it8->ch) == 'B') { // Binary int j; NextCh(it8); while (it8->ch == '0' || it8->ch == '1') { j = it8->ch - '0'; if ((long) it8->inum * 2L > (long) INT_MAX) { SynError(it8, "Invalid binary number"); return; } it8->inum = it8->inum * 2 + j; NextCh(it8); } return; } } while (isdigit(it8->ch)) { if ((long) it8->inum * 10L > (long) INT_MAX) { ReadReal(it8, it8->inum); it8->sy = SDNUM; it8->dnum *= sign; return; } it8->inum = it8->inum * 10 + (it8->ch - '0'); NextCh(it8); } if (it8->ch == '.') { ReadReal(it8, it8->inum); it8->sy = SDNUM; it8->dnum *= sign; return; } it8 -> inum *= sign; // Special case. Numbers followed by letters are taken as identifiers if (isidchar(it8 ->ch)) { if (it8 ->sy == SINUM) { sprintf(it8->id, "%d", it8->inum); } else { sprintf(it8->id, it8 ->DoubleFormatter, it8->dnum); } k = (int) strlen(it8 ->id); idptr = it8 ->id + k; do { if (++k < MAXID) *idptr++ = (char) it8->ch; NextCh(it8); } while (isidchar(it8->ch)); *idptr = '\0'; it8->sy = SIDENT; } return; } else switch ((int) it8->ch) { // EOF marker -- ignore it case '\x1a': NextCh(it8); break; // Eof stream markers case 0: case -1: it8->sy = SEOF; break; // Next line case '\r': NextCh(it8); if (it8 ->ch == '\n') NextCh(it8); it8->sy = SEOLN; it8->lineno++; break; case '\n': NextCh(it8); it8->sy = SEOLN; it8->lineno++; break; // Comment case '#': NextCh(it8); while (it8->ch && it8->ch != '\n' && it8->ch != '\r') NextCh(it8); it8->sy = SCOMMENT; break; // String. case '\'': case '\"': idptr = it8->str; sng = it8->ch; k = 0; NextCh(it8); while (k < MAXSTR && it8->ch != sng) { if (it8->ch == '\n'|| it8->ch == '\r') k = MAXSTR+1; else { *idptr++ = (char) it8->ch; NextCh(it8); k++; } } it8->sy = SSTRING; *idptr = '\0'; NextCh(it8); break; default: SynError(it8, "Unrecognized character: 0x%x", it8 ->ch); return; } } while (it8->sy == SCOMMENT); // Handle the include special token if (it8 -> sy == SINCLUDE) { FILECTX* FileNest; if(it8 -> IncludeSP >= (MAXINCLUDE-1)) { SynError(it8, "Too many recursion levels"); return; } InSymbol(it8); if (!Check(it8, SSTRING, "Filename expected")) return; FileNest = it8 -> FileStack[it8 -> IncludeSP + 1]; if(FileNest == NULL) { FileNest = it8 ->FileStack[it8 -> IncludeSP + 1] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX)); //if(FileNest == NULL) // TODO: how to manage out-of-memory conditions? } if (BuildAbsolutePath(it8->str, it8->FileStack[it8->IncludeSP]->FileName, FileNest->FileName, cmsMAX_PATH-1) == FALSE) { SynError(it8, "File path too long"); return; } FileNest->Stream = fopen(FileNest->FileName, "rt"); if (FileNest->Stream == NULL) { SynError(it8, "File %s not found", FileNest->FileName); return; } it8->IncludeSP++; it8 ->ch = ' '; InSymbol(it8); } } // Checks end of line separator static cmsBool CheckEOLN(cmsIT8* it8) { if (!Check(it8, SEOLN, "Expected separator")) return FALSE; while (it8 -> sy == SEOLN) InSymbol(it8); return TRUE; } // Skip a symbol static void Skip(cmsIT8* it8, SYMBOL sy) { if (it8->sy == sy && it8->sy != SEOF) InSymbol(it8); } // Skip multiple EOLN static void SkipEOLN(cmsIT8* it8) { while (it8->sy == SEOLN) { InSymbol(it8); } } // Returns a string holding current value static cmsBool GetVal(cmsIT8* it8, char* Buffer, cmsUInt32Number max, const char* ErrorTitle) { switch (it8->sy) { case SEOLN: // Empty value Buffer[0]=0; break; case SIDENT: strncpy(Buffer, it8->id, max); Buffer[max-1]=0; break; case SINUM: snprintf(Buffer, max, "%d", it8 -> inum); break; case SDNUM: snprintf(Buffer, max, it8->DoubleFormatter, it8 -> dnum); break; case SSTRING: strncpy(Buffer, it8->str, max); Buffer[max-1] = 0; break; default: return SynError(it8, "%s", ErrorTitle); } Buffer[max] = 0; return TRUE; } // ---------------------------------------------------------- Table static TABLE* GetTable(cmsIT8* it8) { if ((it8 -> nTable >= it8 ->TablesCount)) { SynError(it8, "Table %d out of sequence", it8 -> nTable); return it8 -> Tab; } return it8 ->Tab + it8 ->nTable; } // ---------------------------------------------------------- Memory management // Frees an allocator and owned memory void CMSEXPORT cmsIT8Free(cmsHANDLE hIT8) { cmsIT8* it8 = (cmsIT8*) hIT8; if (it8 == NULL) return; if (it8->MemorySink) { OWNEDMEM* p; OWNEDMEM* n; for (p = it8->MemorySink; p != NULL; p = n) { n = p->Next; if (p->Ptr) _cmsFree(it8 ->ContextID, p->Ptr); _cmsFree(it8 ->ContextID, p); } } if (it8->MemoryBlock) _cmsFree(it8 ->ContextID, it8->MemoryBlock); _cmsFree(it8 ->ContextID, it8); } // Allocates a chunk of data, keep linked list static void* AllocBigBlock(cmsIT8* it8, cmsUInt32Number size) { OWNEDMEM* ptr1; void* ptr = _cmsMallocZero(it8->ContextID, size); if (ptr != NULL) { ptr1 = (OWNEDMEM*) _cmsMallocZero(it8 ->ContextID, sizeof(OWNEDMEM)); if (ptr1 == NULL) { _cmsFree(it8 ->ContextID, ptr); return NULL; } ptr1-> Ptr = ptr; ptr1-> Next = it8 -> MemorySink; it8 -> MemorySink = ptr1; } return ptr; } // Suballocator. static void* AllocChunk(cmsIT8* it8, cmsUInt32Number size) { cmsUInt32Number Free = it8 ->Allocator.BlockSize - it8 ->Allocator.Used; cmsUInt8Number* ptr; size = _cmsALIGNMEM(size); if (size > Free) { if (it8 -> Allocator.BlockSize == 0) it8 -> Allocator.BlockSize = 20*1024; else it8 ->Allocator.BlockSize *= 2; if (it8 ->Allocator.BlockSize < size) it8 ->Allocator.BlockSize = size; it8 ->Allocator.Used = 0; it8 ->Allocator.Block = (cmsUInt8Number*) AllocBigBlock(it8, it8 ->Allocator.BlockSize); } ptr = it8 ->Allocator.Block + it8 ->Allocator.Used; it8 ->Allocator.Used += size; return (void*) ptr; } // Allocates a string static char *AllocString(cmsIT8* it8, const char* str) { cmsUInt32Number Size = (cmsUInt32Number) strlen(str)+1; char *ptr; ptr = (char *) AllocChunk(it8, Size); if (ptr) strncpy (ptr, str, Size-1); return ptr; } // Searches through linked list static cmsBool IsAvailableOnList(KEYVALUE* p, const char* Key, const char* Subkey, KEYVALUE** LastPtr) { if (LastPtr) *LastPtr = p; for (; p != NULL; p = p->Next) { if (LastPtr) *LastPtr = p; if (*Key != '#') { // Comments are ignored if (cmsstrcasecmp(Key, p->Keyword) == 0) break; } } if (p == NULL) return FALSE; if (Subkey == 0) return TRUE; for (; p != NULL; p = p->NextSubkey) { if (p ->Subkey == NULL) continue; if (LastPtr) *LastPtr = p; if (cmsstrcasecmp(Subkey, p->Subkey) == 0) return TRUE; } return FALSE; } // Add a property into a linked list static KEYVALUE* AddToList(cmsIT8* it8, KEYVALUE** Head, const char *Key, const char *Subkey, const char* xValue, WRITEMODE WriteAs) { KEYVALUE* p; KEYVALUE* last; // Check if property is already in list if (IsAvailableOnList(*Head, Key, Subkey, &p)) { // This may work for editing properties // return SynError(it8, "duplicate key <%s>", Key); } else { last = p; // Allocate the container p = (KEYVALUE*) AllocChunk(it8, sizeof(KEYVALUE)); if (p == NULL) { SynError(it8, "AddToList: out of memory"); return NULL; } // Store name and value p->Keyword = AllocString(it8, Key); p->Subkey = (Subkey == NULL) ? NULL : AllocString(it8, Subkey); // Keep the container in our list if (*Head == NULL) { *Head = p; } else { if (Subkey != NULL && last != NULL) { last->NextSubkey = p; // If Subkey is not null, then last is the last property with the same key, // but not necessarily is the last property in the list, so we need to move // to the actual list end while (last->Next != NULL) last = last->Next; } if (last != NULL) last->Next = p; } p->Next = NULL; p->NextSubkey = NULL; } p->WriteAs = WriteAs; if (xValue != NULL) { p->Value = AllocString(it8, xValue); } else { p->Value = NULL; } return p; } static KEYVALUE* AddAvailableProperty(cmsIT8* it8, const char* Key, WRITEMODE as) { return AddToList(it8, &it8->ValidKeywords, Key, NULL, NULL, as); } static KEYVALUE* AddAvailableSampleID(cmsIT8* it8, const char* Key) { return AddToList(it8, &it8->ValidSampleID, Key, NULL, NULL, WRITE_UNCOOKED); } static void AllocTable(cmsIT8* it8) { TABLE* t; t = it8 ->Tab + it8 ->TablesCount; t->HeaderList = NULL; t->DataFormat = NULL; t->Data = NULL; it8 ->TablesCount++; } cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE IT8, cmsUInt32Number nTable) { cmsIT8* it8 = (cmsIT8*) IT8; if (nTable >= it8 ->TablesCount) { if (nTable == it8 ->TablesCount) { AllocTable(it8); } else { SynError(it8, "Table %d is out of sequence", nTable); return -1; } } it8 ->nTable = nTable; return (cmsInt32Number) nTable; } // Init an empty container cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID) { cmsIT8* it8; cmsUInt32Number i; it8 = (cmsIT8*) _cmsMallocZero(ContextID, sizeof(cmsIT8)); if (it8 == NULL) return NULL; AllocTable(it8); it8->MemoryBlock = NULL; it8->MemorySink = NULL; it8 ->nTable = 0; it8->ContextID = ContextID; it8->Allocator.Used = 0; it8->Allocator.Block = NULL; it8->Allocator.BlockSize = 0; it8->ValidKeywords = NULL; it8->ValidSampleID = NULL; it8 -> sy = SNONE; it8 -> ch = ' '; it8 -> Source = NULL; it8 -> inum = 0; it8 -> dnum = 0.0; it8->FileStack[0] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX)); it8->IncludeSP = 0; it8 -> lineno = 1; strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT); cmsIT8SetSheetType((cmsHANDLE) it8, "CGATS.17"); // Initialize predefined properties & data for (i=0; i < NUMPREDEFINEDPROPS; i++) AddAvailableProperty(it8, PredefinedProperties[i].id, PredefinedProperties[i].as); for (i=0; i < NUMPREDEFINEDSAMPLEID; i++) AddAvailableSampleID(it8, PredefinedSampleID[i]); return (cmsHANDLE) it8; } const char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8) { return GetTable((cmsIT8*) hIT8)->SheetType; } cmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type) { TABLE* t = GetTable((cmsIT8*) hIT8); strncpy(t ->SheetType, Type, MAXSTR-1); t ->SheetType[MAXSTR-1] = 0; return TRUE; } cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* Val) { cmsIT8* it8 = (cmsIT8*) hIT8; if (!Val) return FALSE; if (!*Val) return FALSE; return AddToList(it8, &GetTable(it8)->HeaderList, "# ", NULL, Val, WRITE_UNCOOKED) != NULL; } // Sets a property cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* Key, const char *Val) { cmsIT8* it8 = (cmsIT8*) hIT8; if (!Val) return FALSE; if (!*Val) return FALSE; return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Val, WRITE_STRINGIFY) != NULL; } cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val) { cmsIT8* it8 = (cmsIT8*) hIT8; char Buffer[1024]; sprintf(Buffer, it8->DoubleFormatter, Val); return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_UNCOOKED) != NULL; } cmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val) { cmsIT8* it8 = (cmsIT8*) hIT8; char Buffer[1024]; sprintf(Buffer, "%u", Val); return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_HEXADECIMAL) != NULL; } cmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer) { cmsIT8* it8 = (cmsIT8*) hIT8; return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Buffer, WRITE_UNCOOKED) != NULL; } cmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer) { cmsIT8* it8 = (cmsIT8*) hIT8; return AddToList(it8, &GetTable(it8)->HeaderList, Key, SubKey, Buffer, WRITE_PAIR) != NULL; } // Gets a property const char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* Key) { cmsIT8* it8 = (cmsIT8*) hIT8; KEYVALUE* p; if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, NULL, &p)) { return p -> Value; } return NULL; } cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp) { const char *v = cmsIT8GetProperty(hIT8, cProp); if (v == NULL) return 0.0; return ParseFloatNumber(v); } const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey) { cmsIT8* it8 = (cmsIT8*) hIT8; KEYVALUE* p; if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, SubKey, &p)) { return p -> Value; } return NULL; } // ----------------------------------------------------------------- Datasets static void AllocateDataFormat(cmsIT8* it8) { TABLE* t = GetTable(it8); if (t -> DataFormat) return; // Already allocated t -> nSamples = (int) cmsIT8GetPropertyDbl(it8, "NUMBER_OF_FIELDS"); if (t -> nSamples <= 0) { SynError(it8, "AllocateDataFormat: Unknown NUMBER_OF_FIELDS"); t -> nSamples = 10; } t -> DataFormat = (char**) AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * sizeof(char *)); if (t->DataFormat == NULL) { SynError(it8, "AllocateDataFormat: Unable to allocate dataFormat array"); } } static const char *GetDataFormat(cmsIT8* it8, int n) { TABLE* t = GetTable(it8); if (t->DataFormat) return t->DataFormat[n]; return NULL; } static cmsBool SetDataFormat(cmsIT8* it8, int n, const char *label) { TABLE* t = GetTable(it8); if (!t->DataFormat) AllocateDataFormat(it8); if (n > t -> nSamples) { SynError(it8, "More than NUMBER_OF_FIELDS fields."); return FALSE; } if (t->DataFormat) { t->DataFormat[n] = AllocString(it8, label); } return TRUE; } cmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE h, int n, const char *Sample) { cmsIT8* it8 = (cmsIT8*) h; return SetDataFormat(it8, n, Sample); } static void AllocateDataSet(cmsIT8* it8) { TABLE* t = GetTable(it8); if (t -> Data) return; // Already allocated t-> nSamples = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS")); t-> nPatches = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS")); t-> Data = (char**)AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * ((cmsUInt32Number) t->nPatches + 1) *sizeof (char*)); if (t->Data == NULL) { SynError(it8, "AllocateDataSet: Unable to allocate data array"); } } static char* GetData(cmsIT8* it8, int nSet, int nField) { TABLE* t = GetTable(it8); int nSamples = t -> nSamples; int nPatches = t -> nPatches; if (nSet >= nPatches || nField >= nSamples) return NULL; if (!t->Data) return NULL; return t->Data [nSet * nSamples + nField]; } static cmsBool SetData(cmsIT8* it8, int nSet, int nField, const char *Val) { TABLE* t = GetTable(it8); if (!t->Data) AllocateDataSet(it8); if (!t->Data) return FALSE; if (nSet > t -> nPatches || nSet < 0) { return SynError(it8, "Patch %d out of range, there are %d patches", nSet, t -> nPatches); } if (nField > t ->nSamples || nField < 0) { return SynError(it8, "Sample %d out of range, there are %d samples", nField, t ->nSamples); } t->Data [nSet * t -> nSamples + nField] = AllocString(it8, Val); return TRUE; } // --------------------------------------------------------------- File I/O // Writes a string to file static void WriteStr(SAVESTREAM* f, const char *str) { cmsUInt32Number len; if (str == NULL) str = " "; // Length to write len = (cmsUInt32Number) strlen(str); f ->Used += len; if (f ->stream) { // Should I write it to a file? if (fwrite(str, 1, len, f->stream) != len) { cmsSignalError(0, cmsERROR_WRITE, "Write to file error in CGATS parser"); return; } } else { // Or to a memory block? if (f ->Base) { // Am I just counting the bytes? if (f ->Used > f ->Max) { cmsSignalError(0, cmsERROR_WRITE, "Write to memory overflows in CGATS parser"); return; } memmove(f ->Ptr, str, len); f->Ptr += len; } } } // Write formatted static void Writef(SAVESTREAM* f, const char* frm, ...) { char Buffer[4096]; va_list args; va_start(args, frm); vsnprintf(Buffer, 4095, frm, args); Buffer[4095] = 0; WriteStr(f, Buffer); va_end(args); } // Writes full header static void WriteHeader(cmsIT8* it8, SAVESTREAM* fp) { KEYVALUE* p; TABLE* t = GetTable(it8); // Writes the type WriteStr(fp, t->SheetType); WriteStr(fp, "\n"); for (p = t->HeaderList; (p != NULL); p = p->Next) { if (*p ->Keyword == '#') { char* Pt; WriteStr(fp, "#\n# "); for (Pt = p ->Value; *Pt; Pt++) { Writef(fp, "%c", *Pt); if (*Pt == '\n') { WriteStr(fp, "# "); } } WriteStr(fp, "\n#\n"); continue; } if (!IsAvailableOnList(it8-> ValidKeywords, p->Keyword, NULL, NULL)) { #ifdef CMS_STRICT_CGATS WriteStr(fp, "KEYWORD\t\""); WriteStr(fp, p->Keyword); WriteStr(fp, "\"\n"); #endif AddAvailableProperty(it8, p->Keyword, WRITE_UNCOOKED); } WriteStr(fp, p->Keyword); if (p->Value) { switch (p ->WriteAs) { case WRITE_UNCOOKED: Writef(fp, "\t%s", p ->Value); break; case WRITE_STRINGIFY: Writef(fp, "\t\"%s\"", p->Value ); break; case WRITE_HEXADECIMAL: Writef(fp, "\t0x%X", atoi(p ->Value)); break; case WRITE_BINARY: Writef(fp, "\t0x%B", atoi(p ->Value)); break; case WRITE_PAIR: Writef(fp, "\t\"%s,%s\"", p->Subkey, p->Value); break; default: SynError(it8, "Unknown write mode %d", p ->WriteAs); return; } } WriteStr (fp, "\n"); } } // Writes the data format static void WriteDataFormat(SAVESTREAM* fp, cmsIT8* it8) { int i, nSamples; TABLE* t = GetTable(it8); if (!t -> DataFormat) return; WriteStr(fp, "BEGIN_DATA_FORMAT\n"); WriteStr(fp, " "); nSamples = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS")); for (i = 0; i < nSamples; i++) { WriteStr(fp, t->DataFormat[i]); WriteStr(fp, ((i == (nSamples-1)) ? "\n" : "\t")); } WriteStr (fp, "END_DATA_FORMAT\n"); } // Writes data array static void WriteData(SAVESTREAM* fp, cmsIT8* it8) { int i, j; TABLE* t = GetTable(it8); if (!t->Data) return; WriteStr (fp, "BEGIN_DATA\n"); t->nPatches = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS")); for (i = 0; i < t-> nPatches; i++) { WriteStr(fp, " "); for (j = 0; j < t->nSamples; j++) { char *ptr = t->Data[i*t->nSamples+j]; if (ptr == NULL) WriteStr(fp, "\"\""); else { // If value contains whitespace, enclose within quote if (strchr(ptr, ' ') != NULL) { WriteStr(fp, "\""); WriteStr(fp, ptr); WriteStr(fp, "\""); } else WriteStr(fp, ptr); } WriteStr(fp, ((j == (t->nSamples-1)) ? "\n" : "\t")); } } WriteStr (fp, "END_DATA\n"); } // Saves whole file cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName) { SAVESTREAM sd; cmsUInt32Number i; cmsIT8* it8 = (cmsIT8*) hIT8; memset(&sd, 0, sizeof(sd)); sd.stream = fopen(cFileName, "wt"); if (!sd.stream) return FALSE; for (i=0; i < it8 ->TablesCount; i++) { cmsIT8SetTable(hIT8, i); WriteHeader(it8, &sd); WriteDataFormat(&sd, it8); WriteData(&sd, it8); } if (fclose(sd.stream) != 0) return FALSE; return TRUE; } // Saves to memory cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded) { SAVESTREAM sd; cmsUInt32Number i; cmsIT8* it8 = (cmsIT8*) hIT8; memset(&sd, 0, sizeof(sd)); sd.stream = NULL; sd.Base = (cmsUInt8Number*) MemPtr; sd.Ptr = sd.Base; sd.Used = 0; if (sd.Base) sd.Max = *BytesNeeded; // Write to memory? else sd.Max = 0; // Just counting the needed bytes for (i=0; i < it8 ->TablesCount; i++) { cmsIT8SetTable(hIT8, i); WriteHeader(it8, &sd); WriteDataFormat(&sd, it8); WriteData(&sd, it8); } sd.Used++; // The \0 at the very end if (sd.Base) *sd.Ptr = 0; *BytesNeeded = sd.Used; return TRUE; } // -------------------------------------------------------------- Higer level parsing static cmsBool DataFormatSection(cmsIT8* it8) { int iField = 0; TABLE* t = GetTable(it8); InSymbol(it8); // Eats "BEGIN_DATA_FORMAT" CheckEOLN(it8); while (it8->sy != SEND_DATA_FORMAT && it8->sy != SEOLN && it8->sy != SEOF && it8->sy != SSYNERROR) { if (it8->sy != SIDENT) { return SynError(it8, "Sample type expected"); } if (!SetDataFormat(it8, iField, it8->id)) return FALSE; iField++; InSymbol(it8); SkipEOLN(it8); } SkipEOLN(it8); Skip(it8, SEND_DATA_FORMAT); SkipEOLN(it8); if (iField != t ->nSamples) { SynError(it8, "Count mismatch. NUMBER_OF_FIELDS was %d, found %d\n", t ->nSamples, iField); } return TRUE; } static cmsBool DataSection (cmsIT8* it8) { int iField = 0; int iSet = 0; char Buffer[256]; TABLE* t = GetTable(it8); InSymbol(it8); // Eats "BEGIN_DATA" CheckEOLN(it8); if (!t->Data) AllocateDataSet(it8); while (it8->sy != SEND_DATA && it8->sy != SEOF) { if (iField >= t -> nSamples) { iField = 0; iSet++; } if (it8->sy != SEND_DATA && it8->sy != SEOF) { if (!GetVal(it8, Buffer, 255, "Sample data expected")) return FALSE; if (!SetData(it8, iSet, iField, Buffer)) return FALSE; iField++; InSymbol(it8); SkipEOLN(it8); } } SkipEOLN(it8); Skip(it8, SEND_DATA); SkipEOLN(it8); // Check for data completion. if ((iSet+1) != t -> nPatches) return SynError(it8, "Count mismatch. NUMBER_OF_SETS was %d, found %d\n", t ->nPatches, iSet+1); return TRUE; } static cmsBool HeaderSection(cmsIT8* it8) { char VarName[MAXID]; char Buffer[MAXSTR]; KEYVALUE* Key; while (it8->sy != SEOF && it8->sy != SSYNERROR && it8->sy != SBEGIN_DATA_FORMAT && it8->sy != SBEGIN_DATA) { switch (it8 -> sy) { case SKEYWORD: InSymbol(it8); if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE; if (!AddAvailableProperty(it8, Buffer, WRITE_UNCOOKED)) return FALSE; InSymbol(it8); break; case SDATA_FORMAT_ID: InSymbol(it8); if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE; if (!AddAvailableSampleID(it8, Buffer)) return FALSE; InSymbol(it8); break; case SIDENT: strncpy(VarName, it8->id, MAXID-1); VarName[MAXID-1] = 0; if (!IsAvailableOnList(it8-> ValidKeywords, VarName, NULL, &Key)) { #ifdef CMS_STRICT_CGATS return SynError(it8, "Undefined keyword '%s'", VarName); #else Key = AddAvailableProperty(it8, VarName, WRITE_UNCOOKED); if (Key == NULL) return FALSE; #endif } InSymbol(it8); if (!GetVal(it8, Buffer, MAXSTR-1, "Property data expected")) return FALSE; if(Key->WriteAs != WRITE_PAIR) { AddToList(it8, &GetTable(it8)->HeaderList, VarName, NULL, Buffer, (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED); } else { const char *Subkey; char *Nextkey; if (it8->sy != SSTRING) return SynError(it8, "Invalid value '%s' for property '%s'.", Buffer, VarName); // chop the string as a list of "subkey, value" pairs, using ';' as a separator for (Subkey = Buffer; Subkey != NULL; Subkey = Nextkey) { char *Value, *temp; // identify token pair boundary Nextkey = (char*) strchr(Subkey, ';'); if(Nextkey) *Nextkey++ = '\0'; // for each pair, split the subkey and the value Value = (char*) strrchr(Subkey, ','); if(Value == NULL) return SynError(it8, "Invalid value for property '%s'.", VarName); // gobble the spaces before the coma, and the coma itself temp = Value++; do *temp-- = '\0'; while(temp >= Subkey && *temp == ' '); // gobble any space at the right temp = Value + strlen(Value) - 1; while(*temp == ' ') *temp-- = '\0'; // trim the strings from the left Subkey += strspn(Subkey, " "); Value += strspn(Value, " "); if(Subkey[0] == 0 || Value[0] == 0) return SynError(it8, "Invalid value for property '%s'.", VarName); AddToList(it8, &GetTable(it8)->HeaderList, VarName, Subkey, Value, WRITE_PAIR); } } InSymbol(it8); break; case SEOLN: break; default: return SynError(it8, "expected keyword or identifier"); } SkipEOLN(it8); } return TRUE; } static void ReadType(cmsIT8* it8, char* SheetTypePtr) { // First line is a very special case. while (isseparator(it8->ch)) NextCh(it8); while (it8->ch != '\r' && it8 ->ch != '\n' && it8->ch != '\t' && it8 -> ch != -1) { *SheetTypePtr++= (char) it8 ->ch; NextCh(it8); } *SheetTypePtr = 0; } static cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet) { char* SheetTypePtr = it8 ->Tab[0].SheetType; if (nosheet == 0) { ReadType(it8, SheetTypePtr); } InSymbol(it8); SkipEOLN(it8); while (it8-> sy != SEOF && it8-> sy != SSYNERROR) { switch (it8 -> sy) { case SBEGIN_DATA_FORMAT: if (!DataFormatSection(it8)) return FALSE; break; case SBEGIN_DATA: if (!DataSection(it8)) return FALSE; if (it8 -> sy != SEOF) { AllocTable(it8); it8 ->nTable = it8 ->TablesCount - 1; // Read sheet type if present. We only support identifier and string. // is a type string // anything else, is not a type string if (nosheet == 0) { if (it8 ->sy == SIDENT) { // May be a type sheet or may be a prop value statement. We cannot use insymbol in // this special case... while (isseparator(it8->ch)) NextCh(it8); // If a newline is found, then this is a type string if (it8 ->ch == '\n' || it8->ch == '\r') { cmsIT8SetSheetType(it8, it8 ->id); InSymbol(it8); } else { // It is not. Just continue cmsIT8SetSheetType(it8, ""); } } else // Validate quoted strings if (it8 ->sy == SSTRING) { cmsIT8SetSheetType(it8, it8 ->str); InSymbol(it8); } } } break; case SEOLN: SkipEOLN(it8); break; default: if (!HeaderSection(it8)) return FALSE; } } return (it8 -> sy != SSYNERROR); } // Init usefull pointers static void CookPointers(cmsIT8* it8) { int idField, i; char* Fld; cmsUInt32Number j; cmsUInt32Number nOldTable = it8 ->nTable; for (j=0; j < it8 ->TablesCount; j++) { TABLE* t = it8 ->Tab + j; t -> SampleID = 0; it8 ->nTable = j; for (idField = 0; idField < t -> nSamples; idField++) { if (t ->DataFormat == NULL){ SynError(it8, "Undefined DATA_FORMAT"); return; } Fld = t->DataFormat[idField]; if (!Fld) continue; if (cmsstrcasecmp(Fld, "SAMPLE_ID") == 0) { t -> SampleID = idField; for (i=0; i < t -> nPatches; i++) { char *Data = GetData(it8, i, idField); if (Data) { char Buffer[256]; strncpy(Buffer, Data, 255); Buffer[255] = 0; if (strlen(Buffer) <= strlen(Data)) strcpy(Data, Buffer); else SetData(it8, i, idField, Buffer); } } } // "LABEL" is an extension. It keeps references to forward tables if ((cmsstrcasecmp(Fld, "LABEL") == 0) || Fld[0] == '$' ) { // Search for table references... for (i=0; i < t -> nPatches; i++) { char *Label = GetData(it8, i, idField); if (Label) { cmsUInt32Number k; // This is the label, search for a table containing // this property for (k=0; k < it8 ->TablesCount; k++) { TABLE* Table = it8 ->Tab + k; KEYVALUE* p; if (IsAvailableOnList(Table->HeaderList, Label, NULL, &p)) { // Available, keep type and table char Buffer[256]; char *Type = p ->Value; int nTable = (int) k; snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type ); SetData(it8, i, idField, Buffer); } } } } } } } it8 ->nTable = nOldTable; } // Try to infere if the file is a CGATS/IT8 file at all. Read first line // that should be something like some printable characters plus a \n // returns 0 if this is not like a CGATS, or an integer otherwise. This integer is the number of words in first line? static int IsMyBlock(cmsUInt8Number* Buffer, int n) { int words = 1, space = 0, quot = 0; int i; if (n < 10) return 0; // Too small if (n > 132) n = 132; for (i = 1; i < n; i++) { switch(Buffer[i]) { case '\n': case '\r': return ((quot == 1) || (words > 2)) ? 0 : words; case '\t': case ' ': if(!quot && !space) space = 1; break; case '\"': quot = !quot; break; default: if (Buffer[i] < 32) return 0; if (Buffer[i] > 127) return 0; words += space; space = 0; break; } } return 0; } static cmsBool IsMyFile(const char* FileName) { FILE *fp; cmsUInt32Number Size; cmsUInt8Number Ptr[133]; fp = fopen(FileName, "rt"); if (!fp) { cmsSignalError(0, cmsERROR_FILE, "File '%s' not found", FileName); return FALSE; } Size = (cmsUInt32Number) fread(Ptr, 1, 132, fp); if (fclose(fp) != 0) return FALSE; Ptr[Size] = '\0'; return IsMyBlock(Ptr, Size); } // ---------------------------------------------------------- Exported routines cmsHANDLE CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, void *Ptr, cmsUInt32Number len) { cmsHANDLE hIT8; cmsIT8* it8; int type; _cmsAssert(Ptr != NULL); _cmsAssert(len != 0); type = IsMyBlock((cmsUInt8Number*)Ptr, len); if (type == 0) return NULL; hIT8 = cmsIT8Alloc(ContextID); if (!hIT8) return NULL; it8 = (cmsIT8*) hIT8; it8 ->MemoryBlock = (char*) _cmsMalloc(ContextID, len + 1); strncpy(it8 ->MemoryBlock, (const char*) Ptr, len); it8 ->MemoryBlock[len] = 0; strncpy(it8->FileStack[0]->FileName, "", cmsMAX_PATH-1); it8-> Source = it8 -> MemoryBlock; if (!ParseIT8(it8, type-1)) { cmsIT8Free(hIT8); return FALSE; } CookPointers(it8); it8 ->nTable = 0; _cmsFree(ContextID, it8->MemoryBlock); it8 -> MemoryBlock = NULL; return hIT8; } cmsHANDLE CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName) { cmsHANDLE hIT8; cmsIT8* it8; int type; _cmsAssert(cFileName != NULL); type = IsMyFile(cFileName); if (type == 0) return NULL; hIT8 = cmsIT8Alloc(ContextID); it8 = (cmsIT8*) hIT8; if (!hIT8) return NULL; it8 ->FileStack[0]->Stream = fopen(cFileName, "rt"); if (!it8 ->FileStack[0]->Stream) { cmsIT8Free(hIT8); return NULL; } strncpy(it8->FileStack[0]->FileName, cFileName, cmsMAX_PATH-1); it8->FileStack[0]->FileName[cmsMAX_PATH-1] = 0; if (!ParseIT8(it8, type-1)) { fclose(it8 ->FileStack[0]->Stream); cmsIT8Free(hIT8); return NULL; } CookPointers(it8); it8 ->nTable = 0; if (fclose(it8 ->FileStack[0]->Stream)!= 0) { cmsIT8Free(hIT8); return NULL; } return hIT8; } int CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames) { cmsIT8* it8 = (cmsIT8*) hIT8; TABLE* t; _cmsAssert(hIT8 != NULL); t = GetTable(it8); if (SampleNames) *SampleNames = t -> DataFormat; return t -> nSamples; } cmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames) { cmsIT8* it8 = (cmsIT8*) hIT8; KEYVALUE* p; cmsUInt32Number n; char **Props; TABLE* t; _cmsAssert(hIT8 != NULL); t = GetTable(it8); // Pass#1 - count properties n = 0; for (p = t -> HeaderList; p != NULL; p = p->Next) { n++; } Props = (char **) AllocChunk(it8, sizeof(char *) * n); // Pass#2 - Fill pointers n = 0; for (p = t -> HeaderList; p != NULL; p = p->Next) { Props[n++] = p -> Keyword; } *PropertyNames = Props; return n; } cmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames) { cmsIT8* it8 = (cmsIT8*) hIT8; KEYVALUE *p, *tmp; cmsUInt32Number n; const char **Props; TABLE* t; _cmsAssert(hIT8 != NULL); t = GetTable(it8); if(!IsAvailableOnList(t->HeaderList, cProp, NULL, &p)) { *SubpropertyNames = 0; return 0; } // Pass#1 - count properties n = 0; for (tmp = p; tmp != NULL; tmp = tmp->NextSubkey) { if(tmp->Subkey != NULL) n++; } Props = (const char **) AllocChunk(it8, sizeof(char *) * n); // Pass#2 - Fill pointers n = 0; for (tmp = p; tmp != NULL; tmp = tmp->NextSubkey) { if(tmp->Subkey != NULL) Props[n++] = p ->Subkey; } *SubpropertyNames = Props; return n; } static int LocatePatch(cmsIT8* it8, const char* cPatch) { int i; const char *data; TABLE* t = GetTable(it8); for (i=0; i < t-> nPatches; i++) { data = GetData(it8, i, t->SampleID); if (data != NULL) { if (cmsstrcasecmp(data, cPatch) == 0) return i; } } // SynError(it8, "Couldn't find patch '%s'\n", cPatch); return -1; } static int LocateEmptyPatch(cmsIT8* it8) { int i; const char *data; TABLE* t = GetTable(it8); for (i=0; i < t-> nPatches; i++) { data = GetData(it8, i, t->SampleID); if (data == NULL) return i; } return -1; } static int LocateSample(cmsIT8* it8, const char* cSample) { int i; const char *fld; TABLE* t = GetTable(it8); for (i=0; i < t->nSamples; i++) { fld = GetDataFormat(it8, i); if (cmsstrcasecmp(fld, cSample) == 0) return i; } return -1; } int CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample) { cmsIT8* it8 = (cmsIT8*) hIT8; _cmsAssert(hIT8 != NULL); return LocateSample(it8, cSample); } const char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col) { cmsIT8* it8 = (cmsIT8*) hIT8; _cmsAssert(hIT8 != NULL); return GetData(it8, row, col); } cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col) { const char* Buffer; Buffer = cmsIT8GetDataRowCol(hIT8, row, col); if (Buffer == NULL) return 0.0; return ParseFloatNumber(Buffer); } cmsBool CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col, const char* Val) { cmsIT8* it8 = (cmsIT8*) hIT8; _cmsAssert(hIT8 != NULL); return SetData(it8, row, col, Val); } cmsBool CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col, cmsFloat64Number Val) { cmsIT8* it8 = (cmsIT8*) hIT8; char Buff[256]; _cmsAssert(hIT8 != NULL); sprintf(Buff, it8->DoubleFormatter, Val); return SetData(it8, row, col, Buff); } const char* CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample) { cmsIT8* it8 = (cmsIT8*) hIT8; int iField, iSet; _cmsAssert(hIT8 != NULL); iField = LocateSample(it8, cSample); if (iField < 0) { return NULL; } iSet = LocatePatch(it8, cPatch); if (iSet < 0) { return NULL; } return GetData(it8, iSet, iField); } cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE it8, const char* cPatch, const char* cSample) { const char* Buffer; Buffer = cmsIT8GetData(it8, cPatch, cSample); return ParseFloatNumber(Buffer); } cmsBool CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample, const char *Val) { cmsIT8* it8 = (cmsIT8*) hIT8; int iField, iSet; TABLE* t; _cmsAssert(hIT8 != NULL); t = GetTable(it8); iField = LocateSample(it8, cSample); if (iField < 0) return FALSE; if (t-> nPatches == 0) { AllocateDataFormat(it8); AllocateDataSet(it8); CookPointers(it8); } if (cmsstrcasecmp(cSample, "SAMPLE_ID") == 0) { iSet = LocateEmptyPatch(it8); if (iSet < 0) { return SynError(it8, "Couldn't add more patches '%s'\n", cPatch); } iField = t -> SampleID; } else { iSet = LocatePatch(it8, cPatch); if (iSet < 0) { return FALSE; } } return SetData(it8, iSet, iField, Val); } cmsBool CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch, const char* cSample, cmsFloat64Number Val) { cmsIT8* it8 = (cmsIT8*) hIT8; char Buff[256]; _cmsAssert(hIT8 != NULL); snprintf(Buff, 255, it8->DoubleFormatter, Val); return cmsIT8SetData(hIT8, cPatch, cSample, Buff); } // Buffer should get MAXSTR at least const char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer) { cmsIT8* it8 = (cmsIT8*) hIT8; TABLE* t; char* Data; _cmsAssert(hIT8 != NULL); t = GetTable(it8); Data = GetData(it8, nPatch, t->SampleID); if (!Data) return NULL; if (!buffer) return Data; strncpy(buffer, Data, MAXSTR-1); buffer[MAXSTR-1] = 0; return buffer; } int CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch) { _cmsAssert(hIT8 != NULL); return LocatePatch((cmsIT8*)hIT8, cPatch); } cmsUInt32Number CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8) { cmsIT8* it8 = (cmsIT8*) hIT8; _cmsAssert(hIT8 != NULL); return it8 ->TablesCount; } // This handles the "LABEL" extension. // Label, nTable, Type int CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType) { const char* cLabelFld; char Type[256], Label[256]; int nTable; _cmsAssert(hIT8 != NULL); if (cField != NULL && *cField == 0) cField = "LABEL"; if (cField == NULL) cField = "LABEL"; cLabelFld = cmsIT8GetData(hIT8, cSet, cField); if (!cLabelFld) return -1; if (sscanf(cLabelFld, "%255s %d %255s", Label, &nTable, Type) != 3) return -1; if (ExpectedType != NULL && *ExpectedType == 0) ExpectedType = NULL; if (ExpectedType) { if (cmsstrcasecmp(Type, ExpectedType) != 0) return -1; } return cmsIT8SetTable(hIT8, nTable); } cmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample) { cmsIT8* it8 = (cmsIT8*) hIT8; int pos; _cmsAssert(hIT8 != NULL); pos = LocateSample(it8, cSample); if(pos == -1) return FALSE; it8->Tab[it8->nTable].SampleID = pos; return TRUE; } void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter) { cmsIT8* it8 = (cmsIT8*) hIT8; _cmsAssert(hIT8 != NULL); if (Formatter == NULL) strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT); else strncpy(it8->DoubleFormatter, Formatter, sizeof(it8->DoubleFormatter)); it8 ->DoubleFormatter[sizeof(it8 ->DoubleFormatter)-1] = 0; } lcms2-2.6/src/cmspcs.c0000644002406300000240000006070012311617072014154 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // inter PCS conversions XYZ <-> CIE L* a* b* /* CIE 15:2004 CIELab is defined as: L* = 116*f(Y/Yn) - 16 0 <= L* <= 100 a* = 500*[f(X/Xn) - f(Y/Yn)] b* = 200*[f(Y/Yn) - f(Z/Zn)] and f(t) = t^(1/3) 1 >= t > (24/116)^3 (841/108)*t + (16/116) 0 <= t <= (24/116)^3 Reverse transform is: X = Xn*[a* / 500 + (L* + 16) / 116] ^ 3 if (X/Xn) > (24/116) = Xn*(a* / 500 + L* / 116) / 7.787 if (X/Xn) <= (24/116) PCS in Lab2 is encoded as: 8 bit Lab PCS: L* 0..100 into a 0..ff byte. a* t + 128 range is -128.0 +127.0 b* 16 bit Lab PCS: L* 0..100 into a 0..ff00 word. a* t + 128 range is -128.0 +127.9961 b* Interchange Space Component Actual Range Encoded Range CIE XYZ X 0 -> 1.99997 0x0000 -> 0xffff CIE XYZ Y 0 -> 1.99997 0x0000 -> 0xffff CIE XYZ Z 0 -> 1.99997 0x0000 -> 0xffff Version 2,3 ----------- CIELAB (16 bit) L* 0 -> 100.0 0x0000 -> 0xff00 CIELAB (16 bit) a* -128.0 -> +127.996 0x0000 -> 0x8000 -> 0xffff CIELAB (16 bit) b* -128.0 -> +127.996 0x0000 -> 0x8000 -> 0xffff Version 4 --------- CIELAB (16 bit) L* 0 -> 100.0 0x0000 -> 0xffff CIELAB (16 bit) a* -128.0 -> +127 0x0000 -> 0x8080 -> 0xffff CIELAB (16 bit) b* -128.0 -> +127 0x0000 -> 0x8080 -> 0xffff */ // Conversions void CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source) { cmsFloat64Number ISum; ISum = 1./(Source -> X + Source -> Y + Source -> Z); Dest -> x = (Source -> X) * ISum; Dest -> y = (Source -> Y) * ISum; Dest -> Y = Source -> Y; } void CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source) { Dest -> X = (Source -> x / Source -> y) * Source -> Y; Dest -> Y = Source -> Y; Dest -> Z = ((1 - Source -> x - Source -> y) / Source -> y) * Source -> Y; } static cmsFloat64Number f(cmsFloat64Number t) { const cmsFloat64Number Limit = (24.0/116.0) * (24.0/116.0) * (24.0/116.0); if (t <= Limit) return (841.0/108.0) * t + (16.0/116.0); else return pow(t, 1.0/3.0); } static cmsFloat64Number f_1(cmsFloat64Number t) { const cmsFloat64Number Limit = (24.0/116.0); if (t <= Limit) { return (108.0/841.0) * (t - (16.0/116.0)); } return t * t * t; } // Standard XYZ to Lab. it can handle negative XZY numbers in some cases void CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz) { cmsFloat64Number fx, fy, fz; if (WhitePoint == NULL) WhitePoint = cmsD50_XYZ(); fx = f(xyz->X / WhitePoint->X); fy = f(xyz->Y / WhitePoint->Y); fz = f(xyz->Z / WhitePoint->Z); Lab->L = 116.0*fy - 16.0; Lab->a = 500.0*(fx - fy); Lab->b = 200.0*(fy - fz); } // Standard XYZ to Lab. It can return negative XYZ in some cases void CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz, const cmsCIELab* Lab) { cmsFloat64Number x, y, z; if (WhitePoint == NULL) WhitePoint = cmsD50_XYZ(); y = (Lab-> L + 16.0) / 116.0; x = y + 0.002 * Lab -> a; z = y - 0.005 * Lab -> b; xyz -> X = f_1(x) * WhitePoint -> X; xyz -> Y = f_1(y) * WhitePoint -> Y; xyz -> Z = f_1(z) * WhitePoint -> Z; } static cmsFloat64Number L2float2(cmsUInt16Number v) { return (cmsFloat64Number) v / 652.800; } // the a/b part static cmsFloat64Number ab2float2(cmsUInt16Number v) { return ((cmsFloat64Number) v / 256.0) - 128.0; } static cmsUInt16Number L2Fix2(cmsFloat64Number L) { return _cmsQuickSaturateWord(L * 652.8); } static cmsUInt16Number ab2Fix2(cmsFloat64Number ab) { return _cmsQuickSaturateWord((ab + 128.0) * 256.0); } static cmsFloat64Number L2float4(cmsUInt16Number v) { return (cmsFloat64Number) v / 655.35; } // the a/b part static cmsFloat64Number ab2float4(cmsUInt16Number v) { return ((cmsFloat64Number) v / 257.0) - 128.0; } void CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3]) { Lab->L = L2float2(wLab[0]); Lab->a = ab2float2(wLab[1]); Lab->b = ab2float2(wLab[2]); } void CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3]) { Lab->L = L2float4(wLab[0]); Lab->a = ab2float4(wLab[1]); Lab->b = ab2float4(wLab[2]); } static cmsFloat64Number Clamp_L_doubleV2(cmsFloat64Number L) { const cmsFloat64Number L_max = (cmsFloat64Number) (0xFFFF * 100.0) / 0xFF00; if (L < 0) L = 0; if (L > L_max) L = L_max; return L; } static cmsFloat64Number Clamp_ab_doubleV2(cmsFloat64Number ab) { if (ab < MIN_ENCODEABLE_ab2) ab = MIN_ENCODEABLE_ab2; if (ab > MAX_ENCODEABLE_ab2) ab = MAX_ENCODEABLE_ab2; return ab; } void CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* fLab) { cmsCIELab Lab; Lab.L = Clamp_L_doubleV2(fLab ->L); Lab.a = Clamp_ab_doubleV2(fLab ->a); Lab.b = Clamp_ab_doubleV2(fLab ->b); wLab[0] = L2Fix2(Lab.L); wLab[1] = ab2Fix2(Lab.a); wLab[2] = ab2Fix2(Lab.b); } static cmsFloat64Number Clamp_L_doubleV4(cmsFloat64Number L) { if (L < 0) L = 0; if (L > 100.0) L = 100.0; return L; } static cmsFloat64Number Clamp_ab_doubleV4(cmsFloat64Number ab) { if (ab < MIN_ENCODEABLE_ab4) ab = MIN_ENCODEABLE_ab4; if (ab > MAX_ENCODEABLE_ab4) ab = MAX_ENCODEABLE_ab4; return ab; } static cmsUInt16Number L2Fix4(cmsFloat64Number L) { return _cmsQuickSaturateWord(L * 655.35); } static cmsUInt16Number ab2Fix4(cmsFloat64Number ab) { return _cmsQuickSaturateWord((ab + 128.0) * 257.0); } void CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* fLab) { cmsCIELab Lab; Lab.L = Clamp_L_doubleV4(fLab ->L); Lab.a = Clamp_ab_doubleV4(fLab ->a); Lab.b = Clamp_ab_doubleV4(fLab ->b); wLab[0] = L2Fix4(Lab.L); wLab[1] = ab2Fix4(Lab.a); wLab[2] = ab2Fix4(Lab.b); } // Auxiliar: convert to Radians static cmsFloat64Number RADIANS(cmsFloat64Number deg) { return (deg * M_PI) / 180.; } // Auxiliar: atan2 but operating in degrees and returning 0 if a==b==0 static cmsFloat64Number atan2deg(cmsFloat64Number a, cmsFloat64Number b) { cmsFloat64Number h; if (a == 0 && b == 0) h = 0; else h = atan2(a, b); h *= (180. / M_PI); while (h > 360.) h -= 360.; while ( h < 0) h += 360.; return h; } // Auxiliar: Square static cmsFloat64Number Sqr(cmsFloat64Number v) { return v * v; } // From cylindrical coordinates. No check is performed, then negative values are allowed void CMSEXPORT cmsLab2LCh(cmsCIELCh* LCh, const cmsCIELab* Lab) { LCh -> L = Lab -> L; LCh -> C = pow(Sqr(Lab ->a) + Sqr(Lab ->b), 0.5); LCh -> h = atan2deg(Lab ->b, Lab ->a); } // To cylindrical coordinates. No check is performed, then negative values are allowed void CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh) { cmsFloat64Number h = (LCh -> h * M_PI) / 180.0; Lab -> L = LCh -> L; Lab -> a = LCh -> C * cos(h); Lab -> b = LCh -> C * sin(h); } // In XYZ All 3 components are encoded using 1.15 fixed point static cmsUInt16Number XYZ2Fix(cmsFloat64Number d) { return _cmsQuickSaturateWord(d * 32768.0); } void CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ) { cmsCIEXYZ xyz; xyz.X = fXYZ -> X; xyz.Y = fXYZ -> Y; xyz.Z = fXYZ -> Z; // Clamp to encodeable values. if (xyz.Y <= 0) { xyz.X = 0; xyz.Y = 0; xyz.Z = 0; } if (xyz.X > MAX_ENCODEABLE_XYZ) xyz.X = MAX_ENCODEABLE_XYZ; if (xyz.X < 0) xyz.X = 0; if (xyz.Y > MAX_ENCODEABLE_XYZ) xyz.Y = MAX_ENCODEABLE_XYZ; if (xyz.Y < 0) xyz.Y = 0; if (xyz.Z > MAX_ENCODEABLE_XYZ) xyz.Z = MAX_ENCODEABLE_XYZ; if (xyz.Z < 0) xyz.Z = 0; XYZ[0] = XYZ2Fix(xyz.X); XYZ[1] = XYZ2Fix(xyz.Y); XYZ[2] = XYZ2Fix(xyz.Z); } // To convert from Fixed 1.15 point to cmsFloat64Number static cmsFloat64Number XYZ2float(cmsUInt16Number v) { cmsS15Fixed16Number fix32; // From 1.15 to 15.16 fix32 = v << 1; // From fixed 15.16 to cmsFloat64Number return _cms15Fixed16toDouble(fix32); } void CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fXYZ, const cmsUInt16Number XYZ[3]) { fXYZ -> X = XYZ2float(XYZ[0]); fXYZ -> Y = XYZ2float(XYZ[1]); fXYZ -> Z = XYZ2float(XYZ[2]); } // Returns dE on two Lab values cmsFloat64Number CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2) { cmsFloat64Number dL, da, db; dL = fabs(Lab1 -> L - Lab2 -> L); da = fabs(Lab1 -> a - Lab2 -> a); db = fabs(Lab1 -> b - Lab2 -> b); return pow(Sqr(dL) + Sqr(da) + Sqr(db), 0.5); } // Return the CIE94 Delta E cmsFloat64Number CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2) { cmsCIELCh LCh1, LCh2; cmsFloat64Number dE, dL, dC, dh, dhsq; cmsFloat64Number c12, sc, sh; dL = fabs(Lab1 ->L - Lab2 ->L); cmsLab2LCh(&LCh1, Lab1); cmsLab2LCh(&LCh2, Lab2); dC = fabs(LCh1.C - LCh2.C); dE = cmsDeltaE(Lab1, Lab2); dhsq = Sqr(dE) - Sqr(dL) - Sqr(dC); if (dhsq < 0) dh = 0; else dh = pow(dhsq, 0.5); c12 = sqrt(LCh1.C * LCh2.C); sc = 1.0 + (0.048 * c12); sh = 1.0 + (0.014 * c12); return sqrt(Sqr(dL) + Sqr(dC) / Sqr(sc) + Sqr(dh) / Sqr(sh)); } // Auxiliary static cmsFloat64Number ComputeLBFD(const cmsCIELab* Lab) { cmsFloat64Number yt; if (Lab->L > 7.996969) yt = (Sqr((Lab->L+16)/116)*((Lab->L+16)/116))*100; else yt = 100 * (Lab->L / 903.3); return (54.6 * (M_LOG10E * (log(yt + 1.5))) - 9.6); } // bfd - gets BFD(1:1) difference between Lab1, Lab2 cmsFloat64Number CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2) { cmsFloat64Number lbfd1,lbfd2,AveC,Aveh,dE,deltaL, deltaC,deltah,dc,t,g,dh,rh,rc,rt,bfd; cmsCIELCh LCh1, LCh2; lbfd1 = ComputeLBFD(Lab1); lbfd2 = ComputeLBFD(Lab2); deltaL = lbfd2 - lbfd1; cmsLab2LCh(&LCh1, Lab1); cmsLab2LCh(&LCh2, Lab2); deltaC = LCh2.C - LCh1.C; AveC = (LCh1.C+LCh2.C)/2; Aveh = (LCh1.h+LCh2.h)/2; dE = cmsDeltaE(Lab1, Lab2); if (Sqr(dE)>(Sqr(Lab2->L-Lab1->L)+Sqr(deltaC))) deltah = sqrt(Sqr(dE)-Sqr(Lab2->L-Lab1->L)-Sqr(deltaC)); else deltah =0; dc = 0.035 * AveC / (1 + 0.00365 * AveC)+0.521; g = sqrt(Sqr(Sqr(AveC))/(Sqr(Sqr(AveC))+14000)); t = 0.627+(0.055*cos((Aveh-254)/(180/M_PI))- 0.040*cos((2*Aveh-136)/(180/M_PI))+ 0.070*cos((3*Aveh-31)/(180/M_PI))+ 0.049*cos((4*Aveh+114)/(180/M_PI))- 0.015*cos((5*Aveh-103)/(180/M_PI))); dh = dc*(g*t+1-g); rh = -0.260*cos((Aveh-308)/(180/M_PI))- 0.379*cos((2*Aveh-160)/(180/M_PI))- 0.636*cos((3*Aveh+254)/(180/M_PI))+ 0.226*cos((4*Aveh+140)/(180/M_PI))- 0.194*cos((5*Aveh+280)/(180/M_PI)); rc = sqrt((AveC*AveC*AveC*AveC*AveC*AveC)/((AveC*AveC*AveC*AveC*AveC*AveC)+70000000)); rt = rh*rc; bfd = sqrt(Sqr(deltaL)+Sqr(deltaC/dc)+Sqr(deltah/dh)+(rt*(deltaC/dc)*(deltah/dh))); return bfd; } // cmc - CMC(l:c) difference between Lab1, Lab2 cmsFloat64Number CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c) { cmsFloat64Number dE,dL,dC,dh,sl,sc,sh,t,f,cmc; cmsCIELCh LCh1, LCh2; if (Lab1 ->L == 0 && Lab2 ->L == 0) return 0; cmsLab2LCh(&LCh1, Lab1); cmsLab2LCh(&LCh2, Lab2); dL = Lab2->L-Lab1->L; dC = LCh2.C-LCh1.C; dE = cmsDeltaE(Lab1, Lab2); if (Sqr(dE)>(Sqr(dL)+Sqr(dC))) dh = sqrt(Sqr(dE)-Sqr(dL)-Sqr(dC)); else dh =0; if ((LCh1.h > 164) && (LCh1.h < 345)) t = 0.56 + fabs(0.2 * cos(((LCh1.h + 168)/(180/M_PI)))); else t = 0.36 + fabs(0.4 * cos(((LCh1.h + 35 )/(180/M_PI)))); sc = 0.0638 * LCh1.C / (1 + 0.0131 * LCh1.C) + 0.638; sl = 0.040975 * Lab1->L /(1 + 0.01765 * Lab1->L); if (Lab1->L<16) sl = 0.511; f = sqrt((LCh1.C * LCh1.C * LCh1.C * LCh1.C)/((LCh1.C * LCh1.C * LCh1.C * LCh1.C)+1900)); sh = sc*(t*f+1-f); cmc = sqrt(Sqr(dL/(l*sl))+Sqr(dC/(c*sc))+Sqr(dh/sh)); return cmc; } // dE2000 The weightings KL, KC and KH can be modified to reflect the relative // importance of lightness, chroma and hue in different industrial applications cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh) { cmsFloat64Number L1 = Lab1->L; cmsFloat64Number a1 = Lab1->a; cmsFloat64Number b1 = Lab1->b; cmsFloat64Number C = sqrt( Sqr(a1) + Sqr(b1) ); cmsFloat64Number Ls = Lab2 ->L; cmsFloat64Number as = Lab2 ->a; cmsFloat64Number bs = Lab2 ->b; cmsFloat64Number Cs = sqrt( Sqr(as) + Sqr(bs) ); cmsFloat64Number G = 0.5 * ( 1 - sqrt(pow((C + Cs) / 2 , 7.0) / (pow((C + Cs) / 2, 7.0) + pow(25.0, 7.0) ) )); cmsFloat64Number a_p = (1 + G ) * a1; cmsFloat64Number b_p = b1; cmsFloat64Number C_p = sqrt( Sqr(a_p) + Sqr(b_p)); cmsFloat64Number h_p = atan2deg(b_p, a_p); cmsFloat64Number a_ps = (1 + G) * as; cmsFloat64Number b_ps = bs; cmsFloat64Number C_ps = sqrt(Sqr(a_ps) + Sqr(b_ps)); cmsFloat64Number h_ps = atan2deg(b_ps, a_ps); cmsFloat64Number meanC_p =(C_p + C_ps) / 2; cmsFloat64Number hps_plus_hp = h_ps + h_p; cmsFloat64Number hps_minus_hp = h_ps - h_p; cmsFloat64Number meanh_p = fabs(hps_minus_hp) <= 180.000001 ? (hps_plus_hp)/2 : (hps_plus_hp) < 360 ? (hps_plus_hp + 360)/2 : (hps_plus_hp - 360)/2; cmsFloat64Number delta_h = (hps_minus_hp) <= -180.000001 ? (hps_minus_hp + 360) : (hps_minus_hp) > 180 ? (hps_minus_hp - 360) : (hps_minus_hp); cmsFloat64Number delta_L = (Ls - L1); cmsFloat64Number delta_C = (C_ps - C_p ); cmsFloat64Number delta_H =2 * sqrt(C_ps*C_p) * sin(RADIANS(delta_h) / 2); cmsFloat64Number T = 1 - 0.17 * cos(RADIANS(meanh_p-30)) + 0.24 * cos(RADIANS(2*meanh_p)) + 0.32 * cos(RADIANS(3*meanh_p + 6)) - 0.2 * cos(RADIANS(4*meanh_p - 63)); cmsFloat64Number Sl = 1 + (0.015 * Sqr((Ls + L1) /2- 50) )/ sqrt(20 + Sqr( (Ls+L1)/2 - 50) ); cmsFloat64Number Sc = 1 + 0.045 * (C_p + C_ps)/2; cmsFloat64Number Sh = 1 + 0.015 * ((C_ps + C_p)/2) * T; cmsFloat64Number delta_ro = 30 * exp( -Sqr(((meanh_p - 275 ) / 25))); cmsFloat64Number Rc = 2 * sqrt(( pow(meanC_p, 7.0) )/( pow(meanC_p, 7.0) + pow(25.0, 7.0))); cmsFloat64Number Rt = -sin(2 * RADIANS(delta_ro)) * Rc; cmsFloat64Number deltaE00 = sqrt( Sqr(delta_L /(Sl * Kl)) + Sqr(delta_C/(Sc * Kc)) + Sqr(delta_H/(Sh * Kh)) + Rt*(delta_C/(Sc * Kc)) * (delta_H / (Sh * Kh))); return deltaE00; } // This function returns a number of gridpoints to be used as LUT table. It assumes same number // of gripdpoints in all dimensions. Flags may override the choice. int _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags) { int nChannels; // Already specified? if (dwFlags & 0x00FF0000) { // Yes, grab'em return (dwFlags >> 16) & 0xFF; } nChannels = cmsChannelsOf(Colorspace); // HighResPrecalc is maximum resolution if (dwFlags & cmsFLAGS_HIGHRESPRECALC) { if (nChannels > 4) return 7; // 7 for Hifi if (nChannels == 4) // 23 for CMYK return 23; return 49; // 49 for RGB and others } // LowResPrecal is lower resolution if (dwFlags & cmsFLAGS_LOWRESPRECALC) { if (nChannels > 4) return 6; // 6 for more than 4 channels if (nChannels == 1) return 33; // For monochrome return 17; // 17 for remaining } // Default values if (nChannels > 4) return 7; // 7 for Hifi if (nChannels == 4) return 17; // 17 for CMYK return 33; // 33 for RGB } cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space, cmsUInt16Number **White, cmsUInt16Number **Black, cmsUInt32Number *nOutputs) { // Only most common spaces static cmsUInt16Number RGBblack[4] = { 0, 0, 0 }; static cmsUInt16Number RGBwhite[4] = { 0xffff, 0xffff, 0xffff }; static cmsUInt16Number CMYKblack[4] = { 0xffff, 0xffff, 0xffff, 0xffff }; // 400% of ink static cmsUInt16Number CMYKwhite[4] = { 0, 0, 0, 0 }; static cmsUInt16Number LABblack[4] = { 0, 0x8080, 0x8080 }; // V4 Lab encoding static cmsUInt16Number LABwhite[4] = { 0xFFFF, 0x8080, 0x8080 }; static cmsUInt16Number CMYblack[4] = { 0xffff, 0xffff, 0xffff }; static cmsUInt16Number CMYwhite[4] = { 0, 0, 0 }; static cmsUInt16Number Grayblack[4] = { 0 }; static cmsUInt16Number GrayWhite[4] = { 0xffff }; switch (Space) { case cmsSigGrayData: if (White) *White = GrayWhite; if (Black) *Black = Grayblack; if (nOutputs) *nOutputs = 1; return TRUE; case cmsSigRgbData: if (White) *White = RGBwhite; if (Black) *Black = RGBblack; if (nOutputs) *nOutputs = 3; return TRUE; case cmsSigLabData: if (White) *White = LABwhite; if (Black) *Black = LABblack; if (nOutputs) *nOutputs = 3; return TRUE; case cmsSigCmykData: if (White) *White = CMYKwhite; if (Black) *Black = CMYKblack; if (nOutputs) *nOutputs = 4; return TRUE; case cmsSigCmyData: if (White) *White = CMYwhite; if (Black) *Black = CMYblack; if (nOutputs) *nOutputs = 3; return TRUE; default:; } return FALSE; } // Several utilities ------------------------------------------------------- // Translate from our colorspace to ICC representation cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation) { switch (OurNotation) { case 1: case PT_GRAY: return cmsSigGrayData; case 2: case PT_RGB: return cmsSigRgbData; case PT_CMY: return cmsSigCmyData; case PT_CMYK: return cmsSigCmykData; case PT_YCbCr:return cmsSigYCbCrData; case PT_YUV: return cmsSigLuvData; case PT_XYZ: return cmsSigXYZData; case PT_LabV2: case PT_Lab: return cmsSigLabData; case PT_YUVK: return cmsSigLuvKData; case PT_HSV: return cmsSigHsvData; case PT_HLS: return cmsSigHlsData; case PT_Yxy: return cmsSigYxyData; case PT_MCH1: return cmsSigMCH1Data; case PT_MCH2: return cmsSigMCH2Data; case PT_MCH3: return cmsSigMCH3Data; case PT_MCH4: return cmsSigMCH4Data; case PT_MCH5: return cmsSigMCH5Data; case PT_MCH6: return cmsSigMCH6Data; case PT_MCH7: return cmsSigMCH7Data; case PT_MCH8: return cmsSigMCH8Data; case PT_MCH9: return cmsSigMCH9Data; case PT_MCH10: return cmsSigMCHAData; case PT_MCH11: return cmsSigMCHBData; case PT_MCH12: return cmsSigMCHCData; case PT_MCH13: return cmsSigMCHDData; case PT_MCH14: return cmsSigMCHEData; case PT_MCH15: return cmsSigMCHFData; default: return (cmsColorSpaceSignature) (-1); } } int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace) { switch (ProfileSpace) { case cmsSigGrayData: return PT_GRAY; case cmsSigRgbData: return PT_RGB; case cmsSigCmyData: return PT_CMY; case cmsSigCmykData: return PT_CMYK; case cmsSigYCbCrData:return PT_YCbCr; case cmsSigLuvData: return PT_YUV; case cmsSigXYZData: return PT_XYZ; case cmsSigLabData: return PT_Lab; case cmsSigLuvKData: return PT_YUVK; case cmsSigHsvData: return PT_HSV; case cmsSigHlsData: return PT_HLS; case cmsSigYxyData: return PT_Yxy; case cmsSig1colorData: case cmsSigMCH1Data: return PT_MCH1; case cmsSig2colorData: case cmsSigMCH2Data: return PT_MCH2; case cmsSig3colorData: case cmsSigMCH3Data: return PT_MCH3; case cmsSig4colorData: case cmsSigMCH4Data: return PT_MCH4; case cmsSig5colorData: case cmsSigMCH5Data: return PT_MCH5; case cmsSig6colorData: case cmsSigMCH6Data: return PT_MCH6; case cmsSigMCH7Data: case cmsSig7colorData:return PT_MCH7; case cmsSigMCH8Data: case cmsSig8colorData:return PT_MCH8; case cmsSigMCH9Data: case cmsSig9colorData:return PT_MCH9; case cmsSigMCHAData: case cmsSig10colorData:return PT_MCH10; case cmsSigMCHBData: case cmsSig11colorData:return PT_MCH11; case cmsSigMCHCData: case cmsSig12colorData:return PT_MCH12; case cmsSigMCHDData: case cmsSig13colorData:return PT_MCH13; case cmsSigMCHEData: case cmsSig14colorData:return PT_MCH14; case cmsSigMCHFData: case cmsSig15colorData:return PT_MCH15; default: return (cmsColorSpaceSignature) (-1); } } cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace) { switch (ColorSpace) { case cmsSigMCH1Data: case cmsSig1colorData: case cmsSigGrayData: return 1; case cmsSigMCH2Data: case cmsSig2colorData: return 2; case cmsSigXYZData: case cmsSigLabData: case cmsSigLuvData: case cmsSigYCbCrData: case cmsSigYxyData: case cmsSigRgbData: case cmsSigHsvData: case cmsSigHlsData: case cmsSigCmyData: case cmsSigMCH3Data: case cmsSig3colorData: return 3; case cmsSigLuvKData: case cmsSigCmykData: case cmsSigMCH4Data: case cmsSig4colorData: return 4; case cmsSigMCH5Data: case cmsSig5colorData: return 5; case cmsSigMCH6Data: case cmsSig6colorData: return 6; case cmsSigMCH7Data: case cmsSig7colorData: return 7; case cmsSigMCH8Data: case cmsSig8colorData: return 8; case cmsSigMCH9Data: case cmsSig9colorData: return 9; case cmsSigMCHAData: case cmsSig10colorData: return 10; case cmsSigMCHBData: case cmsSig11colorData: return 11; case cmsSigMCHCData: case cmsSig12colorData: return 12; case cmsSigMCHDData: case cmsSig13colorData: return 13; case cmsSigMCHEData: case cmsSig14colorData: return 14; case cmsSigMCHFData: case cmsSig15colorData: return 15; default: return 3; } } lcms2-2.6/src/cmshalf.c0000644002406300000240000010475712311617072014314 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2012 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // // #include "lcms2_internal.h" #ifndef CMS_NO_HALF_SUPPORT // This code is inspired in the paper "Fast Half Float Conversions" // by Jeroen van der Zijp static cmsUInt32Number Mantissa[2048] = { 0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34a00000, 0x34c00000, 0x34e00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000, 0x35400000, 0x35500000, 0x35600000, 0x35700000, 0x35800000, 0x35880000, 0x35900000, 0x35980000, 0x35a00000, 0x35a80000, 0x35b00000, 0x35b80000, 0x35c00000, 0x35c80000, 0x35d00000, 0x35d80000, 0x35e00000, 0x35e80000, 0x35f00000, 0x35f80000, 0x36000000, 0x36040000, 0x36080000, 0x360c0000, 0x36100000, 0x36140000, 0x36180000, 0x361c0000, 0x36200000, 0x36240000, 0x36280000, 0x362c0000, 0x36300000, 0x36340000, 0x36380000, 0x363c0000, 0x36400000, 0x36440000, 0x36480000, 0x364c0000, 0x36500000, 0x36540000, 0x36580000, 0x365c0000, 0x36600000, 0x36640000, 0x36680000, 0x366c0000, 0x36700000, 0x36740000, 0x36780000, 0x367c0000, 0x36800000, 0x36820000, 0x36840000, 0x36860000, 0x36880000, 0x368a0000, 0x368c0000, 0x368e0000, 0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369a0000, 0x369c0000, 0x369e0000, 0x36a00000, 0x36a20000, 0x36a40000, 0x36a60000, 0x36a80000, 0x36aa0000, 0x36ac0000, 0x36ae0000, 0x36b00000, 0x36b20000, 0x36b40000, 0x36b60000, 0x36b80000, 0x36ba0000, 0x36bc0000, 0x36be0000, 0x36c00000, 0x36c20000, 0x36c40000, 0x36c60000, 0x36c80000, 0x36ca0000, 0x36cc0000, 0x36ce0000, 0x36d00000, 0x36d20000, 0x36d40000, 0x36d60000, 0x36d80000, 0x36da0000, 0x36dc0000, 0x36de0000, 0x36e00000, 0x36e20000, 0x36e40000, 0x36e60000, 0x36e80000, 0x36ea0000, 0x36ec0000, 0x36ee0000, 0x36f00000, 0x36f20000, 0x36f40000, 0x36f60000, 0x36f80000, 0x36fa0000, 0x36fc0000, 0x36fe0000, 0x37000000, 0x37010000, 0x37020000, 0x37030000, 0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000, 0x370a0000, 0x370b0000, 0x370c0000, 0x370d0000, 0x370e0000, 0x370f0000, 0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000, 0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371a0000, 0x371b0000, 0x371c0000, 0x371d0000, 0x371e0000, 0x371f0000, 0x37200000, 0x37210000, 0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000, 0x37280000, 0x37290000, 0x372a0000, 0x372b0000, 0x372c0000, 0x372d0000, 0x372e0000, 0x372f0000, 0x37300000, 0x37310000, 0x37320000, 0x37330000, 0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000, 0x373a0000, 0x373b0000, 0x373c0000, 0x373d0000, 0x373e0000, 0x373f0000, 0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000, 0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374a0000, 0x374b0000, 0x374c0000, 0x374d0000, 0x374e0000, 0x374f0000, 0x37500000, 0x37510000, 0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000, 0x37580000, 0x37590000, 0x375a0000, 0x375b0000, 0x375c0000, 0x375d0000, 0x375e0000, 0x375f0000, 0x37600000, 0x37610000, 0x37620000, 0x37630000, 0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000, 0x376a0000, 0x376b0000, 0x376c0000, 0x376d0000, 0x376e0000, 0x376f0000, 0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000, 0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377a0000, 0x377b0000, 0x377c0000, 0x377d0000, 0x377e0000, 0x377f0000, 0x37800000, 0x37808000, 0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000, 0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000, 0x37870000, 0x37878000, 0x37880000, 0x37888000, 0x37890000, 0x37898000, 0x378a0000, 0x378a8000, 0x378b0000, 0x378b8000, 0x378c0000, 0x378c8000, 0x378d0000, 0x378d8000, 0x378e0000, 0x378e8000, 0x378f0000, 0x378f8000, 0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000, 0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000, 0x37960000, 0x37968000, 0x37970000, 0x37978000, 0x37980000, 0x37988000, 0x37990000, 0x37998000, 0x379a0000, 0x379a8000, 0x379b0000, 0x379b8000, 0x379c0000, 0x379c8000, 0x379d0000, 0x379d8000, 0x379e0000, 0x379e8000, 0x379f0000, 0x379f8000, 0x37a00000, 0x37a08000, 0x37a10000, 0x37a18000, 0x37a20000, 0x37a28000, 0x37a30000, 0x37a38000, 0x37a40000, 0x37a48000, 0x37a50000, 0x37a58000, 0x37a60000, 0x37a68000, 0x37a70000, 0x37a78000, 0x37a80000, 0x37a88000, 0x37a90000, 0x37a98000, 0x37aa0000, 0x37aa8000, 0x37ab0000, 0x37ab8000, 0x37ac0000, 0x37ac8000, 0x37ad0000, 0x37ad8000, 0x37ae0000, 0x37ae8000, 0x37af0000, 0x37af8000, 0x37b00000, 0x37b08000, 0x37b10000, 0x37b18000, 0x37b20000, 0x37b28000, 0x37b30000, 0x37b38000, 0x37b40000, 0x37b48000, 0x37b50000, 0x37b58000, 0x37b60000, 0x37b68000, 0x37b70000, 0x37b78000, 0x37b80000, 0x37b88000, 0x37b90000, 0x37b98000, 0x37ba0000, 0x37ba8000, 0x37bb0000, 0x37bb8000, 0x37bc0000, 0x37bc8000, 0x37bd0000, 0x37bd8000, 0x37be0000, 0x37be8000, 0x37bf0000, 0x37bf8000, 0x37c00000, 0x37c08000, 0x37c10000, 0x37c18000, 0x37c20000, 0x37c28000, 0x37c30000, 0x37c38000, 0x37c40000, 0x37c48000, 0x37c50000, 0x37c58000, 0x37c60000, 0x37c68000, 0x37c70000, 0x37c78000, 0x37c80000, 0x37c88000, 0x37c90000, 0x37c98000, 0x37ca0000, 0x37ca8000, 0x37cb0000, 0x37cb8000, 0x37cc0000, 0x37cc8000, 0x37cd0000, 0x37cd8000, 0x37ce0000, 0x37ce8000, 0x37cf0000, 0x37cf8000, 0x37d00000, 0x37d08000, 0x37d10000, 0x37d18000, 0x37d20000, 0x37d28000, 0x37d30000, 0x37d38000, 0x37d40000, 0x37d48000, 0x37d50000, 0x37d58000, 0x37d60000, 0x37d68000, 0x37d70000, 0x37d78000, 0x37d80000, 0x37d88000, 0x37d90000, 0x37d98000, 0x37da0000, 0x37da8000, 0x37db0000, 0x37db8000, 0x37dc0000, 0x37dc8000, 0x37dd0000, 0x37dd8000, 0x37de0000, 0x37de8000, 0x37df0000, 0x37df8000, 0x37e00000, 0x37e08000, 0x37e10000, 0x37e18000, 0x37e20000, 0x37e28000, 0x37e30000, 0x37e38000, 0x37e40000, 0x37e48000, 0x37e50000, 0x37e58000, 0x37e60000, 0x37e68000, 0x37e70000, 0x37e78000, 0x37e80000, 0x37e88000, 0x37e90000, 0x37e98000, 0x37ea0000, 0x37ea8000, 0x37eb0000, 0x37eb8000, 0x37ec0000, 0x37ec8000, 0x37ed0000, 0x37ed8000, 0x37ee0000, 0x37ee8000, 0x37ef0000, 0x37ef8000, 0x37f00000, 0x37f08000, 0x37f10000, 0x37f18000, 0x37f20000, 0x37f28000, 0x37f30000, 0x37f38000, 0x37f40000, 0x37f48000, 0x37f50000, 0x37f58000, 0x37f60000, 0x37f68000, 0x37f70000, 0x37f78000, 0x37f80000, 0x37f88000, 0x37f90000, 0x37f98000, 0x37fa0000, 0x37fa8000, 0x37fb0000, 0x37fb8000, 0x37fc0000, 0x37fc8000, 0x37fd0000, 0x37fd8000, 0x37fe0000, 0x37fe8000, 0x37ff0000, 0x37ff8000, 0x38000000, 0x38004000, 0x38008000, 0x3800c000, 0x38010000, 0x38014000, 0x38018000, 0x3801c000, 0x38020000, 0x38024000, 0x38028000, 0x3802c000, 0x38030000, 0x38034000, 0x38038000, 0x3803c000, 0x38040000, 0x38044000, 0x38048000, 0x3804c000, 0x38050000, 0x38054000, 0x38058000, 0x3805c000, 0x38060000, 0x38064000, 0x38068000, 0x3806c000, 0x38070000, 0x38074000, 0x38078000, 0x3807c000, 0x38080000, 0x38084000, 0x38088000, 0x3808c000, 0x38090000, 0x38094000, 0x38098000, 0x3809c000, 0x380a0000, 0x380a4000, 0x380a8000, 0x380ac000, 0x380b0000, 0x380b4000, 0x380b8000, 0x380bc000, 0x380c0000, 0x380c4000, 0x380c8000, 0x380cc000, 0x380d0000, 0x380d4000, 0x380d8000, 0x380dc000, 0x380e0000, 0x380e4000, 0x380e8000, 0x380ec000, 0x380f0000, 0x380f4000, 0x380f8000, 0x380fc000, 0x38100000, 0x38104000, 0x38108000, 0x3810c000, 0x38110000, 0x38114000, 0x38118000, 0x3811c000, 0x38120000, 0x38124000, 0x38128000, 0x3812c000, 0x38130000, 0x38134000, 0x38138000, 0x3813c000, 0x38140000, 0x38144000, 0x38148000, 0x3814c000, 0x38150000, 0x38154000, 0x38158000, 0x3815c000, 0x38160000, 0x38164000, 0x38168000, 0x3816c000, 0x38170000, 0x38174000, 0x38178000, 0x3817c000, 0x38180000, 0x38184000, 0x38188000, 0x3818c000, 0x38190000, 0x38194000, 0x38198000, 0x3819c000, 0x381a0000, 0x381a4000, 0x381a8000, 0x381ac000, 0x381b0000, 0x381b4000, 0x381b8000, 0x381bc000, 0x381c0000, 0x381c4000, 0x381c8000, 0x381cc000, 0x381d0000, 0x381d4000, 0x381d8000, 0x381dc000, 0x381e0000, 0x381e4000, 0x381e8000, 0x381ec000, 0x381f0000, 0x381f4000, 0x381f8000, 0x381fc000, 0x38200000, 0x38204000, 0x38208000, 0x3820c000, 0x38210000, 0x38214000, 0x38218000, 0x3821c000, 0x38220000, 0x38224000, 0x38228000, 0x3822c000, 0x38230000, 0x38234000, 0x38238000, 0x3823c000, 0x38240000, 0x38244000, 0x38248000, 0x3824c000, 0x38250000, 0x38254000, 0x38258000, 0x3825c000, 0x38260000, 0x38264000, 0x38268000, 0x3826c000, 0x38270000, 0x38274000, 0x38278000, 0x3827c000, 0x38280000, 0x38284000, 0x38288000, 0x3828c000, 0x38290000, 0x38294000, 0x38298000, 0x3829c000, 0x382a0000, 0x382a4000, 0x382a8000, 0x382ac000, 0x382b0000, 0x382b4000, 0x382b8000, 0x382bc000, 0x382c0000, 0x382c4000, 0x382c8000, 0x382cc000, 0x382d0000, 0x382d4000, 0x382d8000, 0x382dc000, 0x382e0000, 0x382e4000, 0x382e8000, 0x382ec000, 0x382f0000, 0x382f4000, 0x382f8000, 0x382fc000, 0x38300000, 0x38304000, 0x38308000, 0x3830c000, 0x38310000, 0x38314000, 0x38318000, 0x3831c000, 0x38320000, 0x38324000, 0x38328000, 0x3832c000, 0x38330000, 0x38334000, 0x38338000, 0x3833c000, 0x38340000, 0x38344000, 0x38348000, 0x3834c000, 0x38350000, 0x38354000, 0x38358000, 0x3835c000, 0x38360000, 0x38364000, 0x38368000, 0x3836c000, 0x38370000, 0x38374000, 0x38378000, 0x3837c000, 0x38380000, 0x38384000, 0x38388000, 0x3838c000, 0x38390000, 0x38394000, 0x38398000, 0x3839c000, 0x383a0000, 0x383a4000, 0x383a8000, 0x383ac000, 0x383b0000, 0x383b4000, 0x383b8000, 0x383bc000, 0x383c0000, 0x383c4000, 0x383c8000, 0x383cc000, 0x383d0000, 0x383d4000, 0x383d8000, 0x383dc000, 0x383e0000, 0x383e4000, 0x383e8000, 0x383ec000, 0x383f0000, 0x383f4000, 0x383f8000, 0x383fc000, 0x38400000, 0x38404000, 0x38408000, 0x3840c000, 0x38410000, 0x38414000, 0x38418000, 0x3841c000, 0x38420000, 0x38424000, 0x38428000, 0x3842c000, 0x38430000, 0x38434000, 0x38438000, 0x3843c000, 0x38440000, 0x38444000, 0x38448000, 0x3844c000, 0x38450000, 0x38454000, 0x38458000, 0x3845c000, 0x38460000, 0x38464000, 0x38468000, 0x3846c000, 0x38470000, 0x38474000, 0x38478000, 0x3847c000, 0x38480000, 0x38484000, 0x38488000, 0x3848c000, 0x38490000, 0x38494000, 0x38498000, 0x3849c000, 0x384a0000, 0x384a4000, 0x384a8000, 0x384ac000, 0x384b0000, 0x384b4000, 0x384b8000, 0x384bc000, 0x384c0000, 0x384c4000, 0x384c8000, 0x384cc000, 0x384d0000, 0x384d4000, 0x384d8000, 0x384dc000, 0x384e0000, 0x384e4000, 0x384e8000, 0x384ec000, 0x384f0000, 0x384f4000, 0x384f8000, 0x384fc000, 0x38500000, 0x38504000, 0x38508000, 0x3850c000, 0x38510000, 0x38514000, 0x38518000, 0x3851c000, 0x38520000, 0x38524000, 0x38528000, 0x3852c000, 0x38530000, 0x38534000, 0x38538000, 0x3853c000, 0x38540000, 0x38544000, 0x38548000, 0x3854c000, 0x38550000, 0x38554000, 0x38558000, 0x3855c000, 0x38560000, 0x38564000, 0x38568000, 0x3856c000, 0x38570000, 0x38574000, 0x38578000, 0x3857c000, 0x38580000, 0x38584000, 0x38588000, 0x3858c000, 0x38590000, 0x38594000, 0x38598000, 0x3859c000, 0x385a0000, 0x385a4000, 0x385a8000, 0x385ac000, 0x385b0000, 0x385b4000, 0x385b8000, 0x385bc000, 0x385c0000, 0x385c4000, 0x385c8000, 0x385cc000, 0x385d0000, 0x385d4000, 0x385d8000, 0x385dc000, 0x385e0000, 0x385e4000, 0x385e8000, 0x385ec000, 0x385f0000, 0x385f4000, 0x385f8000, 0x385fc000, 0x38600000, 0x38604000, 0x38608000, 0x3860c000, 0x38610000, 0x38614000, 0x38618000, 0x3861c000, 0x38620000, 0x38624000, 0x38628000, 0x3862c000, 0x38630000, 0x38634000, 0x38638000, 0x3863c000, 0x38640000, 0x38644000, 0x38648000, 0x3864c000, 0x38650000, 0x38654000, 0x38658000, 0x3865c000, 0x38660000, 0x38664000, 0x38668000, 0x3866c000, 0x38670000, 0x38674000, 0x38678000, 0x3867c000, 0x38680000, 0x38684000, 0x38688000, 0x3868c000, 0x38690000, 0x38694000, 0x38698000, 0x3869c000, 0x386a0000, 0x386a4000, 0x386a8000, 0x386ac000, 0x386b0000, 0x386b4000, 0x386b8000, 0x386bc000, 0x386c0000, 0x386c4000, 0x386c8000, 0x386cc000, 0x386d0000, 0x386d4000, 0x386d8000, 0x386dc000, 0x386e0000, 0x386e4000, 0x386e8000, 0x386ec000, 0x386f0000, 0x386f4000, 0x386f8000, 0x386fc000, 0x38700000, 0x38704000, 0x38708000, 0x3870c000, 0x38710000, 0x38714000, 0x38718000, 0x3871c000, 0x38720000, 0x38724000, 0x38728000, 0x3872c000, 0x38730000, 0x38734000, 0x38738000, 0x3873c000, 0x38740000, 0x38744000, 0x38748000, 0x3874c000, 0x38750000, 0x38754000, 0x38758000, 0x3875c000, 0x38760000, 0x38764000, 0x38768000, 0x3876c000, 0x38770000, 0x38774000, 0x38778000, 0x3877c000, 0x38780000, 0x38784000, 0x38788000, 0x3878c000, 0x38790000, 0x38794000, 0x38798000, 0x3879c000, 0x387a0000, 0x387a4000, 0x387a8000, 0x387ac000, 0x387b0000, 0x387b4000, 0x387b8000, 0x387bc000, 0x387c0000, 0x387c4000, 0x387c8000, 0x387cc000, 0x387d0000, 0x387d4000, 0x387d8000, 0x387dc000, 0x387e0000, 0x387e4000, 0x387e8000, 0x387ec000, 0x387f0000, 0x387f4000, 0x387f8000, 0x387fc000, 0x38000000, 0x38002000, 0x38004000, 0x38006000, 0x38008000, 0x3800a000, 0x3800c000, 0x3800e000, 0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801a000, 0x3801c000, 0x3801e000, 0x38020000, 0x38022000, 0x38024000, 0x38026000, 0x38028000, 0x3802a000, 0x3802c000, 0x3802e000, 0x38030000, 0x38032000, 0x38034000, 0x38036000, 0x38038000, 0x3803a000, 0x3803c000, 0x3803e000, 0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804a000, 0x3804c000, 0x3804e000, 0x38050000, 0x38052000, 0x38054000, 0x38056000, 0x38058000, 0x3805a000, 0x3805c000, 0x3805e000, 0x38060000, 0x38062000, 0x38064000, 0x38066000, 0x38068000, 0x3806a000, 0x3806c000, 0x3806e000, 0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807a000, 0x3807c000, 0x3807e000, 0x38080000, 0x38082000, 0x38084000, 0x38086000, 0x38088000, 0x3808a000, 0x3808c000, 0x3808e000, 0x38090000, 0x38092000, 0x38094000, 0x38096000, 0x38098000, 0x3809a000, 0x3809c000, 0x3809e000, 0x380a0000, 0x380a2000, 0x380a4000, 0x380a6000, 0x380a8000, 0x380aa000, 0x380ac000, 0x380ae000, 0x380b0000, 0x380b2000, 0x380b4000, 0x380b6000, 0x380b8000, 0x380ba000, 0x380bc000, 0x380be000, 0x380c0000, 0x380c2000, 0x380c4000, 0x380c6000, 0x380c8000, 0x380ca000, 0x380cc000, 0x380ce000, 0x380d0000, 0x380d2000, 0x380d4000, 0x380d6000, 0x380d8000, 0x380da000, 0x380dc000, 0x380de000, 0x380e0000, 0x380e2000, 0x380e4000, 0x380e6000, 0x380e8000, 0x380ea000, 0x380ec000, 0x380ee000, 0x380f0000, 0x380f2000, 0x380f4000, 0x380f6000, 0x380f8000, 0x380fa000, 0x380fc000, 0x380fe000, 0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810a000, 0x3810c000, 0x3810e000, 0x38110000, 0x38112000, 0x38114000, 0x38116000, 0x38118000, 0x3811a000, 0x3811c000, 0x3811e000, 0x38120000, 0x38122000, 0x38124000, 0x38126000, 0x38128000, 0x3812a000, 0x3812c000, 0x3812e000, 0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813a000, 0x3813c000, 0x3813e000, 0x38140000, 0x38142000, 0x38144000, 0x38146000, 0x38148000, 0x3814a000, 0x3814c000, 0x3814e000, 0x38150000, 0x38152000, 0x38154000, 0x38156000, 0x38158000, 0x3815a000, 0x3815c000, 0x3815e000, 0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816a000, 0x3816c000, 0x3816e000, 0x38170000, 0x38172000, 0x38174000, 0x38176000, 0x38178000, 0x3817a000, 0x3817c000, 0x3817e000, 0x38180000, 0x38182000, 0x38184000, 0x38186000, 0x38188000, 0x3818a000, 0x3818c000, 0x3818e000, 0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819a000, 0x3819c000, 0x3819e000, 0x381a0000, 0x381a2000, 0x381a4000, 0x381a6000, 0x381a8000, 0x381aa000, 0x381ac000, 0x381ae000, 0x381b0000, 0x381b2000, 0x381b4000, 0x381b6000, 0x381b8000, 0x381ba000, 0x381bc000, 0x381be000, 0x381c0000, 0x381c2000, 0x381c4000, 0x381c6000, 0x381c8000, 0x381ca000, 0x381cc000, 0x381ce000, 0x381d0000, 0x381d2000, 0x381d4000, 0x381d6000, 0x381d8000, 0x381da000, 0x381dc000, 0x381de000, 0x381e0000, 0x381e2000, 0x381e4000, 0x381e6000, 0x381e8000, 0x381ea000, 0x381ec000, 0x381ee000, 0x381f0000, 0x381f2000, 0x381f4000, 0x381f6000, 0x381f8000, 0x381fa000, 0x381fc000, 0x381fe000, 0x38200000, 0x38202000, 0x38204000, 0x38206000, 0x38208000, 0x3820a000, 0x3820c000, 0x3820e000, 0x38210000, 0x38212000, 0x38214000, 0x38216000, 0x38218000, 0x3821a000, 0x3821c000, 0x3821e000, 0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822a000, 0x3822c000, 0x3822e000, 0x38230000, 0x38232000, 0x38234000, 0x38236000, 0x38238000, 0x3823a000, 0x3823c000, 0x3823e000, 0x38240000, 0x38242000, 0x38244000, 0x38246000, 0x38248000, 0x3824a000, 0x3824c000, 0x3824e000, 0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825a000, 0x3825c000, 0x3825e000, 0x38260000, 0x38262000, 0x38264000, 0x38266000, 0x38268000, 0x3826a000, 0x3826c000, 0x3826e000, 0x38270000, 0x38272000, 0x38274000, 0x38276000, 0x38278000, 0x3827a000, 0x3827c000, 0x3827e000, 0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828a000, 0x3828c000, 0x3828e000, 0x38290000, 0x38292000, 0x38294000, 0x38296000, 0x38298000, 0x3829a000, 0x3829c000, 0x3829e000, 0x382a0000, 0x382a2000, 0x382a4000, 0x382a6000, 0x382a8000, 0x382aa000, 0x382ac000, 0x382ae000, 0x382b0000, 0x382b2000, 0x382b4000, 0x382b6000, 0x382b8000, 0x382ba000, 0x382bc000, 0x382be000, 0x382c0000, 0x382c2000, 0x382c4000, 0x382c6000, 0x382c8000, 0x382ca000, 0x382cc000, 0x382ce000, 0x382d0000, 0x382d2000, 0x382d4000, 0x382d6000, 0x382d8000, 0x382da000, 0x382dc000, 0x382de000, 0x382e0000, 0x382e2000, 0x382e4000, 0x382e6000, 0x382e8000, 0x382ea000, 0x382ec000, 0x382ee000, 0x382f0000, 0x382f2000, 0x382f4000, 0x382f6000, 0x382f8000, 0x382fa000, 0x382fc000, 0x382fe000, 0x38300000, 0x38302000, 0x38304000, 0x38306000, 0x38308000, 0x3830a000, 0x3830c000, 0x3830e000, 0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831a000, 0x3831c000, 0x3831e000, 0x38320000, 0x38322000, 0x38324000, 0x38326000, 0x38328000, 0x3832a000, 0x3832c000, 0x3832e000, 0x38330000, 0x38332000, 0x38334000, 0x38336000, 0x38338000, 0x3833a000, 0x3833c000, 0x3833e000, 0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834a000, 0x3834c000, 0x3834e000, 0x38350000, 0x38352000, 0x38354000, 0x38356000, 0x38358000, 0x3835a000, 0x3835c000, 0x3835e000, 0x38360000, 0x38362000, 0x38364000, 0x38366000, 0x38368000, 0x3836a000, 0x3836c000, 0x3836e000, 0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837a000, 0x3837c000, 0x3837e000, 0x38380000, 0x38382000, 0x38384000, 0x38386000, 0x38388000, 0x3838a000, 0x3838c000, 0x3838e000, 0x38390000, 0x38392000, 0x38394000, 0x38396000, 0x38398000, 0x3839a000, 0x3839c000, 0x3839e000, 0x383a0000, 0x383a2000, 0x383a4000, 0x383a6000, 0x383a8000, 0x383aa000, 0x383ac000, 0x383ae000, 0x383b0000, 0x383b2000, 0x383b4000, 0x383b6000, 0x383b8000, 0x383ba000, 0x383bc000, 0x383be000, 0x383c0000, 0x383c2000, 0x383c4000, 0x383c6000, 0x383c8000, 0x383ca000, 0x383cc000, 0x383ce000, 0x383d0000, 0x383d2000, 0x383d4000, 0x383d6000, 0x383d8000, 0x383da000, 0x383dc000, 0x383de000, 0x383e0000, 0x383e2000, 0x383e4000, 0x383e6000, 0x383e8000, 0x383ea000, 0x383ec000, 0x383ee000, 0x383f0000, 0x383f2000, 0x383f4000, 0x383f6000, 0x383f8000, 0x383fa000, 0x383fc000, 0x383fe000, 0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840a000, 0x3840c000, 0x3840e000, 0x38410000, 0x38412000, 0x38414000, 0x38416000, 0x38418000, 0x3841a000, 0x3841c000, 0x3841e000, 0x38420000, 0x38422000, 0x38424000, 0x38426000, 0x38428000, 0x3842a000, 0x3842c000, 0x3842e000, 0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843a000, 0x3843c000, 0x3843e000, 0x38440000, 0x38442000, 0x38444000, 0x38446000, 0x38448000, 0x3844a000, 0x3844c000, 0x3844e000, 0x38450000, 0x38452000, 0x38454000, 0x38456000, 0x38458000, 0x3845a000, 0x3845c000, 0x3845e000, 0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846a000, 0x3846c000, 0x3846e000, 0x38470000, 0x38472000, 0x38474000, 0x38476000, 0x38478000, 0x3847a000, 0x3847c000, 0x3847e000, 0x38480000, 0x38482000, 0x38484000, 0x38486000, 0x38488000, 0x3848a000, 0x3848c000, 0x3848e000, 0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849a000, 0x3849c000, 0x3849e000, 0x384a0000, 0x384a2000, 0x384a4000, 0x384a6000, 0x384a8000, 0x384aa000, 0x384ac000, 0x384ae000, 0x384b0000, 0x384b2000, 0x384b4000, 0x384b6000, 0x384b8000, 0x384ba000, 0x384bc000, 0x384be000, 0x384c0000, 0x384c2000, 0x384c4000, 0x384c6000, 0x384c8000, 0x384ca000, 0x384cc000, 0x384ce000, 0x384d0000, 0x384d2000, 0x384d4000, 0x384d6000, 0x384d8000, 0x384da000, 0x384dc000, 0x384de000, 0x384e0000, 0x384e2000, 0x384e4000, 0x384e6000, 0x384e8000, 0x384ea000, 0x384ec000, 0x384ee000, 0x384f0000, 0x384f2000, 0x384f4000, 0x384f6000, 0x384f8000, 0x384fa000, 0x384fc000, 0x384fe000, 0x38500000, 0x38502000, 0x38504000, 0x38506000, 0x38508000, 0x3850a000, 0x3850c000, 0x3850e000, 0x38510000, 0x38512000, 0x38514000, 0x38516000, 0x38518000, 0x3851a000, 0x3851c000, 0x3851e000, 0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852a000, 0x3852c000, 0x3852e000, 0x38530000, 0x38532000, 0x38534000, 0x38536000, 0x38538000, 0x3853a000, 0x3853c000, 0x3853e000, 0x38540000, 0x38542000, 0x38544000, 0x38546000, 0x38548000, 0x3854a000, 0x3854c000, 0x3854e000, 0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855a000, 0x3855c000, 0x3855e000, 0x38560000, 0x38562000, 0x38564000, 0x38566000, 0x38568000, 0x3856a000, 0x3856c000, 0x3856e000, 0x38570000, 0x38572000, 0x38574000, 0x38576000, 0x38578000, 0x3857a000, 0x3857c000, 0x3857e000, 0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858a000, 0x3858c000, 0x3858e000, 0x38590000, 0x38592000, 0x38594000, 0x38596000, 0x38598000, 0x3859a000, 0x3859c000, 0x3859e000, 0x385a0000, 0x385a2000, 0x385a4000, 0x385a6000, 0x385a8000, 0x385aa000, 0x385ac000, 0x385ae000, 0x385b0000, 0x385b2000, 0x385b4000, 0x385b6000, 0x385b8000, 0x385ba000, 0x385bc000, 0x385be000, 0x385c0000, 0x385c2000, 0x385c4000, 0x385c6000, 0x385c8000, 0x385ca000, 0x385cc000, 0x385ce000, 0x385d0000, 0x385d2000, 0x385d4000, 0x385d6000, 0x385d8000, 0x385da000, 0x385dc000, 0x385de000, 0x385e0000, 0x385e2000, 0x385e4000, 0x385e6000, 0x385e8000, 0x385ea000, 0x385ec000, 0x385ee000, 0x385f0000, 0x385f2000, 0x385f4000, 0x385f6000, 0x385f8000, 0x385fa000, 0x385fc000, 0x385fe000, 0x38600000, 0x38602000, 0x38604000, 0x38606000, 0x38608000, 0x3860a000, 0x3860c000, 0x3860e000, 0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861a000, 0x3861c000, 0x3861e000, 0x38620000, 0x38622000, 0x38624000, 0x38626000, 0x38628000, 0x3862a000, 0x3862c000, 0x3862e000, 0x38630000, 0x38632000, 0x38634000, 0x38636000, 0x38638000, 0x3863a000, 0x3863c000, 0x3863e000, 0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864a000, 0x3864c000, 0x3864e000, 0x38650000, 0x38652000, 0x38654000, 0x38656000, 0x38658000, 0x3865a000, 0x3865c000, 0x3865e000, 0x38660000, 0x38662000, 0x38664000, 0x38666000, 0x38668000, 0x3866a000, 0x3866c000, 0x3866e000, 0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867a000, 0x3867c000, 0x3867e000, 0x38680000, 0x38682000, 0x38684000, 0x38686000, 0x38688000, 0x3868a000, 0x3868c000, 0x3868e000, 0x38690000, 0x38692000, 0x38694000, 0x38696000, 0x38698000, 0x3869a000, 0x3869c000, 0x3869e000, 0x386a0000, 0x386a2000, 0x386a4000, 0x386a6000, 0x386a8000, 0x386aa000, 0x386ac000, 0x386ae000, 0x386b0000, 0x386b2000, 0x386b4000, 0x386b6000, 0x386b8000, 0x386ba000, 0x386bc000, 0x386be000, 0x386c0000, 0x386c2000, 0x386c4000, 0x386c6000, 0x386c8000, 0x386ca000, 0x386cc000, 0x386ce000, 0x386d0000, 0x386d2000, 0x386d4000, 0x386d6000, 0x386d8000, 0x386da000, 0x386dc000, 0x386de000, 0x386e0000, 0x386e2000, 0x386e4000, 0x386e6000, 0x386e8000, 0x386ea000, 0x386ec000, 0x386ee000, 0x386f0000, 0x386f2000, 0x386f4000, 0x386f6000, 0x386f8000, 0x386fa000, 0x386fc000, 0x386fe000, 0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870a000, 0x3870c000, 0x3870e000, 0x38710000, 0x38712000, 0x38714000, 0x38716000, 0x38718000, 0x3871a000, 0x3871c000, 0x3871e000, 0x38720000, 0x38722000, 0x38724000, 0x38726000, 0x38728000, 0x3872a000, 0x3872c000, 0x3872e000, 0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873a000, 0x3873c000, 0x3873e000, 0x38740000, 0x38742000, 0x38744000, 0x38746000, 0x38748000, 0x3874a000, 0x3874c000, 0x3874e000, 0x38750000, 0x38752000, 0x38754000, 0x38756000, 0x38758000, 0x3875a000, 0x3875c000, 0x3875e000, 0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876a000, 0x3876c000, 0x3876e000, 0x38770000, 0x38772000, 0x38774000, 0x38776000, 0x38778000, 0x3877a000, 0x3877c000, 0x3877e000, 0x38780000, 0x38782000, 0x38784000, 0x38786000, 0x38788000, 0x3878a000, 0x3878c000, 0x3878e000, 0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879a000, 0x3879c000, 0x3879e000, 0x387a0000, 0x387a2000, 0x387a4000, 0x387a6000, 0x387a8000, 0x387aa000, 0x387ac000, 0x387ae000, 0x387b0000, 0x387b2000, 0x387b4000, 0x387b6000, 0x387b8000, 0x387ba000, 0x387bc000, 0x387be000, 0x387c0000, 0x387c2000, 0x387c4000, 0x387c6000, 0x387c8000, 0x387ca000, 0x387cc000, 0x387ce000, 0x387d0000, 0x387d2000, 0x387d4000, 0x387d6000, 0x387d8000, 0x387da000, 0x387dc000, 0x387de000, 0x387e0000, 0x387e2000, 0x387e4000, 0x387e6000, 0x387e8000, 0x387ea000, 0x387ec000, 0x387ee000, 0x387f0000, 0x387f2000, 0x387f4000, 0x387f6000, 0x387f8000, 0x387fa000, 0x387fc000, 0x387fe000 }; static cmsUInt16Number Offset[64] = { 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400 }; static cmsUInt32Number Exponent[64] = { 0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000, 0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000, 0x06000000, 0x06800000, 0x07000000, 0x07800000, 0x08000000, 0x08800000, 0x09000000, 0x09800000, 0x0a000000, 0x0a800000, 0x0b000000, 0x0b800000, 0x0c000000, 0x0c800000, 0x0d000000, 0x0d800000, 0x0e000000, 0x0e800000, 0x0f000000, 0x47800000, 0x80000000, 0x80800000, 0x81000000, 0x81800000, 0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000, 0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000, 0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8a000000, 0x8a800000, 0x8b000000, 0x8b800000, 0x8c000000, 0x8c800000, 0x8d000000, 0x8d800000, 0x8e000000, 0x8e800000, 0x8f000000, 0xc7800000 }; static cmsUInt16Number Base[512] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x0c00, 0x1000, 0x1400, 0x1800, 0x1c00, 0x2000, 0x2400, 0x2800, 0x2c00, 0x3000, 0x3400, 0x3800, 0x3c00, 0x4000, 0x4400, 0x4800, 0x4c00, 0x5000, 0x5400, 0x5800, 0x5c00, 0x6000, 0x6400, 0x6800, 0x6c00, 0x7000, 0x7400, 0x7800, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001, 0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100, 0x8200, 0x8400, 0x8800, 0x8c00, 0x9000, 0x9400, 0x9800, 0x9c00, 0xa000, 0xa400, 0xa800, 0xac00, 0xb000, 0xb400, 0xb800, 0xbc00, 0xc000, 0xc400, 0xc800, 0xcc00, 0xd000, 0xd400, 0xd800, 0xdc00, 0xe000, 0xe400, 0xe800, 0xec00, 0xf000, 0xf400, 0xf800, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00 }; static cmsUInt8Number Shift[512] = { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0d }; cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h) { union { cmsFloat32Number flt; cmsUInt32Number num; } out; int n = h >> 10; out.num = Mantissa[ (h & 0x3ff) + Offset[ n ] ] + Exponent[ n ]; return out.flt; } cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt) { union { cmsFloat32Number flt; cmsUInt32Number num; } in; cmsUInt32Number n, j; in.flt = flt; n = in.num; j = (n >> 23) & 0x1ff; return (cmsUInt16Number) ((cmsUInt32Number) Base[ j ] + (( n & 0x007fffff) >> Shift[ j ])); } #endif lcms2-2.6/src/lcms2.def0000644002406300000240000005430612311617072014225 0ustar mariamausersLIBRARY LCMS2.DLL EXPORTS _cms15Fixed16toDouble = _cms15Fixed16toDouble _cms8Fixed8toDouble = _cms8Fixed8toDouble cmsAdaptToIlluminant = cmsAdaptToIlluminant _cmsAdjustEndianess16 = _cmsAdjustEndianess16 _cmsAdjustEndianess32 = _cmsAdjustEndianess32 _cmsAdjustEndianess64 = _cmsAdjustEndianess64 cmsAllocNamedColorList = cmsAllocNamedColorList cmsAllocProfileSequenceDescription = cmsAllocProfileSequenceDescription cmsAppendNamedColor = cmsAppendNamedColor cmsBFDdeltaE = cmsBFDdeltaE cmsBuildGamma = cmsBuildGamma cmsBuildParametricToneCurve = cmsBuildParametricToneCurve cmsBuildSegmentedToneCurve = cmsBuildSegmentedToneCurve cmsBuildTabulatedToneCurve16 = cmsBuildTabulatedToneCurve16 cmsBuildTabulatedToneCurveFloat = cmsBuildTabulatedToneCurveFloat _cmsCalloc = _cmsCalloc cmsChannelsOf = cmsChannelsOf cmsCIE2000DeltaE = cmsCIE2000DeltaE cmsCIE94DeltaE = cmsCIE94DeltaE cmsCIECAM02Done = cmsCIECAM02Done cmsCIECAM02Forward = cmsCIECAM02Forward cmsCIECAM02Init = cmsCIECAM02Init cmsCIECAM02Reverse = cmsCIECAM02Reverse cmsCloseIOhandler = cmsCloseIOhandler cmsCloseProfile = cmsCloseProfile cmsCMCdeltaE = cmsCMCdeltaE cmsCreate_sRGBProfile = cmsCreate_sRGBProfile cmsCreate_sRGBProfileTHR = cmsCreate_sRGBProfileTHR cmsCreateBCHSWabstractProfile = cmsCreateBCHSWabstractProfile cmsCreateBCHSWabstractProfileTHR = cmsCreateBCHSWabstractProfileTHR cmsCreateExtendedTransform = cmsCreateExtendedTransform cmsCreateGrayProfile = cmsCreateGrayProfile cmsCreateGrayProfileTHR = cmsCreateGrayProfileTHR cmsCreateInkLimitingDeviceLink = cmsCreateInkLimitingDeviceLink cmsCreateInkLimitingDeviceLinkTHR = cmsCreateInkLimitingDeviceLinkTHR cmsCreateLab2Profile = cmsCreateLab2Profile cmsCreateLab2ProfileTHR = cmsCreateLab2ProfileTHR cmsCreateLab4Profile = cmsCreateLab4Profile cmsCreateLab4ProfileTHR = cmsCreateLab4ProfileTHR cmsCreateLinearizationDeviceLink = cmsCreateLinearizationDeviceLink cmsCreateLinearizationDeviceLinkTHR = cmsCreateLinearizationDeviceLinkTHR cmsCreateMultiprofileTransform = cmsCreateMultiprofileTransform cmsCreateMultiprofileTransformTHR = cmsCreateMultiprofileTransformTHR cmsCreateNULLProfile = cmsCreateNULLProfile cmsCreateNULLProfileTHR = cmsCreateNULLProfileTHR cmsCreateProfilePlaceholder = cmsCreateProfilePlaceholder cmsCreateProofingTransform = cmsCreateProofingTransform cmsCreateProofingTransformTHR = cmsCreateProofingTransformTHR cmsCreateRGBProfile = cmsCreateRGBProfile cmsCreateRGBProfileTHR = cmsCreateRGBProfileTHR cmsCreateTransform = cmsCreateTransform cmsCreateTransformTHR = cmsCreateTransformTHR cmsCreateXYZProfile = cmsCreateXYZProfile cmsCreateXYZProfileTHR = cmsCreateXYZProfileTHR cmsD50_xyY = cmsD50_xyY cmsD50_XYZ = cmsD50_XYZ _cmsDecodeDateTimeNumber = _cmsDecodeDateTimeNumber _cmsDefaultICCintents = _cmsDefaultICCintents cmsDeleteTransform = cmsDeleteTransform cmsDeltaE = cmsDeltaE cmsDetectBlackPoint = cmsDetectBlackPoint cmsDetectDestinationBlackPoint = cmsDetectDestinationBlackPoint cmsDetectTAC = cmsDetectTAC cmsDesaturateLab = cmsDesaturateLab cmsDoTransform = cmsDoTransform cmsDoTransformStride = cmsDoTransformStride _cmsDoubleTo15Fixed16 = _cmsDoubleTo15Fixed16 _cmsDoubleTo8Fixed8 = _cmsDoubleTo8Fixed8 _cmsDupMem = _cmsDupMem cmsDupNamedColorList = cmsDupNamedColorList cmsDupProfileSequenceDescription = cmsDupProfileSequenceDescription cmsDupToneCurve = cmsDupToneCurve _cmsEncodeDateTimeNumber = _cmsEncodeDateTimeNumber cmsEstimateGamma = cmsEstimateGamma cmsGetToneCurveEstimatedTableEntries = cmsGetToneCurveEstimatedTableEntries cmsGetToneCurveEstimatedTable = cmsGetToneCurveEstimatedTable cmsEvalToneCurve16 = cmsEvalToneCurve16 cmsEvalToneCurveFloat = cmsEvalToneCurveFloat cmsfilelength = cmsfilelength cmsFloat2LabEncoded = cmsFloat2LabEncoded cmsFloat2LabEncodedV2 = cmsFloat2LabEncodedV2 cmsFloat2XYZEncoded = cmsFloat2XYZEncoded cmsFormatterForColorspaceOfProfile = cmsFormatterForColorspaceOfProfile cmsFormatterForPCSOfProfile = cmsFormatterForPCSOfProfile _cmsFree = _cmsFree cmsFreeNamedColorList = cmsFreeNamedColorList cmsFreeProfileSequenceDescription = cmsFreeProfileSequenceDescription cmsFreeToneCurve = cmsFreeToneCurve cmsFreeToneCurveTriple = cmsFreeToneCurveTriple cmsGBDAlloc = cmsGBDAlloc cmsGBDFree = cmsGBDFree cmsGDBAddPoint = cmsGDBAddPoint cmsGDBCheckPoint = cmsGDBCheckPoint cmsGDBCompute = cmsGDBCompute cmsGetAlarmCodes = cmsGetAlarmCodes cmsGetColorSpace = cmsGetColorSpace cmsGetDeviceClass = cmsGetDeviceClass cmsGetEncodedICCversion = cmsGetEncodedICCversion cmsGetHeaderAttributes = cmsGetHeaderAttributes cmsGetHeaderCreationDateTime = cmsGetHeaderCreationDateTime cmsGetHeaderFlags = cmsGetHeaderFlags cmsGetHeaderManufacturer = cmsGetHeaderManufacturer cmsGetHeaderModel = cmsGetHeaderModel cmsGetHeaderProfileID = cmsGetHeaderProfileID cmsGetHeaderRenderingIntent = cmsGetHeaderRenderingIntent cmsGetNamedColorList = cmsGetNamedColorList cmsGetPCS = cmsGetPCS cmsGetPostScriptColorResource = cmsGetPostScriptColorResource cmsGetPostScriptCRD = cmsGetPostScriptCRD cmsGetPostScriptCSA = cmsGetPostScriptCSA cmsGetProfileInfo = cmsGetProfileInfo cmsGetProfileInfoASCII = cmsGetProfileInfoASCII cmsGetProfileContextID = cmsGetProfileContextID cmsGetProfileVersion = cmsGetProfileVersion cmsGetSupportedIntents = cmsGetSupportedIntents cmsGetTagCount = cmsGetTagCount cmsGetTagSignature = cmsGetTagSignature cmsGetTransformContextID = cmsGetTransformContextID _cmsICCcolorSpace = _cmsICCcolorSpace _cmsIOPrintf = _cmsIOPrintf cmsIsCLUT = cmsIsCLUT cmsIsIntentSupported = cmsIsIntentSupported cmsIsMatrixShaper = cmsIsMatrixShaper cmsIsTag = cmsIsTag cmsIsToneCurveDescending = cmsIsToneCurveDescending cmsIsToneCurveLinear = cmsIsToneCurveLinear cmsIsToneCurveMonotonic = cmsIsToneCurveMonotonic cmsIsToneCurveMultisegment = cmsIsToneCurveMultisegment cmsGetToneCurveParametricType = cmsGetToneCurveParametricType cmsIT8Alloc = cmsIT8Alloc cmsIT8DefineDblFormat = cmsIT8DefineDblFormat cmsIT8EnumDataFormat = cmsIT8EnumDataFormat cmsIT8EnumProperties = cmsIT8EnumProperties cmsIT8EnumPropertyMulti = cmsIT8EnumPropertyMulti cmsIT8Free = cmsIT8Free cmsIT8GetData = cmsIT8GetData cmsIT8GetDataDbl = cmsIT8GetDataDbl cmsIT8FindDataFormat = cmsIT8FindDataFormat cmsIT8GetDataRowCol = cmsIT8GetDataRowCol cmsIT8GetDataRowColDbl = cmsIT8GetDataRowColDbl cmsIT8GetPatchName = cmsIT8GetPatchName cmsIT8GetPatchByName = cmsIT8GetPatchByName cmsIT8GetProperty = cmsIT8GetProperty cmsIT8GetPropertyDbl = cmsIT8GetPropertyDbl cmsIT8GetPropertyMulti = cmsIT8GetPropertyMulti cmsIT8GetSheetType = cmsIT8GetSheetType cmsIT8LoadFromFile = cmsIT8LoadFromFile cmsIT8LoadFromMem = cmsIT8LoadFromMem cmsIT8SaveToFile = cmsIT8SaveToFile cmsIT8SaveToMem = cmsIT8SaveToMem cmsIT8SetComment = cmsIT8SetComment cmsIT8SetData = cmsIT8SetData cmsIT8SetDataDbl = cmsIT8SetDataDbl cmsIT8SetDataFormat = cmsIT8SetDataFormat cmsIT8SetDataRowCol = cmsIT8SetDataRowCol cmsIT8SetDataRowColDbl = cmsIT8SetDataRowColDbl cmsIT8SetPropertyDbl = cmsIT8SetPropertyDbl cmsIT8SetPropertyHex = cmsIT8SetPropertyHex cmsIT8SetPropertyStr = cmsIT8SetPropertyStr cmsIT8SetPropertyMulti = cmsIT8SetPropertyMulti cmsIT8SetPropertyUncooked = cmsIT8SetPropertyUncooked cmsIT8SetSheetType = cmsIT8SetSheetType cmsIT8SetTable = cmsIT8SetTable cmsIT8SetTableByLabel = cmsIT8SetTableByLabel cmsIT8SetIndexColumn = cmsIT8SetIndexColumn cmsIT8TableCount = cmsIT8TableCount cmsJoinToneCurve = cmsJoinToneCurve cmsLab2LCh = cmsLab2LCh cmsLab2XYZ = cmsLab2XYZ cmsLabEncoded2Float = cmsLabEncoded2Float cmsLabEncoded2FloatV2 = cmsLabEncoded2FloatV2 cmsLCh2Lab = cmsLCh2Lab _cmsLCMScolorSpace = _cmsLCMScolorSpace cmsLinkTag = cmsLinkTag cmsTagLinkedTo = cmsTagLinkedTo cmsPipelineAlloc = cmsPipelineAlloc cmsPipelineCat = cmsPipelineCat cmsPipelineCheckAndRetreiveStages = cmsPipelineCheckAndRetreiveStages cmsPipelineDup = cmsPipelineDup cmsPipelineStageCount = cmsPipelineStageCount cmsPipelineEval16 = cmsPipelineEval16 cmsPipelineEvalFloat = cmsPipelineEvalFloat cmsPipelineEvalReverseFloat = cmsPipelineEvalReverseFloat cmsPipelineFree = cmsPipelineFree cmsPipelineGetPtrToFirstStage = cmsPipelineGetPtrToFirstStage cmsPipelineGetPtrToLastStage = cmsPipelineGetPtrToLastStage cmsPipelineInputChannels = cmsPipelineInputChannels cmsPipelineInsertStage = cmsPipelineInsertStage cmsPipelineOutputChannels = cmsPipelineOutputChannels cmsPipelineSetSaveAs8bitsFlag = cmsPipelineSetSaveAs8bitsFlag _cmsPipelineSetOptimizationParameters = _cmsPipelineSetOptimizationParameters cmsPipelineUnlinkStage = cmsPipelineUnlinkStage _cmsMalloc = _cmsMalloc _cmsMallocZero = _cmsMallocZero _cmsMAT3eval = _cmsMAT3eval _cmsMAT3identity = _cmsMAT3identity _cmsMAT3inverse = _cmsMAT3inverse _cmsMAT3isIdentity = _cmsMAT3isIdentity _cmsMAT3per = _cmsMAT3per _cmsMAT3solve = _cmsMAT3solve cmsMD5computeID = cmsMD5computeID cmsMLUalloc = cmsMLUalloc cmsMLUdup = cmsMLUdup cmsMLUfree = cmsMLUfree cmsMLUgetASCII = cmsMLUgetASCII cmsMLUgetTranslation = cmsMLUgetTranslation cmsMLUgetWide = cmsMLUgetWide cmsMLUsetASCII = cmsMLUsetASCII cmsMLUsetWide = cmsMLUsetWide cmsStageAllocCLut16bit = cmsStageAllocCLut16bit cmsStageAllocCLut16bitGranular = cmsStageAllocCLut16bitGranular cmsStageAllocCLutFloat = cmsStageAllocCLutFloat cmsStageAllocCLutFloatGranular = cmsStageAllocCLutFloatGranular cmsStageAllocToneCurves = cmsStageAllocToneCurves cmsStageAllocIdentity = cmsStageAllocIdentity cmsStageAllocMatrix = cmsStageAllocMatrix _cmsStageAllocPlaceholder = _cmsStageAllocPlaceholder cmsStageDup = cmsStageDup cmsStageFree = cmsStageFree cmsStageNext = cmsStageNext cmsStageInputChannels = cmsStageInputChannels cmsStageOutputChannels = cmsStageOutputChannels cmsStageSampleCLut16bit = cmsStageSampleCLut16bit cmsStageSampleCLutFloat = cmsStageSampleCLutFloat cmsStageType = cmsStageType cmsStageData = cmsStageData cmsNamedColorCount = cmsNamedColorCount cmsNamedColorIndex = cmsNamedColorIndex cmsNamedColorInfo = cmsNamedColorInfo cmsOpenIOhandlerFromFile = cmsOpenIOhandlerFromFile cmsOpenIOhandlerFromMem = cmsOpenIOhandlerFromMem cmsOpenIOhandlerFromNULL = cmsOpenIOhandlerFromNULL cmsOpenIOhandlerFromStream = cmsOpenIOhandlerFromStream cmsOpenProfileFromFile = cmsOpenProfileFromFile cmsOpenProfileFromFileTHR = cmsOpenProfileFromFileTHR cmsOpenProfileFromIOhandlerTHR = cmsOpenProfileFromIOhandlerTHR cmsOpenProfileFromMem = cmsOpenProfileFromMem cmsOpenProfileFromMemTHR = cmsOpenProfileFromMemTHR cmsOpenProfileFromStream = cmsOpenProfileFromStream cmsOpenProfileFromStreamTHR = cmsOpenProfileFromStreamTHR cmsPlugin = cmsPlugin _cmsRead15Fixed16Number = _cmsRead15Fixed16Number _cmsReadAlignment = _cmsReadAlignment _cmsReadFloat32Number = _cmsReadFloat32Number cmsReadRawTag = cmsReadRawTag cmsReadTag = cmsReadTag _cmsReadTypeBase = _cmsReadTypeBase _cmsReadUInt16Array = _cmsReadUInt16Array _cmsReadUInt16Number = _cmsReadUInt16Number _cmsReadUInt32Number = _cmsReadUInt32Number _cmsReadUInt64Number = _cmsReadUInt64Number _cmsReadUInt8Number = _cmsReadUInt8Number _cmsReadXYZNumber = _cmsReadXYZNumber _cmsRealloc = _cmsRealloc cmsReverseToneCurve = cmsReverseToneCurve cmsReverseToneCurveEx = cmsReverseToneCurveEx cmsSaveProfileToFile = cmsSaveProfileToFile cmsSaveProfileToIOhandler = cmsSaveProfileToIOhandler cmsSaveProfileToMem = cmsSaveProfileToMem cmsSaveProfileToStream = cmsSaveProfileToStream cmsSetAdaptationState = cmsSetAdaptationState cmsSetAlarmCodes = cmsSetAlarmCodes cmsSetColorSpace = cmsSetColorSpace cmsSetDeviceClass = cmsSetDeviceClass cmsSetEncodedICCversion = cmsSetEncodedICCversion cmsSetHeaderAttributes = cmsSetHeaderAttributes cmsSetHeaderFlags = cmsSetHeaderFlags cmsSetHeaderManufacturer = cmsSetHeaderManufacturer cmsSetHeaderModel = cmsSetHeaderModel cmsSetHeaderProfileID = cmsSetHeaderProfileID cmsSetHeaderRenderingIntent = cmsSetHeaderRenderingIntent cmsSetLogErrorHandler = cmsSetLogErrorHandler cmsSetPCS = cmsSetPCS cmsSetProfileVersion = cmsSetProfileVersion cmsSignalError = cmsSignalError cmsSmoothToneCurve = cmsSmoothToneCurve cmsstrcasecmp = cmsstrcasecmp cmsTempFromWhitePoint = cmsTempFromWhitePoint cmsTransform2DeviceLink = cmsTransform2DeviceLink cmsUnregisterPlugins = cmsUnregisterPlugins _cmsVEC3cross = _cmsVEC3cross _cmsVEC3distance = _cmsVEC3distance _cmsVEC3dot = _cmsVEC3dot _cmsVEC3init = _cmsVEC3init _cmsVEC3length = _cmsVEC3length _cmsVEC3minus = _cmsVEC3minus cmsWhitePointFromTemp = cmsWhitePointFromTemp _cmsWrite15Fixed16Number = _cmsWrite15Fixed16Number _cmsWriteAlignment = _cmsWriteAlignment _cmsWriteFloat32Number = _cmsWriteFloat32Number cmsWriteRawTag = cmsWriteRawTag cmsWriteTag = cmsWriteTag _cmsWriteTypeBase = _cmsWriteTypeBase _cmsWriteUInt16Array = _cmsWriteUInt16Array _cmsWriteUInt16Number = _cmsWriteUInt16Number _cmsWriteUInt32Number = _cmsWriteUInt32Number _cmsWriteUInt64Number = _cmsWriteUInt64Number _cmsWriteUInt8Number = _cmsWriteUInt8Number _cmsWriteXYZNumber = _cmsWriteXYZNumber cmsxyY2XYZ = cmsxyY2XYZ cmsXYZ2Lab = cmsXYZ2Lab cmsXYZ2xyY = cmsXYZ2xyY cmsXYZEncoded2Float = cmsXYZEncoded2Float cmsSliceSpace16 = cmsSliceSpace16 cmsSliceSpaceFloat = cmsSliceSpaceFloat cmsChangeBuffersFormat = cmsChangeBuffersFormat cmsDictAlloc = cmsDictAlloc cmsDictFree = cmsDictFree cmsDictDup = cmsDictDup cmsDictAddEntry = cmsDictAddEntry cmsDictGetEntryList = cmsDictGetEntryList cmsDictNextEntry = cmsDictNextEntry _cmsGetTransformUserData = _cmsGetTransformUserData _cmsSetTransformUserData = _cmsSetTransformUserData _cmsGetTransformFormatters16 = _cmsGetTransformFormatters16 _cmsGetTransformFormattersFloat = _cmsGetTransformFormattersFloat cmsGetHeaderCreator = cmsGetHeaderCreator cmsPluginTHR = cmsPluginTHR cmsGetPipelineContextID = cmsGetPipelineContextID cmsGetTransformInputFormat = cmsGetTransformInputFormat cmsGetTransformOutputFormat = cmsGetTransformOutputFormat cmsCreateContext = cmsCreateContext cmsDupContext = cmsDupContext cmsDeleteContext = cmsDeleteContext cmsGetContextUserData = cmsGetContextUserData cmsUnregisterPluginsTHR = cmsUnregisterPluginsTHR cmsSetAlarmCodesTHR = cmsSetAlarmCodesTHR cmsGetAlarmCodesTHR = cmsGetAlarmCodesTHR cmsSetAdaptationStateTHR = cmsSetAdaptationStateTHR cmsSetLogErrorHandlerTHR = cmsSetLogErrorHandlerTHR cmsGetSupportedIntentsTHR = cmsGetSupportedIntentsTHR cmsMLUtranslationsCount = cmsMLUtranslationsCount cmsMLUtranslationsCodes = cmsMLUtranslationsCodes _cmsCreateMutex = _cmsCreateMutex _cmsDestroyMutex = _cmsDestroyMutex _cmsLockMutex = _cmsLockMutex _cmsUnlockMutex = _cmsUnlockMutex lcms2-2.6/src/cmssamp.c0000644002406300000240000004334712311617072014337 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2010 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" #define cmsmin(a, b) (((a) < (b)) ? (a) : (b)) #define cmsmax(a, b) (((a) > (b)) ? (a) : (b)) // This file contains routines for resampling and LUT optimization, black point detection // and black preservation. // Black point detection ------------------------------------------------------------------------- // PCS -> PCS round trip transform, always uses relative intent on the device -> pcs static cmsHTRANSFORM CreateRoundtripXForm(cmsHPROFILE hProfile, cmsUInt32Number nIntent) { cmsContext ContextID = cmsGetProfileContextID(hProfile); cmsHPROFILE hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); cmsHTRANSFORM xform; cmsBool BPC[4] = { FALSE, FALSE, FALSE, FALSE }; cmsFloat64Number States[4] = { 1.0, 1.0, 1.0, 1.0 }; cmsHPROFILE hProfiles[4]; cmsUInt32Number Intents[4]; hProfiles[0] = hLab; hProfiles[1] = hProfile; hProfiles[2] = hProfile; hProfiles[3] = hLab; Intents[0] = INTENT_RELATIVE_COLORIMETRIC; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = INTENT_RELATIVE_COLORIMETRIC; xform = cmsCreateExtendedTransform(ContextID, 4, hProfiles, BPC, Intents, States, NULL, 0, TYPE_Lab_DBL, TYPE_Lab_DBL, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); cmsCloseProfile(hLab); return xform; } // Use darker colorants to obtain black point. This works in the relative colorimetric intent and // assumes more ink results in darker colors. No ink limit is assumed. static cmsBool BlackPointAsDarkerColorant(cmsHPROFILE hInput, cmsUInt32Number Intent, cmsCIEXYZ* BlackPoint, cmsUInt32Number dwFlags) { cmsUInt16Number *Black; cmsHTRANSFORM xform; cmsColorSpaceSignature Space; cmsUInt32Number nChannels; cmsUInt32Number dwFormat; cmsHPROFILE hLab; cmsCIELab Lab; cmsCIEXYZ BlackXYZ; cmsContext ContextID = cmsGetProfileContextID(hInput); // If the profile does not support input direction, assume Black point 0 if (!cmsIsIntentSupported(hInput, Intent, LCMS_USED_AS_INPUT)) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Create a formatter which has n channels and floating point dwFormat = cmsFormatterForColorspaceOfProfile(hInput, 2, FALSE); // Try to get black by using black colorant Space = cmsGetColorSpace(hInput); // This function returns darker colorant in 16 bits for several spaces if (!_cmsEndPointsBySpace(Space, NULL, &Black, &nChannels)) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } if (nChannels != T_CHANNELS(dwFormat)) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Lab will be used as the output space, but lab2 will avoid recursion hLab = cmsCreateLab2ProfileTHR(ContextID, NULL); if (hLab == NULL) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Create the transform xform = cmsCreateTransformTHR(ContextID, hInput, dwFormat, hLab, TYPE_Lab_DBL, Intent, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); cmsCloseProfile(hLab); if (xform == NULL) { // Something went wrong. Get rid of open resources and return zero as black BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Convert black to Lab cmsDoTransform(xform, Black, &Lab, 1); // Force it to be neutral, clip to max. L* of 50 Lab.a = Lab.b = 0; if (Lab.L > 50) Lab.L = 50; // Free the resources cmsDeleteTransform(xform); // Convert from Lab (which is now clipped) to XYZ. cmsLab2XYZ(NULL, &BlackXYZ, &Lab); if (BlackPoint != NULL) *BlackPoint = BlackXYZ; return TRUE; cmsUNUSED_PARAMETER(dwFlags); } // Get a black point of output CMYK profile, discounting any ink-limiting embedded // in the profile. For doing that, we use perceptual intent in input direction: // Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab static cmsBool BlackPointUsingPerceptualBlack(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile) { cmsHTRANSFORM hRoundTrip; cmsCIELab LabIn, LabOut; cmsCIEXYZ BlackXYZ; // Is the intent supported by the profile? if (!cmsIsIntentSupported(hProfile, INTENT_PERCEPTUAL, LCMS_USED_AS_INPUT)) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return TRUE; } hRoundTrip = CreateRoundtripXForm(hProfile, INTENT_PERCEPTUAL); if (hRoundTrip == NULL) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } LabIn.L = LabIn.a = LabIn.b = 0; cmsDoTransform(hRoundTrip, &LabIn, &LabOut, 1); // Clip Lab to reasonable limits if (LabOut.L > 50) LabOut.L = 50; LabOut.a = LabOut.b = 0; cmsDeleteTransform(hRoundTrip); // Convert it to XYZ cmsLab2XYZ(NULL, &BlackXYZ, &LabOut); if (BlackPoint != NULL) *BlackPoint = BlackXYZ; return TRUE; } // This function shouldn't exist at all -- there is such quantity of broken // profiles on black point tag, that we must somehow fix chromaticity to // avoid huge tint when doing Black point compensation. This function does // just that. There is a special flag for using black point tag, but turned // off by default because it is bogus on most profiles. The detection algorithm // involves to turn BP to neutral and to use only L component. cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsProfileClassSignature devClass; // Make sure the device class is adequate devClass = cmsGetDeviceClass(hProfile); if (devClass == cmsSigLinkClass || devClass == cmsSigAbstractClass || devClass == cmsSigNamedColorClass) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Make sure intent is adequate if (Intent != INTENT_PERCEPTUAL && Intent != INTENT_RELATIVE_COLORIMETRIC && Intent != INTENT_SATURATION) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // v4 + perceptual & saturation intents does have its own black point, and it is // well specified enough to use it. Black point tag is deprecated in V4. if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) && (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) { // Matrix shaper share MRC & perceptual intents if (cmsIsMatrixShaper(hProfile)) return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0); // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents BlackPoint -> X = cmsPERCEPTUAL_BLACK_X; BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y; BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z; return TRUE; } #ifdef CMS_USE_PROFILE_BLACK_POINT_TAG // v2, v4 rel/abs colorimetric if (cmsIsTag(hProfile, cmsSigMediaBlackPointTag) && Intent == INTENT_RELATIVE_COLORIMETRIC) { cmsCIEXYZ *BlackPtr, BlackXYZ, UntrustedBlackPoint, TrustedBlackPoint, MediaWhite; cmsCIELab Lab; // If black point is specified, then use it, BlackPtr = cmsReadTag(hProfile, cmsSigMediaBlackPointTag); if (BlackPtr != NULL) { BlackXYZ = *BlackPtr; _cmsReadMediaWhitePoint(&MediaWhite, hProfile); // Black point is absolute XYZ, so adapt to D50 to get PCS value cmsAdaptToIlluminant(&UntrustedBlackPoint, &MediaWhite, cmsD50_XYZ(), &BlackXYZ); // Force a=b=0 to get rid of any chroma cmsXYZ2Lab(NULL, &Lab, &UntrustedBlackPoint); Lab.a = Lab.b = 0; if (Lab.L > 50) Lab.L = 50; // Clip to L* <= 50 cmsLab2XYZ(NULL, &TrustedBlackPoint, &Lab); if (BlackPoint != NULL) *BlackPoint = TrustedBlackPoint; return TRUE; } } #endif // That is about v2 profiles. // If output profile, discount ink-limiting and that's all if (Intent == INTENT_RELATIVE_COLORIMETRIC && (cmsGetDeviceClass(hProfile) == cmsSigOutputClass) && (cmsGetColorSpace(hProfile) == cmsSigCmykData)) return BlackPointUsingPerceptualBlack(BlackPoint, hProfile); // Nope, compute BP using current intent. return BlackPointAsDarkerColorant(hProfile, Intent, BlackPoint, dwFlags); } // --------------------------------------------------------------------------------------------------------- // Least Squares Fit of a Quadratic Curve to Data // http://www.personal.psu.edu/jhm/f90/lectures/lsq2.html static cmsFloat64Number RootOfLeastSquaresFitQuadraticCurve(int n, cmsFloat64Number x[], cmsFloat64Number y[]) { double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0; double sum_y = 0, sum_yx = 0, sum_yx2 = 0; double d, a, b, c; int i; cmsMAT3 m; cmsVEC3 v, res; if (n < 4) return 0; for (i=0; i < n; i++) { double xn = x[i]; double yn = y[i]; sum_x += xn; sum_x2 += xn*xn; sum_x3 += xn*xn*xn; sum_x4 += xn*xn*xn*xn; sum_y += yn; sum_yx += yn*xn; sum_yx2 += yn*xn*xn; } _cmsVEC3init(&m.v[0], n, sum_x, sum_x2); _cmsVEC3init(&m.v[1], sum_x, sum_x2, sum_x3); _cmsVEC3init(&m.v[2], sum_x2, sum_x3, sum_x4); _cmsVEC3init(&v, sum_y, sum_yx, sum_yx2); if (!_cmsMAT3solve(&res, &m, &v)) return 0; a = res.n[2]; b = res.n[1]; c = res.n[0]; if (fabs(a) < 1.0E-10) { return cmsmin(0, cmsmax(50, -c/b )); } else { d = b*b - 4.0 * a * c; if (d <= 0) { return 0; } else { double rt = (-b + sqrt(d)) / (2.0 * a); return cmsmax(0, cmsmin(50, rt)); } } } /* static cmsBool IsMonotonic(int n, const cmsFloat64Number Table[]) { int i; cmsFloat64Number last; last = Table[n-1]; for (i = n-2; i >= 0; --i) { if (Table[i] > last) return FALSE; else last = Table[i]; } return TRUE; } */ // Calculates the black point of a destination profile. // This algorithm comes from the Adobe paper disclosing its black point compensation method. cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) { cmsColorSpaceSignature ColorSpace; cmsHTRANSFORM hRoundTrip = NULL; cmsCIELab InitialLab, destLab, Lab; cmsFloat64Number inRamp[256], outRamp[256]; cmsFloat64Number MinL, MaxL; cmsBool NearlyStraightMidrange = TRUE; cmsFloat64Number yRamp[256]; cmsFloat64Number x[256], y[256]; cmsFloat64Number lo, hi; int n, l; cmsProfileClassSignature devClass; // Make sure the device class is adequate devClass = cmsGetDeviceClass(hProfile); if (devClass == cmsSigLinkClass || devClass == cmsSigAbstractClass || devClass == cmsSigNamedColorClass) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Make sure intent is adequate if (Intent != INTENT_PERCEPTUAL && Intent != INTENT_RELATIVE_COLORIMETRIC && Intent != INTENT_SATURATION) { BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // v4 + perceptual & saturation intents does have its own black point, and it is // well specified enough to use it. Black point tag is deprecated in V4. if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) && (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) { // Matrix shaper share MRC & perceptual intents if (cmsIsMatrixShaper(hProfile)) return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0); // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents BlackPoint -> X = cmsPERCEPTUAL_BLACK_X; BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y; BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z; return TRUE; } // Check if the profile is lut based and gray, rgb or cmyk (7.2 in Adobe's document) ColorSpace = cmsGetColorSpace(hProfile); if (!cmsIsCLUT(hProfile, Intent, LCMS_USED_AS_OUTPUT ) || (ColorSpace != cmsSigGrayData && ColorSpace != cmsSigRgbData && ColorSpace != cmsSigCmykData)) { // In this case, handle as input case return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags); } // It is one of the valid cases!, use Adobe algorithm // Set a first guess, that should work on good profiles. if (Intent == INTENT_RELATIVE_COLORIMETRIC) { cmsCIEXYZ IniXYZ; // calculate initial Lab as source black point if (!cmsDetectBlackPoint(&IniXYZ, hProfile, Intent, dwFlags)) { return FALSE; } // convert the XYZ to lab cmsXYZ2Lab(NULL, &InitialLab, &IniXYZ); } else { // set the initial Lab to zero, that should be the black point for perceptual and saturation InitialLab.L = 0; InitialLab.a = 0; InitialLab.b = 0; } // Step 2 // ====== // Create a roundtrip. Define a Transform BT for all x in L*a*b* hRoundTrip = CreateRoundtripXForm(hProfile, Intent); if (hRoundTrip == NULL) return FALSE; // Compute ramps for (l=0; l < 256; l++) { Lab.L = (cmsFloat64Number) (l * 100.0) / 255.0; Lab.a = cmsmin(50, cmsmax(-50, InitialLab.a)); Lab.b = cmsmin(50, cmsmax(-50, InitialLab.b)); cmsDoTransform(hRoundTrip, &Lab, &destLab, 1); inRamp[l] = Lab.L; outRamp[l] = destLab.L; } // Make monotonic for (l = 254; l > 0; --l) { outRamp[l] = cmsmin(outRamp[l], outRamp[l+1]); } // Check if (! (outRamp[0] < outRamp[255])) { cmsDeleteTransform(hRoundTrip); BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // Test for mid range straight (only on relative colorimetric) NearlyStraightMidrange = TRUE; MinL = outRamp[0]; MaxL = outRamp[255]; if (Intent == INTENT_RELATIVE_COLORIMETRIC) { for (l=0; l < 256; l++) { if (! ((inRamp[l] <= MinL + 0.2 * (MaxL - MinL) ) || (fabs(inRamp[l] - outRamp[l]) < 4.0 ))) NearlyStraightMidrange = FALSE; } // If the mid range is straight (as determined above) then the // DestinationBlackPoint shall be the same as initialLab. // Otherwise, the DestinationBlackPoint shall be determined // using curve fitting. if (NearlyStraightMidrange) { cmsLab2XYZ(NULL, BlackPoint, &InitialLab); cmsDeleteTransform(hRoundTrip); return TRUE; } } // curve fitting: The round-trip curve normally looks like a nearly constant section at the black point, // with a corner and a nearly straight line to the white point. for (l=0; l < 256; l++) { yRamp[l] = (outRamp[l] - MinL) / (MaxL - MinL); } // find the black point using the least squares error quadratic curve fitting if (Intent == INTENT_RELATIVE_COLORIMETRIC) { lo = 0.1; hi = 0.5; } else { // Perceptual and saturation lo = 0.03; hi = 0.25; } // Capture shadow points for the fitting. n = 0; for (l=0; l < 256; l++) { cmsFloat64Number ff = yRamp[l]; if (ff >= lo && ff < hi) { x[n] = inRamp[l]; y[n] = yRamp[l]; n++; } } // No suitable points if (n < 3 ) { cmsDeleteTransform(hRoundTrip); BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; return FALSE; } // fit and get the vertex of quadratic curve Lab.L = RootOfLeastSquaresFitQuadraticCurve(n, x, y); if (Lab.L < 0.0) { // clip to zero L* if the vertex is negative Lab.L = 0; } Lab.a = InitialLab.a; Lab.b = InitialLab.b; cmsLab2XYZ(NULL, BlackPoint, &Lab); cmsDeleteTransform(hRoundTrip); return TRUE; } lcms2-2.6/src/cmsps2.c0000644002406300000240000013344712311617072014104 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2011 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "lcms2_internal.h" // PostScript ColorRenderingDictionary and ColorSpaceArray #define MAXPSCOLS 60 // Columns on tables /* Implementation -------------- PostScript does use XYZ as its internal PCS. But since PostScript interpolation tables are limited to 8 bits, I use Lab as a way to improve the accuracy, favoring perceptual results. So, for the creation of each CRD, CSA the profiles are converted to Lab via a device link between profile -> Lab or Lab -> profile. The PS code necessary to convert Lab <-> XYZ is also included. Color Space Arrays (CSA) ================================================================================== In order to obtain precision, code chooses between three ways to implement the device -> XYZ transform. These cases identifies monochrome profiles (often implemented as a set of curves), matrix-shaper and Pipeline-based. Monochrome ----------- This is implemented as /CIEBasedA CSA. The prelinearization curve is placed into /DecodeA section, and matrix equals to D50. Since here is no interpolation tables, I do the conversion directly to XYZ NOTE: CLUT-based monochrome profiles are NOT supported. So, cmsFLAGS_MATRIXINPUT flag is forced on such profiles. [ /CIEBasedA << /DecodeA { transfer function } bind /MatrixA [D50] /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ] /WhitePoint [D50] /BlackPoint [BP] /RenderingIntent (intent) >> ] On simpler profiles, the PCS is already XYZ, so no conversion is required. Matrix-shaper based ------------------- This is implemented both with /CIEBasedABC or /CIEBasedDEF on dependig of profile implementation. Since here there are no interpolation tables, I do the conversion directly to XYZ [ /CIEBasedABC << /DecodeABC [ {transfer1} {transfer2} {transfer3} ] /MatrixABC [Matrix] /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ] /DecodeLMN [ { / 2} dup dup ] /WhitePoint [D50] /BlackPoint [BP] /RenderingIntent (intent) >> ] CLUT based ---------- Lab is used in such cases. [ /CIEBasedDEF << /DecodeDEF [ ] /Table [ p p p [<...>]] /RangeABC [ 0 1 0 1 0 1] /DecodeABC[ ] /RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ] % -128/500 1+127/500 0 1 -127/200 1+128/200 /MatrixABC [ 1 1 1 1 0 0 0 0 -1] /WhitePoint [D50] /BlackPoint [BP] /RenderingIntent (intent) ] Color Rendering Dictionaries (CRD) ================================== These are always implemented as CLUT, and always are using Lab. Since CRD are expected to be used as resources, the code adds the definition as well. << /ColorRenderingType 1 /WhitePoint [ D50 ] /BlackPoint [BP] /MatrixPQR [ Bradford ] /RangePQR [-0.125 1.375 -0.125 1.375 -0.125 1.375 ] /TransformPQR [ {4 index 3 get div 2 index 3 get mul exch pop exch pop exch pop exch pop } bind {4 index 4 get div 2 index 4 get mul exch pop exch pop exch pop exch pop } bind {4 index 5 get div 2 index 5 get mul exch pop exch pop exch pop exch pop } bind ] /MatrixABC <...> /EncodeABC <...> /RangeABC <.. used for XYZ -> Lab> /EncodeLMN /RenderTable [ p p p [<...>]] /RenderingIntent (Perceptual) >> /Current exch /ColorRendering defineresource pop The following stages are used to convert from XYZ to Lab -------------------------------------------------------- Input is given at LMN stage on X, Y, Z Encode LMN gives us f(X/Xn), f(Y/Yn), f(Z/Zn) /EncodeLMN [ { 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind { 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind { 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind ] MatrixABC is used to compute f(Y/Yn), f(X/Xn) - f(Y/Yn), f(Y/Yn) - f(Z/Zn) | 0 1 0| | 1 -1 0| | 0 1 -1| /MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ] EncodeABC finally gives Lab values. /EncodeABC [ { 116 mul 16 sub 100 div } bind { 500 mul 128 add 255 div } bind { 200 mul 128 add 255 div } bind ] The following stages are used to convert Lab to XYZ ---------------------------------------------------- /RangeABC [ 0 1 0 1 0 1] /DecodeABC [ { 100 mul 16 add 116 div } bind { 255 mul 128 sub 500 div } bind { 255 mul 128 sub 200 div } bind ] /MatrixABC [ 1 1 1 1 0 0 0 0 -1] /DecodeLMN [ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind ] */ /* PostScript algorithms discussion. ========================================================================================================= 1D interpolation algorithm 1D interpolation (float) ------------------------ val2 = Domain * Value; cell0 = (int) floor(val2); cell1 = (int) ceil(val2); rest = val2 - cell0; y0 = LutTable[cell0] ; y1 = LutTable[cell1] ; y = y0 + (y1 - y0) * rest; PostScript code Stack ================================================ { % v [array] % v tab dup % v tab tab length 1 sub % v tab dom 3 -1 roll % tab dom v mul % tab val2 dup % tab val2 val2 dup % tab val2 val2 val2 floor cvi % tab val2 val2 cell0 exch % tab val2 cell0 val2 ceiling cvi % tab val2 cell0 cell1 3 index % tab val2 cell0 cell1 tab exch % tab val2 cell0 tab cell1 get % tab val2 cell0 y1 4 -1 roll % val2 cell0 y1 tab 3 -1 roll % val2 y1 tab cell0 get % val2 y1 y0 dup % val2 y1 y0 y0 3 1 roll % val2 y0 y1 y0 sub % val2 y0 (y1-y0) 3 -1 roll % y0 (y1-y0) val2 dup % y0 (y1-y0) val2 val2 floor cvi % y0 (y1-y0) val2 floor(val2) sub % y0 (y1-y0) rest mul % y0 t1 add % y 65535 div % result } bind */ // This struct holds the memory block currently being write typedef struct { _cmsStageCLutData* Pipeline; cmsIOHANDLER* m; int FirstComponent; int SecondComponent; const char* PreMaj; const char* PostMaj; const char* PreMin; const char* PostMin; int FixWhite; // Force mapping of pure white cmsColorSpaceSignature ColorSpace; // ColorSpace of profile } cmsPsSamplerCargo; static int _cmsPSActualColumn = 0; // Convert to byte static cmsUInt8Number Word2Byte(cmsUInt16Number w) { return (cmsUInt8Number) floor((cmsFloat64Number) w / 257.0 + 0.5); } // Convert to byte (using ICC2 notation) /* static cmsUInt8Number L2Byte(cmsUInt16Number w) { int ww = w + 0x0080; if (ww > 0xFFFF) return 0xFF; return (cmsUInt8Number) ((cmsUInt16Number) (ww >> 8) & 0xFF); } */ // Write a cooked byte static void WriteByte(cmsIOHANDLER* m, cmsUInt8Number b) { _cmsIOPrintf(m, "%02x", b); _cmsPSActualColumn += 2; if (_cmsPSActualColumn > MAXPSCOLS) { _cmsIOPrintf(m, "\n"); _cmsPSActualColumn = 0; } } // ----------------------------------------------------------------- PostScript generation // Removes offending Carriage returns static char* RemoveCR(const char* txt) { static char Buffer[2048]; char* pt; strncpy(Buffer, txt, 2047); Buffer[2047] = 0; for (pt = Buffer; *pt; pt++) if (*pt == '\n' || *pt == '\r') *pt = ' '; return Buffer; } static void EmitHeader(cmsIOHANDLER* m, const char* Title, cmsHPROFILE hProfile) { time_t timer; cmsMLU *Description, *Copyright; char DescASCII[256], CopyrightASCII[256]; time(&timer); Description = (cmsMLU*) cmsReadTag(hProfile, cmsSigProfileDescriptionTag); Copyright = (cmsMLU*) cmsReadTag(hProfile, cmsSigCopyrightTag); DescASCII[0] = DescASCII[255] = 0; CopyrightASCII[0] = CopyrightASCII[255] = 0; if (Description != NULL) cmsMLUgetASCII(Description, cmsNoLanguage, cmsNoCountry, DescASCII, 255); if (Copyright != NULL) cmsMLUgetASCII(Copyright, cmsNoLanguage, cmsNoCountry, CopyrightASCII, 255); _cmsIOPrintf(m, "%%!PS-Adobe-3.0\n"); _cmsIOPrintf(m, "%%\n"); _cmsIOPrintf(m, "%% %s\n", Title); _cmsIOPrintf(m, "%% Source: %s\n", RemoveCR(DescASCII)); _cmsIOPrintf(m, "%% %s\n", RemoveCR(CopyrightASCII)); _cmsIOPrintf(m, "%% Created: %s", ctime(&timer)); // ctime appends a \n!!! _cmsIOPrintf(m, "%%\n"); _cmsIOPrintf(m, "%%%%BeginResource\n"); } // Emits White & Black point. White point is always D50, Black point is the device // Black point adapted to D50. static void EmitWhiteBlackD50(cmsIOHANDLER* m, cmsCIEXYZ* BlackPoint) { _cmsIOPrintf(m, "/BlackPoint [%f %f %f]\n", BlackPoint -> X, BlackPoint -> Y, BlackPoint -> Z); _cmsIOPrintf(m, "/WhitePoint [%f %f %f]\n", cmsD50_XYZ()->X, cmsD50_XYZ()->Y, cmsD50_XYZ()->Z); } static void EmitRangeCheck(cmsIOHANDLER* m) { _cmsIOPrintf(m, "dup 0.0 lt { pop 0.0 } if " "dup 1.0 gt { pop 1.0 } if "); } // Does write the intent static void EmitIntent(cmsIOHANDLER* m, int RenderingIntent) { const char *intent; switch (RenderingIntent) { case INTENT_PERCEPTUAL: intent = "Perceptual"; break; case INTENT_RELATIVE_COLORIMETRIC: intent = "RelativeColorimetric"; break; case INTENT_ABSOLUTE_COLORIMETRIC: intent = "AbsoluteColorimetric"; break; case INTENT_SATURATION: intent = "Saturation"; break; default: intent = "Undefined"; break; } _cmsIOPrintf(m, "/RenderingIntent (%s)\n", intent ); } // // Convert L* to Y // // Y = Yn*[ (L* + 16) / 116] ^ 3 if (L*) >= 6 / 29 // = Yn*( L* / 116) / 7.787 if (L*) < 6 / 29 // /* static void EmitL2Y(cmsIOHANDLER* m) { _cmsIOPrintf(m, "{ " "100 mul 16 add 116 div " // (L * 100 + 16) / 116 "dup 6 29 div ge " // >= 6 / 29 ? "{ dup dup mul mul } " // yes, ^3 and done "{ 4 29 div sub 108 841 div mul } " // no, slope limiting "ifelse } bind "); } */ // Lab -> XYZ, see the discussion above static void EmitLab2XYZ(cmsIOHANDLER* m) { _cmsIOPrintf(m, "/RangeABC [ 0 1 0 1 0 1]\n"); _cmsIOPrintf(m, "/DecodeABC [\n"); _cmsIOPrintf(m, "{100 mul 16 add 116 div } bind\n"); _cmsIOPrintf(m, "{255 mul 128 sub 500 div } bind\n"); _cmsIOPrintf(m, "{255 mul 128 sub 200 div } bind\n"); _cmsIOPrintf(m, "]\n"); _cmsIOPrintf(m, "/MatrixABC [ 1 1 1 1 0 0 0 0 -1]\n"); _cmsIOPrintf(m, "/RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]\n"); _cmsIOPrintf(m, "/DecodeLMN [\n"); _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind\n"); _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind\n"); _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind\n"); _cmsIOPrintf(m, "]\n"); } // Outputs a table of words. It does use 16 bits static void Emit1Gamma(cmsIOHANDLER* m, cmsToneCurve* Table) { cmsUInt32Number i; cmsFloat64Number gamma; if (Table == NULL) return; // Error if (Table ->nEntries <= 0) return; // Empty table // Suppress whole if identity if (cmsIsToneCurveLinear(Table)) return; // Check if is really an exponential. If so, emit "exp" gamma = cmsEstimateGamma(Table, 0.001); if (gamma > 0) { _cmsIOPrintf(m, "{ %g exp } bind ", gamma); return; } _cmsIOPrintf(m, "{ "); // Bounds check EmitRangeCheck(m); // Emit intepolation code // PostScript code Stack // =============== ======================== // v _cmsIOPrintf(m, " ["); for (i=0; i < Table->nEntries; i++) { _cmsIOPrintf(m, "%d ", Table->Table16[i]); } _cmsIOPrintf(m, "] "); // v tab _cmsIOPrintf(m, "dup "); // v tab tab _cmsIOPrintf(m, "length 1 sub "); // v tab dom _cmsIOPrintf(m, "3 -1 roll "); // tab dom v _cmsIOPrintf(m, "mul "); // tab val2 _cmsIOPrintf(m, "dup "); // tab val2 val2 _cmsIOPrintf(m, "dup "); // tab val2 val2 val2 _cmsIOPrintf(m, "floor cvi "); // tab val2 val2 cell0 _cmsIOPrintf(m, "exch "); // tab val2 cell0 val2 _cmsIOPrintf(m, "ceiling cvi "); // tab val2 cell0 cell1 _cmsIOPrintf(m, "3 index "); // tab val2 cell0 cell1 tab _cmsIOPrintf(m, "exch "); // tab val2 cell0 tab cell1 _cmsIOPrintf(m, "get "); // tab val2 cell0 y1 _cmsIOPrintf(m, "4 -1 roll "); // val2 cell0 y1 tab _cmsIOPrintf(m, "3 -1 roll "); // val2 y1 tab cell0 _cmsIOPrintf(m, "get "); // val2 y1 y0 _cmsIOPrintf(m, "dup "); // val2 y1 y0 y0 _cmsIOPrintf(m, "3 1 roll "); // val2 y0 y1 y0 _cmsIOPrintf(m, "sub "); // val2 y0 (y1-y0) _cmsIOPrintf(m, "3 -1 roll "); // y0 (y1-y0) val2 _cmsIOPrintf(m, "dup "); // y0 (y1-y0) val2 val2 _cmsIOPrintf(m, "floor cvi "); // y0 (y1-y0) val2 floor(val2) _cmsIOPrintf(m, "sub "); // y0 (y1-y0) rest _cmsIOPrintf(m, "mul "); // y0 t1 _cmsIOPrintf(m, "add "); // y _cmsIOPrintf(m, "65535 div "); // result _cmsIOPrintf(m, " } bind "); } // Compare gamma table static cmsBool GammaTableEquals(cmsUInt16Number* g1, cmsUInt16Number* g2, int nEntries) { return memcmp(g1, g2, nEntries* sizeof(cmsUInt16Number)) == 0; } // Does write a set of gamma curves static void EmitNGamma(cmsIOHANDLER* m, int n, cmsToneCurve* g[]) { int i; for( i=0; i < n; i++ ) { if (g[i] == NULL) return; // Error if (i > 0 && GammaTableEquals(g[i-1]->Table16, g[i]->Table16, g[i]->nEntries)) { _cmsIOPrintf(m, "dup "); } else { Emit1Gamma(m, g[i]); } } } // Following code dumps a LUT onto memory stream // This is the sampler. Intended to work in SAMPLER_INSPECT mode, // that is, the callback will be called for each knot with // // In[] The grid location coordinates, normalized to 0..ffff // Out[] The Pipeline values, normalized to 0..ffff // // Returning a value other than 0 does terminate the sampling process // // Each row contains Pipeline values for all but first component. So, I // detect row changing by keeping a copy of last value of first // component. -1 is used to mark begining of whole block. static int OutputValueSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { cmsPsSamplerCargo* sc = (cmsPsSamplerCargo*) Cargo; cmsUInt32Number i; if (sc -> FixWhite) { if (In[0] == 0xFFFF) { // Only in L* = 100, ab = [-8..8] if ((In[1] >= 0x7800 && In[1] <= 0x8800) && (In[2] >= 0x7800 && In[2] <= 0x8800)) { cmsUInt16Number* Black; cmsUInt16Number* White; cmsUInt32Number nOutputs; if (!_cmsEndPointsBySpace(sc ->ColorSpace, &White, &Black, &nOutputs)) return 0; for (i=0; i < nOutputs; i++) Out[i] = White[i]; } } } // Hadle the parenthesis on rows if (In[0] != sc ->FirstComponent) { if (sc ->FirstComponent != -1) { _cmsIOPrintf(sc ->m, sc ->PostMin); sc ->SecondComponent = -1; _cmsIOPrintf(sc ->m, sc ->PostMaj); } // Begin block _cmsPSActualColumn = 0; _cmsIOPrintf(sc ->m, sc ->PreMaj); sc ->FirstComponent = In[0]; } if (In[1] != sc ->SecondComponent) { if (sc ->SecondComponent != -1) { _cmsIOPrintf(sc ->m, sc ->PostMin); } _cmsIOPrintf(sc ->m, sc ->PreMin); sc ->SecondComponent = In[1]; } // Dump table. for (i=0; i < sc -> Pipeline ->Params->nOutputs; i++) { cmsUInt16Number wWordOut = Out[i]; cmsUInt8Number wByteOut; // Value as byte // We always deal with Lab4 wByteOut = Word2Byte(wWordOut); WriteByte(sc -> m, wByteOut); } return 1; } // Writes a Pipeline on memstream. Could be 8 or 16 bits based static void WriteCLUT(cmsIOHANDLER* m, cmsStage* mpe, const char* PreMaj, const char* PostMaj, const char* PreMin, const char* PostMin, int FixWhite, cmsColorSpaceSignature ColorSpace) { cmsUInt32Number i; cmsPsSamplerCargo sc; sc.FirstComponent = -1; sc.SecondComponent = -1; sc.Pipeline = (_cmsStageCLutData *) mpe ->Data; sc.m = m; sc.PreMaj = PreMaj; sc.PostMaj= PostMaj; sc.PreMin = PreMin; sc.PostMin = PostMin; sc.FixWhite = FixWhite; sc.ColorSpace = ColorSpace; _cmsIOPrintf(m, "["); for (i=0; i < sc.Pipeline->Params->nInputs; i++) _cmsIOPrintf(m, " %d ", sc.Pipeline->Params->nSamples[i]); _cmsIOPrintf(m, " [\n"); cmsStageSampleCLut16bit(mpe, OutputValueSampler, (void*) &sc, SAMPLER_INSPECT); _cmsIOPrintf(m, PostMin); _cmsIOPrintf(m, PostMaj); _cmsIOPrintf(m, "] "); } // Dumps CIEBasedA Color Space Array static int EmitCIEBasedA(cmsIOHANDLER* m, cmsToneCurve* Curve, cmsCIEXYZ* BlackPoint) { _cmsIOPrintf(m, "[ /CIEBasedA\n"); _cmsIOPrintf(m, " <<\n"); _cmsIOPrintf(m, "/DecodeA "); Emit1Gamma(m, Curve); _cmsIOPrintf(m, " \n"); _cmsIOPrintf(m, "/MatrixA [ 0.9642 1.0000 0.8249 ]\n"); _cmsIOPrintf(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n"); EmitWhiteBlackD50(m, BlackPoint); EmitIntent(m, INTENT_PERCEPTUAL); _cmsIOPrintf(m, ">>\n"); _cmsIOPrintf(m, "]\n"); return 1; } // Dumps CIEBasedABC Color Space Array static int EmitCIEBasedABC(cmsIOHANDLER* m, cmsFloat64Number* Matrix, cmsToneCurve** CurveSet, cmsCIEXYZ* BlackPoint) { int i; _cmsIOPrintf(m, "[ /CIEBasedABC\n"); _cmsIOPrintf(m, "<<\n"); _cmsIOPrintf(m, "/DecodeABC [ "); EmitNGamma(m, 3, CurveSet); _cmsIOPrintf(m, "]\n"); _cmsIOPrintf(m, "/MatrixABC [ " ); for( i=0; i < 3; i++ ) { _cmsIOPrintf(m, "%.6f %.6f %.6f ", Matrix[i + 3*0], Matrix[i + 3*1], Matrix[i + 3*2]); } _cmsIOPrintf(m, "]\n"); _cmsIOPrintf(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n"); EmitWhiteBlackD50(m, BlackPoint); EmitIntent(m, INTENT_PERCEPTUAL); _cmsIOPrintf(m, ">>\n"); _cmsIOPrintf(m, "]\n"); return 1; } static int EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, int Intent, cmsCIEXYZ* BlackPoint) { const char* PreMaj; const char* PostMaj; const char* PreMin, *PostMin; cmsStage* mpe; mpe = Pipeline ->Elements; switch (cmsStageInputChannels(mpe)) { case 3: _cmsIOPrintf(m, "[ /CIEBasedDEF\n"); PreMaj ="<"; PostMaj= ">\n"; PreMin = PostMin = ""; break; case 4: _cmsIOPrintf(m, "[ /CIEBasedDEFG\n"); PreMaj = "["; PostMaj = "]\n"; PreMin = "<"; PostMin = ">\n"; break; default: return 0; } _cmsIOPrintf(m, "<<\n"); if (cmsStageType(mpe) == cmsSigCurveSetElemType) { _cmsIOPrintf(m, "/DecodeDEF [ "); EmitNGamma(m, cmsStageOutputChannels(mpe), _cmsStageGetPtrToCurveSet(mpe)); _cmsIOPrintf(m, "]\n"); mpe = mpe ->Next; } if (cmsStageType(mpe) == cmsSigCLutElemType) { _cmsIOPrintf(m, "/Table "); WriteCLUT(m, mpe, PreMaj, PostMaj, PreMin, PostMin, FALSE, (cmsColorSpaceSignature) 0); _cmsIOPrintf(m, "]\n"); } EmitLab2XYZ(m); EmitWhiteBlackD50(m, BlackPoint); EmitIntent(m, Intent); _cmsIOPrintf(m, " >>\n"); _cmsIOPrintf(m, "]\n"); return 1; } // Generates a curve from a gray profile static cmsToneCurve* ExtractGray2Y(cmsContext ContextID, cmsHPROFILE hProfile, int Intent) { cmsToneCurve* Out = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL); cmsHPROFILE hXYZ = cmsCreateXYZProfile(); cmsHTRANSFORM xform = cmsCreateTransformTHR(ContextID, hProfile, TYPE_GRAY_8, hXYZ, TYPE_XYZ_DBL, Intent, cmsFLAGS_NOOPTIMIZE); int i; if (Out != NULL) { for (i=0; i < 256; i++) { cmsUInt8Number Gray = (cmsUInt8Number) i; cmsCIEXYZ XYZ; cmsDoTransform(xform, &Gray, &XYZ, 1); Out ->Table16[i] =_cmsQuickSaturateWord(XYZ.Y * 65535.0); } } cmsDeleteTransform(xform); cmsCloseProfile(hXYZ); return Out; } // Because PostScript has only 8 bits in /Table, we should use // a more perceptually uniform space... I do choose Lab. static int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Number dwFlags) { cmsHPROFILE hLab; cmsHTRANSFORM xform; cmsUInt32Number nChannels; cmsUInt32Number InputFormat; int rc; cmsHPROFILE Profiles[2]; cmsCIEXYZ BlackPointAdaptedToD50; // Does create a device-link based transform. // The DeviceLink is next dumped as working CSA. InputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE); nChannels = T_CHANNELS(InputFormat); cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0); // Adjust output to Lab4 hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL); Profiles[0] = hProfile; Profiles[1] = hLab; xform = cmsCreateMultiprofileTransform(Profiles, 2, InputFormat, TYPE_Lab_DBL, Intent, 0); cmsCloseProfile(hLab); if (xform == NULL) { cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Profile -> Lab"); return 0; } // Only 1, 3 and 4 channels are allowed switch (nChannels) { case 1: { cmsToneCurve* Gray2Y = ExtractGray2Y(m ->ContextID, hProfile, Intent); EmitCIEBasedA(m, Gray2Y, &BlackPointAdaptedToD50); cmsFreeToneCurve(Gray2Y); } break; case 3: case 4: { cmsUInt32Number OutFrm = TYPE_Lab_16; cmsPipeline* DeviceLink; _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform; DeviceLink = cmsPipelineDup(v ->Lut); if (DeviceLink == NULL) return 0; dwFlags |= cmsFLAGS_FORCE_CLUT; _cmsOptimizePipeline(m->ContextID, &DeviceLink, Intent, &InputFormat, &OutFrm, &dwFlags); rc = EmitCIEBasedDEF(m, DeviceLink, Intent, &BlackPointAdaptedToD50); cmsPipelineFree(DeviceLink); if (rc == 0) return 0; } break; default: cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Only 3, 4 channels supported for CSA. This profile has %d channels.", nChannels); return 0; } cmsDeleteTransform(xform); return 1; } static cmsFloat64Number* GetPtrToMatrix(const cmsStage* mpe) { _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; return Data -> Double; } // Does create CSA based on matrix-shaper. Allowed types are gray and RGB based static int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matrix, cmsStage* Shaper) { cmsColorSpaceSignature ColorSpace; int rc; cmsCIEXYZ BlackPointAdaptedToD50; ColorSpace = cmsGetColorSpace(hProfile); cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); if (ColorSpace == cmsSigGrayData) { cmsToneCurve** ShaperCurve = _cmsStageGetPtrToCurveSet(Shaper); rc = EmitCIEBasedA(m, ShaperCurve[0], &BlackPointAdaptedToD50); } else if (ColorSpace == cmsSigRgbData) { cmsMAT3 Mat; int i, j; memmove(&Mat, GetPtrToMatrix(Matrix), sizeof(Mat)); for (i=0; i < 3; i++) for (j=0; j < 3; j++) Mat.v[i].n[j] *= MAX_ENCODEABLE_XYZ; rc = EmitCIEBasedABC(m, (cmsFloat64Number *) &Mat, _cmsStageGetPtrToCurveSet(Shaper), &BlackPointAdaptedToD50); } else { cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Profile is not suitable for CSA. Unsupported colorspace."); return 0; } return rc; } // Creates a PostScript color list from a named profile data. // This is a HP extension, and it works in Lab instead of XYZ static int WriteNamedColorCSA(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, int Intent) { cmsHTRANSFORM xform; cmsHPROFILE hLab; int i, nColors; char ColorName[32]; cmsNAMEDCOLORLIST* NamedColorList; hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL); xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, hLab, TYPE_Lab_DBL, Intent, 0); if (xform == NULL) return 0; NamedColorList = cmsGetNamedColorList(xform); if (NamedColorList == NULL) return 0; _cmsIOPrintf(m, "<<\n"); _cmsIOPrintf(m, "(colorlistcomment) (%s)\n", "Named color CSA"); _cmsIOPrintf(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n"); _cmsIOPrintf(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n"); nColors = cmsNamedColorCount(NamedColorList); for (i=0; i < nColors; i++) { cmsUInt16Number In[1]; cmsCIELab Lab; In[0] = (cmsUInt16Number) i; if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL)) continue; cmsDoTransform(xform, In, &Lab, 1); _cmsIOPrintf(m, " (%s) [ %.3f %.3f %.3f ]\n", ColorName, Lab.L, Lab.a, Lab.b); } _cmsIOPrintf(m, ">>\n"); cmsDeleteTransform(xform); cmsCloseProfile(hLab); return 1; } // Does create a Color Space Array on XYZ colorspace for PostScript usage static cmsUInt32Number GenerateCSA(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, cmsIOHANDLER* mem) { cmsUInt32Number dwBytesUsed; cmsPipeline* lut = NULL; cmsStage* Matrix, *Shaper; // Is a named color profile? if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { if (!WriteNamedColorCSA(mem, hProfile, Intent)) goto Error; } else { // Any profile class are allowed (including devicelink), but // output (PCS) colorspace must be XYZ or Lab cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile); if (ColorSpace != cmsSigXYZData && ColorSpace != cmsSigLabData) { cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Invalid output color space"); goto Error; } // Read the lut with all necessary conversion stages lut = _cmsReadInputLUT(hProfile, Intent); if (lut == NULL) goto Error; // Tone curves + matrix can be implemented without any LUT if (cmsPipelineCheckAndRetreiveStages(lut, 2, cmsSigCurveSetElemType, cmsSigMatrixElemType, &Shaper, &Matrix)) { if (!WriteInputMatrixShaper(mem, hProfile, Matrix, Shaper)) goto Error; } else { // We need a LUT for the rest if (!WriteInputLUT(mem, hProfile, Intent, dwFlags)) goto Error; } } // Done, keep memory usage dwBytesUsed = mem ->UsedSpace; // Get rid of LUT if (lut != NULL) cmsPipelineFree(lut); // Finally, return used byte count return dwBytesUsed; Error: if (lut != NULL) cmsPipelineFree(lut); return 0; } // ------------------------------------------------------ Color Rendering Dictionary (CRD) /* Black point compensation plus chromatic adaptation: Step 1 - Chromatic adaptation ============================= WPout X = ------- PQR Wpin Step 2 - Black point compensation ================================= (WPout - BPout)*X - WPout*(BPin - BPout) out = --------------------------------------- WPout - BPin Algorithm discussion ==================== TransformPQR(WPin, BPin, WPout, BPout, PQR) Wpin,etc= { Xws Yws Zws Pws Qws Rws } Algorithm Stack 0...n =========================================================== PQR BPout WPout BPin WPin 4 index 3 get WPin PQR BPout WPout BPin WPin div (PQR/WPin) BPout WPout BPin WPin 2 index 3 get WPout (PQR/WPin) BPout WPout BPin WPin mult WPout*(PQR/WPin) BPout WPout BPin WPin 2 index 3 get WPout WPout*(PQR/WPin) BPout WPout BPin WPin 2 index 3 get BPout WPout WPout*(PQR/WPin) BPout WPout BPin WPin sub (WPout-BPout) WPout*(PQR/WPin) BPout WPout BPin WPin mult (WPout-BPout)* WPout*(PQR/WPin) BPout WPout BPin WPin 2 index 3 get WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin 4 index 3 get BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin 3 index 3 get BPout BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin sub (BPin-BPout) WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin mult (BPin-BPout)*WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin sub (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin 3 index 3 get BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin 3 index 3 get WPout BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin exch sub (WPout-BPin) (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin div exch pop exch pop exch pop exch pop */ static void EmitPQRStage(cmsIOHANDLER* m, cmsHPROFILE hProfile, int DoBPC, int lIsAbsolute) { if (lIsAbsolute) { // For absolute colorimetric intent, encode back to relative // and generate a relative Pipeline // Relative encoding is obtained across XYZpcs*(D50/WhitePoint) cmsCIEXYZ White; _cmsReadMediaWhitePoint(&White, hProfile); _cmsIOPrintf(m,"/MatrixPQR [1 0 0 0 1 0 0 0 1 ]\n"); _cmsIOPrintf(m,"/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n"); _cmsIOPrintf(m, "%% Absolute colorimetric -- encode to relative to maximize LUT usage\n" "/TransformPQR [\n" "{0.9642 mul %g div exch pop exch pop exch pop exch pop} bind\n" "{1.0000 mul %g div exch pop exch pop exch pop exch pop} bind\n" "{0.8249 mul %g div exch pop exch pop exch pop exch pop} bind\n]\n", White.X, White.Y, White.Z); return; } _cmsIOPrintf(m,"%% Bradford Cone Space\n" "/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] \n"); _cmsIOPrintf(m, "/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n"); // No BPC if (!DoBPC) { _cmsIOPrintf(m, "%% VonKries-like transform in Bradford Cone Space\n" "/TransformPQR [\n" "{exch pop exch 3 get mul exch pop exch 3 get div} bind\n" "{exch pop exch 4 get mul exch pop exch 4 get div} bind\n" "{exch pop exch 5 get mul exch pop exch 5 get div} bind\n]\n"); } else { // BPC _cmsIOPrintf(m, "%% VonKries-like transform in Bradford Cone Space plus BPC\n" "/TransformPQR [\n"); _cmsIOPrintf(m, "{4 index 3 get div 2 index 3 get mul " "2 index 3 get 2 index 3 get sub mul " "2 index 3 get 4 index 3 get 3 index 3 get sub mul sub " "3 index 3 get 3 index 3 get exch sub div " "exch pop exch pop exch pop exch pop } bind\n"); _cmsIOPrintf(m, "{4 index 4 get div 2 index 4 get mul " "2 index 4 get 2 index 4 get sub mul " "2 index 4 get 4 index 4 get 3 index 4 get sub mul sub " "3 index 4 get 3 index 4 get exch sub div " "exch pop exch pop exch pop exch pop } bind\n"); _cmsIOPrintf(m, "{4 index 5 get div 2 index 5 get mul " "2 index 5 get 2 index 5 get sub mul " "2 index 5 get 4 index 5 get 3 index 5 get sub mul sub " "3 index 5 get 3 index 5 get exch sub div " "exch pop exch pop exch pop exch pop } bind\n]\n"); } } static void EmitXYZ2Lab(cmsIOHANDLER* m) { _cmsIOPrintf(m, "/RangeLMN [ -0.635 2.0 0 2 -0.635 2.0 ]\n"); _cmsIOPrintf(m, "/EncodeLMN [\n"); _cmsIOPrintf(m, "{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n"); _cmsIOPrintf(m, "{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n"); _cmsIOPrintf(m, "{ 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n"); _cmsIOPrintf(m, "]\n"); _cmsIOPrintf(m, "/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]\n"); _cmsIOPrintf(m, "/EncodeABC [\n"); _cmsIOPrintf(m, "{ 116 mul 16 sub 100 div } bind\n"); _cmsIOPrintf(m, "{ 500 mul 128 add 256 div } bind\n"); _cmsIOPrintf(m, "{ 200 mul 128 add 256 div } bind\n"); _cmsIOPrintf(m, "]\n"); } // Due to impedance mismatch between XYZ and almost all RGB and CMYK spaces // I choose to dump LUTS in Lab instead of XYZ. There is still a lot of wasted // space on 3D CLUT, but since space seems not to be a problem here, 33 points // would give a reasonable accurancy. Note also that CRD tables must operate in // 8 bits. static int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Number dwFlags) { cmsHPROFILE hLab; cmsHTRANSFORM xform; int i, nChannels; cmsUInt32Number OutputFormat; _cmsTRANSFORM* v; cmsPipeline* DeviceLink; cmsHPROFILE Profiles[3]; cmsCIEXYZ BlackPointAdaptedToD50; cmsBool lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION); cmsBool lFixWhite = !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP); cmsUInt32Number InFrm = TYPE_Lab_16; int RelativeEncodingIntent; cmsColorSpaceSignature ColorSpace; hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL); if (hLab == NULL) return 0; OutputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE); nChannels = T_CHANNELS(OutputFormat); ColorSpace = cmsGetColorSpace(hProfile); // For absolute colorimetric, the LUT is encoded as relative in order to preserve precision. RelativeEncodingIntent = Intent; if (RelativeEncodingIntent == INTENT_ABSOLUTE_COLORIMETRIC) RelativeEncodingIntent = INTENT_RELATIVE_COLORIMETRIC; // Use V4 Lab always Profiles[0] = hLab; Profiles[1] = hProfile; xform = cmsCreateMultiprofileTransformTHR(m ->ContextID, Profiles, 2, TYPE_Lab_DBL, OutputFormat, RelativeEncodingIntent, 0); cmsCloseProfile(hLab); if (xform == NULL) { cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Lab -> Profile in CRD creation"); return 0; } // Get a copy of the internal devicelink v = (_cmsTRANSFORM*) xform; DeviceLink = cmsPipelineDup(v ->Lut); if (DeviceLink == NULL) return 0; // We need a CLUT dwFlags |= cmsFLAGS_FORCE_CLUT; _cmsOptimizePipeline(m->ContextID, &DeviceLink, RelativeEncodingIntent, &InFrm, &OutputFormat, &dwFlags); _cmsIOPrintf(m, "<<\n"); _cmsIOPrintf(m, "/ColorRenderingType 1\n"); cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0); // Emit headers, etc. EmitWhiteBlackD50(m, &BlackPointAdaptedToD50); EmitPQRStage(m, hProfile, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC); EmitXYZ2Lab(m); // FIXUP: map Lab (100, 0, 0) to perfect white, because the particular encoding for Lab // does map a=b=0 not falling into any specific node. Since range a,b goes -128..127, // zero is slightly moved towards right, so assure next node (in L=100 slice) is mapped to // zero. This would sacrifice a bit of highlights, but failure to do so would cause // scum dot. Ouch. if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) lFixWhite = FALSE; _cmsIOPrintf(m, "/RenderTable "); WriteCLUT(m, cmsPipelineGetPtrToFirstStage(DeviceLink), "<", ">\n", "", "", lFixWhite, ColorSpace); _cmsIOPrintf(m, " %d {} bind ", nChannels); for (i=1; i < nChannels; i++) _cmsIOPrintf(m, "dup "); _cmsIOPrintf(m, "]\n"); EmitIntent(m, Intent); _cmsIOPrintf(m, ">>\n"); if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { _cmsIOPrintf(m, "/Current exch /ColorRendering defineresource pop\n"); } cmsPipelineFree(DeviceLink); cmsDeleteTransform(xform); return 1; } // Builds a ASCII string containing colorant list in 0..1.0 range static void BuildColorantList(char *Colorant, int nColorant, cmsUInt16Number Out[]) { char Buff[32]; int j; Colorant[0] = 0; if (nColorant > cmsMAXCHANNELS) nColorant = cmsMAXCHANNELS; for (j=0; j < nColorant; j++) { sprintf(Buff, "%.3f", Out[j] / 65535.0); strcat(Colorant, Buff); if (j < nColorant -1) strcat(Colorant, " "); } } // Creates a PostScript color list from a named profile data. // This is a HP extension. static int WriteNamedColorCRD(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, int Intent, cmsUInt32Number dwFlags) { cmsHTRANSFORM xform; int i, nColors, nColorant; cmsUInt32Number OutputFormat; char ColorName[32]; char Colorant[128]; cmsNAMEDCOLORLIST* NamedColorList; OutputFormat = cmsFormatterForColorspaceOfProfile(hNamedColor, 2, FALSE); nColorant = T_CHANNELS(OutputFormat); xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, NULL, OutputFormat, Intent, dwFlags); if (xform == NULL) return 0; NamedColorList = cmsGetNamedColorList(xform); if (NamedColorList == NULL) return 0; _cmsIOPrintf(m, "<<\n"); _cmsIOPrintf(m, "(colorlistcomment) (%s) \n", "Named profile"); _cmsIOPrintf(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n"); _cmsIOPrintf(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n"); nColors = cmsNamedColorCount(NamedColorList); for (i=0; i < nColors; i++) { cmsUInt16Number In[1]; cmsUInt16Number Out[cmsMAXCHANNELS]; In[0] = (cmsUInt16Number) i; if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL)) continue; cmsDoTransform(xform, In, Out, 1); BuildColorantList(Colorant, nColorant, Out); _cmsIOPrintf(m, " (%s) [ %s ]\n", ColorName, Colorant); } _cmsIOPrintf(m, " >>"); if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { _cmsIOPrintf(m, " /Current exch /HPSpotTable defineresource pop\n"); } cmsDeleteTransform(xform); return 1; } // This one does create a Color Rendering Dictionary. // CRD are always LUT-Based, no matter if profile is // implemented as matrix-shaper. static cmsUInt32Number GenerateCRD(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, cmsIOHANDLER* mem) { cmsUInt32Number dwBytesUsed; if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { EmitHeader(mem, "Color Rendering Dictionary (CRD)", hProfile); } // Is a named color profile? if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { if (!WriteNamedColorCRD(mem, hProfile, Intent, dwFlags)) { return 0; } } else { // CRD are always implemented as LUT if (!WriteOutputLUT(mem, hProfile, Intent, dwFlags)) { return 0; } } if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { _cmsIOPrintf(mem, "%%%%EndResource\n"); _cmsIOPrintf(mem, "\n%% CRD End\n"); } // Done, keep memory usage dwBytesUsed = mem ->UsedSpace; // Finally, return used byte count return dwBytesUsed; cmsUNUSED_PARAMETER(ContextID); } cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID, cmsPSResourceType Type, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, cmsIOHANDLER* io) { cmsUInt32Number rc; switch (Type) { case cmsPS_RESOURCE_CSA: rc = GenerateCSA(ContextID, hProfile, Intent, dwFlags, io); break; default: case cmsPS_RESOURCE_CRD: rc = GenerateCRD(ContextID, hProfile, Intent, dwFlags, io); break; } return rc; } cmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen) { cmsIOHANDLER* mem; cmsUInt32Number dwBytesUsed; // Set up the serialization engine if (Buffer == NULL) mem = cmsOpenIOhandlerFromNULL(ContextID); else mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, "w"); if (!mem) return 0; dwBytesUsed = cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CRD, hProfile, Intent, dwFlags, mem); // Get rid of memory stream cmsCloseIOhandler(mem); return dwBytesUsed; } // Does create a Color Space Array on XYZ colorspace for PostScript usage cmsUInt32Number CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen) { cmsIOHANDLER* mem; cmsUInt32Number dwBytesUsed; if (Buffer == NULL) mem = cmsOpenIOhandlerFromNULL(ContextID); else mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, "w"); if (!mem) return 0; dwBytesUsed = cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CSA, hProfile, Intent, dwFlags, mem); // Get rid of memory stream cmsCloseIOhandler(mem); return dwBytesUsed; } lcms2-2.6/Lib/0000755002406300000240000000000012311617072012434 5ustar mariamauserslcms2-2.6/Lib/MS/0000755002406300000240000000000012311617072012753 5ustar mariamauserslcms2-2.6/Lib/MS/MS.TXT0000644002406300000240000000000212311617072013663 0ustar mariamausersMSlcms2-2.6/Lib/BC/0000755002406300000240000000000012311617072012720 5ustar mariamauserslcms2-2.6/Lib/BC/BC.txt0000644002406300000240000000000212311617072013735 0ustar mariamausersBClcms2-2.6/COPYING0000644002406300000240000000206612311617072012765 0ustar mariamausersLittle CMS Copyright (c) 1998-2011 Marti Maria Saguer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. lcms2-2.6/install-sh0000755002406300000240000003253712311617072013744 0ustar mariamausers#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: lcms2-2.6/ltmain.sh0000755002406300000240000105377412311617072013572 0ustar mariamausers # libtool (GNU libtool) 2.4 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4 TIMESTAMP="" package_revision=1.3294 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${EGREP="/usr/bin/grep -E"} : ${FGREP="/usr/bin/grep -F"} : ${GREP="/usr/bin/grep"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SED="/usr/bin/sed"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=: for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -e 's/\([\\"]\)/\\\1/g' \ -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_emit_exe_manifest # emit a Win32 UAC manifest for executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_exe_manifest () { cat < EOF } # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -{shared,static}-libgcc, -static-{libgfortran|libstdc++} # link against specified runtime library # -fstack-protector* stack protector flags for GCC -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin| \ -shared-libgcc|-static-libgcc|-static-libgfortran|-static-libstdc++| \ -fstack-protector*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_apped perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper $cwrapper.manifest; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then # Create the UAC manifests first if necessary (but the # manifest files must have executable permission regardless). case $output_name in *instal*|*patch*|*setup*|*update*) func_emit_exe_manifest > $cwrapper.manifest func_emit_exe_manifest > $output_path/$objdir/$output_name.exe.manifest chmod +x $cwrapper.manifest chmod +x $output_path/$objdir/$output_name.exe.manifest ;; esac $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" func_append rmfiles " ${name}.manifest $objdir/${name}.manifest" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name $objdir/lt-${name}.manifest" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 lcms2-2.6/AUTHORS0000644002406300000240000000133212311617072012775 0ustar mariamausers Main Author ------------ Marti Maria Contributors ------------ Bob Friesenhahn Kai-Uwe Behrmann Stuart Nixon Jordi Vilar Richard Hughes Auke Nauta Chris Evans (Google) Lorenzo Ridolfi Robin Watts (Artifex) Shawn Pedersen Andrew Brygin Samuli Suominen Florian Hch Aurelien Jarno Claudiu Cebuc Michael Vhrel (Artifex) Michal Cihar Daniel Kaneider Mateusz Jurczyk (Google) Paul Miller Sbastien Lon Christian Schmitz XhmikosR Stanislav Brabec (SuSe) Leonhard Gruenschloss (Google) Patrick Noffke Christopher James Halse Rogers John Hein Special Thanks -------------- Artifex software Jan Morovic Jos Vernon (WebSupergoo) Harald Schneider (Maxon) Christian Albrecht Dimitrios Anastassakis Lemke Software Tim Zaman lcms2-2.6/aclocal.m40000644002406300000240000123002512311617072013571 0ustar mariamausers# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010 Free Software Foundation, # Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010 Free Software Foundation, # Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2010 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES # -------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[123]]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; haiku*) version_type=linux need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], [[If ld is used when linking, flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[[12]]*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3294 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4]) m4_define([LT_PACKAGE_REVISION], [1.3294]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4' macro_revision='1.3294' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, # 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless `enable' is passed literally. # For symmetry, `disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful (and sometimes confusing) to the casual installer], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/acx_pthread.m4]) lcms2-2.6/lcms2.pc.in0000644002406300000240000000035512311617072013702 0ustar mariamausersprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: @PACKAGE@ Description: LCMS Color Management Library Version: @VERSION@ Libs: -L${libdir} -llcms2 Libs.private: @LIB_MATH@ Cflags: -I${includedir} lcms2-2.6/config.sub0000755002406300000240000010316712311617072013721 0ustar mariamausers#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. timestamp='2009-11-20' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | ubicom32 \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | picochip) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: lcms2-2.6/depcomp0000755002406300000240000003554512311617072013317 0ustar mariamausers#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2004-05-31.23 # Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc. # 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, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit 0 ;; -v | --v*) echo "depcomp $scriptversion" exit 0 ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # Dependencies are output in .lo.d with libtool 1.4. # With libtool 1.5 they are output both in $dir.libs/$base.o.d # and in $dir.libs/$base.o.d and $dir$base.o.d. We process the # latter, because the former will be cleaned when $dir.libs is # erased. tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir$base.o.d" tmpdepfile3="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" tmpdepfile3="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" elif test -f "$tmpdepfile2"; then tmpdepfile="$tmpdepfile2" else tmpdepfile="$tmpdepfile3" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: lcms2-2.6/ChangeLog0000644002406300000240000001350312311617072013502 0ustar mariamausers This is a timeline change log, see features included in each release ABOVE release number ----------------------- 2.0 Major version bump ----------------------- Fixed a bug on V2 CHAD construction, affects absolute colorimetric intent Fixed a bug that prevented linkicc to work Fixed a bug on transicc that made profiles with output colorants info to malfunction Fixed a bug on Lab + Alpha float formatters, added such predefined formatters as well Added cmsChangeBufferFormat for backwards compatibility Added UTILS_UNUSED_PARAMETER for samples Added a check on jpgicc for NULL transforms Fixed VC2010, VC2008 projects Added cmsTagLinkedTo Fixed some typos in error messages Peliminary Delphi wrapper Fixed a bug in tificc in floating point formats Fixed a bug in device link creation on v4 profiles Fixed a bug in psid and profile sequence tags Fixed memory leaks on when recovering from errors Fixed an issue on curve inversion Fixed several integer overflow and other integrity checks, thanks to Chris Evans linkicc now stores the rendering intent in the profile header Fixed delphi interface Added Duotone support (Bilinear interpolation) Fixed a bug on curve reversing when source curves have few points Added bound check in floating point interpolation ----------------------- 2.1 Maintenance release ----------------------- Fixed severa bugs in absolute colorimetric intent Removed pthreads need Updated linkicc to 2.1, cleanup Fixed some potential issues as NULL dereferencing Fixed GBD bug (out of bounds memory overwrite) changed memmove to memcpy in cache for xput improvement Profiles with weird curves are not prone to p`relinearization optimization. Added functions to retrieve formatters from transforms Fixed a bug that made crash black preservation on CMYK2CMYK devicelinks Added named color functionality Fixed a bug in black preservation and sligtly non-monotonic curves Added dictionary metatag support Fixed a bug on ReadRAWtag Pascal unit now is supported by Free Pascal Compiler ----------------------- 2.2 Maintenance release ----------------------- Fixed a 0 byte allocation issue in _cmsCreateSubAllocChunk Fixed encoding for floating point tags in Lab/XYZ Fixed Absolute colorimetric intent issues Fixed a bug on the range of data in transicc, when colorant tag is specified Adding a memory alignment macro for CGATS parser Updated to ICC spec 4.3 Added compatibilty with Argyll's CGATS parser ----------------------- 2.3 Maintenance release ----------------------- Fixed a bug in the named color devicelink generation Fixed uint64 to work in systems without long long native type Added performance improvements from several contributors, mostly Artifex Fixed a bug in black preservation checking Added black point detection algorithm from Adobe paper Added support for transforms on planar data with different stride Added a new plug in entry for full transform Exposed internal overview table for tone curves gamma 1.0 can now operate in unbounded mode Fixed a bug in pipeline duplication Added getPipelineContextID Added a new plug-in type Internal stage structs are now accessible through plug-in API Fixed a bug on ending zero when saving a IT8 to memory Fixed a bug on IT8 reading of negative numbers. Increased security checks, thanks to Mateusz Jurczyk, from Google. Added half float support Fixed a typo on tificc and jpgicc names, thanks to Elle Stone for reporting. Fixed a bug on named color profiles. Added a conditional compilatio flag for "half" support Fixed a bug in transicc when clot tables are present Added formatter resolution after xform optimization plugin added half float variants (ABGR and so) Fixed a bug in XYZ floating point PCS Fixed an unitialized read on PatchLUT Added a check for maximum input channels -------------------- 2.4 Featured release -------------------- User defined parametric curves can now be saved in ICC profiles. RGB profiles using same tone curves for several channels are storing now only one copy of the curve (saves space) Fixed a multithead bug on optimization (StageDEF) Fixed some 64 bit warnings on size_t to uint32 conversions update black point detection algorithm to reflect ICC changes Added new cmsPlugInTHR() and fixed some race conditions (thanks to Artifex) Added error descriptions on cmsSmoothToneCurve Fixed a bug on big endian platforms not supporting uint64 or long long. Fixed some bugs on floating point curves. Several improvements in cgats parser. Several minor issues found by cppcheck Fixed devicelink generation for 8 bits Added a reference for Mac MLU tag Added a way to read the profile creator from header Added identity curves support for write V2 LUT More changes from Artifex Added TIFF Lab16 handling on tifficc Added some fixes from XhmikosR Fixed a bug in parametric curves Remove spurious tabs added by git merge of pull request Added support for VS2012 Added a simple project for cppcheck Rendering intent used when creating the transform is now propagated to profile header in cmsTransform2Devicelink. This is because 7.2.15 in spec 4.3 Transform2Devicelink now keeps white point when guessing deviceclass is enabled Added some checks for non-happy path, mostly failing mallocs ----------------------- 2.5 Maintenance release ----------------------- Fixed a double free in recovering from a previous error in default intent handler. Fixed some indexing out of bounds in floating point interpolation Fixed a bug in PCS/Colorspace order when reading V2 Lab devicelinks Added a way to retrieve matrix shaper always, no matter LUT is present Changed endianess detection for PowerPC Fixed memory leaks on error handling Big revamp on Contexts, from Artifex New locking plug-in, from Artifex Added directories for tiff, jpeg in configure script Fix for delete tag memory corruption Added pthread dependency. From now lcms supports multithreading ----------------------- 2.6 Featured release ----------------------- lcms2-2.6/Makefile.in0000644002406300000240000006535512311617072014011 0ustar mariamausers# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Top-Level Makefile for building LittleCMS 2 # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/lcms2.pc.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL \ config.guess config.sub depcomp install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = lcms2.pc CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgconfigdir)" DATA = $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz $(distdir).zip GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7.2 dist-zip foreign ACLOCAL_AMFLAGS = -I m4 # Directories containing Makefiles to 'make' SUBDIRS = src include utils/tificc utils/transicc utils/linkicc utils/jpgicc utils/psicc testbed # Additional files to distribute EXTRA_DIST = AUTHORS COPYING ChangeLog doc Projects include bin Lib INSTALL README.1ST autogen.sh lcms2.pc.in pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = lcms2.pc all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): lcms2.pc: $(top_builddir)/config.status $(srcdir)/lcms2.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pkgconfigDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pkgconfigDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool clean-local ctags ctags-recursive dist dist-all \ dist-bzip2 dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-generic \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-pkgconfigDATA # Make sure get rid of VC stuff... clean-local: find Projects -name "*.user" | xargs rm -rf find Projects -name "Release" | xargs rm -rf find Projects -name "Debug" | xargs rm -rf find Projects -name "*.aps" | xargs rm -rf find Projects -name "*.suo" | xargs rm -rf find Projects -name "*.log" | xargs rm -rf find Projects -name "*.sdf" | xargs rm -rf find Projects -name "*.opensdf" | xargs rm -rf find Projects -name "*.log" | xargs rm -rf find Projects -name "ipch" | xargs rm -rf # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lcms2-2.6/README.1ST0000644002406300000240000000005512311617072013214 0ustar mariamausers Please see the documentation in doc folder lcms2-2.6/Makefile.am0000644002406300000240000000206012311617072013760 0ustar mariamausers# # Top-Level Makefile for building LittleCMS 2 # # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7.2 dist-zip foreign ACLOCAL_AMFLAGS = -I m4 PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ # Directories containing Makefiles to 'make' SUBDIRS = src include utils/tificc utils/transicc utils/linkicc utils/jpgicc utils/psicc testbed # Additional files to distribute EXTRA_DIST = AUTHORS COPYING ChangeLog doc Projects include bin Lib INSTALL README.1ST autogen.sh lcms2.pc.in pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = lcms2.pc # Make sure get rid of VC stuff... clean-local: find Projects -name "*.user" | xargs rm -rf find Projects -name "Release" | xargs rm -rf find Projects -name "Debug" | xargs rm -rf find Projects -name "*.aps" | xargs rm -rf find Projects -name "*.suo" | xargs rm -rf find Projects -name "*.log" | xargs rm -rf find Projects -name "*.sdf" | xargs rm -rf find Projects -name "*.opensdf" | xargs rm -rf find Projects -name "*.log" | xargs rm -rf find Projects -name "ipch" | xargs rm -rf lcms2-2.6/m4/0000755002406300000240000000000012311617072012246 5ustar mariamauserslcms2-2.6/m4/acx_pthread.m40000755002406300000240000002662112311617072015004 0ustar mariamausers##### http://autoconf-archive.cryp.to/acx_pthread.html # # SYNOPSIS # # ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. # It sets the PTHREAD_LIBS output variable to the threads library and # linker flags, and the PTHREAD_CFLAGS output variable to any special # C compiler flags that are needed. (The user can also force certain # compiler flags/libs to be tested by setting these environment # variables.) # # Also sets PTHREAD_CC to any special C compiler that is needed for # multi-threaded programs (defaults to the value of CC otherwise). # (This is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these # flags, but also link it with them as well. e.g. you should link # with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS # $LIBS # # If you are only building threads programs, you may wish to use # these variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute # constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to # that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # ACTION-IF-FOUND is a list of shell commands to run if a threads # library is found, and ACTION-IF-NOT-FOUND is a list of commands to # run it if it is not found. If ACTION-IF-FOUND is not specified, the # default action will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or # if you have any other suggestions or comments. This macro was based # on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) # (with help from M. Frigo), as well as ac_pthread and hb_pthread # macros posted by Alejandro Forero Cuervo to the autoconf macro # repository. We are also grateful for the helpful feedback of # numerous users. # # LAST MODIFICATION # # 2006-05-29 # # COPYLEFT # # Copyright (c) 2006 Steven G. Johnson # # 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([ACX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_SAVE AC_LANG_C acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) AC_MSG_RESULT($acx_pthread_ok) if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt lpthread pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: 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 # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${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: acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" ;; # The HP-UX compiler just warns about options it does not understand # but it needs -mt. *-hpux*) acx_pthread_flags="-mt $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_TRY_LINK([#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); ], [acx_pthread_ok=yes]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($acx_pthread_ok) if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_TRY_LINK([#include ], [int attr=$attr; return attr;], [attr_name=$attr; break]) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r case "${host_os}" in aix* ) if test x"$GCC" != xyes; then case "$CC" in *xlc ) AC_CHECK_PROG(PTHREAD_CC, xlc_r, xlc_r, ${CC}) ;; *cc ) AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) ;; esac fi case "$CXX" in *xlC ) AC_CHECK_PROG(PTHREAD_CXX, xlC_r, xlC_r, ${CXX}) ;; esac ;; esac fi if test "${PTHREAD_CC}x" = "x" then PTHREAD_CC="$CC" fi if test "${PTHREAD_CXX}x" = "x" then PTHREAD_CXX="$CXX" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) AC_SUBST(PTHREAD_CXX) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else acx_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl ACX_PTHREAD lcms2-2.6/bin/0000755002406300000240000000000012311617072012476 5ustar mariamauserslcms2-2.6/bin/Bin.txt0000644002406300000240000000000312311617072013740 0ustar mariamausersBinlcms2-2.6/missing0000755002406300000240000002453312311617072013334 0ustar mariamausers#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2004-09-07.08 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit 0 ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit 0 ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case "$1" in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: lcms2-2.6/config.guess0000755002406300000240000012761512311617072014262 0ustar mariamausers#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. timestamp='2009-11-20' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: lcms2-2.6/testbed/0000755002406300000240000000000012311617072013360 5ustar mariamauserslcms2-2.6/testbed/ibm-t61.icc0000755002406300000240000005000012311617072015215 0ustar mariamausersPlcms mntrRGB XYZ 2 acspAPPL-lcms5pv_9\desc\bcprt>dmddblumidwtptxbkptclrt~vcgt rXYZ 4gXYZ HbXYZ \rTRC pgTRC pbTRC ptarg DDevD DCIED DmetaN,desc4384BR2textThis profile is free of known copyright restrictions.desc4384BR2XYZ *XYZ z ZXYZ clrtRed8!FGreen0Y 9BlueoXvcgt5Pk & @[v1Kf !!"<#V$q%&'()+,,-G.a/|012356778R9l:;<=>@ A'BBC]DwEFGHIJKLN OP&Q4RBSPT^UkVyWXYZ[\]^_abc d-e;fIgWheisjklmnopqrsu vw'x5yBzP{^|l}z~̈́ۅ؏̐ymaVJ>2&ߣӤǥti]QE9-! ڸιú|pdXL@4)ʰ˘fM5ӹԡՈoV>% ݪޑx_G.hP7qY@'zbI0  !"#$%&'()*+,-./01234|5z6w7u8r9p:m;kc?a@^A\BYCWDTERFOGMHJIHJEKCL@M>N;O9P6Q4R1S/T,U*V'W%X#Y Z[\]^_`a b cdeffghijklmnopqrstuvwxyz{|}~~|ywtromjhec`^[YVTQOMJHEC@>;9641/,*'%"  v0aL | 7 g " R =m(XCs.^  !"J##$z%5%&'e( ()*P+ +,-;-./k0&012V3345A567q8,89:\;;<=G>>?x@2@ABcCCDENF FG~H9HIJiK$KLMTNNOP?PQRoS*STUZVVWXEYYZv[0[\]t^U_7``abcd~e`fAg"hhijkljmKn-oopqrsutVu7vvwxyz{`|B}#~~ǀkL-чuW8܎aB$ۖ֗ј̙ǚ›|wrmhc^YTOJE@;61,'" ;ιϴЯѪҥӠXYZ qB XYZ `1rXYZ $ curvtextCTI3 DISPLAY "4384BR2" ORIGINATOR "colord-session" DESCRIPTOR "Calibration Target chart information 3" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB_XYZ" TARGET_INSTRUMENT "X-Rite DTP94 [Quato Silver Haze Pro]" INSTRUMENT_TYPE_SPECTRAL "NO" NORMALIZED_TO_Y_100 "YES" LUMINANCE_XYZ_CDM2 "128.252500 134.440000 137.132500" NUMBER_OF_FIELDS 7 NUMBER_OF_SETS 64 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT BEGIN_DATA 1 100 100 100 95.38896326 99.97025138 101.9931578 2 100 100 100 95.37408895 100 102.0080321 3 100 100 100 95.38896326 99.97025138 101.9857207 4 100 100 100 95.3815261 100 101.9634092 5 0 0 0 0.1933660568 0.1710545887 0.3867321136 6 25 0 0 1.487431206 0.951955972 0.5577867024 7 50 0 0 7.161981258 4.313550498 1.308939462 8 75 0 0 18.5557043 11.06648817 2.491447271 9 100 0 0 42.52565819 25.18964748 3.31697159 10 0 25 0 1.152759185 2.149338093 0.7362784471 11 0 50 0 5.652238584 11.35653726 2.394764242 12 0 75 0 15.63290198 31.48148148 5.689424364 13 0 100 0 35.52729436 70.19187863 9.958351926 14 0 0 25 0.6247211066 0.2751747732 2.550944519 15 0 0 50 2.863305072 0.8180871635 13.96697903 16 0 0 75 8.158560167 2.141900937 40.94154395 17 0 0 100 17.21701621 4.625911052 87.2973375 18 6.25 6.25 6.25 0.2082403689 0.1859289008 0.3495463335 19 12.5 12.5 12.5 0.5652238584 0.5726610144 0.6247211066 20 18.75 18.75 18.75 1.487431206 1.546928455 1.591551391 21 25 25 25 2.959988101 3.116168377 3.175665625 22 31.25 31.25 31.25 5.109326194 5.399375279 5.600178492 23 37.5 37.5 37.5 7.942882642 8.411423472 8.850215678 24 43.75 43.75 43.75 11.38628588 12.00356983 12.62085379 25 50 50 50 15.75933363 16.62204373 17.49962814 26 56.25 56.25 56.25 20.88353414 22.02885617 23.96995389 27 62.5 62.5 62.5 26.98943924 28.49918191 31.47404433 28 68.75 68.75 68.75 34.22579206 36.18176409 40.16064257 29 75 75 75 43.07600773 45.45589766 49.89587982 30 81.25 81.25 81.25 52.8409936 55.62248996 62.04819277 31 87.5 87.5 87.5 63.90748178 67.31369924 75.19708463 32 93.75 93.75 93.75 77.49516585 81.31786405 88.57652834 33 100 0 100 60.01784917 29.78580991 92.38435222 34 100 100 0 77.90420943 95.29971739 12.91090287 35 0 100 100 52.7071248 74.86241261 97.06232337 36 54.227 0 100 25.63587684 9.556745501 89.57310724 37 0 67.814 100 29.29495761 29.15365164 91.70013387 38 0 100 34.283 36.61311914 70.5860479 15.07511528 39 0 34.855 100 19.6043433 9.467499628 88.3459765 40 100 0 53.821 46.03599584 26.05979473 20.93559423 41 100 55.006 0 49.44965045 39.275621 5.838167485 42 56.429 100 0 44.95760821 75.84411721 11.18548267 43 100 42.757 100 63.84054737 37.62457236 93.81228618 44 100 100 56.832 82.01695672 96.4301651 33.56388517 45 42.451 100 100 57.79413952 77.83727503 98.79518072 46 0 100 67.815 41.82656552 71.90242451 41.48445634 47 58.183 100 44.674 47.79860181 76.85557043 22.01398185 48 42.409 33.398 100 24.33437454 11.84738956 89.97471367 49 0 63.335 42.399 12.04075562 21.16614607 12.86627993 50 54.78 0 52.865 11.89201249 5.986910605 17.88636026 51 100 46.703 55.499 51.09326194 35.79503198 24.4087461 52 55.807 54.103 0 15.7816451 19.03911944 3.978878477 53 0 36.169 56.382 6.485200059 6.314145471 20.37780753 54 45.803 70.663 100 36.65774208 35.36367693 94.09489811 55 99.231 23.678 26.672 43.98334077 27.09355942 6.440577123 56 27.345 72.335 11.447 16.00475978 29.85274431 5.644801428 57 27.483 78.209 75.536 27.88189796 39.07481779 48.8844266 58 94.03 74.092 26.52 49.38271605 50.78833854 11.12598542 59 25.852 29.218 73.777 10.9103079 5.986910605 40.86717239 60 64.983 25.469 23.618 14.51732857 10.06247211 4.246616094 61 84.07 24.167 72.32 33.19946452 18.42183549 41.64807378 62 66.623 77.218 13.019 30.87163469 42.45128663 8.03956567 63 29.388 82.697 43.101 24.26000297 42.49590956 17.04596162 64 27.732 0.39212 49.211 4.425107839 1.770043136 13.92235609 END_DATA CAL ORIGINATOR "colord-session" DESCRIPTOR "Device Calibration Curves" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" TARGET_INSTRUMENT "dtp94" NUMBER_OF_FIELDS 4 NUMBER_OF_SETS 256 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT BEGIN_DATA 0 0 0 0 0.003921568627 0.00431372549 0.003868337153 0.002849707156 0.007843137255 0.00862745098 0.007736674306 0.005699414311 0.01176470588 0.01294117647 0.01160501146 0.008549121467 0.01568627451 0.01725490196 0.01547334861 0.01139882862 0.01960784314 0.02156862745 0.01934168577 0.01424853578 0.02352941176 0.02588235294 0.02321002292 0.01709824293 0.02745098039 0.03019607843 0.02707836007 0.01994795009 0.03137254902 0.03450980392 0.03094669722 0.02279765724 0.03529411765 0.03882352941 0.03481503438 0.0256473644 0.03921568627 0.0431372549 0.03868337153 0.02849707156 0.0431372549 0.04745098039 0.04255170868 0.03134677871 0.04705882353 0.05176470588 0.04642004584 0.03419648587 0.05098039216 0.05607843137 0.05028838299 0.03704619302 0.05490196078 0.06039215686 0.05415672014 0.03989590018 0.05882352941 0.06470588235 0.0580250573 0.04274560733 0.06274509804 0.06901960784 0.06189339445 0.04559531449 0.06666666667 0.07333333333 0.0657617316 0.04844502165 0.07058823529 0.07764705882 0.06963006875 0.0512947288 0.07450980392 0.08196078431 0.07349840591 0.05414443596 0.07843137255 0.0862745098 0.07736674306 0.05699414311 0.08235294118 0.09058823529 0.08123508021 0.05984385027 0.0862745098 0.09490196078 0.08510341737 0.06269355742 0.09019607843 0.09921568627 0.08897175452 0.06554326458 0.09411764706 0.1035294118 0.09284009167 0.06839297173 0.09803921569 0.1078431373 0.09670842883 0.07124267889 0.1019607843 0.1121568627 0.100576766 0.07409238605 0.1058823529 0.1164705882 0.1044451031 0.0769420932 0.1098039216 0.1207843137 0.1083134403 0.07979180036 0.1137254902 0.1250980392 0.1121817774 0.08264150751 0.1176470588 0.1294117647 0.1160501146 0.08549121467 0.1215686275 0.1337254902 0.1199184517 0.08834092182 0.1254901961 0.1380392157 0.1237867889 0.09119062898 0.1294117647 0.1423529412 0.1276551261 0.09404033613 0.1333333333 0.1466666667 0.1315234632 0.09689004329 0.137254902 0.1509803922 0.1353918004 0.09973975045 0.1411764706 0.1552941176 0.1392601375 0.1025894576 0.1450980392 0.1596078431 0.1431284747 0.1054391648 0.1490196078 0.1639215686 0.1469968118 0.1082888719 0.1529411765 0.1682352941 0.150865149 0.1111385791 0.1568627451 0.1725490196 0.1547334861 0.1139882862 0.1607843137 0.1768627451 0.1586018233 0.1168379934 0.1647058824 0.1811764706 0.1624701604 0.1196877005 0.168627451 0.1854901961 0.1663384976 0.1225374077 0.1725490196 0.1898039216 0.1702068347 0.1253871148 0.1764705882 0.1941176471 0.1740751719 0.128236822 0.1803921569 0.1984313725 0.177943509 0.1310865292 0.1843137255 0.202745098 0.1818118462 0.1339362363 0.1882352941 0.2070588235 0.1856801833 0.1367859435 0.1921568627 0.211372549 0.1895485205 0.1396356506 0.1960784314 0.2156862745 0.1934168577 0.1424853578 0.2 0.22 0.1972851948 0.1453350649 0.2039215686 0.2243137255 0.201153532 0.1481847721 0.2078431373 0.228627451 0.2050218691 0.1510344792 0.2117647059 0.2329411765 0.2088902063 0.1538841864 0.2156862745 0.237254902 0.2127585434 0.1567338936 0.2196078431 0.2415686275 0.2166268806 0.1595836007 0.2235294118 0.2458823529 0.2204952177 0.1624333079 0.2274509804 0.2501960784 0.2243635549 0.165283015 0.231372549 0.2545098039 0.228231892 0.1681327222 0.2352941176 0.2588235294 0.2321002292 0.1709824293 0.2392156863 0.2631372549 0.2359685663 0.1738321365 0.2431372549 0.2674509804 0.2398369035 0.1766818436 0.2470588235 0.2717647059 0.2437052406 0.1795315508 0.2509803922 0.2760294118 0.2475735778 0.182381258 0.2549019608 0.2801470588 0.2514419149 0.1852309651 0.2588235294 0.2842647059 0.2553102521 0.1880806723 0.262745098 0.2883823529 0.2591785893 0.1909303794 0.2666666667 0.2925 0.2630469264 0.1937800866 0.2705882353 0.2966176471 0.2669152636 0.1966297937 0.2745098039 0.3007352941 0.2707836007 0.1994795009 0.2784313725 0.3048529412 0.2746519379 0.202329208 0.2823529412 0.3089705882 0.278520275 0.2051789152 0.2862745098 0.3130882353 0.2823886122 0.2080286224 0.2901960784 0.3172058824 0.2862569493 0.2108783295 0.2941176471 0.3213235294 0.2901252865 0.2137280367 0.2980392157 0.3254411765 0.2939936236 0.2165777438 0.3019607843 0.3295588235 0.2978619608 0.219427451 0.3058823529 0.3336764706 0.3017302979 0.2222771581 0.3098039216 0.3377941176 0.3055986351 0.2251268653 0.3137254902 0.3419117647 0.3094669722 0.2279765724 0.3176470588 0.3460294118 0.3133353094 0.2308262796 0.3215686275 0.3501470588 0.3172036465 0.2336759868 0.3254901961 0.3542647059 0.3210719837 0.2365256939 0.3294117647 0.3583823529 0.3249403209 0.2393754011 0.3333333333 0.3625 0.328808658 0.2422251082 0.337254902 0.3666176471 0.3326769952 0.2450748154 0.3411764706 0.3707352941 0.3365453323 0.2479245225 0.3450980392 0.3748529412 0.3404136695 0.2507742297 0.3490196078 0.3789705882 0.3442820066 0.2536239368 0.3529411765 0.3830882353 0.3481503438 0.256473644 0.3568627451 0.3872058824 0.3520186809 0.2593233512 0.3607843137 0.3913235294 0.3558870181 0.2621730583 0.3647058824 0.3954411765 0.3597553552 0.2650227655 0.368627451 0.3995588235 0.3636236924 0.2678724726 0.3725490196 0.4036764706 0.3674920295 0.2707221798 0.3764705882 0.4077941176 0.3713603667 0.2735718869 0.3803921569 0.4119117647 0.3752287038 0.2764215941 0.3843137255 0.4160294118 0.379097041 0.2792713012 0.3882352941 0.4201470588 0.3829653782 0.2821210084 0.3921568627 0.4242647059 0.3868337153 0.2849707156 0.3960784314 0.4283823529 0.3907020525 0.2878204227 0.4 0.4325 0.3945703896 0.2906701299 0.4039215686 0.4366176471 0.3984387268 0.293519837 0.4078431373 0.4407352941 0.4023070639 0.2963695442 0.4117647059 0.4448529412 0.4061754011 0.2992192513 0.4156862745 0.4489705882 0.4100437382 0.3020689585 0.4196078431 0.4530882353 0.4139120754 0.3049186656 0.4235294118 0.4572058824 0.4177804125 0.3077683728 0.4274509804 0.4613235294 0.4216487497 0.31061808 0.431372549 0.4654411765 0.4255170868 0.3134677871 0.4352941176 0.4695588235 0.429385424 0.3163174943 0.4392156863 0.4736764706 0.4332537611 0.3191672014 0.4431372549 0.4777941176 0.4371220983 0.3220169086 0.4470588235 0.4819117647 0.4409904354 0.3248666157 0.4509803922 0.4860294118 0.4448587726 0.3277163229 0.4549019608 0.4901470588 0.4487271098 0.33056603 0.4588235294 0.4942647059 0.4525954469 0.3334157372 0.462745098 0.4983823529 0.4564637841 0.3362654444 0.4666666667 0.5025 0.4603321212 0.3391151515 0.4705882353 0.5066176471 0.4642004584 0.3419648587 0.4745098039 0.5107352941 0.4680687955 0.3448145658 0.4784313725 0.5148529412 0.4719371327 0.347664273 0.4823529412 0.5189705882 0.4758054698 0.3505139801 0.4862745098 0.5230882353 0.479673807 0.3533636873 0.4901960784 0.5272058824 0.4835421441 0.3562133944 0.4941176471 0.5313235294 0.4874104813 0.3590631016 0.4980392157 0.5354411765 0.4912788184 0.3619128088 0.5019607843 0.5393627451 0.4951471556 0.3650566336 0.5058823529 0.5430882353 0.4990154927 0.368494576 0.5098039216 0.5468137255 0.5028838299 0.3719325185 0.5137254902 0.5505392157 0.506752167 0.3753704609 0.5176470588 0.5542647059 0.5106205042 0.3788084034 0.5215686275 0.5579901961 0.5144888414 0.3822463458 0.5254901961 0.5617156863 0.5183571785 0.3856842883 0.5294117647 0.5654411765 0.5222255157 0.3891222307 0.5333333333 0.5691666667 0.5260938528 0.3925601732 0.537254902 0.5728921569 0.52996219 0.3959981156 0.5411764706 0.5766176471 0.5338305271 0.3994360581 0.5450980392 0.5803431373 0.5376988643 0.4028740005 0.5490196078 0.5840686275 0.5415672014 0.406311943 0.5529411765 0.5877941176 0.5454355386 0.4097498854 0.5568627451 0.5915196078 0.5493038757 0.4131878279 0.5607843137 0.595245098 0.5531722129 0.4166257703 0.5647058824 0.5989705882 0.55704055 0.4200637128 0.568627451 0.6026960784 0.5609088872 0.4235016552 0.5725490196 0.6064215686 0.5647772243 0.4269395977 0.5764705882 0.6101470588 0.5686455615 0.4303775401 0.5803921569 0.613872549 0.5725138987 0.4338154826 0.5843137255 0.6175980392 0.5763822358 0.437253425 0.5882352941 0.6213235294 0.580250573 0.4406913675 0.5921568627 0.6250490196 0.5841189101 0.4441293099 0.5960784314 0.6287745098 0.5879872473 0.4475672524 0.6 0.6325 0.5918555844 0.4510051948 0.6039215686 0.6362254902 0.5957239216 0.4544431373 0.6078431373 0.6399509804 0.5995922587 0.4578810797 0.6117647059 0.6436764706 0.6034605959 0.4613190222 0.6156862745 0.6474019608 0.607328933 0.4647569646 0.6196078431 0.651127451 0.6111972702 0.4681949071 0.6235294118 0.6548529412 0.6150656073 0.4716328495 0.6274509804 0.6585784314 0.6189339445 0.475070792 0.631372549 0.6623039216 0.6228022816 0.4785087344 0.6352941176 0.6660294118 0.6266706188 0.4819466769 0.6392156863 0.669754902 0.6305389559 0.4853846193 0.6431372549 0.6734803922 0.6344072931 0.4888225618 0.6470588235 0.6772058824 0.6382756303 0.4922605042 0.6509803922 0.6809313725 0.6421439674 0.4956984467 0.6549019608 0.6846568627 0.6460123046 0.4991363891 0.6588235294 0.6883823529 0.6498806417 0.5025743316 0.662745098 0.6921078431 0.6537489789 0.506012274 0.6666666667 0.6958333333 0.657617316 0.5094502165 0.6705882353 0.6995588235 0.6614856532 0.5128881589 0.6745098039 0.7032843137 0.6653539903 0.5163261013 0.6784313725 0.7070098039 0.6692223275 0.5197640438 0.6823529412 0.7107352941 0.6730906646 0.5232019862 0.6862745098 0.7144607843 0.6769590018 0.5266399287 0.6901960784 0.7181862745 0.6808273389 0.5300778711 0.6941176471 0.7219117647 0.6846956761 0.5335158136 0.6980392157 0.7256372549 0.6885640132 0.536953756 0.7019607843 0.7293627451 0.6924323504 0.5403916985 0.7058823529 0.7330882353 0.6963006875 0.5438296409 0.7098039216 0.7368137255 0.7001690247 0.5472675834 0.7137254902 0.7405392157 0.7040373619 0.5507055258 0.7176470588 0.7442647059 0.707905699 0.5541434683 0.7215686275 0.7479901961 0.7117740362 0.5575814107 0.7254901961 0.7517156863 0.7156423733 0.5610193532 0.7294117647 0.7554411765 0.7195107105 0.5644572956 0.7333333333 0.7591666667 0.7233790476 0.5678952381 0.737254902 0.7628921569 0.7272473848 0.5713331805 0.7411764706 0.7666176471 0.7311157219 0.574771123 0.7450980392 0.7703431373 0.7349840591 0.5782090654 0.7490196078 0.7740686275 0.7388523962 0.5816470079 0.7529411765 0.7776470588 0.7427207334 0.585379068 0.7568627451 0.7811764706 0.7465890705 0.5892091673 0.7607843137 0.7847058824 0.7504574077 0.5930392666 0.7647058824 0.7882352941 0.7543257448 0.5968693659 0.768627451 0.7917647059 0.758194082 0.6006994652 0.7725490196 0.7952941176 0.7620624191 0.6045295646 0.7764705882 0.7988235294 0.7659307563 0.6083596639 0.7803921569 0.8023529412 0.7697990935 0.6121897632 0.7843137255 0.8058823529 0.7736674306 0.6160198625 0.7882352941 0.8094117647 0.7775357678 0.6198499618 0.7921568627 0.8129411765 0.7814041049 0.6236800611 0.7960784314 0.8164705882 0.7852724421 0.6275101604 0.8 0.82 0.7891407792 0.6313402597 0.8039215686 0.8235294118 0.7930091164 0.6351703591 0.8078431373 0.8270588235 0.7968774535 0.6390004584 0.8117647059 0.8305882353 0.8007457907 0.6428305577 0.8156862745 0.8341176471 0.8046141278 0.646660657 0.8196078431 0.8376470588 0.808482465 0.6504907563 0.8235294118 0.8411764706 0.8123508021 0.6543208556 0.8274509804 0.8447058824 0.8162191393 0.6581509549 0.831372549 0.8482352941 0.8200874764 0.6619810542 0.8352941176 0.8517647059 0.8239558136 0.6658111536 0.8392156863 0.8552941176 0.8278241508 0.6696412529 0.8431372549 0.8588235294 0.8316924879 0.6734713522 0.8470588235 0.8623529412 0.8355608251 0.6773014515 0.8509803922 0.8658823529 0.8394291622 0.6811315508 0.8549019608 0.8694117647 0.8432974994 0.6849616501 0.8588235294 0.8729411765 0.8471658365 0.6887917494 0.862745098 0.8764705882 0.8510341737 0.6926218487 0.8666666667 0.88 0.8549025108 0.6964519481 0.8705882353 0.8835294118 0.858770848 0.7002820474 0.8745098039 0.8870588235 0.8626391851 0.7041121467 0.8784313725 0.8905882353 0.8665075223 0.707942246 0.8823529412 0.8941176471 0.8703758594 0.7117723453 0.8862745098 0.8976470588 0.8742441966 0.7156024446 0.8901960784 0.9011764706 0.8781125337 0.7194325439 0.8941176471 0.9047058824 0.8819808709 0.7232626432 0.8980392157 0.9082352941 0.885849208 0.7270927426 0.9019607843 0.9117647059 0.8897175452 0.7309228419 0.9058823529 0.9152941176 0.8935858824 0.7347529412 0.9098039216 0.9188235294 0.8974542195 0.7385830405 0.9137254902 0.9223529412 0.9013225567 0.7424131398 0.9176470588 0.9258823529 0.9051908938 0.7462432391 0.9215686275 0.9294117647 0.909059231 0.7500733384 0.9254901961 0.9329411765 0.9129275681 0.7539034377 0.9294117647 0.9364705882 0.9167959053 0.7577335371 0.9333333333 0.94 0.9206642424 0.7615636364 0.937254902 0.9435294118 0.9245325796 0.7653937357 0.9411764706 0.9470588235 0.9284009167 0.769223835 0.9450980392 0.9505882353 0.9322692539 0.7730539343 0.9490196078 0.9541176471 0.936137591 0.7768840336 0.9529411765 0.9576470588 0.9400059282 0.7807141329 0.9568627451 0.9611764706 0.9438742653 0.7845442322 0.9607843137 0.9647058824 0.9477426025 0.7883743316 0.9647058824 0.9682352941 0.9516109396 0.7922044309 0.968627451 0.9717647059 0.9554792768 0.7960345302 0.9725490196 0.9752941176 0.959347614 0.7998646295 0.9764705882 0.9788235294 0.9632159511 0.8036947288 0.9803921569 0.9823529412 0.9670842883 0.8075248281 0.9843137255 0.9858823529 0.9709526254 0.8113549274 0.9882352941 0.9894117647 0.9748209626 0.8151850267 0.9921568627 0.9929411765 0.9786892997 0.8190151261 0.9960784314 0.9964705882 0.9825576369 0.8228452254 1 1 0.986425974 0.8266753247 END_DATA dict   $28FL"n6$ CMF_productcolordCMF_binarycolord-sessionCMF_version0.1.29DATA_sourcecalibLicenseCC0QualitylowMAPPING_device_idxrandr-Lenovo Group LimitedMEASUREMENT_devicedtp94lcms2-2.6/testbed/test1.icc0000755002406300000240000210074012311617072015107 0ustar mariamauserslcmsprtrCMYKLab )5acspMSFT-lcms desccprt#wtptA2B0,A2B2,A2B14B2A0F<8B2A1~8B2A28gamtXdmnddmddltdesc,Test profile, not suitable for real use-Test profile, not suitable for real usetextNot suitable for real useXYZ Zg0mft2 $i 6 1^ 2Wy%Y !"#%#&D'f()*+-.(/H0i123457859Q:m;<=>?AB)CBD\EuFGHIJLM,NCOYPoQRSTUVX Y#Z:[Q\f]x^_`abcdfgh#i3jBkRl^mgnqozpqrstuvwxyz{|}~ˀɁǂф{pdXL@3& ֜ȝ|jWE3 תū}kYG6$ڷȸ~kYG5"ŵƣǑ~lYD.оѧҐyaI1ڲۘ}bG,{W3qHvU3sIa)\ Z,      !"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdeefghijklmnopqrstuvwxyz{|z}o~dXMA5)ۈʉq`N=, ٖɗmZH6%ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿*7DQ^kyކߔ ,8CNYcjnoldVD/h 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$%&'()*+,-./|0p1d2Y3M4A566+7!89 ::;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{||}v~oiaZQH>5+! ؎͏Ðxpjc^YURPOOPRUY_fnx̰߱ 8Ql»!Ceª9^ɂʦ2TtҔӲ6Lat݇ޘߧoX\[VL=*b/fMq T p_L7! }tfUA, !"#$%z&d'N(9)%**+,-./01y2g3U4D526"7889:;<=>?@}AoBbCUDIE~% ہ‚rW; ϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ *GcЀџҿ'LsٛFsM6+1MZ:{T?~ò~i~L}~cbA~Dad~ty~W~O>~\/~|~`Cx}%H}1X}%z}K} {N}׋<_~7A~-ψ||Dz|+E|[s|z} ^}wO@}-~ċ {Gu{Dz{]Ĭ{f{Zx|[]|ϕM?}R<}Ǝz]YzHħz|z={LNw{\|=>|v|ېI8z/r z;bz'sMzd6zɬqv{D[{0> |;|yyaIy?yazYvzݮ[{^=c{ФI{R*y߄yfUy`VyyuKzZi{ <{z%zȎ~+~}͇}W0}3}HtЄ}Zk}=~zɇ}!~Єd*s}Y<9wpSwuuVrUW؈|;,뇔{RsѲ;:8q)PCV:4.8Ȅ2񡂡?Up Vu9S c bփR.ՁNn U388A/ͬδz6߆өn1T\e7݀tXT)$̯̕6;eCʷˆ imw3SƀV7M \lGNػځNāa5tNzlߴS<H6*-N}o2ن N%է>w֣A}⇤\fXMݘ2, KԐ3g°[} 0e6M _1 ? 1ӣǾI^I|B̯dܪwLe1$: rW] 1S{z|diL g0\ U{[G{!{ ޔ`{&yE{xbie{Jr|/c5}~ ~:f#MKx+Ca|uI~.yW ώәߎ%¡唘[w!^T`^H*- 5GȨ瘎=Π4rv_ҍRGf,ދ̋|,ƕ{ Ҙtٕ^1Fő,;'\A*ىJ nyg؜(VN#q6\DՊB*|i˽?zzhzMџzEzrn8zY,{dBS| '|⃔*Z Ђ`>mۘ:Xc€A'4 uh¨h$nk)l]'Wf@&8[/Թ|zY9_N3kV41@49%wUh 3?Vkؔ.Uٓ|??R~%nVӎȩ5U.k~j9V"U"똬>Ð?%' Ȃ}ˡWml}ʗiRT>OlT$iƝaʚ=\},?iT- =$e0yYq,<-A_|?h@SG=ҩ$leLy)yywydGzPOsz:{ )|qʬί(h䁙~ڀvcc&OS#9tL߮=.v10b䞼 N8ՙ,K.Fpj癪7̥0uPhbQM88Ajʗ׋xAʜڨ†󤔗tuϔaMKMB=(7kua ,̘/1Hsʠ5`\Lk7M (_XĀ⫹}£rs@C`)6OLA;6}Ȕ@(Bat{C rȟH_֧Kť6#̕O&3"^ļ֢qrb_cKu6{ݤ < (ytյy:}Ѱy2ldygZ8dyF冷zj1{r{(B€}b kYdrFl1l;nˉՍވI|ϯkUYz4EƄ0ˀh|RjΌcX}-EYW0,\>շFiba{{4j$W]D?50>R*>6Ā;ٱџziWyZD}p/'g^ȶ6pDzi/W%ԞD9I/Ĝ' J״"ԯzWhy1VߣKC/1ŀٵ˰tzhVﭠCߟ8//)cyxr|xaixPqyS> sy)zjfY{ C7ċ恶q¹JaJm~P ~=_~)]f2ÀDÒG'q^`۳uOY=RZ)#JNO©k#_p鷼`k&O:%=j(Hڧ,O[pt` N֐&<èi(ץc^PbB7pM@s_ϱ ,N&q<Е(¤+8fը*p_oN<}:(nN&Q̺o_Nw }gu~_jx&thxQy7Qẙzi%u7{Z{=v|k|v՟wӾ xѦx Ryosz'kYuzیM1<} #}oha}?'O|}g3}f }É\}Y}|ȸזP|D|mg|˨N|3,}X S}(d}5<|0|nƕ|4~|8f|eNT|2|L |Qvww~~x }1xfyzM(zI28%{1 ։$|y<Ǽ|>ډcΒhU~|nWdQL\15 쇋Z⊩!_+7/0 zXcⅩFK&0D!D $~uI&%ڏ͆.yl bDŽ̋vJQ/nFY k솷&ڸWlΆN]xa„I.~ ҃ᆤh/jhwo`ӃX^H.Е QLr71Nu vf`ҟGHUXu-{8IF,mźg߄ދuނ_gfGǁ-pȑ=ͅtؠ/IzKhu5^ՂGJ,^&J5uYv vw6rw]xEry+Nz|},SP~˛S~~~Sr ~O\~mD΋o~*'C~,lWح46uxp[(/C񊁃)cM &oA(7ȍpofZ0C(e_׃GgϐNanً(AY@RBS( Ѓj<ŏJmQXm@A<'|;Ȇ<[9%_5,~4m,WƈA' U<ϻ6ʱ^ly0W(W@@&֚$`|źm[xR`k7NV@-&H;/ݲàztáHuNvz t9t|uOqEu^sJvJw5Wxk@kx0| |$p|spv4|p]ڜ9|J"|4}-И5}ls?䄅lfo1]Μ=*ڙʜ]1zlʫrզЮb*|Pܟ s>Ԧ*d0vsQysjٶCt+['tJu8vF$R+v Xw {.yzj `xbiAY3I?N7#ףV> J߻bSxPgi5YuߓHU7]ӑ#âk t€ޢ_x ڟdhY9>kH§79,# MbwյZhưkYeH^7 # { >w9hX#H97# `- a{n1rmŶs7_XsPst'@t/E!udukoMw${h@zmz_^kyPpIy@z /RzVG1z_ /|F"{rmÞ_G=PN @}:m/PGw}Iu!{pm}s_gP%ԅ@^/Jn{[emep^P‹@Oߊ/P܊߫Ћ0${9%mT^PՑ@O/aґ {ńumGꜳ^`GP f@[%]/yyK!;΄7z0m?[^,Pa@guY/Vx@jzĝ>m>᫓_ 8[P*̦3@פ/E1gȥFvpswKsxt̢*xu$yvqczwW{Ox;/|1y}!yt~hku~v|}we}ʈxK}p.y3}V[z}:z~ {T}1r̚td_u Fv ~wnxBU>xy8yĂyՂ iq8rsltюLuvmvT*w!7xxpu2q/r+sŖՄtl|viS#w 7wwq?lo pqˣrzwtkXu53R.vA6BvvKNn뷌p[q1r0z̓0!{ ){ͮwӹx*NxelxTyZy,4byqJz!K/z\r zˇ6wswwܳ5x'xx ay'Iyk.yN Bz-Uw>JwQ#_wwwwx$/a x{ITy'.}yAo y~p3qrrڌsvGu `\v5HwU-ńxR܆Oy`Fzꅻzs {u{Wu{_[| Gh|i,؃|/}u\1_rك,tT^QkFǂD+n9 ­Ǐ*1ɂ|q|sB6]5kEՁJ+,x~(Ta؂ uz)Qr-\5TEh*x }0@Wd8EqZ[QDD)D=DI7ˀNdK [p=DZC~")Q~B?θڬ&2`Nos~NY~C ~wp(~^~ܾxӾc$~5n~@IYE~ sB~0(y}^~&\Wo5p!rs.lˋtTWu@v&;w*$yXySCGyyz?k֊_zVf{$@ {%{ۈ}iI ]~׊Sij̉7UJ?6$΀,Mԋˋ>j}*iT·>>k $PYفKIŠ˔8o-|:7h1kS߆a=#ċ%ʁs Y{ygʆq[S1<#,!V5q zٟg՜{Rj"0Ճ'=r'@ zVfQPQƄ;Ο_"a?) Œn;y]eQD;d1!"ospA(~|݈C|BxGgtXUѕB{5.l ʓ@lןzwߕWfɗ/SU/B{@. 'F΀F(wD f9tTAA-ma8KΞNvҤeTQA-X9ub;k)v"xFeAS*A/:-}v 4n~W{oo]p/_yqKNrhSU7Ct214+}pO@bqSb&C%1#!}ip aƫɗRB1Ҡޔz~.Nx}joدPa=RB\p1Jf|yv}6GoЯ+Va]RdB1vɔŅ(rHlemX9nIӷo:up)S4q-p)t{rwtpeÿtX:tIu@:vu)v!uxr:{er{EX&zIֵ$z:{){8n{}.re&WjBIҀ:f)0!rvҊ e_WEIu:QsQ)GIUrQheJWNTIg":Al^)!'XPr0Pe?bW Icϓ:?)8`-!GrӠ`e=̞W՛Id:::ҙ)}yM:qv6eCPWC(Ikwk:E)Q)ЧʜERٵqlrn7touIq-vkrjwtRxu6zyvzyv׷oWwppxGIrAxKsy4ttyivzQPw4z5hx!{>xzmogp–rIs^htOuJ4lvwA"kJmo:pu~r1gWsvNt3uru0zjo;l@̩Tm֔?o^}Rp⏔f%r^Ms2tGtԆ&ik8#lϝan\Q|o*e qh?Lr1s? eshԻjgk+Im{od&p3Lq1:rZ sGhi˶ kSÐ^l֫z/njcWomKpqC0q grybιg`ia}ajںclM`ymmڮbohJpP0p q%Zyk}zdmKzn{hptyU{qb||sJ}t/}v 9dv7wv{>${* I|}9z Xz Əy|zhz1Tzy>z$zjR{݂\y yVy|yh9ySyA=z|$ y͘_{^؋iڜk~mpyofipQbr$; s!tNw$setU u2x?veqvQw;xx jx{j|ۚՇ{|ن} w}!dq4}FP)}u:Qr} U}~цZ>vScyO\yI98ƃoÏۘ"ubgbo֊dNkuJ82n2f{.י~~0\to3a0Mx8EERX 2ȃEvsš`ā7&M͕7ǀvQlWJ#&r&`VLS977ߛD-`3^|r<_|Kz6Xy iNԓ&k#yln̐nj\oIqt3֍rrz쓔rZsM't3mu[čXuHUEv3(ww~{Nb{}~!{mX{Z |G|_2~c|~||lZ+ |~5l YւXFΉӂ 10&,{^kY-F1YPƇXRQ?{7~j5X^ՏFEmԍ0ˇ)MIZ0zy͚iz^=W! DՇ[0^Wh̉إy܊Dh܈ɟWD@I/慽)aV{yVܫ9hNRVCՆ/8kH(؞ĥלLjsߚl4cėmR oI?씆p+Jqlq/}А@qcHrQsˑ{@*Y{q/{%Ϛ̂=nq-ya&P{7>*)ޏ
ґƗYp`O֑ =z)w>{UƓGxp<@` O33`=%j)"]Ƙ~ϙo_z`Nu<(όؒikU~"RCo^͜Nܚ<&O(k8KW=}Ôn^VM[Q;όƠ(!7h7vm\-=nknlpvZoRiʯ(p\WpMTq>p^r-:Isj㣧sF7uav |vi`w\Gw`Mw>(x--xxT^zXu~]h}~[w}M4}=Ǣ},Рj}Z}~uDhX.[τLm=rd,2kٞ;th(urZXL_yX=h,_hҝ#te=gZn#CL<ԟ,0;ڜYVjBt]םg-;Z2VKآ<억+뜓vƐSdt.~gZ.K]<{)+뛾њ|j2f]λ@hP㷖ipC#j4*k#>l!Hksi=n2]Ϻ9nPBoCEwpn4[.q1#sJqpx)iͼud]uPմuC&v4Qv|#vv&|"ir|k]af|P]{Bw{4-{#{g{hiz1]5#PVKB+4#0liN<]PDB 3#:槫i)]GP?Bl3񨛍#2E"Y߀i Y]PDYUBM3ǔ#^?YHh]#IPQ|B%3 n#"V PlmfDn0huojqcl{rndUtOp}LlurP1vs x1s\iqTXkrgmmswogtyquc>rvKasw0txU vtwɈg|`i|\k|_&m|}xoV|bp|JYro}/s+} !t|ǻePh Pj `kw*m̓`o/ITq.q vsdF4)f|Th~juln_nCH`oˆA.p+ rxRc!e?p8gUiS tkG^m!3Gn)-in hq öad@*fUhTksjR]l3FmT,m˒ pa< cĜSeLgri\kmF$l,Ol٘\ pj`b盲d%fNrhکs\]j¥>El7>+l mp_te`uglvqiwZkrxBm\Zy,oESzq+zs}s}Fr=osfq;Zturpuvsqvst[jwquDvx]v*8yw{[xp.zk>qrzrz?s{Bot{ZDu{Csv|2)XwN|?zy|l)n]ʨo31p샖rnxsOY'txBun(u.x1lя)'n2Ôo|PlpmFqXs4RAt-;'tDywdlxklmnM#Col0pِW)r@s'>rVgvރjl$mTInkGoV`q.V@>r8&qޒ#'wJ|i߮>kLl~vmϣjwo"aUpn7?q]&IpwYVib$jɴ#k}m/>inzUoţg?p %pw=p|dM}g}TiW|}kgh}meTD~VoS>~q$r&gtSzn3{'p{zqh{u{rg|:sSS|u=8},v#C}vxqxxyMyyyzKz&zfzzvRf{z*:FEeWqcbEa?b!PX>V e*5qE|czieYlDgx\dirLIkM:6 l%ّ8n ZduΤ[fˌWg/GR6Ґě.'K͒F؋RFn9ab]cU:eGi;gW8Mh'6j*inbmi?ajTFkG@m*87`nS'?1oq-n-simpa9qsTr7Fޢs7ퟹs'rt.sx0lx`xSS,xFjzx73yA&ݜyl2x0|cl(l`8PS+E&71~&p~~k_٣wS%DžE P6؛&o(ƀkd}_ҍRߟ猲E:6&;%Jۀk$_T&R3D_Y6@%a'j𤡝_VRD؛V63%j a|`U|bRIde`"m$gsinji]plFrEo,s&p v*q d%jѭKflhn,jorFlq`\nrEpItS+pu] mthukIaud vNf}vshwpjx\[lyDnpy+nz rz-w_K]aCdlȃfoiiZRkMCl)*Bl~vq~]U `ܕbie nRgbY5iBk9)krY?q[^pa-1cm-fX\Zyc]Vj_1bpl=dޕ1WjgAqh(`h|sYY\b|^_avknc眙Vf,@gɗ''f"Ds XԵ~[?^D~`!jcVe`~@Mf'neș_t̳7n_GpOb1qd~hrgwjt?iUulM?vnw&wZo2{ ql,i{mkoPmP}kpnir pUsxr2>ts%Wutxyruɰ1isk~tߎ{m u{nvhzp0w`Sqx.=rx$ry&yzFg~&if~-k!~.zl~)g8ni~0Ro~;=q~<#p~[zS~+eGgliiy.k flхQnlgonp,\qEUIrL64rcqˈKmkUܐHH;ʂ9V)07vdh'mO'aՊUTEG9vv(ϋQu߀mB a5UyGiӏ8t(pnjрla_}TԘ_G 8r(9ŕ'Ɏ0'ebW[Z^M#`e@[b1dh e emdc'YdMmf@l{hV1Ҝi j Oird+juY kMl?n1o Кo }lo{wcqXkrzLhs?y0z' M-z1 z*b,VWqaKuH>|0UN % b&-WyK$>(܆f/2mD t ΀a՜^+V̚JJӘ=ؕ/Dv~ %z!a˖V$Jŗl=(/Jg[ 숟Y#ZdNR\Bd^5`',b#abhEcZqXpga}McB#jd5.f:':g`gpҦhQvXhhMJ iAЩj588k'l sl|9mxgzWo:Lߪ&oAWp4Uqm&ߣq Nq\rA~WRvLvAv4w3&wm ]w)Ÿx>V}#LP*}J@դ}N4^7}?&t}3}~^V-L)@u4Al&t4G->!zVҋCL2@g42&]!6MVb4~L z"@U4.#&g/&jp&aSYc]6f/`7hqcLkjfFW(li%A*nbk'nmtnų*]daq`fc6h~Kekjh m(Vj@o.@5kq'lr^cu5sANZo]pJM`q|c&rinet TguC?>ivV&Qiew ux"tWy[y܍^ z9{Y`zhc{Se{k>Ng{%f{v$|UxFX΃u[y^łyfaRd=veʁX$dvmRSvfVZx] je_(Qbp pE [pqL.~sǤbmdo7fpxshqa8js&Mlti8mu|m.u~-xe4_wbPx0dxr_fyQ_hyLjzc7kzjz~T|f]}``]-b|&pd^fဤKhԀw6jKkht~uԠc[{+^B `oc ]e@Jg56ChXf~_Yt2\̀_>oa$]coJe܌5fe3~Xas[Y^ [nJ`l\ZbaIhdi57e7:d6~Wة6Z ~]#m_{N[aĜXHcš4dc x~ɀ|6pXq\`}gr_ltbZuDedGvgh2whj`^wkZrmbne|1pAgikqiYrkFtm28to`tovȘjl ?l@m{moUjo&pXpr(Fqst1rt|cr&tzhuiv~ykgwFi:lwWnlxEoyA0pyoy~qeggyl*zGn@{mzsj~t lyp{tn`uoP2vq>w]r]* wsE=yr}ps}kqto)ru_svOOtzwK=guOw)uxivwnk||Po}n p}W^q}zN]r}h-jKO0j,lksjgg>i[ kfM#l=xnd-o}oNq6rp?ofqYr8LJs>=4pt#,mt6t] vq}BwexYy"K]yh[img"ndgQf7\@gPPiCk=4l#mn^l^sf~qm[^nObp*Beq<3슀r #or7rxe}uLZvNvA.wP3fw#w SwN|d|Y0}KNg}{A }2އ}"ن} }dZYRwMh /@vT2Z"X3!GcއEY M/$@?,;2/g"6僠c|X!|L˅MS?O1sn"*ۂ] \URBYXF[E9]+}_I`JamI\]QY_UF7ay9cr+Qe Peߘer1[_dCPeEg9i&*jV&jjwZ@kZP8lDѕm8jan*joݔ3o.p#{eZ LrOs[D0t7ƒ|t*u-u!1*u.YsyO}zCC.z7Qz)zq-z;{XkN>;CL#6폗). PX\`N/:;B66(܍~sG+X7N rBÏ6o(WrT PaTMFbV;M Y=.[i \]`|q.Oƨ[*EĦ]7:_2.` [mb+ǥbleuO=SaE-c:Ae.~fy gVѢg iz<NǤ hDYi9k-IllƠ?l(wo+}NK oqD+kpN93q-+Lqqq5u Mנjv`Cʞv8(wU,뛞wXw؛w^qzTMs}UC}8},7}&]}љ} ~M$YCJsq82, w{{L)C(8dЋ,ٗDݏgZS]W|`[5wPc,^debCPhe;ih#%ipjygl˧V^ Y`\cv _fxcbiOe"k:fm"eeolyqgRhGVUjsYlLt\nb2_oNb^q9ds!btyvbOSrݔzS sڄ| X_|VEb(|1c|cD|dQGg{Q*gh{4jz{oY|\jn^_eaFO'cgd=e ;*Me$,h;WO{Z}m]^_Ndax"W`ixGkZyT6lxy#ml9z qze~bYr7d9dfVpgFiT6j_"i p}`(&q^bZddL4Uf F=g5ph"g nτC} ^p`ԏcdbЎU dkEfP4g ".e؋ m<|]Wp2_ baJTcdaE)d4xe!dbQ knd xyRmzbV` {YQ{])BG|h`0}Ab~ld#dy wv`[Hkw(^/_w`PxcAy}e0tzGg{h~)i|v}s cjte]u gOui@vk/w}m5wm{nuDpkisq:m}\rOnOsEp`?t.q/!trtryt(tmWt7hKnu:[ovNpv?jo}.pR}o}x<~r:i3fjZl Lxm%"=n-nnumx8qgFfiCYxjKk=(l,l߉+kx:qfqehXip"KejŒ\]2D^$g`Oؔ`ԑ biqRˑ ^?Hܐy`g> bm1؏d9#䏯eeggvRBe@Hf=(Kh1/i#TjJjl{<Q9lUGDimߡ;Md|Qg"lUAi{[ XkH[m4\o]Jq$}KtEERހC2SXW)} :qJ@wEhIW;ME\P{2.Q5!gUʆ}08?e=vvBgnG5VKDNԌ1O1T|436;vqABgF KVlJ?cDMY1M^PSϏ|8ZMC]aR v[_V9f}bZ/Ud]C=ga/Oh@diufTmґyUWXZu-[^Je^avTa1dxBcjgJ.d]iNf`jrPaITmcsWfPdZhSV]jAc_m-`ncowbLjGPslqTnVbWRoR)ZYqx@j\r-] t8ats{vHt~Lu{pPvca`T,wW~+V ^dXB[|~G nKDm_OOR~C>XTԄ+TLU]?{DʏmI0J_M&OP=R܊+-RG*]뉛>{C mVG^KNO E=QE*P^i@aN zdRlf&V]h9YMVj.];k`'lcpdhq'\WyH_Zwkca]\{dQ`LYfrc:h)fu'BhhCnhvhnXb`Fw[[bj-^ec[\`gKibj: dl &dmkmzT0iivWykBhZtm Z]0nJ?_pJ9aUq%`r ixr~#2PkrtSsgAW)tXZuI\\v8L^Kwq%g]x ~i1x:M!{sP|f6TG|oWWV|H{Y|7[}C$Z} Ri|~ ~JMrNYa.Yy@[tӄypqsMerQXxsUUJuX;v-\ *wC^x0`~bZxolUcnjYW_o\.Iq6_!; rja*RsZdCt d~g!|mh]bRjx`V6l#cHmei:&ng)oi7p}i~l*l5df`fhThiGj6k9FkmM(ln]mnn~eqja#nF_cfoSedpFgr8hns"(mhsjs~.wi^v^`vwPRbwEd\x7ey'eyxhyg~0{h[K~]]~R` E6a 7c+'Gb/qff$~h%Y]D[Qy^ D_ㅉ6a)&`a&eTD0}gW-\Z3P\^6D"^2"6 _?j&g^ad8~5dz MZYzPN{TA|dW2t}LZ!~] ̀]xe{cEuTXvXLw[@*x]1y`S!zgb |b=jH~aq\W]r_Kta?/uc0ue vxg |yAgoV`md2VoQf4Jph>7qi0r~kYrl? 0vXl t_j\kUlm_Imin=,no/xoOpKoq sqny^vgFsTitHjutX\L`NOCS>7 Va(YVZ\q[i5~WxNS|MVBy`Yq6,\(^I3_C`nmVH{ZZLT|]@A{|_5>}_a'S~ck~d/eVs$U+waK1xc@VyUe4Xyg&zhzi/s}jox Tt9iGJ)uRj?Uv/l63bvml%w7nXGwn^Z{io|rS&q,pICroq>sdr2tsg%7t=stsbyCuRQnwx Hsox=py1qyk$qyr&yxJ{sQl'tGm=Xn1o$eoRBp:\x'Q%j?GolM|np3}6oh(q}}p"}pl ~pvUFy1t]=z-u3\zu'{vrzv |6vl{GFOv{lAUx5:W+>Z:[\Ґ^.i#yt=o}[4P]*_gd`a*c:nV}X<b3tid&)Det"fKfght;ˇi]2j(kkBk?kn0y;;)p)1p'wqyq熮qtS}:|w 1]w|'vew.wIwnz+: ~'0~O' ~1~\~.~mft2 $i 6 1^ 2Wy%Y !"#%#&D'f()*+-.(/H0i123457859Q:m;<=>?AB)CBD\EuFGHIJLM,NCOYPoQRSTUVX Y#Z:[Q\f]x^_`abcdfgh#i3jBkRl^mgnqozpqrstuvwxyz{|}~ˀɁǂф{pdXL@3& ֜ȝ|jWE3 תū}kYG6$ڷȸ~kYG5"ŵƣǑ~lYD.оѧҐyaI1ڲۘ}bG,{W3qHvU3sIa)\ Z,      !"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdeefghijklmnopqrstuvwxyz{|z}o~dXMA5)ۈʉq`N=, ٖɗmZH6%ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿*7DQ^kyކߔ ,8CNYcjnoldVD/h 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$%&'()*+,-./|0p1d2Y3M4A566+7!89 ::;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{||}v~oiaZQH>5+! ؎͏Ðxpjc^YURPOOPRUY_fnx̰߱ 8Ql»!Ceª9^ɂʦ2TtҔӲ6Lat݇ޘߧoX\[VL=*b/fMq T p_L7! }tfUA, !"#$%z&d'N(9)%**+,-./01y2g3U4D526"7889:;<=>?@}AoBbCUDIE~% ہ‚rW; ϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ *GcЀџҿ'LsٛFsM6+1MZ:{OX͙~ʹ~y~eL~j~Qc=9~|4~cl@~]̳~nf~C~لOiZ/gP8v}6q}0}>ϲ:}i^},~"hN~uO 7A胬|.A|33|M|WE|ߓ}OgV}ьN~|M6g\7{cߥ{fǪ{ `{ɞi|+~|fn}CAN.}{5~zʸU/zDzCz{,a{}|$Ye|ȕM}5[~_wzRêzF2 z] z;{|{d|`L}5P4~=cyy@yz:z$| {[@dH|Lo|4}uyZy2yƔyj;zdj{w{ @c{̡L |34=}S~6׆}}p}UR*}u{}că~5Lx~5(=}p@kcyԃ-bKÂ4؂zGetMڽos ČX9wxʂʈaiJ͂&L43oۅO_tz莴r wA`ցNjdJh3\lԟ[7—vx`9Iue3${K͂:X2-{6 uȀ_JH䀯:2ՃsV/&ĤuU^THiS2`rփȥ$ƁWSJЀatk.\^)H;20T7Yn#s]ƞGЕV1||c|:;h|G|rʼni} ]}G{~2Q9*ǔR<6W[䂶q҈=\+3F遢1˄ڣ9Wr݌>WpxpЇh[HwFF1T4B،lkȉR9oهZ؊&Eo0샠ᤔÇ [ޘ:OnkY΅J4D=[05 ֵK\wʤĘRL~nY+ΒDsЌ0EڇDէи\Qڗݧ*mwzXbDsl0VŒj¦ψԖч{Ά=[l)X6NC'/тNA̩ՊMĠ'-7lgWԃٜmCx/O{Y{Q{F '{s~{ju|wV"}9B~P/BB̝ҹ<Ւ4 $~ӁiڍcUƋY1A7.zB!DE.Z.7} }iцJUAtp .!c˒ɒW|-Qh )TX@ۆ.e^fDi{ 3gQSm@]a..4ت`"סp 91zL fS6t@0-؆d VבAȣyf cRƈ?熏 -؄.eNĠ!|iDxFeDRk6?A -LŅq͒rƋwx{(e R?p-@ zɠz|zzur{Vb| P*[|=~ ,j;ӽp|Μsn%tŕb ǀO=n5,IY6ܟn웅φAusPaRPNل[= ,,ĻݔОD[ٚ̏~sd`TNf4<,è靎e!4ڔ&rٹޔVj)0Jp ^*L ;+Ņ􈉰(z&z ~z}HzjlJ!z[{J |9j})Ћį\RfԨف|PZk2"Z}Iʀ69!K)k9wkR{|GsGk]HYEsI 8䎛)ςϝ.4js2{{5j\pYTH`8n)GɬjԋIz,iX͕HTŊV8q*фDb7ɥR zi#fXVQH0k8Z* nԫ^D-yhTWGŐM8>*håڊʨly1hTW|Gj8*5%*؇TLdWɴ艴ux՜MAhF WxKGn/38*yǓyqb -RƇC`q:5ل(!ރ,ǘiq[LOa3R#C'Ή@4C(HaB%7y֙paDQ՚~UB84폿(in.֮z@ILp5`%QB֔4Ff(/\ ̀Ҥp^`žQqBT4(YϞM g<4˨s0p(Wd`PQ[HB 4ꎶ( Qy2yPxybiy[gzhL죡{O>|b1}%to<&؆ѻxE\i[~L,>1%܍2k3w+;iM"AZLb>-1@K&68P.TwOh~_t1S&HNBHƸyw3hzZ%XeK'T>k<1˒3&Nj„B]{vᖛhfғYK֟}>_ 1ݒU&RN:hvıQh?AKYإ/KĞ>X-1܉e',ƓM v͡Fh,YɤRK>UD1q'QZtvQh'9Y̤,KǞW>n20'onщ$yp{6y(nfhy/`췎ySxzND~}46~}y-z4*z{;24{Ё||vBd}.MU~6:hxYjxyxҪ^zzɈ}{d{c|_L}}[5L~?w31֮wȗxhبyyTzAzb{K|G4~ ivGUvޢrwާwxAMyy(zrb {K|,o4$}uoӿv'vͦצ7wϏ/xnxyia9z|J_{m3}u{ҝuv7$v=w䣍wQxs`z I{K33M|ˆhtqѰu'u¸{7v+`wqvx_yI^z2|t'tUAtɛLujnv$wux+_jy[Hz2|6♄x͍xxx8yd \z uz_{IU|3|~uႎ\?(e+kt 9^sHu2ZIQAAًnŀM>.s)]5GdX2Vݿ(%ǔ|B\PtKnr\1\Gņt1݀4DBAdz~{~ҝ~JA~q~[~ F{9m1t0~t~1c}X}Ӟņ=}ߚHp~ [9~V6E~Œ;1Q~2l}~\}^ǚ}C!^}Zo}Z}E~\0~ }Ė}:||ͭM|禛o9}-Z}E!~+0~f}J|'|5D|o;|Xn|դ`Y};D}ȓ=0c~tvٿ|wW-wݗ_x|yCmцz4Y{FD{|0Z~kud5<іZelgX@{C̄,/n*&T5ɇʕ4ЅkWm,C+w/ԁΉB7Ώˍvj3V|Bۅ/9K]́ih"4Ɇ~d1jUދBPy.ӄ[iLz6W b}yiGU]TA؋.l f3D^'DŽΧɃڢ|hsTفݓ=AWr~.'ʠǼcՐj{wh 2TiA .VΈ uͷ6,ׁEخ|lKe}v̊ c)bP‡>P,ńK'&t1uegFU7}EqЄ6L(z򂅤j?tqdȖJJTȊ;E%6(d(pcc`OޗCtN<9d<7TJ8DԎ'6ه(ϣ奖ԜVsϘcƕ"S푟 D5g(Nz]s]F+c_gSAD`5ۊ n([B?Hjr>c eSWD3_5ĉό(ٙltiNw@2Ǐ&z)"{ɪ{.ZblYLJ]b?N@GԄ2҃&GΓ\rys᥎qup[wF\x됔1zf۳n#o²apݻr;su~p`u [vwEx1Qza rÚs9(tN@uhdvpbw[3yNF>z1~|գ}f|r}|h}|}|~|oi~m}OZQ~}Ef]~71!~#{|(|`R|(e}kn\}pYq}D~p0uҞztDzi`{5n{.|mU|%X}%fD}焋0/~܂g.yƽyͩz9ݕz{-l[{tW|sC}L/~Ux٦y0ymByؚZzd}kw{W-{َC|ȊI/}ax5Lxz}xǦy4'y˜jzV{VmB|W/W}9whxxGx~ayKjzmVzBR{)/&}0ͯwj^\w_w趔xEZ}x$iyUz^- dƵ*% -6 v2~ٟxcG~̙P~Ҕ>p,Qtո1~_u~ob~iP[~}>2~,չwpFqLrІtsъiunaZvOx=Pz+|~Dy,yzC7zrJ{6`{Nl|[OLR;a^+ s6Z IMȈ 9-ەo`]L$;و4+ mvUjF|n)j] )FK2:؂fh*|HwT̡n\gK]Ғ :^*Rb!8†­)lmNj\a0K :kĎ *ځZo#+q NrQ{ҒsjCuYߎvIxf8dzs)|쪓xqx狏yX{eyj:/zYA{KH|,8H}B)5~×C,؀^z:Oir)X H7)'Ֆ+ňzey[HOh6YW*kG}7) ߁+KА]qxtfgOW`YG5X7]) Uܧ*rߗ1 וpwg) t%lǎۢv}Tf UF/Ґ 7) /ʥ#ޖ<׮ֆIjuNeD'UbsE놁6ۄ) wͣ o[pqq™ssJb4StR#vpCJx>4hqz_&|6w'xp}xq<`y'aByRzB{4A}&ˈ~Ďjiǚ`"pLa:~Q$BF4&H⟲ƍ~~[oՖI`sHQ CXB>&3'T"Ϗᛞ~,Hos_ߒkPxxAi3L9'*BD}ƒn~T_WPHhA3ɈH'@y̚Vn}2)m^ݑO.)A|,39#'S3~DZi|şPm^sO’AAŎG3ԉ'b@8Įڊ<|9n@m$H^FOJaAq3!'nߐo~pBvqhrYڜtKWv9=ʓx0ezN$|ېvڃlwCuʣwgɟxxYqyPKWDzR={r0j|$Љ~hy~yr~)uUk}gMl}Y`~KA~Z=m~03%ӏ`P^t_fĝadXeJTM=;0q%Q6vX¤yt?f1X7qJY%=Y0%=ÔGɒsːKe͎WЗ͋J‰<쏦0rl%!:-$0s>1+e[22W|5:Iݓ-<<׏30%҆צǟseW7.I_<0|%cōrjrrY?dΚ=V7IqD7<:01&WFnxaokƬq&^rQt1Eu8 w,8z="'|҄nvxJvxkw^ͦwQСxDky8{-%'|#0~SLM};w}|kh|^|Q}/DЛU}8~&-N3~#xX(.w\Mj~^-QJDVM8-o[#͉热0wChjF]̣QDvt8 -$YuvjSʍ]ԋP˝ˊDS@8do-$Rz嘞vj+P]N/P*D6 h8-i/$ ްivi릧|] PnDF8zB-ό$Yv;i5i]PX D 8ό-⌛$͇my0nem}oaεJpV r=JG\s>u3ʜw)z1 |yiuomua3vQV"GwJ_x'>ۡyg4z*|q!~>y>|m{aֲ{V {JU|R>j|4(}*U~" ym\aɁU׀JRX4EY*π~"y߀xm?saaUɅQJ-k>Y4`ɂ*ґH"֊8xƻ&Dm-gat؋UJ"ňG>y4zK+R##xlm$apU%2J >ʉ4Nq+2Q#b:]x am"]jasPU6Jn4>;?4ɉY+VB#݃x{&m'ꝑa|UJ$/?4Y+m臉#yڥqm*ƦsQnIJ+tpW uq釴w0sr&xuB\ywGm{y#2}{ضoxqkxrytOyuz4q"w=z[x{Fz|2%|}n[oQDqT{rށ5WtopvZwр=Ey1{4lnE ocqք sCunu Zv鄶EZx81D{QzӢkG}mŬ nprr;mt!Y?vDxJX0z2XjIlvmɛȖTo#q_lsVXuoGD?wJ0z;PikI mXMnşpl-r2WtڑCCw60[yφ"Јhjwlhqn'p kxr+-WUtdCovΎ{0'yuSh|jSHkēm8ojqVsgCvv/y,Szl$zm{(o,{qT"|Ls j|tV}vB~y/{`x/v}xw0Rx?z>-| 'qro(ksKLt?xufFdvRx11?y؍*-{®q*r ٝrܰsƪ'wotd]vL!QwΖS?=y$-{n`{kR݂m?o ^pvrcȁxtQrv>x,{Iuɀvc_vڈKFwu;xbDyP[]z>|,y}&~٪~ƙX~~6~~t~~b ~OZ~=,FII}t6}}}s}ᄯa0~%N~{=~,||9|`|{r|䊜`^}ENb}<~O+v{{ꕦ{'{ГOq|s_|M} <]}c+~жzؤzz͂{q{n_{1Me|x<}@+~- zK8fzZzdDCzfpSzᛂ^p{kL| `;|ۋ+}׆yWy*zy}zozk]zL{F;|+}ׯf;jNlYn~pGn)r#\)t#KWQvI:@x){sjt]u~vmOw[y JAzJ9ك{)}m |H}#[%}>}V}blo}[,}J-D~;9~)ւR (`)ᄡ|kqDZۂIX 95i)Ɓc,/͌ {qjzYUI#8J)v9?^zCi聱XY">H=8o)_ǚv͊{Hyi9X"HYT8o8)0w%dۂԁáyH hX .(G鏆8AҊ)ۅeăd<}E`UxhbWG48C))jNl?--nuvoeqUm sELv6 x'v{5s>teu t:vdꋍw?TډxE=y5dž{~'}Yl){I`{Ń{t|Ed(d|T<}DD}5~<'@~zۃHrtns$҂jcdPS؁DC_45Y'rX\#_r@ψbP6SC䅑5,CC'ȝ͍ڔ.Ӏڊqb\R0*C4'z)/[-rpވYbapLR+C͉1(%ۄyHgАvY4hPZckLA'>Ԇ1%3c0 v?th:YَK⊋=>g8o1&ƃ'惆uʑ4|gYRJK>)ċ1y"&$lO]Ψ?/^ugѠKgFEY*IKD=c-1c@&4%􈀦li|Qkom]bvIoGUqPG)s:fu.;x#!{Wql{rsoGsb#tTvG_w:Cy>.Oo{#y}1 x{kyEn̝Dyaz2TWfzG{:`8|.\z}#Ƈ~ĀJz͟ln a SMFƑ:7G.e$zf P[AE;Z1ٓ0U)Fj"0΂op~7f ![BPY_EE;T\1撠C)k"djpmfr=[M,1P\ǑES;`Ћ1')}"Ρmfni=pkqr^mtolVurX wtDyw'0|Yz>̾jqźjlr`ntpu0rnvgkbtgwWIv~yCtxz0b{x|bh|~j|l|^n|~pp|j\s}AVtu[}Bw}0z~l;fׇ i 9kDmh5})oviNqꂿUtXBEv=/yVǧeP{qgi卞|l{nohLp(TsuSAv@Z/ryX_dִ2f}}hƖMk/zmtLgdojT3rxAKuI/8xσ[c&5e[}gܞrQj.xylfoDSr d@u/x\ębp vdܫg%iwy3kyenbSq@to.wUad`RfWh-xkkemn)Rq\@?t@.wZtf4uhvjxxm0xyosekz.qR|{itP?|w-~zK'rp{sqԜu#svFtgwwtudxw*Qz%x?E{zb-}|Xpzr'zssj{@(t{vxv|cwy|Qy }>z}-R|~H(oYpq݃^s=uPt;bvSPPx <>Ay-|0m{opzrt?s^auQOw+T=y>,{¹luSmoou{psGrlatqOvk?=txj,{ @k mܖnlprxqؔM`WsNuȌ=&x,zj׫4lgmomqq0_s*9N uI_|2so|u]}@vLO}xT;"~z-*|Ly(x*yyr z$yzz~n{D{]{{K||r:}}?* ~%FwzKxx~yDQmz\'z݀K{Ҁw:^|0*~Tۮvvfw`\}xlx[^yᅜJzV:|<*}ktufvV|wkwZyRJz79{*}1Ь&tt̛ku}l{vDEjw7ZxUIy|9{*u|sh$ t$tӟ{2ujYvVYwɓI7y9Kz*h|ersMtTzuuiv>YwKHx9 zL*^|쥋|e;gȈDj,xl{hQnW3qWGrs7rv(jz\nSoqtwƂ\rg~tW v4Fw7#y(k|>wEhpx #xvyofz/VZ{Fh{6ۀ|(k~#H߀ SuezUF6(k^~ˆK~/Y~sIt~]Jd~dMU ~XE}~σY6_5G(k}\}1q}uvs}jd9}~Tv}E~6(~(k8e|ٚR|˜ |vs>|c|S} D}k 5~ (k~ǃJ|4ȑ|$|Cr{c|$Ss|Dj|5}(k~k{{ {4{r{yb{_S|D|5}By(k~!E1d鋩gl}݋hio:Al(`nPއq As3rv%zajmy!o}pnrE_zsPYuAw3Fy&!|0u߉v|1twmkx_^ÆkyFO˅zzDA6{U3|&>}ݖ"#~~G{& ~_lن~q^.~OJ[~@惑~2%&XIf5ˆWȅzG҅+ln]| NۃV@P2&nȔkɎcэZyދkIV\σ)NZ|)@Gꅎ2y&Dž xzj3 \7qMЋ@C2& G_2yxhj~[Ԓ!MnF?ƋJ2x&K:Ʉw i[SOdM#ǒ?Y2m-&(dg sYieߐkXnWJpc{"r}~zsIzgh{L[p{O|4B+|7;S}o,Ox~0"Յ~~vrf=BZܒNـB*7ij,\P#;}}~r4fxO"ZhNMBe@(78,iA#FaN}qǖ*lf Zۋ M2HB-7߅,yY#p9|qeےNYƐ*M}"A튘6؈U,ۅ#||(qW,esY!MANJje6Ç,}#5tPcjOf=_`rhTkHm=op2s(Hv "zbtu5k#jl_-$nnSjpDHrB=tytn2ݑOv)yL |triIs ^ٟtSuSHt#v=_.x02y)B{! }~st(o.w]^`cCcHlVf+;t)i0aldOȯ>tsw[-wnw\-_AMb0ke#SsShA!a7kO|o>#r -v0[Dn^aaShdL%rg{`j哟On-=rfv-vm3Zp]­ `܄cr f؝C` jRNnb=q-vBw~o`^q&ccrfBti quk_wInN1yq<{u8,-}pymjynlpptnRrp/qsr_;utMwv2u6x)Gz_юzb〾eqhbmk~Rր$nCq4u7&y7}Gh}kj}lp}oa~8qR7~sTC#*u4xA' {*{&q{{r~{t&o|2ug`|vQ}AxB}y4N~{.'|y6z?wyz}z!{Loz{`{?|9Q{|BZ|}R4%}}',~w݊|x%|xnnyH _JzP]zLA{3}'9~u)vNovꊍ{wqm9x+2^xOyA{^3|f'C}䁀uA؈u5zvElw>&]xOXy,ABz\3{Ѕ+'L}lltq5u#zUuŖkv{]cwhNx@yҊv3{U'S} sڤtyu01kvu:\vҕ8Nx*@y\3Wz'Y|u_wbviehͅhoZRkXLEni>[Wq0u<$yB˅h.j@ul^h,n{YpKуXr>ul0Ђx $ւ{!pQVqtՂs!g"yK펭gXwOiknjk_EmRekp'E$r9u&-Jw"ք{1ov勋pkTr ^!sQuE"v8腦x-Pz#|`vvwj/xV]y'QTzDąz8{-S}#U~Aq~0uQh~ri\~]BR~PM~Dzk~8"-Z\# ވ9tCLh?\8 PyBXDKh8-]r#LFt5^ hwZ\?O@OgC邡N8Z-ZqW#Ӂ ~؆'sh[ԃ4OC8 ^^-Y#~se"g[uOOCWq8-Sf$QUx3f_)m2bb!dW:gKoj?ln4}q})鉪u= hyPwfmFhbNjVmm͉/}4/U4+d *u"5wtjCԉ _w TYI=6>gg4+* "cjt<ѐlj)(_?JtTO}I o>-4* "(5sIi^SىHӇ؍"> %3*R"ӂmBo^cxaYZdcNgbDLj9ѓAm/qi&όKuByTlec4gYPj#NDlD6 o 9ؑq0[t'w{l1:lbnXoN^qCsp9ŐOu01 w'az|k|s0bt9XuLM"vwCw9y#09z'|A W}k8yalzJWzM{PCv{9~|09}j'~E "jʚրKa=LRWX:M@C69h0<'އ p0jm醤`f,WtMɄB9F0G!n'k!%j'*`V֓iLƑ Bǎ-^9]07(݃+!R|i`"IV˓Y;L`Bōu9*s0Pg(6oZ!v%pb^Y}s`P7cFѠf=ij48m+wqM#uETyUbdY/"fPgi0F\k=q nb4_qK+tZ$hhw-zak$XԥtlOšnxFpj=]wr4mt,1w@$Ō,y|sapqVX}rsOisFS#u =;v4mx=,W_z%{ }a#wxX8Ax!O)xFy=%z~4l}{,vG|%Q#}K~`ݤ]}X }Oq}E~= ~J4ui~,Q%Rυ`fzWANuEO<4u,~E% `v*W؟ON囨xE֗ĆJ<̅/4hׄ*,ۃ>%W D`YWӞNEӗp?|sk2}v%z0xtkumwvoiVw(qh[3xVsCLyu7?){#wI1|y%~|Eqtrruutvh{uUwZyvxLrxy{1{|U& }}Ǝo|q}Strh}gts}YuH~Kw~M>ox~1z~&%}=T"n!Hot pyfruXt4KSu> w1z:^&9|Zl΍|)nTrsVo͋!eqZXis(Ju=w-$1ky&J|$k•vmWrnڑempr/WrFJntYl=v1Wy{&X{Tj&lrAndogWq"J$s=[v1/x&c{imZ{8]o\2a\b~DdU/^h G΁k:o~.2s#lxA~bz~einh aAjTmcGfp=:Js@.|v#z.|`jy|lm}n`}\pS}rF~Qt:^~v.pyU#〽{z.rxztl{uM`.{v~SK|4wFt|y :}zn.g~{$}xDzwx{Ykyu{_Uz|ERz|F{};9|}.c}~f$<*vvwqkxS^xɁR&yEzF9{À.P}$_~XauzNv&vAjWv^wjQx@3P5i+U"Mv~h"la~sa~[VP~<"K~AG?~oy5L~+Z3"ǁ v)}rk}a}zU}bJ}tW?}5~,+_~"Zu|k|ד/`|ʑU|J`|ˌ?[}5}U+W~;#pu^Zf]p\ms`Qd6Fzg;ϊk1zMox'هsqxZo4a`fd [䍉fQL$iFtl};9o1r(pve >z#nheUj[LlPĊQnFq;|s1gv(B;x j1{n;odqZrP7t Eou;:Jwd1o-y9(b+{5 H}@m,vpc=w^Y6xAOy EI z:{1\|0(}=}_!~l䈺}McY}Yh}O-~D~U:~1\~(nZ!@lZbԆƒX׃YNڂDX:1nF(!qQkubXNUDu:I1K(Á*!kᐿbI9XmSNMHDA[:m1F(р!-eޛ1Y\\S`AI픟c@"gh6fkL-Wo_%Wsxbe"G`}\k?c)S.eIh?Xk6jo+-Wr%[vJzd'g,[ԕ?iLR3kI=m?pJ6VDr-u%x{dm[8KoPRYpH͏=r?d t62v-x%܆zc}csWt3ZuIQv`HXwz?$x6z-{d&|~[bzZ=K{:Q7u{Hw|+>p|5r}T-~&(~8rbY5PgGm>v~5؇n-n&Hi 7_b*φYSPG}>n5Ճ=- &h} f6$aYoP㊄Gf݈>r85Ɔ-̄lq& ځ[\XSP\1J垦_BHic&9f1',k )_koL"^s^xhZڢ_pRԟbJ}dBh9 kG1=|n)r`"ϋGv:>zZkeR^gJ!j8Al9^dom1ArM)׍ZuK#-xw†{Z kQmI1o[ApqR91sq1&ـX/zP[Hޔ8@ő=e8Ў1108*_K_$J[cXoP͖)aHɓ~S@8֍z1E*t$c,4i\U+2_Y&c]}Lf0`litd[lhK;pm(;tq,xv媋X_a\ob`3_eW|'cWhLkfkIZjnaJnq:s4u4+wy>UgiY>k\m~z`ojxdqYhsIm7v :@qx+w{vR=ssKVct&Zduy^lviSbwYgy I:kz]9p{+v7}BOw}BS}nX"}x4\d}h[`}XIe~>Hj~9o~+unM Q†=V8w=Zg}_]WdQEH8i9To +t"K)sOׅT*vzY@uf^WcCGhV9"nt+tiIN$!SMuXfD]7VbeGg8m+t+Hp7M{RK\upW!e\;8VXaGDgb8mr+scU5fiY:Ih]'ukxaeqn,dUqhF/t(m77+wq)[{Xw +`0^呣caEeetc0QgCnll05q)|v#bQ1MU"|YnM]Џ_b,,Qf֊Ckp5p)vMUPjT|Xsm\*_OaZPf!Bk)O5zp)uR[k5UVmYV{'n]=mpa^gsdOuLiASwmI3vzq&}w+g^jbiazl dlnLg]pjOsIn@vqk3Fy/u'&|yQdagx fixialkknB\npNuqpr@tut3#wx<'{{Satpad@qwfsWiit[lv5Mow@ s4yb2v{1'*z}.^y.[ayvfdzhg{%[j{Mng|l?r }&2u}'>z~ގ\ƁR_uwc h f1gZYi"Lm+?Rq2u)'Oyk]Zi{^MtagWdԇmYh]IL!l()?p* 2t}']x聫Y\t`L/fc'Y3g`!KkU>o}2ts'ix}ƌX|Y[7s_YvfJbҒXfKdj>n2Ks'rx'rU~LsYqqu)]Odva#WFx eIyiOr7)t.̂wY&y߂=|eǀq,\rS€t JWuz@߀w7sx.zN&Ł | *l}e~w\M5xS3OyIXzf@{j{77R|.}&E~ i dv}d~}[}~R~~Im~!@$~P07(~_.~' +c|([j|Rq|*I>}{@}U7}[.~='~k c{*[{ʊOR|#H|Q?|U6}.}'$~x W^㓈TVXN \fE%`a<~d3h*ˊm#Mr&w^[U^MwvbDep;ȋyi 3 l*dp#u yU]XgbUEddL=gD:jb;}md2.p+s#wl&z\hT jLClCȈo6;+q2̆t.+zv$0{y|e\ oT&pKErECKAs:5u28w+$Fy$aw{}[u uaS{~v|KGwBx:y2z+17|@$}+~Z{S |'Js|B|:n}w2~+GM~$<gZFpRJhTB\:4݀2P7+?$ہ2 Z3HHR'Jy B_τ:b2ZM+|߂$/TܜT#MZWE [>_6&d.`5h'Emm| r҈~wToRaX1R^DteA6lC*sJ>9Dz|JoP`V+R]LD,d}b6k^*rރK(f9k'y7oԃ-}t$ysyTJnXc]EXa@`MUeBj]7`o7-ct@>$ywlsQltWU+buYdVwU]KBxb?zf4|k*W~p!dvuoXkp\La.r_VtscJvbgC?Vx~k04zoO*l}Ds!xtkq`jmcj`4ofVUAqiKJtlX>vo4Oy!r*u{v" ~z{sLhh9igjju_llT|odnIlqqS>{ts4!wve*zy8"M}|/re)ohRgqs^ jsSmBtHpv)>*s2w4vfy*y{"} }q!bwvgexa]phy7RkpzH^nz=q{3uK|*x}"|`pS`k~fc\f5Rei@Gm1W=yp3tW*x("{р8o^f4a\AeAQh3Gxl=!oɂ3sY*w"{]2o9]$e`[deQgG.k%`[nb 5f,Mk$bCq5ՄvaCjWY[OPGJ^G6b=f4Ձ{j,[o8$sRqx`C|^X |aO}dF~.g=~kC4n,Z\rv$OvaIz[_Tye^W"zgN{j_E{l=|o4T}r,N~u% xI{^pvOlVNwnMxoEFyq<{t4|Nv6,B}x%0zkn}G]srUult!MGvunDx!vb.8XfH0j(fo "5sxV]IO;`uGc?vg7(j/nX(Ճr6"vFgzLUҁcNvfSF܂7i?#4k7P(n/,q(?u%"rxЂ{U)j Ml&F9nL>1p7 ar/u_(w"`z)}T_|p[M}qE~sz>-~|u6~v/Mx(z#t|ts~;SzvyL{wEB|{xt=} yn6{}z/k~2{)~|#D~!{3SAx|YLz/|D{&}-={}6@|}/:}R~x)~#o~RwqKxDz=qzX6U{/h||)'}c#~~NؓOHJSAqX:=\2av+#f%AzkqovM̐UGRY}@]_9}?aq2le+jO%lo RsGxM[F,_?Ռ)b8f2i+y1m%q [v/; z>LxaE|d?1g8{j1ɇm+eoqF%jt xM{Kڈ^gESj!>{l8o1q+\t%τwb }zA|KAmDƅo>@qn7Ąs^1s9up+cw%y!&| aN~JsDL t=v"7w{1Lx+Zmz&|![}~JLy/C炗y=z7V^{X1-|2+E} &2~!~ځ,I|~CR~=U~71l~1$0+T|&(!ĀTmft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92EJL`KqJڪMϩVȨaŪk¬u}ŶʲЫ֤ܚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚ82EJK`IqHۭJЬRɬ]ƯgñqyIJˬХ՝ړޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓ82EJJ_HpFܯGҰNʱWȶbźlxŭ˧ϠӘ׏ڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏ82DKI_FoDݳCӶH̷Q\lxƩʢΛєԌ׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌72DKG^DnA߸>ֽBJ¾\lxƥɞ̘ϑҊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊ72DKF^Bm>};yN_kzpwtuwsyr{q}poˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀ )A$U5eFpTy{avhrnoqmtkwjyizh|g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@OTNdOuQڥXѢbɟmşwžùǶ˳ϱԮקէէէէէէէէէէէէէէ9*F@NTMdNtOۧUҥ_ʣiŢt¡}øȵͱӮاڡ֡֡֡֡֡֡֡֡֡֡֡֡֡֡9*F@MTLdLtNܪSҩ[˦fƥpåzøɳϰիڠܛ؛؛؛؛؛؛؛؛؛؛؛؛؛؛8*E@LTKcKsLݭPԬX̪bǪlĪv~¸ɳϬգښܖؖؖؖؖؖؖؖؖؖؖؖؖؖؖ8*E@KSJcIrJްMհUΰ^ɰhƲsò|ɮϥ՜ڕّّّّّّّّّّّّّّܑ8*E@JSHbHqH߳JֵQжZ̸eʽq{ȦΝԔ؎یٌٌٌٌٌٌٌٌٌٌٌٌٌٌ8*E@ISGaFpFGٻNӿWcpyǠ͗Ҏׇه؇؇؇؇؇؇؇؇؇؇؇؇؇؇7*D@HREaDoC}DJTbnxǛ̓Њԃւււււււււււււււ7*DAFRD`BnA{BFRamxƘʐΈтӀӀӀӀӀӀӀӀӀӀӀӀӀӀӀ7*DAEQB_?l>x@FQ`mxŕȎˇ΂6*CACP?]Rcpzċņǂ5*BA?7J0R/U,h0BWgs|2*8=/E)H%R)l1EZit|~~~~~~~~~~~~~~~0*/8&<;#W*o5J]ku{~}{zyyyyyyyyyyyyyyy.*%0-A#Z.o<O_lt~x{{y}xvāuÃtÄs†s†s†s†s†s†s†s†s†s†s†s†s†s†s†$%#,F&[5lDzSb|lxquusxqzp|o~ǹm̂l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄ 1G,Y]?fCmMoNYfqyĆǀ|zyyyyyyyyyyyyy5"B7AE=P;Y69A4H3M6P6g;{HXgr{|zzzzzzzzzzzzzz2":43=.B/A.U3k;~J[is{}{ywwwwwwwwwwwwww1"31+6&6&A,Z3n=M^ktz}|zywussssssssssssss.!*+",-#G+]6oB}R`l~s{wx{v~tǀsƂqńpćnĊnËnËnËnËnËnËnËnËnËnËnËnËnË* "3#J.^FJFVHbKmOwU^lȷqw}Ɣɐˌ̊ɊƊƊƊƊƊƊƊƊƊƊƊ6C.F>EJEUFaIkNtU{ajĺpu{ŎȊʆˆɆƆƆƆƆƆƆƆƆƆƆƆ5B.E=DICTD_GhMpVudzinty~ĈDŽɀʁȂƂƂƂƂƂƂƂƂƂƂƂ5B.D=BHASB]FeMkXmazgmrw}Â}z{}}}}}}}}}}}}5B.B<@G>Q@YD`NcYg`yfkpv{}xvuwwwwwwwwwwww4A.@;=E;N>UDYOZQlZ}biqw~|yvtrrrrrrrrrrrr3A/=::C8J;OENF_KqR[fpx|ywvtttttttttttt3>.975?5D9EBHDRHZNaVgbmgmrx~‚ƒ3A&B3@=@GBOGWM]X``lf~kqv|}{}3A&A2?<>EAMESNVZW^kd}jotzzwtwzzzzzzzzzzz3A&?1<:IDMOMWV]jc{hmsx~ytqnqttttttttttt3@&<0989?%9.656::WEgKuS^h|qxwt}pȂnLJkŋiĐhĖfÞeåeåeåeåeåeåeåeåeåeåeå//*"$!# -55I4N?\JfUoy^urd{nk~jphueyc}bځ`ڄ_ه]؋\א[֔[֔[֔[֔[֔[֔[֔[֔[֔[֔[֔  !.,?7MDXOaxYhq_mjdqgjtdowbty`xz_{{]~|\}[~ZYXXXXXXXXXXX   $//==IIRxTZpZ_i_ddegaji^nk\rm[vnZyoX|pW~pVqUrTsStStStStStStStStStStSt'-49~BCwMJnSPgYUb^X^d[[h]Yl^Wp`VsaUvbTxbS{cR}dQdPeOfOfOfOfOfOfOfOfOfOfOf*(~82vD:mKAeQF_WI[]LXbNUfPSjQRmRPpSOrTNuTMwUMyUL{VK~WJWJWJWJWJWJWJWJWJWJWJW->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;VG[Ta`hkpuz䇃߂~zwtrpnmll¤nĤoĤoĤoĤoĤoĤoĤoĤoĤoĤoĤ->K.Q:TGXS^_djluv~䊀߅ۀ|yvsqonmn§p§q§q§q§q§q§q§q§q§q§q§->J-O:QFVR[^aihtq~|߉ۃ{wtrpooqrssssssssss->J-M9OESQX\^herm|wߌۇց}yurporstuuuuuuuuuu->I-L9NDQPV[\fbqi{s}ۊքzvsqqtuvwwwwwwwwww->I,J8LCOOTZYe_ofyoyێևҁ|xussuwxyyyyyyyyyy->H,H7JBMMRXWc]mcwkuܒ~ӌ̆ƀ|yvvwyz{{{{{{{{{{->G,G7HAKLPVUa[kati~ޟsԘ}ˑĊ|zyz{}}}}}}}}}}}->F+F6GAIKNUS^Yh`qhz٥s͜zŕ~}}~->E+D5E@HILSR\Xe_mްivҩqȠx~-=D*C5D>FHKQPYWa^iڴisͬo¤v|-=C*B4B=EFJOOVV]`dԸgrȯmtz-=A*@3A2?;BBGINOWS^_˾dqjpv|~,=?(=1>9A@FEMIXK\^cphntz{xwz||||||||||,==';0<7?)F:MKUZ\hbwgm~svypŁjĉfÒbÜ`æ_ô_¨aaaaaaaaaa,51 .#-"3:.B@IPN_Ul\wc~jvqoyk΀g̈dʐbɘ`ɡ_ɫ_ɹ\â\â\â\â\â\â\â\â\â\â,0,'&- 73>EETLbRnXx}`vipqkxheцbύ`Δ^Λ]ͣ\ͭ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ,+$+&48>KGV}Q^vYen_jhendkraqt_vv]{x[yYzX|W}V~TSSSSSSSSSS   +06=@H}KQuTXmZ]g`bcfe_kg\piZtkXxlW|nUoTpSqRqQrPsPsPsPsPsPsPsPsPsPs־ "!..9:|DCtNJlTPeZT`_X]eZZj\Wn^Ur_Tv`RyaQ}bPcOdNdMeLfLfLfLfLfLfLfLfLfLf %1*|<4sF;jLAcSF^YIZ^LVcNThPRlQPoROrSNvTLyUK|UJVIWHXGXGXGXGXGXGXGXGXGXGX'{3$q<,hC2aJ7[P;VV=S\@P`ANdCLhDJkEInFHqFGtGFvHEyHD|ICIBJBJBJBJBJBJBJBJBJBJ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9G%N1U=[HaSh^ohxp~xz~vspnkjhgffǔfДhГiДiДiДiДiДiДiДiДiД( 9F$M0T >(@0C8H?NEUK޻^TдdeŬksqx~' 7=='?/B6G0C4L6R?YQ¾`bfpl}rx~}xustwx¨x¨x¨x¨x¨x¨x¨x¨x¨' 588#9(<,B.L-O=WP^`doj|pv||vrommp§r§r§r§r§r§r§r§r§r§& 466!6%9'@&I(NNLVY]eco~jxvpnwhc·_ΐ[͚YͥWβV“VДWϕWϕWϕWϕWϕWϕWϕWϕWϕ& ,& '4#=3EBKPR\Xf|_ntfulmzfua}]܆ZۏX٘VءTجTطSɋS֋S֋S֋S֋S֋S֋S֋S֋S֋$ &  &2(;8CFKRR\|Yds^kjdpeluatx^|{[}YVߒUޚSޢRݪQݶQݿQݿQݿQݿQݿQݿQݿQݿQݿ!   &1,;:DGLQ|SZsY`k_fefjamm]tpZzsXtVvTxSyQzP{O|N|N|N|N|N|N|N|N|N|  ' 2.=;EE{MNrTUkZZd`_`gb\meYrgWxiU~jSlQmPnNoMpLqKrKrKrKrKrKrKrKrKr )!4.?9{GAqNHjTNcZR^`VZfXWlZUq\Sv^Qz_O`NaLbKcJdIeHfHfHfHfHfHfHfHfHfͻ, 7+zA4pG;hMAaTE\ZIX_KUeMRjOPnQNrRLwSK{TIUHVGWFWDXDYDYDYDYDYDYDYDYDY".y8%n>-fE2_L7YR;UX>Q]@ObBLfCJjDInEGrFFvGEzHC~HBIAJ@K?K?K?K?K?K?K?K?K?K $w-l3c:$\B(VI,QO/NU1KZ3H^5Fb6Df7Ci8Al8@p9?s:>w:={;<~<:<:=:=:=:=:=:=:=:=:=u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁v$w5yBI'Q2X=_HfQ~nZywbuiqnmskvhyf{d}cba`Ă_΂_׃aۃc݃d݃d݃d݃d݃d݃d݃d݃d݃w$x5|AH'O2V=]GdQlZ|tbxitoptlxj{g~fdba`Dž`Ӆbمd܅eۆeۆeۆeۆeۆeۆeۆeۆeۆx$x5~@G&N1U<[FbPiYqb{{ivprunyk}ifecbaˇbՇdڇeوgىg؉g؉g؉g؉g؉g؉g؉g؉y#y4?F&M0S;ZE`OgYna~xiyptvp{mjgedbÉbЊd؊f؊g׋h֌i֌i֌i֌i֌i֌i֌i֌i֌y#z4>E%L/Q:WD]NeXkati|pwvs|okhfdcnjcԌf֌hՍiԎjԎkԎkԎkԎkԎkԎkԎkԎkԎz#{4=D$J.N8TBZLaVi_phzp{wv|qmjgfeǎfԏhӏjӐkґlґmґmґmґmґmґmґmґmґ{#|4<C$H-L7RAXJ_Tf]nfwo态v{}uqnkihhϓkѓlГmДoГoѓoѓoѓoѓoѓoѓoѓoѓ|#}4;A#F,K5P?VH]Qc[kdumކ~u؀|zvromlkȖmϖoΖpϖqϕrϕrϕrϕrϕrϕrϕrϕrϕ|#}4:@"E+I4NEK2TC[Saahmnwtz{upmjiÜk˛n̚o̙o̙o̙o̙o̙o̙o̙o̙!+ 3214;?I0RBYQ`_fklur~xztojgdcd͘g͘h͗h͗h͗h͗h͗h͗h͗h͗!) 0.,/8 =H.P@XO^]dhjrpz{vt}nhda^]]Д`ДaДaДaДaДaДaДaДaД!( , (& (2 >G,O=VL\Ybehn{ovtu|m|hc_[YXWԎYӏZӐZӐZӐZӐZӐZӐZӐZӐ!'' !  0=F,N:UH[Ua`|gitnpmuvg|{b˄~^ʍZʗWʣUʯT˾SՆTوUىUىUىUىUىUىUىUى% /:"C1J>PJWT|^]tedlljftoa|s\لvYَyU٘{Sڣ|Qڰ}P۾}P|P~QQQQQQQQ  .9'B5IAPK{WSr]Zjc`dje_ri[zlWnSqPrNtLuKvJvJvKuKuKuKuKuKuKuKu !.9*B6JA{RIrWPi\VccZ]i^YpaUwcRfOgMiKkJlImHmGnFnFnFnFnFnFnFnFnӺ "/:+C5zL>qQEhVKa[O\bSWhVToXQuZN|\L]J_H`GaFbEcDdCdCdCdCdCdCdCdCdֲľ %2<)yE2oJ9gO?_UCZ[GUaJRgLOlNMrOKxQI~RGSETCUBVAW@X@X@X@X@X@X@X@X@XƸ  (4w<%mB,eG2]M6WS:SY=O_?LdAJiCHnDFsEDyFB~GAH?I>J=K$[D)TJ,PQ/LW2I\3F`5De6Bi7An8?s9=w:<|;;<9=8=7>6>6>6>6>6>6>6>6>|q$ h+_2W9Q?LF!HM#ER%BW'@[(>_)vF{M)|U3z]=vfFqnMmyTjZf_cbae_h^j\k[lZnYnXoXpXpYpZp]p]p]p]p]p]p]p]pj$i2 l>vF{M)|U3z]=vfFqnMmyTjZf_cbae_h^j\k[lZnYnXoXpXpYpZp]p]p]p]p]p]p]p]pj#i1 n>wE|M(~T3|\E%L.S8ZAaKiS|q[v|bqhmmiqfucxaz`{_|_}b}c~df߀g߀g߀g߀g߀g߀g߀g߀g߀o!o0 ~6<D$L-R6Y@`IfRnZ|yawhrnmsjwgze|c~bÀbӁd߁eނg݂h݃i݃i݃i݃i݃i݃i݃i݃i݃p!r/ 4;C"K+Q4W=]FdOkXu`|hwnrtnyk}hfee˄f܄hۅiۅkۅlۅlۅlۅlۅlۅlۅlۅlۅq!t. 3:C!I)N2T;[DbMiUs^ۂ|f|owurzoljiiĈi؈kوlوmوoڇoڇoڇoڇoڇoڇoڇoڇq v, 2:B G'L/R8X@_IgRڏp\чxfʁo|vw|tqomllϋn׋o؊p؊qىqىqىqىqىqىqىqىr x+ 09AE%J-P4V<\EܛeOғm\ʌufÆ}ov|}xusqppɍqՍs֌t֋t؊t؊t؊t؊t؊t؊t؊t؊s z* /9?C#H*N1T8\@՟bN˘k[Ñrfzow}}ywuttŏuԎvՍwՍw֋w֋w֋w֋w֋w֋w֋w֋s |) /8=A!F'L-R3ܪY?УaMƜiZpewov}~{yxxyӐzԏzՍ{֌{֌{֌{֌{֌{֌{֌{֌t~( .8<?D$J)Q.֮W>˧_MgZneun|v}~}}~Б~ӏ~Ԏ~Ս~Ս~Ս~Ս~Ս~Ս~Ս~Սt'.7:=B H$߷N,ѱU=Ǫ^LeYldsnzv|̑ӐԏՍՍՍՍՍՍՍՍu&- 68;?FڻK+ʹT<®\KcXjcqmwu~|}{ɑ|Ӑ|ԏ}Ս}Ս}Ս}Ս}Ս}Ս}Ս}Սu%- 568=EվI*ȸS;[JbWhbolut|{|yvtƑuӐvԏxՍxՍxՍxՍxՍxՍxՍxՍv$, 235:?H)ĻQ9YH`Ugamktszz{vronÐnӏpԎrՍrՍrՍrՍrՍrՍrՍrՍw", 0 /17 ;F'P8XG_Te_kirqxx~ztoliggՎiՍl֌l֌l֌l֌l֌l֌l֌l֌x!+, * + 29E%N6VE]Rc]igpovvy}|snieca`ҋc׋e؊e؊e؊e؊e؊e؊e؊e؊z )'$$'7C#L4TB[ObZhdnlytrs{xm}hc_][ZЇ\ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ~& %5A!K1R?YL`Wf`zlgssmlzsgwb{^~ZXVUρVނX݂X݂X݂X݂X݂X݂X݂X݂ &6@I-Q;XH^R{eZskalrgfylaǁp]ƊtYƔvVşxSƬyRƻzQyQzS|S|S|S|S|S|S|S| &4? G-O9VD{]LsdTlkZfr_ayd\ԂgXԋjUԕmRԠnPԭoNռpMoMpNrNrNrNrNrNrNrNrع  ' 4>$G0N:zTCqZJiaPdhU_pYZx\V_SbPdMeKgJgIgHgJgJgJgJgJgJgJgJg ۱ʽ (5?&G1yN9pT@hZFa`K]gOXnRTuUQ}WNYK[H\F^D_C_B`A`A`A`A`A`A`A`A`ާ˶ +6@&xH/oM6gS<`X@[_DVeGRlIOrKKyMHOEQCRAS?T=U=VLh@InAFuCC|D@F=G4>3?3?3?3?3?3?3?3? y o( g0_7X>RDLJ"HP$DU&AZ'>_);d*:i+8n,6t-4z.3/1000.1-2-2-2-2-2-2-2-2 ujb!Z) S1M8H>CD?JwFxN(wV1t_:nhAjsHf~NbS_V\ZZ\X^W`UaTbScSdRdTdVdXdYeZfZfZfZfZfZfZfb$^/j5 t<zD|L'{T0w\9reAloHh{NdS`X][[^Y`XbVcUdTeSfTfVfYfZg[h\h\h\h\h\h\h\hc$_.m3 w:}BJ&R0|[8wcAplHlwOgTcY`\]_[bYdXfWgVhUhViYh[i\j]k^k^k^k^k^k^k^kd#a-p2 {8@I%Q.Y7|a@viHpsOlUhZd^aa_d]f[hZjYkYkYk[l]m^n_n`o`o`o`o`o`o`oe#d+s0 ~6?H$O-W6^>|fFvpNq{UmZi_ecbf`i^k]l\m\n]n^o_qaqbrcrcrcrcrcrcrcrf#g)w. 5>G"N+U3\_JeUl^sfzlrw|{wtrƒrڃsށt߀uuuuuuuo#+,,16ɻCM.V<]IdTj]qexkqvyzu~qnlkՂmށo߀pppppppq!)'&*5ĿAL-T;[GbRi[ocvj~|oxtsyo|khfeрfh~j~j~j~j~j~j~j~u % "3 @J+S9ZEaPgYm`~tgxzmrrmvhyd|a~_~_~_}b}c|c|c|c|c|c|c|x0 >H(Q6XB_MeVk]xrdryilngrbu_x\zZzYzXz[z]y]y]y]y]y]y]y} . ;F%O3V?]IcRxjYqp_kwdfiam]pYrVtTtStStTuVuVuVuVuVuVuVuٸ +9D"M/T;[DxbMqiSkoYev^`~b\‡fXhUkRlPmOmOlOnPoPoPoPoPoPoPoگͻ +9CK*S5yZ?qaFjhLeoR`vV[~ZWχ]Sϑ_PϜaNϩcLϸcKcLbJeKfKfKfKfKfKfKf ަδ¿ - 9B J*wP3oX;i_AcfF^nJZuNV}QR߆SOߐVMߛWKXIYHYHYGYF[F[F[F[F[F[F[ѭ¸ .:C!vJ*nP1fV7`\<[d@WkCSrFPzIMKJMHNEPCQBQARAR@Q@Q@Q@Q@Q@Q@QԥIJ$1~;tB lH'eO-^U1Y[5Ub8Qh;Mo=Jv?G~ADCBE@F>G4>3?3?3?3?3?3?3? v$n- f5_<XCSINO!JU$F[&C`'@f)>k*;r+9y-6.4/1001.2-3,3,3,3,3,3,3,3}rha'Z/ T7N>IDEJAO>U;Y9_6d4i2p /w!-"+#($'%&&%&%&%&%&%&%&%&xo d\T N'H/C6 ?< sHrQ&oZ.jc6enxqFs{MnSjXg]e`ccae`g_h_i`iajbjcjdieieieieieiei^#i"v#, 6>EL"S*Z2߅e;~mExvMtTpZl^ibgeehdjckclcldmflglhkhkhkhkhkhkhk_#k y"+4 <CJP&X.׊a:΄jE~sMy{Uu[q`ndlgjjhlgngogohoiojnkmkmkmkmkmkmkm_#n{!*2 :AGM!ږU-Ϗ^9ȉgDoM~wUy[v`sephnllnkpkqkrlqmpmpnonnnnnnnnnnnna!p~ )1 8 >DߠJӚR+ʓ\8dCmMtT~|[zawetirmpporosospsprqqqpqpqpqpqpqpqpc r'/6 ;@ڤFΞQ*ŗZ7bBjLrTy[`|eyjwmupssstsutttsuruqupupupupupupet&-4 7 =ԧDɡO)X6`BhKoSvZ~`e}j{nyqxswuwvxuxtxsxqxqxqxqxqxqxqgw$+03ܮ7 ϪCťN(W5_AfJmStZ{`ejn~q}t|u}|v|}v|}t}|s}|r}|q}|q}|q}|q}|q}|qiy#),/ײ4 ˭AL'U4]@dIkRrYy_dimq|tyvwvvvvtwsxrxqxqxqxqxqxqk{!&'ߴ)ҵ2 ǰ@K&S3[>cHiQpXw^~di~mzqvssuqvovptqsrrsqsqsqsqsqsqm~" ں!͸1 ´>I$R1Z=aGhOnWu]|c}hxltpprmtjuiuitksmqmqmqmqmqmqmqpӽȻ/<G#P0X;_EfNlUs[}zawfrjnnjqfsdscscreqgpgpgpgpgpgpgpsپ -:F!O-V9^CdLjS|qYvx_qclhhkdn`p^q]q]p^p`oaoaoaoaoaoaow׵ *8DM+U6\@bI|iPvoVpv[k}`fdbg^j[lXmWmWlWlZlZlZlZlZlZlZl| ح ͸ '6AK(S3Z<}aEvgKpmQjtVe|[`_\bXeUfSgRgRgQhShThThThThThTh ۥαŻ#3 ?H$Q.}X8v_?ofFilKdsP_{T[XW[T]Q_O`M`M_LaMbMbMbMbMbMbMb Ъŵ / <F~O)vV2o^9hd?ckD^sIZzLVʃORʍROʘTMʥVKʳWJWIVIXGYHZHZHZHZHZHZԢǯ !0 ;}DuM$nU+g\2bd7]k;Yr?UzCRڃENڍHLژJIڥKH۳LGLFLFLDOCOCOCOCOCOCOۚʩ %3 {<sDkK"dR(^Y-Y`2Uh5Ro8Ow;L=I?GADBBCAD@D@D@D@C@C@C@C@C@Cͣ (x2 p;iCbJ\P#VW'R^+Oe-Ll0Is2F{4C6A7>9=:;;:<9<8<8<8<8<8<8<8<|t&l0 e8^@XGSMOT KZ"Ha%Eg&Bm(@u*=}+:-8.6/40312212121212121212yog"`,Z4 T<OCJIGOCU@[>a;f9m6t 4}!1#/$-%,&+&*')')')')')')'~ukb[T&N.I5E< AC >H;N8S5X3^1d.j,r*z'%$#"!!!!!!~pg^ VOI C'?.:47:3?0D.I ,N )S 'X %^ #d !l t }L*H3O4T7ZA\JZTW`$Tk*Px/M3J6G9F;EC?B?B@AAAAABABABBADAFBGBGBGBGBGBGBM)J2Q2W6\?^I]SZ^$Wi*Su/P4M7J:HFNW&~a1xj:ssBo|HlMiQfUdXcZa\`^`_`_a_a_c_d_d^d^d^d^d^d^[ ht~#+4 ;CJڊT%Ѓ]0~g:xoBtxHqNnRkViZg\e_dadbdbdbebfag`h`h`h`h`h`h`]jw!)18 ?ݔGҎQ$ʈ[/ƒd9~lAytHu|NrSoWm[k^j`hchdhehdidjckbkakakakakaka_mz'.5; ֘C̓O"čX.a8iA~qHzyNwStXq[o_nbmdlflflfmendncnbnbnbnbnbnbao|$+1ݠ6 ќAǗM!V-_7g@nH~vN{}SxXv\t_rbqepgphpgqfrerdrcrcrcrcrcrccq!',ؤ2̟@ÚK U,]7e?lGsM{S}Wz\x`vcuftgththugvfueududududududet#ߦ&ҧ0ȣ>IS+[6c?jFqMxRW\}`{czf~yh{yizyiyzhzzfzyezydzydzydzydzydzydgv۫Ϊ/Ħ=HQ*Y4a>hEoLvR}W[_~czfw~hu}is~is~ht~ft}eu|du|du|du|du|du|dixծʭ-;FP)X3_bpC^wGZKVNSPPRMTLTKTKTJUJVJVJVJVJVJV֘ɥ(6 AyJrR&lZ-fa2ah7\oqHjPdX%__*[g/Wn3Sv6P9Lӈ;JӔ>GӠ?EԮ@DԿAC@D@BBADADADADADADјå }&u2n<gEaM\U W]$Td'Pk*Ms-J|0H2E4C5A6@7?7?7?6=8=8=8=8=8=8ơyq'j2d; ^CXKSRPYL` Ig#Go%Dw'A)?*=,;-9.8/7/7/6/6/6/6/6/6/{tmf&_/Z8 T@PGLNHUE[Bb@h=p:x8 6"4#2$1%0&/&.&.&.&.&.&.&yphaZ#T+O3J;FB CI @O=U:[8a5h3o0x.,*)('&&&&&&xlc\UOI&D.@4<;9A6F3L1Q .W ,] *d (l %u #! yk^VO IC> 9'5-23.8+=(B&G$L"Q W^enx        B-B2H2L6N<PGPRN_KkHw$E'B*A,?.?/>0=1=2<2<3;3;4;4;4<3<3=4?5?5?5?5?5?5C,D0J0N4Q:SFRQQ]Ni Kt$H(E+C-B/A0@1?2?3>4>4>5=5=5>5>5?4?6A7A7A7A7A7A7D,G.M.Q2T9WDVOTZQf Nr%K})H,F.E0D2C3B4B5A6A6@7@7@7@7A6A7A8C9D9D9D9D9D9E+I,P,U/Y7\B[MXWVc Ro%Oz*L-J0H2G4F5E6E7D8D8D9C9D9D9D9D:E;FH?J@J@J@J@J@J@G*P'X&^*c3f= fGdQ`[ \g&Yr+V}/S3Q5P7N9M;LK>L=K?KAJBLCMCNCNCNCNCNCJ(T$\#c(h0l; lDjNfXab%^m+[x0X4V7T9S;Q=Q>P?O@O@OAOAOCNENFPFQGQGQGQGQGQGM%W!` h&n.r8 rApKmTh^$di*at0^~4[8Y;W>U@TBSCRDRERFRFRHRIRJTJUJUJUJUJUJUJP#[dm$s+w5x>wGtPoZ"ke)go/cy5`:]>[AYCXEWGVIVJUKUKVLVMVMXMYMYMYMYMYMYMS ^hq"x(|1~: }CzLvWra(mk/it6e};b@`C^F]H[KZLYNYOYOZPZPZP[P\P]O]O]O]O]OValu |%.7 ?H}Sw]'rg0np7jxHQ%X._5f<}mAxtFs{KoOkRgUdXaY_Z_Y_Y_XaWaWaWaWaWaWo  ߍҘʢ© /<FO#V,]3}d9wk?rqDnyHiLePaS^U[WZXYWYWYV[U[U[U[U[U[Us ̜ؑå ,9DM T)}\0wb6qi|HuP!oX'j_-ee2`l6\t:X|>UAQDNFLHJHIHIHHIHJHJHJHJHJHJΔ¡ /{; tEnNhV!c]'^d+Zk/Vr3S{6O9LG?F@E@E?DACBCCCCCCCCCC֍ƛ y*r7lBfKaS\[Xb#Ti'Qq*Mz-J΃0HΎ2EΚ4CΨ5Bθ6A5A5@7?9>9>9>9>9>9ʖx sn&h3b> ]HYPUXQ`NgKo Hx#Fށ%Cތ'Aޘ)?ަ*>ߵ*=*=*<+;-:.:.:.:.:.vnic'^2X;TD OLLSI[FbDjAr?{<: 8!7"6#5#4#4#4#4#4#4#4#uid^Y&T0O8K@GG DN AU?\A;G8N5T 3Z 1a /i ,r *} (&%$#""""""sgYSMHC?&:-73390?.D+J)P'V$]"e ny         tgXMGB <840%,+)0%5#: ?DIOV^hr~      9/<0A1D4D:DEEQ C]Ai>v<:9 8!7#7#6$6%6%5&5&5&5&5&6&6&6&6'6(6(6(6(6(9/>/D/F2H8HCHO G[DgBs?=$=%=&<'<(;);););*;*;)<)<*;+;,;-;-;-;-;-<-D)J)N,Q4R>RJ PUMaJmHxE"C$B&A'@(@)?*?+?+?+?,?,?+?,?->/>0?0?0?0?0?0@*H&N&R)V2W<WG UQR]PiMt J#H&G(F)E*D+D,C-C-C.C.C.D-C0B1B2B3C4C4C4C4C4C'K#R"X'\/]9^C [NXXUdRo Pz$M'L)J+I-I.H/G/G0G0G0H0G2G4F5F6F7H7H7H7H7H7F$O V]$a,c5d@ bJ^T[_Xk Uu%S(Q+O-N/M0L1L2K3K4J5K5K6J8J:J:K;L;L;L;L;L;J!S[b"g)i2j< hFePa[^f [q%X{)V,T/R2Q4P5O7N8N9N:N:O;N=N=N>O>P>P>P>P>P>MV_g l&o.p8oB lKiWebal%]v*[~/Y2W5V7T9S;SR?R?R?RARASASATATATATATAPZdlq#u*v3v= sGoSk^fg&cq+`y0^4\7Z:YW@VBVCUCVDVDWDWDXDXDXDXDXDXDS]hpv z&|.|8zD uOpZlc&hl,fu1c}5a9_<]?\A[CZEZFYGZGZG[G[G\F\F\F\F\F\FU`ktz")ނ3@ zLvVq`%nh,kq2hy6f:d=b@`C_E^G^I]J]J^J_I_I`H`G`G`G`G`GXcnw~#և.̃= I{Sv]%se,om2mu7j|;h>fAeDcGbIbKaLaLbLcKcJdIdIdIdIdIdIZfqz݋Ћ,Lj; GQ{Z$wb+tj1qr6oy;m?kBiEhHfJfLeMeNfNgLgKhKhJhJhJhJhJ\ht}֏ˎ*Œ8 DOX#|`+xh1uo6sv;q}?oBmElHkKjMiNiOjOkNkLkKkKkKkKkKkK^kv ۏ Вǒ'6BMV"^*}e0zl5ws:u{>sBrFpIoLnN}nO{mPznPyoNyoMyoLyoKyoKyoKyoKyoK`m y ۋ ԑ ̕•%4AKT!\)c/~j5|q9zx=xBvEuI|sLyrNvrPurPsrPtsOtsMtsLtsLtsLtsLtsLtsLbo { ކՎϔ ǘ#2?IR Z(a.h4o9v=}~A}{EzyIvxLswNqwPovPnwPnwOnwNnwMowLowLowLowLowLd r ~ڈАʗ›!0=GPX'_-f3m8t={{AxEtHq}Km|Nk|Oi{Ph|Ph|Oi|Ni|Mj{Lj{Lj{Lj{Lj{Lf uԋ˓Ě.; ENV%],d2k7zrmBiFeIbK_M^N\N]M]L]K^K^K^K^K^Km|Ոʒ )6 AJR!~Z(y`.tg3on8kuQ@OBMCLCLCKCKDKDKDKDKDKD}ϋ–-}9 wCqLkSfZ"ba&^h+Zo.Vw2S5O8L:JE?E?E?E?E?ڃǑ {(u5o@ iIdQ_X[_ Wf$Tn'Qv*M-J0H2E4C4B5C4B5A7@7@7@7@7@7΋{tp"k0f<aE \NXVT]QdNlKt"H~$EȈ'Cȕ(AȢ*?ȱ+>+>*>+=-<.<.<.<.<.ē{pg d`*\6XATJ PR MZJbGiErB|@؇=ؓ<ء:ٰ 9 9 9 8"7#7#7#7#7#{pe]ZV'R2N<JDGMEU B\ @d>l;v9754221111111{ocXTQM&I/E8A?>G94 0,)&""',16<AHOW a l y 116.:/;2;9;C9O8\ 6h 4t2100//.........//......3/9,=->0?6?A=M<<;::9999999:9!9#9$9$9%9%9%9%<'C#H"L&O/P9NCLO J[HfEqC|BA@?? > >!>!>!>!>!?!>#=%='=(=(=(=(=(=(?#G LQ$U,V5U?SJ PVNbKmIwGFE D!C"C#C#B$B$C$C$C%B(B*B+A+A,A,A,A,A,C JPW![(\2[;YF VQT]QhOrM|K J!I#H$G&G'F(F(F)F*G*F,F.F/F/F/F/F/F/F/FNV\`%b-b7`A]L ZXXcUnRwP"O$M'L(L*K+J,J-J.J/K/J1J2J2K3K3K3K3K3K3JRZaf!h)h2g<dH aT^^[iXr V{$T'R*Q,P.O/O1N2N3N4N4N5O6O6O6O6O6O6O6O6MU_fkm$n,m6kCgOdZ`d]m"[v&Y~)W,V/U1T3S4R6R7R8R8R9S9S9S9T8T8T8T8T8OYcjort&t1q?mKiVf`ci"`q'^y+\.[1Y3X5W7W9V:V;VZ?Z?[>[>\=\<\<\<\<\`>`=`=`=`=Wb l t z ~ ҁȁ'6|B xMuVr_"of'ln,ju0h|3g6e9db@bBbBbCcBcAd@d?d?d?d?d?Yd n w}Ԃ ̄Å$4@ |KyTv\!sd&qk+or/my3k6j9h I}RzZ wa&uh+so/qw3o~6n:m=k?|kByjCxjDvjEvkCvkBvkAvl@vl@vl@vl@vl@] it|ЃɈÊ /< GP~X|_%yf*wm.ut2t|6r9|q=yp@voBtnDrnEpnEpoDpoCqoAqo@qp@qp@qp@qp@_kvˆŋ -: ENV]$~d)|k-zr2}xy5zw9wvf~Ac~Ca}D`}D_}C`}B`}Aa}@a}@a}@a}@a}@gtLj&3? HPX z_%ve*rl.ns2j{6f9c<`?]A[BZCZBZA[@[@[?[?[?[?jx̓Œ#1< FNzVu]#pc(lj,hq0ey4a7^:Z=X?V@T@T@T?U?U>U>U>U>U>o|ȇ .9 CyLtSoZ ja%fh)co-_w0[4X7U9R;P=O=O,=-=-=-=-=-ljsj gc(_5[?WH TP PXM_JfHnExBÂ@Î>Ü<ë ;ü!:!;!9"8$8$8$8$8$uj^YW!U.Q9NCKLISF[ Cc Ak>u<р:ь8њ6ѩ5ѻ45433333uj^TL JH&F2D<BE?M=U;]9f7o 5z 3 1 0..--,,,,,vj^SIEB@$=.:68>6F3M1U/]-e+p){(&%$#""""""wj]QF?<96 3(10.6+=)D'J%R#Z cn{xj]PD:52 .+(!&'#- 39?EMU_jx       yk^PC8/+'$!#(-28? F OYer,/0,2,30160A/M-Z+f)s(~ ' ' ' & &&&&&&&&&&''&&&&&&.,3)5*6-645?3K2W0d.p ,{ , + +****)))))**+***))))1)6&9&:);2;=9H7T5`3l 2w 0 0//.........//.......4&9#=#>&A/A9?E=P;\9h 7s 6~5443333333334332322228#= AE#G,G6F@DLAX?d >o>=========< qInRl[ibgj"fq%dx(c+a.`0_3_5^6^8^8_7~_6~`5~`4~`4~`4~`4~`4U`ipuxz{z/x<uF sPpXn`kg!jn%hu(g|+f.d1c4c6|b7zb9yb9xc8xc7xd6xd5xd5xd5xd5xd5Wblsx{} ~~,|9yD wNtVr]pd nk$lr(kz+j.~i1{h4xg6vf8tf9sf:rf9rg8rg7rh6rh5rh5rh5rh5Yenv{ *7}B {KxTv[tb ri$qp'~ow+{n.xm1vl4sk6pj8nj:mj:lj:mk8mk7mk6mk6mk6mk6mk6[gqy~ (5@ I}R{Yy`wg#|un'ytu*vs}.sr1pq4mp6ko8io:ho:go:go8ho7ho6ho6ho6ho6ho6^jt|%3> GPW~^{|e"xzl&tys*qx{-nw0kv3hu6ft8ds9bs:bs:bs8cs7cs6cs6cs6cs6cs6amw#0<ENU{\wc!sj%oq)l}y,i|/f{2cz5`y7^y8]y9\y9]y8]x7^x6^x5^x5^x5^x5dpz .9C LzSuZqa nh#jo'gw+c.`1]3[6Y7W8W7W7X~6X~5X~5X~5X~5X~5ht~+7A yItQpXl_hf!em%at(^},[/X1U3S5R5Q5Q5R4R4R3R3R3R3ly '~4y>sG oOjVf]cc_j"\r%Y{(U+R.P0N1L2L2L2L2L1L1L1L1L1q~|#w0r;mD hLdT`Z]aYhVp!Sy$P'M)J,H-G-F-F-F.F.F.F.F.F.w}wso,j7eAaI ]QZXW_SfPnMvJ!H$E&C'B(A'A'@(@)@)@)@)@)~ul ie'a3^=ZFVN SU P\McJkGtE~B@> < < < ;!:":#:#:#:#yma]Z X-T8QBNJLRIY F` DhAq?|<:8767554444{ocXP ML%J1G;EDCLAT>\=<&;19;8E6M5V3^1h0s.,ۍ*ܝ)ܭ(('&& & & & ~qeYMC:5 31 0*.3-<+D*L(T']%g#s" reYLA8/- +(&$$+"2!9AIQZersfYK@5,&$ !"(.5<CL V b ougZK?3)!  # (.5=FQ]k{',**+**.&4%?#K!X dp{     )*,'.'-*,2+=)I'U%a#m"x"!!!!!!!!!!!!!"" " ! ! ! ! ! ,&0$1#1&2/1:/F-R+^)i(u''&&&& & & & & & & & ' ' & & & &&&&/#3 57#8,876B4N2Z0e.p-{-, , , + + + + + + , , , , ,,,,,,,37:= ?(?2=>;I9U7a5l4v3 2 2 2 1 1 1 1 1 1 2 2 2111111117;?CF$F.D9BD?P=\FJDVCbAl @u ?~ >==<<<;;;<<<<<<<<<<>DJOQR#Q-O8MEKQI\Gf FpExDCBBAA@@@@AAAAAAAAABG OSVWV%U1S?RLPW Na LjJrIzHGGFFEEEEE F!F!F"F!F!F!F!F!EK S W Z[ZZ+Z;XHVS T\ RePmOuN|MLKJJ!I"I#I$J$J$J%K$K$K$K$K$K$H OV[ ^ ^ _`'_6^C[N YXWaUiTpSxRQP O"N#N%N&N'N'N'O'O'P&P&P&P&P&J SZ_bc ce#e2c@aK ^T\][eYlXsVzU T"T$S&R'R)R*R*S*S)T)T(T(T(T(T(LV]cghhj i/h<eG cQ aZ_a^i\p[wZ~!Y#X%W'W)V+V,V,W,W+X*X*X)X)X)X)OY`gjllmn,l9jDhN fWd^be`l_s^{!]$\&[([*Z,}Z-|Z.zZ.z[-z\,y\+z\*z\*z\*z\*Q[djnpp qq)p7nBlK jTh\fceicpbx!a$`&}_){_+x^-v^.u^/t^/t_.t_,t`+t`+t`+t`+t`+S^gmqss uu't4r?pI nRlYj`ighnfu!}e}$zd&wd)uc+rb-pb/ob/nb/nc.nc-nc,nc+nc+nc+nc+U`iptwwxy$x2v=tG rOpWo^md}lkzks wjz#ti&rh)og,mg.kf/if0if0ig/ig-ig,jg+jg+jg+jg+Xclsxzz{|"|/z;xE wMuUs\{rbxpiuop rnx#om&ml)jl+hk.fk/dj0ck0ck/dk-dk-ek,ek,ek,ek,[fov{~~-9}C {K ~zSzxZvwasugptnmsv"jr&hq(ep+bp-`o/_o/^o/^o/_o-_o,`o,`o,`o,`o,^iry+6@~I yQu}Xr|_n{ekzlhyt"ex}%bw'`v*]u,[u.Zt/Yu/Yt.Yt-Zt,Zt+Zt+Zt+Zt+amv} (4~>yG tOpVm]icfjcr `~z#]}&Z|)X{+V{,T{-S{-Tz-Tz,Ty+Uy*Uy*Uy*Uy*eqz $}1x;sD oL kTgZdaah^p[x!X$U&R)P*O+N+N+N*O*O)O)O)O)ju{!w-r8mBiJ eQbX^_[fXmUvR!O#M%K'I(H(H'I(I'I'I'I'I'o{~wso)k5f?bG_O \VX\UcSkPsM}JG!E#D#C#C#C$C$C$C$C$C$utn jf%c1_;[DXKUS RZ OaMhJqG{DB@>====<< < < |{oc_\Z+W6T@QHNOKW I^ Ff DnAx?<:988776666sgZS QO$M0J:HCFKDRAZ?b=k :u 8 64321100000ui^SGCB@'?2><5-% $#"%!. 7@JS^jx{naTH=3*" &-5=FP[i x }obUG;1'  # ) 08ALXfwqcVH:/% #*2<GTcs")#'#( +1=IVbnx$'&$&$$'"/ :FS_ju'#) ) (#)-'7%C#O![fq{+--. /)/4,?*K(W&b%m$w############$$$$$ $ $ $ $ .1256%6/4:1F/R-],h+r*{***)))))***** + * * * * * * 258;= <*;59A6M4X3c2m2v11000//// 0 0 1 1 111111169>ACB#A.>:=Ft ={ = < <<;;;;;;<<<<<<<<= BH K LLJJ,K;JHHSG]Ff Dn Cv C}BAA@@@@@@AAAAABBB@ FLOP O OQ'Q6PCONMXLa Ji IpHxGGFFEEEEEEFFFFGGGBJPTVU UV"W2V?TJSTQ] PdNlMsLzLKJJIIIIJJKKKKKKEMTY[[Z[\.[;ZFXPVY U`ShRoQvP}PONNNN N!N!O O OPPPPGQX]``^ `a*`7^C]M[U Y]XdWkVrUyTSSRR!R"R#}R#|S"|S!{T!{T {T {T {T JT\addc de'd4c@aJ_R ^Z]a[hZoYvX}XW}V {V"yV#wV$vV$uW$uW#uX"uX!uX!uX!uX!MW_dghghi$h2g=eGdO bW a^_e^l]s}]z{\y[v[!tZ#rZ$qZ%pZ%o[%o[#o["o["o[!o[!o[!OZbgkljkl!l/k:iDhM fU e\db}bizbpxaxu`s_p_!n^#l^%k^&j^&i^%j_$j_#j_"j_"j_"j_"R]eknonopp,o8mBlK jR ~iY{h`wffufnreupd~mckc"ib$gb%eb&db&db&eb$ec#ec"ec"ec"ec"U`hnqsqrst*s6r@pH}oP ymWvl^skdpjlmiski|hhfg!dg#bf%`f&_f&_f&`f$`f#`f#af"af"af"Xckquwuv wx'w3v=|uFxsN urUqq\npckojinqfnzcmal!_k#]k%[k&Zk&Zk%[k$[j#\j"\j"\j"\j"[fnty{yz {|$|1|{;wzDsyL pxS lwZivaguhdtoasx^r\q Zq"Xp$Vp%Up%Up%Up$Vo#Vo"Wo"Wo"Wo"_irx}~!{.w9rBnJk~Q h}Xd|_b{f_zm\yuYxWxTw!Rv"Qv#Pv$Pv#Pu#Qu"Qt!Qt!Qt!Qt!cmv}}yu+q6m?iGeO bV _\\cZkWsT}QO~M~ K}!J}"J}!K|!K{ K{ K{ K{ K{ gr{|vrn'j2f<cD`L\S ZZ WaThQqOzLJHFEEEEEEEEmxtn if"c.`8\AYIVPTW Q^ NfLnIxFDB@????????s~{le`][)X4U=REPMMTK[ Hc Fk CuA><:99998888zuh[V SQ#O/L8JAHIFPCXA_?h=r :} 8 6433322222ymaUKGED'B2A;?C=K;S9[7d5n3y1/.- ,, + + * * * }qdYMB; 875)423;2D1L/U.^,h*t)'&$###""""sg[OD:0* ('&'%0$9#B"K!U _lz͊͜ήuh\PD90(  "+4=HS_m~ߑ wj]PD8.%   ! ) 1 ;EQ^nyk^QC7-#  %.7BN]n{m`RD7+!  !)3>K[l&$%'.:G S _ k u           #!!$,7DP\gr{""! )4@LXcnw%&$%&%$0!;HT_is|)*),,!,+)7'C%O#Z"d!n!w!!!    !!!!""#######,.0332%00.<,I*U*_)i)r(z(((((((((()****** * * 02 6 8975(352B2O1Z1d0m0u0|/////////00 0 0 0 0 0 0 0 3 6< > =<99-:<:I9T9^8g7o7v6}6655 5 5 5 5 5 6 6 6777777;@BB ?>@'A6ADAO@Y?a>i=q=x< < ; ; ; ; :;;;<<<<<<<:@EHHF EG"H1H?GJFTE]DdClBs Bz A A @@@@@@@AAABBBB<DJNOMKMN-N:MFLOKXJ`Ig Hn Gu F|FEEEEEEEFFFGGGG?HOSUSQ RS)S6RBQKPTO\Nc Mj LqKxKJJIIIIJJ~K~K}K}K}K}KCLSXYXV WX%X2W>VHUQTXR_ Rf QmPtO{ONN}N{MzNxNwNwOvOvOvOvOvOFPW\^]Z[\"\/[;ZEYMXUW\ Vc UjTq~Tx|SzRxRvRtRrRqRpRpSpSpSpSpSpSISZ_ba^_``,`8^B]K\R[Y Z` }Yg{XnxXuvW}tWrVoVnVlVkVjVjWjWjWkWkWkWLV^beebbcd)c5b?aH`P}_W z^] w]d u\ks\rp[{n[lZjZhZfZeZeZeZeZeZeZeZeZOYafhief gh'g2f=eF{dMxcT ub[ raa paim`pk_yi_g^e^c^a^`^`^`^`^`^a^a^a^R\dillij jk$k0~j:ziCvhKsgRpgY mf` kefhdnfdvdcbc`b^b\b[b[b[b[b\b\b\b\bU_glpolmno!}o-yo8unArmInlPkkW ik^ fjedilait_h~]g[gYfWfVfVfVfWfWfWfWfWfYbjpsspqr|sxs*ts5ps?mrGjqNgqU dp\ boc_oj]nrZm|XmVlTlRkQkQkQkRkRjRjRjRj\fntwvuvzwvxry'oy2kx<hxDewLbwS_vZ ]ua ZuhXtpUsySsQrOrMqLqKqLqLpMpMoMoMo`jrx{zzz{t| o~l~$i/f9bB_~I]}PZ}W W|^ U|e R{nPzwNzKyIyHxFxFxFwGvGvGuGuGueow}~sl he b,_6\?YFWNTUR\ Oc Mk KtHFDBA@AA~A}A}A}A}ju}yjd`]['X2U;SCPJNRLYI`Gh Er B}@><;:;;;;;;q{se\W TR"P-M6K?IGGNEUC]Ae>o <:9)827;5C4K2S1\/f-q+*('&&%%%%%xk_SH=4/-, +)*2):(C'L&U$_#k"x {nbVJ?5,$ &/8AJUaoƑǤǹ~qdXK@5+#   ! * 4 > I U brԄԘԫsfYL?4*!    (1<GTctuhZM@3(  %.9ESdvwj\O@3'  *5CRcv#!! $ +7DQ]hr{ ) 4 AMYdnw%0=I U ` j s |   ",8DP[fow""!"" '2>KV`jrz&% ( )(& $+!8 DP[emu}   !"""#####) *./ -+("&/&='J'U(_(h(o'w'~''''''((())******-0342 .,.(/70D0O0Y0b0j/q/x///...///00011111058:95 46"818?8J8T7]7d6l6s6y55555555 5 6 6 7 7 7 7 7 3:?BB>;>?,?:?E?O>X=_=g^qF\pMYpTWp[UobSoj Pns Nn~LmJmIlHlGlGlHkHkHjHjHj^gnrrqzqqrktfucv`w(^w3[x<YwCVwKTwRRvYPv`NuhKuq It| GtEsCsBsAsBrBrBqCpCpCpclsvuvuvixcz^|\}Y~$W/U8S@PHN~OL~VJ~]H}eF}nC|y A| ?{ >{<{<{v;9 8 6 6 6 6 6 6 6 6 ox~wk^UNJHG%E/D8B@@G?O=V;_9h7s5310////// / v}peZOFA >=;(:19:7B6J5R3Z1d/o-{,*)(''''''~vj^TI@7210!.*-2,:+C*K)T(^&i%v#" }ocWMC80($#!! )1:BLVao~uh[PE;1' &.7ALW e t zl`SG<1' $,6@LYhy̌˟˳|obUH;0&  "*4?KZj}ݑݤ޶qdVI</$  '1=KZltfXK=/$  #.;J[m  (5ANZenw %1>JVaks{  "-9FQ\fow~( 4 ALWajrz   ".:F R \ e m u |   &3?KV_how}""%$! *8EPZbjqx~   !!""#####%(*+(! !$$%2&?'J'T']'d'l'r'y'''''(((()******(.353-*-.,/:/E0O/X/_/f/m/s.z.....///0011111-5:=<73 46'747@7J7S6Z6a6h5o5u5|555555566777772;ADC?; ;<"=0=;=E=Nk >k `inmmxmlnap[rVt RuPvNw'Lw1Kx9IxAHxIFxPDwWBw_@wh>ws<83245*555@5I5P5W5^5d4k4r4y4~4}4{5y5x5w6v6t7t7t7t7t75=BDB>98::&;1;;;D;L;S:Z~:`}:g{:ny:uw:~v:t:r:q:o;n;m;m<l<l<l<l<9BGHFC?> ??!@-@7@@}@H{@Oy@Vw?]u?cs?jq?rp?zn?l?k?i?h?g@f@f@e@e@e@e@>FKLJGCCCD~D){E4yE=vEEtDLrDSpDYnD`lCgkCoiCwgCfCdCbCaD`D`D_E_E`E`D`DAINOMKGGG|HxH&uI0sI:pIBnIIlHPjHVhH]fHdeHlcHuaG`G^H]H[H[H ZHZIZIZHZHZHELRQPNJJzKvLrL#oL-mM6jL?hLFfLMdLSbLZaLa_Li^Lr\L|ZLYLWLVLUL UL ULULULVLVLHPUTSQMzNuO pOmP jP*gP3eP<cPCaPJ_PQ]PX\P_ZPgYPpWPzUPTPRPQP PP PP PPQPQOQOQOKSWVUT|PuQpR kShTeT'bT1`T9^TA\THZTOYTVWT]VTeTTnRTxQTOTNTLTLT KT LTLSLSMSMSNVZYXWwTpUjVfWbW`X$]X.[Y7YY?WYFVYMTYTSY[QYcOXlNXvLXJXIXHXGXGXGXGWHWHWHWQY\[[}ZrXkYeZ`[]\Z\!X]+V]4T^<S^DQ^KP^RN^YL^aK]jI]tG]E]D]C]B]B]B\B\C[C[C[U]_^^x]m\e]__Z` WaUbRb(Qc1Oc9NcALcHKcOIcVGc^EcgDcqBc}@b?b>b=b`>`>`Yaaaataia_bYdTf QgNgLh$Ki-Ii6Hi>FjEEjLCjTBj\@ie>io=:731 12 3+353>}3F{3My3Tw3Zv3at3gr4oq4wo4n4l4j5i5h5g6f6f6f6f6f67>BA?<8677|8'z81w9:u9Bs9Iq9Pp9Wn9]l9dk9ki9th9~f9d9c:b:a:`;_;_;_;_;_;;BEDC@=;};y<u=#s=-p=6n=?l=Fk=Mi=Sg=Zf=ad=hc=qa>{_>^>\>[?Z?Z?Y?Y?Y?Y?Y??FHGFD@|?w@ s@oA lA*jA3hA;fBCdBJcAPaAW`B^^Be]Bn[BxZBXBWBVCUCTCTCTCTCTCTCBIKJIG}CvCqD mDjEgE'dE0bE8`E?_EG]EM[ETZF[YFcWFlVFvTFSFRGPGPGOGOGOGOGOGPGEMMLKJxFqGlGhHdHaI$_I-]I5[I=YIDWIJVIQUJYTJaRJiQJtOJNJMJLKKKJKJKKKKJKJKJHPOON{MsIlJgKbL_L\M!ZM*XM2VM:TMASNHRNOPNWON_NNgLNrKN}INHNGOFOFOFOFNFNGNGNLRQQQwPnLgNbO]P ZPWQUQ'SQ0QR8PR?NRFMRMLSUJS]ISeHSoFS{ESCSBSASASASARBRBRBQOTTT}SsSiQbR\SXT TURUOV$NV-LW5KW<JWDHWKGXRFXZDXcCXmAXy@X>X=Xc>=cEg4*!  "+5@N]nvgZNB7,"   )4BQbuɊɟʱn`SF:/$  (4CTg|fYL?2$ '5FXk,9EPZckrx~ (4ALV_fmtz "/;GQZbiouz )6AKT\cjpu{ "/;ENW^djpu{'3>HQX_ejpv|   ,7BJRY_ekqw~   $0;DLSZ`flry!%"*5>GNU[agmt|~}|zyxxx"),*'#$/9AIPV\bi} p| xz y!w!u"t"s#r#p$o$o$n$n$)020.*'# #$%*%4&=}&D|&Kz&Rx&Xw&^u&et'lr'tq'}o(n(l(k)j)i*g*g+f+f*f*/66540-*)*|+%y+/w,8u,@s,Gq,Mp,Tn,Zm,ak-hj-ph-zg.e.d.b/a/a0`0_0_0_0_04;::8520{/w0t0!q1+o14m1<k1Cj1Jh2Pg2We2]d2eb2ma3w_3^3]4[4Z5Z5Y5Y5X5X5Y58>>=<:}7x4t4 p5m5j5'h60f68d6?c6Fa6M`6S^7Z]7b\7jZ8tY8W8V9U9T9S:S:S:S:S9S9<A@@?~=x:s8n9j9g9d:$b:,`:4^:<];C[;JZ;PX;WW;_VN>N>M>N>N=N=?CCCBz@s=m<h=d=a>^>!\>)Z>1X>9W>@U?FT?MS?UR@\P@eO@oNAzMAKAJAIBIBIBIBIAIAIACEEEEvCo@h@cA_A \AYBWB&UB.SB6QB=OBCOCKNCRMDZLDcJDmIExHEGEEEEFDFDFDEDEEEEEFHHH{GrFjBcC^DZE VETFQF#OF+NF3LG:KGAJGIIHPHHXGHaFIkDIvCIBIAI@I?J?J?I@I@H@HIJJJwJnIeE^GYHUIQJOJLJ!JK)IK1GK8FL?ELFDLNCMVBM_AMh@Mt>M=MQS=R\U+=V24\F3]N1]W0]a/]l.]z,]+]*]*])]*\*[+[+ZUUUrUgV^VTWLYE[?]:_6` 4a2b1b#0b+/c2.c:-cB,cJ*dS)d](di'dv&d%d$d#d"d#c#b$a$aXXzYnYcYZZP\H^A`:c4f/h ,i*i)j(j&'j.&k5%k=$kF#kO"lY lelrlllkkjihh\\u\i]_]V^LaCdk7n0q)u"x{}}}~"~*~1~:~DNZh x  ~ ~ } } | { zewejeafVhLkBo9s1w*z#~    # + 3=HTaq~jqjgk[lPpFtQez)5AMV_fmty $1=HRZbiouz +7BLU]djpuz%1<GPW^ejpuz +6@JRY_ejouz$/:CLSY_djou{  (3=EMSY_djpv~   ,6? G N T Z _ e k r y  }|{{{ %/9AHOU[agnu}~|zxwutsqqqp%%#! )3<C~J|PzVy\wbvitqszqonlkjihhgg&***(%"|$z.w6v>tErKqQoXn^lek mi vh!f!e"c"b#a#`$`$_$_$_$,///-*(}$z" v#s# q$)o$2m$:k%Aj%Gh%Mf%Te%Zd&ab&ia&r_'}^']([)Z)Z*Y*X*X*X*X*13332/y-u*r( o(k)i)%g*-e*5c*=b*C`*J_+P^+W\+^[,fY,oX-zW-V.T.S/S/R/R/R/R/R/66665y3s1o/k.h-d.b.!`/*^/1\/9[/@Y/FX/MW0SV0[T1cS1lR2wQ2O3N3M3M4L4L4L4L4L39999|9t7n4i3e2a2 ^2\3Z3&X3.V35U4<S4CR4JQ4PP5XN5`M6jL6uK7J7I8H8G8G8G8G8G8G8;<<<x<p:j7d6`6\6 Y7V7T7#R7+P72O89M8@L8GK8NJ9UI9^H:hG:sF;E;D<C<B<B=B<B<B<B;=>>>u>l=f:`9[:W:S;Q;N; L;(K;/I<6G<=G\C>fB?qA?~@??@>@=@=@=@=@>?>?@@A|AqAh@a<[=V>R>N?L?I?G@%F@,D@3C@:BABAAI@AQ?BZ>Bc=CoE8=E?*VF)VO(WY'Wd&Wr%W$W#W"W"W"W#V#U$UMNuNiN_OVOMPER?S9V3X/Z+[*[(\'\$&\+%\3$]:#]C"]L!]V ^a^n^~^^^]]\[[Q~QpQdR[RRSJTAW;Y5[.^(`$b "c!cd d'd.d6e>eGeQe]ejezeeeedcbbTxUkU`VWVOWFY=\6_0b)d#gjllmm!m)m0m9nBnLnXnenu n n m m l k k jYrYfY\ZTZJ\A_9c1f*i$loru www w# w* w3 w< wGwRw_wowwvvuttt{]m]b^Y^N`EcM]pduWyK~?4)  &3ARdy\PD8,!  &5EWkӂӗөҸUI=0%  '8J]r &2=HRZbiouz !,8CMU]djpuz '2=GPX_ejpuz!-7AJRY_ejotz &1;DLSY_diotz  +5>FMTY_dinu{$.7@GNTY^diov~   '19AHNTY_dkrz~}{yxvuu t s s    * 3 ; B I~ O} T{ Zz `x gw nu vt r p omlkjiii~${-y6w=vDtJsPqVp\nbmjksi}hfecbba```"#$#" ~|z wtq(o0n8l?kEiKhQfXe^cfbo`y_]\[ZYXXXX'((('{%v#s q nki#g,e3c:bA`G_M^T\[[bY kX vV!U!T"S"R#Q#Q$Q$Q$Q#+,,-|,t*o(k%i"f!c"a"_#']#/\#6Z#=Y$CW$JV$PU$WS%_R%hQ&sO&N'M(L(K)K)J)J)K)K)./00w/o.j+e*c'_' \'Z'X($V(+U(2S(9R)@P)FO)MN)TM*\L*eJ+pI+|H,G-F-E.E.E.E.E.E-123|3r3k1e/`-],Y, V,T,R, P,(N-/M-6L-<J-CI-JH.QG.YF/cE0mC0zB1A1A2@2?2?2@2@2@2355y6n5f5a2\0W0T0Q0N0L1J1%H1,G12F19D1@C2GB2OA3W@3`?4k>5x=5<6;6;6:6:6;6;6;6678u8k8c7]6W3S4O4K4 I4F5E5"C5)A5/@56?6=>6D=7L<7U;8^:8i99v897:7:6:5:6:6:697989~:r;h;_:Y9S6N7J8F8 D9A9?9>9&<9-;:4::;9;B8;J7;S6<\52>1>1>1>1>2=2=;<{<n=d=\=U<N:I;E<A=>=<=:>9>#7>*6?15?84?@3@H2@P1@Z0Ae/Ar.B-B-B,B+B,B,B-A-A=>w?k?a@Y?R?I>D?@@K9L3N.P(S$T "U UVV$V,V3W;WDWNWYXfXuXXWWWVUUItJfK\KSKKLDM[6_.b&fjmps vx xyyyz&z/z9zDzPz_zpzzzyxxwj[_[V[L\B`9c0h(l ptw{ ~  (1<IWh{e`\`QaFdPdz͑ͤʹMA5) !1CVk !-8CMU]ciotz (3>HPX^djotz#.8BKRY_ejotz (2<EMSY_dintz",6?GMTY^chntz &08@GNSX]chnt| )2:AHMSX]ciow~}{zyxwxx  #,4;BHNS}X|^{dyjxrv{tsqpnmmlll  ~%|.z6x<wCuHtNsTqYp_nfmnkxjhg e d c c b b b }|| x u r (p 0o 7m >l Dk Ji Oh Ug \e cckbu`_]\[ZYYYY~xtqq oli"g*f2d9c?bE`K_Q]X\_ZhYrW}VTSRQQQQQ ""#w"p!ligfca_&]-\4Z;YAXGVMUTS\RdQnOzNMKJJIIIJ$%&{'q&j%f#b!`^ [YW"U)T0S7Q=PCOJMQLXKaIkH wG F!D"D"C"C#C#C#C"')*v*m*e)`'\%Y#W!U!R!P!N!%M",L"3J"9I"@H"FG#ME#UD$^C$iB%u@&?&>'>'='=(=(='>'*+-r-h-a,\+X(T&Q&N% L%J&H&"G&)E&/D&6C'<A'C@'K?(S>)\=)f<*r;*:+9+8,7,7,8,8,8,,.{/o0e0]/X.S+P*L*I* F*D*B*A*%?*,>+3=+9<+@;,H:,P9-Y8.d7.p6/5/4030202030304//1w2k2b2Z2T1O/K-G.D.A.?.=.;."9/)8//7/660>50F51N41W32b22n13}03/4.4-4-4.4/3/313t4h5^5W4Q4K2F1B2?2<2 938363 43&33-24414;05C05L/6U.6`-7l,7{+7*8)8(8(8)8*7*745q6e7[7T7M6G6B5=6:677 472718/8$.8+-92,99+9A*:I*:S);^(;j';y&<%<$<#<#<$<%;%;6|8m9b9X:Q9J9D9=99:5;2;/<-=,=*=!)=((>/'>6&>>%?G$?P#@["@h!@v @AAAA@@ ?9x:i;^<U<M<G<@<8=4>0@-A*B 'B&C$C#C%"C,!D3 D;DDENEYEeEtEFFFEEDD<s=f>[?R?J?D?=@6A1C,D'F$G !H III"I)J0J8JAJKKUKbKqKKKKKJJI?o@aAWBNBGBAB:C2E-G(I#KMO PPPP%P,Q4Q=QGQRQ_RmR~ Q Q Q Q P POyCjD]DSEKEDE>F6H/J)L$OQSV WXXX X( X0 X9 XC XN XZXhXyXXXWWWVsFdGYHPHHHAI:J2M+P%R UXZ] ` ` ```#`+`4`=`I`U`c`s`___^^^lJ_KUKLLEL=N5P.S'V Y\_b eg ghhhi&i.i8iCiOi]imiihhgfffOZOQOJOAQ8T0W([!^beh knp p qqrs!s(s1s<tHsVsfsyssrqqpaSVSOSEU;X2\*`"dhlo rvyzz {|}~"*5AO_q~~}\XTXIZ?]5a,e#josw { ",8FVh~Y]N_Cb8f.l$qw| #.<L^tSdGhHPW^dioty$.9BKRY_dinty )3=EMSY_dinsy #-7?GNSY^chmsz '09AHMSX]bgms{ !*3;AHMRW\agnu~~}}}} $-4;BGMRW\~b}h{pzyxvutrqpppp'}.|6z<yBwGvLuRsWr]qcokntl~kihgfeeee  ~| ywu!s)q0o6n<lBkGjMiRhXf_egcpbz`_^\\[[[[|vsr q nli#g*f1d7c=bCaI_N^U]\[ cZ mX xW V T S R R Q Q Q }tmjggf c a _ %] ,\ 3[ 9Z ?X EW KVQUYSaRkPvNMLKJIIIIvmfb_^^ [YW U'T.S4Q;PAOGNNLUK^IgHsFEDCBBBBB }!q"h"a!\YWUTQON#L*K0J7I=GCFJERCZBdAp?}>=<;;;;<!#x$l%c%\$W#S QOM KHG E&D-C3B9@@?G>O=X<b:m9{8 7!6!5!5!5!6!6!#&t'h(_(X'S&O$L"I G DB@ ? #> )< /;!6:!=9!D8"L7"U6#_4#k3$y2%1%0%0&/&0&0&1%&(q*e*\*U*O)K(H%D$A$?$ =$;$9$7$&6$,5%34%:3&A2&J1'S0']/(i.)w-),)+*****+*+*,)(|*m,b-Y-Q-L,G+C(?(<(9( 7(5(3(2(#0()/)0/*7.*?-+G,+Q+,[*,g)-u(-'-&.%.%.&.&.'-+x-j._/V/N/H.C-?,;,7,4, 2,0-.--- +-'*.-*.5)/=(/E'0N&0Y%1e$1s#1"2!2!2 2!2"1"1-u/g0\1S1K1E1@0;0603001-1 +1)2(2'2$%3+%32$3:#4C"4L!5W 5c5q666666650q2c3Y4P4I4B3=37314.5+5(6 %7$7"7!8" 8(80879@9I:T:`:n:;;;;::9}2m4`5U6M6F6@6:646.8*9&:#; <===>%>->4>=?G?Q?^?l@|@@@@??>y5i7\8R9J9C9=9791:+<'="?AB CCDD"D)D1D:ECENE[EiEy E E E E E D Dt9e:X;O;G<@<:<4<.>(@#BDFHJ JJKK% K- K6 K@ KJ KV KdKtKKKJJJIn<`=T>K>D>=>7?1@*B$EGILNQ Q Q QQ"Q)Q2R;RFRRR_RoRQQQPPPh@[APAHAAA;B4C-E&H KMPSU X XXYYY%Y-Y6YAYMZZZiY|YYXXWWcDVEMEEE?E7G/I(L"ORUX Z ]_ ` `aab b'b1b;bGbUcdbvbbaa``]HRIJHCH:J2M*P#SWZ] `cfgh ijklm"m*m4m@mNm]momllkkjXMNMHL>N5Q,T$X\`d gknprrs uvwxy#z-z9zGzVyhz|yxxwwTQLQBR8U/Y&^bgk oswz|~ %0>M_sRVGWr2x'  #5I^uیܟܫ $/9CKRY_dinsy*4=EMSY^chmsy $.7@GNSY^chmsy(1:AHNSX\aglsz "+3;BHMRW[afmt}%-5<BGLQV[`gn~w}{zxwvvvuu  '/5}<|A{FyKxPwUv[tasiqqp{nmkjjiiii{ ywv"t)s0q6p<oAmFlKkPjVh\gdeldvca`_^^^]] | wtq omki#h*g1e6d<cAbF`L_R^X]_[hZrX~WVUTTSTT zrli g f db`^%]+\1Z7Y<XBWGVNUTS\ReQoO{NMLKJJJJ~sjd`^] ] ZXV U'S-R3Q8P>O DN JL QK YJ bH mG zF D C B B B B B xlc]YVTTS Q O M "L (K .J 4I :GAFGEODWBaAl?y>=;;:::;sg^XSPNLL JHFE$D*B0A7@=?D=L<T;^9i8v76443344|nc Z S NJHFECA?> =';-:39:8A7I5Q4[3f2s0/.---..x j"_#V#O"J!F CA?= ;976#5)40361>0F/O.Y-d,q+*)( ' ' ( ) t#g$\%S%L%G$B#?!=:7 5310 /&.--3, ;+ C*!L)!V("b&"o%#$###"$"$"$#$$##q%c&Y'P(I'C'?&;$8"5"2"0" .","*")"#(#*'#1&$8%%A$%J#&T"&`!'m '}'((((('~%n'`)V)M*F*A)<(7'4&0&-&+' ('''%'$'!#('"(.!)6 )>*H*R+^+k+{,,,,,++z'j*]+S,J,C,>+9+4*0*+*)+&+#,", ,,-%-,-3.<.E/P/\/i0y000000/v*g,Z-P.H.A.;.6-1-,-'/$/!01 1222"2)31393C4M4Y4g5w5555444r,c.W0M0E0>08030/0)1$2!356 77888&8.969@9K9W:d :t : : 9 9 9 9 8n/_1S2J3B3;36312,3'4!689;= >>>># >* >3 >< ?G ?R?`?o???>>>>i3[4P5G5?59545.5)7#8;<?AC D D DD D'D/D8EBENE[EjE|EDDDDCd6W7L8C8<87818+9%; =@BDG I J KKKK#K+K4K>LILWLfLwKKKJJJ_:R;H;@;:;4;.<'>"ACFIK NPQ QRSSS&S/S9SESRSaSrSRRQQQY>N>E>>>8>0@)B#DGJMP SUWX YZZ[\!\*\4\?\M\[\l\[[ZZYTBJBBB^2c'jpx  &8Kaz7j+p x ,@WnԆԛӫ *4=FMSY^chnsy %.8@GNTY^cgmsz )2:BHNSX]bgls{ #,4<BHMRW[`flt}&.5<BGLQUZ`fmv}|||||  (/6<AFK}O|T{Zy`xgvpuzsqponnnnn~|{y"x)w0u6t;r@qEpJoOmTl[kbijhtfecbaaaaa~yuq omlk$k*i0h6f;e@dEcJaO`V_]]e\oZzYXWVVVVVzrligd ca`_%^+]0[6Z;Y@XEWKVQUXSaRjPvONMLLLLL | p h b _ ]\ ZXWV U&S+R1Q6P;OANGMMKUJ]IgGsFEDCCCCC ti`ZVT S S QONL!K'J,I2H7G=ECDJCQBZ@d?p>~=<;::::|nbZTPMKK J IGED#B(A .@ 3? 9> @= G< O: X9 c8 o6 ~5 4 3 2 2 2 2 wi^UOJGECCB @ ? = < $; *9 0877=6E5M3W2b1n/}.-,+++,rdYQKFB?><; :875!4'3-230:/B.K-T+_*l){('&%%%&~n`VMGB>:8754 20/-#,*+0*7)?(H'R&]$j#y"!   zj]S J D >:7420. ,*)' &&%-$5#="F!P [hwwg Z!P"H"A";"7!3 0-+(&%#!!$ *2:C M!Y!f!u"""""!!s d"W#M$E%>$9$4#0",")!&!$!"! !!""!"(#/#8$A$K%W%d&s&&&&&%%p"a$T&J&B'<&6&1%-%)$&$"%%& &''''%(-(5)>)I)U*b*q*** * * *)l$]&Q(H(@)9(4(/(+'''"()*++ ,,,-#-*-2.<.F .R ._ /n / / / .. . .h'Z)N*E+=+7+1*-*)*$* +-./1 222 2 2' 2/ 38 3B 3N3[4j4{333332d*V,K-B-:-4-/,+,&,"-/1246 8 8 888$8,848>9J9W9e9w988887_-R.H/?08/2/-/)/$013579 ;= >>>>!>(>1?;?F?S?a?s?>>===Z0N2D2<25201+1&2 468;= ?AC CDEEE$E-F6FBFNF]FnEEDDCCU4J5A59534.4(5"7:<?A DFHI J KLMN N(N2M=NJNXMiM}LLKKJP8F8=87817*9$;=@CF IKNPQR STUVW#W,W8WDWRVcVwVUTSSK<B<;;5;-<&?BEHK OQTWXZ[\ ]_`bb&b1b>aLa]ap``_^]G@??:?1@)C!FJNQ UX[^acdegh jlno o*o6nEnUnhmmlkjDD>C5D+G#KOTX\`dgkmoprtuw y|~".=~M}a}w|{zyCG9I/L%PU[`ejnrvy|~ %3DWm=N2Q(V\bhnty~ ):Mb{6W,\!bipw~ 0CXp0b%ipx  %8Ne~͖̩ %/8@HNTY^chmsz )3;BHNSX]bgmt{ $,5<CHNRW\agmt}'/6<BGLQUZ`fnv !(06<AFKOTZ`g~o|zzxwutsttt#*}0{6z;x@wEuItNsTqZpanimskihgfeffg|vt rqpp$n*m0k5j:i?hDgIeNdTc[ac`m^y][ZYYYZZ{snjgedccb%a*_0^5]:\>[DYIXOWVV^ThSsQPONNNNO{phb_][ YXWW V%U*S0R4Q9P?ODNKMRKZJcIoG|FEEDDDEq f ^ Y UTRP ONML K&J+I0H5G:F@EFCNBVA_@k>x=<<<;;; x j_WQM K JI H FEDC!B&A+?1>6=<<C;J:R9\8h6u5443333 qdYQKGDB A A ?><;:"9(8-72695?4G3P1Z0f/s.-,++++}l_TLFB><:: : 8 654 2 $1 )0 // 6. =- E, N+ Y) e( s' & % $ # # # xh[QHB=975332 0 / - , !+ '* -)4(;'D%N$Y#e!s sdWME?:520.-, +)(&%$$*#1"9!B KVcqp`TJB<62/,*(&% #" !'.6?ITapl]QG?94/+(&$"  $,4=GR_niZNE= 61-)%#  ")1:EP ] l | eWL!B!:!4!/!* &#    !!"""&#/#7 #A $M $Y $g $x$$$$##bT!I#@#8#2#,#("$!!!!!#$%& ' ' ' '# '+ (4(>(I(U)d)t))((('^"Q$F%=%5%/%*$&$"##$%&() , ,,,,!,(-0-:-E-R.`.q---,,,Z$M&C':'3'-'(&$&!&&')+, . 0 11222%2-263B3N3]3m322111V'J)?*7*0*+)'(#()*,.0 1 45 67888"8*939>9J9Y9i9}88776Q+F,<,4,.,*+%+ ,-/13 5 7:; < =>?@@%@/@:@F@T@e?x?>>==M.B/9/2/-.(."/0257 : <>ABC D FGHH!H*H5HAHOH`GsGFEEDH2>26201+1%2469< ?BDFHJKL NOQRR%R0R<QJQZQmPONMMC6;645/4'5!8;>A DGJMOQSTUW Y[]]]*]6\D\T[g[~ZYXW?98938+9#<?CG JNQTWZ\]_`bd fhkk#j.j<jMi_hugfed==7<.=%@DIM QUZ]`cfhjkmoqt vy{{'z5yExYxmwvut_C^H]N[UZ]XgWrUTSRQQRR|qid`^\ [[ZZY%W*V/U4T8S=RCPIOPNXMbKmJzIHGGFGG~pf^YVSRP OONN M%L*J.I3H8G>FDEKDSC]Ah@u?>====>uh]UPLJIG FEEDC B%A*@/?4>:=@;G:O9Y8d7q6544445~m ` V N H D B@?> =<;;:!9%7*60554<3C2L1U0`/m.}-,,,,,w g ZPIC> ; 9 8 76 54321"0'/,.2-8,@+I*R)](k'z&%%%%%r bVLD>9631 0 0 / .,+*)#()'/&5%=$F#P"\!i ym^RH@:51.,** ) ( ' %$# " &! , 3 ; D O [ i y      iZNE=71-*(&$## "     # * 2:DP\j{eWKB:4/*'$"   !(09CNZiy    bTI?71,($! &-6ALW e u    _QF=5/*%"  # * 3 < G S aq\NC:3,'#      '/9CP^nXKA80*%!   !!!$","5"@#M#Z#k#~#""!!UH> 5 . ( #   " $ % %&&&!')'2'='I(W(g'{''&&%Q E!;"2","&!"!   "# % &( ) +,,,,&-/-9-F-T-d-w,,++*M"A$8$0$)$$#!"""#$& ( *,. / 02333"3+363B3P3`3s22100I%>&4'-'(&#%$%&(* , .0245 7 8::::':2:>:L:\:o98876D):)1)+)&("'()+. 0 2579;<> ? ACCC#C.C9CGBWBjA@?>>?,6,/,*+%*+-/2 58:<?ACEFH JLMMM(M4LBLQKdK{JIHG;03/-/(-"/147 :=@CFHJLNOQS UXYX"X.W<WKV^VsUTRR8312,1%258< @DGJMPSUWYZ\^a dfgf'f4eDdWdkba`^5705(7 :=B FJOSVY\_adegilnq tww v-v=uOtcs{rpo5:+;"?CH MRW\`dhknqsuwz| $3E[r/@%DIN TZafkoty} );Pg)INT[bipw} 0E\t"T[bjs{ &:Qhˁʖ %.6>DJOTY^cipx  (07>DINSW]biqz "*18=CHLQV\bir}zx $+17<AFKPU[bk~u|zxwvurnl %~+|1z6y;w@vDuIsOrUp\odmnlzjhgfeda`}wspoooom%k*i0h4g9f>eCcHbNaU_^^g\s[YXWWWVTulhda` ____]%\*[/Y3X8W=VCUISPRXQaPmN{MLKJJJJrg_ZWUSR RRRQO$N)M.L3K8J=ICHJFRE\DgCuBA@@?@@tg]UOLJHG G FFFED$C)B-A3?8>>=E<N;W:b9o8766666|k^TMGCA?>= =<<<:9$8)7.635:4A3I2S1^0k/{.----.sdWMF@;87654 44321 0$/)./-6,=+E*O)Z(g'w&&%%%&m^ R H @ : 6 2 0..- , ,+*)( '%&+%2$9#B"K"W!d sh Y M C<61 - * ( ' && %$$"!!" (.6?ITapc UI@82-)&# "    %+3<FR_n_QF<5/*&"          " ) 1 : E Q _ n  \NC:2,'#        ( 0; F Q ^ m   XK@70)%!      % - 6 A MZj|UI>5-'"       "*3>JXgzRF;2+%!   '0;GUdwOC90)#    $-8DRbuL@6-&!      !!"!*!5"A"O"_"r!! H=3+$   !" $ &&&''''2'>'K'\'n&&%$#D90(#  !"$&(* + ----$...:.H-X-j-,+*)@ 6!-!&!! ! " $&(+-/0 2 4555 5*565C5S4f4|3210<#2$*$$# "!!#% ' )+.02468: < >>>>&>1>?=N=a@BD F IIH!H,G:GIF[EqDCBA4*,*'("'(*- 0 369<>ACFHJLNP STTS'S4SCRUQjPOML0-+,&+,.2 59=@CFILNQSUWY\_ bccb,a<`N_b^{\[Y/0*/"037;?DHLORUX[]`bdfimp tts%r4rEpYoqmkj.3%58<AGLQUY]aehkmortwz~ +=Rg~): =BHNTZ`dinrvz} !3G^w#CHN U\cjqv{ (<RjNT \dlt|1H_vȎ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗  9` ˻0ƸOg{ĵ˲ѯխ٫ܩާख़㡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘  9` ˼.ŹMfzŵ˱Ѯլ٪ܧޥ࢚➙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙  9` ˾,ŹLg{Ŵ̰ѭի٨ۥݣߟᛙ⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙  9 ` ˿+ĺLg{Ŵ̰Ѭթئۣݠޝᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚ  8 _ )¹Mh{Ƴ̯Ѫէؤڡܞݚޕ  8 _ )Ni|Ʋ̭ѩԥעٟڛܗݓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓ  7 ^ ǿ+Pj|ư̫Чԣ֟؜٘ڔܐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐ  7 ^ ľ-Qj|Ʈ̩ХӠ՝ّ֙ؕڎێێێێێێێێێێێێێێێێ  6 _ 0Sl}Ǭ˧ϢўӚՖ֓׏؋ًًًًًًًًًًًًًًًً  5 b 3Um}ƪˤΟЛҗӓԐՌ։׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉  7 e 8Xn}Ƨɡ̜ΗϓѐҍӊӇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇ  : h>[o}ģǝʘ˓͐΍ϊχЅхххххххххххххххх  > mD^p}ßřǔɐʍˊˈ̅̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓  B rI`p}ÕđƍNJLjȆȄɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂ H xGbq|ÊĈĆńŃŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁſ% N p9Xlz€€€€€€€€€€€€€€€€€1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ0 S'|̨Dƥ]¤pùǷʵγбӰկ׭٭ګګګګګګګګګګګګګګګ0S&|˩CƦ\¤o~ùȶ̳ϱҰծ׭٬ܫݧۧۧۧۧۧۧۧۧۧۧۧۧۧۧ0S%|˩BƧ[¥n~ĸɵͲѰԮ׭ګܩߨߣܣܣܣܣܣܣܣܣܣܣܣܣܣܣ0S$|˩AƧZ¥m}ķɴαӯ֭ګܩߧ⤑ࠎܠܠܠܠܠܠܠܠܠܠܠܠܠܠ0S#|˪AƨY¦m}ŷʳϰԮثܩߧ⥗栖ݜݜݜݜݜݜݜݜݜݜݜݜݜݜ 0S"|ʪ@ƨX¦l|Ŷ˳аխڪݧच⟘㝚ᙗݙݙݙݙݙݙݙݙݙݙݙݙݙݙ 0S!|ʫ?ƩW§k{Ŷ˲ѯ֫ڧݤߠ◚ᗜޗޗޗޗޗޗޗޗޗޗޗޗޗޗ /R |ʫ>ƪV¨kyŶ̲Ѭ֨٤ܡݜޗޒޒޒޒޒޒޒޒޒޒޒޒޒޒ /R|ʬ<ƫU¨jwŵ̯Ҫ֥ءڝۙݔސގݎݎݎݎݎݎݎݎݎݎݎݎݎݎ /R|˭:ƬT©is~Ų̬ѧբמؚږۑ܍܋܋܋܋܋܋܋܋܋܋܋܋܋܋܋ /R|˯8ƭR«fo~ưͪѤӟ՛ًُ֗ؓڈڈڈڈڈڈڈڈڈڈڈڈڈڈڈ .Q|˰5ǯOð`l~ǭ̧ϡҜӘԔՐ֍׉؇؇؇؇؇؇؇؇؇؇؇؇؇؇؇ .Q|̳0DZLĸVnǩˣΞϙѕґӎԋԈՅՅՅՅՅՅՅՅՅՅՅՅՅՅՅ  -P|̶*ȷDYpªǦʠ͖̚ΒϏЌщч҅҅҅҅҅҅҅҅҅҅҅҅҅҅҅  ,O{ͼ"¼<^r¦Ţǜɗʓː͈̍͋Ά΄ττττττττττττττ  + N zFbtÞřǔȐɎʋˉˇ̅̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃  ) L ~%OfuÖőƎNjljȇɆɄɂʂʂʂʂʂʂʂʂʂʂʂʂʂʂ ( R -WhuÌĊňņƄƃƁǁǁǁǁǁǁǁǁǁǁǁǁǁǁ - Y +Pgu~ˆ†…ÃÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ 4 [v%E]ny~~~~~~~~~~~~~~~:Uh-x@Vgs~x{|ywÂu„t…srrqqqqqqqqqqqqqqq'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~')F5iިAǜaĜq›~ĹǷʵ̴γвұӱԮԬҬҬҬҬҬҬҬҬҬҬҬҬ'(F4jݨ@ǝ`Ĝqœ|ºŸɶ̴ϲѱӰկ֯תէӧӧӧӧӧӧӧӧӧӧӧӧ'(F3jݩ?ǝ`ĝpž{¹Ƿʵγѱӯ֮ح٪٥դԤԤԤԤԤԤԤԤԤԤԤԤ''F2jݩ>Ǟ_ĝoyøȶ̳бӯ֮ج۫ܦڢ֠ԠԠԠԠԠԠԠԠԠԠԠԠ&&F1jݪ=Ǟ^ĝoxĸɵͲѰծج۪ިߢڞ֜ԜԜԜԜԜԜԜԜԜԜԜԜ&&F0jݪ<Ǟ]ĞnvķʴϱӮ׬۪ި⤐ۚיՙՙՙՙՙՙՙՙՙՙՙՙ&%F0jܫ;ǟ]ğlt~ŷʳаխ٪ި⥗柕ۗזՖՖՖՖՖՖՖՖՖՖՖՖ&%F/jܫ:ǟ\Ġjs|Ŷ˳ѯ֬ۨߤ៙㜚ᗖܔؓ֓֓֓֓֓֓֓֓֓֓֓֓ &$F.jܫ:Ǡ\ġhqzŶ̲Ѯשۤޠᖛᕛݒؑבבבבבבבבבבבב &#F-jܬ9Ǡ[ģfnxŶ̰Ҫצڡܛޖߑߑݏُ׏׏׏׏׏׏׏׏׏׏׏׏ &"E,jܭ7ǡZťc©kuų̭ҧ֢؝ژےݎ݌܍ٌ׌׌׌׌׌׌׌׌׌׌׌׌ %"E+jۭ6ǢYŧ_­fp~ưͪѤԞُ֙ؔڋۈۈ؈׈׈׈׈׈׈׈׈׈׈׈׈ % E*jۯ4ȤUƫXó_n~Ǭ̦РқԖՑ֍׉؆؄ׄքքքքքքքքքքքք %E'j۰1ȨMDzNXpǩˢΝЗђҎӋԈՄՂՁՁՁՁՁՁՁՁՁՁՁՁՁ $D%jڲ.ʯ@Ƚ=]r©ƥɟ˙͔ΐόЉц҄ҁҀҀҀҀҀҀҀҀҀҀҀҀҀ $D!jڴ)ͼ(CasšǛɖʑˎ͈̋Ά΃΁πππππππππππππ #Ci#LeuÝŗƓǏȌɉʇʅʃˁˀˀˀˀˀˀˀˀˀˀˀˀˀ "Bh /Thv”ÐčŊƈƇƅǃǁǀǀǀǀǀǀǀǀǀǀǀǀǀ @ _ 4Zkw‰ˆÆÅÃĂāāāāāāāāāāāāā  = c3Sgt}€€€€€€€€€€€€€  Aax2L_nx|}|{zyxxxxxxxxxxxxxx " BZ(j9wI[i|qyvvzt}rqȁpǃoDžnƆmƈlŊlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋ &=N/[?gNq{[yveqlnrkwizg~fՀeԂdԄcӆbӉaҋaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ "0:=YJy؛[Ǖrŗ{ØúŹǸɷʶ˶~̵}̳|ͯ|˯|˯|˯|˯|˯|˯|˯|˯|˯|˯|˯| !/:}֨DɨOǰSŸYm}Ƭ˥ϟјӒՌ׈ׅ׃քԄффффффффффф%91Z<~׬;ʭDɹEYo~ƨʡ͛ϕЏҊӆԃԁԀӀррррррррррр$9/Z9~ٴ/̸2½@]q~Ťȝʗ̒΍ωЅЂр~}}}}}}}}}}}}"9-Z0z!Hbs~àƙȔɏʋˈ̅͂̀~||||||||||||8)Z$t*Oet›ÖőƍNJȇɅɂʀ~|||||||||||| 7%Zh 2VhuÌĉņńƃƁ}}}}}}}}}}}}6P f6Vjv~†„ƒÁÀ~~~~~~~~~~~~ 4 Eh7Ser{~}||||||||||||  ' Ie%x9O`mux}{z}yĀwÁvƒu„tsrqqqqqqqqqqqq  ,H\1kBvP~~_{iwntsqwpzn}mĺk̓j̅i̇hˉgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌ -A(P9\Hf|Tnw^uqezmk~jphufxe{c~bځaك`م`؇^؊^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍ (7.C=N|KWwV_o]ehbjdinaoq_ss]wu\{v[~wZxYyXzXzW{V|V|V|V|V|V|V|V|V|V|V|V|'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'5/DJQe^~۔mϒwŒēÒ¼~¼}û{Ļzĺyĵyõyõyõyõyõyõyõyõyõyõy&4/CJPe]ڕi͔tŔ~ĕ•ûĺ~ź}ƺ{ƹzƵzƱzızızızızızızızızızız%4/BJOf\ږf̕qŕ|Ė—úŹƹǸ}ȸ|ɵzɰ{Ǭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{$3/AJOf[٘c̖oŖy׺ŹǸɷʶ}˶|˰{ʬ|Ȩ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}$2/AKNgYٙa˗mŗwÙĹǸɶ˵ʹ~α|ά}˨}ɥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~#2/@KMgWٚ^˘jřtÚ}ºŸȶ˴γвѬ~Ϩ~̤ɡơơơơơơơơơơ#1/?KMgUٜ\ʙhŚrÜzùǷ˴βѱӬӧФ͠ʞƞƞƞƞƞƞƞƞƞƞ"1/?KLgSٝYʛeŜoÝxĸɵͲѰծקԣџ͜ʚǚǚǚǚǚǚǚǚǚǚ"0/>KKhQٟVʜbŝlßu~Ʒ˳ϰԭ٨ڢ՞ћΙʗǗǗǗǗǗǗǗǗǗǗ"0/>KKhO٠Sʞ_Ɵiár|ǵͲҮتߢܜ֙җΕʔǔǔǔǔǔǔǔǔǔǔ!//=KJhM٢Pˠ\ơeänx¸ȴΰիݥ曑ݖהӒϑːȐȐȐȐȐȐȐȐȐȐ!//PUQhS{WԞ_ʛkśuÛ~ŷʴϲҨϣˠǝś™%4%C>NUNhPzRա[˞fƝqÞz¹ǵΰԩ֡Н˚șŗ–%4%B>LULgMyNդV̡aơlâv÷ʲҬؚ۠ї̕ȔœÒ$3%B>JTJfJxK֨Qͦ[ǥeħpzö˯֥族ړґ͐ɐƏÏ$3%A>HTGfGwG٭KϬTȬ^Ưh±s}˥Քޏڍӌ΋ʋNjČ$2%A>FSDdCuB۴DҵJ˷Sʾ_n|©˜ҍ؆هӇχˇȈňˆˆˆˆˆˆˆˆˆ#2%@>CRAc?s=޾;?J]o}ãɖΊӁՁ҂ς̃ɄƅÅÅÅÅÅÅÅÅÅ#1%?>@Q>;O7]3j1u)8Ocsďȇʀ|zyz|}}}}}}}}}}!.%<>6L0Y,b'm&jNCdTH^YL[_OXdRUiTSmURqWPtXOxYN{ZM[L\K]I^H_H_H_H_H_H_H_H_H_H_$y3"p;*hB1aJ6\Q;WW?S]BPbDNgFLlHJpIItJHwKF{LEMDNCNBOAPAPAPAPAPAPAPAPAPAP' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K0YCcTidprz~≂܅؂}{ywvtsrqqsttttttttt' ;K0YD`UfdmswጀۈՅ҂}{ywvutsuuvvvvvvvvv' ;K0YD^Udejts}ًԈЅ͂}{yxvuvwwxxxxxxxxx' ;J0XD\Uaegtpߏz؍ҋ·˄ȁ}{ywvxxxyyyyyyyyy' ;J1UDYU^edtlޑv؏э͊ɇƄā~{ywxxyyzzzzzzzzz& ;I1SDWU[eathޓr֑{ЏˍNJĆÃ{ywxyyz{{{{{{{{{& :I1QDTTXd]tcޖm֓wБʏƍɄ{yxyz{{|||||||||& 9H1ODRTUcZs_ޙi֖rϓ|ʑŐË{yz{{|}}}}}}}}}}& 9G1MCOSRcVr[ߝdךmЗwʔŒŽ{ijzī{¦|}~& 8G1KBMRPbSqW^؞gЛqʘ{ŕ’ŷ|ɫ|Ǥ}à~& 8F2IBJQM`PoT}Xڤbҡk˝uƚ˜¶ˬ}΢ɝĚ& 7F2GAHPJ_LmP{Tܫ\ԩeΦoȣzßİΠљʖŔ& 7E2E@FOG]IkLxOߴUٵ_ӵiεv|ġΔҐˏƎŽ& 6D1C?CND[EhHtL~Q[kƽqxÔ͉҇̈ljÉ& 6B1@>@L@YAdDoIwR|bhnvπ̂ǃĄ& 5?0==hOCbUG]ZKY`MVePSjQQnSOrTNvUL{VKWIXHYGZF[E\E\E\E\E\E\E\E\E\ ~)u5#l<*dC/^J4XP7TV:Q[Kd@JhAHlBFpCEtDDxEB}FAG@H?I=J=J=J=J=J=J=J=J=J| q$g,_5Y=!TE&OK)LR,HW/F]0Da2Bf3@j5?n6=s7KKPXUdZpa{iޚsו~Ўʅ}xy{}~ 4B$C0E=HILUQaWl]wcm֞y˕~|~ 4A#A/B;EGISN^ShZra{ۯn̦v~ 4?"?.@:BEFPKZRcYk߽drѶlĬsz4=!<-=8@BDLIUQ\Zaboɼipw4; 9+:5=?BGHNQR[Y`mgmt}x|386)82:;?AGETEWX^kd~krzvorwz}~353'4/65=8H8MEVV\ib{howxnhiosvxz{{{{{{{{300#/)2-;,@:HLN\Vl]zem}vsălgefknqstttttttt1-*)"-!3,XFeOpXzzdsmmvhdЈ`ϒ^Ν\ͩ[ιYȚZʜ\ɝ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ  "'-96J?XHcRmz\urd{mmhud~`؆]֏Z՘XԢWԮVԼV͐VђWѓWѓWѓWѓWѓWѓWѓWѓ   #*.;8IBUL_zVgs^mkdrflwbtz_|}\ZߋWޓUݜTܥRܯRܻQ̅RڅRڅRڅRڅRڅRڅRڅRڅ  $*09:EFOzQXrX^k^ceeh`lk]rnZypWrUtSvQwPxNyMzMzLzLzLzLzLzLzLzLzظ '(35??yJGpQNiWSb]W^d[Zj^Wp`TvbR|dPeNgLhKiJjIkHlGlGlGlGlGlGlGlGlݯż *#~6-vA6mHk2CE@K=P;U9Y7^!5b"4g#2l$1r%/w&.}'-(+)+)+)+)+)+)+)+)+)vs r1 qCqP&uY3ub?sjIptSn~[kaiggkencqbsau`v^w^x]y\z[z]z^y`y`y`y`y`y`y`y`yvs r1 qCqP&uY3ub?sjIptSn~[kaiggkencqbsau`v^w^x]y\z[z]z^y`y`y`y`y`y`y`y`yvst1 rBtO'xX3y`?wiJsqTq|\nckiimgqetdvbxay`{_|^}]}]}_}`|b}b}b}b}b}b}b}b}wtu1 sBwM'{V4|_@zgKwoUsz^qenkkpisgweyd{b}a~`_ŀ^Ё_ڀaހb߀c߁d߁d߁d߁d߁d߁d߁d߁xuv1 tBzL'U4]@~eLznVvw_tfpmmrkviyg|e~cba`DŽ_ӄaڄc݃d܄e܄e܄e܄e܄e܄e܄e܄e܄yvw0 vB~K'S4\@dLlVzt`whsoptmyk|hfecbaɇaՇdڇeڈfوgوgوgوgوgوgوgوgوzxy0 xAI'R3Z@bLiW~qa{{iwqswp|mjhfdcb΋d֋f֋g֌h֌i֌i֌i֌i֌i֌i֌i֌i֌{yz0 |?H&P3X@_LgWnaxj{rwys~oljgedďdҏgӏhӐjӐkӐlӐlӏlӏlӏlӏlӏlӏlӏ|z{0 >F&N2V?]KdVkask~s{zvrnkhfeʓhѓjДkДlДmДnѓnѓnѓnѓnѓnѓnѓnѓ}{|/ <E%M1S>YJ`Uh`pjyt|zuqmiggΗk͘l͘n͘o͘pΗqΖqϖqϖqϖqϖqϖqϖqϖ~|~/ ;C$K0P(B2G;MDTM[UܰeaΨlqßt|§åţƢȟȟȟȟȟȟȟȟ- 49<&@/E8K?SF\MӶb`ƭipqy¨æŤƢȠȟȟȟȟȟȟȟ+ 279$=,B3I9R>XL̺`_gon~v~~¨æŤƢȠȟȟȟȟȟȟȟ* 146!:(@-H1Q7VK^]enl}s{ytwz§|å}ţ~ơȟȟȟȟȟȟȟȟ( 1236"=&G&L5TI\[cljzqywpln§ræuĤwƢxǡzȟzɞzɞzɞzɞzɞzɞzɞ& /./2:DJ3RGZYaigxnvyohdeŤjţmƢpǡrȟtɝuʝuʝuʝuʝuʝuʝuʝ$ + )),7AI0QDXV_fetl|tqib^]ɞbȟfȟiɞkʝn˛n˛n˛n˛n˛n˛n˛n˛#' " $ 0=$F4NDVR]acokztsk~bȌ\ȜYȱWΖ[͘^̙a̙d͙g͘g͗g͗g͗g͗g͗g͗g͗!  .:)C9JHPVWb_lvhulr}c~\،W؝TװT͌UӏWґZѓ\ѓ_ѓ`ѓ`ѓ`ѓ`ѓ`ѓ`ѓ`ѓ  ,7.@=HJOVV`v^ilepdpw^||YVޗSݦQܸQԄSڇT؉V׊X֋Y֋Y֋Y֋Y֋Y֋Y֋Y֋ ٿ ,!70@>HJPTwW]m]defj_pnZzrVvSyQ{O|M|M|P|QRށSށSށSށSށSށSށSށ ۷ ,#71A=IGxQPnWWe^\`fa[oeVxhSkPmNoLqJrIrHrKrNsNtNtNtNtNtNtNt ެ˺!.#9/B9wJBmPIeVN_^SZeVUmZRu\O~_LaJbHdFeEfDgCgEgFgFgFgFgFgFgFgʹ $0 ~;*tB2kH9cN?]UCX]GSdJPkMMrOJyQGSETCVAW@X?Y>Z>Z=Z=Z=Z=Z=Z=Z=Zҭ &|1q8"h>)`E/ZL3TS7PZ:L`Fm@DtBA{C?E=F;G:I9J8J7K7K7K7K7K7K7K7K w# m*d1\8U@"PH&LO)HU+D[-Ba/?g1=m2;s39z5765738291:0;0;0;0;0;0;0;0;| of^! V)P2K:FABH?N5D2I0N.S,X*])c'i%o$w"~!hd#_/^@cKgT%h]/fg9drAb}H`N]R[VZYX[W]V_U`TaTbScRcRcScTcVbWcWcWcWcWcWcWcie#`._@fIjS%k\0ie:gpBd{IbO_T]X[[Z]X_WaVbUdUeTeSfSfUfVeXeYfYfYfYfYfYfYfjf"a.`?iHmQ&n[0ld:inCgyKdQaV_Z]][`ZbYdXeWgVhUhTiUiWhYhZi[i[i[i[i[i[i[ijg"b.c>lFqP&rY1pb;lkDivLgRdXa\_`]b[eZgYhXiWjVkUlWlYk[k\l]l]l]l]l]l]l]lkh!c-g<pEtN&vW1t`;piEmsMj~TfZc^ab_e]h\jZlYmXnWoWoYo\n]o^p_p_p_p_p_p_p_pli!e-k:tCyL&zU1y]\IdSk]vfoxwr~mjhhЌkՍmՍo֌p֋q؊qىrڇrڇrڇrڇrڇrڇrڇspu&, 6@F'L1R;YE`OhYߎscՆ}nxxsomlȑnґpӐrԏsՍt֌t؊uىuىuىuىuىuىuىtqx$+ 5>C$I.P7VA]JߝgTԕobˍxnÅyyurqsДtђvґwӏwՍw֌x؊x؊x؊x؊x؊x؊x؊ur{#) 4<A"F*M3T<[DףcS̚lb“un~y{xvwϖyДzђzӐzԏzՍz׋z׋z׋z׋z׋z׋z׋us}!) 49>D&J.R5ܯYAϨaRŠiarnzy~|}͗~ϕ~Г~ґ~ӏ}Ս}֋}֋}֋}֋}֋}֋}֋vt ( 37;A"H(P.ԴV@ɭ_Qg`omwx˘ΖДҒӐԎ֌֌֌֌֌֌֌wt'2 48=F!ܿL,ιT?ñ]Pe_lltw|}zǘ|Ζ}Д~ҒӐԎ֌֌֌֌֌֌֌xu&/ 04:DH+ȽS=[Nc]jjqvzytqØsϖvДxґyӐzՎ{֌{֌{֌{֌{֌{֌{֌xv%+ , /6<G)Q;YLa[hhotw~yqlikДnђqґsԏuՍv֋v֋v֋v֋v֋v֋v֋yx#&%(07E'O9WJ_Xfemqu{z~qjebcґgӐjԏmՍn֌p؊p؊p؊p؊p؊p؊p؊{|! $5C$M6UG]Udbkm{svr|~jc^[[Ս_Սc֌f׋h؊jوjوjوjوjوjوjو|%6A!K3SCZQb]~igtqpk{xd~]XVUۆXڇ\ڇ_ڇaۆcۅcۅcۅcۅcۅcۅcۅ~ھ %5@!I/R>YK`Wvhampiezp^̆uX̕yȚ{Qͼ|P|SU߀XށZށ\߁\߁\߁\߁\߁\߁\߁ ۵ % 3>%G2N?UIv]Smf[eoa^zgX܆kSܕoPݦqM޻rMqNtPwRxSyUzUzUzUzUzUzUz ݫ͸ % 3='F3N>vUGl[NdcU]mZXw^SbNeJgGiFiHiKjLmNoOpOpOpOpOpOpOp б '4>'G2vN;lTBdZH]bMWkQRuUMXHZE\B^A_@`C`G_HaIcIcIcIcIcIcIcԩµ )5~@%tF-kL5cR:\Y?V`CPhGLqJG{LCN@P>R=T;U;UA;C9E8F6G5H5I4I7I7I7I7I7I7I7Iɫ~u' l/d7\>VE"PK%KR(FX+A_->g/;o18x364361708/:.;.;-<-<-<-<-<-<-<yne^' W0Q7K>FEAL=R9X6_!4f"1n$/w%-&+())(*'+&,&-&-&-&-&-&-&-}ui _WPI&D. ?6 ;= 7C3I0O.U,[*b'i%r#{!|peZQ IC=8&4-03-9*>'C%I #N !T Z a i r |  \W&Q2N<WE[N\X"[c+Yo2Wz8T=RAPEOGNIMKLLKMJNIOIPHPHPIPKPMOOPOPOPOPOPOPOP\X&R2Q:ZC_M_W#^a+\m3Yy:W?TCRGPIOKNMMOLPKQKRJRISJSKSMRORPSQSQSQSQSQSQS]Y&S1T9]BbKbU#`_,_k4\w;Y@VETHRKQNPOOQNRMSLTKUKULUMUPTQURVSVSVSVSVSVSV^Z%T1X7a@eIfS#d]-bh5_t<\BYGVKTNSPQRPTOUNVMWMXLXNXPXSXTYUYUYUYUYUYUYUY_[%U0\4e=jGkQ$iZ-fd6cp=_|C\IYMWPUSSURWQYPZO[N[O\Q[T[U\V]X]X]X]X]X]X]X]`\$V/`2j;oDpN#oW-ka6gl>cxE`K\OZSWVVYT[S\Q^P_P_R_U_W`XaYb[b[b[b[b[b[b[ba]#Z-e/o8tAvK#uT-q]6lg?hsFdL`R]VZYX\V_T`SbRcScUcXdZe\f]f^f^f^f^f^f^f^fb^#^*i-t5z>|H"{Q,xZ6sc?mmGizNdT`X]\Z`XbVeUfTgVgZg\i]j_j`jajajajajajajajc`"b'n*y2<F!O+X5{`>uiGotNjUf[b__c\fZiYjXkZk]m_naobocndndmdmdmdmdmdmda"f%r'~0 ;EM)U3^=}fFvpNr|Um\hbdfaj_m]o]p^p`rbsdsesfrgqgpgpgpgpgpgpeb!i#w%/ 9CL&S0[:cDlMywUt]nciifncqatauavdwfwhwivjujsksksksksksksfc!m {#. 8AJ#Q-Y7`AiJ߁tSz~]teolkqhufxeze{h{j{kzlxmwmvnunununununugd p~", 7@H N)U3]<ݏfGӈoSˁy^{funqtnxk|j~jl~m}o|pzpypwqwqwqwqwqwqwhd s +5>DK%R-ߝZ7ӕcFʎlSÇu^~g{owuszp~ooʂpށq߀r~s|szsysxsxsxsxsxsxifv*4 ;AH O'آV6̚`EÓiRr^zgo}vy|vttńu݃vށvw}w{vzvyvyvyvyvyvyiix(2 7=DݭK$ЦT5Ɵ^DfRo]wgow~}{zyz܄z݂z߀z~z|yzyyyyyyyyyyyyjk{&03 9AֱG#ʫR4\CdQl\tf}ov}ۅ݃ށ~}}}{|z|z|z|z|z|zkm~$,/4 ݺ:еF!ůQ2ZBbOj[reznv||ywׅx݃zށz{}|{|z|z|z|z|z|zkp"&)/ֿ6ʺD O1X@`NgZodwmu{ztqoхq݃s߁u~v}w{wzwzwzwzwzwzls !&4 ľBM/V>^LeWmbuk~ryyr~mig̓iނl߀o~p|rzryryryryryrymv2 @K,T<\IcUk_rhy{orvk{fb`ʀbe~h|j{lymxmxmxmxmxmxn{ڻ / =I)R8ZFaQh[zpdrykkqdv_z[|Y|Z{^{azcyfwfwfwfwfwfwfwp ٳ Ͼ ,;F&P5XA_M|gVso^kwedk^pYsUuTuSvWvZv\u_t`t`t`t`t`t`tr ٩ε )7D!M0U<}]GtePlmWev^^ācYÎhTÝkQîlOmNmPoSpUpXpYpYpYpYpYpYpwޠϮĹ )7BL)T5u\?mdHelO_vTYҁYTю]Pѝ`MҰbKbJbKfMhOiQiRiRiRiRiRiRi ҦIJ * 7B}J)tQ3kY:daA^kGXuKSOOSKUIWGWFWFYG\I^J`K`K`K`K`K`K`ٞǬ , 9|AsI'jP/bW5\_:Vh?RqBM|FIIFKCM@N?O>NBOCQDSETETETETETET˦ . y7p?hF"`M(ZT-T\1Oe5Km8Gw;C=??D>F>F>F>F>F>FП{t* l3d;]CWJ QQ$LX'H`*Dh,@q.<{192543617/8.9-919393939393939}vme$^- X6R=LEHLCS?Z>>>=>=?>>@>C=D>F?F?F?F?F?F?P K*E5J8M=QHRRQ^Oj%Mw+J/H3F6D8C:B@?@@?@?@>A@@B@E@FAHAHAHAHAHAHAQL)G4M6Q;UFVPU\Rh&Pt,M1J5H8F;EC?CABAABAC@C@CCCFBHCIDJEJEJEJEJEJERM)J2P3U9YCZMYX Vd'Sq-P}3M7K:I=G?FAEBDDDECEBFBFCFFFIFKGLHMHMHMHMHMHMHSN(N/T0Z6^@`J^U [`(Xm/Ty4Q9N=L@JBIDHFGGFHEIDJEJGJJIMKNLOLQLQLQLQLQLQLTP'R,Y-_2d<fGdR a\(]h0Zu6V;R?OCMELHJIIKHLHMHMHNKMNOPPRPSQTQTQTQTQTQTQUQ'V)^*d/j:lElO hY(dc0`p7\|=XBUFSIQKOMNOMPMQLQMQPRRTTUVUWUXUXUXUXUXUXUWR&Z&b&j,q7sBsLpV(k`0fk8cw>_D[HXLVOUQSSRTQUQURVTXVYXZZZ[Y\Y\Y\Y\Y\Y\YXS%^#g#p*w5 z@zJxS&s\/nf7ir?e~EaJ^N\RYUXWWXVYVYV[X]Z^\^]^^]_\_\_\_\_\_\YV#b l u(}3 =GP${Y-vb6qm>lyEhKdQaU^Y\[[^Z_Z`Za\b^b`baabac_c_c_c_c_c_ZY!fpz&1 ;DM!V+~^4yi=ttEoLjSfXc]a`_c^d^e_f`fbfdeedecfbfbfbfbfbfb[\iu~$.8BJR'[0݁f:zpEuzNpUl[i`fddgcibjcjdjfighhgifidididididid[_ly!,6 ?GO"܎X-҇b:ʁlE{uNvVr]nbkfijglgngnimjlkjlilglflflflflflf\bp|)3 <DߚKӔU,ʍ_9‡iEqO|{Wx^tcqhnllolplqmonnolojoiogogogogogog]dr&08 ?؟G͙R+Ē]9fDnNwW}^ydvismqqqrqsrqsosmsksjrhrhrhrhrhrh^gu#,3ݨ9 ѣEǝP*Z8cDlNtW|^d|jynwrvtvtwrwpwnvlvjvivivivivivi^ix',֬4 ˧CN)X6aCiMqVy^djo}r|t}|u|}s||q|{o}zm}yk}yi}yi}yi}yi}yi}yi_k{ ݰ$а2 ƬAL'V5_AgLoUw]din|rwtuutsuqvow~mx}kx|ix|ix|ix|ix|ix|i`n~ֶ˴0?K%T3]@eJlSt[}bhymtqptmtmsoqpormsktitititititiaq ٵ ϹŸ.=I#R1[>cHjQrYz`xfrlmoirfserhpjnllmkninininininicu ܢԭ ϸ ɽ+;G!P/Y;aFhOpWxx^rdkifmbo_p^o`ncmfkgjihihihihihihgy ߚӦ̱ǻ(8DN,W8^BfKxmSqvZk`ed`h[kYlXkYk\j_iahcfcfcfcfcfcfk~ ̪֞Ĵ$5 BL(T3\>ydFqkNktTd~Z__ZbVeSfReRfUfXfZe\d\d\d\d\d\dp ݖΣĮ 1 >I#R.zZ8rb@kjGdsM^|SYWT[P]N^M]K_N`Q`S`U`U`U`U`U`U`wӛƨ ,:FzO'rX1j`8dh?^rEX|ITɈMOɕQLɥSJɹTISGUHXJYLZNZNZNZNZNZNZܓʢ ,9yCqM jV(c_/]g5Xq:S{>OوBKٖEH٦GFںHEGDIBMDOEPGRGRGRGRGRGRϛ~-v8nAfJ_R#Y[)Ud-Pm1Lx5I8F:C<@>?>>>=?=B?D@F@F@F@F@F@F֓ģyq+j6 c?]GWORW!M`$Ii(Fs*B~-?/<1:38465655476989898989898Ȟyskd'^1X; SCMKISEZAc>l;v!7#4%2'0(.)-*,*,*/*/*/*/*/*/*um e^W#R,L4H< CD ?L94%0,,2(8%>"DJQYcn|  rdTKD=7 1,($" ',16<BI Q Z fsD$?.<6@8A=AEAQ @]?j4B6D;DCEO D[Ah?u4@4A4A4A4A4A4G"A,E/I0L5M=NHMTKaHn E{%B(?+>.=/<1<2;3:4:5:5:5:5:5>5A7B8D8E8E8E8E8E8H"C,H,N-Q1S9UESQQ]Nj!Kw&H+E.D0B3A4A6@7?8?8?9?9?9@8C:EH@JAKAMAMAMAMAMAMAJ H'Q%X%]*`3c?bJ`U\a#Ym)Uy.R3P6N9L;K=J?J@I@IAJAJBJDLEOFPFQFQFQFQFQFQFL L$U!]!c'g1j< jGgRc\#_h*\t0Y5V9TeDbI`M^P]S[U[V[V\W]W^V`U`TaSaSaSaSaSaSPZepx$.8 BKW#yb/tl8ov@lFhKfPcSaV`Y_Z_[`[aZcYdXdWeUeUeUeUeUeUP]it}!*4= ܋HхT#^.zh8uq@qzGnMkRhVfYe\d^d^d^f]g\hZhYhWhVhVhVhVhVR_lx%/ޕ8 ӐEʋQ"…[.e8{nAwwHtNpSnWk[j^i`hai`j_k]k\lZlXkXkXkXkXkXTbo{(ؙ3̕BĐN!Y-b7k@|sHy|NvTsXq\o`nbmcnboao_o]o[oYoXoXoXoXoXVdr~ݞ ў1ǚ@L V,`7h@pH~yN{TxYv]tascrdsdtbt`s^~s\~rZ~rY~rY~rY~rY~rYXgu֣ˡ/ž>JT+]6f?nGvNT~Y{]ya}xdzxeyxexybyx`yw^yv\yuZyuZyuZyuZyuZyuZZix ݚ ٢ Цƥ,<HR)[4c>kFsM|SX]zav~ds}eq~eq~cr}`s{^tz\ty[uyZuyZuyZuyZuyZ]l { ܓ՝ ѥ ʪ*:FP(Y3a]xCXGTKPNMPKPKPJQLRNRPRQQQQQQQQQQv݉ʗ%4 |@uJmS#g\*ad0\m6Wv:S?OBKEHFGFGFDIEJGKILJLJLJLJLJLѐž y.r< lGeP_Y!Zb'Uk,Qu0Mρ4Iώ7Fϝ9DЮ;B;C:@>>@@BACBDBDBDBDBD݈ǘx tn+h7aB\MWVS_Oi"Ks%G~(D+B-?/>/>/<19496:8;9;9;9;9;9͒~tnhb*]5W? RHMQJZFcCm@x=!:#8$6&5&4&4&2(2+3,3,3,3,3,}qgb\W'R1M:HB DK AT>\;e8o5{20.,+********{oc[UPK#F,B4><:C7K4S1[ .d +o (| &$"! {n`TNIC?:%6,23/:+A(H%O"W `ly         |m_QGA< 72.*#&)"/5;BIQZf t   }m_PB:5/* &"#(-3 9 AIS^l|9'3254868;6C3N1[ /h -v+))((('''''''''(+-/////:'4181;4;9:A7K5X 3e1s/--,,++++* * * * + +,/!1"3"3"3"3"3";&50;/>1?6>=k;x977 6!5"5#4$4%4%4&4&4&5%5&6(8):)<*<*<*<*<*=%=*C(G)I-J6JAIM GZEgBt@> ="<$;&;':(:(:):):):);):+;-=.?.A.A.A.A.A.>%A&H$L%O)R3Q>QI OVLbJoG{ E#C%B'A)A*@+@,?-?-@-@-@/?1A2C3D3F3F3F3F3F3@$E#L R!V&Y/Y:YF VQT]QjNu!L%J(I+G,G.F/E0E1E1F1F2E5D6G7H8J8K7K7K7K7K7A#IQW\#`,`6`A ^M[XXdUp#S|'P+O.M0L2L3K4K5K5K6J8J:JO@OAQAR@S@T?T?T?T?T?FPYbhl$o.o8nDkNh[dg#`q*]{/[4X8W;U=T?SASBSCSDSETEVDWDXCXBXBXBXBXBHS]fmr!u)v3v> sJoWkb#gl+dv1a7^;\>[AYDXFWGWHXHXIYHZH[G\F\E\E\E\E\EKWakrx{$}-~9{FvSq^$mh,jq3g{8d=bA`E^G]J\K\L\M]L^L_J`I`H`G`G`G`G`GNZdov}'ۄ4ЁC|OxZ#sd,pm3lv:j?gCeGcJbMaO`P`PaObNcLdKdJdHdHdHdHdHP\h rzފ Ҋ0Ɇ@M}W#ya,uj4rr:o{@lDjHhLgOfQeReSfQgPgNhLhKgIgIgIgIgIR_k u ~ ֏̎.Ë= JU"~^+{g3wo:tx@rEoImMlPjSjTjTkSlQlOkMkLkJkJkJkJkJTa n x ܉ ؏ ГƓ+; HR!\+d3|m:yu@w}EuJrNqQoToU}oV|oT|pR{pP{oN{oM{nK{nK{nK{nK{nKWc p|܅ԌГ ʖ)9 FP Z*b2j9r?|zEzJxNvQ{uTxtVvtVutUuuSutQusOvrMvqLvqLvqLvqLvqLYfsֈϐʖĚ&7 DNW(`1h8p?xDI}}Mx{QtzTqyVoyVnzUnzSoyQpwOqvMquLquLquLquLquL[iw݂Ћɓę$4ALU'^/e7m=uC{~HvLrPnSkUhVgUhSi~Qj|Ok{MlyLlyLlyLlyLlyL^ lzֆˏė!2?JS%\-c5k;zsAu|FpKkOgRdTbUaTaRcPeOfMg~Lg~Lg~Lg~Lg~La o~ЉƓ /=HQ"Y+a2yi9tq?oyDjHeLaO^R[RZR[P\O^N`LaKaKaKaKaKdtڂˎ,: EOW(y_/sf5mn;hw@cE_I[LWNUOTNTNUMXLYK[J[J[J[J[JhyчŒ(6 BLxT#r\*ld1gl6bu;]@YCUGQIOJNININIPIRHTGTGTGTGTGnʍ#2~>wIqRkZ%eb+`j0[s5W}9S=O@LBJCIBHCGDIDKDMDMDMDMDMDu҆Ó {-u: oEiOcW^_#Yh(Uq-Q{0M4J7G9E:D9C;B=B>D>E>E>E>E>E>}ɍytp&k5e@ `K[TW]ReNo#Kz&GȆ)DȔ,BȤ.@ȸ/?/?0=3;5<6=7=7=7=7=7цxne c`-[:WF SP OYKbGlDwAׄ>ؓ <أ!;ٷ":":#7'6)4+6-6-6-6-6-ŐwlbZXT)P5L?HIES B\ ?fC;K8T6]3h 0t . ,*(''&&%%%%%vi]QIFB>!;*734:0B-J+S(\%f"s         vi[NC>: 62/#+*(1$7!?FNXcpwhZL@72.*&# &+28@H R ]k}xi[K>2+&!  $ *07@JVdu/++2/104/9+A'L#X!f t    !""""/+.02/3126/>+I)V'c%q$~ # #"""""""""""###$&''''0*1-5+7-624:2E/R-`,m *z )(((''''''''(((')+,,,,1)4)9(;*<.:69B7O5\3i 1v0/..--------..--/122223)8&=$@%A)B3A>?J=W ;d 9p7}655443333345433 6!7!8!8!8!8!5'="B F H%J/I:GFER C_ Ak?w=<<;;:::::;:!:#:%:%<&=&>&>&>&>&9$AGKO"Q+Q6OALM KZIfGrE}CBBA A!@"@"@#A#A$@'@)?*@*B*C*C*C*C*C*< EKQVX'X1W<UH RTPaNmLxJI H"G$G%F&E'E(E)F*E-E.E/F/H/I.I.I.I.I.@IPV\_#`,_7]BZO X\VhSrQ} O$N'M)L+K-J.J/J0K0K2J3K3L3M3N2N2N2N2N2CLT\aef'f1e=cJ `W]bZmWw#U'T+R.Q0P2O4O5O6O6O7P8P8Q7R6S5S5S5S5S5FPX `fjl!m+l7jE gRc^`h ^r&\{*Z.X1W4U6T8T:S;S;TX?X@Y?Y?Z>[<[;[:[:[:[:[:LV ` h o swyy.w> tKpVm`!ji(gr-ez2c6a9`<^?]A]B]C]C^A_@_>_=_<_;_;_;_;NX clsx{ ~~+|;yHvSr]!of(mn.jw3h7f;e>cAbCaEaEbEbCcBc@c>c=c|g=|g=|g=|g=R]irzʃņ&6CN|X y`'wi-tp3ry7pwj>wj>wj>T _lv}Ƀć#4ALU^&|f-yn2wv7u;t?|rCxqFupHsoIqpIqpGqqDrpBroArn?rn>rn>rn>rn>V boýŇ 1? JS\%d,k1}s6~{|;zy?vwBrvEouHluIkuIkuGkuEluCmsAmr?mr?mr?mr?mr?Yer|DŽ /< HQZ$b*i0|q5xz:t>p}Bl|Ei{GfzHd{Hd{Ge{DfzCgxAhv?hv?hv?hv?hv?[iv̀È ,: EOW"_({g.vo3rw8m_A\DZEXEXDXCYA[@]>]>]>]>]>bq~È%4@ JyStZ#ob(jj.fr2a|7]:Y>V@SARBRAR@R?U>V=W=W=W=W=gvɃ!0< xGsPmXh`$dg)_p.[y2W6S9P;N=L=L2@2A2A2A2A2|Š|phfc-^9ZDVN RWO_KiHsE~B ?"=#<#<#:&8(7)8*8+8+8+8+Ʌ|qf[WV#S2P>MHIRF[ Ce@o>{;ω9ϙ7ϫ664210!/!/!/!/!}qf[PG FE'D5A@?K=U:_8i5v 3 1 / .--+*)((((~qeYND? =;#9.684B1K/U-_*k(x&%#""!!     qdXLA85 30.'+0(8&@#I!R]iyrdVI>4.+ (%"&-4<DNYg w   sdVH;0'#  !' . 6>HTbsteVG9-#   &.7AM\m$/%/(/'1$6 >IVdr    %.)-+,+.)3$;FSan{       &-,).(/*-/)7'C$P"] jw             !!!!**/&2$3%2*14/?-L*Y(f&r%~%% % % % $ $ % % % % & & &%%&''''.&4"7 9!8%9/8;5G3T1a/m.y - - , , ,,,,,,---,,,-....2#8<>@"A+@6>B xJuSs\qd"ol'mt+l|/j2i5|h8yg:vf;tf#="=#<%;&;&;&;&;&;&zui^[Y$V1S=PGMPJY Gb DlAw><98775433 3 3 3 vk_TL KI(H5E@CJ@S>];g9s 7ǀ 4ǐ 2ǡ1ȵ00.-,++++xk`TJ@:98(756@4K3U1`/l-z+؋*؝(ٱ''& % $ # # # # yl`TH>5- ,+)*(5'?&J$U#a!n ~zl_SG<2*% #!"+4>HR_n      |m_RE9/&!(0 9 C N\l}n`RC7+"  "*3=IWi~paRC5)  #+6CSez/ ,!,.3<F T a o {                      -#)$)"+08CP^kw#*&&(%''#+3@MZgs~&&*", +"(&'0$<"IUbnz     *".000"0,.7+D(Q&]$i#u#########$$%%$ % % $ $ $ $ $ .35588'734?2K/X.d-o,z,,,,,,,, , -- , -,,,,---27:<?@">-<9:E8R7^6j5t5~44 4 4 3 3 3 3 4 44444344446;> CFFF&D2B?@L?Y>d=o}H |Q{zYwy`swhovp!lux%it(fs+cr.`q/^q0]q0]q.^q,^p+_p)`o(`n(`n(`n(Ubmu{.;~E zNuVq^n}fj|m g{v#cz'`y*]x,Zw.Xw/Ww/Ww.Xv,Xv*Yu)Zt(Zt'Zt'Zt'Yfqz +}8xBtL oTl[hcdkat!]}$Z(W*U~,R~-Q~-Q},R}+R|)S{(Tz'Tz'Tz'Tz'^kv~~{'v4r?mI iQeYb`^hW{!T$Q'O)M*K*K)L)L(L'M&N&N&N&cp{zur"o0j;fEbN _V[]XeUnQxN K#I$G&E&E%E%E%F$F$F$F$F$iv~pkhf*b7_A[JXR TZQbNkKuHEB@ ? ?? >!>!?!?!?!?!p}wi`][$Y1V<SEPNMW J_ GhDsA><:998777777xznbUPNM(K5I?FIDRA[?d+<6;A9K7T5_3j1w/-+**) ( ' ''''rfZOD:0.-,)+5+@*J(V'a&o$#ϑ!ϥ н tg[NC9/' &1<HUbrvh[NB7-$&0: F S b txi[M@4*!  $,7BPauyj\N?2'  '1>M_u|l]N?1%  !+9J]s,)(+0 8DQ^lx)&%',4 @N[ht&!" !#'0<J W c o z                ""$$"",8ER^ju&((&&&(#4 @MYepz*---.-",.):&G$T#`"k"u"~""""""###$$%%%%$$$$.12 4553'14/A-N,Z,e,p+y++++++++,-- - - - - , , , , 15 6: <;97+695G5T5`5j4s4|4433 3 3 3 3 4 4 4444444458<@A A?<"=1>A>O>Z=d=nCKQTTRQS"U3TATLSVQ_ PgOoNwNMLLKKKKLLLMLLLL@GPVYZXWYZ/Z=YIXS W[ VdUkTsS{RQQPP P!P!~Q }Q}Q}Q}Q}Q}Q}QBJTZ^_^\ ^`+`:_E^P \X [`ZhYpXwWVV~U!{U"yT#xU#wU"vV vVvVvVvVvVvVENX^bdcacd(e7dCcMaU `]_e^l]t~\}|[yZ wZ"tY$rY%qY%pZ#oZ"oZ pZpZpZpZpZHR[bfhhfgi%i4h@gJfS e[db~cj{brxazv`s_!p^#n^%l]%j^&i^$i^"j^ j^j^j^j^j^JU_ejlljkm"n1m=lGkP jX|h`xggvgosfxpemd!jc#hb%fb&db&db%db#db!ebebebebebLXbinppnprr.r;qE}pN znVvm^slepkmmjujigi!eh#bg%`g&_g&^g%^g#_g!_f`f`f`f`fO\emrutst vw+w8|vCxuL ttT qs[nrckqkhpseo|bn _m"]l$Zl%Yl%Xl%Yl#Yk!Zk[k[j[j[jS`iqvyywy {|({|5w{@szIoyQ lxYhwaevhbup_tz\tZs!Wr#Ur$Sr$Sr$Sq"Tq TpUpUoUoUoWdmu{~}}|x$u2q=mFiO fV c~^`}f]|nZ{wWzTzQy!Oy"Ny"Mx"Mw!NwNvOuOuOuOu\hrzytq n.j9gCcL`S ][ZcWkTuQNKIH GGH~H}I|I|I|I|anx{pk hf)b5_?\HYPVX S`PhMrJ}HECBAAAABBBBgt~uga^\#Z/W:TDRLOTL\ Ie GoDzA?=;;:::::::n{{nbWRQO(M4K>IGGPDXBa?k =w : 86544333333wsg[OGDCA+@7?A=J;S9\7g5s20.- ,, + * * * * * xk_SH=6 43!2,170A/K.U,`*m){'%$##"!!!!!{naUJ?4+$ ""!* 4?JVcsDžǙȮ}pbVJ>4*" %0<H V e x ֍ ؤ ؾ   rdWI=2(  $.:GVg{teWI<0%  !+7EVh~vfXJ;.#  '4CUixhYK;-! "0@Si(%% '-5AO\it~%"!# (0=KXdpz"" ,9FS`kv(4 A N[fqz     !! $/<IUaku~%%$ ##")5CO[fpy() (+ +)&"#.!; I U `!j!t!|!""""###$%%%%%%%%%, -.11 /+)%(3(B*O+Z+e+n,v,~,,,,,,,--....----/15763/.1,3<4I5U5_5h5p4x444444 4 4 5 5 5 5 5 5 5 5 5 35:>@=7 8:&=6>D>P=Z=c=kGPVXYVSTV%W4W@WJVSU[ Tc TjSrRz}R{QxPvPtPsPqPpQpQpQpQqPqPqP@KTZ]^[XY["\1\=\G[PZX Y` ~Yg{XoyWwvVtVrUoUmTlTjUjUjUjUjUkUkUkUCOX]ab`\^`a.a:`E`N~_V {^] x]ev\ls\tp[}nZkZiYgYeYdYdYdYdYeYeYeYeYFR[aefcabde+e7eB|dKxcSuc[ sbbpajm`rk`{h_f^c^a]`]_]_]_]_]`]`]`]`]JV^eiigef hi(~j5zi?viIshQpgY mg` kfghepedycd`c^b\bZbYbYbZbZa[a[a[a[aMYbhmmkik m|n%xn2un=qnFnmOklV hl^ ekecjm`iv]i[hXgVgUgTgTgTfUfUeVeVeVeQ]flqpon}pxrus!rs/os:lsDirLfrTcq[ `pc ]pk[otXnUnSmQmOmNmNlOkOkPjPjPjPjUajqutt|svuqwoxly+iy7fy@cyI`xQ]wX [w` XvhUuqRu|PtMtKsIsHsIrIqJqJpKpKpKpZfovyxxwyo|j} g~d&b2_=\FZNWUT~] R}e O}oL|yJ|G{E{D{C{CzCyCxDwDvDvDv_kt|~}~rfa^\!Z.X8UBSJPRNZKb Il Fw CA?=<<<===~=~=~fq{ym_XTRP'O3M=KEINFVD_Bh?s = : 8 766555666myrfZPI GE D+C6A@@H>QKZj~̫̔|n`RE9.#  '1>K[nބߛߴpaSE8,!  $/<K]qrcTF7*  +9J^tteVG8*  (7J^v$" !$)2>LYepz! #-:HUalv )6CP\gqz $0>KWblu~ + 8EQ\fpx   $0> J V a j s { " ! ! (6COZdmu}&%&'%! -<I U!_"h"p#x###$$$$%%&&&&&&&&)(-0/+" #&'(6*D+O,Y,b,j-r-z--------..//....,.5996/-0!214>5J5T5]5e5m5t5|554445556666555/4<AB@:69;,<:=F=P=Y=a=h @B'C5DBDLDUC]CdCkBsB{B A A A A~A|AzB yB xB xB xB xA xA 6@HMNMIEFH#I2J>JHJQIYI`IhHoHw G }G zGxFvFuFsFrGqGqG qG qG qF qF 9DLQSRNJKM O.O:OEONOVN]~Nd|Ml yMt wL} uLsLqKoKmKlKkLjLjLjK jK jK jK =HPUXVSOPRT+T7TBTK|TSzSZxSbuRi sRq qQz nQlPjPhPfPePdPdPdPdPeO eO eO ALTY\ZWTU WX'Y4}Y?zYHwXPtXXrW_oWf mVn kVw hUfUdTbT`T_T^T^T_T_T_S _S _S DPX]_][XZ [}\$z]1w]<t]Fq]No\Ul\]j\d h[l eZu cZaY^Y\X[XYYYXYXZXZXZW ZW ZW HS[aba_\^{_xa!ub.rb9obClaKjaSgaZe`b c`j `_s ^^}[^Y]W]U]T]T]T]U\U\U[V[ V[ LV_dedcaybudreof+lg7jg@gfIefQbeX`e`]dg [dp Yc{VcTbRbPbObObOaOaP`P`P` P` OZcihggyesgoiljik(gl4dl=blF_kN]kVZj]Xje Vin Six QhNhLgKgIgIgIfJfJeKe Kd Kd T^gmlkkskmmhn epbq$`q0^q:\qCYqKWqSUpZRpbPpk Nou Ko InGnEnDnCmDlDkEk Ej Ej Ej Xclqpozonpes`u]v[wYx+Wx6Ux?SxHQxOOwWLw_JwhHvs Ev Cu Au?u>u=u>s >r >q ?q ?p ?p ^iquttutiv^yX|T}R~Q&O1M;LCJKHTF\CeAp?~|<~ :~ 9~ 7~ 7} 7{ 7z 7y 8x 8x 8x doxyy{ypzd|XPK HG E+D5C>AG@O>X4*!! + 6 A N \ l teWK@5*!  "+6BP_qćĝĵxj\OA5)  !*5CRcxՏէ{l^PB4(  '3BTg~}n_QB4'  $1AUjqaRD4&!/AVm  %.;IVbmv  *7EQ^hrz%2@LYcmu}  ,:GS^gpx  &3@MXajrz  +9FQ[dlt{   " 0 > J U ^ gov~ (7DOYaiqx"!'*)$"1 >!I"S#\$d$l$s$z%%%%&&&''((''''&)1440)#&(+*8+D,N-W-_-g-n.u.}......////////)18<<92- /1&344@5J5S5[5b5i5q5y5555556}6{6{6z6z6z5z5-7?CD@:679":/<;h >g >f?e?e?d?dWaihg{gqgeh\jXlTnRoPo$Np.Mp8KqAJqIHqQFqYDpbBpl@px>p0$  !,:J]rzk\M?0# +:Maym^O@1"  );Of"+8FS^irz&4BNZdmu} ".<IT_hpx   (6CNYbkry "/<HS\elsz  (5ALV_fnt{  -:EPYahov}   $ 2 >IS[cjqx#%$+8CMV]els{       &-0.(" &!3">#H$Q$Y%`%g&n&v&&''''((~)})|(|(|(|($.5861,&&(!*.+9,D-L-T.\.c.j.r.z//}/{/z/x/v0u0s0s0s/s/s/*5;?<83/.02)354?5I5Q5X~5_}5f{6ny5vx5v5t5r6p6o6m6l6k6k6j6j5j50:ACA>:65 78%:1;<|;Ez"z?.x@8uABsAJrAQpAYnA`lAgjAphAygAeAcAaA`A^A^A]A]@]@]@]@9CJKIGDA~AzBvCtE*qE5oF?mFGkFOjFVhF]fFedFmbFv`F^F\E[EYFXFXFWEWEWDXDXD=GNNLKI}ExFtGpHnI'kJ2jK<hKDfKLdKSbKZ`Kb_Kj]Kt[JYJWJUJTJSJRJRJRIRIRHSHAKQPON~LxHrJnK kMhN$fN/dO9bOBaPI_PQ]PX[O`YOhWOrUO}SORNPNNNMNMNMNMMMMNLNLDNTSRQzPrMlOhP eQcR!aS,_S6]T?[TGZTNXTVVT]TTfRSoPS{NSLSKSISHSHRHRHQIQIPIPHRWVUTvSlQgSbT_V]W[W)YX3XX<VYDUYLSYSQY[OXdMXmKXxIXGWEWDWCXCWCVCUDUDTDTLVZYX{XqWfVaX]YYZW[U\&S]0R]9Q^AO^IM^QL^XJ^aH]kF]vD]B]@]?]>]=\>[>Z>Z>Y?YPZ]\[v[m[a[[]V^R` PaNb"Mb,Lc5Jc>IcFGcNFcVDc^Bch@cs>co=o"JV`hpx~ +8EPZckry  %2?JT]elsz  ,8CNW_gmtz  $1<GQY`gnt{  )5@JS[bhou}  !.:DMU \ c j q x  ! &3>GPW^els|#)*&"!-8BKRY`gow~ } { y!w"v"u"t!t!t!!+11.*&! !(#3$=$F%N&U&\~&c|'k{'sy'|x(v(t(r(q)o)m)l)k)k)k(k((28752-)' (*#+/~,9|,Bz-Jx.Qw.Xu.`s/gr/op/yo/m/k/i/h0g0e0d0c0c/c/c/.8=<:730. /{0x2+v35t3>r4Fp4No5Um5\l5dj5lh5ug5e5c5a6`6_6]6]6\6\5\5\43<A@><96{4w5t7q8'o92m9;k:Cj:Kh;Rg;Ye;ac;ib;r`;}^;\;[;Y;X;W;V;V;V:V:V97ADCB@~>y;t:q:m<k=$i>/g?8e?@d@Hb@Oa@W_@^]@f\@oZ@zX@V@T@S@R@Q@P@P?P?Q>Q>;EGFEDyBt>o?k@ gAeB!cC+aC5_D>^DE]EM[ETYE\XEdVEmTExREQDODMELEKEKDKDKCLBLB?HJIH}GuEnBiCeD bE_F]G(\H2ZH;YICWIJVIRTIYSIaQIkOIvMIKIJIHIGIFIFHFHGGGFGFCLLLKyJpIiFdG_I\JZKXL%VL/UM8SM@RMHQNOONWNN_LNiJNsHMFMEMCMBMAMALALBKBJBJGOONNuMlLcJ^LZMVNTORP"QQ,OQ5NR=MRELRMJRTIR]GRfERqCR~AR?R>R=RW{?\F>]O=]W;]a:]l8]y6]4]3]1]1\1[1Z1Y2Y2XTYXXsWiW`XTYN[H]C_@`>a=a ;b):b29b:8cB7cK6cT4c]3ch1cv/c.c,c+c*c*b*`+_+_+^Y\\{[o[e[\\Q^I`CbKYi{w}uptbuUxI|?4+" "+5BP_q}x|i|[NA6,#  "+7ETf{qaSF9.#  !+8HZnyhYK=1%  +:L`wؒجp`QC5(  *<QggXI:* ,?Un%2?KV`hpx -:FQ[cksy  (5@KU^fmtz ".:EOX`gmtz'3>IRYagmsz !,8BKSZagmtz%1;EMU[bhnu|   )4>GOV\cipx   " . 8 A J Q X ^ e lt}~}zxwwww!$# '2<DLSZ`~h}o{xyxvtsronmmmm )+*($  "-~7|@zHyOwUv\tcskq tp n!l!k!i"h"f"e#d#d"d"d!&/10.+($ ~ {"x#)u$3s%<q%Cp&Kn&Rm'Yk'`j'hi(qg({e(d)b)`)_)^*\*\)\)\)\(,55431-|+y(v'r)p*%m+/k,8j,@h-Gg-Ne.Ud.]c.ea/n_/x^/\/Z/Y/X0V0U0U/U/U.U.1:9876z2u0r.n. k/i0!f1+d24c2=a3D`3K_4R]4Z\4bZ4kY5uW5U5T5R5Q5P5O5O5O4O4O36=<<;{:t7o5l3h4 e5b6`7(^71]8:[8AZ9HY9PW9WV:_T:hS:sQ:O:N:L:K:J:I:I9I9I8J8:@??>w=p;j8f8b9_:\;Z;%Y<.W=7V=>T>FS>MR>UQ>]O?fM?pL?}J?H?G?E?D?D>D>D=D=E<>CBB}As@k?e<`<\>Y>W?U@"SA+RA4PB<OBCNBKMCRKCZJCdHCnGC{ECCCBC@C?C?C?B?A@A@@AEEEyDoDgB`?[AWBTC QDOENE(LF1KF9JGAIGHHGPFGXEGaCHlBHx@H>HCKFBLMALV@L_>LjPC%cG#cQ"d\!didyddddca``_YX{XmXbXYXPYG[>^7`1c*f$i !j jj k(k0k9kBlLlXleltllllkihhg]]u\h\^\U\K^Ba9d2g+j$mps ttt!u)u2u;uFuRu_ un u u ut t s q q pbapadaZaObEe2' $1@Re}o_QC6*  $3DXnшФgWI;.! $6I_x_PB4& %9Og"/;GR[dlsz *6ALV_fmtz $0;FPY`gntz *5@JRZagmsz#.9CLT[agmsz (3=FMU[agmsz!,6?GOU[agnu}   %09AIPV\bipx~}|{{{{  )3<CKQW^dl}t|~z x w u s r p p o o o    # - 6~>|F{MySxZvauhsqq{pnlkihfeeee$$#!|y(v1t:rAqHoOnVl]kdimhwfdca`^]\\\\%*))(%}"yxvro#m-k5i=hDfKeRc Yb aa i_!s]!\!Z"Y"W"V#U#T#T"T"T"+...-|+v(r&o#m! j"g#e$)c$1b%9`&A_&H]&O\'V[']Y'fX(pV(|T(S)Q)P)O)N)M)M)M(N(02221v0p-k+h)f( c(`)^*%\+.[+6Y,=X,DW-LU-ST-[S-cQ.nP.zN.L/K/I/H/H/G/G.G-H-4555{5r4k2f/b._-\.Z/X0"V0+U13S1:R2BQ2IP2PN3XM3aK3kJ3wH4G4E4C4B4B4B4B3B2B28888w8m7f6a3]2Y2W3 T4R5Q5(O60N68L7?K7FJ7NI8VG8_F8iD8uC8A9@9>9=9<9<8=7=7=6;;;;s;j:b9]7X6T7Q8 O9M9K:%J:-H;5G;<F=<=:=9=8=7=7<8;8;8:=>>|>o>f=^=X;S:O;L<I=G>F?"D?*C?2B@:A@A@@I>AQ=AZ@@@xAlAb@[@T?N?J@FADBBC@C?D'>D/:EF9EN8FX6Fb5Fn3F|1F0F.F-F-F-E.D.C.CCCCtChC_CWCPCHCDEAF>G nJnWnenvnmmllkjjZtZfZ\YSYHZ?]6`.c&gjmqt w wwww$x-x7xCxPx^xoxxwvuutt~_n_b^Y^M_Bb9e0h'lptw {~ &0;HWh|weid_cRdGgGNU[agmsz#.7@HOU[`fls{ '1:BIOU[`gmu~ !*3<CIPU[ahp~y|{yxvusssss   $.6>}D|KzQyWw]vdtlsuqonlkihhggg  |y(w0u8s @r Fp Lo Sm Yl aj ii rg ~f d b a ` ^]]]]{xxw sp"n+l3j;iBgIfOdVc]af`o^{\[YWVUTTTT""##"y!sonm jge'c/a7`>^E]K\RZZYbWlVwTRQONMLLMM&''({'r&l$h!fdb_]#[+Z3X:WAV HT OS WQ!_P!iN!tM!K"I"H"G"F#E#E"F"F!*++,v+m*f)b&_$]"[!X"V#T$(S$0R%7P%>O&EN&LL&TK'\I'fH'qF'E(C(A(@(?(?(?(@'@'-./}/q/h.a-]+Z(W'T' R(P)N)%M*,K*4J+;I+BH,IF,QE,ZD,dB-o@-}?-=-<-:-:-:-:-:,:,012y2m2d2]1X/U,Q,O- L-J.I/"G/*F01E08C0?B1GA1O@1W>1a=2m;2{928262524242515150345u5i5`5Y4T3P0L1I1G2E3C3B4'@4.?56>5==5D<6L:6U96_76k66x472717/7/7/6050504667r8f8]7V7P6K4G5D6A7 ?8>8<9$;9,:939::8:B6:J5:S4;]2;h0;v/;-;,;*;);*:*:+9,889|:n:c:Z:S:M:F8B:?;<< :<8=7=!6>)4>03>72??1?G0?P.?Z-@f+@t)@(@&@%@$@$?%>&=&=;<x=j=_=V=O=I=B=<>9?6A4A2B1B/C%.C--C4,D<+DD*DM(DX'Ec%Eq#E"E EEDDC B!A>?t@g@\@S@L@F@>A8C4E0F-G +H*H)H"(I)'I1%I9$IA#JJ"JU JaJoJJJJJIHGGBBpCcCXCPCICBD;E5G0I+K&M $N"N!O O%O,O5O=PGPQP]PkP|PPPPONMME{FkF_GUGMGFG?G7J1L+N&P SU VVV V'V0V9WBWMWYWhWyW W W V V U TSIvJgJ[JQJJJCJ;L3N,Q&T!VY\^ ^^^"^* ^3 ^= ^H ^T^b^s^^^]]\[[NpNbNWNNNGN>O6Q.T'W!Z]`c f gggg$g-g7gBgNg\gmgffeeddczRjS]RTRKRBS9U0X([!_beh kn ooopp'q0q;qHqVqfqyqpoonmmsXeWZWQVFWHRZbiou{ !,8CLT\ciou{ '2<FNV\chnt{!+6?HOV\agmsz %/8AHOU[afls{)2:BIOUZ`flt} #,4<CIOTZ`fnw~|{zxxxxx &.6=C~I}O|Uz[yawiuqt|rqonmlkkkk  | z(x0v8t>sDqJpPnVm]ldjmhwgedca`````| y x usp#n+l3j9i@gFfLeRcYba`j_t]\ZYWV V U U V vqnm m j g e &c .b 5` <_ B^ H\ O[ VY ^XhVsUSQPNMMMMMwoifddb_]![)Z1X8W>VETLSSQ[PeNpL}KIGFEEEEE!"|"q"h!b_\[Z WUT%R-Q4O;NBMHKPJXHbGmEzCB@?>=>>>#$%w&l&c%]$Y"VTS QNM"K)J1I7G>F EE MC UB _@!j?!w=!;!9!8"7"7"7"8!8!&')s)g)_)X(T&Q#O"L"J"H"G#E$&D$.B$4A%;@%C?%J=&S<&\:&g9&u7'5'4'2'1'1'2&2&3%)*},o,d-[,U+P*L(J&G'D' B(A(?)#>)+=)2<*9;*@9*H8+P6+Z5+e3+r1+0,.,,,+,,,,+-*-*,-y.k/`/X/Q.L.H,E+A+?, =,;-:.!9.(7./6/65/>4/E3/N10X00c.0p,0*0)0'0&0&0'/(/(..0v1h2]2U2N1H1D0@/<0:1 71625233%23,13304;/4C-4L,4V*5a)5n'5~%5#5"5!5!4"4#3#213r4e4Z5Q5K4E4@4:374452607/7.7"-8)+81*88)9@(9I&9S%9_#9l!:| :::9988746n7a7W7N7H7B7<75829/:,; *<)<(=&=&%=.$=5#>=">F >P>\?i?y???>>=<<7z8j9^:S:K:E:?:9:2<.>)@&A$B"B!B C#C*C2C:DCDMDYDgDwDDDDCBBA;v<f=Z=P=H=B=<=6>/@*B%D!FH IIII&I.J6J@JJJVJdJtJ J J J I H G G>q?b@V@M@E@?@9A2B+E&G!IKNPPPP!P)P1 P; QF QQ Q_ QoPPPPOONM}BkC]DRDJDCCGOW]ciou|"-7@IPW]chnu| &0:BJPV\agmt| *3;CIOUZ`fmt} $,5<CIOTZ_fmv~&.6=CINTY~`|gzoyzwutrrqpppq !})|0y7x=vCtIsNrTpZobmjktjhgeeddccd~{wurq#o+m2l8j>iDgIfOeVc]be`o_{]\[YYXXXY }v q om kige&c-a3`9_?]E\K[RZYXbWlUxSRQPONNNNtlgec c a^\![(Y/X5V;UBTHSOQVP _N iM vK I H G F E E E E xme_\ZZZ W U S $R +P 1O8N>MEKMJUH^GhEuCA@>====>rg_YUSRR PNL J'I.H4G;EBDICRA[?e>r<:8755667{ m!b!Z!TPMLKIGED$B*A1@8??=F<O:X9c7o5~320///00"w#i$^$V$P#K"H FEC A?>!<';.:59<7D6L4 V3 `1 m/ |-!,!*!)!)!)!* + "%s&e'['S'L&G%D$B!?!=! ;!9"8"6#%5#+4$23$92$A0$J/%S-%^+%k*%z(%&%$%#%#%$%%$%$%'o)b*W*O*I)D(@'=&:%7&5&4'2'1("0()/(0-)7,)?+)G))Q(*\&*i$*x#*!****) )!((|*l+_,T,L,F,A+<+8*5*2+0+ .,-,,,*-&)--(-4'.<&.E$.O#.Z!/g/v////..--+x-h.[/Q/I/C/>.9.4.0.-/+0 )1'1&1%2#$2*#21!39 3B3L3W3d4t44333321.t/e1X1N2F2@1;16111+3(4%5#6 !6 77 7'8.868?8I9U9b9q999888761p2a4U4K4D4=48434-5(7$9 :; <===#=+>3><>F>R>_>o> > > > = = < ;}4k6]7Q7H7A7;75707*9%; =?AC CCCD'D/D9 DC DN D[ DjD|DCCCCBAx8g9Y:N:E:>:8:3:-;'=!@BDFI J J J J#J+J4J>JIJVJeJwJJIIIHHr<b=U>J>B=<=6=/>)@#BEGJL O P QQQQ&Q/Q9QDRQR`QrQQQPPOOl@]AQAGA@@9@2A*C$FHKNQ SVW XXYZ!Z)Z3Z?ZLZZZlZYYXXWWeEXEMEED>D5E-G%JMPSV Y\^_ ` abcd#d-d8dEdTdfd{ccbaa`_JSJJICH9I/L'ORUY ]`cfhij k mnpq&q1p>pNp_psoonmllZOPNHM=N3Q)T X\` dhkortuwx z |}(5EVk~}|{zVTNSBT7V,Z"_ch mrvz} ,;MbzUYHZ;]/a$flr w} !1CWpNa@d3i'nu| %7LdFk9p+w +@XtӒҰ>y1# 3Kd )4?HPX^ekqw~ #.9BJRX^djpv} (2;DKQX]chov~"+4=DKQV\agnv %.6=DJOUZ`fnw'/7=CINTY`goz~|zyxwxxwu !)07}=|CzHyMwSvYtariqsomljihiiii|ywvt#s+q1o7n=lCkHjNhTg[eccmbx`_]]\\\\\xtpm kihf%e,c2b8`=_C^I\O[VZ^XhWsUTRQQQQQR ~ s l heca _]\!['Y-X3V9U?TESKQRPZOdMoL}JIHGGFGG ukc^[ Z Y WUSR#Q)O/N5M;LAJHIOHWFaEmCzB@?>===>|nd\VSQP P OMKI%H +G 1F 8D >C EB M@ U? _= k< y: 8 7 5 5 5 5 6 vi^VPMJIIH F D C!B(@.?5><=C;K:T8^6k4y21/---./qdYQLGDCBA @><;%:+82796@4H3Q1\0h.w,*('&'()}m`VNHC@>=;9865"3(2/160=.F-O+Y*f(t&$"! !"#yi!\"R"J"D!?!< 9854 20/.%-,+3*;)C'M&W$d"r  u"e#Y$O%G%A$<#8#5"3 0 .! ,!+!*"("#'")�%#8##A"$J!$U$a$p$$$$$$##"q$b&V'L'D'>'9&5&1%.$+%)%'&%&$'#' "''!(. (6(>(H)S)_)n))))((('%n'_(S)I*B);)6)2(.(*(&)$*"+ +,,,$-+-3-<-E.P.].l.~.. - - -,,|(j*[+P,F,?,9,4+/+++&,"./0 1112!2(20293C3N3[3i 3z 3 3222 1 1w+f-X.M/C/<.6.1.-.).#02356 7778$8,85 8? 8J 8W 8e8v8877766s.b0T1I1A19141/0+0%2 368:< = = = =! =)=1>;>F>R>a>r>===<<<m2]3P4F4>47423-3'4"68:=? A C DDDD$D-D6DADND\DmDDCCBBBh6X7L8C8;75606)7#9;=@B EGI IJKK K(K2K=LILWKhK}KJJIIIb:T;I;@;9:39,:%<?ADG ILOP P QRTT#T,T7TDTRTcTwTSRRQQ\?O?E?>>7=/>'@ CFIL ORTWXY Z[]^_&_1^=^L^]^q]]\[ZZVDKCCBFLRX]cipx &/7?EKQV\ahpy  (08>DJOUZahq{|{y "*18>CHNT~Z|azixsvusqpoooml ~}|$z+w1u7t=rBqHoMnSlZkbilgxfdba`aaa`|wrp nllk%i,g1f7d=cBbH`N_U]]\fZrYWVUTTTUUunifc a`_^ ]&[,Z2X7W=VCUISPRXQaOlNzLKJIIIIJtjc^[YW VTSR"Q(P-N3M8L>KEJLHTG]FhDuCA@@??@@ y l a Z U R PON LKJI#G)F/E4D:BAAH@P>Z=d<r:9876667 re[SNJH G G EDBA @%>+=1<7;>:E9N7W6b4p210/..-.}l_UNHDA@@ @ > < ; 9 "8 (7 .6 55 ;3 C2 L0 V/ a- o+ * ( ' % % & ' wg[QIC?<:998 7542%1,02/:-B,K*U(a&o$#! scWME@;85432 1/-,"+)*0(7'?&H$S"_ m~o_SJB<741/.,+)(' %&$-#4"= FQ]k|}k\P G ? 941-+)'% $"! #*2:DN[izzgY!M"D"<"6"2!.!* ' $"  !!!"!"'"/"8#A#L#X#g#x# # # # " " !vd"V#K$A$:$4$/#+#(#$# #$%& &&''%','5(?(J(V (d (t ( ('''&&q"`$S&H'?'7&1&-&)%%%"%'(*+ ,,,,",)-2 -; -F -R-`-p--,,,++m%]'O(E)<)5)/(+(''#'(*,.01 1 1 1 1&2.272B2N2\2l2211000h)X*L+A,9,2+-+)*%* +,.024 7 7777"7*838>8J8X8h8|776665c,T.H/>/6.0.+-'-"-/1357 :; <=>>>&>/>:>F>T>d>w>==<<;^0P1D2;241.0)/$02469 ; =@A B CDEF"F+F5FAFOF_FsEEDCCBX4K5A59524-3&4 58:= @ BEGHJ KLNOO%O/O<OJOZNmNMLKKJS9G9>97817)7!9<?B EHJMOQRT UWYZY)Y6YDYTXgXWVUTTN=C=<<5;,<$>ADH KNQTWY[]^` bdgg"f.f<fMe`ewdca`_IBAA:?0@&CFJN RVZ]`cegikmo ruwv&v5uFtYtosrponFF@E5F*H LQV Z_chkoruwy{} +<OfFK:L.O#SX^ diotx| !1D[v?R2U&Z`g mt{ &9Pj7\+ahp x.E_~ɞȾ/i#py #:Tr !+5>GNU[afms{ $.8@HNTZ_ekr{(19@GMSX^dks| !*2:@FLQV\cjs~}| #+29?DJOU[ckv~|zywrpo %,28}={CyHxNvTu[scqnozmljihgedc{xv utsr%p,n2l7j<iBhHfNeUc]bf`r^][ZYYYXXyqmif edcc a&`,^1\7[<ZBXHWOVWT`SlQyPONMMMMMukd`]ZX WVVU!S'R,Q1O7N=MCLJJRI[HfFsEDCBBBCCxjaZURPN M LKJI"H'G-E2D8C>BEAM?V>a=n;~:988899o b X Q LIGFD CBAA?#>)=.;4::9A8I7R6]4j3z210///0 x h \RKE A ? >=< ;:98 6%5+40372>1F/P.Z-g+w*)('''' rcVME@<97 6 6 54210"/(..-4+<*D)N'Y&e$u#"  m^RHA;74200 0 / - , * ) %( +' 2& :$ C# M! X e u       {iZNE=830-+**) (&%$##)!1 9BLXfvweWKB:40,)'&%# "!  '.6@JVdt  saSH?72-)&$"  $+4=HTbr       o^PE<5/*&#! ")1;E Q ^ m k[MB:2-($! !!!!"& ". "7 "A "M"Z"i"|""!! gWJ!@!7"0!*!& "  !#$& & & & &"&*'3'='I'V'f'y'&&%%$c T"G#=$4$.#(#$"!"!"#$&( * ++++,',0,:,E,S,c,v,++**)_#P%D&:&2&+&&%#$$$%')+ -/ 00111#2,262B2O2_2r1100//Z'L(@)7)/))(%'!&'(*,. 024 5 6788 8(829=9K9[8n877655U*H,=,4,-+(*$)*+-/ 1 468:; = >@@@$@.@9@G@V@i@?>=<<P/C/9/2/,-', -/13 6 8;=@ACE FHJJJ(J4IBIQIdH{HGFEDJ3?36301*0#1358 ;>ACFHJLNO QTUU"T.T<TKS^StRQPONE7<756/4&57:= ADHJMPSUWX[] _bbb'b4aE`W`m_]\ZYA<:;49*:!<@C GKOSVY\_acegjm psr r-q=pOoenmkih?@9>.?$BFJ OTX]aehknqsux{~ $4F]v~|z?D3E(HLR W]chmqvz~ )<Rl8K,N SY `gntz 0F`~1U$[aiqy %;TqȒų)biq{ /Ie&0:BIPV\bhov  *3;CIOU[`gnv #,4;BHNSY_fnw~%-4;AFLQW^eny|vsr &-4:?EJPV^f~q|}ywusrnige  }&z-w3u8t>rCpIoOmVl^jhhugedba`\[Z~xsom lkkj h&f,e2c7b<`B_H]O\WZaYmW{VUSRRPOOxngc`]\ [[[Z!X&V,T1S6R<QBOINQM[KfJtIHGFFEEExlb[VSQOO NNML!J&I,H1G7E=DDCLBU@`?n>~=<;;;;<~naXQLIGED CCCB@"?'>,=2;8:?9G8P7[5h4x3211123vfYPIC@><;: :9976#5(4.342;0C/L.W-d,s+*))))*n_ S J B = 9 6543 2110/.$,*+0*7)?(I'T&`$o#"!!!!"{ h Z NE=8 3 0 . - -, +*)('!&'%-$4#="F!Q]lu dUJ@93/,)' ' ' & %$"! $+2:DO\k}q_QF=60+(%#"! !     " ) 1 9 C O \ k ~  m\NC:2-(%"  !(09DP] k |  iXK@70*&" %.7 @ K X gxeUH=4-(#   " ) 2 <GTcuaRE;2+%!   &/8DQ`r^OB8/)#     !#!+!5!@!N!]!o! ZK?5-'" ! " # $%%& &(&2&=&J&Z&l&%%$##UG ;N;`:w98765G);*2*+)%'!&'(*, /1468;=?A CEEE!E,D9DHD[CqBA@?>B-8./-)+$**,. 1 47:<?ADFHJL NPPP'O4OCOUNjMLJIH>251./). .137 :=@DGILOQSUXZ ]_^ ^,]<\N[cZ~XWUT:634-2$369=AEILPSVY[]`behk oon%m4mFk[juhfdb8927(9;?DIMRVZ^behkmpsvy} ,>~T~k{zwu8=,>"AFKQW\bfkotx{~ !3Ib1D%HMSZahnty (>Vs*OT[ bjs{2KfƇ©"[b kt}'?[z ",5=ELRX^djrz %.7>EKPV\bjr|'/7=DIOU[ais{vt  (/6<BGMSYaju|smjh !(/5:@E~K|RzYxbvltyrqomle`^\|zx wxwt!r'p-n3l8k>iDhJfQdZcdap_^]\[WTRQtnjfec ccca!_'],\2Z7Y=WCVKUSS\RhPwONMLKIGG|ne^YWUTS STRQ!O&N+L1K7J=IDGLFVDaCpBA@??>=>ocYQMJHGG FFGED!B&A+@1>7=><G:P9[8i7z6554445teXOHC?=<<; ;;:97!6&5,42391A0K/V.c-s,,++++,l]QH@;74322 2 110/-",(+.*5)=(F'Q&^%n$##""#$weVKB:50-,+*) ))('&%$$*#1"9!C NZi|p_Q F = 5 0 + ( %$## " "!  &.6?JWfxk[ M B 9 1 , ' # !     #+3<GTcug W I>5.($           ! ( 0 : E R a s      c SF;2+%!        ' / 9 E Q ` q      _PC8/(#      $ , 6AN]o\M@6-&!      !)3>KZlXI=3+$     '0;HXjUF:0("     $-8FUg}QC7.&         !!*!5!B!R d zM?4+$  !# %&&&'''2'?&N&`&w%$#"!H<1("  !#%') , ....#...;.J-\-r,+*)(D 8!.!&!  !#%'),.03 5 6666)666E5W5m4210/?$4$+$$#!  !# %(*-/2479;> @AA@%@1@@?R>g=<:98:(0()'#%#$%( *-0368;>@BEGJ MMLL+K:JLIaH|GECB6,-+')#'(*- 037:=@CFHKMPSVY [[Z%Y4XFWZUtTRPO30,.',-/2 6:?BFILORUXZ]`cgk lkk,i=gRfjda_]13,1"259 =BGLPTX[_behknquy} $~5|I{axvsp16&8;@ EKQV[`einrvy|~+@Ys+> AG MT[ahnsy~!5Mi#HNT\dmu| )A\|U\enw6Qn߱  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C"K2TE]Zdqjo˸r±twĴ{ͫԢۙᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚ%0:C"K1TE\[cqimɿpruëxʢ|љؐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐ%0:C"K1SE[[argknqsvȚyΒ~ԉ؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉%0:C!K1RDZZ`rejmprtĔwʋ{τԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄ%0:B!J0RDXZ^rdiloprvƆz%09B J/QCWZ\qdiknoqtx{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}$0 9BJ/PBUY[pchkmoqt}ww|w|w|w|w|w|w|w|w|w|w|w|w|w|w|w|w|$0 9BJ-O@SY[ocgjmoqszwt{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{$/ 8AI+M@RXZmbgjmoq{tvwq{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{$/ 8AI(L@QWYkazgknp}sxusxn|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|$/ 8AF(LAPUXfatg~korzuuxq{l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~#- 6 =F*K@OQX`akhtm{qytuxr{n~kւkւkւkւkւkւkւkւkւkւkւkւkւkւkւkւkւ#,/;E+I=NLWXaaiionytruwuqzwn}yk{i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|""':B*F9MEVObV~j\wp`sucoxem|gjhhjfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfk& :>'D3K=UE|aKujOppRluTjyVh|WfXdZc[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[ & 6;#A,J4xS:q_?liChoEetGcwHb{Ia~J_J^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8@I+R<\Oedmxsըy̟}ŗŶ̲ү֧~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~"- 7@I+R<[Pddlyrӭwʤzœ~÷ʲҮئڡաաաաաաաաաաաաաա"- 7@H+QG(N9TNYe`{fjmoruxz}tqqqqqqqqqqqqqqq!, 5>G'M8RLWd_zfjloqt|wv|qnnnnnnnnnnnnnnn!, 5>F%M6OLUc_xeiloq~txws{nkkkkkkkkkkkkkkk!, 5>F"K4OLTb^tdimorzttxp{khhhhhhhhhhhhhhh!+ 4 =EI5NLS_]pd}inq{tvwqym}iŁfąfąfąfąfąfąfąfąfąfąfąfąfąfąfą *3 <BI5MJR[]ietj}o|swwszo}lрhЄeχeχeχeχeχeχeχeχeχeχeχeχeχeχeχ )13 B!H5LFQU]`ejlq}qvwvzsy}o|l߀iރg݇e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉%"2A"E3JAQM]Vf^}ndvshrxkn|mlojpgresctctctctctctctctctctctctctctct1>"B/H:PD\K{gQtnVosYlx[i|]g^f_d`baababababababababababababababab 2:?*F3O:x[@qfElmHhsJfwLd{MbNaO`P^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q  05<$|D+sM1lX5gc9ck;aq=_u>]y?\|@[AZAYBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXB+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>F%P4ZEdWmiw{}ٖюˈǂ~zwuµqórrrrrrrrrrrrr* 5=F%O4YFcXlku}ߣ{՛͒Nj…|ùyǵvʭuƫvīvīvīvīvīvīvīvīvīvīvīvīv* 4=F%N4XFaYjlsݨxӟ~ʖĎŷ˴|ϫxϥyȤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤy* 4=E%N4WF`YimqܬvФ{Țŷ˴βѤ|џ}ʞ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}* 4<E$M4WF_YgnoڱtϨyş}Ƶ˯ϪҞә̘ʘʘʘʘʘʘʘʘʘʘʘʘ* 4<E$M3VF^Zfomٶsͭwĥ{Ʈ̨ϢҙӔ͓˓˓˓˓˓˓˓˓˓˓˓˓* 3<E$L3UF]Zeolػq̲uí|ƨˡЛӔԏΏˏˏˏˏˏˏˏˏˏˏˏˏ* 3<D#L3UE\ZdojoʹtzƢ˛ϕҏԊΊ̊̊̊̊̊̊̊̊̊̊̊̊* 3<D#L2TE\Zbphmżsx}ŝ˕ϏҋӆΆ̆̆̆̆̆̆̆̆̆̆̆̆) 3;D#L2SEZZ`pflqw|ŗʐΊхҁ΁́́́́́́́́́́́́) 3;D"K1RDYY_pdjoty}Ðȉ̃~}|||||||||||||) 2;D!K1QCWY]ocimptx†}ƀzvvwwwwwwwwwwwww) 2;C K/PBVW[nchlnqt~xw|rmmnnnnnnnnnnnnn) 2:CJ.O@RWZmbgknqtywt{njgfffffffffffff) 1 :BJ+L?QVYka|gknq{tuxp{lhdccccccccccccc(0 9BG(L@QUXhawglo~sxvryn|ifbaaaaaaaaaaaaa'/ 8 AF*L@PSWcapg{mqzutyp|lh̃dˈaʍ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ&-4<F+J>OOW\ahhqnx{s}uxq{mjڃgنd׋a֐`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց#&)<D+H;MIWTa]je|pjvvnqzqm~tkvhwfycza|`|`|`|`|`|`|`|`|`|`|`|`|`|( ;A)F6LAVKaR{kWtq\ov_l{aicgdefcgah_i_j_j_j_j_j_j_j_j_j_j_j_j_j ) 9>&D0K9T@xaFrjJlpMivPf{QdScTaU`V^W]X\X\X\X\X\X\X\X\X\X\X\X\X\X )4:!A)zI0rR6l^:hh=do@atA_yC^}D]E\E[FZGXGXHXHXHXHXHXHXHXHXHXHXHXHXH* 06w>"nG(fP,aZ/]d1[l3Yq5Xu6Vy6V|7U7T8S9R9R9R9R9R9R9R9R9R9R9R9R9R9R9) 5;D!N-YFI3NIT]\nc}imq{usxn|ieb_^^^^^^^^^^^^$,4 =BI3NHRZ[icvio~swwq{lhʃdɈaǎ^ƕ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ#*25 BH4LFQU[bdmkvp}yuszn~kׂgՆdԋaӐ^і\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ!&%3B!G3KBPO[Zecljzrptxto|wlzh|f}c`^ߖ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ3@"D0I=PH[PeWzm]tsaoydk~ghifjdlbm`n]p\q\q\q\q\q\q\q\q\q\q\q\q 3< B,H6O?ZFxeKqmOlsRiyUf~WdXbYaZ_[^\\][^[^[^[^[^[^[^[^[^[^[^[^  39?&F.zN5sX:mc?ilBerDbwF`|G_H]I\J[KZLXMWMWMWMWMWMWMWMWMWMWMWMWM! .4; vC'mL,fT0b`3^i5\o7Zt8Yy9X}:W;V;UR>R>R>R>R>R>R>R>R>R>R>" )~0s8i@bI#[Q&WZ(Ub*Ri+Qo,Ps-Ow.Nz.N}/M/L0K0K0K0K0K0K0K0K0K0K0K0K0K0(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(39BK'V4aBmPw]hr냒{}xtronlk›iʜfʜfʜfʜfʜfʜfʜfʜfʜfʜfʜfʜ'28AJ'T4_CjQt_~l펈x燏―{wtqomlægæiǡiǡiǡiǡiǡiǡiǡiǡiǡiǡiǡ'1 7@I'S4]ChSrb|pꔅ}㋋݄~zuromikmĥmĥmĥmĥmĥmĥmĥmĥmĥmĥmĥ'0 7@H&R4\DfTpdys瘂ߏوҁ{vspmknppppppppppp&0 6?H&Q4[DdUnewvܔԌ΄}xutpoqsssssssssss&/ 6?G&P4YDcUlgux|٘ѐʇł|ztrtvvvvvvvvvvv&. 6>G%O4XDaVjhszz͔֝ƍ}yvxyyyyyyyyyyy&. 5>F%N3WD`Vhip{ުwП|Ǘ~y{}}}}}}}}}}}&- 5>F$M3VD_Vgin}֬sʣz~&- 5=F$M3UD]Vej߸k~ЯqŦx~%, 5=E#L2TC\Vcjڻi~̲pv|‹Š%, 4=E#L2SC[VajԿh~Ƕntz†„%, 4<D"K1RBYU`jf}¹lrx~€%, 4<D!K0QAXT^ie|kpv|}{yzzzzzzzzzzz%+ 3<D J.P?VS]hc{iotzzwtsttttttttttt$+ 3 ;CJ,O=UQ[gbzgmrx~ytpnmnnnnnnnnnnn$*2 :BI)L;SQZe`xfkpv|xrmjgghhhhhhhhhhh#)1 :BG%K;QPYc_tejosuxn}iea__bbbbbbbbbbb!(08 @E&K;OOW`_of|lqzuszlgDŽcƊ_đ\ęZäZİZİZİZİZİZİZİZİZİZİZİ &.3<E(J;NLV[_hgsm|~rvxp}kԂf҇cь_ϒ\ΙY΢XͫXͫXͫXͫXͫXͫXͫXͫXͫXͫXͫ#&);D)I:MHUU_`hhopxuurzym}ie߉bݎ_ܓ]ۙZڡX٨X٨X٨X٨X٨X٨X٨X٨X٨X٨X٨) ;C(G6LCUM_Vi]ypbsvgn|jjmgodqar_t]uZwXxXxXxXxXxXxXxXxXxXxXx ) ;@&E2KG"R-]:iGtS~_ir}yxtpmkjiȓfϕdѓeԎeԎeԎeԎeԎeԎeԎeԎeԎeԎ&0 5=F!P-[;fHqV|bmw耕zuromkiɞeɞg͘iѓiѓiѓiѓiѓiѓiѓiѓiѓiѓ&/ 4=F!O-Z;dIoXyeqꋌ|䃒}xtpmkf§hƢj˛lΖlΖlΖlΖlΖlΖlΖlΖlΖlΖ&. 4<E M-X;bJlYvhu珉ڀzupmkhkæmȟo̙o̙o̙o̙o̙o̙o̙o̙o̙o̙%- 3<D L-W;`KjZtj~y䓆܋Ճ|wtspknpƢrʜrʜrʜrʜrʜrʜrʜrʜrʜrʜ%, 3;DK,U;_Kh\qlz|ߗՎͅǀ{xvupqtĤuɞuɞuɞuɞuɞuɞuɞuɞuɞuɞ%+ 2;CK,T;]Kf\onvՙ}̑Ŋ|zytuwæyǠyǠyǠyǠyǠyǠyǠyǠyǠyǠ%* 2:BJ+S;\Kd]loۥsΝzŕ~}zy{|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ%* 1 :BJ+R:ZKb^jpөpȠw~}ţţţţţţţţţţ$) 1 9BI*P:YKa^ܵgqάoäu|ĥĥĥĥĥĥĥĥĥĥ$) 1 9AI)O9WJ_]ֹfpɰmszææææææææææ$) 0 9AH(N8VJ^]Ѽeoijkqw~ææææææææææ$(0 8@H'N7UH\\̿coipu{~{}}§}§}§}§}§}§}§}§}§}§$(/ 8@G&M5TF[[bnh~nsz~zxuwx§x§x§x§x§x§x§x§x§x§#'/ 7?F#L2REYZ`lf|lrx~}xtqopr§r§r§r§r§r§r§r§r§r§"'. 6>F K.PDXX^kezjpu|}vqmjijkækækækækækækækækækæ &-5 =DH-OBVV]hcxhnt}zvpkgecdeŤeŤeŤeŤeŤeŤeŤeŤeŤeŤ%,3 <@H.MBUT[eatfl~rvyoƁjʼneŒbĝ_ħ]Ĵ^Ĥ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ#)14 AG.LASRZaanhynzur|k҂eψ`͏\̗ZˠX˫W˺Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙ %$2 @G/K?QNZZbejn}ruux{o~i݄dۊ`ّ]ؘZ֠X֨VմTTTTTTTTTT1@E.JC+H7OAYI}cPwmVptZkz^hadcae_g]hZiXkVlTmTmTmTmTmTmTmTmTmTm 2;A'G1N9zX?sbEnlIisLfzOcQ`S^T\UZWYXWYUZT[T[T[T[T[T[T[T[T[T[Ϳ!17>"}E)uM0nU5i`9ej_w@\~BZCYDWEVFUGSHRIQJQJQJQJQJQJQJQJQJQJϸ#-3y;pC"iJ'bR*]\-Ze0Xm1Vs3Ty4S~5R6P7O8N8M9L:K:K:K:K:K:K:K:K:K:K:"( v/m7e?^GXN!TW#Q_%Ne&Ml'Kq(Jv)I{*H*G+F+E,D,C-C-C-C-C-C-C-C-C-C-t# i*`2Y:SBNIKQHXF]DcCgAl@p?t >x =| qJ}U^g{nvsrxo}ligƆeψb׊aوb݂ccccccccc}y&|. 2:CL'X3c?nLzWbk~syztpljhƏfђbђdՌeۆf݂f݂f݂f݂f݂f݂f݂f݂f݂}z&, 1 :BK&V3a@lMvZfp삔y{uqmkișd˛eΗgґh؊iۆiۆiۆiۆiۆiۆiۆiۆiۆ~{&+ 1 9BJ&T3_AiOs]~j쌈u煑~xrmlkŠgǠh˛jДlՍlىlىlىlىlىlىlىlىlى~{%* 0 8AI&R3]AgPq_{m參zއ~xtqonkţkȟm͘oґp֌p֌p֌p֌p֌p֌p֌p֌p֌|%)/ 8@H%Q2[AdQnavpܑ~҉˂}xusrpæoƢq˛sГtԎtԎtԎtԎtԎtԎtԎtԎtԎ|%(/ 7?G$O2YAbRkbޞrsҕzʍÇ}ywvvsåuɞwϖwґwґwґwґwґwґwґwґwґ}%'. 6?G#N1WA`Rhd֢pt̙wÒ~{zywyǠz͘{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ~$&. 6>F#M0V@^RݮfdХnsƝu|~}{}Ƣ~̙ДДДДДДДДД~$&- 5=E"L0T@]Qײdc˩lsszŤ˛ϕϕϕϕϕϕϕϕϕ$%- 5=E!K.R?[Qѵccƭjrqw~ĥʜΗΗΗΗΗΗΗΗΗ#%, 4 <DK-Q=ZP͸abhqo~u|æɝ͘͘͘͘͘͘͘͘͘"$,3 <CJ+Q;XOȼ`agpm}sy|zzæ{ɞ|͘|͘|͘|͘|͘|͘|͘|͘|͘!$+3 ;BI(O9WN^`eok|qx~}xussæuɞv͙v͙v͙v͙v͙v͙v͙v͙v͙ #*2 :AH%M8UL]^cnj{ov|{vqnlmæoɞp͘p͘p͘p͘p͘p͘p͘p͘p͘")08@F K6TK[\blhxnsz{uokhffŤhʜi͗i͗i͗i͗i͗i͗i͗i͗i͗!'/6 >CJ4RHZZ`ifvlr{xtnieb`_Ša̚bϕbϕbϕbϕbϕbϕbϕbϕbϕ %+18C I3QFXW^edrj||ptwn~hÇc_\[³ZŚ[ϕ\ґ\ґ\ґ\ґ\ґ\ґ\ґ\ґ\ґ!"%7C"H3ODVS]`ck~juup}nwgbЇ^БZМXЧVеUǑVԎV֋V֋V֋V֋V֋V֋V֋V֋V֋&7B#G2L@UM]Xeaylirtol|tgxb{^~[XߧUޱS޾R҃Q܂Q܂Q܂Q܂Q܂Q܂Q܂Q܂Q܂ &8@"F0K!D,J5S>y]ErfJmoNhvRd~UaW_Z\[Z]W^U`SaRaPbPbPbPbPbPbPbPbPb ָ ) 5;B&}I.uQ4o[:ie>enAbuD_|F\HZIXKVLUMSNQOPPOQOQOQOQOQOQOQOQOQگƼ+ 18y@ pG&iO+cX/_b2\k4Zr6Xx8V9T;RN>M?K@JAJAJAJAJAJAJAJAJAȵ & -u5l=eD^L"XT%U]'Re)Pl*Ns+My,L-J.I/H0G0E1D2C2C2C2C2C2C2C2C2C2 }!r( h0`8Z@THOOLWI]Gc Ei Do!Bt"Az"@#?$>$=%<%;&;&;&;&;&;&;&;&;&znd# \+ U3O;IBFIBO@U>Z<_;d9h8m7r6w5|43222222222pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl(k1 u6 {<FP!^*~k3{x;xBuHrMpQmTkWiZg\e^b_`a^b\c[dZdZbZbZbZbZbZbZbZbqm(n0 x4 ;DN![+h4u=|EyLvRrVoZm^jahcfecgai_k]l[m\h\g\g\g\g\g\g\g\grn(q. {2 :CL!Y+e5r?~H|PyVu\r`ndlhikgmdpar_s\t\q^l^k^k^k^k^k^k^k^kso't-~1 9BK!V+c6oA{KS|[xatgpkmojshvexbz_|]{_v`p`n`n`n`n`n`n`n`ntp'v+/ 8@I!T,`7lCwMW`zgvnrsnxk|hf͂b؄_܅`azctcrcrcrcrcrcrcrcrtp&y*. 7?H R,^8iDtP[e}nwur|njgeʍbԎb؊c܄e~fxfvfvfvfvfvfvfvfvuq&|(- 6>G P+[8fEpR{_ꅅj~tx}rmjhhÑgђeԏgىh݂i|jyjyjyjyjyjyjyjyvr&', 5=FN+Y8cFmTwboڀ{zuqnlkk˕iДkՍlۆmm|m|m|m|m|m|m|m|vs%&, 4<DL*W8aGjVre،{sυ|zvspooĘm͘oӐp؉qނqqqqqqqqwt%%+ 3 ;CK)T8^GgWڙogϑxsNJ}zwtsrr˚sГt֌u܄uށuށuށuށuށuށuށuށxv$#*2 :BJ(R7\GޥdXѝmfȕus|}{ywvwʜwϖxԎxۆx݃x݃x݃x݃x݃x݃x݃x݃xx##*1 :BI'P6ZFةcW̡kfšrrz|}{{{ƞ{͘|Ӑ|و|܅|܅|܅|܅|܅|܅|܅|܅yz"")1 9AH&O4ߴYEҭaVǥieprw|~ž̚Ғ؉ۆۆۆۆۆۆۆۆy{!"(0 8@G$N3۸WDͰ`V©gdnqu{|˛ѓ؊ڇڇڇڇڇڇڇڇz} !(/ 7?F"N0ռVCȴ^Ufclps{z~~ʜД֋ووووووووz!'.6 >EL/пTBķ]Sdbjoqzw~}zxwʝyϕy֌y؉y؉y؉y؉y؉y؉y؉y؉{ &-5 =DI.SA[Rbainoxu|{wsqpȝrϕsՌt؉t؉t؉t؉t؉t؉t؉t؉|%,3 ;BH,R@ZQa_glmwtzzupljiślДm֌m؉m؉m؉m؉m؉m؉m؉m؉}#)18 :F*P>XO_]ejktq}xztnifcbØeѓf֋gىgىgىgىgىgىgىgى~!&,19D(N;VL]Zcgiqoyzvs}mhc`^\”^Ӑ_ى`چ`چ`چ`چ`چ`چ`چ`چ  ,;D%L8TI[Wachl{nusu{l|gb^ZXWX׋Y܅Y݃Y݃Y݃Y݃Y݃Y݃Y݃Y݃,;D%K5RDYR`]|fftmnlttf|yaͅ}\̎Y̙V̥T̳SąS݃S~T}T}T}T}T}T}T}T} , <C%H3P@YK~`Tvh\oobhwhcl^ވpZޑsWޛuTާwRߴxPxOxOuOtOtOtOtOtOtOtOt۸ - ;A$G/N:~XCwaJpiPjqUeyYa\]_ZaWcUeRfQgOhNhMhMhMhMhMhMhMhMh ݮ̼ / 9?!F*|M2uW9n`?iiCdqGayJ]LZOXQVRSTQUPVNWMWLWLWLWLWLWLWLWLWδ / 6=xD$pL*jT/e^3ag7]o9ZvV?SAQBPCNEMEKFJGIGIGIGIGIGIGIGIGѮ"+ ~2u:lBeI"_Q%ZZ(Wc+Tk-Rr/Py0O1M2K4J5H5G6F7D8D8D8D8D8D8D8D8D8{' q.h6a>ZFUMQUN] Kd"Ik#Gq$Fx%D&C'A(@(?)=)<*<*<*<*<*<*<*<*<*wm"d* \2U9PAKHHOEVB\@a>guEqKoPlTjXh[f]d`ab^c\e[fZc[`][][][][][][][][ie(n+x. 6?HS%`/l8|yAxItPqVnZk_hbfedhbk_m]n[m\h^d________________jf(q){, 5 >GP%]/i:uD|MxUs\oblgikfocrau`w\x^r_m`hbcbcbcbcbcbcbcbckg't'+3 <EN%Z0f;qF|Q|Zvbqilphudzb~aa_~awbrcmdgdgdgdgdgdgdgdglj&w&*2 ;CL$W0bF M-X<٠aL͘jYőreznv}}ywuttƏu֋v݃v|vtvtvtvtvtvtvtvtou%-5 =EL+߫W;Ҥ_KȜhYodwnv}~{yxxzՍzۅz~zvzvzvzvzvzvzvzvpv%,4 <CK)گU:ͨ^J fXmdun|v}~}}ӏ~ڇ~~w~w~w~w~w~w~w~wpx$+2 :BJ'ԳS9ȫ\IdWkcrmyu|Αو߁yxxxxxxxqz#)1 9@ݼH%϶R8ï[HbVjbplwu~||{ˑ|؉}ނ}z}y}y}y}y}y}y}yq|"(/7 ?F$ʺP7YGaUhankut|{|xvtȑv؊w݂wzwzwzwzwzwzwzwzr &-5 <D#ŽO5XF_Tf`mjsszzzuromŐp؊p݃q{q{q{q{q{q{q{q{s$*15B!M4VD^Rd^khqqxx~ytokhgŽi؊j݂k{k{k{k{k{k{k{k{t %*2 AL1TB\Pb\ifonvuy}{smheb`bوcށezezezezezezezezv0 ?J/R?ZMaXgbmkytqr{wl|gb^\Z[ڄ]^x^x^x^x^x^x^x^xz / =H,P;XI_Te^ylfrrlkzrfvaz\}YWUUVzXuXtXtXtXtXtXtXt 1 =F'N7VD]OzdXrj_kreeyj`ɂo[ɋrWȖuTȢwRȯxQxPwQsRoRoRoRoRoRoRoRo ߮м 1 =D&L3T>{\GscOkjVer\`z`[كdWٌgSٗjP٣lNٱmMmLlMjNgNgNgNgNgNgNgNg Ѵſ"3;B$I.{S6s\>ldDglIbtM^|QZTVVSYQZN\M\L]K]J\J\J\J\J\J\J\J\Ԭŷ$2:A xH'pP.jZ4ec8`k<]t?Y|BWDTFQHOJMKKLJMIMHMHMHMHMHMHMHMHMڣDZ'/ }7t?lG fN%`W)\`-Yi0Vq2Sx4Q6O7M9K:I;HD>D>D>D>D>D>D>ˬ$z, p4h<aD[KVS S["Pc$Mk&Ks'Iz)H*F+D,B-A.@.?/>0>0>0>0>0>0>0>0 v l( d0 ]8W@QGMNJVG\DcBi@p?x=; :!8"7"6#5#5#5#5#5#5#5#5#} rh_#X+ Q3 L: GACH@N=T;Z9_7e5k3r1z/.,+********xn cZRK$F,A3 <: 9@ 5E 2J 0P .T,Y*^(d&j%q#x" \"W-X3_6 c= eFfPe^dn"a|'_+^.\1[3Z5Y6X7X9W9V:U;TU>T?S?R@R@R>R>R>R>R>R>R>]!X,\0d3 h: kClNlZjj$gx)d.b2a6_8^:]<\>[?ZAYBWCVDUDTETETDTBTBTBTBTBTBTB^!Y,_.f2 l8 oAoLqWng%ku+h0e5d9b<`>_A^B]D\FZGYHWIVJUJUJVGVEVEVEVEVEVEVE^!Y+b-j0o6 r@tJuUrd&or-l3i8fxHyRw`'tn.p{5m;jAgEeIcLaN`Q^S]U[VZXXYYVZS[O[M[M[M[M[M[M[M` ])h)q+x3 |<}F~P}](yj0uv8q?mEjKgOeSbV`Y_\]^\`ZaZ`[[\W]S^Q^Q^Q^Q^Q^Q^Qa`'k&u)|1 :DMY(f2zr;u~CqKmQiVf[c_`c^f\i[kZk\f^a_\`XaUaUaUaUaUaUaUbc%o$y(0 9BKV(b3n=zyGuPpXk^fdci`m_o^p^q]q_kafbac\cXcXcXcXcXcXcXcf#r"}'. 7@IS(_4j?tKx~Ur^mejjgmepcsbtauavcqdjeef`g\g\g\g\g\g\g\ch!u %-5 >GO([4fAoN}yXw`sgollpisgvfxeyeyfvhoiiicj_j_j_j_j_j_j_dk x$,4 <EM'Y4bB׉lN΃uX}~axhtmprnulxj{i|i}jzlrllmfnbnbnbnbnbnbnbem{#*2 ;CK%V3ږ`AώiNLjrXza}hynusrwpzn}m~mn~pupoqhqdqdqdqdqdqdqdeo~")1 9AI#ޡT1Қ^@ȓgMoXwah}nzswxt{s~qqr؁txtqukufufufufufufuffq!(/7 ?H ئR0̞\@×eMmWta|hn~t{xy|wvuvтxzxsxlxhxhxhxhxhxhxhgs &.5 =߯FҩQ/ǢZ?cLjWr`yhntx}||zzz̓|||u|n|i|i|i|i|i|i|igu%,4 ;۳DͭO.æY>aKhVp_wg~nsx|ʄ}vojjjjjjjhx#*19 շBɰN-W=_JgUn_uf|msx|}{yDŽz{w{p{k{k{k{k{k{k{kiz!'.޽5 к@ĴL,V;^IeTl]sfylrw|{wtrăttxuqvlvlvlvlvlvlvlk}#)0 ˽?J*T:\GcRj\qdwkq~vy{t~pmkmnxoqplplplplplplpln!-=I(R8ZEaQhZobui~|oxtsyn|jgeehxiqjljljljljljljlq+;G&Q6XC`NfXm`~sgwzlrrlvhyd|`}_~^}avbpclclclclclclclt (9E#O3W@^KdT~k\wqcqxikmfrau]x[yYyXyZs\n]j]j]j]j]j]j]jy ܮһ %6B L/T<\GbPwiWpp^jwceh`l\oXqUsSsRsToVjWgWgWgWgWgWgWg ҳɾ#3 @J*R7ZAxaJphQjoWdv\_`ZňdVĒgSĞiPĬjOļkNjOhPdQaQaQaQaQaQaQa Ԫȶ %5 >H%P0xX:p_BigIcnO^vSYWUӉZRӓ]OӠ_Mӭ`KԾ`J`K^L\LZLZLZLZLZLZLZڢʯ (4=D"wN*oW2i_8cg=_oBZwEVISKPNMPKQIRHRHRHQHOHOHOHOHOHOHOͩ *3|;tClK#fT)a]-]f1Yn5Vv7S:PK@IAGBFCECDCDBDBDBDBDBDBDBѢ (y1 p9iAbI\P WY#Tb&Qj(Os*L{,J.H/F1D2C3A4@4?4?5?5?5?5?5?5?5Ī~u%l- d6]>XERMOUL\IdGkDs B|"A#?$=%;&:&9'8'8(8(8(8(8(8(8(zpg!_)X1 R9 MAIHEOBU@\=b;i9p7y5320//.......vlbZS$M+G3 C: ?A ;G 8M 5S3X1^/d-k+s)|'%$#"""""""~pg] TMGA$<+72480=-C*H (M &R $W "] c k s |          R%M/Q2W5Z< [EZOY]XmV{U"S%R'Q)P*P+O,O-N.N.N/N/M0M0L0L0L/L/L/L/L/L/L/S$M/T0Y4]: _C^N]Z[jZy!X$V'U)T+S-R.R/Q0Q1P2P2O3O3N4N4M4N2N2N2N2N2N2N2S$N.V/\2`8 bAbL`X_h]v"[&Y)X,V.U0U1T3S4S5R6R7Q7Q8P8O8O7P5P4P4P4P4P4P4T#P-Y-_0c6 f@fJeUceas#^(\,[/Y1X4W5V7U8U9T:T;SkHjShafp%c}*`/^3\6[8Z:XW?VAUBUCTDSDTAU?U\A[CYEXGWHVJVKULVJWFXCY@Y?Y?Y?Y?Y?Y?W"Y'c&k(q0t9 uCuMuY!qg)mt0j6fHR!~_+yk5su>nFiMeTaY_\]_\a[b[cZc\`_Z`UaQbMbKbKbKbKbKbKY!b nx#+3 <EN![+~f6xpArzKmRiXf\d_bb`d_f^g^h_fc_dYeUePeOeOeOeOeOeOZ eq|")1 :CL X+b7~lCxvLsSoYk^ibfeehcjbkblbkfdg]hXiSiRiRiRiRiRiR[ gt '/7 @IU*ۊ_7фiC}rLx{TtZq_ndkgijglfnfofojhkal[lVlUlUlUlUlUlU\jw%-5 >FޖR)Ґ\7ʉfBÃoL~wTy[u`rephmllnkpjqjqnkodo^pXpWpWpWpWpWpW^lz#+3 ;EכP(̔Z6čcBlLtT~|[z`wetirmppornsosrnsfs`sZsYsYsYsYsYsY_n}")09 ޥCџN'ǘX5aAiKqTy[`|eyjvmuqssstsuvpwhwbw\wZwZwZwZwZwZaq &.6 ة@̣L&œV4_@gJoSvZ~`e}j{nyqxtwuwvzr{j{d{]{\{\{\{\{\{\cs#*2Ҭ>ǦK$U3^?eJmRtY{`ejn~q}t|v}|v}~ske~^~]~]~]~]~]~]eu &۴.ί=êI#S1\>dIkQrYy_dinq|tyvwvvtylyfz_z^z^z^z^z^z^gw!շ*ɳ;H"R0Z=bGiPpXw^~di~myqvsrupvousmsft`t_t_t_t_t_t_izݹϺ(ķ9F P/X;`FgOnVu]|c}hxlsporltjuiulmmgn`n_n_n_n_n_n_l} տʾ&7DN-W9^DeMlUs[|zawfrjmniqfscsbsflgfh`h_h_h_h_h_h_o ڭ Ӹ #5BL*U7\AcJjR|qYvx^pckggkcn_p]p\p_kaeb`b^b^b^b^b^b^s ۥѱ˻ 2 @J'S4Z>aG|hOuoUovZj}_ecag]jYkWlVlXhZc[^\]\]\]\]\]\]x ߜҩɴ¾/ =H#Q/X:|_CufJomPitUd|Z_^[aWdTeRfQfRcT_U[VZVZVZVZVZVZ~ ֡ʭ +:EN*}V4u]=neDhlIcsN^{SYVUYR\O]M^L^L\NYOUPUPUPUPUPUPUݘͦ (7B}K$uT-m\5gc*=+;+;+:+:+:+:+:+:+:+~wog&`/Y7 T?OGKNGVD]Bd@l=u;~9765332 2 2 2 2 2 2 {r jaZ"T*N2I: EA AH >N;U8[6b4i2r/{-+*)('''''''zmd\TMH$B,>3:96@3E0K .Q +W )] 'd $l "v yk_VN GA<7$2*/0+6';%@"E JPV\dmw         I'D1K1P4R:RC QNO\MkLyKIHH G!G"F#F#F$F$F%F%F%F%F%F%F$F#F#F#F#F#F#I'F/M/R2U9UB TMRYPhOwNLK!J"J#I$I%H&H&H'H'H(H(H(H(H(H'H&H&H&H&H&H&J'H-P-U0X6Y@ XKUVTfRtQO!N#M%M&L'K(K)K*J*J+J+J,J,J,J+J)J(J(J(J(J(J(K&K+R+X.[4]> ]IZTYbWqU~ S#R&Q(P*O+N,N-M.M/L0L0L1L1L1M/M-M+M+M+M+M+M+K&N)V)\+`1b; bF`Q^_\mZz#X&V)U,S.R0Q1Q3P4O5O6N7N8N8O5P3Q1Q/Q/Q/Q/Q/Q/L%Q'Z&`(e/h9 hCgNeZbh _v%]*Z.X1W4U6T8S:R;Q=Q>P?P@Q>S;T8U5U3U3U3U3U3U3M$T$]#e%j-m6 n@mKkVhd!eq(b}-_2\6Z:X=W@UBTDSFRHQIRHTDV@X=Y:Y8Y8Y8Y8Y8Y8N$X!a j#p+s4 t>tHrRo_#kl*gw1c7`=]AZEXIVLTNTPTPSQTNWJZE\B\>\<\<\<\<\<\HT"~_.xi8ss@n|GkLhQeTcWbZ`\`^_^__bYeSgNgJgFgFgFgFgFgFWdp{"*2; DފQ!Ԅ\-~f8xoAtwHpMmRjVhYf\e_d`cacbe]iWjQkLkIkIkIkIkIkIYgs~ '/8 B֏N ̉Y-Ńc7}k@ytHu|NrSoWm[k^i`hcgdgdiamZnTnOnKnKnKnKnKnK[iv$,4ܚ?ϔLƎW,`7i@~qHzyNwStXq\o_mbldlfkfmdq\rVrQrMrMrMrMrMrM]ky!(0՞=ʘJT+^6f?nG~vN{}SxXv\t_rcqepgpgpft^vXvRvNvNvNvNvNvN_n{#ݥ+ϡ;ŜHS*\5d?lGsMzS}Wz\x`vcufthththx`zYyTyOyOyOyOyOyOap~ר(˥9FQ)Z4b>jFqLxRW\}`{czf}yh{yizyi||a~~Z~}U~}Q~}Q~}Q~}Q~}Q~}QcrߪѬ&Ǩ7 DO'X3`=hEoLvR}W[_~czfw~hu~is~ivbx[xVyQyQyQyQyQyQeuٯ̯$«5 CN&V1^;fDmKtQ{V[|_xbteqhnimiocr\sVsRsRsRsRsRsRhx ޠ ֩ Ҳ Dz"3 AL$U0]:dBkIrPyU{Zv^rbnekghhghicl\mWmRmRmRmRmRmRk{ ֣Ь ˵ 1 ?J"S.[8b@iHpNzwSu~Xp\l`hcdebf`fbbe\gWgRgRgRgRgRgRn ٛϦɯĹ/=H Q+Y5`>gEznKtuQo|UjYf]b`^b\cZc[`_[`VaRaRaRaRaRaRr ߓџɪ,:EO(W2^:yeBslHnsMizQdV_Y\\X^V_U_U]XXZT[P[P[P[P[P[Pw֘ˤ(7CL$U.y\6rc=mjCgqHbyL^PZTVVSXPYOYOXQTSPTMTMTMTMTMTM}ߏΝè#3 ?IyR(rZ0ka7fh.=.=.=.=-=-=-=-=-=-şztm f*_4Z= TEOLLUI]FeDnAw?=; 9!8"7"6"6"6"6"6"6"6"6"wo g`Z'T0O8J@ FH CO@V=^;e8n6w420/.-,,,,,,,uia [TN"I+D2@:+C(I%O#V!]eoz           ugXNHA ;61-")(%-"28=BHNU]g r }        ?*?0D0H3I9HBFM E[CiAw@?>>====<<<<<==========@*A.G.J1L7K@JK HYFgDuCBAA@@??????????@@@@@@@@*C,I,M/O5P>NI LVJdHrGFEDDCCBB B B!B!B!B!B!C CCCCCCCA)F*L)Q,S2T<TG QRO`MoL|JIHG!G"F#F#F$E%E%E&E&E&E&F$F#G!G!G!G!G!G!B(I'P&U(X/Z9ZD WOU\SjQwON!M#L%K&J'J)I*I*H+H,H,H,I*J(J'K%L%L%L%L%L%C(M$T#Z%^,`6`A ^L[WYfWrU~"S%Q(P*O,N.M/L0L2K3K4J4K3M0N-O+P)P)P)P)P)P)F%P!X _!d*f3f= eHbS`a]m Zy%X)V-T0R3Q5P7N9N;MR@QAPBPCPDPCR?U;W7X4Y2Y1Y1Y1Y1Y1M W`io%r-t7sAqKnXjd$en+ay3^8\IS'[0b8i>pDxI~MzQvUrXoZl\k\kYnRqMrHrGrGrGrGrGf u܏Ҙ̡Ȩ-<GQ%Y/`6g=nC}vHy}LtPpTlWiYf[e[eYhRkMlHlGlGlGlGlGi x֒͜Ƥ+:EO#W-_5f;}lAxsFs{KnOjRfUcX`Y_Z^XbRdMfHfGfGfGfGfGl|ފЖȟ(7 CM!U*\2|c9wj>rqDmyHhLdP`S]UZWYWXV[P]L_G`F`F`F`F`Fp֏ʚ$4 @JS'|Z.va5ph;ko@gwDbH^LZOWQTSSSRRUNWJYFYEYEYEYEYEuϓğ 1=H|P"uX*o_0jf6em;`u?\~CXGUJQLOMMMMMNIPFRCRBRBRBRBRB|׌ș ,: {DtNnV$h]*cd0_l4Zt9V|K=K=K=K=K=͒&z5sAlJfSa[#\b(Xj,Tr0P|3Mņ6JĒ9Gğ;EĮ#<$;$:$9$9#9$9$9$9$9$9$~si d_ Y+T5O>KF GN DWB_?g=p:{8653211111111~qe^ YSN'J0E9A@>H;O 8W 6^ 3g 1p .|,+)(''&&&&&&~pdXR MGC">*:2793?0F-M+T([&c#m!y            ~pcUKF@;73#/)+0(5%;"AGNU^htpbTF?94 /+'#!%*/4:@FN V `lx6-9.>.@2@8>A@J>W *C*F-G2F<EHCU Ab ?p=}<;;::::99999::::::::::9+A'F'J)K/L9KEHQ F^DlByA@@??>>>>==>>>>???????=(E$J#N%Q,R6QAOM LZJgHtGFEDCCBB B B!A!B"B"B CCDDDDDD@%H!O S!W)Y3X>VI RUQcOoM{KJI!H"G$G%F&F'E(E)E)F(G&H$I"I IIIIIC"LSY]&_0_:]E ZPX^UjSvQ!O$M&L)K+J,I.H/H1H1H1I.K+L)M&N%N#N#N#N#N#GPW^c#f,f6dA bL_Y\eYp V{%T)Q-P0O2N3M5M6L7L8L8M5O1Q.R+S)S'S'S'S'S'JT\ci l)m2l= iGfTc`_k"\u(Y-W0U3T6S8R:Q;PU?UATBTBUAW[AZCYDYEXFXF[@^;_7`3a1a1a1a1a1S]hpw|$-;zIuTq_$mh+jp1gy6e:c=a@`C^E^G]H]I\I_Db>c9e6e3e3e3e3e3U`kt{އ'ф7F{Qv[#re+om1lu6j|:h>fAdDcGbIaKaLaLcGeAgm:n7n7n7n7n7Ye q z ݎϏ ƍ2AMV"|_*xg0uo6sv:q}?oBmFlIjKjMiOiOjLmEo?p;q8q8q8q8q8[gs}ކٌ Ց ʒ0?JT!])}e0zl5ws:u{>sBrFpIoLnN|mO{mPznM|qF~sAt=u:u:u:u:u:]jvىҏϔ Ŗ.= HR [(c/~j5|q9zx=xBvEuI|sLyrNvrPtrPtrOvuGxwBzx>{y:{y:{y:{y:{y:_ lyރӋ͒ɗ,; GPY'a.h4o9v=}~A}{EyzIvxLswNpwPnwPmwOpyHr{Ct|>u};u};u};u};u};a o|نώȕÚ*9 ENW&_-f3m8t={{AwEtHp}Km|Nj|Oh|Pg|Pj~ImCn?olBhFeIaK^M]N\M^H`Cb?cHQ ~Y'x`-sg2on7ju];];];];];n~΋ĕ .; F~NxV#r]*md/ik4ds8`{<\?YBUESGQGPGQDS@UΨ&<κ&<&<%;%;%;%;%;%;%;%Óyod ^[ W-S:PDLN IW F_ChAq>|<߉:87665444444ymbXUQ M+I5E>BG?O=X :` 8j 6t 320.--,,,,,,,yl`UN JFC'?0;88@5G3O0W._+i)t' % $ # " ! ! yl_RHC?;7!4)00-7*>'D%K"S \frzl^PD<73 /+(!%'!-28?FMV`l {    {l^OB61,'# !&,1 7 >FOYft./3,7-80764?1K/X,f*t ) ( ( ( ( ' ' ' ' ' ( ( ( ( ( ) ) ) ( ( ( ( ( 0-6*9*;.:48<6I3V1c /q -~ - , , , , , , + , , , , , , - - - , , , , , 2+9(=(?*>0=:}==<<;;;;;;;;;<<======="DIMP&Q0P;NFKS H`FlExDCBAA@@????@@ABBBBBBB@HNRV#X,W7UBRM PZMgLrJ}HGFE D"D#C$C%C&C&D$E"F GGHHHHHDLRX]_(^2]=ZI WUUbRmPwNL"K$J&I(I)H*H+H,H,H+J(K%L"M MMMMMGOV^be$e-d8aC _Q\]XhVrT{"R&P(O*N,N.M/L0L1L2L1N-P*Q'R$R"R"R"R"R"JS[bhjk(k2i>fL bX_c\m Zv$X~(V+U.S0R2R3Q5Q6P7P7R3T.V+W(W%W%W%W%W%MV_ glpq"q,p:lH hTe_bh!_q&]y*[-Z0X3W5V7V8U:U;U;V7X2Z.[+\(\(\(\(\(PY c k ptvw%v6rD nPk[gd!em'bu+`|/_2]4\7[9Z;Y=Y>Y>Z;]5^1_-`*`*`*`*`*R\ f n t x{| {3wA tMpXla!ji'gq+ex/d3b6a8_;^=^?]@]A^?a8b3d0d,e,e,e,e,U_irx|  ́0|? xKuUq^!nf&ln+ju/h}3g6e9db@aBaBbAd;f5g1h.i-i-i-i-W alu{ӀЃ Dž-< }HyRv[ sc&pk+nr/my3k6i:hyn8zo4{p0|p0|p0|p0|p0[fr{ςɇĊ(8DNW|_$yf*wm.ut2t|6r9|q=yp@voBsnDqnEpnErp?sr9us5vt1vt1vt1vt1vt1]it}˅Ċ&5BLU]$~d)|k-zr2}xy5zw9vv HQY!`'{g+wn0su4o}7k;h>eAb~C`~D_~D`@b:d6e3f2f2f2f2dr~LJ .; FOWz^%ue*ql.ms2i{6f9b=_?\AZBYBZ?\:^6_2_2_2_2_2hv͂Œ +8CLyTt\"pc'kj,gq0dy3`7\:Y=W?T@S@T=V9W5Y2Y1Y1Y1Y1m{ȇ'5@ yJsRnYi`$eg(ao,^w0Z3V6S9Q;O&=&=&=%=$=#=#=#=#=#Ljsh`^[,W8TCPLMU J]GfDoAy?ȅ<ȓ:Ȣ9ɳ887766666th]S OM"K0I<FFDOAX?a5;>9G7P4Y2b0m.y,+ ) ( ' ' ' & & & & & th[OE> <96%4.17.?,G)O'W%a#l!zugZMB851.+)&%-#4 ;CKS]jxvgZL?5-*& # #)/5=E N XetwhZK>2'#   "(.5=GR^m~*-.+0+0..5)=%I#W!dr,+0(3(3+11-:+G(T&a$o"|""!!!!!!!!!""""""""""".(3%6%7'5-482D/Q,^*k)w('' ' ' ' ' ' ' ' ' ' '(((((((((2%7":!;#;);49@6M4Z1f0s. . . - - - - - - - - - . . . . . . . . . . 5";?@B&B1@<>H;U9b7n 6y 5 4 4 43333333444455 5 5 5 5 9?CFI#I-H8EDCP@] >i =t <;;::9999999::;;;;;;;=CHLOP(O3M?JJGW Fd DoCyBA@??>>>>>>?@@AAAAAAAGLRVW$V.T9QEOR M^ KiItH}FEEDDCC C!C!C!DEFGGGGGGDKQW[]]([3Y?WMTY RdPnNwLKJ J!I#H$H%H&H'G'I%J"KLLMMMMGO V \`bc!b,`:^H[T X_ViTrRzQ!P#O%N'M(M*L+L,L,M*O&P#Q RRRRRJR Z ` eghg$f5dDaP ^[\dZmXu W}#U%T(S*R,R-Q/Q0Q0Q/S*U&V#V!WWWWM U]di k lml1j@gL dWa`_i]q!\x$Z'Y*X,W.V0U2U3U3U3W-Y)Z%[#[![![![!O Wahmpp rq.o=lI iTg]debm!at%_|(^+]-[0[2Z4Y5Y6Y6\0]+^(_%_#_#_#_#Q Zdlqtu vv*t:qF nQkZibgi!eq%dx(b+a.`1_3^5^7^7^8_3a-b)c&d%d%d%d%S]gotxyzz(x7vD sNpWm_kg!jn%hu(g}+e.d1c4b6|b8zb9yb9yc4ze/{f+|g(|g&|g&|g&|g&U`jrx{}~~%}5zA wLtUr]pd nk$lr(kz+j.~i1{g4xg6vf8tf9sf:sg6ti0uj,vk)wk'wk'wk'wk'Wcmu{#2~? {JySv[tb ri$qp'~ow+{n.xm1ul4sk7pj9nj:mj:mk7om1pn-qn*qo(qo(qo(qo(Yepx~ 0=H}Q{Yy`wg#|un'ytu*vs}.sr1pq4mp7jo9ho:go:gp7iq2kr-ls*ls(ls(ls(ls(\hs{ .;EOW~^{|e"x{l&tys*qx{-nw0kv3hu6et8ct9at:at8cv2ev.fw+gw)gw)gw)gw)_lv +8C LUz\vc!sj%oq)l~y,h}/e|2b{5_z7]z8\z9\z7^{2_{.`|+a|)a|)a|)a|)boz(6A JzRuZqamh#jo'fw+c.`1]4Z6X7V7V6X1Y-[*[)[)[)[)fs~$2> yHtPoWk^he!dm%`u(]~+Z.W1T3R4Q5P4R0S,T)U(U(U(U(kxƒ ~/x;sE nMiUe\ac^j![r%W|(T+Q.N0L1K1J1L-M*N(N&N&N&N&p}~ zu*p7lA gJ cR_Y[aXhTp Qz#N&K)H*F,E,E+E)F'G%G$G$G$G$w„tol$h2d=_F [O XVT^QfNnKxH E"C$A%@%?%?#@"@!@ @ @ @ ~wjca^,Z8WBSKPS M[JcGkDuB?=;:99999999ymbVSR#P0M;JEGNEWB_ @h =r ;~8Ì6Û5ë333221111{ncXMD CB%@2?==G;P9Y6c4n2z0҈.Ҙ -ө ,Ӿ , + * ) ) ) ) ) |ocWLB9 542'120=.G-P+Z*e(q&%#"!  }pcVK@6/-+)"'+%4#<!ENXdqqcVI=3*&$ !")19AJUa o   rcVH;0&  $ + 2;DO\k}sdVG:.# $+3=IVfx%+()))(,#2;GUbp|()+&,&+)(/"8 DR_ly*&.#/"/%,+*5'A$N"[ ht."243 2&22/>,J*W'd&p%{$$$$$$$$$$$$%%%%%%%%%2688:#9-8:5F2R0_.k-v,,+++++++++,,, , ,,,,,,5:=?AA)@4=A:M8Z6e5q4{3 3 2 2 2 2 2 2 2 2 2 3 3 3 3 4 4 4 4 4 9>AEHH$G/D;BG?T>`>>>>>>?@@AAAAA@F K Q STT"R-P;OIMUK` IjHsG{FEEDCCCCCCEEFFGGGGDJPU X YXW$W5UDTPR[ PeNmMvL}KJIIH H!H"H"H"IKKLLLLLG MTZ]] \]]0\?ZLXW V`TiSqQxPOO N!M#M$M%L&L&N"OPQQQQQIPX^bca bc,b;`H]S [\ZdXlWtU{T T"S$R%Q'Q(Q)Q*R&T"UVVVVVLS\bfhggh(g8eEcP aY_a]h\pZwY!X#W%W'V)V*U+V,W)X$Y ZZZZZNW_fjlklm%l5jBgM eVc^be`l_t^{!]$\&[(Z*Z,}Z-|Z.{[+|\&|]"}^}^}^}^}^PYcjnpppq"p2n?lJ jSh[fbeicpbx!a$`&}_){^+x^-v^.u^/t^-u`'va#wb wbwbwbwbR\fmrtttut/r=pG nQlYj`ighnfu!}e}$zd'wc)uc,rb.pb/ob/nb.od(pe$qf!qfqfqfqfT_ipuxxx yx-w:uE rNpVo^md}lkzks wj{#ti&rh)og,lf.jf/if0hf/jh)ki%li"lj lj lj lj Wblsx{|| }|*{8yC wLuTs[{rbxpiuop rnx#om&ll)jl,gk.ek/dk0bk/dl*fm&fm#gn gn gn gn Yeov|(5~A|J ~zRzxYvw`svgptnmsv#jr&gq)dq+bp-`p/^p/]p/_q*`q&ar#br br br br \irz%3>~H yPu~Wq}^n{ekzlhyt"ex}%bw(_v*\v,Zu.Yu.Xu.Yv*[v&\w#\w \w \w \w `lv~!0~;yE tNpUl\icfjbr _{#\~&Y})W|+U|,S|-R|-S|)U|%V|"W| W| W| W| dpz},x8sBnK jSgZca`h]pZy!V$T&Q(O*M*M*M'O$P"PPPPiu~ yu(q5l?hH dP aW]^ZfWnTwQ N#K%I&H'G'G$H"I JJJJn{upm#i0e;aE]M ZT W\TcQkNtKHE C!B"A"A BBCCCCuyjec`+]6Y@VISQ PY M`JiGrD}B?=<;;;;<<<<|}qdZWU#S0P;MDKMHUE] Ce @o >z;97655444444th\PI HF'E3C=AG?P=X:a8k6w4 2 0 / . . - , ,,,,vj^RG=876'534=3G1Q0[.e,q*)̐'̡&ʹ%%$#####xk_RG=4+ &%%%$0#;#E"P![ hvއߙ߬yl_RF;1)!'09CNZgw {m_RE9/% % - 5 ?JWfw}n`RD7,"  '0:ESbupaSC6*  !)4@N^r )"'"'*09E S ` m y             #&%$%$#',5BP]jv         &#( ( &""( 2?LYeq|*,,+)$(/%;"HTamw-0101 0*.6+C(O&\$g#r#|""""""""""###$$$$$$$146798%613=1J.V-b,m+w+*********++,,,,,,,,59: >@? =*;78D6Q5\4g3r3{222111 1 1 1 2 2 3 3 3 3 3 3 3 3 9= @ D FED#A/?<>J=W>>>>>>?@@@@AAA? DJNPO LLM0M?LLKWIa Hi GqFyFEDDCCCCCDEFFFFFFBGOSUUR ST+T;RHQRP\ Nd MlLtK{JJIIHHHHIJKKLLLLEKSX[[XXZ'Z7XDWOUX T` ShQoPvP~ONNMMM M MOPPPQQQGOW]``^]_#_3^@\KZT Y\XdVkUrTzTSRRQ!Q"Q"~R!~S~T~U~U~U~U~UJR[adecbc c0b=aH_Q ^Y \a[hZoYvX~WW}V!{V"yV#wV$vV$vWwXwYwYwYwYwYLV_ehihg hh-g:eEcN bW a^_e^l]s~\{{\y[vZ!tZ#rZ$qZ%oZ%p[ q\q]q]q]q]q]OYbhlmlk ll*k7iChL fT e[cb}bizapxaxu`s_p^"n^$l^%k^&i^&j_!k`kalalalalaQ\ekoqqoop'o5n@lIjR ~iY{h`wffufnrevpd~mckc"ib$fb%eb&db&dc"edfdgdgegegeS_hosuusst$s2r>pG}oO ymWvl^skdpjlmjski|hhfg"cg$af%`f&_g&_g"`hahbhbhbhbhWbkrwyywxx!x/w;|uExtM trUqq\npckojhnqfnzcm`l!^l#\k%Zk&Yl&Zl#[l\m]m]m]m]mZfov{~~||}}-||9wzCsyK pxS lwZivafuhctoasx^r[r Yq"Wq$Uq%Tq%Tq"VqWqWqXqXqXq^isz {)v6r@nIj~P g}Wd|^a{f^zm[zvYyVxSx!Qw"Pw#Ow#Ow!PwQwRwRwRwRwbnw} xt&p2l=hFeN aU ^\[cYkVtS~PNL J!I!I~J~K~K~L~L~L~gs||uom!i.e9bB^K[R XY VaShPqM{JHFDCCDDEEEEmxylfca)^5Z>WGUORV O^ LfJoGyDB@>===>>>>>ssd\ YW"U/R9PCMKJSHZEc Cl @v>;9877666777{wk_RMKJ'H3F=DFBN@V>_;h9s7 4 2 1 0 0 / / / / / / {ocWKA>=;):49>7G6P4Z2d0o.|,*)(('&&&&&~qeYMB8/ -,+)*3)=(G'Q&\%h#v"Ɔ ƘƫsgZNB8/& %/:DP]k|׏ؤٻuh[NB7-$ # - 7 B O ]mwi[NA5*!  "*4?L\myj\N@3(  &0<IZm{l]O@2&  !+7FXk&$$'- 6CP^kv#!!#)2 @ MZgs}""!$/<IV b n y         %&%! !+7EQ^it})*)'(''#3 ?LXdnx-.. //.!,-)9&F$S"^"i!s!|!!!!!!!!""##$$$$$$$02 36 652%02-?,L+X+c*m*v**********++,,,,,,,4 69<< ;85)473F4R3]3g3p2x222211122 2 3 3 3333337:>AA? <:;1<@DGHF@ BD+D;DHCSB\BeAl@t @{ ? ? >>>>>>??@@ A A A A =CINONIIJ&K6KCJNIWH`Gg Fo Fv E}EDDCCCCDEFFF F F F @GOSUTPOP"Q2Q?PJOSN\Mc Lj Kq JyJIIHHHHHJJKKKKKCKSXZZWTVV.V;UFTPSXR_ Qf PmOtO|NNM~M|MzMyMxNxOxOxPxPxPxPFOW\__\Y Z[*[8ZCYLXUW\ Vc UjTqSy}SzRxRvQtQsQqQqRqSqTrTrTrTrTHS[`cca^ __'_5^@]J\R[Y Z` }Yg{XnxXuvW~tVrVoVnUlUkVkVkWkXlXlXlXlXKV^dghfbcd$c2b=aG`O}_V z^] w]d u\ks\sp[{n[lZjZhYfZeZeZe[f[f\g\g\g\NYagjljggg!g/f;eD{dMxcT ub[ raa paim`pk_yi_f^d^b^a^_^_^`_a_a_b_b_b_Q\djnpnkjkk,~k8zjBviJshRpgY mf` keghdnfdwdcac_b]b[bZbZb[c\c\c]c]c]cU_hnrtsoo o}p)yo5un?rmHnlPklW ik^ fjedilaiu_h\hZgXgVgUgUgVgWgWhXgXgXgXckrvxwss |txt&tt2ps=msFjrNgqU dp\ apc_oj\nsZn|WmUlSlQlPlOlQlQlRlRlRlRl\gov{||xzyuyrz#nz/ky:hyCdxKawR_wY \v` YuhWtpTtzRsOsMrLrJrJrKrLrLrMrMrMr`kt{z~snkh,e7b@_H\~PY~WW}^ T|f Q|nO{xL{JzHzFzEzDzEyFyFxGxGxGxepywkf c`'^3[<XEVMSTP[Nc Kl IvFDB@?>??@@@@kvse] ZX!V-S8QANILPJXG`Ei Bs @ ><:98889999r}zm_TONL'J2H<FDDLBT@\>f;p9|7 5 3 2 2 1 1 1 1 1 1 zrfZNE B@?*>4<>;G9O7X5a3l1y/-,+**)))))vj^RF<5 32!1+/5.>-H,Q+[)g't&$#"!!  zm`UI>3*$ "! !* 3=GR^l|}obVJ>3*! %/:F R ` p ΃ Η ά qdWJ>2(  $.9ERbsވߝ߳seXJ=1&  "+6CRbvugYK</$  '3@QcwwhZL<."  #/>Obw#!!$*3AN\ht~  %0=KXdpz! , 9FS_ku~ (4 A N Zfpy ##!#/;IU`jt|'' % & %# (5BOZenw+ ++- ,)& #-!:HT _ h q!y!!!!!"""##$$$$$$$$//232/+'"'2)A*N*Y*b*k*s*z******+++,,,--,,,238995. /1,3;3H4S3\3e3m3t2{222222223344444458>BB?88:&;6EIJGA?A!B1C>CIBSA[Ab@j@q?x?? > > > > >?? @ @ @ AAA<CJOPNIFHI,I:IEHNGWG^FeFlEs E{ D D DCC~C|D{DzE zF zF zF zF zF >HOTUTPL MN(N6NAMKMSLZKaKhJo Jw ~I |IzHxHwHuHtIsIrJrJ rJ rJ rJ rJ BLSXZYVRRS$S2S>RGQPQWP^~Oe{Ol yNs wN{ uMsMqMoMnMlMlMlNlOlO lO lO lO EPW\^^[VVW!X/W;VDVM|UTzT[wTbuSh sSp qRx oRmQkQiQgQfQeReRfSfS fS fS fS ISZ_bb_ZZ[[,[8}[AzZJwYQtXXqX_oWf mWm kVv iVgUeUcUaU`U_U`V`VaWaW aW aW LV^cffd^^__)|_5x_?t^Gq]Oo\Vl\\j[c h[k fZs dZ}bZ_Y^Y\Y[YZY[Z[Z\Z\Z \Z \Z OYafijhbb ~czc&vc2sc<obElaLjaTg`Ze`ac_i a_q _^{]^Z^X]W]V^U^V^V^W^W^ W^ W^ S]djmnmg~g xgtg#qh/ng9kgBhfJefRceX`e_^dg \do ZcyXcUbSbRbQbPbQbQbRbRb Rb Rb V`hnqsqkxkrknlkl,hl7fl@ckH`kO^jV\j]Yie Wim Uiw ShPhNgMgKhKhKgLgLgMg Mg Mg Zdlrvwvyqqqkqhqfr(cr4`r=^rE[qMYqTWp[TpcRok Pot MnKnInGmFnEnFmFmGmGl Gl Gl _iqw{|{uxkwew ax_x$]y0Zy:XyBVxJSxQQwXOw`LvhJvr Hu} EuCuBu@u@u@t@tAs As As As dnv|re]YW U+S6Q>OFMNKUI]FfD~pB~{ ?~ =} <} :}:~ :| :{ :{ :z :z :z it|{n`UPNM&K0I:HBFJDRBZ@c=m;x97 5 4 3 3 3 3 3 3 3 pzuhZOG DCA*@4?==E;M:V8_6i4u20.-,,+++++xzmaUI?976"4,352>1G0P.Z-d+q)'&$###""""reYNB7.)('"&,%5$?#H"S!^ jyuh\PD9/&!*4>ITbq yk^RF:/%   (2=IWfwƋƠŶ{m`SF:.$ '1<IXi|ֿ֧֒~oaTF9-"  $.:IYkqcUG9,  !+8HZmteVH9+  (6GZn  !'0>LYepz!-:HUalv (6CP\gqz  $0>KWblu}  * 8EQ\fow !  #0>J V ` i q y %##$! '5COYcks{('**'" -< I S!]!e"m"t"|"""####$$%%%%%%%,-243.% %'')6*C+N+W+`+g+o+v+}++++++,,---.---03:=<91.0!203=3I3R3Z3b3i3p3w2222223344444443:ADDA;789+:8;D;M:V:]:d:k9r9z9999999:}:|;|;|;|;|;7@GJKIC> ?@&A4A?AIAQ@Y@`@g?m?u?}>}>{> z> x> w? u? t@t@t@s@s@s@;ELOPOJDEF"F0G<FEFNFUE\~Ec|DjzDqyDywDuC sC qC pC nD mD mE lElElElElE?IPTUTPJIJK,L8KBKJ|JRyJXwJ_uIfsImqIvoHmH lH jH hH gH fI fI fI fJfIfIfICMSXYXUNNOO)P5{P?xOGvOOsNUqN\oMcmMjkMriM|gL eL cL bLaM`M`M `N `N `N`N`NGPW[]]ZSR S|S%yT1uT<sSDpSLmRSkRYiR`gQheQpcQyaQ `P ^P \P[QZQZQ ZR [R [Q[Q[QJSZ_aa^WV zWvW"sX.pW9mWAjWIhVPfVWdV^bUe`Um^Uw\U ZU YU WUVUUUUU UU VU VU VUVUMW^beec\{[u[q[n\+k\6h[?e[Gc[NaZU_Z\]Zc[ZkYYuWY UY TY RYQYPYPY QY QY QY QYQYQZafhig}`u_o_k_h`(f`3c`<a`D__L\_S[_ZY_aW^iU^sS^~ Q] O] M] L^K^K^ L^ L] L] L]L]T^ejmmlxeodidedbd%`e0^e:\eBZeJXdQVdXTd_RdgPcqNc{ Lc Jc Hc Gc Fc Fc Fb Gb Gb GbGbXbinqrqtkiici _i\j!Zj-Xk6Vk?UkGSjNQjUOj]MjeJinHiyFi Di Ch Ai @i @h Ah Ag AgBgBg]fmsvwvpreq\pXpVpTq(Rq3Pq<OrDMqKKqSIqZGqbEplCpwAp?p=o ;p ;p :o ;n;n;m;m;mbksy{|{|mz`xVwPwNxLx$Ky.Iy7Hy@FyHDyOByWAy`?xiC=K;S9\7f5q310.----~-}-}-}nx}pcUKA;98"7,654=3F2O1X/b-n+{*(&%%%%%%%vvi\PD:1-,+$*-)6(?'H&R%\#h"w zmaUI=3*! $-6?JUapqdXL@5*" "+ 5 @ K X gxugZNA5+!  "+6AN\mxj\OB5*   "+5AP`rχϝϳzl^PB5) (4AQcw|n`QC5(  $1ASf|paSE6'  !.@Sh  $.<JVcmw *7ER^ir{ %3@MYdmv}  -:GS^hpx  &4AMXbjry  ,9FQ[dlsz   " 1 > J U^fmt{" #$! )7DNW`gnu|&'-/-'"1 =!H"R"Z#b#i#o#w#~#$$$$%%&'''''')06872+%')+*8*C+L+U+\+c+j+q,x,,,,,,-.....~.~..7=??<5/ /1&232>3H3P3X3^3e3l3s3|333}3|3z3y4w5v5u5u5u5u53=CEFC=668!9.999C9L9S9Z9a~9h|9oz9wy9w9u9t9r9q9o:n:n;m;m;m:m:9BHKKID><=>*?5??~?H|?Oz?Vx?]v>dt>kr>sp>|o>m>k>j>i?g?g?f@f@f@f?f?=FLOPOJDA BC&}D2zD<wDDuDLrDSpCYoC`mCgkCoiCyhCfCdCcCaC`D`D`D_D_D`D`DAJPSUSOIG }GyG"vH.sH8qHAnHIlHPjHVhH]fGdeGlcGvaG`G^G\G[HZHZHZIZIZHZHZHDMSWYXTN}KwKsLpL+mL5kL>hLFfLMdLSbLZaLb_Lj^Ls\K~ZKXKWLVL UL TLTMULULULULHQW[\\YSwOqOnPjP(hP2eP;cPCaPJ_PQ]PX\P_ZPgXPqWP{UPSPRPPP PP OPPPPPPPPPPPKTZ^``]|WrTlShTeT$bT/`T8^T@\THZTOYTVWT]UTeTTnRTyPTNTMTKTKT JTKTKTKTKTKTNW^bddbw[mXfX bX_X"]Y,[Y6YY>WYFVYMTYTRY[QYcOYlMYwKXIXHXGYFYEYFYFXFXGXGXR[afhigr`h^a] \]Z]W])V^3T^;R^CQ^JO^RN^YL^aJ^jH^uF^D]C^A^@^@^@]A]A]A\A\V_fjmmlogdd[bVbTbRc%Pc/Nd8Md@KdHJdOHdWFd_EdhCdsAc?c=cr@=rH;rP:rY8rc6rm4rz3r1r/r.r.r.q.p.o.o.ofovz|~}r}d|W{LzBy)G(P'Z&f$s#! t}~qeXL@6,% #"!% .6@IT`n~}wi]PE9.% $-7ALXg w {m`TH<0& $.8DP^nqcVJ=1&  %/9FTdvtfXK>1&  $.:GWi}ɔȪwhZM?1%  "-9IZn߅ߜ߲yk\N@1$   +:K^sm^PA2$ ):Mbx!+9GT_js{ '4BO[env~  "/=JU`iqy  )7DPZcksz "0=IT]emsz  (6BMW_fmtz -:FPX`gnu{   %2?IRZahov}#(*'!,8CLT\bipw     $,131-%  &!2"="G#O#V#]$d$k$r$z$%%%&~&}'{'y(x(x(x(x(+39;:6/('( )-*8+B+J+R+X,_,f,m},u{,~z,x,v-u-t-r.q.p/o/o/n/n/1:?AA>81./0(132=2F}2M{2Ty2[w2au2it2pr2yp3o3m3l3j4i4h5g5g5f5f5f46?DGGD?94 56$|7/y79w8Bt8Ir8Pq8Wo8^m8el8mj8uh8g8e8d9b9a:`:`:_:_:_:_:;CIKLJE?: {:w; t<+r<5o=>m=Fk=Mi=Sh=Zf=ad=ic=ra=}`=^=]>[>Z>Z?Y?Y?Y?Y?Y>?GLPPOKEz@u?q@m@(kA2iA;gABeAIcAPaAW`A^^Af]Bo[BzZBXBWBUCTCTCSCSCTCTCTCBJPSTSPJuEnCkDgE$eE.bE7aE?_EF]EM[ETZF[YFcWFlVFwTFSFQFPGOGNGNGNGNGOGOGFNTWXWT{NpJiH eHbI!_I+]I4[I<YICWIJVIRUJYTJaRJjQJuOJNJLKKKJKIKIKIKJKJKJKIQW[\\YvSkNdM _L\MZM(XM1VM:TMASNHRNOPNWON_MNhLNsJOIOGOFOEODPDOEOEOENENLU[^``^rWgS^QYQWQTQ%RR/QR7OR?NRFMSMLSUJS]ISfGSpES}DSBSAT@T?T?T@S@S@S@RPX^bee}bn\cYYVTVQVOV"MW,LW4JW<IXDHXKGXSEX[DXdBXn@X{?X=X^a<^l;^x9^7^6^5^4_4^5]5]5\5\Yaglnnvlgi\fQdHb DbBbAc$?c->c5=d=s4r 1s0s/s#.s+-t4,t<+tD)tM(uW'uc%uo$u"u!u uutsr q qksy|~tgZM~C~8}/}(} &}$}#~%"~-!~6!~?HR^kz~|{{{rz{m`TH<2( &.7ALXeu {seYLA4*!   & / 9 DP^nwj]PD8,"  '1<HVew{m`SF9-#   (2>L[lqcUG:-"  '2@O`tËáøseWI;-! &2ASf|ٔ٫vgYK<.!  $2CVkj[L>/   #3FZq(7DQ\fow~$2?LWajry ,:FR\eltz  &4@LV_gnt{  -:EOX`hnt{  %2>IRZahnt{  *7BKT[bhnu{  !.: D M U \ b i o v ~  $%" '3>GOV\cipx}||{{!)-/,' !-8AIPW^dks|}|zxwv t!r!q"q!q!q!(05751+# !'"2#<#D~#K|$R{$Yy$_w$fv%nt%ws%q&o&n&m'l'j(i)h)h)h(h(.6;==93-' '("|)-y*7w*?u*Gs+Nq+Tp+[n+bl+jk,ri,}h,f-e-d.c.a/`/`/`/`/`.4<ACC@:4.z-w.s/)q03o0;m0Ck1Ji1Qg1Wf1^d1fc2oa2y`2_2]3\3[4Z4Y5Y5Y4Y4Y48@EHHF@;y5s3o4l4%i5/g57e6?c6Fb6M`6T_6[]7c\7k[7vY7X8V8U8T9S9S:S9R9S9S9<DILLKF}@s;l8 h9e9"c:+`:4^:<]:C[:JZ;PX;XW;`V;hUM>M>M>M>M=M=@HMPQOKyEn@f= b=_=\>(Z>1X>8W>@U?FT?MS?UR@]P@fO@pN@|LAKAJAIBHBHBHBHBHAHADKPTTSPuJjFaB\AYBWB%UB.SB5QB=OBCOCKNCRMDZKDcJDnIEzGEFEEFDFCFCFCFCFCECEGOTWXX~UqOfJ\FWFTFQF"OF+NF3LG:KGAJGIIHPHHXGHaEIlDIxBIAI@J?J>K>J>J>I?I?IJRX[]\{YmSbOWLQJ NJLKJK(IK0GK8FL?ELFDLNCMVBM_@Mj?Mv=NRT2]F1^N0^W/^b-^n,_}*_)_(_'_'_'^'](](\\djnoyonn`kTiIg?e5c 2c0c/d!.d)-d1,d9+eB*eJ(eT'e_&fk$fz#f"f fff e d c!cbjpsuuuit\rOqDo:n0m)l 'l&l%m$$m,#m4"m=!nF nPn[ngnvnooonmlkkiqvy|{q{d{WzJy?x5x+w"vvwww&w.w7x@xJxVxcxrxxxxwvuutqx|wj]PD8.$ '0 9 D P ] l~y~}obUI=1&  )2=IVevtfYL@4(  "+5@N\nxj\OB6) "+6DScw{m_QD6*  !+8GXk~pbSF8*   +:K^sҋҤӻsdVG9* *<Od|fXI;+  +>Sj&4AMXbksz !.<HS]fmu{  )6BNW`hov| #0<GQZbiov|)5AKT\ciou{ ".:DMU\ciou{ '2=FOV\chou|  *5?HPV\ciov  !  # . 8 A I P W ] c jqz~|{zxvuttt&**(#'2;CKQ~W|^{eylwtv~trqonmkjjjj&-131,& "~,{6y>wEuLsSqYp`ngmpkzjhge d!c!b"a"a"a"a",48985/(!{ w!t"'q"1o#9m#Ak#Hi#Nh$Uf$[e$cc%kb%ua%_&^&]'[([(Z)Y)Y)Y)Y(29=??<60y*r&n'k(#i(,f)5e)<c)Ca*J`*Q^*W]*_\+hZ+rY,}X,V-U-T.S.R/R/R.R.R.6=BDDA<{7r1k, g-d-a.(_.1].9\/@Z/FX/MW/TV0\U0dS1nR1zQ1P2N2M3M4L4L4L4L3L3:BFIIGBw=m7d2 `2]2Z2%X3-V35U3<S4CR4JQ4QP4YO5aM5lL6wK6J7H7G8G8F8F8F8F8F7>EJMMK~GsBi=_7Z6W7T7"R7*P72O89M8@L8GK8NJ9VI9_H:iG:uE;D;C<B<A=A=A=A<A<A<BINPQP{LoFeBZ=T;Q;O;M;'K;/I<6G<=G\C>gB?s@???>@=@Ce=Cq;C:D9D8E7E7E7E7D8D8CIPUXYXvVhP]LSHJE FDDDBD"AE)?E1>E8=E?I=I;J&:J.9J58K=7KD6KM4LV3L`2Ll1Mz0M.M-N,N,N,M-M-L-LPX]ab{ap_b[XXNUCQ;O 8O6O5O#4P+3P22P:1PB0QJ.QS-R],Ri+Rx)R(S'S&S&S&S'R'Q'QU\bfgxfme`aU^J[?X5V1U0V.V-V',V/+W6*W>)WG(WP&XZ%Xg$Xu#Y!Y YYYX X W!WZbgkluljk]hQeFc;`1^*] (]&]%^#$^*#^2"^:!^C _L_W_c`q`````_^^]`hnp|rrrfqXnLlAk6i-g#fffff%f-g5g>gHgSh_hnhhhhhgfeegosvxxmx`wSvFt;s1r'qqp pppq'q/q8qBqN q[ qi qz qqqppo n nouy~|t~f~Y~M~@}5}*|!||| | | ||!|)|2|=|H|U|c|t|{{zyyyxw|yl^QE9-#  #,6BN]m~~qcVI<0$  $.9FUexugYL?2&  %/<K[nxj\NA3&  $0?Pbx{m_PB4&  $2CUj̜̃˵paRD6' $5H\scUF8(%8Mc|#0=IT^fnv|  +8DOYaipw}%2>IS\cjqw}  ,8CMV]dkqv|%1<FOW^djpv| *5?HPW^diou|#.8AJQW]ciov} &1:CJQW]cipw~}{zzyxx  )3<DKQW]c}j{rz|x v t s q p o nmmm#&&$   " ,~ 5|=zExKwQuXs^qepnnwlkihfedccbb$*./-("}yv's0q8o?mFlLjShYgaeidrb~a_^\\ZZYYY*15641+%ysol"i+g3e;dAbH`N_U]\\d[nYyXV U T!S!R"R#R#R"R"/6:<;82z-r&j f c!a!&_"/]"6["=Z#DX#JW#QU#XT$aS$jQ%vP%O&N'L'L(K(K)K(K(K(4;?A@>9u3l-c'^&\&Y'"W'+U(2T(9R(@Q(FP)MN)UM)]L*gK*sI+H+G,F-E-E.D.D.E-E-8?CEEC{>q9g4^.X+U+R,P,'O,/M-6L-<J-CI-JH.RG.ZF/dE/pC0~B0A1@2?2?3?3?2?2?2<CGIIHxDm>c9Z4R0 O0L0J0$I1+G12F19D1@C2GB2OA3X@3b?4m>4{=5<6;6:79797:7:6:6@FKMNLuHjC`>V9M5 I4G5E5!C5(A5/@56?6=>6E=7M<7U;8`:8k99y897:5:5;4;4;5;5:5:CJNQR~PsMgH\DR?H:D9A9?9>9&<9-;:4::;9;B8;J71>0?/?/?/?0?0>0>GMRUV|UqRdLYIOEE@?> <>:>9>#7>*6?15?84?@3@H2@Q1A[0Ag.Bu-B,C+C*C)D*C*C+B+BJQVYZyZnWaRWNMKCG:C 6C4C3C 2D'1D/0D6/E=-EF,EO+FY*Fd)Gr(G&G%H$H#H$H%G%G&GOUZ^_w^k\_XUUKQ@M5J0I.I-I,I$+J+*J3(J;'KC&KL%KV$Lb#Lp!L MMMNMLL KSZ_c~dtcia\^R[GXf3e)c a` ````&`.a7a@aKaX af bv b a aaa ` _ _fmq~suujt\sOrCp8o-n$lkkj j j j! j) j2j<kGkSkakqjjjiiihhmsw{zp{c{VzIz=y1x'wvvv v vvvv$u,u6uAuNu\ulu~ttssrrquz~vi[NA5)  &/;GUex~}}|{n`RE9,!  (2?M]prdVH;." )5CTf{ugYK=0# )8HZoxj\M?1# +<NbzƔƭl^OA2$  -@Tk`RC4%  1F\t ,9EPYbjqw~'3?JT]dkrx~ ".9ENW^elrw~ (3>HQX_ekqw} "-7AJRY_ejpv} &1:CKRX^dipv~  *4<DKRX]cipw  #,5>EKQW]cjqz}{ywutrrrqq  %/7>~E}K{QyWx]vdtkrtpnlkihgff e e  ##  |y(v0t8r ?p Eo Lm Rl Xj _h gg pe zc b ` _ ^ \\[[[!(++)${u q n!k*i2g9e@dFcMaS_Z^b\k[vYXVUTSRRRR(.221-'z!rk gda%_-]4\;[BYHXOVVU^SgRrPONLKKJJJJ-47874}/t)l#d^[Y!W)U0T7R=QDOKNRMZKcJnI|GF E!D!C"C"C"C"C"28<>=:y5o0f*^$W T Q O!%N!,L!3K":I"@H"GG"NF#WD#`C$kB$yA%?&>&='='=(=(='='6=@BB?v;l6b0Y*Q% M%K%I%!G&(E&/D&6C&=B'DA'K?(T>(]=)i<)v;*9+8+7,7,7,7,7,8,:@DFF}Ds@h;_6U1L+G)E*C*A*%?*,>+3=+9<+A;,H:,Q9-[8.f6.s5/4/30201111212030>DHJJ{IpEe@[;R6H1B. ?.=.;."9/)8//7/660>50F41O31Y22d12q03/4.4,5,5,5-5-4.4AHLNNyMnJbEX@N<E7=3 93736343&33-24414<05D/5L.6V-6b,7o+7*8(8'9&9'9(9(8)8EKORSwRlO_IVFLBB=88482818/8$.8+-92,99+:A*:J);T(;_'!>"=#=#<IOSVWuVjS]OSLJH@D6@/= -=+=*>!)>((>/'>7&??$?H#@R"@]!Aj AzABBBBBAAMSX[}\r[gX[TQRHN=J3G*C &C%C$C#D%"D,!D4 E<EEEOFZFhFxGGGHGGFFRX]`zap`e^YZOXDT9Q/N&K JJJJ!K(K0K8KBLLLWLeMuMMMNMMLLW]bewfmfcdVaJ^?[5X+V"TR RRRR$R,R4R>SHSTSb Tr T T TT T S R R]dh~ktlkl_jRgEd:b0`&^][Z ZZ [ [' [0 [: [E[Q[^[m[[[[ZZZYdkn{prrgqYpLn@l5k*i!gff e eedd#d,d5d@dLdZdid{dccbbbalquxwmx`wRvFu9t.t#rqq qqp ppoo&o0o;oGoTodounmmlkkksx}{s}e~X~K~>~2~&}|| |}}| ||||!|)|4{@{N{^{ozzyxwvvzxk]OB5)  ",8FVh|}oaSE8+  ".=M^srdVH:,  #1ASgugYJ<-   $5G[rj[M>/! '9Md~ܙܰ]O@2" *?Um  (4ALU]elrx~#/;FPX_flrx~ *5@JRY`flrx~$/9CLSZ`fkqw~ )3=EMTZ_ejpw",6>FMSY^djpw &/7?FLRX]cjqy~|zxxwww (19@FLRW}]{czkxsv}tqpnlkjjjj !~*{2y9w@uFsLrQpWn^mekniwgecb`__^^^  ~ yur#o+m3k:i@gFfLdRcYa`_i^s\ZYWVU T T T T %((%!{tn if d %b -` 4^ :] @[ GZ MX TW \U dT oR {PONLLKKKK&+//-)}$tle_\ZX'V.T5S;RBPHOPNWL`KkIxHFEDCCCCC+14541x+o&f ^W TQO#N*L1K7I>HDGLETD]CgAt@?=<;;<<<069;:~7s2j-a'Y!Q LJHF&E-C3B:AA@H>P=Y<d;q987 6 5!5!5"5!6!4:>??{<p8g2]-T(L"FCA?"> )= 0; 6:!=9!E8"M7"W6#b4#n3$~2$1%/%/&/&/&0&0&8>BCCxAn=c8Z3Q.H(@$ =#;$9$8$&6$,5%34%:3&B2&J1'T0'_/(l.({,)+***)*)+*+**+*<BFGGvElBa=W8N3D.<) 7(5(3(2(#0()/)0/*7.*?-+H,+R+,]*,j(-y'-&.%.$/$/%/%/&.?EIK~LtJjG^BT=K9A48/2- 0-.--- +-'*..).5)/=(/F'0O%0[$1h#1w"2!23333 3!2CIMO|PsOhL\FRCI??;66.2 +2)2(2&2$%3+$32#4:"4C!5M 5X6e6u77788877GMQS{TqSfPZLPIGE=A3=*9 %7#7"8!8" 8(80989A:K:V;c;r;<<==<<;KQUXyYnXdVXQNOEK:G0C'@ > >>>>%>-?5?>?H@S@`ApAAABBAA@PVZ]v^l]b[VWLUAQ6N,K#HE DDEE"E)E1E;FEFPG^ Gm G G GGG G F FU[`}bscjb`aS^GZUJVWVeUwUUUTTSSbhlwnoocnVlIj=h2f'ecba `` ____&_/_:_E_S_a^r^]]\\[[jo}rutju]tOsBr6p+o nml lkk jjjj!i*i4i@iNi\imhhgfeedqvzyp{b{U{Hz;z/z#yxw wwwwv vvvv#v.u:uGuVuht|tsrqppy}vhZL?2%  &2?O`u~~zl^PB5'  (6EWk~paSE7)  *:L`xsdVG9* .@TjgXJ;,  2F]vԒի[L=/ $8Ng $0<GQY`gmsy  +7BKS[agmsy&1;EMU[aglrx  *5>GNU[aflrx $.8@HNTZ_ekqx (19AHNSY^djqz~ "*2:AGMRX]dks}}{xvusqpppp  $,3:}A{GyLwRvWt]rdpmovljigedccbc ~zv%t-q4o:n@lFjLiRgXf_dgbq`|^\[YXXXWW~ w rnjh'e.d4b;`@_F]L\SZZXbWlUwSRPONMMMM"%%"}un g c_]![(Y/W5V;TASGQNPUN^MgKsI H G E D D C C D $),,*&w!nf_Y U S Q "O )M /L 6K <I BH IF QEZDdBp@?><;;;;<)/221|-r(i#aYQLJHF$E+C1B7A>@E>M=V<a:m9|76543444.4786x4n.e*\$TLF B@? ='<-;49:8B7J6S5^3j2y0/.---..28;<<v9k4b/Y*P%G@ <:86#5)40372>1G/P.[-g,v*)(' & ' ( ( 6<?A}@t>i:_5V0M+D%; 6320 /&.--4, ;+ D*!N)!X'"e&"t%###"$!$!%"%"$#$:?CE{DrCg?]:S6J1A,8&1# .","*")"#(#*'#1&$9%%A$%K#&V"&c!'r'(())))(>CGIzIpGfDZ?Q;G7>25-,( ('''%'$'!#('"(.!)6 )?*I*T+`+o,,------AGKMxMnLdIXDO@F==834*/$, !, ,--%-,.4.</F/Q0^0m11122211EKOQvRmPbNVIMFDC;?1:'62 2222"3)314:4D4O5\5k6}66 7 7 666IOS~VuVjU`SUOLLBI8E.A$=:88899&9.97:A:L ;Y ;h ;z ; <<<< ; ;NTX|[r[hZ^XSUIR>N4K*G!DB@ ??? @# @+ @4 @> AJAVAeAvAAAAAA@TY^y`p`f`]^Q[EW:T/Q%OLJH GGGG H(H1H;HGHSHbHsHHHGGGGZ`cwenfefYdL`@]5[*Y WUS RQ PPPP%P.P8PCPPP^PoPOONNMMaf}itllmakSiFg:d/c$a_^ \\[ ZZZY!Y)Y3Y?YLYZYkX~XWWVUUhmzprrgrZqLp?n3m(kjh ggff e eddd$d.d:cGcUcfczba`__^otxwnx`xRwEw8v+v tssrrrqq qpppp'p3o@oPo`ntnmlkjiw|{s}e~WI</"~~~~~~ ~ ~~~ ~+}9}H}Y|m|{zyxwwi[M?2$ "/?Pd{{m^PB4& $4FYppaSD6' '9Md~dUG8),@Vǫ͋XI:,2H`{ !,8CLT[bhntz '2=FOV\bhnsy",7@IPV\bgmsy &0:BJPV[aflrz *3;CIOUZ_ekr{ #,4<CINSY^dks}}{yxwwu&-5<BGMR}X{^yexmvvsqomljihhi  |'z.w5u;tArGpLoRmXk_ifgpe{cb`^]\\[[  { wso!l(j/h5g;eAcFbL`R_Y]a[jYuWUTSQPPPP wqkgda"^)]/[5Y;XAVFUMSTR\PeNpL}KIHGFFFE ""woh a ]YVT#R*P0O5N;LAKHIOGWFaDlCyA@>=<<<<"'))'{#qiaZ S OLJH$G*E0D6C=AC@K> S= ]; h: v8 7 5 4 3 3 3 4 ',//.w*m%d \TLF C A ? > %< +; 2: 88 ?7G6P4Z3f1t0.-,+,,-,145}4t1j+`'X!OG@ ;976!4'3-241;0C.M-W,c*q)'&%$%&&169:{9q6g1]-T(L"C;5 21/.$,*+1*8)@(J'T&`$o#!   4:=>y=o;e7[2R-I(@#80 ,*)' &'%-$5#>"G!R ^l~8=ABwBm@c<Y7O3F.=)5$- ' %#!!$ +2;E O!\!j"{""#####<ADFuFlDbAW<M8D4<03+*&#" !!""!"(#0#8$B%M%Y&h&y&'''(''@EH}JtJjI`FUAL>C::612(- ) ''''(%(-(6)@)K*W*f+w+ , , , , , +DIL|NsOiN^KSGJDB@9=/8%40- ,---#-*.3.= /H /U 0c 0t 0111100HMQzSqTgR]PRLIJ@F5B+>":74 33 3 3 4( 41 5;5F5R6`6q6666665MRVxXoYeX[UQRGOHPW]ciot{#.8BJQX]chnt{ (2<DKQW]bgmt{"+5=EKQV[afmt| %.6>DJPUZ_flu~~| '/7=CINSY_em~w|zxusrqppn !)07}={ByHxMvRtXr_qgopl{jhfecbaaa|xu#r)p0n6m<kAiGhLfRdYc`ai_t][YWVUUTU  {u plhf#c*a0`6^;]A[FZLXSV[TdRnQ{OMLKJIIIy qke a]ZX$V*T0S6Q;PANGMNKVI_GiFvDCA@??>?zrjb\WSPNL%J+H0G6F<DBCIAQ?Z>e<r:9866555 $&&$u ld\T N JGDB @%?+>1<7;>9E8M6V5a3n1~0/-,,,,%*,-{+r'h"_WOHA >;98!6&5,322 91 A/ I. S, ^+ l) |( & % $ # $ % */22y1o.e)\$SKC<5 3 1 / . "- (+ .* 5) ='F&P$\#j"{ /367v6m3c/Y*P%H ?80,*('%$$*#2":!C NZhx37:~;t;k8a4W/N+E&=!4-& #" !'/7AKWev6;>|?s?i=_9U5L0C,:'2"*" $,4>IUct  :?B{DqChB^>S:J6A29-1)(%  ")2<F S a !q ! " " " " " !>CFyHpHgF\DR?I;@884/0','# !!"" "'#/ $9 $D %P %^ &o&&&&&&&BGJxLoLeK[HPDGA?>7;-6$1-*( ' ( ( (% )- )7*B*N+\+l++++++*FKOvQmQcPZMOJGG>D3@)< 841 / ..//#/+050?0L1Y1i1|11000/KP}TuVkVbUXSNPEM:I/E%B>;9 7 6666 6)627=7I7W7g7y766655PV|Zr[i[`[WYLV@R5N*K HFC A@ ?>>>>&>/>:>F>T>d>v==<<;;W\y_paha_aT^G[:W/U%RPM KJI H GGFF"F,F7FCFQF`EsEDDCBB]bwenggh[fNcAa4^)\ZWVTSRQ QPOOO'O2O?OMN]NoNMLKJJe|itlmnbmTkGi:g-e"db` _^^]\[ ZZYY"Y-Y:YHXXXkWWVUTSlypsshsZrLq?p2o%nlk jjiihgff feee'd4dCdSdec{ba`_^}twwny_yQyCy6x)xwv uuuvuttsss rrr r,r;qLq_qtponlk{{r~d~UG9+  #2CVl~}|vhYK<.   '8Lb|j\M?0! -@Vo_PA3# 3Ib~SD5& %;Snߌݩ$/:CKRY^diou| )4=ELSX^cinu} #.7?FMRX]bhnu~'08@FLQV[agnv !)29?EJPUZ`gox}|{zwu #+28>DINS}Y{`yhwqu|spomkjiig }$z+x2v8t=rBqHoMmSlYjahjftda_^\[[ZZz uqnk%i+g1f7d<cAaG_M^S\[ZdXnV{TRQPONNM |unieb_]%[+Y1X6V;UASGQNPUN^LhJuHGEDCBBB{ sle_ [WTQO%N+L0K6I<HBFHEPCYAc?o>~<;:9888uld ]VQ MJGE D&B+A1?6>=<D;K9T7_6k4z210//.."$$z!qg_WP IE A><:!9&7,62483?1G0P.[-g+v*('&%%%#(**w(m%d [RKC = 96310"/'--,4*;)C(M&X%e#t"  (-/~/t.j+a&X!OG?81 .+)('#%)$ 0# 7! @ J U b r       -14|4r3h1_,U'L#D<4-& $ " !   % , 4=GSaq158z9p8g6]2S-J(B$91*# !)1:EQ_o     59<x=o=e:[7R2I.@*7%/!(  &.8BO \ l   8=@wAmAd?Z<P8G3>06+.''# # , 5 @ L Zi|<ADuElEcDYAO=F9>652..%*%!    "*3 > J!W!g!y!!!!! @E}HtJkJbIXFNBE?=<59+4"/+( $ ###$ $(%1%<%H&U&e&w&&&&%%EI{MsOjO`NWKMHDEO2L(HEB@=<; :999 9)949@9N9]9o887765UZv]m_e_]_R\DX8U-R"OLJ HFED C BAAA&A1A=AJAZAl@??>=<\|`scledfYdKa>^2[&YVT RQONML KKJJ"J,J9JGJVIhI~HGFEDcygrjkl`kRiDf7d*b`^ ][ZYXWVV UTTT'T4TBSRSdRyRQPON~jwnpqfqXpJoK=S;]9i7x6432211zph_ XQL HDA?=!<&:,91776>4F3O1Y/e.s,+*)((( !!ulcZR KD@ <8643!1'0,.3-:+B*K(U&a%p$"! "&(|'r%i"_WNF? 84 1.,*)"'(&.$6#>"G R^m~'+-y-p+f(]$TKC;4 - ) &$"! $*2:DO\j| +/1w2n1d.[*Q%I @81)#    ' . 7 A M Z i { /36v6l5c3Y/P+G&>!6.'       # + 4? J X g y37~:t;k:a8X5N0E,='5#-&    ( 2 <HUev6;|>s?j?`=W9M6D1<.4*,&%"   &/:FSbt:?{BrChC_BV?L;C7;430,,$)$   $-8DQ`r>CyFpHhH^FUDK@C=;:37*2 -)% "   " +!6!A!O!^"p"!!! CHxKoLfM]KTIJFBC:@/;%73/ ,)' &%&&!&)&3'?'M'\'m''&%%$HLvPnQeR\QSOJLAI5D+@!<96 20/ .----'-1-=-J-Y-k-,,+**M}RuUlWcW[VSUGQ;M0I%FC? =:87 6 5444$4.4:4G4W4h4}32110S{Xs[j]b][]OZBV6R*O LIGDBA?> ==<s0r#qo nmmmmlkjiiih hhg!g/g?fRffedcbawxmz_zPzBz3{%{zyyyyzzzxxwwwwwwww&v6vIu_uwtsrqq~cTE6(,?UmfWH9*!3IbZK<- '=UpM?/  /HbЀНи  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ݯŌh̜λŽzې[=eu4TӔ~I,Nʳ~emŮ滑tcĚsE&4}U0 `t5 R4Oi  R;5L[ML^`6`ʼϚmZF|>&T<.Sm1 aZ]5\} T}EDd/"7IXkA(?cղ廗wb۞g6 ?^ف9/Z$^w%j}[+L<0 -a''U'%ʝv]J<2-,09GԻ縏jK/og4<ւ;1oBPi7/"y4Ftjc)"aW7hӮ|uqprwۺiiȓe=ێLn|,E*"D}6jXFG5% ' p pUB3& &ӼҩeH,q<O5u#gCH.8thB`z]a$fɬ}vqligfgkpzŪyawݦwP, 1Np`o7@r_M;*3^+ ƣhM2|Fq|/;d tjK0/Ryt6m|i hpaPliZI9X)V/)G .>RhҰw]B( J}EP h6HuiR>3+X"\Jzwz LWhtңzX:)#RiC4yO]:*Ot3grD\A_KW $1?N`t¾~S?0# vuFNDkyf!SJ?w+ EM.*-E`ct˷|xtplhejH- 1B)kZN4 =eNCzt _t,8ESbrٲymd]VQKFA<82-(#K% f=3l 5[/^w^C@^N,>Rj|þm[L@7/(" 4v$Q|yfQ#:62/.1%B} 9b"Hri(N\3.2Rwr/BXpon~dVKC<60+'" RmQ:B#h >m7/Ptr*AZuXDTdu{xvtrsuxO:0(! #i 9c4[I9]{ !8RoX)9IZl~wqlhda^[YXWWY^eq1 V/W|7+a ,Pv0 #;Wvc*;L_tſld^YUQOLJHGFHKPYf&VP:y !2X1Z'KqI/Jhu&8J^urZSOKHFDCBABCGNYi}.VA{ 4`?%Jqf*Db5+>QhvPJGEDDDEFGKQZhA6ce 'Ls/*DbP6Ja{҇|SGIMQV`sV5Pmo>_{desc Little CMS Little CMSdesc2.x 2.xlcms2-2.6/testbed/testplugin.c0000755002406300000240000012120312311617072015724 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "testcms2.h" // -------------------------------------------------------------------------------------------------- // Auxiliar, duplicate a context and mark the block as non-debug because in this case the allocator // and deallocator have different context owners // -------------------------------------------------------------------------------------------------- static cmsContext DupContext(cmsContext src, void* Data) { cmsContext cpy = cmsDupContext(src, Data); DebugMemDontCheckThis(cpy); return cpy; } // -------------------------------------------------------------------------------------------------- // Simple context functions // -------------------------------------------------------------------------------------------------- // Allocation order cmsInt32Number CheckAllocContext(void) { cmsContext c1, c2, c3, c4; c1 = cmsCreateContext(NULL, NULL); // This creates a context by using the normal malloc DebugMemDontCheckThis(c1); cmsDeleteContext(c1); c2 = cmsCreateContext(PluginMemHandler(), NULL); // This creates a context by using the debug malloc DebugMemDontCheckThis(c2); cmsDeleteContext(c2); c1 = cmsCreateContext(NULL, NULL); DebugMemDontCheckThis(c1); c2 = cmsCreateContext(PluginMemHandler(), NULL); DebugMemDontCheckThis(c2); cmsPluginTHR(c1, PluginMemHandler()); // Now the context have custom allocators c3 = DupContext(c1, NULL); c4 = DupContext(c2, NULL); cmsDeleteContext(c1); // Should be deleted by using nomal malloc cmsDeleteContext(c2); // Should be deleted by using debug malloc cmsDeleteContext(c3); // Should be deleted by using nomal malloc cmsDeleteContext(c4); // Should be deleted by using debug malloc return 1; } // Test the very basic context capabilities cmsInt32Number CheckSimpleContext(void) { int a = 1; int b = 32; cmsInt32Number rc = 0; cmsContext c1, c2, c3; // This function creates a context with a special // memory manager that check allocation c1 = WatchDogContext(&a); cmsDeleteContext(c1); c1 = WatchDogContext(&a); // Let's check duplication c2 = DupContext(c1, NULL); c3 = DupContext(c2, NULL); // User data should have been propagated rc = (*(int*) cmsGetContextUserData(c3)) == 1 ; // Free resources cmsDeleteContext(c1); cmsDeleteContext(c2); cmsDeleteContext(c3); if (!rc) { Fail("Creation of user data failed"); return 0; } // Back to create 3 levels of inherance c1 = cmsCreateContext(NULL, &a); DebugMemDontCheckThis(c1); c2 = DupContext(c1, NULL); c3 = DupContext(c2, &b); rc = (*(int*) cmsGetContextUserData(c3)) == 32 ; cmsDeleteContext(c1); cmsDeleteContext(c2); cmsDeleteContext(c3); if (!rc) { Fail("Modification of user data failed"); return 0; } // All seems ok return rc; } // -------------------------------------------------------------------------------------------------- //Alarm color functions // -------------------------------------------------------------------------------------------------- // This function tests the alarm codes across contexts cmsInt32Number CheckAlarmColorsContext(void) { cmsInt32Number rc = 0; const cmsUInt16Number codes[] = {0x0000, 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888, 0x9999, 0xaaaa, 0xbbbb, 0xcccc, 0xdddd, 0xeeee, 0xffff}; cmsUInt16Number out[16]; cmsContext c1, c2, c3; int i; c1 = WatchDogContext(NULL); cmsSetAlarmCodesTHR(c1, codes); c2 = DupContext(c1, NULL); c3 = DupContext(c2, NULL); cmsGetAlarmCodesTHR(c3, out); rc = 1; for (i=0; i < 16; i++) { if (out[i] != codes[i]) { Fail("Bad alarm code %x != %x", out[i], codes[i]); rc = 0; break; } } cmsDeleteContext(c1); cmsDeleteContext(c2); cmsDeleteContext(c3); return rc; } // -------------------------------------------------------------------------------------------------- //Adaptation state functions // -------------------------------------------------------------------------------------------------- // Similar to the previous, but for adaptation state cmsInt32Number CheckAdaptationStateContext(void) { cmsInt32Number rc = 0; cmsContext c1, c2, c3; cmsFloat64Number old1, old2; old1 = cmsSetAdaptationStateTHR(NULL, -1); c1 = WatchDogContext(NULL); cmsSetAdaptationStateTHR(c1, 0.7); c2 = DupContext(c1, NULL); c3 = DupContext(c2, NULL); rc = IsGoodVal("Adaptation state", cmsSetAdaptationStateTHR(c3, -1), 0.7, 0.001); cmsDeleteContext(c1); cmsDeleteContext(c2); cmsDeleteContext(c3); old2 = cmsSetAdaptationStateTHR(NULL, -1); if (old1 != old2) { Fail("Adaptation state has changed"); return 0; } return rc; } // -------------------------------------------------------------------------------------------------- // Interpolation plugin check: A fake 1D and 3D interpolation will be used to test the functionality. // -------------------------------------------------------------------------------------------------- // This fake interpolation takes always the closest lower node in the interpolation table for 1D static void Fake1Dfloat(const cmsFloat32Number Value[], cmsFloat32Number Output[], const cmsInterpParams* p) { cmsFloat32Number val2; int cell; const cmsFloat32Number* LutTable = (const cmsFloat32Number*) p ->Table; // Clip upper values if (Value[0] >= 1.0) { Output[0] = LutTable[p -> Domain[0]]; return; } val2 = p -> Domain[0] * Value[0]; cell = (int) floor(val2); Output[0] = LutTable[cell] ; } // This fake interpolation just uses scrambled negated indexes for output static void Fake3D16(register const cmsUInt16Number Input[], register cmsUInt16Number Output[], register const struct _cms_interp_struc* p) { Output[0] = 0xFFFF - Input[2]; Output[1] = 0xFFFF - Input[1]; Output[2] = 0xFFFF - Input[0]; } // The factory chooses interpolation routines on depending on certain conditions. cmsInterpFunction my_Interpolators_Factory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags) { cmsInterpFunction Interpolation; cmsBool IsFloat = (dwFlags & CMS_LERP_FLAGS_FLOAT); // Initialize the return to zero as a non-supported mark memset(&Interpolation, 0, sizeof(Interpolation)); // For 1D to 1D and floating point if (nInputChannels == 1 && nOutputChannels == 1 && IsFloat) { Interpolation.LerpFloat = Fake1Dfloat; } else if (nInputChannels == 3 && nOutputChannels == 3 && !IsFloat) { // For 3D to 3D and 16 bits Interpolation.Lerp16 = Fake3D16; } // Here is the interpolation return Interpolation; } // Interpolation plug-in static cmsPluginInterpolation InterpPluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginInterpolationSig, NULL }, my_Interpolators_Factory }; // This is the check code for 1D interpolation plug-in cmsInt32Number CheckInterp1DPlugin(void) { cmsToneCurve* Sampled1D = NULL; cmsContext ctx = NULL; cmsContext cpy = NULL; const cmsFloat32Number tab[] = { 0.0f, 0.10f, 0.20f, 0.30f, 0.40f, 0.50f, 0.60f, 0.70f, 0.80f, 0.90f, 1.00f }; // A straight line // 1st level context ctx = WatchDogContext(NULL); if (ctx == NULL) { Fail("Cannot create context"); goto Error; } cmsPluginTHR(ctx, &InterpPluginSample); cpy = DupContext(ctx, NULL); if (cpy == NULL) { Fail("Cannot create context (2)"); goto Error; } Sampled1D = cmsBuildTabulatedToneCurveFloat(cpy, 11, tab); if (Sampled1D == NULL) { Fail("Cannot create tone curve (1)"); goto Error; } // Do some interpolations with the plugin if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(Sampled1D, 0.10f), 0.10, 0.01)) goto Error; if (!IsGoodVal("0.13", cmsEvalToneCurveFloat(Sampled1D, 0.13f), 0.10, 0.01)) goto Error; if (!IsGoodVal("0.55", cmsEvalToneCurveFloat(Sampled1D, 0.55f), 0.50, 0.01)) goto Error; if (!IsGoodVal("0.9999", cmsEvalToneCurveFloat(Sampled1D, 0.9999f), 0.90, 0.01)) goto Error; cmsFreeToneCurve(Sampled1D); cmsDeleteContext(ctx); cmsDeleteContext(cpy); // Now in global context Sampled1D = cmsBuildTabulatedToneCurveFloat(NULL, 11, tab); if (Sampled1D == NULL) { Fail("Cannot create tone curve (2)"); goto Error; } // Now without the plug-in if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(Sampled1D, 0.10f), 0.10, 0.001)) goto Error; if (!IsGoodVal("0.13", cmsEvalToneCurveFloat(Sampled1D, 0.13f), 0.13, 0.001)) goto Error; if (!IsGoodVal("0.55", cmsEvalToneCurveFloat(Sampled1D, 0.55f), 0.55, 0.001)) goto Error; if (!IsGoodVal("0.9999", cmsEvalToneCurveFloat(Sampled1D, 0.9999f), 0.9999, 0.001)) goto Error; cmsFreeToneCurve(Sampled1D); return 1; Error: if (ctx != NULL) cmsDeleteContext(ctx); if (cpy != NULL) cmsDeleteContext(ctx); if (Sampled1D != NULL) cmsFreeToneCurve(Sampled1D); return 0; } // Checks the 3D interpolation cmsInt32Number CheckInterp3DPlugin(void) { cmsPipeline* p; cmsStage* clut; cmsContext ctx; cmsUInt16Number In[3], Out[3]; cmsUInt16Number identity[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; ctx = WatchDogContext(NULL); if (ctx == NULL) { Fail("Cannot create context"); return 0; } cmsPluginTHR(ctx, &InterpPluginSample); p = cmsPipelineAlloc(ctx, 3, 3); clut = cmsStageAllocCLut16bit(ctx, 2, 3, 3, identity); cmsPipelineInsertStage(p, cmsAT_BEGIN, clut); // Do some interpolations with the plugin In[0] = 0; In[1] = 0; In[2] = 0; cmsPipelineEval16(In, Out, p); if (!IsGoodWord("0", Out[0], 0xFFFF - 0)) goto Error; if (!IsGoodWord("1", Out[1], 0xFFFF - 0)) goto Error; if (!IsGoodWord("2", Out[2], 0xFFFF - 0)) goto Error; In[0] = 0x1234; In[1] = 0x5678; In[2] = 0x9ABC; cmsPipelineEval16(In, Out, p); if (!IsGoodWord("0", 0xFFFF - 0x9ABC, Out[0])) goto Error; if (!IsGoodWord("1", 0xFFFF - 0x5678, Out[1])) goto Error; if (!IsGoodWord("2", 0xFFFF - 0x1234, Out[2])) goto Error; cmsPipelineFree(p); cmsDeleteContext(ctx); // Now without the plug-in p = cmsPipelineAlloc(NULL, 3, 3); clut = cmsStageAllocCLut16bit(NULL, 2, 3, 3, identity); cmsPipelineInsertStage(p, cmsAT_BEGIN, clut); In[0] = 0; In[1] = 0; In[2] = 0; cmsPipelineEval16(In, Out, p); if (!IsGoodWord("0", 0, Out[0])) goto Error; if (!IsGoodWord("1", 0, Out[1])) goto Error; if (!IsGoodWord("2", 0, Out[2])) goto Error; In[0] = 0x1234; In[1] = 0x5678; In[2] = 0x9ABC; cmsPipelineEval16(In, Out, p); if (!IsGoodWord("0", 0x1234, Out[0])) goto Error; if (!IsGoodWord("1", 0x5678, Out[1])) goto Error; if (!IsGoodWord("2", 0x9ABC, Out[2])) goto Error; cmsPipelineFree(p); return 1; Error: cmsPipelineFree(p); return 0; } // -------------------------------------------------------------------------------------------------- // Parametric curve plugin check: sin(x)/cos(x) function will be used to test the functionality. // -------------------------------------------------------------------------------------------------- #define TYPE_SIN 1000 #define TYPE_COS 1010 #define TYPE_TAN 1020 #define TYPE_709 709 static cmsFloat64Number my_fns(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R) { cmsFloat64Number Val; switch (Type) { case TYPE_SIN: Val = Params[0]* sin(R * M_PI); break; case -TYPE_SIN: Val = asin(R) / (M_PI * Params[0]); break; case TYPE_COS: Val = Params[0]* cos(R * M_PI); break; case -TYPE_COS: Val = acos(R) / (M_PI * Params[0]); break; default: return -1.0; } return Val; } static cmsFloat64Number my_fns2(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R) { cmsFloat64Number Val; switch (Type) { case TYPE_TAN: Val = Params[0]* tan(R * M_PI); break; case -TYPE_TAN: Val = atan(R) / (M_PI * Params[0]); break; default: return -1.0; } return Val; } static double Rec709Math(int Type, const double Params[], double R) { double Fun; switch (Type) { case 709: if (R <= (Params[3]*Params[4])) Fun = R / Params[3]; else Fun = pow(((R - Params[2])/Params[1]), Params[0]); break; case -709: if (R <= Params[4]) Fun = R * Params[3]; else Fun = Params[1] * pow(R, (1/Params[0])) + Params[2]; break; } return Fun; } // Add nonstandard TRC curves -> Rec709 cmsPluginParametricCurves Rec709Plugin = { { cmsPluginMagicNumber, 2060, cmsPluginParametricCurveSig, NULL }, 1, {TYPE_709}, {5}, Rec709Math }; static cmsPluginParametricCurves CurvePluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginParametricCurveSig, NULL }, 2, // nFunctions { TYPE_SIN, TYPE_COS }, // Function Types { 1, 1 }, // ParameterCount my_fns // Evaluator }; static cmsPluginParametricCurves CurvePluginSample2 = { { cmsPluginMagicNumber, 2060, cmsPluginParametricCurveSig, NULL }, 1, // nFunctions { TYPE_TAN}, // Function Types { 1 }, // ParameterCount my_fns2 // Evaluator }; // -------------------------------------------------------------------------------------------------- // In this test, the DupContext function will be checked as well // -------------------------------------------------------------------------------------------------- cmsInt32Number CheckParametricCurvePlugin(void) { cmsContext ctx = NULL; cmsContext cpy = NULL; cmsContext cpy2 = NULL; cmsToneCurve* sinus; cmsToneCurve* cosinus; cmsToneCurve* tangent; cmsToneCurve* reverse_sinus; cmsToneCurve* reverse_cosinus; cmsFloat64Number scale = 1.0; ctx = WatchDogContext(NULL); cmsPluginTHR(ctx, &CurvePluginSample); cpy = DupContext(ctx, NULL); cmsPluginTHR(cpy, &CurvePluginSample2); cpy2 = DupContext(cpy, NULL); cmsPluginTHR(cpy2, &Rec709Plugin); sinus = cmsBuildParametricToneCurve(cpy, TYPE_SIN, &scale); cosinus = cmsBuildParametricToneCurve(cpy, TYPE_COS, &scale); tangent = cmsBuildParametricToneCurve(cpy, TYPE_TAN, &scale); reverse_sinus = cmsReverseToneCurve(sinus); reverse_cosinus = cmsReverseToneCurve(cosinus); if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(sinus, 0.10f), sin(0.10 * M_PI) , 0.001)) goto Error; if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(sinus, 0.60f), sin(0.60* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(sinus, 0.90f), sin(0.90* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(cosinus, 0.10f), cos(0.10* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(cosinus, 0.60f), cos(0.60* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(cosinus, 0.90f), cos(0.90* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(tangent, 0.10f), tan(0.10* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(tangent, 0.60f), tan(0.60* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(tangent, 0.90f), tan(0.90* M_PI), 0.001)) goto Error; if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(reverse_sinus, 0.10f), asin(0.10)/M_PI, 0.001)) goto Error; if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(reverse_sinus, 0.60f), asin(0.60)/M_PI, 0.001)) goto Error; if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(reverse_sinus, 0.90f), asin(0.90)/M_PI, 0.001)) goto Error; if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(reverse_cosinus, 0.10f), acos(0.10)/M_PI, 0.001)) goto Error; if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(reverse_cosinus, 0.60f), acos(0.60)/M_PI, 0.001)) goto Error; if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(reverse_cosinus, 0.90f), acos(0.90)/M_PI, 0.001)) goto Error; cmsFreeToneCurve(sinus); cmsFreeToneCurve(cosinus); cmsFreeToneCurve(tangent); cmsFreeToneCurve(reverse_sinus); cmsFreeToneCurve(reverse_cosinus); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); return 1; Error: cmsFreeToneCurve(sinus); cmsFreeToneCurve(reverse_sinus); cmsFreeToneCurve(cosinus); cmsFreeToneCurve(reverse_cosinus); if (ctx != NULL) cmsDeleteContext(ctx); if (cpy != NULL) cmsDeleteContext(cpy); if (cpy2 != NULL) cmsDeleteContext(cpy2); return 0; } // -------------------------------------------------------------------------------------------------- // formatters plugin check: 5-6-5 RGB format // -------------------------------------------------------------------------------------------------- // We define this special type as 0 bytes not float, and set the upper bit #define TYPE_RGB_565 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0) | (1 << 23)) cmsUInt8Number* my_Unroll565(register struct _cmstransform_struct* nfo, register cmsUInt16Number wIn[], register cmsUInt8Number* accum, register cmsUInt32Number Stride) { cmsUInt16Number pixel = *(cmsUInt16Number*) accum; // Take whole pixel double r = floor(((double) (pixel & 31) * 65535.0) / 31.0 + 0.5); double g = floor((((pixel >> 5) & 63) * 65535.0) / 63.0 + 0.5); double b = floor((((pixel >> 11) & 31) * 65535.0) / 31.0 + 0.5); wIn[2] = (cmsUInt16Number) r; wIn[1] = (cmsUInt16Number) g; wIn[0] = (cmsUInt16Number) b; return accum + 2; } cmsUInt8Number* my_Pack565(register _cmsTRANSFORM* info, register cmsUInt16Number wOut[], register cmsUInt8Number* output, register cmsUInt32Number Stride) { register cmsUInt16Number pixel; int r, g, b; r = (int) floor(( wOut[2] * 31) / 65535.0 + 0.5); g = (int) floor(( wOut[1] * 63) / 65535.0 + 0.5); b = (int) floor(( wOut[0] * 31) / 65535.0 + 0.5); pixel = (r & 31) | (( g & 63) << 5) | ((b & 31) << 11); *(cmsUInt16Number*) output = pixel; return output + 2; } cmsFormatter my_FormatterFactory(cmsUInt32Number Type, cmsFormatterDirection Dir, cmsUInt32Number dwFlags) { cmsFormatter Result = { NULL }; if ((Type == TYPE_RGB_565) && !(dwFlags & CMS_PACK_FLAGS_FLOAT) && (Dir == cmsFormatterInput)) { Result.Fmt16 = my_Unroll565; } return Result; } cmsFormatter my_FormatterFactory2(cmsUInt32Number Type, cmsFormatterDirection Dir, cmsUInt32Number dwFlags) { cmsFormatter Result = { NULL }; if ((Type == TYPE_RGB_565) && !(dwFlags & CMS_PACK_FLAGS_FLOAT) && (Dir == cmsFormatterOutput)) { Result.Fmt16 = my_Pack565; } return Result; } static cmsPluginFormatters FormattersPluginSample = { {cmsPluginMagicNumber, 2060, cmsPluginFormattersSig, NULL}, my_FormatterFactory }; static cmsPluginFormatters FormattersPluginSample2 = { {cmsPluginMagicNumber, 2060, cmsPluginFormattersSig, NULL}, my_FormatterFactory2 }; cmsInt32Number CheckFormattersPlugin(void) { cmsContext ctx = WatchDogContext(NULL); cmsContext cpy; cmsContext cpy2; cmsHTRANSFORM xform; cmsUInt16Number stream[]= { 0xffffU, 0x1234U, 0x0000U, 0x33ddU }; cmsUInt16Number result[4]; int i; cmsPluginTHR(ctx, &FormattersPluginSample); cpy = DupContext(ctx, NULL); cmsPluginTHR(cpy, &FormattersPluginSample2); cpy2 = DupContext(cpy, NULL); xform = cmsCreateTransformTHR(cpy2, NULL, TYPE_RGB_565, NULL, TYPE_RGB_565, INTENT_PERCEPTUAL, cmsFLAGS_NULLTRANSFORM); cmsDoTransform(xform, stream, result, 4); cmsDeleteTransform(xform); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); for (i=0; i < 4; i++) if (stream[i] != result[i]) return 0; return 1; } // -------------------------------------------------------------------------------------------------- // TagTypePlugin plugin check // -------------------------------------------------------------------------------------------------- #define SigIntType ((cmsTagTypeSignature) 0x74747448) // 'tttH' #define SigInt ((cmsTagSignature) 0x74747448) // 'tttH' static void *Type_int_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt32Number* Ptr = (cmsUInt32Number*) _cmsMalloc(self ->ContextID, sizeof(cmsUInt32Number)); if (Ptr == NULL) return NULL; if (!_cmsReadUInt32Number(io, Ptr)) return NULL; *nItems = 1; return Ptr; } static cmsBool Type_int_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { return _cmsWriteUInt32Number(io, *(cmsUInt32Number*) Ptr); } static void* Type_int_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) { return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsUInt32Number)); } void Type_int_Free(struct _cms_typehandler_struct* self, void* Ptr) { _cmsFree(self ->ContextID, Ptr); } static cmsPluginTag HiddenTagPluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginTagSig, NULL}, SigInt, { 1, 1, { SigIntType }, NULL } }; static cmsPluginTagType TagTypePluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginTagTypeSig, (cmsPluginBase*) &HiddenTagPluginSample}, { SigIntType, Type_int_Read, Type_int_Write, Type_int_Dup, Type_int_Free, NULL } }; cmsInt32Number CheckTagTypePlugin(void) { cmsContext ctx = NULL; cmsContext cpy = NULL; cmsContext cpy2 = NULL; cmsHPROFILE h = NULL; cmsUInt32Number myTag = 1234; cmsUInt32Number rc = 0; char* data = NULL; cmsUInt32Number *ptr = NULL; cmsUInt32Number clen = 0; ctx = WatchDogContext(NULL); cmsPluginTHR(ctx, &TagTypePluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); cmsDeleteContext(ctx); cmsDeleteContext(cpy); h = cmsCreateProfilePlaceholder(cpy2); if (h == NULL) { Fail("Create placeholder failed"); goto Error; } if (!cmsWriteTag(h, SigInt, &myTag)) { Fail("Plug-in failed"); goto Error; } rc = cmsSaveProfileToMem(h, NULL, &clen); if (!rc) { Fail("Fetch mem size failed"); goto Error; } data = (char*) malloc(clen); if (data == NULL) { Fail("malloc failed ?!?"); goto Error; } rc = cmsSaveProfileToMem(h, data, &clen); if (!rc) { Fail("Save to mem failed"); goto Error; } cmsCloseProfile(h); cmsSetLogErrorHandler(NULL); h = cmsOpenProfileFromMem(data, clen); if (h == NULL) { Fail("Open profile failed"); goto Error; } ptr = (cmsUInt32Number*) cmsReadTag(h, SigInt); if (ptr != NULL) { Fail("read tag/context switching failed"); goto Error; } cmsCloseProfile(h); ResetFatalError(); h = cmsOpenProfileFromMemTHR(cpy2, data, clen); if (h == NULL) { Fail("Open profile from mem failed"); goto Error; } // Get rid of data free(data); data = NULL; ptr = (cmsUInt32Number*) cmsReadTag(h, SigInt); if (ptr == NULL) { Fail("Read tag/conext switching failed (2)"); return 0; } rc = (*ptr == 1234); cmsCloseProfile(h); cmsDeleteContext(cpy2); return rc; Error: if (h != NULL) cmsCloseProfile(h); if (ctx != NULL) cmsDeleteContext(ctx); if (cpy != NULL) cmsDeleteContext(cpy); if (cpy2 != NULL) cmsDeleteContext(cpy2); if (data) free(data); return 0; } // -------------------------------------------------------------------------------------------------- // MPE plugin check: // -------------------------------------------------------------------------------------------------- #define SigNegateType ((cmsStageSignature)0x6E202020) static void EvaluateNegate(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) { Out[0] = 1.0f - In[0]; Out[1] = 1.0f - In[1]; Out[2] = 1.0f - In[2]; } static cmsStage* StageAllocNegate(cmsContext ContextID) { return _cmsStageAllocPlaceholder(ContextID, SigNegateType, 3, 3, EvaluateNegate, NULL, NULL, NULL); } static void *Type_negate_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) { cmsUInt16Number Chans; if (!_cmsReadUInt16Number(io, &Chans)) return NULL; if (Chans != 3) return NULL; *nItems = 1; return StageAllocNegate(self -> ContextID); } static cmsBool Type_negate_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) { if (!_cmsWriteUInt16Number(io, 3)) return FALSE; return TRUE; } static cmsPluginMultiProcessElement MPEPluginSample = { {cmsPluginMagicNumber, 2060, cmsPluginMultiProcessElementSig, NULL}, { (cmsTagTypeSignature) SigNegateType, Type_negate_Read, Type_negate_Write, NULL, NULL, NULL } }; cmsInt32Number CheckMPEPlugin(void) { cmsContext ctx = NULL; cmsContext cpy = NULL; cmsContext cpy2 = NULL; cmsHPROFILE h = NULL; cmsUInt32Number myTag = 1234; cmsUInt32Number rc = 0; char* data = NULL; cmsUInt32Number clen = 0; cmsFloat32Number In[3], Out[3]; cmsPipeline* pipe; ctx = WatchDogContext(NULL); cmsPluginTHR(ctx, &MPEPluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); cmsDeleteContext(ctx); cmsDeleteContext(cpy); h = cmsCreateProfilePlaceholder(cpy2); if (h == NULL) { Fail("Create placeholder failed"); goto Error; } pipe = cmsPipelineAlloc(cpy2, 3, 3); cmsPipelineInsertStage(pipe, cmsAT_BEGIN, StageAllocNegate(cpy2)); In[0] = 0.3f; In[1] = 0.2f; In[2] = 0.9f; cmsPipelineEvalFloat(In, Out, pipe); rc = (IsGoodVal("0", Out[0], 1.0-In[0], 0.001) && IsGoodVal("1", Out[1], 1.0-In[1], 0.001) && IsGoodVal("2", Out[2], 1.0-In[2], 0.001)); if (!rc) { Fail("Pipeline failed"); goto Error; } if (!cmsWriteTag(h, cmsSigDToB3Tag, pipe)) { Fail("Plug-in failed"); goto Error; } // This cleans the stage as well cmsPipelineFree(pipe); rc = cmsSaveProfileToMem(h, NULL, &clen); if (!rc) { Fail("Fetch mem size failed"); goto Error; } data = (char*) malloc(clen); if (data == NULL) { Fail("malloc failed ?!?"); goto Error; } rc = cmsSaveProfileToMem(h, data, &clen); if (!rc) { Fail("Save to mem failed"); goto Error; } cmsCloseProfile(h); cmsSetLogErrorHandler(NULL); h = cmsOpenProfileFromMem(data, clen); if (h == NULL) { Fail("Open profile failed"); goto Error; } pipe = (cmsPipeline*) cmsReadTag(h, cmsSigDToB3Tag); if (pipe != NULL) { // Unsupported stage, should fail Fail("read tag/context switching failed"); goto Error; } cmsCloseProfile(h); ResetFatalError(); h = cmsOpenProfileFromMemTHR(cpy2, data, clen); if (h == NULL) { Fail("Open profile from mem failed"); goto Error; } // Get rid of data free(data); data = NULL; pipe = (cmsPipeline*) cmsReadTag(h, cmsSigDToB3Tag); if (pipe == NULL) { Fail("Read tag/conext switching failed (2)"); return 0; } // Evaluate for negation In[0] = 0.3f; In[1] = 0.2f; In[2] = 0.9f; cmsPipelineEvalFloat(In, Out, pipe); rc = (IsGoodVal("0", Out[0], 1.0-In[0], 0.001) && IsGoodVal("1", Out[1], 1.0-In[1], 0.001) && IsGoodVal("2", Out[2], 1.0-In[2], 0.001)); cmsCloseProfile(h); cmsDeleteContext(cpy2); return rc; Error: if (h != NULL) cmsCloseProfile(h); if (ctx != NULL) cmsDeleteContext(ctx); if (cpy != NULL) cmsDeleteContext(cpy); if (cpy2 != NULL) cmsDeleteContext(cpy2); if (data) free(data); return 0; } // -------------------------------------------------------------------------------------------------- // Optimization plugin check: // -------------------------------------------------------------------------------------------------- static void FastEvaluateCurves(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register const void* Data) { Out[0] = In[0]; } static cmsBool MyOptimize(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { cmsStage* mpe; _cmsStageToneCurvesData* Data; // Only curves in this LUT? All are identities? for (mpe = cmsPipelineGetPtrToFirstStage(*Lut); mpe != NULL; mpe = cmsStageNext(mpe)) { if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE; // Check for identity Data = (_cmsStageToneCurvesData*) cmsStageData(mpe); if (Data ->nCurves != 1) return FALSE; if (cmsEstimateGamma(Data->TheCurves[0], 0.1) > 1.0) return FALSE; } *dwFlags |= cmsFLAGS_NOCACHE; _cmsPipelineSetOptimizationParameters(*Lut, FastEvaluateCurves, NULL, NULL, NULL); return TRUE; } cmsPluginOptimization OptimizationPluginSample = { {cmsPluginMagicNumber, 2060, cmsPluginOptimizationSig, NULL}, MyOptimize }; cmsInt32Number CheckOptimizationPlugin(void) { cmsContext ctx = WatchDogContext(NULL); cmsContext cpy; cmsContext cpy2; cmsHTRANSFORM xform; cmsUInt8Number In[]= { 10, 20, 30, 40 }; cmsUInt8Number Out[4]; cmsToneCurve* Linear; cmsHPROFILE h; int i; cmsPluginTHR(ctx, &OptimizationPluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); Linear = cmsBuildGamma(cpy2, 1.0); h = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear); cmsFreeToneCurve(Linear); xform = cmsCreateTransformTHR(cpy2, h, TYPE_GRAY_8, h, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); cmsCloseProfile(h); cmsDoTransform(xform, In, Out, 4); cmsDeleteTransform(xform); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); for (i=0; i < 4; i++) if (In[i] != Out[i]) return 0; return 1; } // -------------------------------------------------------------------------------------------------- // Check the intent plug-in // -------------------------------------------------------------------------------------------------- /* This example creates a new rendering intent, at intent number 300, that is identical to perceptual intent for all color spaces but gray to gray transforms, in this case it bypasses the data. Note that it has to clear all occurrences of intent 300 in the intents array to avoid infinite recursion. */ #define INTENT_DECEPTIVE 300 static cmsPipeline* MyNewIntent(cmsContext ContextID, cmsUInt32Number nProfiles, cmsUInt32Number TheIntents[], cmsHPROFILE hProfiles[], cmsBool BPC[], cmsFloat64Number AdaptationStates[], cmsUInt32Number dwFlags) { cmsPipeline* Result; cmsUInt32Number ICCIntents[256]; cmsUInt32Number i; for (i=0; i < nProfiles; i++) ICCIntents[i] = (TheIntents[i] == INTENT_DECEPTIVE) ? INTENT_PERCEPTUAL : TheIntents[i]; if (cmsGetColorSpace(hProfiles[0]) != cmsSigGrayData || cmsGetColorSpace(hProfiles[nProfiles-1]) != cmsSigGrayData) return _cmsDefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); Result = cmsPipelineAlloc(ContextID, 1, 1); if (Result == NULL) return NULL; cmsPipelineInsertStage(Result, cmsAT_BEGIN, cmsStageAllocIdentity(ContextID, 1)); return Result; } static cmsPluginRenderingIntent IntentPluginSample = { {cmsPluginMagicNumber, 2060, cmsPluginRenderingIntentSig, NULL}, INTENT_DECEPTIVE, MyNewIntent, "bypass gray to gray rendering intent" }; cmsInt32Number CheckIntentPlugin(void) { cmsContext ctx = WatchDogContext(NULL); cmsContext cpy; cmsContext cpy2; cmsHTRANSFORM xform; cmsHPROFILE h1, h2; cmsToneCurve* Linear1; cmsToneCurve* Linear2; cmsUInt8Number In[]= { 10, 20, 30, 40 }; cmsUInt8Number Out[4]; int i; cmsPluginTHR(ctx, &IntentPluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); Linear1 = cmsBuildGamma(cpy2, 3.0); Linear2 = cmsBuildGamma(cpy2, 0.1); h1 = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear1); h2 = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear2); cmsFreeToneCurve(Linear1); cmsFreeToneCurve(Linear2); xform = cmsCreateTransformTHR(cpy2, h1, TYPE_GRAY_8, h2, TYPE_GRAY_8, INTENT_DECEPTIVE, 0); cmsCloseProfile(h1); cmsCloseProfile(h2); cmsDoTransform(xform, In, Out, 4); cmsDeleteTransform(xform); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); for (i=0; i < 4; i++) if (Out[i] != In[i]) return 0; return 1; } // -------------------------------------------------------------------------------------------------- // Check the full transform plug-in // -------------------------------------------------------------------------------------------------- // This is a sample intent that only works for gray8 as output, and always returns '42' static void TrancendentalTransform(struct _cmstransform_struct * CMM, const void* InputBuffer, void* OutputBuffer, cmsUInt32Number Size, cmsUInt32Number Stride) { cmsUInt32Number i; for (i=0; i < Size; i++) { ((cmsUInt8Number*) OutputBuffer)[i] = 0x42; } } cmsBool TransformFactory(_cmsTransformFn* xformPtr, void** UserData, _cmsFreeUserDataFn* FreePrivateDataFn, cmsPipeline** Lut, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) { if (*OutputFormat == TYPE_GRAY_8) { // *Lut holds the pipeline to be applied *xformPtr = TrancendentalTransform; return TRUE; } return FALSE; } // The Plug-in entry point static cmsPluginTransform FullTransformPluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginTransformSig, NULL}, TransformFactory }; cmsInt32Number CheckTransformPlugin(void) { cmsContext ctx = WatchDogContext(NULL); cmsContext cpy; cmsContext cpy2; cmsHTRANSFORM xform; cmsUInt8Number In[]= { 10, 20, 30, 40 }; cmsUInt8Number Out[4]; cmsToneCurve* Linear; cmsHPROFILE h; int i; cmsPluginTHR(ctx, &FullTransformPluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); Linear = cmsBuildGamma(cpy2, 1.0); h = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear); cmsFreeToneCurve(Linear); xform = cmsCreateTransformTHR(cpy2, h, TYPE_GRAY_8, h, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); cmsCloseProfile(h); cmsDoTransform(xform, In, Out, 4); cmsDeleteTransform(xform); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); for (i=0; i < 4; i++) if (Out[i] != 0x42) return 0; return 1; } // -------------------------------------------------------------------------------------------------- // Check the mutex plug-in // -------------------------------------------------------------------------------------------------- typedef struct { int nlocks; } MyMtx; static void* MyMtxCreate(cmsContext id) { MyMtx* mtx = (MyMtx*) _cmsMalloc(id, sizeof(MyMtx)); mtx ->nlocks = 0; return mtx; } static void MyMtxDestroy(cmsContext id, void* mtx) { MyMtx* mtx_ = (MyMtx*) mtx; if (mtx_->nlocks != 0) Die("Locks != 0 when setting free a mutex"); _cmsFree(id, mtx); } static cmsBool MyMtxLock(cmsContext id, void* mtx) { MyMtx* mtx_ = (MyMtx*) mtx; mtx_->nlocks++; return TRUE; } static void MyMtxUnlock(cmsContext id, void* mtx) { MyMtx* mtx_ = (MyMtx*) mtx; mtx_->nlocks--; } static cmsPluginMutex MutexPluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginMutexSig, NULL}, MyMtxCreate, MyMtxDestroy, MyMtxLock, MyMtxUnlock }; cmsInt32Number CheckMutexPlugin(void) { cmsContext ctx = WatchDogContext(NULL); cmsContext cpy; cmsContext cpy2; cmsHTRANSFORM xform; cmsUInt8Number In[]= { 10, 20, 30, 40 }; cmsUInt8Number Out[4]; cmsToneCurve* Linear; cmsHPROFILE h; int i; cmsPluginTHR(ctx, &MutexPluginSample); cpy = DupContext(ctx, NULL); cpy2 = DupContext(cpy, NULL); Linear = cmsBuildGamma(cpy2, 1.0); h = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear); cmsFreeToneCurve(Linear); xform = cmsCreateTransformTHR(cpy2, h, TYPE_GRAY_8, h, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); cmsCloseProfile(h); cmsDoTransform(xform, In, Out, 4); cmsDeleteTransform(xform); cmsDeleteContext(ctx); cmsDeleteContext(cpy); cmsDeleteContext(cpy2); for (i=0; i < 4; i++) if (Out[i] != In[i]) return 0; return 1; } lcms2-2.6/testbed/testcms2.c0000644002406300000240000066611612311617072015310 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "testcms2.h" // On Visual Studio, use debug CRT #ifdef _MSC_VER # include "crtdbg.h" # include #endif // A single check. Returns 1 if success, 0 if failed typedef cmsInt32Number (*TestFn)(void); // A parametric Tone curve test function typedef cmsFloat32Number (* dblfnptr)(cmsFloat32Number x, const cmsFloat64Number Params[]); // Some globals to keep track of error #define TEXT_ERROR_BUFFER_SIZE 4096 static char ReasonToFailBuffer[TEXT_ERROR_BUFFER_SIZE]; static char SubTestBuffer[TEXT_ERROR_BUFFER_SIZE]; static cmsInt32Number TotalTests = 0, TotalFail = 0; static cmsBool TrappedError; static cmsInt32Number SimultaneousErrors; #define cmsmin(a, b) (((a) < (b)) ? (a) : (b)) // Die, a fatal unexpected error is detected! void Die(const char* Reason) { printf("\n\nArrrgggg!!: %s!\n\n", Reason); fflush(stdout); exit(1); } // Memory management replacement ----------------------------------------------------------------------------- // This is just a simple plug-in for malloc, free and realloc to keep track of memory allocated, // maximum requested as a single block and maximum allocated at a given time. Results are printed at the end static cmsUInt32Number SingleHit, MaxAllocated=0, TotalMemory=0; // I'm hidding the size before the block. This is a well-known technique and probably the blocks coming from // malloc are built in a way similar to that, but I do on my own to be portable. typedef struct { cmsUInt32Number KeepSize; cmsContext WhoAllocated; cmsUInt32Number DontCheck; union { cmsUInt64Number HiSparc; // '_cmsMemoryBlock' block is prepended by the // allocator for any requested size. Thus, union holds // "widest" type to guarantee proper '_cmsMemoryBlock' // alignment for any requested size. } alignment; } _cmsMemoryBlock; #define SIZE_OF_MEM_HEADER (sizeof(_cmsMemoryBlock)) // This is a fake thread descriptor used to check thread integrity. // Basically it returns a different threadID each time it is called. // Then the memory management replacement functions does check if each // free() is being called with same ContextID used on malloc() static cmsContext DbgThread(void) { static cmsUInt32Number n = 1; return (cmsContext) (n++ % 0xff0); } // The allocate routine static void* DebugMalloc(cmsContext ContextID, cmsUInt32Number size) { _cmsMemoryBlock* blk; if (size <= 0) { Die("malloc requested with zero bytes"); } TotalMemory += size; if (TotalMemory > MaxAllocated) MaxAllocated = TotalMemory; if (size > SingleHit) SingleHit = size; blk = (_cmsMemoryBlock*) malloc(size + SIZE_OF_MEM_HEADER); if (blk == NULL) return NULL; blk ->KeepSize = size; blk ->WhoAllocated = ContextID; blk ->DontCheck = 0; return (void*) ((cmsUInt8Number*) blk + SIZE_OF_MEM_HEADER); } // The free routine static void DebugFree(cmsContext ContextID, void *Ptr) { _cmsMemoryBlock* blk; if (Ptr == NULL) { Die("NULL free (which is a no-op in C, but may be an clue of something going wrong)"); } blk = (_cmsMemoryBlock*) (((cmsUInt8Number*) Ptr) - SIZE_OF_MEM_HEADER); TotalMemory -= blk ->KeepSize; if (blk ->WhoAllocated != ContextID && !blk->DontCheck) { Die("Trying to free memory allocated by a different thread"); } free(blk); } // Reallocate, just a malloc, a copy and a free in this case. static void * DebugRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize) { _cmsMemoryBlock* blk; void* NewPtr; cmsUInt32Number max_sz; NewPtr = DebugMalloc(ContextID, NewSize); if (Ptr == NULL) return NewPtr; blk = (_cmsMemoryBlock*) (((cmsUInt8Number*) Ptr) - SIZE_OF_MEM_HEADER); max_sz = blk -> KeepSize > NewSize ? NewSize : blk ->KeepSize; memmove(NewPtr, Ptr, max_sz); DebugFree(ContextID, Ptr); return NewPtr; } // Let's know the totals static void DebugMemPrintTotals(void) { printf("[Memory statistics]\n"); printf("Allocated = %u MaxAlloc = %u Single block hit = %u\n", TotalMemory, MaxAllocated, SingleHit); } void DebugMemDontCheckThis(void *Ptr) { _cmsMemoryBlock* blk = (_cmsMemoryBlock*) (((cmsUInt8Number*) Ptr) - SIZE_OF_MEM_HEADER); blk ->DontCheck = 1; } // Memory string static const char* MemStr(cmsUInt32Number size) { static char Buffer[1024]; if (size > 1024*1024) { sprintf(Buffer, "%g Mb", (cmsFloat64Number) size / (1024.0*1024.0)); } else if (size > 1024) { sprintf(Buffer, "%g Kb", (cmsFloat64Number) size / 1024.0); } else sprintf(Buffer, "%g bytes", (cmsFloat64Number) size); return Buffer; } void TestMemoryLeaks(cmsBool ok) { if (TotalMemory > 0) printf("Ok, but %s are left!\n", MemStr(TotalMemory)); else { if (ok) printf("Ok.\n"); } } // Here we go with the plug-in declaration static cmsPluginMemHandler DebugMemHandler = {{ cmsPluginMagicNumber, 2060, cmsPluginMemHandlerSig, NULL }, DebugMalloc, DebugFree, DebugRealloc, NULL, NULL, NULL }; // Returnds a pointer to the memhandler plugin void* PluginMemHandler(void) { return (void*) &DebugMemHandler; } cmsContext WatchDogContext(void* usr) { cmsContext ctx; ctx = cmsCreateContext(&DebugMemHandler, usr); if (ctx == NULL) Die("Unable to create memory managed context"); DebugMemDontCheckThis(ctx); return ctx; } static void FatalErrorQuit(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { Die(Text); cmsUNUSED_PARAMETER(ContextID); cmsUNUSED_PARAMETER(ErrorCode); } void ResetFatalError(void) { cmsSetLogErrorHandler(FatalErrorQuit); } // Print a dot for gauging void Dot(void) { fprintf(stdout, "."); fflush(stdout); } void Say(const char* str) { fprintf(stdout, "%s", str); fflush(stdout); } // Keep track of the reason to fail void Fail(const char* frm, ...) { va_list args; va_start(args, frm); vsprintf(ReasonToFailBuffer, frm, args); va_end(args); } // Keep track of subtest void SubTest(const char* frm, ...) { va_list args; Dot(); va_start(args, frm); vsprintf(SubTestBuffer, frm, args); va_end(args); } // The check framework static void Check(const char* Title, TestFn Fn) { printf("Checking %s ...", Title); fflush(stdout); ReasonToFailBuffer[0] = 0; SubTestBuffer[0] = 0; TrappedError = FALSE; SimultaneousErrors = 0; TotalTests++; if (Fn() && !TrappedError) { // It is a good place to check memory TestMemoryLeaks(TRUE); } else { printf("FAIL!\n"); if (SubTestBuffer[0]) printf("%s: [%s]\n\t%s\n", Title, SubTestBuffer, ReasonToFailBuffer); else printf("%s:\n\t%s\n", Title, ReasonToFailBuffer); if (SimultaneousErrors > 1) printf("\tMore than one (%d) errors were reported\n", SimultaneousErrors); TotalFail++; } fflush(stdout); } // Dump a tone curve, for easy diagnostic void DumpToneCurve(cmsToneCurve* gamma, const char* FileName) { cmsHANDLE hIT8; cmsUInt32Number i; hIT8 = cmsIT8Alloc(gamma ->InterpParams->ContextID); cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_FIELDS", 2); cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", gamma ->nEntries); cmsIT8SetDataFormat(hIT8, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(hIT8, 1, "VALUE"); for (i=0; i < gamma ->nEntries; i++) { char Val[30]; sprintf(Val, "%u", i); cmsIT8SetDataRowCol(hIT8, i, 0, Val); sprintf(Val, "0x%x", gamma ->Table16[i]); cmsIT8SetDataRowCol(hIT8, i, 1, Val); } cmsIT8SaveToFile(hIT8, FileName); cmsIT8Free(hIT8); } // ------------------------------------------------------------------------------------------------- // Used to perform several checks. // The space used is a clone of a well-known commercial // color space which I will name "Above RGB" static cmsHPROFILE Create_AboveRGB(void) { cmsToneCurve* Curve[3]; cmsHPROFILE hProfile; cmsCIExyY D65; cmsCIExyYTRIPLE Primaries = {{0.64, 0.33, 1 }, {0.21, 0.71, 1 }, {0.15, 0.06, 1 }}; Curve[0] = Curve[1] = Curve[2] = cmsBuildGamma(DbgThread(), 2.19921875); cmsWhitePointFromTemp(&D65, 6504); hProfile = cmsCreateRGBProfileTHR(DbgThread(), &D65, &Primaries, Curve); cmsFreeToneCurve(Curve[0]); return hProfile; } // A gamma-2.2 gray space static cmsHPROFILE Create_Gray22(void) { cmsHPROFILE hProfile; cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 2.2); if (Curve == NULL) return NULL; hProfile = cmsCreateGrayProfileTHR(DbgThread(), cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } // A gamma-3.0 gray space static cmsHPROFILE Create_Gray30(void) { cmsHPROFILE hProfile; cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 3.0); if (Curve == NULL) return NULL; hProfile = cmsCreateGrayProfileTHR(DbgThread(), cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } static cmsHPROFILE Create_GrayLab(void) { cmsHPROFILE hProfile; cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 1.0); if (Curve == NULL) return NULL; hProfile = cmsCreateGrayProfileTHR(DbgThread(), cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); cmsSetPCS(hProfile, cmsSigLabData); return hProfile; } // A CMYK devicelink that adds gamma 3.0 to each channel static cmsHPROFILE Create_CMYK_DeviceLink(void) { cmsHPROFILE hProfile; cmsToneCurve* Tab[4]; cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 3.0); if (Curve == NULL) return NULL; Tab[0] = Curve; Tab[1] = Curve; Tab[2] = Curve; Tab[3] = Curve; hProfile = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigCmykData, Tab); if (hProfile == NULL) return NULL; cmsFreeToneCurve(Curve); return hProfile; } // Create a fake CMYK profile, without any other requeriment that being coarse CMYK. // DONT USE THIS PROFILE FOR ANYTHING, IT IS USELESS BUT FOR TESTING PURPOSES. typedef struct { cmsHTRANSFORM hLab2sRGB; cmsHTRANSFORM sRGB2Lab; cmsHTRANSFORM hIlimit; } FakeCMYKParams; static cmsFloat64Number Clip(cmsFloat64Number v) { if (v < 0) return 0; if (v > 1) return 1; return v; } static cmsInt32Number ForwardSampler(register const cmsUInt16Number In[], cmsUInt16Number Out[], void* Cargo) { FakeCMYKParams* p = (FakeCMYKParams*) Cargo; cmsFloat64Number rgb[3], cmyk[4]; cmsFloat64Number c, m, y, k; cmsDoTransform(p ->hLab2sRGB, In, rgb, 1); c = 1 - rgb[0]; m = 1 - rgb[1]; y = 1 - rgb[2]; k = (c < m ? cmsmin(c, y) : cmsmin(m, y)); // NONSENSE WARNING!: I'm doing this just because this is a test // profile that may have ink limit up to 400%. There is no UCR here // so the profile is basically useless for anything but testing. cmyk[0] = c; cmyk[1] = m; cmyk[2] = y; cmyk[3] = k; cmsDoTransform(p ->hIlimit, cmyk, Out, 1); return 1; } static cmsInt32Number ReverseSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) { FakeCMYKParams* p = (FakeCMYKParams*) Cargo; cmsFloat64Number c, m, y, k, rgb[3]; c = In[0] / 65535.0; m = In[1] / 65535.0; y = In[2] / 65535.0; k = In[3] / 65535.0; if (k == 0) { rgb[0] = Clip(1 - c); rgb[1] = Clip(1 - m); rgb[2] = Clip(1 - y); } else if (k == 1) { rgb[0] = rgb[1] = rgb[2] = 0; } else { rgb[0] = Clip((1 - c) * (1 - k)); rgb[1] = Clip((1 - m) * (1 - k)); rgb[2] = Clip((1 - y) * (1 - k)); } cmsDoTransform(p ->sRGB2Lab, rgb, Out, 1); return 1; } static cmsHPROFILE CreateFakeCMYK(cmsFloat64Number InkLimit, cmsBool lUseAboveRGB) { cmsHPROFILE hICC; cmsPipeline* AToB0, *BToA0; cmsStage* CLUT; cmsContext ContextID; FakeCMYKParams p; cmsHPROFILE hLab, hsRGB, hLimit; cmsUInt32Number cmykfrm; if (lUseAboveRGB) hsRGB = Create_AboveRGB(); else hsRGB = cmsCreate_sRGBProfile(); hLab = cmsCreateLab4Profile(NULL); hLimit = cmsCreateInkLimitingDeviceLink(cmsSigCmykData, InkLimit); cmykfrm = FLOAT_SH(1) | BYTES_SH(0)|CHANNELS_SH(4); p.hLab2sRGB = cmsCreateTransform(hLab, TYPE_Lab_16, hsRGB, TYPE_RGB_DBL, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); p.sRGB2Lab = cmsCreateTransform(hsRGB, TYPE_RGB_DBL, hLab, TYPE_Lab_16, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); p.hIlimit = cmsCreateTransform(hLimit, cmykfrm, NULL, TYPE_CMYK_16, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); cmsCloseProfile(hLab); cmsCloseProfile(hsRGB); cmsCloseProfile(hLimit); ContextID = DbgThread(); hICC = cmsCreateProfilePlaceholder(ContextID); if (!hICC) return NULL; cmsSetProfileVersion(hICC, 4.3); cmsSetDeviceClass(hICC, cmsSigOutputClass); cmsSetColorSpace(hICC, cmsSigCmykData); cmsSetPCS(hICC, cmsSigLabData); BToA0 = cmsPipelineAlloc(ContextID, 3, 4); if (BToA0 == NULL) return 0; CLUT = cmsStageAllocCLut16bit(ContextID, 17, 3, 4, NULL); if (CLUT == NULL) return 0; if (!cmsStageSampleCLut16bit(CLUT, ForwardSampler, &p, 0)) return 0; cmsPipelineInsertStage(BToA0, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)); cmsPipelineInsertStage(BToA0, cmsAT_END, CLUT); cmsPipelineInsertStage(BToA0, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, 4)); if (!cmsWriteTag(hICC, cmsSigBToA0Tag, (void*) BToA0)) return 0; cmsPipelineFree(BToA0); AToB0 = cmsPipelineAlloc(ContextID, 4, 3); if (AToB0 == NULL) return 0; CLUT = cmsStageAllocCLut16bit(ContextID, 17, 4, 3, NULL); if (CLUT == NULL) return 0; if (!cmsStageSampleCLut16bit(CLUT, ReverseSampler, &p, 0)) return 0; cmsPipelineInsertStage(AToB0, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 4)); cmsPipelineInsertStage(AToB0, cmsAT_END, CLUT); cmsPipelineInsertStage(AToB0, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, 3)); if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) AToB0)) return 0; cmsPipelineFree(AToB0); cmsDeleteTransform(p.hLab2sRGB); cmsDeleteTransform(p.sRGB2Lab); cmsDeleteTransform(p.hIlimit); cmsLinkTag(hICC, cmsSigAToB1Tag, cmsSigAToB0Tag); cmsLinkTag(hICC, cmsSigAToB2Tag, cmsSigAToB0Tag); cmsLinkTag(hICC, cmsSigBToA1Tag, cmsSigBToA0Tag); cmsLinkTag(hICC, cmsSigBToA2Tag, cmsSigBToA0Tag); return hICC; } // Does create several profiles for latter use------------------------------------------------------------------------------------------------ static cmsInt32Number OneVirtual(cmsHPROFILE h, const char* SubTestTxt, const char* FileName) { SubTest(SubTestTxt); if (h == NULL) return 0; if (!cmsSaveProfileToFile(h, FileName)) return 0; cmsCloseProfile(h); h = cmsOpenProfileFromFile(FileName, "r"); if (h == NULL) return 0; cmsCloseProfile(h); return 1; } // This test checks the ability of lcms2 to save its built-ins as valid profiles. // It does not check the functionality of such profiles static cmsInt32Number CreateTestProfiles(void) { cmsHPROFILE h; h = cmsCreate_sRGBProfileTHR(DbgThread()); if (!OneVirtual(h, "sRGB profile", "sRGBlcms2.icc")) return 0; // ---- h = Create_AboveRGB(); if (!OneVirtual(h, "aRGB profile", "aRGBlcms2.icc")) return 0; // ---- h = Create_Gray22(); if (!OneVirtual(h, "Gray profile", "graylcms2.icc")) return 0; // ---- h = Create_Gray30(); if (!OneVirtual(h, "Gray 3.0 profile", "gray3lcms2.icc")) return 0; // ---- h = Create_GrayLab(); if (!OneVirtual(h, "Gray Lab profile", "glablcms2.icc")) return 0; // ---- h = Create_CMYK_DeviceLink(); if (!OneVirtual(h, "Linearization profile", "linlcms2.icc")) return 0; // ------- h = cmsCreateInkLimitingDeviceLinkTHR(DbgThread(), cmsSigCmykData, 150); if (h == NULL) return 0; if (!OneVirtual(h, "Ink-limiting profile", "limitlcms2.icc")) return 0; // ------ h = cmsCreateLab2ProfileTHR(DbgThread(), NULL); if (!OneVirtual(h, "Lab 2 identity profile", "labv2lcms2.icc")) return 0; // ---- h = cmsCreateLab4ProfileTHR(DbgThread(), NULL); if (!OneVirtual(h, "Lab 4 identity profile", "labv4lcms2.icc")) return 0; // ---- h = cmsCreateXYZProfileTHR(DbgThread()); if (!OneVirtual(h, "XYZ identity profile", "xyzlcms2.icc")) return 0; // ---- h = cmsCreateNULLProfileTHR(DbgThread()); if (!OneVirtual(h, "NULL profile", "nullcms2.icc")) return 0; // --- h = cmsCreateBCHSWabstractProfileTHR(DbgThread(), 17, 0, 0, 0, 0, 5000, 6000); if (!OneVirtual(h, "BCHS profile", "bchslcms2.icc")) return 0; // --- h = CreateFakeCMYK(300, FALSE); if (!OneVirtual(h, "Fake CMYK profile", "lcms2cmyk.icc")) return 0; return 1; } static void RemoveTestProfiles(void) { remove("sRGBlcms2.icc"); remove("aRGBlcms2.icc"); remove("graylcms2.icc"); remove("gray3lcms2.icc"); remove("linlcms2.icc"); remove("limitlcms2.icc"); remove("labv2lcms2.icc"); remove("labv4lcms2.icc"); remove("xyzlcms2.icc"); remove("nullcms2.icc"); remove("bchslcms2.icc"); remove("lcms2cmyk.icc"); remove("glablcms2.icc"); remove("lcms2link.icc"); remove("lcms2link2.icc"); } // ------------------------------------------------------------------------------------------------- // Check the size of basic types. If this test fails, nothing is going to work anyway static cmsInt32Number CheckBaseTypes(void) { // Ignore warnings about conditional expression #ifdef _MSC_VER #pragma warning(disable: 4127) #endif if (sizeof(cmsUInt8Number) != 1) return 0; if (sizeof(cmsInt8Number) != 1) return 0; if (sizeof(cmsUInt16Number) != 2) return 0; if (sizeof(cmsInt16Number) != 2) return 0; if (sizeof(cmsUInt32Number) != 4) return 0; if (sizeof(cmsInt32Number) != 4) return 0; if (sizeof(cmsUInt64Number) != 8) return 0; if (sizeof(cmsInt64Number) != 8) return 0; if (sizeof(cmsFloat32Number) != 4) return 0; if (sizeof(cmsFloat64Number) != 8) return 0; if (sizeof(cmsSignature) != 4) return 0; if (sizeof(cmsU8Fixed8Number) != 2) return 0; if (sizeof(cmsS15Fixed16Number) != 4) return 0; if (sizeof(cmsU16Fixed16Number) != 4) return 0; return 1; } // ------------------------------------------------------------------------------------------------- // Are we little or big endian? From Harbison&Steele. static cmsInt32Number CheckEndianess(void) { cmsInt32Number BigEndian, IsOk; union { long l; char c[sizeof (long)]; } u; u.l = 1; BigEndian = (u.c[sizeof (long) - 1] == 1); #ifdef CMS_USE_BIG_ENDIAN IsOk = BigEndian; #else IsOk = !BigEndian; #endif if (!IsOk) { Fail("\nOOOPPSS! You have CMS_USE_BIG_ENDIAN toggle misconfigured!\n\n" "Please, edit lcms2.h and %s the CMS_USE_BIG_ENDIAN toggle.\n", BigEndian? "uncomment" : "comment"); return 0; } return 1; } // Check quick floor static cmsInt32Number CheckQuickFloor(void) { if ((_cmsQuickFloor(1.234) != 1) || (_cmsQuickFloor(32767.234) != 32767) || (_cmsQuickFloor(-1.234) != -2) || (_cmsQuickFloor(-32767.1) != -32768)) { Fail("\nOOOPPSS! _cmsQuickFloor() does not work as expected in your machine!\n\n" "Please, edit lcms2.h and uncomment the CMS_DONT_USE_FAST_FLOOR toggle.\n"); return 0; } return 1; } // Quick floor restricted to word static cmsInt32Number CheckQuickFloorWord(void) { cmsUInt32Number i; for (i=0; i < 65535; i++) { if (_cmsQuickFloorWord((cmsFloat64Number) i + 0.1234) != i) { Fail("\nOOOPPSS! _cmsQuickFloorWord() does not work as expected in your machine!\n\n" "Please, edit lcms2.h and uncomment the CMS_DONT_USE_FAST_FLOOR toggle.\n"); return 0; } } return 1; } // ------------------------------------------------------------------------------------------------- // Precision stuff. // On 15.16 fixed point, this is the maximum we can obtain. Remember ICC profiles have storage limits on this number #define FIXED_PRECISION_15_16 (1.0 / 65535.0) // On 8.8 fixed point, that is the max we can obtain. #define FIXED_PRECISION_8_8 (1.0 / 255.0) // On cmsFloat32Number type, this is the precision we expect #define FLOAT_PRECISSION (0.00001) static cmsFloat64Number MaxErr; static cmsFloat64Number AllowedErr = FIXED_PRECISION_15_16; cmsBool IsGoodVal(const char *title, cmsFloat64Number in, cmsFloat64Number out, cmsFloat64Number max) { cmsFloat64Number Err = fabs(in - out); if (Err > MaxErr) MaxErr = Err; if ((Err > max )) { Fail("(%s): Must be %f, But is %f ", title, in, out); return FALSE; } return TRUE; } cmsBool IsGoodFixed15_16(const char *title, cmsFloat64Number in, cmsFloat64Number out) { return IsGoodVal(title, in, out, FIXED_PRECISION_15_16); } cmsBool IsGoodFixed8_8(const char *title, cmsFloat64Number in, cmsFloat64Number out) { return IsGoodVal(title, in, out, FIXED_PRECISION_8_8); } cmsBool IsGoodWord(const char *title, cmsUInt16Number in, cmsUInt16Number out) { if ((abs(in - out) > 0 )) { Fail("(%s): Must be %x, But is %x ", title, in, out); return FALSE; } return TRUE; } cmsBool IsGoodWordPrec(const char *title, cmsUInt16Number in, cmsUInt16Number out, cmsUInt16Number maxErr) { if ((abs(in - out) > maxErr )) { Fail("(%s): Must be %x, But is %x ", title, in, out); return FALSE; } return TRUE; } // Fixed point ---------------------------------------------------------------------------------------------- static cmsInt32Number TestSingleFixed15_16(cmsFloat64Number d) { cmsS15Fixed16Number f = _cmsDoubleTo15Fixed16(d); cmsFloat64Number RoundTrip = _cms15Fixed16toDouble(f); cmsFloat64Number Error = fabs(d - RoundTrip); return ( Error <= FIXED_PRECISION_15_16); } static cmsInt32Number CheckFixedPoint15_16(void) { if (!TestSingleFixed15_16(1.0)) return 0; if (!TestSingleFixed15_16(2.0)) return 0; if (!TestSingleFixed15_16(1.23456)) return 0; if (!TestSingleFixed15_16(0.99999)) return 0; if (!TestSingleFixed15_16(0.1234567890123456789099999)) return 0; if (!TestSingleFixed15_16(-1.0)) return 0; if (!TestSingleFixed15_16(-2.0)) return 0; if (!TestSingleFixed15_16(-1.23456)) return 0; if (!TestSingleFixed15_16(-1.1234567890123456789099999)) return 0; if (!TestSingleFixed15_16(+32767.1234567890123456789099999)) return 0; if (!TestSingleFixed15_16(-32767.1234567890123456789099999)) return 0; return 1; } static cmsInt32Number TestSingleFixed8_8(cmsFloat64Number d) { cmsS15Fixed16Number f = _cmsDoubleTo8Fixed8(d); cmsFloat64Number RoundTrip = _cms8Fixed8toDouble((cmsUInt16Number) f); cmsFloat64Number Error = fabs(d - RoundTrip); return ( Error <= FIXED_PRECISION_8_8); } static cmsInt32Number CheckFixedPoint8_8(void) { if (!TestSingleFixed8_8(1.0)) return 0; if (!TestSingleFixed8_8(2.0)) return 0; if (!TestSingleFixed8_8(1.23456)) return 0; if (!TestSingleFixed8_8(0.99999)) return 0; if (!TestSingleFixed8_8(0.1234567890123456789099999)) return 0; if (!TestSingleFixed8_8(+255.1234567890123456789099999)) return 0; return 1; } // D50 constant -------------------------------------------------------------------------------------------- static cmsInt32Number CheckD50Roundtrip(void) { cmsFloat64Number cmsD50X_2 = 0.96420288; cmsFloat64Number cmsD50Y_2 = 1.0; cmsFloat64Number cmsD50Z_2 = 0.82490540; cmsS15Fixed16Number xe = _cmsDoubleTo15Fixed16(cmsD50X); cmsS15Fixed16Number ye = _cmsDoubleTo15Fixed16(cmsD50Y); cmsS15Fixed16Number ze = _cmsDoubleTo15Fixed16(cmsD50Z); cmsFloat64Number x = _cms15Fixed16toDouble(xe); cmsFloat64Number y = _cms15Fixed16toDouble(ye); cmsFloat64Number z = _cms15Fixed16toDouble(ze); double dx = fabs(cmsD50X - x); double dy = fabs(cmsD50Y - y); double dz = fabs(cmsD50Z - z); double euc = sqrt(dx*dx + dy*dy + dz* dz); if (euc > 1E-5) { Fail("D50 roundtrip |err| > (%f) ", euc); return 0; } xe = _cmsDoubleTo15Fixed16(cmsD50X_2); ye = _cmsDoubleTo15Fixed16(cmsD50Y_2); ze = _cmsDoubleTo15Fixed16(cmsD50Z_2); x = _cms15Fixed16toDouble(xe); y = _cms15Fixed16toDouble(ye); z = _cms15Fixed16toDouble(ze); dx = fabs(cmsD50X_2 - x); dy = fabs(cmsD50Y_2 - y); dz = fabs(cmsD50Z_2 - z); euc = sqrt(dx*dx + dy*dy + dz* dz); if (euc > 1E-5) { Fail("D50 roundtrip |err| > (%f) ", euc); return 0; } return 1; } // Linear interpolation ----------------------------------------------------------------------------------------------- // Since prime factors of 65535 (FFFF) are, // // 0xFFFF = 3 * 5 * 17 * 257 // // I test tables of 2, 4, 6, and 18 points, that will be exact. static void BuildTable(cmsInt32Number n, cmsUInt16Number Tab[], cmsBool Descending) { cmsInt32Number i; for (i=0; i < n; i++) { cmsFloat64Number v = (cmsFloat64Number) ((cmsFloat64Number) 65535.0 * i ) / (n-1); Tab[Descending ? (n - i - 1) : i ] = (cmsUInt16Number) floor(v + 0.5); } } // A single function that does check 1D interpolation // nNodesToCheck = number on nodes to check // Down = Create decreasing tables // Reverse = Check reverse interpolation // max_err = max allowed error static cmsInt32Number Check1D(cmsInt32Number nNodesToCheck, cmsBool Down, cmsInt32Number max_err) { cmsUInt32Number i; cmsUInt16Number in, out; cmsInterpParams* p; cmsUInt16Number* Tab; Tab = (cmsUInt16Number*) malloc(sizeof(cmsUInt16Number)* nNodesToCheck); if (Tab == NULL) return 0; p = _cmsComputeInterpParams(DbgThread(), nNodesToCheck, 1, 1, Tab, CMS_LERP_FLAGS_16BITS); if (p == NULL) return 0; BuildTable(nNodesToCheck, Tab, Down); for (i=0; i <= 0xffff; i++) { in = (cmsUInt16Number) i; out = 0; p ->Interpolation.Lerp16(&in, &out, p); if (Down) out = 0xffff - out; if (abs(out - in) > max_err) { Fail("(%dp): Must be %x, But is %x : ", nNodesToCheck, in, out); _cmsFreeInterpParams(p); free(Tab); return 0; } } _cmsFreeInterpParams(p); free(Tab); return 1; } static cmsInt32Number Check1DLERP2(void) { return Check1D(2, FALSE, 0); } static cmsInt32Number Check1DLERP3(void) { return Check1D(3, FALSE, 1); } static cmsInt32Number Check1DLERP4(void) { return Check1D(4, FALSE, 0); } static cmsInt32Number Check1DLERP6(void) { return Check1D(6, FALSE, 0); } static cmsInt32Number Check1DLERP18(void) { return Check1D(18, FALSE, 0); } static cmsInt32Number Check1DLERP2Down(void) { return Check1D(2, TRUE, 0); } static cmsInt32Number Check1DLERP3Down(void) { return Check1D(3, TRUE, 1); } static cmsInt32Number Check1DLERP6Down(void) { return Check1D(6, TRUE, 0); } static cmsInt32Number Check1DLERP18Down(void) { return Check1D(18, TRUE, 0); } static cmsInt32Number ExhaustiveCheck1DLERP(void) { cmsUInt32Number j; printf("\n"); for (j=10; j <= 4096; j++) { if ((j % 10) == 0) printf("%u \r", j); if (!Check1D(j, FALSE, 1)) return 0; } printf("\rResult is "); return 1; } static cmsInt32Number ExhaustiveCheck1DLERPDown(void) { cmsUInt32Number j; printf("\n"); for (j=10; j <= 4096; j++) { if ((j % 10) == 0) printf("%u \r", j); if (!Check1D(j, TRUE, 1)) return 0; } printf("\rResult is "); return 1; } // 3D interpolation ------------------------------------------------------------------------------------------------- static cmsInt32Number Check3DinterpolationFloatTetrahedral(void) { cmsInterpParams* p; cmsInt32Number i; cmsFloat32Number In[3], Out[3]; cmsFloat32Number FloatTable[] = { //R G B 0, 0, 0, // B=0,G=0,R=0 0, 0, .25, // B=1,G=0,R=0 0, .5, 0, // B=0,G=1,R=0 0, .5, .25, // B=1,G=1,R=0 1, 0, 0, // B=0,G=0,R=1 1, 0, .25, // B=1,G=0,R=1 1, .5, 0, // B=0,G=1,R=1 1, .5, .25 // B=1,G=1,R=1 }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT); MaxErr = 0.0; for (i=0; i < 0xffff; i++) { In[0] = In[1] = In[2] = (cmsFloat32Number) ( (cmsFloat32Number) i / 65535.0F); p ->Interpolation.LerpFloat(In, Out, p); if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number Check3DinterpolationFloatTrilinear(void) { cmsInterpParams* p; cmsInt32Number i; cmsFloat32Number In[3], Out[3]; cmsFloat32Number FloatTable[] = { //R G B 0, 0, 0, // B=0,G=0,R=0 0, 0, .25, // B=1,G=0,R=0 0, .5, 0, // B=0,G=1,R=0 0, .5, .25, // B=1,G=1,R=0 1, 0, 0, // B=0,G=0,R=1 1, 0, .25, // B=1,G=0,R=1 1, .5, 0, // B=0,G=1,R=1 1, .5, .25 // B=1,G=1,R=1 }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT|CMS_LERP_FLAGS_TRILINEAR); MaxErr = 0.0; for (i=0; i < 0xffff; i++) { In[0] = In[1] = In[2] = (cmsFloat32Number) ( (cmsFloat32Number) i / 65535.0F); p ->Interpolation.LerpFloat(In, Out, p); if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number Check3DinterpolationTetrahedral16(void) { cmsInterpParams* p; cmsInt32Number i; cmsUInt16Number In[3], Out[3]; cmsUInt16Number Table[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_16BITS); MaxErr = 0.0; for (i=0; i < 0xffff; i++) { In[0] = In[1] = In[2] = (cmsUInt16Number) i; p ->Interpolation.Lerp16(In, Out, p); if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number Check3DinterpolationTrilinear16(void) { cmsInterpParams* p; cmsInt32Number i; cmsUInt16Number In[3], Out[3]; cmsUInt16Number Table[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_TRILINEAR); MaxErr = 0.0; for (i=0; i < 0xffff; i++) { In[0] = In[1] = In[2] = (cmsUInt16Number) i; p ->Interpolation.Lerp16(In, Out, p); if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number ExaustiveCheck3DinterpolationFloatTetrahedral(void) { cmsInterpParams* p; cmsInt32Number r, g, b; cmsFloat32Number In[3], Out[3]; cmsFloat32Number FloatTable[] = { //R G B 0, 0, 0, // B=0,G=0,R=0 0, 0, .25, // B=1,G=0,R=0 0, .5, 0, // B=0,G=1,R=0 0, .5, .25, // B=1,G=1,R=0 1, 0, 0, // B=0,G=0,R=1 1, 0, .25, // B=1,G=0,R=1 1, .5, 0, // B=0,G=1,R=1 1, .5, .25 // B=1,G=1,R=1 }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT); MaxErr = 0.0; for (r=0; r < 0xff; r++) for (g=0; g < 0xff; g++) for (b=0; b < 0xff; b++) { In[0] = (cmsFloat32Number) r / 255.0F; In[1] = (cmsFloat32Number) g / 255.0F; In[2] = (cmsFloat32Number) b / 255.0F; p ->Interpolation.LerpFloat(In, Out, p); if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number ExaustiveCheck3DinterpolationFloatTrilinear(void) { cmsInterpParams* p; cmsInt32Number r, g, b; cmsFloat32Number In[3], Out[3]; cmsFloat32Number FloatTable[] = { //R G B 0, 0, 0, // B=0,G=0,R=0 0, 0, .25, // B=1,G=0,R=0 0, .5, 0, // B=0,G=1,R=0 0, .5, .25, // B=1,G=1,R=0 1, 0, 0, // B=0,G=0,R=1 1, 0, .25, // B=1,G=0,R=1 1, .5, 0, // B=0,G=1,R=1 1, .5, .25 // B=1,G=1,R=1 }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT|CMS_LERP_FLAGS_TRILINEAR); MaxErr = 0.0; for (r=0; r < 0xff; r++) for (g=0; g < 0xff; g++) for (b=0; b < 0xff; b++) { In[0] = (cmsFloat32Number) r / 255.0F; In[1] = (cmsFloat32Number) g / 255.0F; In[2] = (cmsFloat32Number) b / 255.0F; p ->Interpolation.LerpFloat(In, Out, p); if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number ExhaustiveCheck3DinterpolationTetrahedral16(void) { cmsInterpParams* p; cmsInt32Number r, g, b; cmsUInt16Number In[3], Out[3]; cmsUInt16Number Table[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_16BITS); for (r=0; r < 0xff; r++) for (g=0; g < 0xff; g++) for (b=0; b < 0xff; b++) { In[0] = (cmsUInt16Number) r ; In[1] = (cmsUInt16Number) g ; In[2] = (cmsUInt16Number) b ; p ->Interpolation.Lerp16(In, Out, p); if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; } _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } static cmsInt32Number ExhaustiveCheck3DinterpolationTrilinear16(void) { cmsInterpParams* p; cmsInt32Number r, g, b; cmsUInt16Number In[3], Out[3]; cmsUInt16Number Table[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_TRILINEAR); for (r=0; r < 0xff; r++) for (g=0; g < 0xff; g++) for (b=0; b < 0xff; b++) { In[0] = (cmsUInt16Number) r ; In[1] = (cmsUInt16Number)g ; In[2] = (cmsUInt16Number)b ; p ->Interpolation.Lerp16(In, Out, p); if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; } _cmsFreeInterpParams(p); return 1; Error: _cmsFreeInterpParams(p); return 0; } // Check reverse interpolation on LUTS. This is right now exclusively used by K preservation algorithm static cmsInt32Number CheckReverseInterpolation3x3(void) { cmsPipeline* Lut; cmsStage* clut; cmsFloat32Number Target[3], Result[3], Hint[3]; cmsFloat32Number err, max; cmsInt32Number i; cmsUInt16Number Table[] = { 0, 0, 0, // 0 0 0 0, 0, 0xffff, // 0 0 1 0, 0xffff, 0, // 0 1 0 0, 0xffff, 0xffff, // 0 1 1 0xffff, 0, 0, // 1 0 0 0xffff, 0, 0xffff, // 1 0 1 0xffff, 0xffff, 0, // 1 1 0 0xffff, 0xffff, 0xffff, // 1 1 1 }; Lut = cmsPipelineAlloc(DbgThread(), 3, 3); clut = cmsStageAllocCLut16bit(DbgThread(), 2, 3, 3, Table); cmsPipelineInsertStage(Lut, cmsAT_BEGIN, clut); Target[0] = 0; Target[1] = 0; Target[2] = 0; Hint[0] = 0; Hint[1] = 0; Hint[2] = 0; cmsPipelineEvalReverseFloat(Target, Result, NULL, Lut); if (Result[0] != 0 || Result[1] != 0 || Result[2] != 0){ Fail("Reverse interpolation didn't find zero"); return 0; } // Transverse identity max = 0; for (i=0; i <= 100; i++) { cmsFloat32Number in = i / 100.0F; Target[0] = in; Target[1] = 0; Target[2] = 0; cmsPipelineEvalReverseFloat(Target, Result, Hint, Lut); err = fabsf(in - Result[0]); if (err > max) max = err; memcpy(Hint, Result, sizeof(Hint)); } cmsPipelineFree(Lut); return (max <= FLOAT_PRECISSION); } static cmsInt32Number CheckReverseInterpolation4x3(void) { cmsPipeline* Lut; cmsStage* clut; cmsFloat32Number Target[4], Result[4], Hint[4]; cmsFloat32Number err, max; cmsInt32Number i; // 4 -> 3, output gets 3 first channels copied cmsUInt16Number Table[] = { 0, 0, 0, // 0 0 0 0 = ( 0, 0, 0) 0, 0, 0, // 0 0 0 1 = ( 0, 0, 0) 0, 0, 0xffff, // 0 0 1 0 = ( 0, 0, 1) 0, 0, 0xffff, // 0 0 1 1 = ( 0, 0, 1) 0, 0xffff, 0, // 0 1 0 0 = ( 0, 1, 0) 0, 0xffff, 0, // 0 1 0 1 = ( 0, 1, 0) 0, 0xffff, 0xffff, // 0 1 1 0 = ( 0, 1, 1) 0, 0xffff, 0xffff, // 0 1 1 1 = ( 0, 1, 1) 0xffff, 0, 0, // 1 0 0 0 = ( 1, 0, 0) 0xffff, 0, 0, // 1 0 0 1 = ( 1, 0, 0) 0xffff, 0, 0xffff, // 1 0 1 0 = ( 1, 0, 1) 0xffff, 0, 0xffff, // 1 0 1 1 = ( 1, 0, 1) 0xffff, 0xffff, 0, // 1 1 0 0 = ( 1, 1, 0) 0xffff, 0xffff, 0, // 1 1 0 1 = ( 1, 1, 0) 0xffff, 0xffff, 0xffff, // 1 1 1 0 = ( 1, 1, 1) 0xffff, 0xffff, 0xffff, // 1 1 1 1 = ( 1, 1, 1) }; Lut = cmsPipelineAlloc(DbgThread(), 4, 3); clut = cmsStageAllocCLut16bit(DbgThread(), 2, 4, 3, Table); cmsPipelineInsertStage(Lut, cmsAT_BEGIN, clut); // Check if the LUT is behaving as expected SubTest("4->3 feasibility"); for (i=0; i <= 100; i++) { Target[0] = i / 100.0F; Target[1] = Target[0]; Target[2] = 0; Target[3] = 12; cmsPipelineEvalFloat(Target, Result, Lut); if (!IsGoodFixed15_16("0", Target[0], Result[0])) return 0; if (!IsGoodFixed15_16("1", Target[1], Result[1])) return 0; if (!IsGoodFixed15_16("2", Target[2], Result[2])) return 0; } SubTest("4->3 zero"); Target[0] = 0; Target[1] = 0; Target[2] = 0; // This one holds the fixed K Target[3] = 0; // This is our hint (which is a big lie in this case) Hint[0] = 0.1F; Hint[1] = 0.1F; Hint[2] = 0.1F; cmsPipelineEvalReverseFloat(Target, Result, Hint, Lut); if (Result[0] != 0 || Result[1] != 0 || Result[2] != 0 || Result[3] != 0){ Fail("Reverse interpolation didn't find zero"); return 0; } SubTest("4->3 find CMY"); max = 0; for (i=0; i <= 100; i++) { cmsFloat32Number in = i / 100.0F; Target[0] = in; Target[1] = 0; Target[2] = 0; cmsPipelineEvalReverseFloat(Target, Result, Hint, Lut); err = fabsf(in - Result[0]); if (err > max) max = err; memcpy(Hint, Result, sizeof(Hint)); } cmsPipelineFree(Lut); return (max <= FLOAT_PRECISSION); } // Check all interpolation. static cmsUInt16Number Fn8D1(cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7, cmsUInt16Number a8, cmsUInt32Number m) { return (cmsUInt16Number) ((a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8) / m); } static cmsUInt16Number Fn8D2(cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7, cmsUInt16Number a8, cmsUInt32Number m) { return (cmsUInt16Number) ((a1 + 3* a2 + 3* a3 + a4 + a5 + a6 + a7 + a8 ) / (m + 4)); } static cmsUInt16Number Fn8D3(cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7, cmsUInt16Number a8, cmsUInt32Number m) { return (cmsUInt16Number) ((3*a1 + 2*a2 + 3*a3 + a4 + a5 + a6 + a7 + a8) / (m + 5)); } static cmsInt32Number Sampler3D(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], 0, 0, 0, 0, 0, 3); Out[1] = Fn8D2(In[0], In[1], In[2], 0, 0, 0, 0, 0, 3); Out[2] = Fn8D3(In[0], In[1], In[2], 0, 0, 0, 0, 0, 3); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsInt32Number Sampler4D(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], In[3], 0, 0, 0, 0, 4); Out[1] = Fn8D2(In[0], In[1], In[2], In[3], 0, 0, 0, 0, 4); Out[2] = Fn8D3(In[0], In[1], In[2], In[3], 0, 0, 0, 0, 4); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsInt32Number Sampler5D(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], 0, 0, 0, 5); Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], 0, 0, 0, 5); Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], 0, 0, 0, 5); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsInt32Number Sampler6D(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], In[5], 0, 0, 6); Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], In[5], 0, 0, 6); Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], In[5], 0, 0, 6); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsInt32Number Sampler7D(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], In[5], In[6], 0, 7); Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], In[5], In[6], 0, 7); Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], In[5], In[6], 0, 7); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsInt32Number Sampler8D(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo) { Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], In[5], In[6], In[7], 8); Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], In[5], In[6], In[7], 8); Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], In[5], In[6], In[7], 8); return 1; cmsUNUSED_PARAMETER(Cargo); } static cmsBool CheckOne3D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3) { cmsUInt16Number In[3], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler3D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsBool CheckOne4D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4) { cmsUInt16Number In[4], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler4D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsBool CheckOne5D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5) { cmsUInt16Number In[5], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler5D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsBool CheckOne6D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6) { cmsUInt16Number In[6], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; In[5] = a6; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler6D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsBool CheckOne7D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7) { cmsUInt16Number In[7], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; In[5] = a6; In[6] = a7; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler7D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsBool CheckOne8D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7, cmsUInt16Number a8) { cmsUInt16Number In[8], Out1[3], Out2[3]; In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; In[5] = a6; In[6] = a7; In[7] = a8; // This is the interpolated value cmsPipelineEval16(In, Out1, lut); // This is the real value Sampler8D(In, Out2, NULL); // Let's see the difference if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; return TRUE; } static cmsInt32Number Check3Dinterp(void) { cmsPipeline* lut; cmsStage* mpe; lut = cmsPipelineAlloc(DbgThread(), 3, 3); mpe = cmsStageAllocCLut16bit(DbgThread(), 9, 3, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler3D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne3D(lut, 0, 0, 0)) return 0; if (!CheckOne3D(lut, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne3D(lut, 0x8080, 0x8080, 0x8080)) return 0; if (!CheckOne3D(lut, 0x0000, 0xFE00, 0x80FF)) return 0; if (!CheckOne3D(lut, 0x1111, 0x2222, 0x3333)) return 0; if (!CheckOne3D(lut, 0x0000, 0x0012, 0x0013)) return 0; if (!CheckOne3D(lut, 0x3141, 0x1415, 0x1592)) return 0; if (!CheckOne3D(lut, 0xFF00, 0xFF01, 0xFF12)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check3DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 7, 8, 9 }; lut = cmsPipelineAlloc(DbgThread(), 3, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 3, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler3D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne3D(lut, 0, 0, 0)) return 0; if (!CheckOne3D(lut, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne3D(lut, 0x8080, 0x8080, 0x8080)) return 0; if (!CheckOne3D(lut, 0x0000, 0xFE00, 0x80FF)) return 0; if (!CheckOne3D(lut, 0x1111, 0x2222, 0x3333)) return 0; if (!CheckOne3D(lut, 0x0000, 0x0012, 0x0013)) return 0; if (!CheckOne3D(lut, 0x3141, 0x1415, 0x1592)) return 0; if (!CheckOne3D(lut, 0xFF00, 0xFF01, 0xFF12)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check4Dinterp(void) { cmsPipeline* lut; cmsStage* mpe; lut = cmsPipelineAlloc(DbgThread(), 4, 3); mpe = cmsStageAllocCLut16bit(DbgThread(), 9, 4, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler4D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne4D(lut, 0, 0, 0, 0)) return 0; if (!CheckOne4D(lut, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne4D(lut, 0x8080, 0x8080, 0x8080, 0x8080)) return 0; if (!CheckOne4D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888)) return 0; if (!CheckOne4D(lut, 0x1111, 0x2222, 0x3333, 0x4444)) return 0; if (!CheckOne4D(lut, 0x0000, 0x0012, 0x0013, 0x0014)) return 0; if (!CheckOne4D(lut, 0x3141, 0x1415, 0x1592, 0x9261)) return 0; if (!CheckOne4D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check4DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 9, 8, 7, 6 }; lut = cmsPipelineAlloc(DbgThread(), 4, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 4, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler4D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne4D(lut, 0, 0, 0, 0)) return 0; if (!CheckOne4D(lut, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne4D(lut, 0x8080, 0x8080, 0x8080, 0x8080)) return 0; if (!CheckOne4D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888)) return 0; if (!CheckOne4D(lut, 0x1111, 0x2222, 0x3333, 0x4444)) return 0; if (!CheckOne4D(lut, 0x0000, 0x0012, 0x0013, 0x0014)) return 0; if (!CheckOne4D(lut, 0x3141, 0x1415, 0x1592, 0x9261)) return 0; if (!CheckOne4D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check5DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 3, 2, 2, 2, 2 }; lut = cmsPipelineAlloc(DbgThread(), 5, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 5, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler5D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne5D(lut, 0, 0, 0, 0, 0)) return 0; if (!CheckOne5D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne5D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234)) return 0; if (!CheckOne5D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078)) return 0; if (!CheckOne5D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455)) return 0; if (!CheckOne5D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333)) return 0; if (!CheckOne5D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567)) return 0; if (!CheckOne5D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check6DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 4, 3, 3, 2, 2, 2 }; lut = cmsPipelineAlloc(DbgThread(), 6, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 6, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler6D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne6D(lut, 0, 0, 0, 0, 0, 0)) return 0; if (!CheckOne6D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne6D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234, 0x1122)) return 0; if (!CheckOne6D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078, 0x2233)) return 0; if (!CheckOne6D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455, 0x3344)) return 0; if (!CheckOne6D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333, 0x4455)) return 0; if (!CheckOne6D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567, 0x5566)) return 0; if (!CheckOne6D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344, 0x6677)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check7DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 4, 3, 3, 2, 2, 2, 2 }; lut = cmsPipelineAlloc(DbgThread(), 7, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 7, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler7D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne7D(lut, 0, 0, 0, 0, 0, 0, 0)) return 0; if (!CheckOne7D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne7D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234, 0x1122, 0x0056)) return 0; if (!CheckOne7D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078, 0x2233, 0x0088)) return 0; if (!CheckOne7D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455, 0x3344, 0x1987)) return 0; if (!CheckOne7D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333, 0x4455, 0x9988)) return 0; if (!CheckOne7D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567, 0x5566, 0xfe56)) return 0; if (!CheckOne7D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344, 0x6677, 0xbabe)) return 0; cmsPipelineFree(lut); return 1; } static cmsInt32Number Check8DinterpGranular(void) { cmsPipeline* lut; cmsStage* mpe; cmsUInt32Number Dimensions[] = { 4, 3, 3, 2, 2, 2, 2, 2 }; lut = cmsPipelineAlloc(DbgThread(), 8, 3); mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 8, 3, NULL); cmsStageSampleCLut16bit(mpe, Sampler8D, NULL, 0); cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); // Check accuracy if (!CheckOne8D(lut, 0, 0, 0, 0, 0, 0, 0, 0)) return 0; if (!CheckOne8D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; if (!CheckOne8D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234, 0x1122, 0x0056, 0x0011)) return 0; if (!CheckOne8D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078, 0x2233, 0x0088, 0x2020)) return 0; if (!CheckOne8D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455, 0x3344, 0x1987, 0x4532)) return 0; if (!CheckOne8D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333, 0x4455, 0x9988, 0x1200)) return 0; if (!CheckOne8D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567, 0x5566, 0xfe56, 0x6666)) return 0; if (!CheckOne8D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344, 0x6677, 0xbabe, 0xface)) return 0; cmsPipelineFree(lut); return 1; } // Colorimetric conversions ------------------------------------------------------------------------------------------------- // Lab to LCh and back should be performed at 1E-12 accuracy at least static cmsInt32Number CheckLab2LCh(void) { cmsInt32Number l, a, b; cmsFloat64Number dist, Max = 0; cmsCIELab Lab, Lab2; cmsCIELCh LCh; for (l=0; l <= 100; l += 10) { for (a=-128; a <= +128; a += 8) { for (b=-128; b <= 128; b += 8) { Lab.L = l; Lab.a = a; Lab.b = b; cmsLab2LCh(&LCh, &Lab); cmsLCh2Lab(&Lab2, &LCh); dist = cmsDeltaE(&Lab, &Lab2); if (dist > Max) Max = dist; } } } return Max < 1E-12; } // Lab to LCh and back should be performed at 1E-12 accuracy at least static cmsInt32Number CheckLab2XYZ(void) { cmsInt32Number l, a, b; cmsFloat64Number dist, Max = 0; cmsCIELab Lab, Lab2; cmsCIEXYZ XYZ; for (l=0; l <= 100; l += 10) { for (a=-128; a <= +128; a += 8) { for (b=-128; b <= 128; b += 8) { Lab.L = l; Lab.a = a; Lab.b = b; cmsLab2XYZ(NULL, &XYZ, &Lab); cmsXYZ2Lab(NULL, &Lab2, &XYZ); dist = cmsDeltaE(&Lab, &Lab2); if (dist > Max) Max = dist; } } } return Max < 1E-12; } // Lab to xyY and back should be performed at 1E-12 accuracy at least static cmsInt32Number CheckLab2xyY(void) { cmsInt32Number l, a, b; cmsFloat64Number dist, Max = 0; cmsCIELab Lab, Lab2; cmsCIEXYZ XYZ; cmsCIExyY xyY; for (l=0; l <= 100; l += 10) { for (a=-128; a <= +128; a += 8) { for (b=-128; b <= 128; b += 8) { Lab.L = l; Lab.a = a; Lab.b = b; cmsLab2XYZ(NULL, &XYZ, &Lab); cmsXYZ2xyY(&xyY, &XYZ); cmsxyY2XYZ(&XYZ, &xyY); cmsXYZ2Lab(NULL, &Lab2, &XYZ); dist = cmsDeltaE(&Lab, &Lab2); if (dist > Max) Max = dist; } } } return Max < 1E-12; } static cmsInt32Number CheckLabV2encoding(void) { cmsInt32Number n2, i, j; cmsUInt16Number Inw[3], aw[3]; cmsCIELab Lab; n2=0; for (j=0; j < 65535; j++) { Inw[0] = Inw[1] = Inw[2] = (cmsUInt16Number) j; cmsLabEncoded2FloatV2(&Lab, Inw); cmsFloat2LabEncodedV2(aw, &Lab); for (i=0; i < 3; i++) { if (aw[i] != j) { n2++; } } } return (n2 == 0); } static cmsInt32Number CheckLabV4encoding(void) { cmsInt32Number n2, i, j; cmsUInt16Number Inw[3], aw[3]; cmsCIELab Lab; n2=0; for (j=0; j < 65535; j++) { Inw[0] = Inw[1] = Inw[2] = (cmsUInt16Number) j; cmsLabEncoded2Float(&Lab, Inw); cmsFloat2LabEncoded(aw, &Lab); for (i=0; i < 3; i++) { if (aw[i] != j) { n2++; } } } return (n2 == 0); } // BlackBody ----------------------------------------------------------------------------------------------------- static cmsInt32Number CheckTemp2CHRM(void) { cmsInt32Number j; cmsFloat64Number d, v, Max = 0; cmsCIExyY White; for (j=4000; j < 25000; j++) { cmsWhitePointFromTemp(&White, j); if (!cmsTempFromWhitePoint(&v, &White)) return 0; d = fabs(v - j); if (d > Max) Max = d; } // 100 degree is the actual resolution return (Max < 100); } // Tone curves ----------------------------------------------------------------------------------------------------- static cmsInt32Number CheckGammaEstimation(cmsToneCurve* c, cmsFloat64Number g) { cmsFloat64Number est = cmsEstimateGamma(c, 0.001); SubTest("Gamma estimation"); if (fabs(est - g) > 0.001) return 0; return 1; } static cmsInt32Number CheckGammaCreation16(void) { cmsToneCurve* LinGamma = cmsBuildGamma(DbgThread(), 1.0); cmsInt32Number i; cmsUInt16Number in, out; for (i=0; i < 0xffff; i++) { in = (cmsUInt16Number) i; out = cmsEvalToneCurve16(LinGamma, in); if (in != out) { Fail("(lin gamma): Must be %x, But is %x : ", in, out); cmsFreeToneCurve(LinGamma); return 0; } } if (!CheckGammaEstimation(LinGamma, 1.0)) return 0; cmsFreeToneCurve(LinGamma); return 1; } static cmsInt32Number CheckGammaCreationFlt(void) { cmsToneCurve* LinGamma = cmsBuildGamma(DbgThread(), 1.0); cmsInt32Number i; cmsFloat32Number in, out; for (i=0; i < 0xffff; i++) { in = (cmsFloat32Number) (i / 65535.0); out = cmsEvalToneCurveFloat(LinGamma, in); if (fabs(in - out) > (1/65535.0)) { Fail("(lin gamma): Must be %f, But is %f : ", in, out); cmsFreeToneCurve(LinGamma); return 0; } } if (!CheckGammaEstimation(LinGamma, 1.0)) return 0; cmsFreeToneCurve(LinGamma); return 1; } // Curve curves using a single power function // Error is given in 0..ffff counts static cmsInt32Number CheckGammaFloat(cmsFloat64Number g) { cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), g); cmsInt32Number i; cmsFloat32Number in, out; cmsFloat64Number val, Err; MaxErr = 0.0; for (i=0; i < 0xffff; i++) { in = (cmsFloat32Number) (i / 65535.0); out = cmsEvalToneCurveFloat(Curve, in); val = pow((cmsFloat64Number) in, g); Err = fabs( val - out); if (Err > MaxErr) MaxErr = Err; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr * 65535.0); if (!CheckGammaEstimation(Curve, g)) return 0; cmsFreeToneCurve(Curve); return 1; } static cmsInt32Number CheckGamma18(void) { return CheckGammaFloat(1.8); } static cmsInt32Number CheckGamma22(void) { return CheckGammaFloat(2.2); } static cmsInt32Number CheckGamma30(void) { return CheckGammaFloat(3.0); } // Check table-based gamma functions static cmsInt32Number CheckGammaFloatTable(cmsFloat64Number g) { cmsFloat32Number Values[1025]; cmsToneCurve* Curve; cmsInt32Number i; cmsFloat32Number in, out; cmsFloat64Number val, Err; for (i=0; i <= 1024; i++) { in = (cmsFloat32Number) (i / 1024.0); Values[i] = powf(in, (float) g); } Curve = cmsBuildTabulatedToneCurveFloat(DbgThread(), 1025, Values); MaxErr = 0.0; for (i=0; i <= 0xffff; i++) { in = (cmsFloat32Number) (i / 65535.0); out = cmsEvalToneCurveFloat(Curve, in); val = pow(in, g); Err = fabs(val - out); if (Err > MaxErr) MaxErr = Err; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr * 65535.0); if (!CheckGammaEstimation(Curve, g)) return 0; cmsFreeToneCurve(Curve); return 1; } static cmsInt32Number CheckGamma18Table(void) { return CheckGammaFloatTable(1.8); } static cmsInt32Number CheckGamma22Table(void) { return CheckGammaFloatTable(2.2); } static cmsInt32Number CheckGamma30Table(void) { return CheckGammaFloatTable(3.0); } // Create a curve from a table (which is a pure gamma function) and check it against the pow function. static cmsInt32Number CheckGammaWordTable(cmsFloat64Number g) { cmsUInt16Number Values[1025]; cmsToneCurve* Curve; cmsInt32Number i; cmsFloat32Number in, out; cmsFloat64Number val, Err; for (i=0; i <= 1024; i++) { in = (cmsFloat32Number) (i / 1024.0); Values[i] = (cmsUInt16Number) floor(pow(in, g) * 65535.0 + 0.5); } Curve = cmsBuildTabulatedToneCurve16(DbgThread(), 1025, Values); MaxErr = 0.0; for (i=0; i <= 0xffff; i++) { in = (cmsFloat32Number) (i / 65535.0); out = cmsEvalToneCurveFloat(Curve, in); val = pow(in, g); Err = fabs(val - out); if (Err > MaxErr) MaxErr = Err; } if (MaxErr > 0) printf("|Err|<%lf ", MaxErr * 65535.0); if (!CheckGammaEstimation(Curve, g)) return 0; cmsFreeToneCurve(Curve); return 1; } static cmsInt32Number CheckGamma18TableWord(void) { return CheckGammaWordTable(1.8); } static cmsInt32Number CheckGamma22TableWord(void) { return CheckGammaWordTable(2.2); } static cmsInt32Number CheckGamma30TableWord(void) { return CheckGammaWordTable(3.0); } // Curve joining test. Joining two high-gamma of 3.0 curves should // give something like linear static cmsInt32Number CheckJointCurves(void) { cmsToneCurve *Forward, *Reverse, *Result; cmsBool rc; Forward = cmsBuildGamma(DbgThread(), 3.0); Reverse = cmsBuildGamma(DbgThread(), 3.0); Result = cmsJoinToneCurve(DbgThread(), Forward, Reverse, 256); cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); rc = cmsIsToneCurveLinear(Result); cmsFreeToneCurve(Result); if (!rc) Fail("Joining same curve twice does not result in a linear ramp"); return rc; } // Create a gamma curve by cheating the table static cmsToneCurve* GammaTableLinear(cmsInt32Number nEntries, cmsBool Dir) { cmsInt32Number i; cmsToneCurve* g = cmsBuildTabulatedToneCurve16(DbgThread(), nEntries, NULL); for (i=0; i < nEntries; i++) { cmsInt32Number v = _cmsQuantizeVal(i, nEntries); if (Dir) g->Table16[i] = (cmsUInt16Number) v; else g->Table16[i] = (cmsUInt16Number) (0xFFFF - v); } return g; } static cmsInt32Number CheckJointCurvesDescending(void) { cmsToneCurve *Forward, *Reverse, *Result; cmsInt32Number i, rc; Forward = cmsBuildGamma(DbgThread(), 2.2); // Fake the curve to be table-based for (i=0; i < 4096; i++) Forward ->Table16[i] = 0xffff - Forward->Table16[i]; Forward ->Segments[0].Type = 0; Reverse = cmsReverseToneCurve(Forward); Result = cmsJoinToneCurve(DbgThread(), Reverse, Reverse, 256); cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); rc = cmsIsToneCurveLinear(Result); cmsFreeToneCurve(Result); return rc; } static cmsInt32Number CheckFToneCurvePoint(cmsToneCurve* c, cmsUInt16Number Point, cmsInt32Number Value) { cmsInt32Number Result; Result = cmsEvalToneCurve16(c, Point); return (abs(Value - Result) < 2); } static cmsInt32Number CheckReverseDegenerated(void) { cmsToneCurve* p, *g; cmsUInt16Number Tab[16]; Tab[0] = 0; Tab[1] = 0; Tab[2] = 0; Tab[3] = 0; Tab[4] = 0; Tab[5] = 0x5555; Tab[6] = 0x6666; Tab[7] = 0x7777; Tab[8] = 0x8888; Tab[9] = 0x9999; Tab[10]= 0xffff; Tab[11]= 0xffff; Tab[12]= 0xffff; Tab[13]= 0xffff; Tab[14]= 0xffff; Tab[15]= 0xffff; p = cmsBuildTabulatedToneCurve16(DbgThread(), 16, Tab); g = cmsReverseToneCurve(p); // Now let's check some points if (!CheckFToneCurvePoint(g, 0x5555, 0x5555)) return 0; if (!CheckFToneCurvePoint(g, 0x7777, 0x7777)) return 0; // First point for zero if (!CheckFToneCurvePoint(g, 0x0000, 0x4444)) return 0; // Last point if (!CheckFToneCurvePoint(g, 0xFFFF, 0xFFFF)) return 0; cmsFreeToneCurve(p); cmsFreeToneCurve(g); return 1; } // Build a parametric sRGB-like curve static cmsToneCurve* Build_sRGBGamma(void) { cmsFloat64Number Parameters[5]; Parameters[0] = 2.4; Parameters[1] = 1. / 1.055; Parameters[2] = 0.055 / 1.055; Parameters[3] = 1. / 12.92; Parameters[4] = 0.04045; // d return cmsBuildParametricToneCurve(DbgThread(), 4, Parameters); } // Join two gamma tables in floting point format. Result should be a straight line static cmsToneCurve* CombineGammaFloat(cmsToneCurve* g1, cmsToneCurve* g2) { cmsUInt16Number Tab[256]; cmsFloat32Number f; cmsInt32Number i; for (i=0; i < 256; i++) { f = (cmsFloat32Number) i / 255.0F; f = cmsEvalToneCurveFloat(g2, cmsEvalToneCurveFloat(g1, f)); Tab[i] = (cmsUInt16Number) floor(f * 65535.0 + 0.5); } return cmsBuildTabulatedToneCurve16(DbgThread(), 256, Tab); } // Same of anterior, but using quantized tables static cmsToneCurve* CombineGamma16(cmsToneCurve* g1, cmsToneCurve* g2) { cmsUInt16Number Tab[256]; cmsInt32Number i; for (i=0; i < 256; i++) { cmsUInt16Number wValIn; wValIn = _cmsQuantizeVal(i, 256); Tab[i] = cmsEvalToneCurve16(g2, cmsEvalToneCurve16(g1, wValIn)); } return cmsBuildTabulatedToneCurve16(DbgThread(), 256, Tab); } static cmsInt32Number CheckJointFloatCurves_sRGB(void) { cmsToneCurve *Forward, *Reverse, *Result; cmsBool rc; Forward = Build_sRGBGamma(); Reverse = cmsReverseToneCurve(Forward); Result = CombineGammaFloat(Forward, Reverse); cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); rc = cmsIsToneCurveLinear(Result); cmsFreeToneCurve(Result); return rc; } static cmsInt32Number CheckJoint16Curves_sRGB(void) { cmsToneCurve *Forward, *Reverse, *Result; cmsBool rc; Forward = Build_sRGBGamma(); Reverse = cmsReverseToneCurve(Forward); Result = CombineGamma16(Forward, Reverse); cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); rc = cmsIsToneCurveLinear(Result); cmsFreeToneCurve(Result); return rc; } // sigmoidal curve f(x) = (1-x^g) ^(1/g) static cmsInt32Number CheckJointCurvesSShaped(void) { cmsFloat64Number p = 3.2; cmsToneCurve *Forward, *Reverse, *Result; cmsInt32Number rc; Forward = cmsBuildParametricToneCurve(DbgThread(), 108, &p); Reverse = cmsReverseToneCurve(Forward); Result = cmsJoinToneCurve(DbgThread(), Forward, Forward, 4096); cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); rc = cmsIsToneCurveLinear(Result); cmsFreeToneCurve(Result); return rc; } // -------------------------------------------------------------------------------------------------------- // Implementation of some tone curve functions static cmsFloat32Number Gamma(cmsFloat32Number x, const cmsFloat64Number Params[]) { return (cmsFloat32Number) pow(x, Params[0]); } static cmsFloat32Number CIE122(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number e, Val; if (x >= -Params[2] / Params[1]) { e = Params[1]*x + Params[2]; if (e > 0) Val = pow(e, Params[0]); else Val = 0; } else Val = 0; return (cmsFloat32Number) Val; } static cmsFloat32Number IEC61966_3(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number e, Val; if (x >= -Params[2] / Params[1]) { e = Params[1]*x + Params[2]; if (e > 0) Val = pow(e, Params[0]) + Params[3]; else Val = 0; } else Val = Params[3]; return (cmsFloat32Number) Val; } static cmsFloat32Number IEC61966_21(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number e, Val; if (x >= Params[4]) { e = Params[1]*x + Params[2]; if (e > 0) Val = pow(e, Params[0]); else Val = 0; } else Val = x * Params[3]; return (cmsFloat32Number) Val; } static cmsFloat32Number param_5(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number e, Val; // Y = (aX + b)^Gamma + e | X >= d // Y = cX + f | else if (x >= Params[4]) { e = Params[1]*x + Params[2]; if (e > 0) Val = pow(e, Params[0]) + Params[5]; else Val = 0; } else Val = x*Params[3] + Params[6]; return (cmsFloat32Number) Val; } static cmsFloat32Number param_6(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number e, Val; e = Params[1]*x + Params[2]; if (e > 0) Val = pow(e, Params[0]) + Params[3]; else Val = 0; return (cmsFloat32Number) Val; } static cmsFloat32Number param_7(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number Val; Val = Params[1]*log10(Params[2] * pow(x, Params[0]) + Params[3]) + Params[4]; return (cmsFloat32Number) Val; } static cmsFloat32Number param_8(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number Val; Val = (Params[0] * pow(Params[1], Params[2] * x + Params[3]) + Params[4]); return (cmsFloat32Number) Val; } static cmsFloat32Number sigmoidal(cmsFloat32Number x, const cmsFloat64Number Params[]) { cmsFloat64Number Val; Val = pow(1.0 - pow(1 - x, 1/Params[0]), 1/Params[0]); return (cmsFloat32Number) Val; } static cmsBool CheckSingleParametric(const char* Name, dblfnptr fn, cmsInt32Number Type, const cmsFloat64Number Params[]) { cmsInt32Number i; cmsToneCurve* tc; cmsToneCurve* tc_1; char InverseText[256]; tc = cmsBuildParametricToneCurve(DbgThread(), Type, Params); tc_1 = cmsBuildParametricToneCurve(DbgThread(), -Type, Params); for (i=0; i <= 1000; i++) { cmsFloat32Number x = (cmsFloat32Number) i / 1000; cmsFloat32Number y_fn, y_param, x_param, y_param2; y_fn = fn(x, Params); y_param = cmsEvalToneCurveFloat(tc, x); x_param = cmsEvalToneCurveFloat(tc_1, y_param); y_param2 = fn(x_param, Params); if (!IsGoodVal(Name, y_fn, y_param, FIXED_PRECISION_15_16)) goto Error; sprintf(InverseText, "Inverse %s", Name); if (!IsGoodVal(InverseText, y_fn, y_param2, FIXED_PRECISION_15_16)) goto Error; } cmsFreeToneCurve(tc); cmsFreeToneCurve(tc_1); return TRUE; Error: cmsFreeToneCurve(tc); cmsFreeToneCurve(tc_1); return FALSE; } // Check against some known values static cmsInt32Number CheckParametricToneCurves(void) { cmsFloat64Number Params[10]; // 1) X = Y ^ Gamma Params[0] = 2.2; if (!CheckSingleParametric("Gamma", Gamma, 1, Params)) return 0; // 2) CIE 122-1966 // Y = (aX + b)^Gamma | X >= -b/a // Y = 0 | else Params[0] = 2.2; Params[1] = 1.5; Params[2] = -0.5; if (!CheckSingleParametric("CIE122-1966", CIE122, 2, Params)) return 0; // 3) IEC 61966-3 // Y = (aX + b)^Gamma | X <= -b/a // Y = c | else Params[0] = 2.2; Params[1] = 1.5; Params[2] = -0.5; Params[3] = 0.3; if (!CheckSingleParametric("IEC 61966-3", IEC61966_3, 3, Params)) return 0; // 4) IEC 61966-2.1 (sRGB) // Y = (aX + b)^Gamma | X >= d // Y = cX | X < d Params[0] = 2.4; Params[1] = 1. / 1.055; Params[2] = 0.055 / 1.055; Params[3] = 1. / 12.92; Params[4] = 0.04045; if (!CheckSingleParametric("IEC 61966-2.1", IEC61966_21, 4, Params)) return 0; // 5) Y = (aX + b)^Gamma + e | X >= d // Y = cX + f | else Params[0] = 2.2; Params[1] = 0.7; Params[2] = 0.2; Params[3] = 0.3; Params[4] = 0.1; Params[5] = 0.5; Params[6] = 0.2; if (!CheckSingleParametric("param_5", param_5, 5, Params)) return 0; // 6) Y = (aX + b) ^ Gamma + c Params[0] = 2.2; Params[1] = 0.7; Params[2] = 0.2; Params[3] = 0.3; if (!CheckSingleParametric("param_6", param_6, 6, Params)) return 0; // 7) Y = a * log (b * X^Gamma + c) + d Params[0] = 2.2; Params[1] = 0.9; Params[2] = 0.9; Params[3] = 0.02; Params[4] = 0.1; if (!CheckSingleParametric("param_7", param_7, 7, Params)) return 0; // 8) Y = a * b ^ (c*X+d) + e Params[0] = 0.9; Params[1] = 0.9; Params[2] = 1.02; Params[3] = 0.1; Params[4] = 0.2; if (!CheckSingleParametric("param_8", param_8, 8, Params)) return 0; // 108: S-Shaped: (1 - (1-x)^1/g)^1/g Params[0] = 1.9; if (!CheckSingleParametric("sigmoidal", sigmoidal, 108, Params)) return 0; // All OK return 1; } // LUT checks ------------------------------------------------------------------------------ static cmsInt32Number CheckLUTcreation(void) { cmsPipeline* lut; cmsPipeline* lut2; cmsInt32Number n1, n2; lut = cmsPipelineAlloc(DbgThread(), 1, 1); n1 = cmsPipelineStageCount(lut); lut2 = cmsPipelineDup(lut); n2 = cmsPipelineStageCount(lut2); cmsPipelineFree(lut); cmsPipelineFree(lut2); return (n1 == 0) && (n2 == 0); } // Create a MPE for a identity matrix static void AddIdentityMatrix(cmsPipeline* lut) { const cmsFloat64Number Identity[] = { 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }; cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocMatrix(DbgThread(), 3, 3, Identity, NULL)); } // Create a MPE for identity cmsFloat32Number CLUT static void AddIdentityCLUTfloat(cmsPipeline* lut) { const cmsFloat32Number Table[] = { 0, 0, 0, 0, 0, 1.0, 0, 1.0, 0, 0, 1.0, 1.0, 1.0, 0, 0, 1.0, 0, 1.0, 1.0, 1.0, 0, 1.0, 1.0, 1.0 }; cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocCLutFloat(DbgThread(), 2, 3, 3, Table)); } // Create a MPE for identity cmsFloat32Number CLUT static void AddIdentityCLUT16(cmsPipeline* lut) { const cmsUInt16Number Table[] = { 0, 0, 0, 0, 0, 0xffff, 0, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 0, 0, 0xffff, 0, 0xffff, 0xffff, 0xffff, 0, 0xffff, 0xffff, 0xffff }; cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocCLut16bit(DbgThread(), 2, 3, 3, Table)); } // Create a 3 fn identity curves static void Add3GammaCurves(cmsPipeline* lut, cmsFloat64Number Curve) { cmsToneCurve* id = cmsBuildGamma(DbgThread(), Curve); cmsToneCurve* id3[3]; id3[0] = id; id3[1] = id; id3[2] = id; cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(DbgThread(), 3, id3)); cmsFreeToneCurve(id); } static cmsInt32Number CheckFloatLUT(cmsPipeline* lut) { cmsInt32Number n1, i, j; cmsFloat32Number Inf[3], Outf[3]; n1=0; for (j=0; j < 65535; j++) { cmsInt32Number af[3]; Inf[0] = Inf[1] = Inf[2] = (cmsFloat32Number) j / 65535.0F; cmsPipelineEvalFloat(Inf, Outf, lut); af[0] = (cmsInt32Number) floor(Outf[0]*65535.0 + 0.5); af[1] = (cmsInt32Number) floor(Outf[1]*65535.0 + 0.5); af[2] = (cmsInt32Number) floor(Outf[2]*65535.0 + 0.5); for (i=0; i < 3; i++) { if (af[i] != j) { n1++; } } } return (n1 == 0); } static cmsInt32Number Check16LUT(cmsPipeline* lut) { cmsInt32Number n2, i, j; cmsUInt16Number Inw[3], Outw[3]; n2=0; for (j=0; j < 65535; j++) { cmsInt32Number aw[3]; Inw[0] = Inw[1] = Inw[2] = (cmsUInt16Number) j; cmsPipelineEval16(Inw, Outw, lut); aw[0] = Outw[0]; aw[1] = Outw[1]; aw[2] = Outw[2]; for (i=0; i < 3; i++) { if (aw[i] != j) { n2++; } } } return (n2 == 0); } // Check any LUT that is linear static cmsInt32Number CheckStagesLUT(cmsPipeline* lut, cmsInt32Number ExpectedStages) { cmsInt32Number nInpChans, nOutpChans, nStages; nInpChans = cmsPipelineInputChannels(lut); nOutpChans = cmsPipelineOutputChannels(lut); nStages = cmsPipelineStageCount(lut); return (nInpChans == 3) && (nOutpChans == 3) && (nStages == ExpectedStages); } static cmsInt32Number CheckFullLUT(cmsPipeline* lut, cmsInt32Number ExpectedStages) { cmsInt32Number rc = CheckStagesLUT(lut, ExpectedStages) && Check16LUT(lut) && CheckFloatLUT(lut); cmsPipelineFree(lut); return rc; } static cmsInt32Number Check1StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); return CheckFullLUT(lut, 1); } static cmsInt32Number Check2StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUTfloat(lut); return CheckFullLUT(lut, 2); } static cmsInt32Number Check2Stage16LUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUT16(lut); return CheckFullLUT(lut, 2); } static cmsInt32Number Check3StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUTfloat(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 3); } static cmsInt32Number Check3Stage16LUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUT16(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 3); } static cmsInt32Number Check4StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUTfloat(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); return CheckFullLUT(lut, 4); } static cmsInt32Number Check4Stage16LUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUT16(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); return CheckFullLUT(lut, 4); } static cmsInt32Number Check5StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUTfloat(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 5); } static cmsInt32Number Check5Stage16LUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); AddIdentityCLUT16(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 5); } static cmsInt32Number Check6StageLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); AddIdentityCLUTfloat(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 6); } static cmsInt32Number Check6Stage16LUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); AddIdentityCLUT16(lut); Add3GammaCurves(lut, 1.0); AddIdentityMatrix(lut); Add3GammaCurves(lut, 1.0); return CheckFullLUT(lut, 6); } static cmsInt32Number CheckLab2LabLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); cmsInt32Number rc; cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocLab2XYZ(DbgThread())); cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocXYZ2Lab(DbgThread())); rc = CheckFloatLUT(lut) && CheckStagesLUT(lut, 2); cmsPipelineFree(lut); return rc; } static cmsInt32Number CheckXYZ2XYZLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); cmsInt32Number rc; cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocXYZ2Lab(DbgThread())); cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocLab2XYZ(DbgThread())); rc = CheckFloatLUT(lut) && CheckStagesLUT(lut, 2); cmsPipelineFree(lut); return rc; } static cmsInt32Number CheckLab2LabMatLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); cmsInt32Number rc; cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocLab2XYZ(DbgThread())); AddIdentityMatrix(lut); cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocXYZ2Lab(DbgThread())); rc = CheckFloatLUT(lut) && CheckStagesLUT(lut, 3); cmsPipelineFree(lut); return rc; } static cmsInt32Number CheckNamedColorLUT(void) { cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); cmsNAMEDCOLORLIST* nc; cmsInt32Number i,j, rc = 1, n2; cmsUInt16Number PCS[3]; cmsUInt16Number Colorant[cmsMAXCHANNELS]; char Name[255]; cmsUInt16Number Inw[3], Outw[3]; nc = cmsAllocNamedColorList(DbgThread(), 256, 3, "pre", "post"); if (nc == NULL) return 0; for (i=0; i < 256; i++) { PCS[0] = PCS[1] = PCS[2] = (cmsUInt16Number) i; Colorant[0] = Colorant[1] = Colorant[2] = Colorant[3] = (cmsUInt16Number) i; sprintf(Name, "#%d", i); if (!cmsAppendNamedColor(nc, Name, PCS, Colorant)) { rc = 0; break; } } cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocNamedColor(nc, FALSE)); cmsFreeNamedColorList(nc); if (rc == 0) return 0; n2=0; for (j=0; j < 256; j++) { Inw[0] = (cmsUInt16Number) j; cmsPipelineEval16(Inw, Outw, lut); for (i=0; i < 3; i++) { if (Outw[i] != j) { n2++; } } } cmsPipelineFree(lut); return (n2 == 0); } // -------------------------------------------------------------------------------------------- // A lightweight test of multilocalized unicode structures. static cmsInt32Number CheckMLU(void) { cmsMLU* mlu, *mlu2, *mlu3; char Buffer[256], Buffer2[256]; cmsInt32Number rc = 1; cmsInt32Number i; cmsHPROFILE h= NULL; // Allocate a MLU structure, no preferred size mlu = cmsMLUalloc(DbgThread(), 0); // Add some localizations cmsMLUsetWide(mlu, "en", "US", L"Hello, world"); cmsMLUsetWide(mlu, "es", "ES", L"Hola, mundo"); cmsMLUsetWide(mlu, "fr", "FR", L"Bonjour, le monde"); cmsMLUsetWide(mlu, "ca", "CA", L"Hola, mon"); // Check the returned string for each language cmsMLUgetASCII(mlu, "en", "US", Buffer, 256); if (strcmp(Buffer, "Hello, world") != 0) rc = 0; cmsMLUgetASCII(mlu, "es", "ES", Buffer, 256); if (strcmp(Buffer, "Hola, mundo") != 0) rc = 0; cmsMLUgetASCII(mlu, "fr", "FR", Buffer, 256); if (strcmp(Buffer, "Bonjour, le monde") != 0) rc = 0; cmsMLUgetASCII(mlu, "ca", "CA", Buffer, 256); if (strcmp(Buffer, "Hola, mon") != 0) rc = 0; if (rc == 0) Fail("Unexpected string '%s'", Buffer); // So far, so good. cmsMLUfree(mlu); // Now for performance, allocate an empty struct mlu = cmsMLUalloc(DbgThread(), 0); // Fill it with several thousands of different lenguages for (i=0; i < 4096; i++) { char Lang[3]; Lang[0] = (char) (i % 255); Lang[1] = (char) (i / 255); Lang[2] = 0; sprintf(Buffer, "String #%i", i); cmsMLUsetASCII(mlu, Lang, Lang, Buffer); } // Duplicate it mlu2 = cmsMLUdup(mlu); // Get rid of original cmsMLUfree(mlu); // Check all is still in place for (i=0; i < 4096; i++) { char Lang[3]; Lang[0] = (char)(i % 255); Lang[1] = (char)(i / 255); Lang[2] = 0; cmsMLUgetASCII(mlu2, Lang, Lang, Buffer2, 256); sprintf(Buffer, "String #%i", i); if (strcmp(Buffer, Buffer2) != 0) { rc = 0; break; } } if (rc == 0) Fail("Unexpected string '%s'", Buffer2); // Check profile IO h = cmsOpenProfileFromFileTHR(DbgThread(), "mlucheck.icc", "w"); cmsSetProfileVersion(h, 4.3); cmsWriteTag(h, cmsSigProfileDescriptionTag, mlu2); cmsCloseProfile(h); cmsMLUfree(mlu2); h = cmsOpenProfileFromFileTHR(DbgThread(), "mlucheck.icc", "r"); mlu3 = cmsReadTag(h, cmsSigProfileDescriptionTag); if (mlu3 == NULL) { Fail("Profile didn't get the MLU\n"); rc = 0; goto Error; } // Check all is still in place for (i=0; i < 4096; i++) { char Lang[3]; Lang[0] = (char) (i % 255); Lang[1] = (char) (i / 255); Lang[2] = 0; cmsMLUgetASCII(mlu3, Lang, Lang, Buffer2, 256); sprintf(Buffer, "String #%i", i); if (strcmp(Buffer, Buffer2) != 0) { rc = 0; break; } } if (rc == 0) Fail("Unexpected string '%s'", Buffer2); Error: if (h != NULL) cmsCloseProfile(h); remove("mlucheck.icc"); return rc; } // A lightweight test of named color structures. static cmsInt32Number CheckNamedColorList(void) { cmsNAMEDCOLORLIST* nc = NULL, *nc2; cmsInt32Number i, j, rc=1; char Name[255]; cmsUInt16Number PCS[3]; cmsUInt16Number Colorant[cmsMAXCHANNELS]; char CheckName[255]; cmsUInt16Number CheckPCS[3]; cmsUInt16Number CheckColorant[cmsMAXCHANNELS]; cmsHPROFILE h; nc = cmsAllocNamedColorList(DbgThread(), 0, 4, "prefix", "suffix"); if (nc == NULL) return 0; for (i=0; i < 4096; i++) { PCS[0] = PCS[1] = PCS[2] = (cmsUInt16Number) i; Colorant[0] = Colorant[1] = Colorant[2] = Colorant[3] = (cmsUInt16Number) (4096 - i); sprintf(Name, "#%d", i); if (!cmsAppendNamedColor(nc, Name, PCS, Colorant)) { rc = 0; break; } } for (i=0; i < 4096; i++) { CheckPCS[0] = CheckPCS[1] = CheckPCS[2] = (cmsUInt16Number) i; CheckColorant[0] = CheckColorant[1] = CheckColorant[2] = CheckColorant[3] = (cmsUInt16Number) (4096 - i); sprintf(CheckName, "#%d", i); if (!cmsNamedColorInfo(nc, i, Name, NULL, NULL, PCS, Colorant)) { rc = 0; goto Error; } for (j=0; j < 3; j++) { if (CheckPCS[j] != PCS[j]) { rc = 0; Fail("Invalid PCS"); goto Error; } } for (j=0; j < 4; j++) { if (CheckColorant[j] != Colorant[j]) { rc = 0; Fail("Invalid Colorant"); goto Error; }; } if (strcmp(Name, CheckName) != 0) {rc = 0; Fail("Invalid Name"); goto Error; }; } h = cmsOpenProfileFromFileTHR(DbgThread(), "namedcol.icc", "w"); if (h == NULL) return 0; if (!cmsWriteTag(h, cmsSigNamedColor2Tag, nc)) return 0; cmsCloseProfile(h); cmsFreeNamedColorList(nc); nc = NULL; h = cmsOpenProfileFromFileTHR(DbgThread(), "namedcol.icc", "r"); nc2 = cmsReadTag(h, cmsSigNamedColor2Tag); if (cmsNamedColorCount(nc2) != 4096) { rc = 0; Fail("Invalid count"); goto Error; } i = cmsNamedColorIndex(nc2, "#123"); if (i != 123) { rc = 0; Fail("Invalid index"); goto Error; } for (i=0; i < 4096; i++) { CheckPCS[0] = CheckPCS[1] = CheckPCS[2] = (cmsUInt16Number) i; CheckColorant[0] = CheckColorant[1] = CheckColorant[2] = CheckColorant[3] = (cmsUInt16Number) (4096 - i); sprintf(CheckName, "#%d", i); if (!cmsNamedColorInfo(nc2, i, Name, NULL, NULL, PCS, Colorant)) { rc = 0; goto Error; } for (j=0; j < 3; j++) { if (CheckPCS[j] != PCS[j]) { rc = 0; Fail("Invalid PCS"); goto Error; } } for (j=0; j < 4; j++) { if (CheckColorant[j] != Colorant[j]) { rc = 0; Fail("Invalid Colorant"); goto Error; }; } if (strcmp(Name, CheckName) != 0) {rc = 0; Fail("Invalid Name"); goto Error; }; } cmsCloseProfile(h); remove("namedcol.icc"); Error: if (nc != NULL) cmsFreeNamedColorList(nc); return rc; } // ---------------------------------------------------------------------------------------------------------- // Formatters static cmsBool FormatterFailed; static void CheckSingleFormatter16(cmsContext id, cmsUInt32Number Type, const char* Text) { cmsUInt16Number Values[cmsMAXCHANNELS]; cmsUInt8Number Buffer[1024]; cmsFormatter f, b; cmsInt32Number i, j, nChannels, bytes; _cmsTRANSFORM info; // Already failed? if (FormatterFailed) return; memset(&info, 0, sizeof(info)); info.OutputFormat = info.InputFormat = Type; // Go forth and back f = _cmsGetFormatter(id, Type, cmsFormatterInput, CMS_PACK_FLAGS_16BITS); b = _cmsGetFormatter(id, Type, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS); if (f.Fmt16 == NULL || b.Fmt16 == NULL) { Fail("no formatter for %s", Text); FormatterFailed = TRUE; // Useful for debug f = _cmsGetFormatter(id, Type, cmsFormatterInput, CMS_PACK_FLAGS_16BITS); b = _cmsGetFormatter(id, Type, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS); return; } nChannels = T_CHANNELS(Type); bytes = T_BYTES(Type); for (j=0; j < 5; j++) { for (i=0; i < nChannels; i++) { Values[i] = (cmsUInt16Number) (i+j); // For 8-bit if (bytes == 1) Values[i] <<= 8; } b.Fmt16(&info, Values, Buffer, 1); memset(Values, 0, sizeof(Values)); f.Fmt16(&info, Values, Buffer, 1); for (i=0; i < nChannels; i++) { if (bytes == 1) Values[i] >>= 8; if (Values[i] != i+j) { Fail("%s failed", Text); FormatterFailed = TRUE; // Useful for debug for (i=0; i < nChannels; i++) { Values[i] = (cmsUInt16Number) (i+j); // For 8-bit if (bytes == 1) Values[i] <<= 8; } b.Fmt16(&info, Values, Buffer, 1); f.Fmt16(&info, Values, Buffer, 1); return; } } } } #define C(a) CheckSingleFormatter16(0, a, #a) // Check all formatters static cmsInt32Number CheckFormatters16(void) { FormatterFailed = FALSE; C( TYPE_GRAY_8 ); C( TYPE_GRAY_8_REV ); C( TYPE_GRAY_16 ); C( TYPE_GRAY_16_REV ); C( TYPE_GRAY_16_SE ); C( TYPE_GRAYA_8 ); C( TYPE_GRAYA_16 ); C( TYPE_GRAYA_16_SE ); C( TYPE_GRAYA_8_PLANAR ); C( TYPE_GRAYA_16_PLANAR ); C( TYPE_RGB_8 ); C( TYPE_RGB_8_PLANAR ); C( TYPE_BGR_8 ); C( TYPE_BGR_8_PLANAR ); C( TYPE_RGB_16 ); C( TYPE_RGB_16_PLANAR ); C( TYPE_RGB_16_SE ); C( TYPE_BGR_16 ); C( TYPE_BGR_16_PLANAR ); C( TYPE_BGR_16_SE ); C( TYPE_RGBA_8 ); C( TYPE_RGBA_8_PLANAR ); C( TYPE_RGBA_16 ); C( TYPE_RGBA_16_PLANAR ); C( TYPE_RGBA_16_SE ); C( TYPE_ARGB_8 ); C( TYPE_ARGB_8_PLANAR ); C( TYPE_ARGB_16 ); C( TYPE_ABGR_8 ); C( TYPE_ABGR_8_PLANAR ); C( TYPE_ABGR_16 ); C( TYPE_ABGR_16_PLANAR ); C( TYPE_ABGR_16_SE ); C( TYPE_BGRA_8 ); C( TYPE_BGRA_8_PLANAR ); C( TYPE_BGRA_16 ); C( TYPE_BGRA_16_SE ); C( TYPE_CMY_8 ); C( TYPE_CMY_8_PLANAR ); C( TYPE_CMY_16 ); C( TYPE_CMY_16_PLANAR ); C( TYPE_CMY_16_SE ); C( TYPE_CMYK_8 ); C( TYPE_CMYKA_8 ); C( TYPE_CMYK_8_REV ); C( TYPE_YUVK_8 ); C( TYPE_CMYK_8_PLANAR ); C( TYPE_CMYK_16 ); C( TYPE_CMYK_16_REV ); C( TYPE_YUVK_16 ); C( TYPE_CMYK_16_PLANAR ); C( TYPE_CMYK_16_SE ); C( TYPE_KYMC_8 ); C( TYPE_KYMC_16 ); C( TYPE_KYMC_16_SE ); C( TYPE_KCMY_8 ); C( TYPE_KCMY_8_REV ); C( TYPE_KCMY_16 ); C( TYPE_KCMY_16_REV ); C( TYPE_KCMY_16_SE ); C( TYPE_CMYK5_8 ); C( TYPE_CMYK5_16 ); C( TYPE_CMYK5_16_SE ); C( TYPE_KYMC5_8 ); C( TYPE_KYMC5_16 ); C( TYPE_KYMC5_16_SE ); C( TYPE_CMYK6_8 ); C( TYPE_CMYK6_8_PLANAR ); C( TYPE_CMYK6_16 ); C( TYPE_CMYK6_16_PLANAR ); C( TYPE_CMYK6_16_SE ); C( TYPE_CMYK7_8 ); C( TYPE_CMYK7_16 ); C( TYPE_CMYK7_16_SE ); C( TYPE_KYMC7_8 ); C( TYPE_KYMC7_16 ); C( TYPE_KYMC7_16_SE ); C( TYPE_CMYK8_8 ); C( TYPE_CMYK8_16 ); C( TYPE_CMYK8_16_SE ); C( TYPE_KYMC8_8 ); C( TYPE_KYMC8_16 ); C( TYPE_KYMC8_16_SE ); C( TYPE_CMYK9_8 ); C( TYPE_CMYK9_16 ); C( TYPE_CMYK9_16_SE ); C( TYPE_KYMC9_8 ); C( TYPE_KYMC9_16 ); C( TYPE_KYMC9_16_SE ); C( TYPE_CMYK10_8 ); C( TYPE_CMYK10_16 ); C( TYPE_CMYK10_16_SE ); C( TYPE_KYMC10_8 ); C( TYPE_KYMC10_16 ); C( TYPE_KYMC10_16_SE ); C( TYPE_CMYK11_8 ); C( TYPE_CMYK11_16 ); C( TYPE_CMYK11_16_SE ); C( TYPE_KYMC11_8 ); C( TYPE_KYMC11_16 ); C( TYPE_KYMC11_16_SE ); C( TYPE_CMYK12_8 ); C( TYPE_CMYK12_16 ); C( TYPE_CMYK12_16_SE ); C( TYPE_KYMC12_8 ); C( TYPE_KYMC12_16 ); C( TYPE_KYMC12_16_SE ); C( TYPE_XYZ_16 ); C( TYPE_Lab_8 ); C( TYPE_ALab_8 ); C( TYPE_Lab_16 ); C( TYPE_Yxy_16 ); C( TYPE_YCbCr_8 ); C( TYPE_YCbCr_8_PLANAR ); C( TYPE_YCbCr_16 ); C( TYPE_YCbCr_16_PLANAR ); C( TYPE_YCbCr_16_SE ); C( TYPE_YUV_8 ); C( TYPE_YUV_8_PLANAR ); C( TYPE_YUV_16 ); C( TYPE_YUV_16_PLANAR ); C( TYPE_YUV_16_SE ); C( TYPE_HLS_8 ); C( TYPE_HLS_8_PLANAR ); C( TYPE_HLS_16 ); C( TYPE_HLS_16_PLANAR ); C( TYPE_HLS_16_SE ); C( TYPE_HSV_8 ); C( TYPE_HSV_8_PLANAR ); C( TYPE_HSV_16 ); C( TYPE_HSV_16_PLANAR ); C( TYPE_HSV_16_SE ); C( TYPE_XYZ_FLT ); C( TYPE_Lab_FLT ); C( TYPE_GRAY_FLT ); C( TYPE_RGB_FLT ); C( TYPE_BGR_FLT ); C( TYPE_CMYK_FLT ); C( TYPE_LabA_FLT ); C( TYPE_RGBA_FLT ); C( TYPE_ARGB_FLT ); C( TYPE_BGRA_FLT ); C( TYPE_ABGR_FLT ); C( TYPE_XYZ_DBL ); C( TYPE_Lab_DBL ); C( TYPE_GRAY_DBL ); C( TYPE_RGB_DBL ); C( TYPE_BGR_DBL ); C( TYPE_CMYK_DBL ); C( TYPE_LabV2_8 ); C( TYPE_ALabV2_8 ); C( TYPE_LabV2_16 ); C( TYPE_GRAY_HALF_FLT ); C( TYPE_RGB_HALF_FLT ); C( TYPE_CMYK_HALF_FLT ); C( TYPE_RGBA_HALF_FLT ); C( TYPE_RGBA_HALF_FLT ); C( TYPE_ARGB_HALF_FLT ); C( TYPE_BGR_HALF_FLT ); C( TYPE_BGRA_HALF_FLT ); C( TYPE_ABGR_HALF_FLT ); return FormatterFailed == 0 ? 1 : 0; } #undef C static void CheckSingleFormatterFloat(cmsUInt32Number Type, const char* Text) { cmsFloat32Number Values[cmsMAXCHANNELS]; cmsUInt8Number Buffer[1024]; cmsFormatter f, b; cmsInt32Number i, j, nChannels; _cmsTRANSFORM info; // Already failed? if (FormatterFailed) return; memset(&info, 0, sizeof(info)); info.OutputFormat = info.InputFormat = Type; // Go forth and back f = _cmsGetFormatter(0, Type, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT); b = _cmsGetFormatter(0, Type, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT); if (f.FmtFloat == NULL || b.FmtFloat == NULL) { Fail("no formatter for %s", Text); FormatterFailed = TRUE; // Useful for debug f = _cmsGetFormatter(0, Type, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT); b = _cmsGetFormatter(0, Type, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT); return; } nChannels = T_CHANNELS(Type); for (j=0; j < 5; j++) { for (i=0; i < nChannels; i++) { Values[i] = (cmsFloat32Number) (i+j); } b.FmtFloat(&info, Values, Buffer, 1); memset(Values, 0, sizeof(Values)); f.FmtFloat(&info, Values, Buffer, 1); for (i=0; i < nChannels; i++) { cmsFloat64Number delta = fabs(Values[i] - ( i+j)); if (delta > 0.000000001) { Fail("%s failed", Text); FormatterFailed = TRUE; // Useful for debug for (i=0; i < nChannels; i++) { Values[i] = (cmsFloat32Number) (i+j); } b.FmtFloat(&info, Values, Buffer, 1); f.FmtFloat(&info, Values, Buffer, 1); return; } } } } #define C(a) CheckSingleFormatterFloat(a, #a) static cmsInt32Number CheckFormattersFloat(void) { FormatterFailed = FALSE; C( TYPE_XYZ_FLT ); C( TYPE_Lab_FLT ); C( TYPE_GRAY_FLT ); C( TYPE_RGB_FLT ); C( TYPE_BGR_FLT ); C( TYPE_CMYK_FLT ); C( TYPE_LabA_FLT ); C( TYPE_RGBA_FLT ); C( TYPE_ARGB_FLT ); C( TYPE_BGRA_FLT ); C( TYPE_ABGR_FLT ); C( TYPE_XYZ_DBL ); C( TYPE_Lab_DBL ); C( TYPE_GRAY_DBL ); C( TYPE_RGB_DBL ); C( TYPE_BGR_DBL ); C( TYPE_CMYK_DBL ); C( TYPE_GRAY_HALF_FLT ); C( TYPE_RGB_HALF_FLT ); C( TYPE_CMYK_HALF_FLT ); C( TYPE_RGBA_HALF_FLT ); C( TYPE_RGBA_HALF_FLT ); C( TYPE_ARGB_HALF_FLT ); C( TYPE_BGR_HALF_FLT ); C( TYPE_BGRA_HALF_FLT ); C( TYPE_ABGR_HALF_FLT ); C( TYPE_XYZ_FLT ); return FormatterFailed == 0 ? 1 : 0; } #undef C #ifndef CMS_NO_HALF_SUPPORT // Check half float #define my_isfinite(x) ((x) != (x)) static cmsInt32Number CheckFormattersHalf(void) { int i, j; for (i=0; i < 0xffff; i++) { cmsFloat32Number f = _cmsHalf2Float((cmsUInt16Number) i); if (!my_isfinite(f)) { j = _cmsFloat2Half(f); if (i != j) { Fail("%d != %d in Half float support!\n", i, j); return 0; } } } return 1; } #endif static cmsInt32Number CheckOneRGB(cmsHTRANSFORM xform, cmsUInt16Number R, cmsUInt16Number G, cmsUInt16Number B, cmsUInt16Number Ro, cmsUInt16Number Go, cmsUInt16Number Bo) { cmsUInt16Number RGB[3]; cmsUInt16Number Out[3]; RGB[0] = R; RGB[1] = G; RGB[2] = B; cmsDoTransform(xform, RGB, Out, 1); return IsGoodWord("R", Ro , Out[0]) && IsGoodWord("G", Go , Out[1]) && IsGoodWord("B", Bo , Out[2]); } // Check known values going from sRGB to XYZ static cmsInt32Number CheckOneRGB_double(cmsHTRANSFORM xform, cmsFloat64Number R, cmsFloat64Number G, cmsFloat64Number B, cmsFloat64Number Ro, cmsFloat64Number Go, cmsFloat64Number Bo) { cmsFloat64Number RGB[3]; cmsFloat64Number Out[3]; RGB[0] = R; RGB[1] = G; RGB[2] = B; cmsDoTransform(xform, RGB, Out, 1); return IsGoodVal("R", Ro , Out[0], 0.01) && IsGoodVal("G", Go , Out[1], 0.01) && IsGoodVal("B", Bo , Out[2], 0.01); } static cmsInt32Number CheckChangeBufferFormat(void) { cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); cmsHTRANSFORM xform; xform = cmsCreateTransform(hsRGB, TYPE_RGB_16, hsRGB, TYPE_RGB_16, INTENT_PERCEPTUAL, 0); cmsCloseProfile(hsRGB); if (xform == NULL) return 0; if (!CheckOneRGB(xform, 0, 0, 0, 0, 0, 0)) return 0; if (!CheckOneRGB(xform, 120, 0, 0, 120, 0, 0)) return 0; if (!CheckOneRGB(xform, 0, 222, 255, 0, 222, 255)) return 0; if (!cmsChangeBuffersFormat(xform, TYPE_BGR_16, TYPE_RGB_16)) return 0; if (!CheckOneRGB(xform, 0, 0, 123, 123, 0, 0)) return 0; if (!CheckOneRGB(xform, 154, 234, 0, 0, 234, 154)) return 0; if (!cmsChangeBuffersFormat(xform, TYPE_RGB_DBL, TYPE_RGB_DBL)) return 0; if (!CheckOneRGB_double(xform, 0.20, 0, 0, 0.20, 0, 0)) return 0; if (!CheckOneRGB_double(xform, 0, 0.9, 1, 0, 0.9, 1)) return 0; cmsDeleteTransform(xform); return 1; } // Write tag testbed ---------------------------------------------------------------------------------------- static cmsInt32Number CheckXYZ(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsCIEXYZ XYZ, *Pt; switch (Pass) { case 1: XYZ.X = 1.0; XYZ.Y = 1.1; XYZ.Z = 1.2; return cmsWriteTag(hProfile, tag, &XYZ); case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return IsGoodFixed15_16("X", 1.0, Pt ->X) && IsGoodFixed15_16("Y", 1.1, Pt->Y) && IsGoodFixed15_16("Z", 1.2, Pt -> Z); default: return 0; } } static cmsInt32Number CheckGamma(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsToneCurve *g, *Pt; cmsInt32Number rc; switch (Pass) { case 1: g = cmsBuildGamma(DbgThread(), 1.0); rc = cmsWriteTag(hProfile, tag, g); cmsFreeToneCurve(g); return rc; case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return cmsIsToneCurveLinear(Pt); default: return 0; } } static cmsInt32Number CheckText(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsMLU *m, *Pt; cmsInt32Number rc; char Buffer[256]; switch (Pass) { case 1: m = cmsMLUalloc(DbgThread(), 0); cmsMLUsetASCII(m, cmsNoLanguage, cmsNoCountry, "Test test"); rc = cmsWriteTag(hProfile, tag, m); cmsMLUfree(m); return rc; case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; cmsMLUgetASCII(Pt, cmsNoLanguage, cmsNoCountry, Buffer, 256); return strcmp(Buffer, "Test test") == 0; default: return 0; } } static cmsInt32Number CheckData(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsICCData *Pt; cmsICCData d = { 1, 0, { '?' }}; cmsInt32Number rc; switch (Pass) { case 1: rc = cmsWriteTag(hProfile, tag, &d); return rc; case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return (Pt ->data[0] == '?') && (Pt ->flag == 0) && (Pt ->len == 1); default: return 0; } } static cmsInt32Number CheckSignature(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsTagSignature *Pt, Holder; switch (Pass) { case 1: Holder = cmsSigPerceptualReferenceMediumGamut; return cmsWriteTag(hProfile, tag, &Holder); case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return *Pt == cmsSigPerceptualReferenceMediumGamut; default: return 0; } } static cmsInt32Number CheckDateTime(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { struct tm *Pt, Holder; switch (Pass) { case 1: Holder.tm_hour = 1; Holder.tm_min = 2; Holder.tm_sec = 3; Holder.tm_mday = 4; Holder.tm_mon = 5; Holder.tm_year = 2009 - 1900; return cmsWriteTag(hProfile, tag, &Holder); case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return (Pt ->tm_hour == 1 && Pt ->tm_min == 2 && Pt ->tm_sec == 3 && Pt ->tm_mday == 4 && Pt ->tm_mon == 5 && Pt ->tm_year == 2009 - 1900); default: return 0; } } static cmsInt32Number CheckNamedColor(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag, cmsInt32Number max_check, cmsBool colorant_check) { cmsNAMEDCOLORLIST* nc; cmsInt32Number i, j, rc; char Name[255]; cmsUInt16Number PCS[3]; cmsUInt16Number Colorant[cmsMAXCHANNELS]; char CheckName[255]; cmsUInt16Number CheckPCS[3]; cmsUInt16Number CheckColorant[cmsMAXCHANNELS]; switch (Pass) { case 1: nc = cmsAllocNamedColorList(DbgThread(), 0, 4, "prefix", "suffix"); if (nc == NULL) return 0; for (i=0; i < max_check; i++) { PCS[0] = PCS[1] = PCS[2] = (cmsUInt16Number) i; Colorant[0] = Colorant[1] = Colorant[2] = Colorant[3] = (cmsUInt16Number) (max_check - i); sprintf(Name, "#%d", i); if (!cmsAppendNamedColor(nc, Name, PCS, Colorant)) { Fail("Couldn't append named color"); return 0; } } rc = cmsWriteTag(hProfile, tag, nc); cmsFreeNamedColorList(nc); return rc; case 2: nc = cmsReadTag(hProfile, tag); if (nc == NULL) return 0; for (i=0; i < max_check; i++) { CheckPCS[0] = CheckPCS[1] = CheckPCS[2] = (cmsUInt16Number) i; CheckColorant[0] = CheckColorant[1] = CheckColorant[2] = CheckColorant[3] = (cmsUInt16Number) (max_check - i); sprintf(CheckName, "#%d", i); if (!cmsNamedColorInfo(nc, i, Name, NULL, NULL, PCS, Colorant)) { Fail("Invalid string"); return 0; } for (j=0; j < 3; j++) { if (CheckPCS[j] != PCS[j]) { Fail("Invalid PCS"); return 0; } } // This is only used on named color list if (colorant_check) { for (j=0; j < 4; j++) { if (CheckColorant[j] != Colorant[j]) { Fail("Invalid Colorant"); return 0; }; } } if (strcmp(Name, CheckName) != 0) { Fail("Invalid Name"); return 0; }; } return 1; default: return 0; } } static cmsInt32Number CheckLUT(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsPipeline* Lut, *Pt; cmsInt32Number rc; switch (Pass) { case 1: Lut = cmsPipelineAlloc(DbgThread(), 3, 3); if (Lut == NULL) return 0; // Create an identity LUT cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(DbgThread(), 3)); cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocIdentityCLut(DbgThread(), 3)); cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocIdentityCurves(DbgThread(), 3)); rc = cmsWriteTag(hProfile, tag, Lut); cmsPipelineFree(Lut); return rc; case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; // Transform values, check for identity return Check16LUT(Pt); default: return 0; } } static cmsInt32Number CheckCHAD(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsFloat64Number *Pt; cmsFloat64Number CHAD[] = { 0, .1, .2, .3, .4, .5, .6, .7, .8 }; cmsInt32Number i; switch (Pass) { case 1: return cmsWriteTag(hProfile, tag, CHAD); case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; for (i=0; i < 9; i++) { if (!IsGoodFixed15_16("CHAD", Pt[i], CHAD[i])) return 0; } return 1; default: return 0; } } static cmsInt32Number CheckChromaticity(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsCIExyYTRIPLE *Pt, c = { {0, .1, 1 }, { .3, .4, 1 }, { .6, .7, 1 }}; switch (Pass) { case 1: return cmsWriteTag(hProfile, tag, &c); case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Red.x, c.Red.x)) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Red.y, c.Red.y)) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Green.x, c.Green.x)) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Green.y, c.Green.y)) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Blue.x, c.Blue.x)) return 0; if (!IsGoodFixed15_16("xyY", Pt ->Blue.y, c.Blue.y)) return 0; return 1; default: return 0; } } static cmsInt32Number CheckColorantOrder(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsUInt8Number *Pt, c[cmsMAXCHANNELS]; cmsInt32Number i; switch (Pass) { case 1: for (i=0; i < cmsMAXCHANNELS; i++) c[i] = (cmsUInt8Number) (cmsMAXCHANNELS - i - 1); return cmsWriteTag(hProfile, tag, c); case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; for (i=0; i < cmsMAXCHANNELS; i++) { if (Pt[i] != ( cmsMAXCHANNELS - i - 1 )) return 0; } return 1; default: return 0; } } static cmsInt32Number CheckMeasurement(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsICCMeasurementConditions *Pt, m; switch (Pass) { case 1: m.Backing.X = 0.1; m.Backing.Y = 0.2; m.Backing.Z = 0.3; m.Flare = 1.0; m.Geometry = 1; m.IlluminantType = cmsILLUMINANT_TYPE_D50; m.Observer = 1; return cmsWriteTag(hProfile, tag, &m); case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; if (!IsGoodFixed15_16("Backing", Pt ->Backing.X, 0.1)) return 0; if (!IsGoodFixed15_16("Backing", Pt ->Backing.Y, 0.2)) return 0; if (!IsGoodFixed15_16("Backing", Pt ->Backing.Z, 0.3)) return 0; if (!IsGoodFixed15_16("Flare", Pt ->Flare, 1.0)) return 0; if (Pt ->Geometry != 1) return 0; if (Pt ->IlluminantType != cmsILLUMINANT_TYPE_D50) return 0; if (Pt ->Observer != 1) return 0; return 1; default: return 0; } } static cmsInt32Number CheckUcrBg(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsUcrBg *Pt, m; cmsInt32Number rc; char Buffer[256]; switch (Pass) { case 1: m.Ucr = cmsBuildGamma(DbgThread(), 2.4); m.Bg = cmsBuildGamma(DbgThread(), -2.2); m.Desc = cmsMLUalloc(DbgThread(), 1); cmsMLUsetASCII(m.Desc, cmsNoLanguage, cmsNoCountry, "test UCR/BG"); rc = cmsWriteTag(hProfile, tag, &m); cmsMLUfree(m.Desc); cmsFreeToneCurve(m.Bg); cmsFreeToneCurve(m.Ucr); return rc; case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; cmsMLUgetASCII(Pt ->Desc, cmsNoLanguage, cmsNoCountry, Buffer, 256); if (strcmp(Buffer, "test UCR/BG") != 0) return 0; return 1; default: return 0; } } static cmsInt32Number CheckCRDinfo(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsMLU *mlu; char Buffer[256]; cmsInt32Number rc; switch (Pass) { case 1: mlu = cmsMLUalloc(DbgThread(), 5); cmsMLUsetWide(mlu, "PS", "nm", L"test postscript"); cmsMLUsetWide(mlu, "PS", "#0", L"perceptual"); cmsMLUsetWide(mlu, "PS", "#1", L"relative_colorimetric"); cmsMLUsetWide(mlu, "PS", "#2", L"saturation"); cmsMLUsetWide(mlu, "PS", "#3", L"absolute_colorimetric"); rc = cmsWriteTag(hProfile, tag, mlu); cmsMLUfree(mlu); return rc; case 2: mlu = (cmsMLU*) cmsReadTag(hProfile, tag); if (mlu == NULL) return 0; cmsMLUgetASCII(mlu, "PS", "nm", Buffer, 256); if (strcmp(Buffer, "test postscript") != 0) return 0; cmsMLUgetASCII(mlu, "PS", "#0", Buffer, 256); if (strcmp(Buffer, "perceptual") != 0) return 0; cmsMLUgetASCII(mlu, "PS", "#1", Buffer, 256); if (strcmp(Buffer, "relative_colorimetric") != 0) return 0; cmsMLUgetASCII(mlu, "PS", "#2", Buffer, 256); if (strcmp(Buffer, "saturation") != 0) return 0; cmsMLUgetASCII(mlu, "PS", "#3", Buffer, 256); if (strcmp(Buffer, "absolute_colorimetric") != 0) return 0; return 1; default: return 0; } } static cmsToneCurve *CreateSegmentedCurve(void) { cmsCurveSegment Seg[3]; cmsFloat32Number Sampled[2] = { 0, 1}; Seg[0].Type = 6; Seg[0].Params[0] = 1; Seg[0].Params[1] = 0; Seg[0].Params[2] = 0; Seg[0].Params[3] = 0; Seg[0].x0 = -1E22F; Seg[0].x1 = 0; Seg[1].Type = 0; Seg[1].nGridPoints = 2; Seg[1].SampledPoints = Sampled; Seg[1].x0 = 0; Seg[1].x1 = 1; Seg[2].Type = 6; Seg[2].Params[0] = 1; Seg[2].Params[1] = 0; Seg[2].Params[2] = 0; Seg[2].Params[3] = 0; Seg[2].x0 = 1; Seg[2].x1 = 1E22F; return cmsBuildSegmentedToneCurve(DbgThread(), 3, Seg); } static cmsInt32Number CheckMPE(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsPipeline* Lut, *Pt; cmsToneCurve* G[3]; cmsInt32Number rc; switch (Pass) { case 1: Lut = cmsPipelineAlloc(DbgThread(), 3, 3); cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4(DbgThread())); cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV4ToV2(DbgThread())); AddIdentityCLUTfloat(Lut); G[0] = G[1] = G[2] = CreateSegmentedCurve(); cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(DbgThread(), 3, G)); cmsFreeToneCurve(G[0]); rc = cmsWriteTag(hProfile, tag, Lut); cmsPipelineFree(Lut); return rc; case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; return CheckFloatLUT(Pt); default: return 0; } } static cmsInt32Number CheckScreening(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) { cmsScreening *Pt, sc; cmsInt32Number rc; switch (Pass) { case 1: sc.Flag = 0; sc.nChannels = 1; sc.Channels[0].Frequency = 2.0; sc.Channels[0].ScreenAngle = 3.0; sc.Channels[0].SpotShape = cmsSPOT_ELLIPSE; rc = cmsWriteTag(hProfile, tag, &sc); return rc; case 2: Pt = cmsReadTag(hProfile, tag); if (Pt == NULL) return 0; if (Pt ->nChannels != 1) return 0; if (Pt ->Flag != 0) return 0; if (!IsGoodFixed15_16("Freq", Pt ->Channels[0].Frequency, 2.0)) return 0; if (!IsGoodFixed15_16("Angle", Pt ->Channels[0].ScreenAngle, 3.0)) return 0; if (Pt ->Channels[0].SpotShape != cmsSPOT_ELLIPSE) return 0; return 1; default: return 0; } } static cmsBool CheckOneStr(cmsMLU* mlu, cmsInt32Number n) { char Buffer[256], Buffer2[256]; cmsMLUgetASCII(mlu, "en", "US", Buffer, 255); sprintf(Buffer2, "Hello, world %d", n); if (strcmp(Buffer, Buffer2) != 0) return FALSE; cmsMLUgetASCII(mlu, "es", "ES", Buffer, 255); sprintf(Buffer2, "Hola, mundo %d", n); if (strcmp(Buffer, Buffer2) != 0) return FALSE; return TRUE; } static void SetOneStr(cmsMLU** mlu, wchar_t* s1, wchar_t* s2) { *mlu = cmsMLUalloc(DbgThread(), 0); cmsMLUsetWide(*mlu, "en", "US", s1); cmsMLUsetWide(*mlu, "es", "ES", s2); } static cmsInt32Number CheckProfileSequenceTag(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsSEQ* s; cmsInt32Number i; switch (Pass) { case 1: s = cmsAllocProfileSequenceDescription(DbgThread(), 3); if (s == NULL) return 0; SetOneStr(&s -> seq[0].Manufacturer, L"Hello, world 0", L"Hola, mundo 0"); SetOneStr(&s -> seq[0].Model, L"Hello, world 0", L"Hola, mundo 0"); SetOneStr(&s -> seq[1].Manufacturer, L"Hello, world 1", L"Hola, mundo 1"); SetOneStr(&s -> seq[1].Model, L"Hello, world 1", L"Hola, mundo 1"); SetOneStr(&s -> seq[2].Manufacturer, L"Hello, world 2", L"Hola, mundo 2"); SetOneStr(&s -> seq[2].Model, L"Hello, world 2", L"Hola, mundo 2"); #ifdef CMS_DONT_USE_INT64 s ->seq[0].attributes[0] = cmsTransparency|cmsMatte; s ->seq[0].attributes[1] = 0; #else s ->seq[0].attributes = cmsTransparency|cmsMatte; #endif #ifdef CMS_DONT_USE_INT64 s ->seq[1].attributes[0] = cmsReflective|cmsMatte; s ->seq[1].attributes[1] = 0; #else s ->seq[1].attributes = cmsReflective|cmsMatte; #endif #ifdef CMS_DONT_USE_INT64 s ->seq[2].attributes[0] = cmsTransparency|cmsGlossy; s ->seq[2].attributes[1] = 0; #else s ->seq[2].attributes = cmsTransparency|cmsGlossy; #endif if (!cmsWriteTag(hProfile, cmsSigProfileSequenceDescTag, s)) return 0; cmsFreeProfileSequenceDescription(s); return 1; case 2: s = cmsReadTag(hProfile, cmsSigProfileSequenceDescTag); if (s == NULL) return 0; if (s ->n != 3) return 0; #ifdef CMS_DONT_USE_INT64 if (s ->seq[0].attributes[0] != (cmsTransparency|cmsMatte)) return 0; if (s ->seq[0].attributes[1] != 0) return 0; #else if (s ->seq[0].attributes != (cmsTransparency|cmsMatte)) return 0; #endif #ifdef CMS_DONT_USE_INT64 if (s ->seq[1].attributes[0] != (cmsReflective|cmsMatte)) return 0; if (s ->seq[1].attributes[1] != 0) return 0; #else if (s ->seq[1].attributes != (cmsReflective|cmsMatte)) return 0; #endif #ifdef CMS_DONT_USE_INT64 if (s ->seq[2].attributes[0] != (cmsTransparency|cmsGlossy)) return 0; if (s ->seq[2].attributes[1] != 0) return 0; #else if (s ->seq[2].attributes != (cmsTransparency|cmsGlossy)) return 0; #endif // Check MLU for (i=0; i < 3; i++) { if (!CheckOneStr(s -> seq[i].Manufacturer, i)) return 0; if (!CheckOneStr(s -> seq[i].Model, i)) return 0; } return 1; default: return 0; } } static cmsInt32Number CheckProfileSequenceIDTag(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsSEQ* s; cmsInt32Number i; switch (Pass) { case 1: s = cmsAllocProfileSequenceDescription(DbgThread(), 3); if (s == NULL) return 0; memcpy(s ->seq[0].ProfileID.ID8, "0123456789ABCDEF", 16); memcpy(s ->seq[1].ProfileID.ID8, "1111111111111111", 16); memcpy(s ->seq[2].ProfileID.ID8, "2222222222222222", 16); SetOneStr(&s -> seq[0].Description, L"Hello, world 0", L"Hola, mundo 0"); SetOneStr(&s -> seq[1].Description, L"Hello, world 1", L"Hola, mundo 1"); SetOneStr(&s -> seq[2].Description, L"Hello, world 2", L"Hola, mundo 2"); if (!cmsWriteTag(hProfile, cmsSigProfileSequenceIdTag, s)) return 0; cmsFreeProfileSequenceDescription(s); return 1; case 2: s = cmsReadTag(hProfile, cmsSigProfileSequenceIdTag); if (s == NULL) return 0; if (s ->n != 3) return 0; if (memcmp(s ->seq[0].ProfileID.ID8, "0123456789ABCDEF", 16) != 0) return 0; if (memcmp(s ->seq[1].ProfileID.ID8, "1111111111111111", 16) != 0) return 0; if (memcmp(s ->seq[2].ProfileID.ID8, "2222222222222222", 16) != 0) return 0; for (i=0; i < 3; i++) { if (!CheckOneStr(s -> seq[i].Description, i)) return 0; } return 1; default: return 0; } } static cmsInt32Number CheckICCViewingConditions(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsICCViewingConditions* v; cmsICCViewingConditions s; switch (Pass) { case 1: s.IlluminantType = 1; s.IlluminantXYZ.X = 0.1; s.IlluminantXYZ.Y = 0.2; s.IlluminantXYZ.Z = 0.3; s.SurroundXYZ.X = 0.4; s.SurroundXYZ.Y = 0.5; s.SurroundXYZ.Z = 0.6; if (!cmsWriteTag(hProfile, cmsSigViewingConditionsTag, &s)) return 0; return 1; case 2: v = cmsReadTag(hProfile, cmsSigViewingConditionsTag); if (v == NULL) return 0; if (v ->IlluminantType != 1) return 0; if (!IsGoodVal("IlluminantXYZ.X", v ->IlluminantXYZ.X, 0.1, 0.001)) return 0; if (!IsGoodVal("IlluminantXYZ.Y", v ->IlluminantXYZ.Y, 0.2, 0.001)) return 0; if (!IsGoodVal("IlluminantXYZ.Z", v ->IlluminantXYZ.Z, 0.3, 0.001)) return 0; if (!IsGoodVal("SurroundXYZ.X", v ->SurroundXYZ.X, 0.4, 0.001)) return 0; if (!IsGoodVal("SurroundXYZ.Y", v ->SurroundXYZ.Y, 0.5, 0.001)) return 0; if (!IsGoodVal("SurroundXYZ.Z", v ->SurroundXYZ.Z, 0.6, 0.001)) return 0; return 1; default: return 0; } } static cmsInt32Number CheckVCGT(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsToneCurve* Curves[3]; cmsToneCurve** PtrCurve; switch (Pass) { case 1: Curves[0] = cmsBuildGamma(DbgThread(), 1.1); Curves[1] = cmsBuildGamma(DbgThread(), 2.2); Curves[2] = cmsBuildGamma(DbgThread(), 3.4); if (!cmsWriteTag(hProfile, cmsSigVcgtTag, Curves)) return 0; cmsFreeToneCurveTriple(Curves); return 1; case 2: PtrCurve = cmsReadTag(hProfile, cmsSigVcgtTag); if (PtrCurve == NULL) return 0; if (!IsGoodVal("VCGT R", cmsEstimateGamma(PtrCurve[0], 0.01), 1.1, 0.001)) return 0; if (!IsGoodVal("VCGT G", cmsEstimateGamma(PtrCurve[1], 0.01), 2.2, 0.001)) return 0; if (!IsGoodVal("VCGT B", cmsEstimateGamma(PtrCurve[2], 0.01), 3.4, 0.001)) return 0; return 1; default:; } return 0; } // Only one of the two following may be used, as they share the same tag static cmsInt32Number CheckDictionary16(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsHANDLE hDict; const cmsDICTentry* e; switch (Pass) { case 1: hDict = cmsDictAlloc(DbgThread()); cmsDictAddEntry(hDict, L"Name0", NULL, NULL, NULL); cmsDictAddEntry(hDict, L"Name1", L"", NULL, NULL); cmsDictAddEntry(hDict, L"Name", L"String", NULL, NULL); cmsDictAddEntry(hDict, L"Name2", L"12", NULL, NULL); if (!cmsWriteTag(hProfile, cmsSigMetaTag, hDict)) return 0; cmsDictFree(hDict); return 1; case 2: hDict = cmsReadTag(hProfile, cmsSigMetaTag); if (hDict == NULL) return 0; e = cmsDictGetEntryList(hDict); if (memcmp(e ->Name, L"Name2", sizeof(wchar_t) * 5) != 0) return 0; if (memcmp(e ->Value, L"12", sizeof(wchar_t) * 2) != 0) return 0; e = cmsDictNextEntry(e); if (memcmp(e ->Name, L"Name", sizeof(wchar_t) * 4) != 0) return 0; if (memcmp(e ->Value, L"String", sizeof(wchar_t) * 5) != 0) return 0; e = cmsDictNextEntry(e); if (memcmp(e ->Name, L"Name1", sizeof(wchar_t) *5) != 0) return 0; if (e ->Value == NULL) return 0; if (*e->Value != 0) return 0; e = cmsDictNextEntry(e); if (memcmp(e ->Name, L"Name0", sizeof(wchar_t) * 5) != 0) return 0; if (e ->Value != NULL) return 0; return 1; default:; } return 0; } static cmsInt32Number CheckDictionary24(cmsInt32Number Pass, cmsHPROFILE hProfile) { cmsHANDLE hDict; const cmsDICTentry* e; cmsMLU* DisplayName; char Buffer[256]; cmsInt32Number rc = 1; switch (Pass) { case 1: hDict = cmsDictAlloc(DbgThread()); DisplayName = cmsMLUalloc(DbgThread(), 0); cmsMLUsetWide(DisplayName, "en", "US", L"Hello, world"); cmsMLUsetWide(DisplayName, "es", "ES", L"Hola, mundo"); cmsMLUsetWide(DisplayName, "fr", "FR", L"Bonjour, le monde"); cmsMLUsetWide(DisplayName, "ca", "CA", L"Hola, mon"); cmsDictAddEntry(hDict, L"Name", L"String", DisplayName, NULL); cmsMLUfree(DisplayName); cmsDictAddEntry(hDict, L"Name2", L"12", NULL, NULL); if (!cmsWriteTag(hProfile, cmsSigMetaTag, hDict)) return 0; cmsDictFree(hDict); return 1; case 2: hDict = cmsReadTag(hProfile, cmsSigMetaTag); if (hDict == NULL) return 0; e = cmsDictGetEntryList(hDict); if (memcmp(e ->Name, L"Name2", sizeof(wchar_t) * 5) != 0) return 0; if (memcmp(e ->Value, L"12", sizeof(wchar_t) * 2) != 0) return 0; e = cmsDictNextEntry(e); if (memcmp(e ->Name, L"Name", sizeof(wchar_t) * 4) != 0) return 0; if (memcmp(e ->Value, L"String", sizeof(wchar_t) * 5) != 0) return 0; cmsMLUgetASCII(e->DisplayName, "en", "US", Buffer, 256); if (strcmp(Buffer, "Hello, world") != 0) rc = 0; cmsMLUgetASCII(e->DisplayName, "es", "ES", Buffer, 256); if (strcmp(Buffer, "Hola, mundo") != 0) rc = 0; cmsMLUgetASCII(e->DisplayName, "fr", "FR", Buffer, 256); if (strcmp(Buffer, "Bonjour, le monde") != 0) rc = 0; cmsMLUgetASCII(e->DisplayName, "ca", "CA", Buffer, 256); if (strcmp(Buffer, "Hola, mon") != 0) rc = 0; if (rc == 0) Fail("Unexpected string '%s'", Buffer); return 1; default:; } return 0; } static cmsInt32Number CheckRAWtags(cmsInt32Number Pass, cmsHPROFILE hProfile) { char Buffer[7]; switch (Pass) { case 1: return cmsWriteRawTag(hProfile, 0x31323334, "data123", 7); case 2: if (!cmsReadRawTag(hProfile, 0x31323334, Buffer, 7)) return 0; if (strncmp(Buffer, "data123", 7) != 0) return 0; return 1; default: return 0; } } // This is a very big test that checks every single tag static cmsInt32Number CheckProfileCreation(void) { cmsHPROFILE h; cmsInt32Number Pass; h = cmsCreateProfilePlaceholder(DbgThread()); if (h == NULL) return 0; cmsSetProfileVersion(h, 4.3); if (cmsGetTagCount(h) != 0) { Fail("Empty profile with nonzero number of tags"); return 0; } if (cmsIsTag(h, cmsSigAToB0Tag)) { Fail("Found a tag in an empty profile"); return 0; } cmsSetColorSpace(h, cmsSigRgbData); if (cmsGetColorSpace(h) != cmsSigRgbData) { Fail("Unable to set colorspace"); return 0; } cmsSetPCS(h, cmsSigLabData); if (cmsGetPCS(h) != cmsSigLabData) { Fail("Unable to set colorspace"); return 0; } cmsSetDeviceClass(h, cmsSigDisplayClass); if (cmsGetDeviceClass(h) != cmsSigDisplayClass) { Fail("Unable to set deviceclass"); return 0; } cmsSetHeaderRenderingIntent(h, INTENT_SATURATION); if (cmsGetHeaderRenderingIntent(h) != INTENT_SATURATION) { Fail("Unable to set rendering intent"); return 0; } for (Pass = 1; Pass <= 2; Pass++) { SubTest("Tags holding XYZ"); if (!CheckXYZ(Pass, h, cmsSigBlueColorantTag)) return 0; if (!CheckXYZ(Pass, h, cmsSigGreenColorantTag)) return 0; if (!CheckXYZ(Pass, h, cmsSigRedColorantTag)) return 0; if (!CheckXYZ(Pass, h, cmsSigMediaBlackPointTag)) return 0; if (!CheckXYZ(Pass, h, cmsSigMediaWhitePointTag)) return 0; if (!CheckXYZ(Pass, h, cmsSigLuminanceTag)) return 0; SubTest("Tags holding curves"); if (!CheckGamma(Pass, h, cmsSigBlueTRCTag)) return 0; if (!CheckGamma(Pass, h, cmsSigGrayTRCTag)) return 0; if (!CheckGamma(Pass, h, cmsSigGreenTRCTag)) return 0; if (!CheckGamma(Pass, h, cmsSigRedTRCTag)) return 0; SubTest("Tags holding text"); if (!CheckText(Pass, h, cmsSigCharTargetTag)) return 0; if (!CheckText(Pass, h, cmsSigCopyrightTag)) return 0; if (!CheckText(Pass, h, cmsSigProfileDescriptionTag)) return 0; if (!CheckText(Pass, h, cmsSigDeviceMfgDescTag)) return 0; if (!CheckText(Pass, h, cmsSigDeviceModelDescTag)) return 0; if (!CheckText(Pass, h, cmsSigViewingCondDescTag)) return 0; if (!CheckText(Pass, h, cmsSigScreeningDescTag)) return 0; SubTest("Tags holding cmsICCData"); if (!CheckData(Pass, h, cmsSigPs2CRD0Tag)) return 0; if (!CheckData(Pass, h, cmsSigPs2CRD1Tag)) return 0; if (!CheckData(Pass, h, cmsSigPs2CRD2Tag)) return 0; if (!CheckData(Pass, h, cmsSigPs2CRD3Tag)) return 0; if (!CheckData(Pass, h, cmsSigPs2CSATag)) return 0; if (!CheckData(Pass, h, cmsSigPs2RenderingIntentTag)) return 0; SubTest("Tags holding signatures"); if (!CheckSignature(Pass, h, cmsSigColorimetricIntentImageStateTag)) return 0; if (!CheckSignature(Pass, h, cmsSigPerceptualRenderingIntentGamutTag)) return 0; if (!CheckSignature(Pass, h, cmsSigSaturationRenderingIntentGamutTag)) return 0; if (!CheckSignature(Pass, h, cmsSigTechnologyTag)) return 0; SubTest("Tags holding date_time"); if (!CheckDateTime(Pass, h, cmsSigCalibrationDateTimeTag)) return 0; if (!CheckDateTime(Pass, h, cmsSigDateTimeTag)) return 0; SubTest("Tags holding named color lists"); if (!CheckNamedColor(Pass, h, cmsSigColorantTableTag, 15, FALSE)) return 0; if (!CheckNamedColor(Pass, h, cmsSigColorantTableOutTag, 15, FALSE)) return 0; if (!CheckNamedColor(Pass, h, cmsSigNamedColor2Tag, 4096, TRUE)) return 0; SubTest("Tags holding LUTs"); if (!CheckLUT(Pass, h, cmsSigAToB0Tag)) return 0; if (!CheckLUT(Pass, h, cmsSigAToB1Tag)) return 0; if (!CheckLUT(Pass, h, cmsSigAToB2Tag)) return 0; if (!CheckLUT(Pass, h, cmsSigBToA0Tag)) return 0; if (!CheckLUT(Pass, h, cmsSigBToA1Tag)) return 0; if (!CheckLUT(Pass, h, cmsSigBToA2Tag)) return 0; if (!CheckLUT(Pass, h, cmsSigPreview0Tag)) return 0; if (!CheckLUT(Pass, h, cmsSigPreview1Tag)) return 0; if (!CheckLUT(Pass, h, cmsSigPreview2Tag)) return 0; if (!CheckLUT(Pass, h, cmsSigGamutTag)) return 0; SubTest("Tags holding CHAD"); if (!CheckCHAD(Pass, h, cmsSigChromaticAdaptationTag)) return 0; SubTest("Tags holding Chromaticity"); if (!CheckChromaticity(Pass, h, cmsSigChromaticityTag)) return 0; SubTest("Tags holding colorant order"); if (!CheckColorantOrder(Pass, h, cmsSigColorantOrderTag)) return 0; SubTest("Tags holding measurement"); if (!CheckMeasurement(Pass, h, cmsSigMeasurementTag)) return 0; SubTest("Tags holding CRD info"); if (!CheckCRDinfo(Pass, h, cmsSigCrdInfoTag)) return 0; SubTest("Tags holding UCR/BG"); if (!CheckUcrBg(Pass, h, cmsSigUcrBgTag)) return 0; SubTest("Tags holding MPE"); if (!CheckMPE(Pass, h, cmsSigDToB0Tag)) return 0; if (!CheckMPE(Pass, h, cmsSigDToB1Tag)) return 0; if (!CheckMPE(Pass, h, cmsSigDToB2Tag)) return 0; if (!CheckMPE(Pass, h, cmsSigDToB3Tag)) return 0; if (!CheckMPE(Pass, h, cmsSigBToD0Tag)) return 0; if (!CheckMPE(Pass, h, cmsSigBToD1Tag)) return 0; if (!CheckMPE(Pass, h, cmsSigBToD2Tag)) return 0; if (!CheckMPE(Pass, h, cmsSigBToD3Tag)) return 0; SubTest("Tags using screening"); if (!CheckScreening(Pass, h, cmsSigScreeningTag)) return 0; SubTest("Tags holding profile sequence description"); if (!CheckProfileSequenceTag(Pass, h)) return 0; if (!CheckProfileSequenceIDTag(Pass, h)) return 0; SubTest("Tags holding ICC viewing conditions"); if (!CheckICCViewingConditions(Pass, h)) return 0; SubTest("VCGT tags"); if (!CheckVCGT(Pass, h)) return 0; SubTest("RAW tags"); if (!CheckRAWtags(Pass, h)) return 0; SubTest("Dictionary meta tags"); // if (!CheckDictionary16(Pass, h)) return 0; if (!CheckDictionary24(Pass, h)) return 0; if (Pass == 1) { cmsSaveProfileToFile(h, "alltags.icc"); cmsCloseProfile(h); h = cmsOpenProfileFromFileTHR(DbgThread(), "alltags.icc", "r"); } } /* Not implemented (by design): cmsSigDataTag = 0x64617461, // 'data' -- Unused cmsSigDeviceSettingsTag = 0x64657673, // 'devs' -- Unused cmsSigNamedColorTag = 0x6E636f6C, // 'ncol' -- Don't use this one, deprecated by ICC cmsSigOutputResponseTag = 0x72657370, // 'resp' -- Possible patent on this */ cmsCloseProfile(h); remove("alltags.icc"); return 1; } // Thanks to Christopher James Halse Rogers for the bugfixing and providing this test static cmsInt32Number CheckVersionHeaderWriting(void) { cmsHPROFILE h; int index; float test_versions[] = { 2.3f, 4.08f, 4.09f, 4.3f }; for (index = 0; index < sizeof(test_versions)/sizeof(test_versions[0]); index++) { h = cmsCreateProfilePlaceholder(DbgThread()); if (h == NULL) return 0; cmsSetProfileVersion(h, test_versions[index]); cmsSaveProfileToFile(h, "versions.icc"); cmsCloseProfile(h); h = cmsOpenProfileFromFileTHR(DbgThread(), "versions.icc", "r"); // Only the first 3 digits are significant if (fabs(cmsGetProfileVersion(h) - test_versions[index]) > 0.005) { Fail("Version failed to round-trip: wrote %.2f, read %.2f", test_versions[index], cmsGetProfileVersion(h)); return 0; } cmsCloseProfile(h); remove("versions.icc"); } return 1; } // Error reporting ------------------------------------------------------------------------------------------------------- static void ErrorReportingFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) { TrappedError = TRUE; SimultaneousErrors++; strncpy(ReasonToFailBuffer, Text, TEXT_ERROR_BUFFER_SIZE-1); cmsUNUSED_PARAMETER(ContextID); cmsUNUSED_PARAMETER(ErrorCode); } static cmsInt32Number CheckBadProfiles(void) { cmsHPROFILE h; h = cmsOpenProfileFromFileTHR(DbgThread(), "IDoNotExist.icc", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromFileTHR(DbgThread(), "IAmIllFormed*.icc", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } // No profile name given h = cmsOpenProfileFromFileTHR(DbgThread(), "", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromFileTHR(DbgThread(), "..", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromFileTHR(DbgThread(), "IHaveBadAccessMode.icc", "@"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromFileTHR(DbgThread(), "bad.icc", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromFileTHR(DbgThread(), "toosmall.icc", "r"); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromMemTHR(DbgThread(), NULL, 3); if (h != NULL) { cmsCloseProfile(h); return 0; } h = cmsOpenProfileFromMemTHR(DbgThread(), "123", 3); if (h != NULL) { cmsCloseProfile(h); return 0; } if (SimultaneousErrors != 9) return 0; return 1; } static cmsInt32Number CheckErrReportingOnBadProfiles(void) { cmsInt32Number rc; cmsSetLogErrorHandler(ErrorReportingFunction); rc = CheckBadProfiles(); cmsSetLogErrorHandler(FatalErrorQuit); // Reset the error state TrappedError = FALSE; return rc; } static cmsInt32Number CheckBadTransforms(void) { cmsHPROFILE h1 = cmsCreate_sRGBProfile(); cmsHTRANSFORM x1; x1 = cmsCreateTransform(NULL, 0, NULL, 0, 0, 0); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } x1 = cmsCreateTransform(h1, TYPE_RGB_8, h1, TYPE_RGB_8, 12345, 0); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } x1 = cmsCreateTransform(h1, TYPE_CMYK_8, h1, TYPE_RGB_8, 0, 0); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } x1 = cmsCreateTransform(h1, TYPE_RGB_8, h1, TYPE_CMYK_8, 1, 0); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } // sRGB does its output as XYZ! x1 = cmsCreateTransform(h1, TYPE_RGB_8, NULL, TYPE_Lab_8, 1, 0); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } cmsCloseProfile(h1); { cmsHPROFILE hp1 = cmsOpenProfileFromFile("test1.icc", "r"); cmsHPROFILE hp2 = cmsCreate_sRGBProfile(); x1 = cmsCreateTransform(hp1, TYPE_BGR_8, hp2, TYPE_BGR_8, INTENT_PERCEPTUAL, 0); cmsCloseProfile(hp1); cmsCloseProfile(hp2); if (x1 != NULL) { cmsDeleteTransform(x1); return 0; } } return 1; } static cmsInt32Number CheckErrReportingOnBadTransforms(void) { cmsInt32Number rc; cmsSetLogErrorHandler(ErrorReportingFunction); rc = CheckBadTransforms(); cmsSetLogErrorHandler(FatalErrorQuit); // Reset the error state TrappedError = FALSE; return rc; } // --------------------------------------------------------------------------------------------------------- // Check a linear xform static cmsInt32Number Check8linearXFORM(cmsHTRANSFORM xform, cmsInt32Number nChan) { cmsInt32Number n2, i, j; cmsUInt8Number Inw[cmsMAXCHANNELS], Outw[cmsMAXCHANNELS]; n2=0; for (j=0; j < 0xFF; j++) { memset(Inw, j, sizeof(Inw)); cmsDoTransform(xform, Inw, Outw, 1); for (i=0; i < nChan; i++) { cmsInt32Number dif = abs(Outw[i] - j); if (dif > n2) n2 = dif; } } // We allow 2 contone of difference on 8 bits if (n2 > 2) { Fail("Differences too big (%x)", n2); return 0; } return 1; } static cmsInt32Number Compare8bitXFORM(cmsHTRANSFORM xform1, cmsHTRANSFORM xform2, cmsInt32Number nChan) { cmsInt32Number n2, i, j; cmsUInt8Number Inw[cmsMAXCHANNELS], Outw1[cmsMAXCHANNELS], Outw2[cmsMAXCHANNELS];; n2=0; for (j=0; j < 0xFF; j++) { memset(Inw, j, sizeof(Inw)); cmsDoTransform(xform1, Inw, Outw1, 1); cmsDoTransform(xform2, Inw, Outw2, 1); for (i=0; i < nChan; i++) { cmsInt32Number dif = abs(Outw2[i] - Outw1[i]); if (dif > n2) n2 = dif; } } // We allow 2 contone of difference on 8 bits if (n2 > 2) { Fail("Differences too big (%x)", n2); return 0; } return 1; } // Check a linear xform static cmsInt32Number Check16linearXFORM(cmsHTRANSFORM xform, cmsInt32Number nChan) { cmsInt32Number n2, i, j; cmsUInt16Number Inw[cmsMAXCHANNELS], Outw[cmsMAXCHANNELS]; n2=0; for (j=0; j < 0xFFFF; j++) { for (i=0; i < nChan; i++) Inw[i] = (cmsUInt16Number) j; cmsDoTransform(xform, Inw, Outw, 1); for (i=0; i < nChan; i++) { cmsInt32Number dif = abs(Outw[i] - j); if (dif > n2) n2 = dif; } // We allow 2 contone of difference on 16 bits if (n2 > 0x200) { Fail("Differences too big (%x)", n2); return 0; } } return 1; } static cmsInt32Number Compare16bitXFORM(cmsHTRANSFORM xform1, cmsHTRANSFORM xform2, cmsInt32Number nChan) { cmsInt32Number n2, i, j; cmsUInt16Number Inw[cmsMAXCHANNELS], Outw1[cmsMAXCHANNELS], Outw2[cmsMAXCHANNELS];; n2=0; for (j=0; j < 0xFFFF; j++) { for (i=0; i < nChan; i++) Inw[i] = (cmsUInt16Number) j; cmsDoTransform(xform1, Inw, Outw1, 1); cmsDoTransform(xform2, Inw, Outw2, 1); for (i=0; i < nChan; i++) { cmsInt32Number dif = abs(Outw2[i] - Outw1[i]); if (dif > n2) n2 = dif; } } // We allow 2 contone of difference on 16 bits if (n2 > 0x200) { Fail("Differences too big (%x)", n2); return 0; } return 1; } // Check a linear xform static cmsInt32Number CheckFloatlinearXFORM(cmsHTRANSFORM xform, cmsInt32Number nChan) { cmsInt32Number i, j; cmsFloat32Number In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS]; for (j=0; j < 0xFFFF; j++) { for (i=0; i < nChan; i++) In[i] = (cmsFloat32Number) (j / 65535.0);; cmsDoTransform(xform, In, Out, 1); for (i=0; i < nChan; i++) { // We allow no difference in floating point if (!IsGoodFixed15_16("linear xform cmsFloat32Number", Out[i], (cmsFloat32Number) (j / 65535.0))) return 0; } } return 1; } // Check a linear xform static cmsInt32Number CompareFloatXFORM(cmsHTRANSFORM xform1, cmsHTRANSFORM xform2, cmsInt32Number nChan) { cmsInt32Number i, j; cmsFloat32Number In[cmsMAXCHANNELS], Out1[cmsMAXCHANNELS], Out2[cmsMAXCHANNELS]; for (j=0; j < 0xFFFF; j++) { for (i=0; i < nChan; i++) In[i] = (cmsFloat32Number) (j / 65535.0);; cmsDoTransform(xform1, In, Out1, 1); cmsDoTransform(xform2, In, Out2, 1); for (i=0; i < nChan; i++) { // We allow no difference in floating point if (!IsGoodFixed15_16("linear xform cmsFloat32Number", Out1[i], Out2[i])) return 0; } } return 1; } // Curves only transforms ---------------------------------------------------------------------------------------- static cmsInt32Number CheckCurvesOnlyTransforms(void) { cmsHTRANSFORM xform1, xform2; cmsHPROFILE h1, h2, h3; cmsToneCurve* c1, *c2, *c3; cmsInt32Number rc = 1; c1 = cmsBuildGamma(DbgThread(), 2.2); c2 = cmsBuildGamma(DbgThread(), 1/2.2); c3 = cmsBuildGamma(DbgThread(), 4.84); h1 = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigGrayData, &c1); h2 = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigGrayData, &c2); h3 = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigGrayData, &c3); SubTest("Gray float optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_FLT, h2, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, 0); rc &= CheckFloatlinearXFORM(xform1, 1); cmsDeleteTransform(xform1); if (rc == 0) goto Error; SubTest("Gray 8 optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_8, h2, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); rc &= Check8linearXFORM(xform1, 1); cmsDeleteTransform(xform1); if (rc == 0) goto Error; SubTest("Gray 16 optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_16, h2, TYPE_GRAY_16, INTENT_PERCEPTUAL, 0); rc &= Check16linearXFORM(xform1, 1); cmsDeleteTransform(xform1); if (rc == 0) goto Error; SubTest("Gray float non-optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_FLT, h1, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, 0); xform2 = cmsCreateTransform(h3, TYPE_GRAY_FLT, NULL, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, 0); rc &= CompareFloatXFORM(xform1, xform2, 1); cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); if (rc == 0) goto Error; SubTest("Gray 8 non-optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_8, h1, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); xform2 = cmsCreateTransform(h3, TYPE_GRAY_8, NULL, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); rc &= Compare8bitXFORM(xform1, xform2, 1); cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); if (rc == 0) goto Error; SubTest("Gray 16 non-optimizeable transform"); xform1 = cmsCreateTransform(h1, TYPE_GRAY_16, h1, TYPE_GRAY_16, INTENT_PERCEPTUAL, 0); xform2 = cmsCreateTransform(h3, TYPE_GRAY_16, NULL, TYPE_GRAY_16, INTENT_PERCEPTUAL, 0); rc &= Compare16bitXFORM(xform1, xform2, 1); cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); if (rc == 0) goto Error; Error: cmsCloseProfile(h1); cmsCloseProfile(h2); cmsCloseProfile(h3); cmsFreeToneCurve(c1); cmsFreeToneCurve(c2); cmsFreeToneCurve(c3); return rc; } // Lab to Lab trivial transforms ---------------------------------------------------------------------------------------- static cmsFloat64Number MaxDE; static cmsInt32Number CheckOneLab(cmsHTRANSFORM xform, cmsFloat64Number L, cmsFloat64Number a, cmsFloat64Number b) { cmsCIELab In, Out; cmsFloat64Number dE; In.L = L; In.a = a; In.b = b; cmsDoTransform(xform, &In, &Out, 1); dE = cmsDeltaE(&In, &Out); if (dE > MaxDE) MaxDE = dE; if (MaxDE > 0.003) { Fail("dE=%f Lab1=(%f, %f, %f)\n\tLab2=(%f %f %f)", MaxDE, In.L, In.a, In.b, Out.L, Out.a, Out.b); cmsDoTransform(xform, &In, &Out, 1); return 0; } return 1; } // Check several Lab, slicing at non-exact values. Precision should be 16 bits. 50x50x50 checks aprox. static cmsInt32Number CheckSeveralLab(cmsHTRANSFORM xform) { cmsInt32Number L, a, b; MaxDE = 0; for (L=0; L < 65536; L += 1311) { for (a = 0; a < 65536; a += 1232) { for (b = 0; b < 65536; b += 1111) { if (!CheckOneLab(xform, (L * 100.0) / 65535.0, (a / 257.0) - 128, (b / 257.0) - 128)) return 0; } } } return 1; } static cmsInt32Number OneTrivialLab(cmsHPROFILE hLab1, cmsHPROFILE hLab2, const char* txt) { cmsHTRANSFORM xform; cmsInt32Number rc; SubTest(txt); xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_DBL, hLab2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); rc = CheckSeveralLab(xform); cmsDeleteTransform(xform); return rc; } static cmsInt32Number CheckFloatLabTransforms(void) { return OneTrivialLab(cmsCreateLab4ProfileTHR(DbgThread(), NULL), cmsCreateLab4ProfileTHR(DbgThread(), NULL), "Lab4/Lab4") && OneTrivialLab(cmsCreateLab2ProfileTHR(DbgThread(), NULL), cmsCreateLab2ProfileTHR(DbgThread(), NULL), "Lab2/Lab2") && OneTrivialLab(cmsCreateLab4ProfileTHR(DbgThread(), NULL), cmsCreateLab2ProfileTHR(DbgThread(), NULL), "Lab4/Lab2") && OneTrivialLab(cmsCreateLab2ProfileTHR(DbgThread(), NULL), cmsCreateLab4ProfileTHR(DbgThread(), NULL), "Lab2/Lab4"); } static cmsInt32Number CheckEncodedLabTransforms(void) { cmsHTRANSFORM xform; cmsUInt16Number In[3]; cmsCIELab Lab; cmsCIELab White = { 100, 0, 0 }; cmsHPROFILE hLab1 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); cmsHPROFILE hLab2 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_16, hLab2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); In[0] = 0xFFFF; In[1] = 0x8080; In[2] = 0x8080; cmsDoTransform(xform, In, &Lab, 1); if (cmsDeltaE(&Lab, &White) > 0.0001) return 0; cmsDeleteTransform(xform); hLab1 = cmsCreateLab2ProfileTHR(DbgThread(), NULL); hLab2 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_LabV2_16, hLab2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); In[0] = 0xFF00; In[1] = 0x8000; In[2] = 0x8000; cmsDoTransform(xform, In, &Lab, 1); if (cmsDeltaE(&Lab, &White) > 0.0001) return 0; cmsDeleteTransform(xform); hLab2 = cmsCreateLab2ProfileTHR(DbgThread(), NULL); hLab1 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_DBL, hLab2, TYPE_LabV2_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); Lab.L = 100; Lab.a = 0; Lab.b = 0; cmsDoTransform(xform, &Lab, In, 1); if (In[0] != 0xFF00 || In[1] != 0x8000 || In[2] != 0x8000) return 0; cmsDeleteTransform(xform); hLab1 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); hLab2 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_DBL, hLab2, TYPE_Lab_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); Lab.L = 100; Lab.a = 0; Lab.b = 0; cmsDoTransform(xform, &Lab, In, 1); if (In[0] != 0xFFFF || In[1] != 0x8080 || In[2] != 0x8080) return 0; cmsDeleteTransform(xform); return 1; } static cmsInt32Number CheckStoredIdentities(void) { cmsHPROFILE hLab, hLink, h4, h2; cmsHTRANSFORM xform; cmsInt32Number rc = 1; hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hLab, TYPE_Lab_8, hLab, TYPE_Lab_8, 0, 0); hLink = cmsTransform2DeviceLink(xform, 3.4, 0); cmsSaveProfileToFile(hLink, "abstractv2.icc"); cmsCloseProfile(hLink); hLink = cmsTransform2DeviceLink(xform, 4.3, 0); cmsSaveProfileToFile(hLink, "abstractv4.icc"); cmsCloseProfile(hLink); cmsDeleteTransform(xform); cmsCloseProfile(hLab); h4 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv4.icc", "r"); xform = cmsCreateTransformTHR(DbgThread(), h4, TYPE_Lab_DBL, h4, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); SubTest("V4"); rc &= CheckSeveralLab(xform); cmsDeleteTransform(xform); cmsCloseProfile(h4); if (!rc) goto Error; SubTest("V2"); h2 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv2.icc", "r"); xform = cmsCreateTransformTHR(DbgThread(), h2, TYPE_Lab_DBL, h2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); rc &= CheckSeveralLab(xform); cmsDeleteTransform(xform); cmsCloseProfile(h2); if (!rc) goto Error; SubTest("V2 -> V4"); h2 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv2.icc", "r"); h4 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv4.icc", "r"); xform = cmsCreateTransformTHR(DbgThread(), h4, TYPE_Lab_DBL, h2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); rc &= CheckSeveralLab(xform); cmsDeleteTransform(xform); cmsCloseProfile(h2); cmsCloseProfile(h4); SubTest("V4 -> V2"); h2 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv2.icc", "r"); h4 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv4.icc", "r"); xform = cmsCreateTransformTHR(DbgThread(), h2, TYPE_Lab_DBL, h4, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); rc &= CheckSeveralLab(xform); cmsDeleteTransform(xform); cmsCloseProfile(h2); cmsCloseProfile(h4); Error: remove("abstractv2.icc"); remove("abstractv4.icc"); return rc; } // Check a simple xform from a matrix profile to itself. Test floating point accuracy. static cmsInt32Number CheckMatrixShaperXFORMFloat(void) { cmsHPROFILE hAbove, hSRGB; cmsHTRANSFORM xform; cmsInt32Number rc1, rc2; hAbove = Create_AboveRGB(); xform = cmsCreateTransformTHR(DbgThread(), hAbove, TYPE_RGB_FLT, hAbove, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hAbove); rc1 = CheckFloatlinearXFORM(xform, 3); cmsDeleteTransform(xform); hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); xform = cmsCreateTransformTHR(DbgThread(), hSRGB, TYPE_RGB_FLT, hSRGB, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hSRGB); rc2 = CheckFloatlinearXFORM(xform, 3); cmsDeleteTransform(xform); return rc1 && rc2; } // Check a simple xform from a matrix profile to itself. Test 16 bits accuracy. static cmsInt32Number CheckMatrixShaperXFORM16(void) { cmsHPROFILE hAbove, hSRGB; cmsHTRANSFORM xform; cmsInt32Number rc1, rc2; hAbove = Create_AboveRGB(); xform = cmsCreateTransformTHR(DbgThread(), hAbove, TYPE_RGB_16, hAbove, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hAbove); rc1 = Check16linearXFORM(xform, 3); cmsDeleteTransform(xform); hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); xform = cmsCreateTransformTHR(DbgThread(), hSRGB, TYPE_RGB_16, hSRGB, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hSRGB); rc2 = Check16linearXFORM(xform, 3); cmsDeleteTransform(xform); return rc1 && rc2; } // Check a simple xform from a matrix profile to itself. Test 8 bits accuracy. static cmsInt32Number CheckMatrixShaperXFORM8(void) { cmsHPROFILE hAbove, hSRGB; cmsHTRANSFORM xform; cmsInt32Number rc1, rc2; hAbove = Create_AboveRGB(); xform = cmsCreateTransformTHR(DbgThread(), hAbove, TYPE_RGB_8, hAbove, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hAbove); rc1 = Check8linearXFORM(xform, 3); cmsDeleteTransform(xform); hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); xform = cmsCreateTransformTHR(DbgThread(), hSRGB, TYPE_RGB_8, hSRGB, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hSRGB); rc2 = Check8linearXFORM(xform, 3); cmsDeleteTransform(xform); return rc1 && rc2; } // TODO: Check LUT based to LUT based transforms for CMYK // ----------------------------------------------------------------------------------------------------------------- // Check known values going from sRGB to XYZ static cmsInt32Number CheckOneRGB_f(cmsHTRANSFORM xform, cmsInt32Number R, cmsInt32Number G, cmsInt32Number B, cmsFloat64Number X, cmsFloat64Number Y, cmsFloat64Number Z, cmsFloat64Number err) { cmsFloat32Number RGB[3]; cmsFloat64Number Out[3]; RGB[0] = (cmsFloat32Number) (R / 255.0); RGB[1] = (cmsFloat32Number) (G / 255.0); RGB[2] = (cmsFloat32Number) (B / 255.0); cmsDoTransform(xform, RGB, Out, 1); return IsGoodVal("X", X , Out[0], err) && IsGoodVal("Y", Y , Out[1], err) && IsGoodVal("Z", Z , Out[2], err); } static cmsInt32Number Chack_sRGB_Float(void) { cmsHPROFILE hsRGB, hXYZ, hLab; cmsHTRANSFORM xform1, xform2; cmsInt32Number rc; hsRGB = cmsCreate_sRGBProfileTHR(DbgThread()); hXYZ = cmsCreateXYZProfileTHR(DbgThread()); hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform1 = cmsCreateTransformTHR(DbgThread(), hsRGB, TYPE_RGB_FLT, hXYZ, TYPE_XYZ_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); xform2 = cmsCreateTransformTHR(DbgThread(), hsRGB, TYPE_RGB_FLT, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hsRGB); cmsCloseProfile(hXYZ); cmsCloseProfile(hLab); MaxErr = 0; // Xform 1 goes from 8 bits to XYZ, rc = CheckOneRGB_f(xform1, 1, 1, 1, 0.0002926, 0.00030352, 0.00025037, 0.0001); rc &= CheckOneRGB_f(xform1, 127, 127, 127, 0.2046329, 0.212230, 0.175069, 0.0001); rc &= CheckOneRGB_f(xform1, 12, 13, 15, 0.0038364, 0.0039928, 0.00385212, 0.0001); rc &= CheckOneRGB_f(xform1, 128, 0, 0, 0.0940846, 0.0480030, 0.00300543, 0.0001); rc &= CheckOneRGB_f(xform1, 190, 25, 210, 0.3203491, 0.1605240, 0.46817115, 0.0001); // Xform 2 goes from 8 bits to Lab, we allow 0.01 error max rc &= CheckOneRGB_f(xform2, 1, 1, 1, 0.2741748, 0, 0, 0.01); rc &= CheckOneRGB_f(xform2, 127, 127, 127, 53.192776, 0, 0, 0.01); rc &= CheckOneRGB_f(xform2, 190, 25, 210, 47.043171, 74.564576, -56.89373, 0.01); rc &= CheckOneRGB_f(xform2, 128, 0, 0, 26.158100, 48.474477, 39.425916, 0.01); cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); return rc; } // --------------------------------------------------- static cmsBool GetProfileRGBPrimaries(cmsHPROFILE hProfile, cmsCIEXYZTRIPLE *result, cmsUInt32Number intent) { cmsHPROFILE hXYZ; cmsHTRANSFORM hTransform; cmsFloat64Number rgb[3][3] = {{1., 0., 0.}, {0., 1., 0.}, {0., 0., 1.}}; hXYZ = cmsCreateXYZProfile(); if (hXYZ == NULL) return FALSE; hTransform = cmsCreateTransform(hProfile, TYPE_RGB_DBL, hXYZ, TYPE_XYZ_DBL, intent, cmsFLAGS_NOCACHE | cmsFLAGS_NOOPTIMIZE); cmsCloseProfile(hXYZ); if (hTransform == NULL) return FALSE; cmsDoTransform(hTransform, rgb, result, 3); cmsDeleteTransform(hTransform); return TRUE; } static int CheckRGBPrimaries(void) { cmsHPROFILE hsRGB; cmsCIEXYZTRIPLE tripXYZ; cmsCIExyYTRIPLE tripxyY; cmsBool result; cmsSetAdaptationState(0); hsRGB = cmsCreate_sRGBProfileTHR(DbgThread()); if (!hsRGB) return 0; result = GetProfileRGBPrimaries(hsRGB, &tripXYZ, INTENT_ABSOLUTE_COLORIMETRIC); cmsCloseProfile(hsRGB); if (!result) return 0; cmsXYZ2xyY(&tripxyY.Red, &tripXYZ.Red); cmsXYZ2xyY(&tripxyY.Green, &tripXYZ.Green); cmsXYZ2xyY(&tripxyY.Blue, &tripXYZ.Blue); /* valus were taken from http://en.wikipedia.org/wiki/RGB_color_spaces#Specifications */ if (!IsGoodFixed15_16("xRed", tripxyY.Red.x, 0.64) || !IsGoodFixed15_16("yRed", tripxyY.Red.y, 0.33) || !IsGoodFixed15_16("xGreen", tripxyY.Green.x, 0.30) || !IsGoodFixed15_16("yGreen", tripxyY.Green.y, 0.60) || !IsGoodFixed15_16("xBlue", tripxyY.Blue.x, 0.15) || !IsGoodFixed15_16("yBlue", tripxyY.Blue.y, 0.06)) { Fail("One or more primaries are wrong."); return FALSE; } return TRUE; } // ----------------------------------------------------------------------------------------------------------------- // This function will check CMYK -> CMYK transforms. It uses FOGRA29 and SWOP ICC profiles static cmsInt32Number CheckCMYK(cmsInt32Number Intent, const char *Profile1, const char* Profile2) { cmsHPROFILE hSWOP = cmsOpenProfileFromFileTHR(DbgThread(), Profile1, "r"); cmsHPROFILE hFOGRA = cmsOpenProfileFromFileTHR(DbgThread(), Profile2, "r"); cmsHTRANSFORM xform, swop_lab, fogra_lab; cmsFloat32Number CMYK1[4], CMYK2[4]; cmsCIELab Lab1, Lab2; cmsHPROFILE hLab; cmsFloat64Number DeltaL, Max; cmsInt32Number i; hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hFOGRA, TYPE_CMYK_FLT, Intent, 0); swop_lab = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, Intent, 0); fogra_lab = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, Intent, 0); Max = 0; for (i=0; i <= 100; i++) { CMYK1[0] = 10; CMYK1[1] = 20; CMYK1[2] = 30; CMYK1[3] = (cmsFloat32Number) i; cmsDoTransform(swop_lab, CMYK1, &Lab1, 1); cmsDoTransform(xform, CMYK1, CMYK2, 1); cmsDoTransform(fogra_lab, CMYK2, &Lab2, 1); DeltaL = fabs(Lab1.L - Lab2.L); if (DeltaL > Max) Max = DeltaL; } cmsDeleteTransform(xform); if (Max > 3.0) return 0; xform = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hSWOP, TYPE_CMYK_FLT, Intent, 0); Max = 0; for (i=0; i <= 100; i++) { CMYK1[0] = 10; CMYK1[1] = 20; CMYK1[2] = 30; CMYK1[3] = (cmsFloat32Number) i; cmsDoTransform(fogra_lab, CMYK1, &Lab1, 1); cmsDoTransform(xform, CMYK1, CMYK2, 1); cmsDoTransform(swop_lab, CMYK2, &Lab2, 1); DeltaL = fabs(Lab1.L - Lab2.L); if (DeltaL > Max) Max = DeltaL; } cmsCloseProfile(hSWOP); cmsCloseProfile(hFOGRA); cmsCloseProfile(hLab); cmsDeleteTransform(xform); cmsDeleteTransform(swop_lab); cmsDeleteTransform(fogra_lab); return Max < 3.0; } static cmsInt32Number CheckCMYKRoundtrip(void) { return CheckCMYK(INTENT_RELATIVE_COLORIMETRIC, "test1.icc", "test1.icc"); } static cmsInt32Number CheckCMYKPerceptual(void) { return CheckCMYK(INTENT_PERCEPTUAL, "test1.icc", "test2.icc"); } static cmsInt32Number CheckCMYKRelCol(void) { return CheckCMYK(INTENT_RELATIVE_COLORIMETRIC, "test1.icc", "test2.icc"); } static cmsInt32Number CheckKOnlyBlackPreserving(void) { cmsHPROFILE hSWOP = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); cmsHPROFILE hFOGRA = cmsOpenProfileFromFileTHR(DbgThread(), "test2.icc", "r"); cmsHTRANSFORM xform, swop_lab, fogra_lab; cmsFloat32Number CMYK1[4], CMYK2[4]; cmsCIELab Lab1, Lab2; cmsHPROFILE hLab; cmsFloat64Number DeltaL, Max; cmsInt32Number i; hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hFOGRA, TYPE_CMYK_FLT, INTENT_PRESERVE_K_ONLY_PERCEPTUAL, 0); swop_lab = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); fogra_lab = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); Max = 0; for (i=0; i <= 100; i++) { CMYK1[0] = 0; CMYK1[1] = 0; CMYK1[2] = 0; CMYK1[3] = (cmsFloat32Number) i; // SWOP CMYK to Lab1 cmsDoTransform(swop_lab, CMYK1, &Lab1, 1); // SWOP To FOGRA using black preservation cmsDoTransform(xform, CMYK1, CMYK2, 1); // Obtained FOGRA CMYK to Lab2 cmsDoTransform(fogra_lab, CMYK2, &Lab2, 1); // We care only on L* DeltaL = fabs(Lab1.L - Lab2.L); if (DeltaL > Max) Max = DeltaL; } cmsDeleteTransform(xform); // dL should be below 3.0 if (Max > 3.0) return 0; // Same, but FOGRA to SWOP xform = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hSWOP, TYPE_CMYK_FLT, INTENT_PRESERVE_K_ONLY_PERCEPTUAL, 0); Max = 0; for (i=0; i <= 100; i++) { CMYK1[0] = 0; CMYK1[1] = 0; CMYK1[2] = 0; CMYK1[3] = (cmsFloat32Number) i; cmsDoTransform(fogra_lab, CMYK1, &Lab1, 1); cmsDoTransform(xform, CMYK1, CMYK2, 1); cmsDoTransform(swop_lab, CMYK2, &Lab2, 1); DeltaL = fabs(Lab1.L - Lab2.L); if (DeltaL > Max) Max = DeltaL; } cmsCloseProfile(hSWOP); cmsCloseProfile(hFOGRA); cmsCloseProfile(hLab); cmsDeleteTransform(xform); cmsDeleteTransform(swop_lab); cmsDeleteTransform(fogra_lab); return Max < 3.0; } static cmsInt32Number CheckKPlaneBlackPreserving(void) { cmsHPROFILE hSWOP = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); cmsHPROFILE hFOGRA = cmsOpenProfileFromFileTHR(DbgThread(), "test2.icc", "r"); cmsHTRANSFORM xform, swop_lab, fogra_lab; cmsFloat32Number CMYK1[4], CMYK2[4]; cmsCIELab Lab1, Lab2; cmsHPROFILE hLab; cmsFloat64Number DeltaE, Max; cmsInt32Number i; hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); xform = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hFOGRA, TYPE_CMYK_FLT, INTENT_PERCEPTUAL, 0); swop_lab = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); fogra_lab = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); Max = 0; for (i=0; i <= 100; i++) { CMYK1[0] = 0; CMYK1[1] = 0; CMYK1[2] = 0; CMYK1[3] = (cmsFloat32Number) i; cmsDoTransform(swop_lab, CMYK1, &Lab1, 1); cmsDoTransform(xform, CMYK1, CMYK2, 1); cmsDoTransform(fogra_lab, CMYK2, &Lab2, 1); DeltaE = cmsDeltaE(&Lab1, &Lab2); if (DeltaE > Max) Max = DeltaE; } cmsDeleteTransform(xform); xform = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hSWOP, TYPE_CMYK_FLT, INTENT_PRESERVE_K_PLANE_PERCEPTUAL, 0); for (i=0; i <= 100; i++) { CMYK1[0] = 30; CMYK1[1] = 20; CMYK1[2] = 10; CMYK1[3] = (cmsFloat32Number) i; cmsDoTransform(fogra_lab, CMYK1, &Lab1, 1); cmsDoTransform(xform, CMYK1, CMYK2, 1); cmsDoTransform(swop_lab, CMYK2, &Lab2, 1); DeltaE = cmsDeltaE(&Lab1, &Lab2); if (DeltaE > Max) Max = DeltaE; } cmsDeleteTransform(xform); cmsCloseProfile(hSWOP); cmsCloseProfile(hFOGRA); cmsCloseProfile(hLab); cmsDeleteTransform(swop_lab); cmsDeleteTransform(fogra_lab); return Max < 30.0; } // ------------------------------------------------------------------------------------------------------ static cmsInt32Number CheckProofingXFORMFloat(void) { cmsHPROFILE hAbove; cmsHTRANSFORM xform; cmsInt32Number rc; hAbove = Create_AboveRGB(); xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_FLT, hAbove, TYPE_RGB_FLT, hAbove, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_SOFTPROOFING); cmsCloseProfile(hAbove); rc = CheckFloatlinearXFORM(xform, 3); cmsDeleteTransform(xform); return rc; } static cmsInt32Number CheckProofingXFORM16(void) { cmsHPROFILE hAbove; cmsHTRANSFORM xform; cmsInt32Number rc; hAbove = Create_AboveRGB(); xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_16, hAbove, TYPE_RGB_16, hAbove, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_SOFTPROOFING|cmsFLAGS_NOCACHE); cmsCloseProfile(hAbove); rc = Check16linearXFORM(xform, 3); cmsDeleteTransform(xform); return rc; } static cmsInt32Number CheckGamutCheck(void) { cmsHPROFILE hSRGB, hAbove; cmsHTRANSFORM xform; cmsInt32Number rc; cmsUInt16Number Alarm[3] = { 0xDEAD, 0xBABE, 0xFACE }; // Set alarm codes to fancy values so we could check the out of gamut condition cmsSetAlarmCodes(Alarm); // Create the profiles hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); hAbove = Create_AboveRGB(); if (hSRGB == NULL || hAbove == NULL) return 0; // Failed SubTest("Gamut check on floating point"); // Create a gamut checker in the same space. No value should be out of gamut xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_FLT, hAbove, TYPE_RGB_FLT, hAbove, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK); if (!CheckFloatlinearXFORM(xform, 3)) { cmsCloseProfile(hSRGB); cmsCloseProfile(hAbove); cmsDeleteTransform(xform); Fail("Gamut check on same profile failed"); return 0; } cmsDeleteTransform(xform); SubTest("Gamut check on 16 bits"); xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_16, hAbove, TYPE_RGB_16, hSRGB, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK); cmsCloseProfile(hSRGB); cmsCloseProfile(hAbove); rc = Check16linearXFORM(xform, 3); cmsDeleteTransform(xform); return rc; } // ------------------------------------------------------------------------------------------------------------------- static cmsInt32Number CheckBlackPoint(void) { cmsHPROFILE hProfile; cmsCIEXYZ Black; cmsCIELab Lab; hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test5.icc", "r"); cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hProfile); hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); cmsXYZ2Lab(NULL, &Lab, &Black); cmsCloseProfile(hProfile); hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "lcms2cmyk.icc", "r"); cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); cmsXYZ2Lab(NULL, &Lab, &Black); cmsCloseProfile(hProfile); hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test2.icc", "r"); cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); cmsXYZ2Lab(NULL, &Lab, &Black); cmsCloseProfile(hProfile); hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_PERCEPTUAL, 0); cmsXYZ2Lab(NULL, &Lab, &Black); cmsCloseProfile(hProfile); return 1; } static cmsInt32Number CheckOneTAC(cmsFloat64Number InkLimit) { cmsHPROFILE h; cmsFloat64Number d; h =CreateFakeCMYK(InkLimit, TRUE); cmsSaveProfileToFile(h, "lcmstac.icc"); cmsCloseProfile(h); h = cmsOpenProfileFromFile("lcmstac.icc", "r"); d = cmsDetectTAC(h); cmsCloseProfile(h); remove("lcmstac.icc"); if (fabs(d - InkLimit) > 5) return 0; return 1; } static cmsInt32Number CheckTAC(void) { if (!CheckOneTAC(180)) return 0; if (!CheckOneTAC(220)) return 0; if (!CheckOneTAC(286)) return 0; if (!CheckOneTAC(310)) return 0; if (!CheckOneTAC(330)) return 0; return 1; } // ------------------------------------------------------------------------------------------------------- #define NPOINTS_IT8 10 // (17*17*17*17) static cmsInt32Number CheckCGATS(void) { cmsHANDLE it8; cmsInt32Number i; SubTest("IT8 creation"); it8 = cmsIT8Alloc(DbgThread()); if (it8 == NULL) return 0; cmsIT8SetSheetType(it8, "LCMS/TESTING"); cmsIT8SetPropertyStr(it8, "ORIGINATOR", "1 2 3 4"); cmsIT8SetPropertyUncooked(it8, "DESCRIPTOR", "1234"); cmsIT8SetPropertyStr(it8, "MANUFACTURER", "3"); cmsIT8SetPropertyDbl(it8, "CREATED", 4); cmsIT8SetPropertyDbl(it8, "SERIAL", 5); cmsIT8SetPropertyHex(it8, "MATERIAL", 0x123); cmsIT8SetPropertyDbl(it8, "NUMBER_OF_SETS", NPOINTS_IT8); cmsIT8SetPropertyDbl(it8, "NUMBER_OF_FIELDS", 4); cmsIT8SetDataFormat(it8, 0, "SAMPLE_ID"); cmsIT8SetDataFormat(it8, 1, "RGB_R"); cmsIT8SetDataFormat(it8, 2, "RGB_G"); cmsIT8SetDataFormat(it8, 3, "RGB_B"); SubTest("Table creation"); for (i=0; i < NPOINTS_IT8; i++) { char Patch[20]; sprintf(Patch, "P%d", i); cmsIT8SetDataRowCol(it8, i, 0, Patch); cmsIT8SetDataRowColDbl(it8, i, 1, i); cmsIT8SetDataRowColDbl(it8, i, 2, i); cmsIT8SetDataRowColDbl(it8, i, 3, i); } SubTest("Save to file"); cmsIT8SaveToFile(it8, "TEST.IT8"); cmsIT8Free(it8); SubTest("Load from file"); it8 = cmsIT8LoadFromFile(DbgThread(), "TEST.IT8"); if (it8 == NULL) return 0; SubTest("Save again file"); cmsIT8SaveToFile(it8, "TEST.IT8"); cmsIT8Free(it8); SubTest("Load from file (II)"); it8 = cmsIT8LoadFromFile(DbgThread(), "TEST.IT8"); if (it8 == NULL) return 0; SubTest("Change prop value"); if (cmsIT8GetPropertyDbl(it8, "DESCRIPTOR") != 1234) { return 0; } cmsIT8SetPropertyDbl(it8, "DESCRIPTOR", 5678); if (cmsIT8GetPropertyDbl(it8, "DESCRIPTOR") != 5678) { return 0; } SubTest("Positive numbers"); if (cmsIT8GetDataDbl(it8, "P3", "RGB_G") != 3) { return 0; } SubTest("Positive exponent numbers"); cmsIT8SetPropertyDbl(it8, "DBL_PROP", 123E+12); if ((cmsIT8GetPropertyDbl(it8, "DBL_PROP") - 123E+12) > 1 ) { return 0; } SubTest("Negative exponent numbers"); cmsIT8SetPropertyDbl(it8, "DBL_PROP_NEG", 123E-45); if ((cmsIT8GetPropertyDbl(it8, "DBL_PROP_NEG") - 123E-45) > 1E-45 ) { return 0; } SubTest("Negative numbers"); cmsIT8SetPropertyDbl(it8, "DBL_NEG_VAL", -123); if ((cmsIT8GetPropertyDbl(it8, "DBL_NEG_VAL")) != -123 ) { return 0; } cmsIT8Free(it8); remove("TEST.IT8"); return 1; } // Create CSA/CRD static void GenerateCSA(const char* cInProf, const char* FileName) { cmsHPROFILE hProfile; cmsUInt32Number n; char* Buffer; cmsContext BuffThread = DbgThread(); FILE* o; if (cInProf == NULL) hProfile = cmsCreateLab4Profile(NULL); else hProfile = cmsOpenProfileFromFile(cInProf, "r"); n = cmsGetPostScriptCSA(DbgThread(), hProfile, 0, 0, NULL, 0); if (n == 0) return; Buffer = (char*) _cmsMalloc(BuffThread, n + 1); cmsGetPostScriptCSA(DbgThread(), hProfile, 0, 0, Buffer, n); Buffer[n] = 0; if (FileName != NULL) { o = fopen(FileName, "wb"); fwrite(Buffer, n, 1, o); fclose(o); } _cmsFree(BuffThread, Buffer); cmsCloseProfile(hProfile); if (FileName != NULL) remove(FileName); } static void GenerateCRD(const char* cOutProf, const char* FileName) { cmsHPROFILE hProfile; cmsUInt32Number n; char* Buffer; cmsUInt32Number dwFlags = 0; cmsContext BuffThread = DbgThread(); if (cOutProf == NULL) hProfile = cmsCreateLab4Profile(NULL); else hProfile = cmsOpenProfileFromFile(cOutProf, "r"); n = cmsGetPostScriptCRD(DbgThread(), hProfile, 0, dwFlags, NULL, 0); if (n == 0) return; Buffer = (char*) _cmsMalloc(BuffThread, n + 1); cmsGetPostScriptCRD(DbgThread(), hProfile, 0, dwFlags, Buffer, n); Buffer[n] = 0; if (FileName != NULL) { FILE* o = fopen(FileName, "wb"); fwrite(Buffer, n, 1, o); fclose(o); } _cmsFree(BuffThread, Buffer); cmsCloseProfile(hProfile); if (FileName != NULL) remove(FileName); } static cmsInt32Number CheckPostScript(void) { GenerateCSA("test5.icc", "sRGB_CSA.ps"); GenerateCSA("aRGBlcms2.icc", "aRGB_CSA.ps"); GenerateCSA("test4.icc", "sRGBV4_CSA.ps"); GenerateCSA("test1.icc", "SWOP_CSA.ps"); GenerateCSA(NULL, "Lab_CSA.ps"); GenerateCSA("graylcms2.icc", "gray_CSA.ps"); GenerateCRD("test5.icc", "sRGB_CRD.ps"); GenerateCRD("aRGBlcms2.icc", "aRGB_CRD.ps"); GenerateCRD(NULL, "Lab_CRD.ps"); GenerateCRD("test1.icc", "SWOP_CRD.ps"); GenerateCRD("test4.icc", "sRGBV4_CRD.ps"); GenerateCRD("graylcms2.icc", "gray_CRD.ps"); return 1; } static cmsInt32Number CheckGray(cmsHTRANSFORM xform, cmsUInt8Number g, double L) { cmsCIELab Lab; cmsDoTransform(xform, &g, &Lab, 1); if (!IsGoodVal("a axis on gray", 0, Lab.a, 0.001)) return 0; if (!IsGoodVal("b axis on gray", 0, Lab.b, 0.001)) return 0; return IsGoodVal("Gray value", L, Lab.L, 0.01); } static cmsInt32Number CheckInputGray(void) { cmsHPROFILE hGray = Create_Gray22(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform; if (hGray == NULL || hLab == NULL) return 0; xform = cmsCreateTransform(hGray, TYPE_GRAY_8, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hGray); cmsCloseProfile(hLab); if (!CheckGray(xform, 0, 0)) return 0; if (!CheckGray(xform, 125, 52.768)) return 0; if (!CheckGray(xform, 200, 81.069)) return 0; if (!CheckGray(xform, 255, 100.0)) return 0; cmsDeleteTransform(xform); return 1; } static cmsInt32Number CheckLabInputGray(void) { cmsHPROFILE hGray = Create_GrayLab(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform; if (hGray == NULL || hLab == NULL) return 0; xform = cmsCreateTransform(hGray, TYPE_GRAY_8, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hGray); cmsCloseProfile(hLab); if (!CheckGray(xform, 0, 0)) return 0; if (!CheckGray(xform, 125, 49.019)) return 0; if (!CheckGray(xform, 200, 78.431)) return 0; if (!CheckGray(xform, 255, 100.0)) return 0; cmsDeleteTransform(xform); return 1; } static cmsInt32Number CheckOutGray(cmsHTRANSFORM xform, double L, cmsUInt8Number g) { cmsCIELab Lab; cmsUInt8Number g_out; Lab.L = L; Lab.a = 0; Lab.b = 0; cmsDoTransform(xform, &Lab, &g_out, 1); return IsGoodVal("Gray value", g, (double) g_out, 0.01); } static cmsInt32Number CheckOutputGray(void) { cmsHPROFILE hGray = Create_Gray22(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform; if (hGray == NULL || hLab == NULL) return 0; xform = cmsCreateTransform( hLab, TYPE_Lab_DBL, hGray, TYPE_GRAY_8, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hGray); cmsCloseProfile(hLab); if (!CheckOutGray(xform, 0, 0)) return 0; if (!CheckOutGray(xform, 100, 255)) return 0; if (!CheckOutGray(xform, 20, 52)) return 0; if (!CheckOutGray(xform, 50, 118)) return 0; cmsDeleteTransform(xform); return 1; } static cmsInt32Number CheckLabOutputGray(void) { cmsHPROFILE hGray = Create_GrayLab(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform; cmsInt32Number i; if (hGray == NULL || hLab == NULL) return 0; xform = cmsCreateTransform( hLab, TYPE_Lab_DBL, hGray, TYPE_GRAY_8, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(hGray); cmsCloseProfile(hLab); if (!CheckOutGray(xform, 0, 0)) return 0; if (!CheckOutGray(xform, 100, 255)) return 0; for (i=0; i < 100; i++) { cmsUInt8Number g; g = (cmsUInt8Number) floor(i * 255.0 / 100.0 + 0.5); if (!CheckOutGray(xform, i, g)) return 0; } cmsDeleteTransform(xform); return 1; } static cmsInt32Number CheckV4gamma(void) { cmsHPROFILE h; cmsUInt16Number Lin[] = {0, 0xffff}; cmsToneCurve*g = cmsBuildTabulatedToneCurve16(DbgThread(), 2, Lin); h = cmsOpenProfileFromFileTHR(DbgThread(), "v4gamma.icc", "w"); if (h == NULL) return 0; cmsSetProfileVersion(h, 4.3); if (!cmsWriteTag(h, cmsSigGrayTRCTag, g)) return 0; cmsCloseProfile(h); cmsFreeToneCurve(g); remove("v4gamma.icc"); return 1; } // cmsBool cmsGBDdumpVRML(cmsHANDLE hGBD, const char* fname); // Gamut descriptor routines static cmsInt32Number CheckGBD(void) { cmsCIELab Lab; cmsHANDLE h; cmsInt32Number L, a, b; cmsUInt32Number r1, g1, b1; cmsHPROFILE hLab, hsRGB; cmsHTRANSFORM xform; h = cmsGBDAlloc(DbgThread()); if (h == NULL) return 0; // Fill all Lab gamut as valid SubTest("Filling RAW gamut"); for (L=0; L <= 100; L += 10) for (a = -128; a <= 128; a += 5) for (b = -128; b <= 128; b += 5) { Lab.L = L; Lab.a = a; Lab.b = b; if (!cmsGDBAddPoint(h, &Lab)) return 0; } // Complete boundaries SubTest("computing Lab gamut"); if (!cmsGDBCompute(h, 0)) return 0; // All points should be inside gamut SubTest("checking Lab gamut"); for (L=10; L <= 90; L += 25) for (a = -120; a <= 120; a += 25) for (b = -120; b <= 120; b += 25) { Lab.L = L; Lab.a = a; Lab.b = b; if (!cmsGDBCheckPoint(h, &Lab)) { return 0; } } cmsGBDFree(h); // Now for sRGB SubTest("checking sRGB gamut"); h = cmsGBDAlloc(DbgThread()); hsRGB = cmsCreate_sRGBProfile(); hLab = cmsCreateLab4Profile(NULL); xform = cmsCreateTransform(hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE); cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); for (r1=0; r1 < 256; r1 += 5) { for (g1=0; g1 < 256; g1 += 5) for (b1=0; b1 < 256; b1 += 5) { cmsUInt8Number rgb[3]; rgb[0] = (cmsUInt8Number) r1; rgb[1] = (cmsUInt8Number) g1; rgb[2] = (cmsUInt8Number) b1; cmsDoTransform(xform, rgb, &Lab, 1); // if (fabs(Lab.b) < 20 && Lab.a > 0) continue; if (!cmsGDBAddPoint(h, &Lab)) { cmsGBDFree(h); return 0; } } } if (!cmsGDBCompute(h, 0)) return 0; // cmsGBDdumpVRML(h, "c:\\colormaps\\lab.wrl"); for (r1=10; r1 < 200; r1 += 10) { for (g1=10; g1 < 200; g1 += 10) for (b1=10; b1 < 200; b1 += 10) { cmsUInt8Number rgb[3]; rgb[0] = (cmsUInt8Number) r1; rgb[1] = (cmsUInt8Number) g1; rgb[2] = (cmsUInt8Number) b1; cmsDoTransform(xform, rgb, &Lab, 1); if (!cmsGDBCheckPoint(h, &Lab)) { cmsDeleteTransform(xform); cmsGBDFree(h); return 0; } } } cmsDeleteTransform(xform); cmsGBDFree(h); SubTest("checking LCh chroma ring"); h = cmsGBDAlloc(DbgThread()); for (r1=0; r1 < 360; r1++) { cmsCIELCh LCh; LCh.L = 70; LCh.C = 60; LCh.h = r1; cmsLCh2Lab(&Lab, &LCh); if (!cmsGDBAddPoint(h, &Lab)) { cmsGBDFree(h); return 0; } } if (!cmsGDBCompute(h, 0)) return 0; cmsGBDFree(h); return 1; } static int CheckMD5(void) { _cmsICCPROFILE* h; cmsHPROFILE pProfile = cmsOpenProfileFromFile("sRGBlcms2.icc", "r"); cmsProfileID ProfileID1, ProfileID2, ProfileID3, ProfileID4; h =(_cmsICCPROFILE*) pProfile; if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile, ProfileID1.ID8); if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile,ProfileID2.ID8); cmsCloseProfile(pProfile); pProfile = cmsOpenProfileFromFile("sRGBlcms2.icc", "r"); h =(_cmsICCPROFILE*) pProfile; if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile, ProfileID3.ID8); if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile,ProfileID4.ID8); cmsCloseProfile(pProfile); return ((memcmp(ProfileID1.ID8, ProfileID3.ID8, sizeof(ProfileID1)) == 0) && (memcmp(ProfileID2.ID8, ProfileID4.ID8, sizeof(ProfileID2)) == 0)); } static int CheckLinking(void) { cmsHPROFILE h; cmsPipeline * pipeline; cmsStage *stageBegin, *stageEnd; // Create a CLUT based profile h = cmsCreateInkLimitingDeviceLinkTHR(DbgThread(), cmsSigCmykData, 150); // link a second tag cmsLinkTag(h, cmsSigAToB1Tag, cmsSigAToB0Tag); // Save the linked devicelink if (!cmsSaveProfileToFile(h, "lcms2link.icc")) return 0; cmsCloseProfile(h); // Now open the profile and read the pipeline h = cmsOpenProfileFromFile("lcms2link.icc", "r"); if (h == NULL) return 0; pipeline = (cmsPipeline*) cmsReadTag(h, cmsSigAToB1Tag); if (pipeline == NULL) { return 0; } pipeline = cmsPipelineDup(pipeline); // extract stage from pipe line cmsPipelineUnlinkStage(pipeline, cmsAT_BEGIN, &stageBegin); cmsPipelineUnlinkStage(pipeline, cmsAT_END, &stageEnd); cmsPipelineInsertStage(pipeline, cmsAT_END, stageEnd); cmsPipelineInsertStage(pipeline, cmsAT_BEGIN, stageBegin); if (cmsTagLinkedTo(h, cmsSigAToB1Tag) != cmsSigAToB0Tag) return 0; cmsWriteTag(h, cmsSigAToB0Tag, pipeline); cmsPipelineFree(pipeline); if (!cmsSaveProfileToFile(h, "lcms2link2.icc")) return 0; cmsCloseProfile(h); return 1; } // TestMPE // // Created by Paul Miller on 30/08/2012. // static cmsHPROFILE IdentityMatrixProfile( cmsColorSpaceSignature dataSpace) { cmsContext ctx = 0; cmsVEC3 zero = {{0,0,0}}; cmsMAT3 identity; cmsPipeline* forward; cmsPipeline* reverse; cmsHPROFILE identityProfile = cmsCreateProfilePlaceholder( ctx); cmsSetProfileVersion(identityProfile, 4.3); cmsSetDeviceClass( identityProfile, cmsSigColorSpaceClass); cmsSetColorSpace(identityProfile, dataSpace); cmsSetPCS(identityProfile, cmsSigXYZData); cmsSetHeaderRenderingIntent(identityProfile, INTENT_RELATIVE_COLORIMETRIC); cmsWriteTag(identityProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ()); _cmsMAT3identity( &identity); // build forward transform.... (RGB to PCS) forward = cmsPipelineAlloc( 0, 3, 3); cmsPipelineInsertStage( forward, cmsAT_END, cmsStageAllocMatrix( ctx, 3, 3, (cmsFloat64Number*)&identity, (cmsFloat64Number*)&zero)); cmsWriteTag( identityProfile, cmsSigDToB1Tag, forward); cmsPipelineFree( forward); reverse = cmsPipelineAlloc( 0, 3, 3); cmsPipelineInsertStage( reverse, cmsAT_END, cmsStageAllocMatrix( ctx, 3, 3, (cmsFloat64Number*)&identity, (cmsFloat64Number*)&zero)); cmsWriteTag( identityProfile, cmsSigBToD1Tag, reverse); cmsPipelineFree( reverse); return identityProfile; } static cmsInt32Number CheckFloatXYZ(void) { cmsHPROFILE input; cmsHPROFILE xyzProfile = cmsCreateXYZProfile(); cmsHTRANSFORM xform; cmsFloat32Number in[3]; cmsFloat32Number out[3]; in[0] = 1.0; in[1] = 1.0; in[2] = 1.0; // RGB to XYZ input = IdentityMatrixProfile( cmsSigRgbData); xform = cmsCreateTransform( input, TYPE_RGB_FLT, xyzProfile, TYPE_XYZ_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(input); cmsDoTransform( xform, in, out, 1); cmsDeleteTransform( xform); if (!IsGoodVal("Float RGB->XYZ", in[0], out[0], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->XYZ", in[1], out[1], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->XYZ", in[2], out[2], FLOAT_PRECISSION)) return 0; // XYZ to XYZ input = IdentityMatrixProfile( cmsSigXYZData); xform = cmsCreateTransform( input, TYPE_XYZ_FLT, xyzProfile, TYPE_XYZ_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(input); cmsDoTransform( xform, in, out, 1); cmsDeleteTransform( xform); if (!IsGoodVal("Float XYZ->XYZ", in[0], out[0], FLOAT_PRECISSION) || !IsGoodVal("Float XYZ->XYZ", in[1], out[1], FLOAT_PRECISSION) || !IsGoodVal("Float XYZ->XYZ", in[2], out[2], FLOAT_PRECISSION)) return 0; // XYZ to RGB input = IdentityMatrixProfile( cmsSigRgbData); xform = cmsCreateTransform( xyzProfile, TYPE_XYZ_FLT, input, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(input); cmsDoTransform( xform, in, out, 1); cmsDeleteTransform( xform); if (!IsGoodVal("Float XYZ->RGB", in[0], out[0], FLOAT_PRECISSION) || !IsGoodVal("Float XYZ->RGB", in[1], out[1], FLOAT_PRECISSION) || !IsGoodVal("Float XYZ->RGB", in[2], out[2], FLOAT_PRECISSION)) return 0; // Now the optimizer should remove a stage // XYZ to RGB input = IdentityMatrixProfile( cmsSigRgbData); xform = cmsCreateTransform( input, TYPE_RGB_FLT, input, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); cmsCloseProfile(input); cmsDoTransform( xform, in, out, 1); cmsDeleteTransform( xform); if (!IsGoodVal("Float RGB->RGB", in[0], out[0], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->RGB", in[1], out[1], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->RGB", in[2], out[2], FLOAT_PRECISSION)) return 0; cmsCloseProfile(xyzProfile); return 1; } /* Bug reported 1) sRGB built-in V4.3 -> Lab identity built-in V4.3 Flags: "cmsFLAGS_NOCACHE", "cmsFLAGS_NOOPTIMIZE" Input format: TYPE_RGBA_FLT Output format: TYPE_LabA_FLT 2) and back Lab identity built-in V4.3 -> sRGB built-in V4.3 Flags: "cmsFLAGS_NOCACHE", "cmsFLAGS_NOOPTIMIZE" Input format: TYPE_LabA_FLT Output format: TYPE_RGBA_FLT */ static cmsInt32Number ChecksRGB2LabFLT(void) { cmsHPROFILE hSRGB = cmsCreate_sRGBProfile(); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHTRANSFORM xform1 = cmsCreateTransform(hSRGB, TYPE_RGBA_FLT, hLab, TYPE_LabA_FLT, 0, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); cmsHTRANSFORM xform2 = cmsCreateTransform(hLab, TYPE_LabA_FLT, hSRGB, TYPE_RGBA_FLT, 0, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); cmsFloat32Number RGBA1[4], RGBA2[4], LabA[4]; int i; for (i = 0; i <= 100; i++) { RGBA1[0] = i / 100.0F; RGBA1[1] = i / 100.0F; RGBA1[2] = i / 100.0F; RGBA1[3] = 0; cmsDoTransform(xform1, RGBA1, LabA, 1); cmsDoTransform(xform2, LabA, RGBA2, 1); if (!IsGoodVal("Float RGB->RGB", RGBA1[0], RGBA2[0], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->RGB", RGBA1[1], RGBA2[1], FLOAT_PRECISSION) || !IsGoodVal("Float RGB->RGB", RGBA1[2], RGBA2[2], FLOAT_PRECISSION)) return 0; } cmsDeleteTransform(xform1); cmsDeleteTransform(xform2); cmsCloseProfile(hSRGB); cmsCloseProfile(hLab); return 1; } /* * parametric curve for Rec709 */ static double Rec709(double L) { if (L <0.018) return 4.5*L; else { double a = 1.099* pow(L, 0.45); a = a - 0.099; return a; } } static cmsInt32Number CheckParametricRec709(void) { cmsFloat64Number params[7]; cmsToneCurve* t; int i; params[0] = 0.45; /* y */ params[1] = pow(1.099, 1.0 / 0.45); /* a */ params[2] = 0.0; /* b */ params[3] = 4.5; /* c */ params[4] = 0.018; /* d */ params[5] = -0.099; /* e */ params[6] = 0.0; /* f */ t = cmsBuildParametricToneCurve (NULL, 5, params); for (i=0; i < 256; i++) { cmsFloat32Number n = (cmsFloat32Number) i / 255.0F; cmsUInt16Number f1 = (cmsUInt16Number) floor(255.0 * cmsEvalToneCurveFloat(t, n) + 0.5); cmsUInt16Number f2 = (cmsUInt16Number) floor(255.0*Rec709((double) i / 255.0) + 0.5); if (f1 != f2) { cmsFreeToneCurve(t); return 0; } } cmsFreeToneCurve(t); return 1; } #define kNumPoints 10 typedef cmsFloat32Number(*Function)(cmsFloat32Number x); static cmsFloat32Number StraightLine( cmsFloat32Number x) { return (cmsFloat32Number) (0.1 + 0.9 * x); } static cmsInt32Number TestCurve( const char* label, cmsToneCurve* curve, Function fn) { cmsInt32Number ok = 1; int i; for (i = 0; i < kNumPoints*3; i++) { cmsFloat32Number x = (cmsFloat32Number)i / (kNumPoints*3 - 1); cmsFloat32Number expectedY = fn(x); cmsFloat32Number out = cmsEvalToneCurveFloat( curve, x); if (!IsGoodVal(label, expectedY, out, FLOAT_PRECISSION)) { ok = 0; } } return ok; } static cmsInt32Number CheckFloatSamples(void) { cmsFloat32Number y[kNumPoints]; int i; cmsToneCurve *curve; cmsInt32Number ok; for (i = 0; i < kNumPoints; i++) { cmsFloat32Number x = (cmsFloat32Number)i / (kNumPoints-1); y[i] = StraightLine(x); } curve = cmsBuildTabulatedToneCurveFloat(NULL, kNumPoints, y); ok = TestCurve( "Float Samples", curve, StraightLine); cmsFreeToneCurve(curve); return ok; } static cmsInt32Number CheckFloatSegments(void) { cmsInt32Number ok = 1; int i; cmsToneCurve *curve; cmsFloat32Number y[ kNumPoints]; // build a segmented curve with a sampled section... cmsCurveSegment Seg[3]; // Initialize segmented curve part up to 0.1 Seg[0].x0 = -1e22f; // -infinity Seg[0].x1 = 0.1f; Seg[0].Type = 6; // Y = (a * X + b) ^ Gamma + c Seg[0].Params[0] = 1.0f; // gamma Seg[0].Params[1] = 0.9f; // a Seg[0].Params[2] = 0.0f; // b Seg[0].Params[3] = 0.1f; // c Seg[0].Params[4] = 0.0f; // From zero to 1 Seg[1].x0 = 0.1f; Seg[1].x1 = 0.9f; Seg[1].Type = 0; Seg[1].nGridPoints = kNumPoints; Seg[1].SampledPoints = y; for (i = 0; i < kNumPoints; i++) { cmsFloat32Number x = (cmsFloat32Number) (0.1 + ((cmsFloat32Number)i / (kNumPoints-1)) * (0.9 - 0.1)); y[i] = StraightLine(x); } // from 1 to +infinity Seg[2].x0 = 0.9f; Seg[2].x1 = 1e22f; // +infinity Seg[2].Type = 6; Seg[2].Params[0] = 1.0f; Seg[2].Params[1] = 0.9f; Seg[2].Params[2] = 0.0f; Seg[2].Params[3] = 0.1f; Seg[2].Params[4] = 0.0f; curve = cmsBuildSegmentedToneCurve(0, 3, Seg); ok = TestCurve( "Float Segmented Curve", curve, StraightLine); cmsFreeToneCurve( curve); return ok; } static cmsInt32Number CheckReadRAW(void) { cmsInt32Number tag_size, tag_size1; char buffer[4]; cmsHPROFILE hProfile; SubTest("RAW read on on-disk"); hProfile = cmsOpenProfileFromFile("test1.icc", "r"); if (hProfile == NULL) return 0; tag_size = cmsReadRawTag(hProfile, cmsSigGamutTag, buffer, 4); tag_size1 = cmsReadRawTag(hProfile, cmsSigGamutTag, NULL, 0); cmsCloseProfile(hProfile); if (tag_size != 4) return 0; if (tag_size1 != 37009) return 0; SubTest("RAW read on in-memory created profiles"); hProfile = cmsCreate_sRGBProfile(); tag_size = cmsReadRawTag(hProfile, cmsSigGreenColorantTag, buffer, 4); tag_size1 = cmsReadRawTag(hProfile, cmsSigGreenColorantTag, NULL, 0); cmsCloseProfile(hProfile); if (tag_size != 4) return 0; if (tag_size1 != 20) return 0; return 1; } static cmsInt32Number CheckMeta(void) { char *data; cmsHANDLE dict; cmsHPROFILE p; cmsUInt32Number clen; FILE *fp; int rc; /* open file */ p = cmsOpenProfileFromFile("ibm-t61.icc", "r"); if (p == NULL) return 0; /* read dictionary, but don't do anything with the value */ //COMMENT OUT THE NEXT TWO LINES AND IT WORKS FINE!!! dict = cmsReadTag(p, cmsSigMetaTag); if (dict == NULL) return 0; /* serialize profile to memory */ rc = cmsSaveProfileToMem(p, NULL, &clen); if (!rc) return 0; data = (char*) malloc(clen); rc = cmsSaveProfileToMem(p, data, &clen); if (!rc) return 0; /* write the memory blob to a file */ //NOTE: The crash does not happen if cmsSaveProfileToFile() is used */ fp = fopen("new.icc", "wb"); fwrite(data, 1, clen, fp); fclose(fp); free(data); cmsCloseProfile(p); /* open newly created file and read metadata */ p = cmsOpenProfileFromFile("new.icc", "r"); //ERROR: Bad dictionary Name/Value //ERROR: Corrupted tag 'meta' //test: test.c:59: main: Assertion `dict' failed. dict = cmsReadTag(p, cmsSigMetaTag); if (dict == NULL) return 0; cmsCloseProfile(p); return 1; } // Bug on applying null transforms on floating point buffers static cmsInt32Number CheckFloatNULLxform(void) { int i; cmsFloat32Number in[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; cmsFloat32Number out[10]; cmsHTRANSFORM xform = cmsCreateTransform(NULL, TYPE_GRAY_FLT, NULL, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, cmsFLAGS_NULLTRANSFORM); if (xform == NULL) { Fail("Unable to create float null transform"); return 0; } cmsDoTransform(xform, in, out, 10); cmsDeleteTransform(xform); for (i=0; i < 10; i++) { if (!IsGoodVal("float nullxform", in[i], out[i], 0.001)) { return 0; } } return 1; } static cmsInt32Number CheckRemoveTag(void) { cmsHPROFILE p; cmsMLU *mlu; int ret; p = cmsCreate_sRGBProfileTHR(NULL); /* set value */ mlu = cmsMLUalloc (NULL, 1); ret = cmsMLUsetASCII (mlu, "en", "US", "bar"); if (!ret) return 0; ret = cmsWriteTag (p, cmsSigDeviceMfgDescTag, mlu); if (!ret) return 0; cmsMLUfree (mlu); /* remove the tag */ ret = cmsWriteTag (p, cmsSigDeviceMfgDescTag, NULL); if (!ret) return 0; /* THIS EXPLODES */ cmsCloseProfile(p); return 1; } // -------------------------------------------------------------------------------------------------- // P E R F O R M A N C E C H E C K S // -------------------------------------------------------------------------------------------------- typedef struct {cmsUInt8Number r, g, b, a;} Scanline_rgb1; typedef struct {cmsUInt16Number r, g, b, a;} Scanline_rgb2; typedef struct {cmsUInt8Number r, g, b;} Scanline_rgb8; typedef struct {cmsUInt16Number r, g, b;} Scanline_rgb0; static void TitlePerformance(const char* Txt) { printf("%-45s: ", Txt); fflush(stdout); } static void PrintPerformance(cmsUInt32Number Bytes, cmsUInt32Number SizeOfPixel, cmsFloat64Number diff) { cmsFloat64Number seconds = (cmsFloat64Number) diff / CLOCKS_PER_SEC; cmsFloat64Number mpix_sec = Bytes / (1024.0*1024.0*seconds*SizeOfPixel); printf("%g MPixel/sec.\n", mpix_sec); fflush(stdout); } static void SpeedTest16bits(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgb0 *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_RGB_16, hlcmsProfileOut, TYPE_RGB_16, Intent, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256*256*256*sizeof(Scanline_rgb0); In = (Scanline_rgb0*) malloc(Mb); j = 0; for (r=0; r < 256; r++) for (g=0; g < 256; g++) for (b=0; b < 256; b++) { In[j].r = (cmsUInt16Number) ((r << 8) | r); In[j].g = (cmsUInt16Number) ((g << 8) | g); In[j].b = (cmsUInt16Number) ((b << 8) | b); j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256*256*256); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(Scanline_rgb0), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest16bitsCMYK(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgb2 *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_CMYK_16, hlcmsProfileOut, TYPE_CMYK_16, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256*256*256*sizeof(Scanline_rgb2); In = (Scanline_rgb2*) malloc(Mb); j = 0; for (r=0; r < 256; r++) for (g=0; g < 256; g++) for (b=0; b < 256; b++) { In[j].r = (cmsUInt16Number) ((r << 8) | r); In[j].g = (cmsUInt16Number) ((g << 8) | g); In[j].b = (cmsUInt16Number) ((b << 8) | b); In[j].a = 0; j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256*256*256); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(Scanline_rgb2), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest8bits(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgb8 *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_RGB_8, hlcmsProfileOut, TYPE_RGB_8, Intent, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256*256*256*sizeof(Scanline_rgb8); In = (Scanline_rgb8*) malloc(Mb); j = 0; for (r=0; r < 256; r++) for (g=0; g < 256; g++) for (b=0; b < 256; b++) { In[j].r = (cmsUInt8Number) r; In[j].g = (cmsUInt8Number) g; In[j].b = (cmsUInt8Number) b; j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256*256*256); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(Scanline_rgb8), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest8bitsCMYK(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; Scanline_rgb2 *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_CMYK_8, hlcmsProfileOut, TYPE_CMYK_8, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256*256*256*sizeof(Scanline_rgb2); In = (Scanline_rgb2*) malloc(Mb); j = 0; for (r=0; r < 256; r++) for (g=0; g < 256; g++) for (b=0; b < 256; b++) { In[j].r = (cmsUInt8Number) r; In[j].g = (cmsUInt8Number) g; In[j].b = (cmsUInt8Number) b; In[j].a = (cmsUInt8Number) 0; j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256*256*256); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(Scanline_rgb2), diff); cmsDeleteTransform(hlcmsxform); } static void SpeedTest8bitsGray(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) { cmsInt32Number r, g, b, j; clock_t atime; cmsFloat64Number diff; cmsHTRANSFORM hlcmsxform; cmsUInt8Number *In; cmsUInt32Number Mb; if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) Die("Unable to open profiles"); hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_GRAY_8, hlcmsProfileOut, TYPE_GRAY_8, Intent, cmsFLAGS_NOCACHE); cmsCloseProfile(hlcmsProfileIn); cmsCloseProfile(hlcmsProfileOut); Mb = 256*256*256; In = (cmsUInt8Number*) malloc(Mb); j = 0; for (r=0; r < 256; r++) for (g=0; g < 256; g++) for (b=0; b < 256; b++) { In[j] = (cmsUInt8Number) r; j++; } TitlePerformance(Title); atime = clock(); cmsDoTransform(hlcmsxform, In, In, 256*256*256); diff = clock() - atime; free(In); PrintPerformance(Mb, sizeof(cmsUInt8Number), diff); cmsDeleteTransform(hlcmsxform); } static cmsHPROFILE CreateCurves(void) { cmsToneCurve* Gamma = cmsBuildGamma(DbgThread(), 1.1); cmsToneCurve* Transfer[3]; cmsHPROFILE h; Transfer[0] = Transfer[1] = Transfer[2] = Gamma; h = cmsCreateLinearizationDeviceLink(cmsSigRgbData, Transfer); cmsFreeToneCurve(Gamma); return h; } static void SpeedTest(void) { printf("\n\nP E R F O R M A N C E T E S T S\n"); printf( "=================================\n\n"); fflush(stdout); SpeedTest16bits("16 bits on CLUT profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("test3.icc", "r"), INTENT_PERCEPTUAL); SpeedTest8bits("8 bits on CLUT profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("test3.icc", "r"), INTENT_PERCEPTUAL); SpeedTest8bits("8 bits on Matrix-Shaper profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_PERCEPTUAL); SpeedTest8bits("8 bits on SAME Matrix-Shaper profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("test5.icc", "r"), INTENT_PERCEPTUAL); SpeedTest8bits("8 bits on Matrix-Shaper profiles (AbsCol)", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_ABSOLUTE_COLORIMETRIC); SpeedTest16bits("16 bits on Matrix-Shaper profiles", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_PERCEPTUAL); SpeedTest16bits("16 bits on SAME Matrix-Shaper profiles", cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_PERCEPTUAL); SpeedTest16bits("16 bits on Matrix-Shaper profiles (AbsCol)", cmsOpenProfileFromFile("test5.icc", "r"), cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), INTENT_ABSOLUTE_COLORIMETRIC); SpeedTest8bits("8 bits on curves", CreateCurves(), CreateCurves(), INTENT_PERCEPTUAL); SpeedTest16bits("16 bits on curves", CreateCurves(), CreateCurves(), INTENT_PERCEPTUAL); SpeedTest8bitsCMYK("8 bits on CMYK profiles", cmsOpenProfileFromFile("test1.icc", "r"), cmsOpenProfileFromFile("test2.icc", "r")); SpeedTest16bitsCMYK("16 bits on CMYK profiles", cmsOpenProfileFromFile("test1.icc", "r"), cmsOpenProfileFromFile("test2.icc", "r")); SpeedTest8bitsGray("8 bits on gray-to gray", cmsOpenProfileFromFile("gray3lcms2.icc", "r"), cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); SpeedTest8bitsGray("8 bits on gray-to-lab gray", cmsOpenProfileFromFile("graylcms2.icc", "r"), cmsOpenProfileFromFile("glablcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); SpeedTest8bitsGray("8 bits on SAME gray-to-gray", cmsOpenProfileFromFile("graylcms2.icc", "r"), cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_PERCEPTUAL); } // ----------------------------------------------------------------------------------------------------- // Print the supported intents static void PrintSupportedIntents(void) { cmsUInt32Number n, i; cmsUInt32Number Codes[200]; char* Descriptions[200]; n = cmsGetSupportedIntents(200, Codes, Descriptions); printf("Supported intents:\n"); for (i=0; i < n; i++) { printf("\t%u - %s\n", Codes[i], Descriptions[i]); } printf("\n"); } // --------------------------------------------------------------------------------------- #ifdef LCMS_FAST_EXTENSIONS void* cmsFast8Bitextensions(void); #endif int main(int argc, char* argv[]) { cmsInt32Number Exhaustive = 0; cmsInt32Number DoSpeedTests = 1; cmsInt32Number DoCheckTests = 1; cmsInt32Number DoPluginTests = 1; cmsInt32Number DoZooTests = 0; #ifdef _MSC_VER _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); #endif printf("LittleCMS %2.2f test bed %s %s\n\n", LCMS_VERSION / 1000.0, __DATE__, __TIME__); if ((argc == 2) && strcmp(argv[1], "--exhaustive") == 0) { Exhaustive = 1; printf("Running exhaustive tests (will take a while...)\n\n"); } #ifdef LCMS_FAST_EXTENSIONS printf("Installing fast 8 bit extension ..."); cmsPlugin(cmsFast8Bitextensions()); printf("done.\n"); #endif printf("Installing debug memory plug-in ... "); cmsPlugin(&DebugMemHandler); printf("done.\n"); printf("Installing error logger ... "); cmsSetLogErrorHandler(FatalErrorQuit); printf("done.\n"); PrintSupportedIntents(); Check("Base types", CheckBaseTypes); Check("endianess", CheckEndianess); Check("quick floor", CheckQuickFloor); Check("quick floor word", CheckQuickFloorWord); Check("Fixed point 15.16 representation", CheckFixedPoint15_16); Check("Fixed point 8.8 representation", CheckFixedPoint8_8); Check("D50 roundtrip", CheckD50Roundtrip); // Create utility profiles if (DoCheckTests || DoSpeedTests) Check("Creation of test profiles", CreateTestProfiles); if (DoCheckTests) { // Forward 1D interpolation Check("1D interpolation in 2pt tables", Check1DLERP2); Check("1D interpolation in 3pt tables", Check1DLERP3); Check("1D interpolation in 4pt tables", Check1DLERP4); Check("1D interpolation in 6pt tables", Check1DLERP6); Check("1D interpolation in 18pt tables", Check1DLERP18); Check("1D interpolation in descending 2pt tables", Check1DLERP2Down); Check("1D interpolation in descending 3pt tables", Check1DLERP3Down); Check("1D interpolation in descending 6pt tables", Check1DLERP6Down); Check("1D interpolation in descending 18pt tables", Check1DLERP18Down); if (Exhaustive) { Check("1D interpolation in n tables", ExhaustiveCheck1DLERP); Check("1D interpolation in descending tables", ExhaustiveCheck1DLERPDown); } // Forward 3D interpolation Check("3D interpolation Tetrahedral (float) ", Check3DinterpolationFloatTetrahedral); Check("3D interpolation Trilinear (float) ", Check3DinterpolationFloatTrilinear); Check("3D interpolation Tetrahedral (16) ", Check3DinterpolationTetrahedral16); Check("3D interpolation Trilinear (16) ", Check3DinterpolationTrilinear16); if (Exhaustive) { Check("Exhaustive 3D interpolation Tetrahedral (float) ", ExaustiveCheck3DinterpolationFloatTetrahedral); Check("Exhaustive 3D interpolation Trilinear (float) ", ExaustiveCheck3DinterpolationFloatTrilinear); Check("Exhaustive 3D interpolation Tetrahedral (16) ", ExhaustiveCheck3DinterpolationTetrahedral16); Check("Exhaustive 3D interpolation Trilinear (16) ", ExhaustiveCheck3DinterpolationTrilinear16); } Check("Reverse interpolation 3 -> 3", CheckReverseInterpolation3x3); Check("Reverse interpolation 4 -> 3", CheckReverseInterpolation4x3); // High dimensionality interpolation Check("3D interpolation", Check3Dinterp); Check("3D interpolation with granularity", Check3DinterpGranular); Check("4D interpolation", Check4Dinterp); Check("4D interpolation with granularity", Check4DinterpGranular); Check("5D interpolation with granularity", Check5DinterpGranular); Check("6D interpolation with granularity", Check6DinterpGranular); Check("7D interpolation with granularity", Check7DinterpGranular); Check("8D interpolation with granularity", Check8DinterpGranular); // Encoding of colorspaces Check("Lab to LCh and back (float only) ", CheckLab2LCh); Check("Lab to XYZ and back (float only) ", CheckLab2XYZ); Check("Lab to xyY and back (float only) ", CheckLab2xyY); Check("Lab V2 encoding", CheckLabV2encoding); Check("Lab V4 encoding", CheckLabV4encoding); // BlackBody Check("Blackbody radiator", CheckTemp2CHRM); // Tone curves Check("Linear gamma curves (16 bits)", CheckGammaCreation16); Check("Linear gamma curves (float)", CheckGammaCreationFlt); Check("Curve 1.8 (float)", CheckGamma18); Check("Curve 2.2 (float)", CheckGamma22); Check("Curve 3.0 (float)", CheckGamma30); Check("Curve 1.8 (table)", CheckGamma18Table); Check("Curve 2.2 (table)", CheckGamma22Table); Check("Curve 3.0 (table)", CheckGamma30Table); Check("Curve 1.8 (word table)", CheckGamma18TableWord); Check("Curve 2.2 (word table)", CheckGamma22TableWord); Check("Curve 3.0 (word table)", CheckGamma30TableWord); Check("Parametric curves", CheckParametricToneCurves); Check("Join curves", CheckJointCurves); Check("Join curves descending", CheckJointCurvesDescending); Check("Join curves degenerated", CheckReverseDegenerated); Check("Join curves sRGB (Float)", CheckJointFloatCurves_sRGB); Check("Join curves sRGB (16 bits)", CheckJoint16Curves_sRGB); Check("Join curves sigmoidal", CheckJointCurvesSShaped); // LUT basics Check("LUT creation & dup", CheckLUTcreation); Check("1 Stage LUT ", Check1StageLUT); Check("2 Stage LUT ", Check2StageLUT); Check("2 Stage LUT (16 bits)", Check2Stage16LUT); Check("3 Stage LUT ", Check3StageLUT); Check("3 Stage LUT (16 bits)", Check3Stage16LUT); Check("4 Stage LUT ", Check4StageLUT); Check("4 Stage LUT (16 bits)", Check4Stage16LUT); Check("5 Stage LUT ", Check5StageLUT); Check("5 Stage LUT (16 bits) ", Check5Stage16LUT); Check("6 Stage LUT ", Check6StageLUT); Check("6 Stage LUT (16 bits) ", Check6Stage16LUT); // LUT operation Check("Lab to Lab LUT (float only) ", CheckLab2LabLUT); Check("XYZ to XYZ LUT (float only) ", CheckXYZ2XYZLUT); Check("Lab to Lab MAT LUT (float only) ", CheckLab2LabMatLUT); Check("Named Color LUT", CheckNamedColorLUT); Check("Usual formatters", CheckFormatters16); Check("Floating point formatters", CheckFormattersFloat); #ifndef CMS_NO_HALF_SUPPORT Check("HALF formatters", CheckFormattersHalf); #endif // ChangeBuffersFormat Check("ChangeBuffersFormat", CheckChangeBufferFormat); // MLU Check("Multilocalized Unicode", CheckMLU); // Named color Check("Named color lists", CheckNamedColorList); // Profile I/O (this one is huge!) Check("Profile creation", CheckProfileCreation); Check("Header version", CheckVersionHeaderWriting); // Error reporting Check("Error reporting on bad profiles", CheckErrReportingOnBadProfiles); Check("Error reporting on bad transforms", CheckErrReportingOnBadTransforms); // Transforms Check("Curves only transforms", CheckCurvesOnlyTransforms); Check("Float Lab->Lab transforms", CheckFloatLabTransforms); Check("Encoded Lab->Lab transforms", CheckEncodedLabTransforms); Check("Stored identities", CheckStoredIdentities); Check("Matrix-shaper transform (float)", CheckMatrixShaperXFORMFloat); Check("Matrix-shaper transform (16 bits)", CheckMatrixShaperXFORM16); Check("Matrix-shaper transform (8 bits)", CheckMatrixShaperXFORM8); Check("Primaries of sRGB", CheckRGBPrimaries); // Known values Check("Known values across matrix-shaper", Chack_sRGB_Float); Check("Gray input profile", CheckInputGray); Check("Gray Lab input profile", CheckLabInputGray); Check("Gray output profile", CheckOutputGray); Check("Gray Lab output profile", CheckLabOutputGray); Check("Matrix-shaper proofing transform (float)", CheckProofingXFORMFloat); Check("Matrix-shaper proofing transform (16 bits)", CheckProofingXFORM16); Check("Gamut check", CheckGamutCheck); Check("CMYK roundtrip on perceptual transform", CheckCMYKRoundtrip); Check("CMYK perceptual transform", CheckCMYKPerceptual); // Check("CMYK rel.col. transform", CheckCMYKRelCol); Check("Black ink only preservation", CheckKOnlyBlackPreserving); Check("Black plane preservation", CheckKPlaneBlackPreserving); Check("Deciding curve types", CheckV4gamma); Check("Black point detection", CheckBlackPoint); Check("TAC detection", CheckTAC); Check("CGATS parser", CheckCGATS); Check("PostScript generator", CheckPostScript); Check("Segment maxima GBD", CheckGBD); Check("MD5 digest", CheckMD5); Check("Linking", CheckLinking); Check("floating point tags on XYZ", CheckFloatXYZ); Check("RGB->Lab->RGB with alpha on FLT", ChecksRGB2LabFLT); Check("Parametric curve on Rec709", CheckParametricRec709); Check("Floating Point sampled curve with non-zero start", CheckFloatSamples); Check("Floating Point segmented curve with short sampled segement", CheckFloatSegments); Check("Read RAW portions", CheckReadRAW); Check("Check MetaTag", CheckMeta); Check("Null transform on floats", CheckFloatNULLxform); Check("Set free a tag", CheckRemoveTag); } if (DoPluginTests) { #ifndef CMS_CONTEXT_IN_LEGACY_MODE Check("Context memory handling", CheckAllocContext); Check("Simple context functionality", CheckSimpleContext); Check("Alarm codes context", CheckAlarmColorsContext); Check("Adaptation state context", CheckAdaptationStateContext); Check("1D interpolation plugin", CheckInterp1DPlugin); Check("3D interpolation plugin", CheckInterp3DPlugin); Check("Parametric curve plugin", CheckParametricCurvePlugin); Check("Formatters plugin", CheckFormattersPlugin); Check("Tag type plugin", CheckTagTypePlugin); Check("MPE type plugin", CheckMPEPlugin); Check("Optimization plugin", CheckOptimizationPlugin); Check("Rendering intent plugin", CheckIntentPlugin); Check("Full transform plugin", CheckTransformPlugin); Check("Mutex plugin", CheckMutexPlugin); #endif } if (DoSpeedTests) SpeedTest(); if (DoZooTests) CheckProfileZOO(); DebugMemPrintTotals(); cmsUnregisterPlugins(); // Cleanup if (DoCheckTests || DoSpeedTests) RemoveTestProfiles(); return TotalFail; } lcms2-2.6/testbed/bad.icc0000644002406300000240000000046612311617072014574 0ustar mariamausersSHELL = /bin/sh CFLAGS = -g -O4 -fomit-frame-pointer -Wall -I../include testcms.o: testcms.c testcms: testcms.o ../src/liblcms.a $(CC) $(CFLAGS) testcms.o ../src/liblcms.a -o $@ -lm all: testcms test test: testcms ./testcms install: # Nothing to install clean: -rm testcms.o testcms testcms.exe lcms2-2.6/testbed/test2.icc0000755002406300000240000237624012311617072015122 0ustar mariamausers lcmsprtrCMYKLab 5acspMSFT-lcms desccprt#wtptA2B0,_fA2B2,_fA2B1a_fB2A08B2A18B2A22d8gamt kdmnd dmdd ,tdesc,Test profile, not suitable for real use-Test profile, not suitable for real usetextNot suitable for real useXYZ IÂmft2 -Ge % M u EtHHt !"$,%Z&'(*+E,s-.0132e345728]9:;=>;?i@ABD"EPFzGHIKLCMjNOPRS&TKUjVWXYZ\]*^F_b`abcdf g&hAi]jyklmnp q-rMsntuvwxy{ |"}9~Phʄ*AXoĐؑ.<=<:852/+'# ׮ϯǰo]K9'ǼȪɗʄp\H3ҵӒnI#تـT'ݘg5e0[%k&V7Yy.Pw/P^X"7Ni * Jl.[8^!"+#V$%&())*S+~,-/011a23467;8e9:;=>J?z@ABD!EGFlGHIKL$MGNjOPQRSUV5WRXoYZ[\^ _%`>aXbrcdefgij;k[l|mnoprst5uPvkwxyz|}"~Ca{˄8Rmӏ,9FR]hr{|wroljiijkmosvspmkihfeeeeeeeefeedb`]O?.ժ֏rS3ܟuJZ&Br,T t(=KT\ fnf>j#6Ld~  5RpAa / S!x"#$&'#(E)g*+,-/0>1`23457889]:;<=?@A:BUCqDEFGHJ K#L:MPNgO}PQRSTVWX3YDZU[f\x]^_`abdef5gKhcizjklmnpq0rLsituvwxz{2|O}l~Á6Rm֌2G\oəٚ $'+/38=BGMSZ`gnu|“ÚĢŪƬǧȢɜʖˏ̆}sgZL=+بٍqS4ߩS!K_!_Mt*Jf8T[:i&8Ng *@Vl $<T m!"#$%&().*E+\,s-./0124 5"687M8c9x:;<=>?A BC4DHE\FpGHIJKLMOPQ-R@SRTeUwVWXYZ[\^ _`.a@bRcdduefghijkmno"p3qCrTsdttuvwxyz{|},:IWftȍ֎ $0|7{̑|֩ڽ|}|u|YԢ|1|,.||/iG|=TN|A;|z3}ط}7u`|є|ɲ|OC|.za|f{Q{ר9&{pjx$N~~"dVfqth}^E2#TCG.c0ϽaĨ܄s>ӄ]LDq#߅f{s]jY dǂcA4QVBւ3mr!.\NDO$D텃_/ {͂S_ꏙTmpځG[~C$H4끃 \ ف~O0ׂ΀oZ1C$[$u:{s6Eƾǡ㵏Xo2ߚ풪vmlmY"|8A "(爂.jJ*֐=?~^vk[WC䓒?5pS%;|=FrG7碽|)\itU{S3='?~t >X ٝ$yRgG^SS~ӛe;~wV}rƂུ˜@47w%%n yې_3I-U kꞝ` JxCfbSP"<9كXܸ{Ĩ(٩J'vZڜd.Q:ƀNGؑא$W ΰ^|NڃxtblȞ>Od8D~ZՒt3YmلÂGaqhP~_v2L57 |ٍӟ%p|~?u"ҐQMo ]L+I;3-~Y{'|c|䏆}s}Ԍg~*~|щjV(L@*Մ!ڈfS؃Rʂˋ劁{SL ikPUՇ?b!፳5)*,5f61Fy戻h-Tdž߇>[!ЎbIc!sΌ\Ysx[%vfۇ$S@=񅨊!͏ӊmF8זɐvڇme.RK=J!}ېaџbj̜̋>͔bÈTtԇcQ.>;ÄGlʑY͐=m ⌢@ WrrayOR{90ɐn=fЌ{lҦ{݉iGpn;p_M 7ǂϕm+ܐ¼.h?Gĭu娼~]n+堓]u1KipU5#gyS˺N0?uغxD+{=SkZ„PH)2X~3g}aRyދ %PyG!1i@m\X_F=0(⠐|γ{!{|*E|}_x~'vQe׀TS =!?#ق۔trdӓL͎̄~uAĂkdcD#Q_< É7Ay3*7pՇˇ,c3sՌ;c! PމF;9 ɉ``,LёCZ[/)dErJa͊,O͈H;" JǗ7Ɖ󈲐(ӛs )]xwjt[.J~7ǑQ`O2o󟉘avh@UYh$.Hv5HX6d*O9~$Wt8_fsՔ_WfG3q AԞlH`=LTdrFdqpU9E\V1u6<j2$' ;~@9pcbKS^֛QC?/2@N4ƥjf_ѕW{2m_ƌ٣PK@m(,U}̱NSry-kݏ`]MNe5=̥)8 -czJJzH{L{[|~w}Wi~hZ\Iߐ5X\Ў06#4ϣBSdZ€xv hU8qYLuHΏb 51DOWݛsg~Sə-ta}fX(.GɎq4tщ@v"Ǣrћˉƀrψ\eVҐ"FŎ3ŒPMc51ў{/P~ygqfCjd|U>E΍wm3gp'{3P|oԐb6aSݏpDNQ1%8|f-աԝؔ qaę/zlm}`4RQ#Ba/ mϫsᤓ[졞x+k-^Q?P$@ыF-gT߯ I .vi\IpN7>x+KϚ tTF_fz-tQgZڥ@Y搼K;(fEQ ЇǦWȼ?dʚ³re\ĬWː ILg9jͥ=%Ǚ QkLZ7z!0z{ JM{||&p8}c~TȕE#1Ƒ ^ƪfǢznSaMSP-Dn1;UbuƄnUyTm$`qRoC _0drL) C>Tġwkbt_KQ0B/lE5/ǎf==v\6jҋQ]OsA&qR/*Bb=ì(ԕq`ztѐhSc][֖hNV?8-N3_lƢ\ϝZDL~v%r*fuY@L}=e+q0稲 *}EpJdĘ'X0MpJ˒dѕ,,GGτܑ:Pr|.hqكe7Y Lv=-q,rM'W0dDNzo=dTXF}KEW=y+vՐ&G\Ve yDn'bgVJRM<+΋g*㏁ȘIůҫwlD>aLLUCfH΍:ȓ?Y):`nyvcșIٗ"vvejء_MdScFۖd9Ǒ'{6 ߉Leﯿժt?~iHk]Q普E=7W% 뉣bwӥS~Nzs+g\xP"m7Cb5~#;u հn|ةDq6He¡Z kN KPA H2Ÿ| 8<PE{U݆JV`{ocdXSa L3/>`00r} .{lҺ{D{u {jI|7`|T~ G枰9P'wZ~. sOi^æ(S܀Fݝ8Κ&'j  ؽˆ츽9}[rͮ>huɂ]mR]%eEޝ38 [&U0E^,{q2g"\:†VQuoDŜ|K7DF&>cggڷz6KpGhOeƨZZ#OɟΉC͊:6݋&.j3Z|ylԐndRkYkNJJ.BFBz5@G$͓` ǏQXQxm?bݧWGL@ӑ3͒"ѓ3 S^I5=vڱUl9lal=VKF ?BUIG=(09 H |x~sX iBX^kSrqDgf\VpZK마?!-2"N څuT8|Ƅlr޻i<ƒ_kU_Jߦ;?S1 R!D 񕫈{Y(qXh%^`T'υI+>O1S/!~G ?NH*B3zp鹻go].R#UHxJU=ˊ=0a!AZ xeѓ y*oعAe[QG";Ѡ3/ /djxȖHnǸ㔋dóZP[#EƤD:jG.B,HL>ywsmbc1YO(D۔9P,ϗW,PvmldbX\pMxC7 *͚me݊XO4uVpfkP_a0V]LbdAw5w(|l4f~7Wt#qj'\`穖UNKT3@u.3%^t|' ]|{\|||};|e}}db~~!~~ډun_F}E;" {d {˃+|7|}A^X}ɃXn~\ntC~^>Ƅ!E>"ڃYz;zC{?{ω|lƙ}'}Rs$~J]BDj K#vy6ޗyɓ'zdϻ{{O!|Fх|jq}N\@~hxCd`#RYxdyxy&zA2z`{΄|=p|[H}ČwHӲx.4xа]y (ya y8{ zj%h>zޞS{K;{4zk5x=lx ]xy=ygyUx^z9ezQzŠ;8zx3xTy38y-Byg+yyڷvz Ccz9NzFw6yy$Mwڌ`z0͂~zɃ5{ׂ ||}Xk~,Epς/[YBmH!v;x́sdǁBR,S+]с%Co|"ZtBAC!"wř^ VFxSHhnjΆIYp1iA݇J!ҌH)GÍг&Y摌ފm Xi@ [!ł_~~i~ٖձ4~ߔ~m~x2kxWoߋ@Onp!ہ]~nϷ~k[@~d~e m~d~}||f~i~U9>ဂ~|͑~s~6~~<~z~*sg~VT~6<~Ӑ~,c~}K}ͨ}1}7w}Oe}ӘR?}:~?4}y ~a^F~(~}" } f}|ㆯ}h;u}^c}cP }g8}=r{׶~ʜ~k ~ }ָ8}l}N2r}#`}MP|5|upz]կt ~ ~^ܣz}{}}7Wj݄V?pqL QVڄKH^|М˄wH {ՃiuUg>M F0ؔ!SWӍ֪LŋkՃ\mzIhOʈT>Z <֚x]ז )$xĂWg$USa=^;m 3Ԏ %>jOЃVh.ǖ܂4/vɑe/Qpb;ہs%ҝĩ'#sGޟzAτŘtrQ%cP#̑9؀v|Ѳi(d;肖ϒBۂtbSrMaN_/Z7ΔdT~؏v(>3xR1*p ^LB5}*gwaȄҬpR}mu?o\@Iw`2~C4{ʋj ;Ȅ ცÜ<ڋ[ {tԲk/YUF~0l}zұDxrx7qy~Gzј!{ȉ'|x>}gF4S=xjJыUێL|–Q楢ˉi`WzwcTeRņdE6ۂ}J=Ɗ!o'ņ<{ԅ4l/\=UJr4聭uBO3 eOy3j\ОZ⛠HX$2+~IG PeƈǶMd)w'gуWt}Eu/(H}!UQʶ6Ɉxc 5te?WU"!C-Ym {∬wNx1ky 2zĎ{ |$r}`b[s~Pt:ʈ}E F~:~~~Ȝޏrsxcq{a ЁNĂ9.dÅ -'=Ҩ͐Wv5F*~pc_lj1M׈h9l\ߍ[>SH菰I:|u}.(n^nLo8IfE׎ٿ͓qQm鍟{l]K̊7{ޏ rϰ~Vpyw k[QUYJ%(59 s;3S`ߎnΓ)ƚU\wBhوYI˒ HN3g.2K6CBQގ:"Hru2/fχ/W^IFp1탙EGseَ-](zs CdC3U=՚Drc/ؘkKڻqV͌i~͊kppb%cRnA,ڂa ~^5`W_~{ӌt|Wlnw_񆩪PV=?2qJ*Kh <}?bvٙwwxFyzz{lÏ2|]~{KЌ 7pˌӹ}<9+}ږ}~Hd~ybvPkO[Ɍ3JZ6R¸ уv}@H]w׏փ!igZHI/5'b/Q՗ՉQ^~@ v-5'hbTY4H4ӉΈpKƛʎtÒS㐅6t\fጴW?Gz`E40|-S@+fPĒ>ސ rd*V$oE툿32]j5x^/f&O,} pv7bዴT+GD#0=%z󠹈Ñ{Ï^gn|P`DRMjBB],.ʕqM_Rc䧅ʑ^y%6llq^ӊP8@H ,B {}s۞ wu jҤ\dM=)h] d䇳KA(uzh fZ@P{Kg?; $&Ѓ> #~.BvuEwa)xYyyFz>sZ{`f?|Wh~PF3Db'|{|i}V}~~1r~dْVV(8E;2rچ 3͂ Ղny\rO}XrFpzcT􏔃Dߍ1S R#4o:ɛØv {φojSbDS놝CՌۇ0M7󏙩֝& ߋz 3mwˊY`jRgEBٌ3#0;o։pahYN%rAt x"kM^⍛PAW.֏DҍN%^l$Q*Jv%fmi\ŏrNҍ5?e,@|x0 9tJgZ M=܊s'*X Ʌ%RUȝҙ~ġr_(eˑHX뎱KV1;͉(U Mr۠ݝOIϙ|̨p8ϥcVmHe9 %pPϟև ܴzǖհnVAa~T1QFX6""ˆeSj㪄v}4wG[x{!xxByl8{ _|kQn~ B5~/cPT| ڦE|`5|j}(v/}ję?~Z^c[MPA+E.U7IvkmuFyi^]KOaH@--e騈Lʊ+QF~s݅gٗr[ N"g'?/ۇy,@{ "{9K}kr$?f[LIZCbLꑾ0>=. ,H/Ik*ۆW{Vp\Ɏ+d΍PXیKJ/x<Ǝ*vZy~yRXߗ4yɔTnrbnVpIz;^( FϧzƝكܛx5lș#`T GÐE9^@&o ɆՇK.ɤhݟšvybfj _&֛SwEԏ嘚7T *$bq?uή:ިti hg] FP̒Ck 4!mߖW~IrΜqg,ڪ[1NْO=AHU*2RU&Θ3&v܎Nwvxz1.xo̢dydzX||>Kg~<*5k{b|&B4|]x٥t|ne}8c72}W~Jy<)ߒTƁ 䬸𨂀wm a蝁9VkI~;)9ʼn.İ+Mɀ݅AvkI`zфUfHNG:.A(ۊM$Et|Hj_*aSSG$9M( %-PLܫ.}ڎs hy,]lBR2E 7&o` Iݯo}|qlfȞӑH[JUPWȏC䔓66k$~ɔ$ FZDěVzQ`ore4ZNhBD'4픾"([uՃqx4.nPK"cQ(XfL|@kϘP2 )zT) ˪רtw/֐4E(Ղl&77uWGjU`>uTIŦY< \9-ZOpX)wcxzQxpy1fjy\q}zQ|KD~!6Ҁ%;oK //=t|8]|]y6|oz|e}.[5}PU~CR6$u JOĀY%x[nPd~܀ZO4B5A+b$+ c `B|@vޮm kuc)$0X8LMYAܚͅ4r`# zo÷.u "kǩňa٥wWiL@ʚ3#; `}$}wtSj`J`bUK0g?^}2_!˓0 ӎZQؕ#|'r=hd^㤕;TdI =ʙ0Ǖxzozx,{iYqg3]~>R>H E7c~;00 |wf|nܷ|eг|\O}R}H̥~=/ܝǃsAӊ? (A1l*.v'mcdز?L[vEQ GŤp<4/1߅Ì ]T~uɻtl:JczZP?F߄_;7ۅ.k *u}tω4kSbŇYZBO9Er:=-ܛ+/:ɐ Ć}\sGj״az7XaN:D8t,ٗ,|F듹rْwi2`Gʐ%Vͪ(L{B7+,Ζ 0{(.q幍h1_)gU{KAa6%)~BϖgMzpǹ_g1]'TYFLJP͗?[4<#'ҙ/^̏rx߾OoSMf*P\R):H¥>@=2y$r%$ˌwwnUIIdܨ[_mQGh<á&S0"%\/qybvۢyw6zyg{5z,Z{{X||ph}u}q~R~\ cCف lwwfٛx3ykzz/@z{΀|apo}Z~BQ vזww3xVy1kzpz{Do7|ׅ"Y}ez*U{"Zm|X}*@~k 䀽ktQuxtv{!woxn ybGoz`l{^W|x@V}6 TsϢ tџuߜp.v֙wӖ֎xŔ]}VyjzVP{Í>|׌ ~[@sLt[.uwܭvjWw^njAxGzy6hzTt{B<{|Ls5<̏t'u"ҫsvv/wџJxxxfyRzb;{ mzېMsG]t#u%uٯovwbvyxNdSyPy(8z+'GycإsXtkL0u8uQv w^_sx MaxMy 6)yAcRwڌcֆt,Թt ujvv v'w>cqw̮_PxBK_x 3x\v֊Lu[Yvgx9"ygzb{ڀL}m%~[XTy@E6ՈY޲}}X~$~Z~P~Ȱ7~2K~&~kڀ jW8W?}Ã1ܲ|†+^}ǽ}MbX}}Ύ~J}"~ȄjOV)>-Vڤ{|O| N|eX|}\}A{~}iH~U@> )(-،zіA{/{e{D|I| z}Ag}֋eT~_=fj7$(ez/l z·z{X}{$u|"w|f!}/R}؍n;~ƎeZy"z$>zz{@{u|[d|P}$9}~ y ©yzBzz֡{4s{,b| .N|ww8|2Q|6yyy쵭z"Cz]1zzࣆq@{6x_{L{֘5{ݗzzgBz-mzLBzm-z  z`nz]9{J{7p3!zO5yWzV+z:Tzu䜲z{2zwq|zDlizEZzGz0zO x?MՓHt(v"„Nwoۃxʃyg{7zM|h]}T=zj>+ӟ|7}уG}~)~HVyg:St<kѧ_B$܂U×1郤ԃw҃eR`,;߂ÆˋϨ:@Fҁ{J!LPvd-BQMq@;!n͢*/C𒏰ـߢ:n{^:PtOcQrPI:q:=LˋF_%{D͓bra~͎EN8`+=ɐWŞb^C{pC0!_j9LUW6s_"ȩ{1v9L~}~қn&~]t~@K!~4~o-}J ±ƨ USYP~~?{g~|k~L[N~-I ~ G2}|"|,mu  ~vx~GPii}NX}FR}l"0 |3z‰xJĚԅ~v~g0}Vn}P1C|٥O-{ݞ ygbt!`ufvRvqwHyQY zt܆{|c}PɅm:Hȋ={c Q{Y|}<|}݂F~s]vbobtO19ԅtLoƦ6'[uƆq a*pNwL9C*ļR6_م LtZćp_J_ЃMs87ۈ&"-ʇIFȅ9} n׃^;Li 7|Jx‡ @4;N^KՄ{u'lۂ\~JقV5A=҆&۞{jϕOn yZjoZAI3T; Wȓͅ0wBhXtYGD1j7=@f¦du6fuVE1X/}&Ѫօ׶#ǩrVc.TBz,~ O|RN׆ƻ!~󂪲pŭaрݪBQЀl@ 0*n}Ŝ zنſ;sx!tvHwTx}z o{^}1MJ97,,`xzHُ$zM{1j|N.}| }m~]@Kڇ7[؋! @0wсCj_Dizt`l4f=\YJԃ6/z׎̈,s چq/xjZ؆I5ZLj6'QQ񑷊" wKiY&CHm04 ]o`P?Гfu \g&\W܅F)2/YF)-8V㛈yy>y>5e-rie֑UބmE)}0CDH$Nx0wO~Zpކskc X?S[wCk[..Y.0QHt m|FKnȆ`@QٙAY,z .~ڈs@7ز~B1y#lqפd^nOed>,)ـN }R#ѿEV-P?Xwgjd\g6M+<7'LĚT|s @tHuQ9vڃmx0vŽyiR{.YȌ|HΊ4Xa\Yyi"z!zَd{A|Ru(}J'+ݎTVzחʓؘWL}+rVq'eYAKH<#) 91Þ+džٕm{]oʐƖcŎdWkI֊“:ψ', 0dƥ4F'ym吀aێ]Ux>G݊K8ƈO%;_/m֎F4MNwuܥkɐ]_$S6Et6ɝ"T6䗦.t[t;WIuҭWi>}]ɍ5Q:CQ3LՕiCmrٓHsIu(~vXswhVyy\MzN|?S ,T-qIxSy֞y}&zrh@{Lf䖼|NZF}Ml>A E+҅>l-}ΐm'~T~e{F~peYLA_=;I*o,1yorNL/z%o^ȃ$cI\XBփK<6)!AǗ߉.fЈ0#x܇mԗUb.Vݒ8Iɏ臡;>ӈ)GV?iX6u#LvǙZ}l `”0U#H+J9č('c < /ɒtoj2"D^擓aSG F\Ď8"% *ܡ웾lɚ~}MsHhv•'](,QDEv6X#MօM0䢗z|ORXqoef|[VܘO>B֗*4Rj!9;vrЃm çzdV3ocd`YBM}@`w1i>s\;F7_.䯘x]mݘZ_bFWogK>H"/-|~ےAs*t!l uuv:kjwh`֜_xUczyH|q:)L'ʒ ̐ͬnx2dx~;yet3zj=z_|{TT}6G~9)O' }9%}t|äv}rס.~h~{^/)SFr@n83&RP KjoJ{Q,qbr4gl"J\ƚQŗ)3EC}>7?%1 cfˇEyoejC[ccJPshD<6V5%\t wBPvxUn[<dWߊrYӊ&NӕҊB ~4鐋#u@ 57pv0lڏbvXe2M^@ؒ36f!Xے؉7MZ ~楳u4ߖ k%a|VcKl?5&1dJ%(O"C}[siJ(_Z՘TxI=]/Y猁JR{rq֡Yg<]uRG];p,܎ыu2σ{uz pCf2[͚PeEĔ&9**h$o+s}رtuUul "v~b`wXȡxN=}z}Bm|4Q"w q_x\|ɰExt2ysjLzazW{M}@~3:!Օއ0 ~|{~}4s>}qi}}`n~*VbJ~K?Ё^2a!: rほzqƪ|hw_U}0J>"1o ? n\9ygKpɅg5]Ԣ1S՞IN=Ϙ80J )x#o)Beƥu\XRV$fH|6{߰ܣeril=_֤`V&uKbAWSo5P a'Ϛ8zuq*C3E&Frb􉩀ssTjϴVb5Y=CP1蕐F6<1wJq$'•Kr@Ƞi0`دfWϫvNvDG:Ȝ/]&!𗬖qh\_DYV(MXVC9a`-} k> v#rxwswumxvyx zy{{{m||X~:~p@^o~tzqu{lv|Dw|x}Wy~fz:lO|W}j?}w^s 2`t9&uu*v9wx}zk {KJV||>~6qJۗq6st^u7Hvʈmw| y@/iz{Ug{ֆn>}^k_p|qԺs\tau+wzwxhhhUyDT`{A=m|e~Ao;q%θNrFsu/vmxawfxxRzN\;{}b}vo &~prUsbtuޖvwHdZxQPy9z| {ҟnɯP3p/eqOr棟Qt%݄OuW{sv)bZw3O5x̓p8yylnp 0ZqodrsѦt{qv`.w!M$x5xx1np7}qKrvsvtXo u]vJuwYU3Tw*v䊩oYͰp|ɬq!r ?sT}yu5\uɹvvuvwzyx{jxxYNyFyi0AyF x^*us:ui}vv߆w[wwͯ9gx>W x-DlxO-x8 EwḘprY`^t3Iu9wSÁOxvzd|1QWw~:bʰ5xR 4y=r4z9T:{C| l|t~ cV'P.9ۂȬ~)|"ju;OUv@s߁bG9O܃9˄΄_1ƞ}͇}.o~&}~LPm~q~q `x}M8:&TĎ|ҏx}Wt}<.}k*})}ފMo~7_Y~LP7}$L^n|e|R:|Ù_|Ē h|}|}5 m}]}~K[~54}dh{yx{ȝ|s|H3|nz|k|[}SQI}Ď3~+{~پ){?װ{xƢ{{֞{x|+6i|kY|xG}2}$s |{,a{Rܠ{s{{vX{Şg{Wz|&'E|N/| {&{T#{iS{w.k{|3X{t0s{e{ T{C{-{ uyƇ{٪ {G{;]{m@{M:q{D1b{8cR{'c@z*z >x?zp>qŨ9s&u8v_xapz_{M}7oۈyj()wD\xEyWRzIH{F}|No}y^~LjR6j56~qp~Ϥ6)a|)fm]`KJ#6>vt)0քOzdQl2\3J,[m5HنËͺ@=͂HZx!judZk6I 4 =¸.Qh$ZEc vٍhX߀GӋ&25ŜAV~.s1 Z*/txQyf_#VE 0߀:"S :8/a̞KscrmЗd`nToCK9.~7s%SL4)}pSh)bGR~ߘFA~,~ |΁Q f{m_~Px~Z=?L}䜾)| z{iڿ > y]k~ޫ>]~Z NH}ॼ<}<\'s{暬Uy݄nvorgq?Pr [tlfv3xwjy[Ib{Iއ}5)Y`EvUHw]ÊCxtD`yt~zwM{is|Y~KHD40{ʈĊ-.}ȊA}L~~u~w~uhRFXց1G}3C;6ۊ1Pʙe)ătftWI JFf2ăd*Yۣx0ʆd_rZOd愺UJEP145C򈲑א#h}WPQp]gb T,C2/ǍX,+\k{4ВjnD`vR:뎷Aj-؂Q$𠿝|,@y6XlM_2PdI@2+ր0 بݏ kw.jG1k\k1N`j>)W) }نԥև̆ލ٪f٧tǤhZ[K3t;J&~"|S,Ɉ*cЇ ̅ԳyrHfVXÌ.9$$8}}{ìoO~$pqr)t!~ꍾur;wse ZyJV:d{ 7*ڎui}ڊ5r4ʖfvYqg KW<D(Z8 |(d򒯌颕|V0{p@od+W{IȖ:R&;_Kw@_J~yʉˤn7VaކܠU9G1F7n#2;}Ѓ뎟鎸ƃBwl4_򆗧S=&EϤ5R <|}dښ)o&np&re.sw'?uk:w4^ЏyP{A}-,_Պa>"tԗvwF5xSucyhiz]l7| O}?ዳ,HgkM2z֔34{}$|.~Y|t}khC~4\r)NHh>ʊ9+Պg~?זӡ o34~pr-ysoVu6d1vXxKLz6N$O ·Ϛ%z yHo!veZڐOC 4"k])ܜJs)xZn/cLY'M AU$37E T  }g"#(X~vؚlnoKb(WMǖL?p13?ɂU"r~|tšjvO`%ǞU>IC=.E. 4ҁ,2|Jrh4^cHSoHH ;ģ","z*OYovҥKpz#+rpKsgAfu\ۙvQ'|O~(C3k54c #YV _ʥ~~Ѣ~u lecXܗRqN=ρHB48"j g}ktуk#aWL@ȅ3GȇN!⎈C Epq4{erD7ҏ( )W} ns٠GjamW^!M&B;_5̢̎'R.gpox>q-p7rggss^FuTՙz1=]}R?TNc9t|w&ueovSfDwK]jbxOS]yIk{)=ʘ}#0NwH2n~D_yuymާzHez\7{R|H}<ʗ/iV2BW}$}t˩~lC~icŢ~Z럫A8"}6#)[]щJwރrB}=j}zb୾}Z~Rx&~I~a@":}5*.>(nF,op:qHi|aϬY QYGHbƂ? [44P-'ј$djpD*8:Ď/֙}#_Blֳ*dɯ-\ͫ T\BIKףhB㒾9#lf.#|?iVl@nC%:pqs(CtuUvI&cw݈_Py:{a~̰k̾NmKo( 6pOhr\ssCuzbwOFx9z_:|rHʀj{lܭxn"pqLsHptܑ`v]Mpw97yBAKzDy#j=al 5m좺oq%z~rnt<^ u@Kw50x%xj{kŮmGo)׋np|=r7ls[u IvE+3ww0åj.%kҷmopDyqBjsGWYetqGui0~uÙ \ufj_ƶk[mSolp`uwqgr㩢W+sDt.(t 'tͪxblyn(yq'zRszu"V{vv|xe}zQ |:܀F˓vt߽w{v+0xSwyxēyzz{8t{|}c|}P~-69ف*Utu|һv}a1w }!w~xysz;bi|Og}Q9~G =Jsڹt„uބ} vԄ\ w̄E|F)|J ,{3|!Ț|'|'|"v'|i"|[|tL|v<{ݛ&{Zz+|;0|*|{t*{٫eg"{ŨkY{J{}9{$myĘx@eKkmoȌLqstAufwWyF|72U{qFxrS>Rsu261v=wrlLyTezV*|Ex~1Oox_#yʕ;zo${{}|Rpڄ]}7c~;TބjDM0S؇ot KE%{o(oKb:Sy&C#:/d2!| Ch2y˅m~`ZRNBkJ.֋}v|GVً탲v9wkʉ^zP_5@uQ,݁Պ3ߊǃ|@?H󁜁uvi*\덛N{Č>*U ׀o4+Eǘa\sg}Z؀HL <Ґ(p- ~XjbEo}qzeXJh:&r~@2|ޝvMҒBө0N{}ʤoǀ5cuAVH6Hh~ԛ8W~r0t&{$upaveB'xhYizK{<ȊV~W)ӊp݉{`Iv񍒑w,xyyopzcҌA{X%},J9~;~(݉9 x1D|Ӌِ}a*7}w؍~~mw bFWV?Ii[:B'󈕆 􉙈“\Ԋ'݂{Pv5;k_`ŠrU5]H#9|օ' {$p"P$~ptXB%j^SvF} 7%iP f c?~|rl6hQ]!QD6+(q#<v j愛z⌕p4fMʑ[FO҇fB\4wXs! pсރALՂΛXy =nʊԘjds_YmMAl2wR1QÍwl bb]WV›Kӆl>ƅ+/܃ϛ ʂ'Z.~㍚|u4njmz`٤UqMI S(7HVѓ< D._G0&wRnڑe<[FQ+[F:_9ˆ+cxJMv.m!åAcȣYÍmOOܡD^70s)D0D_k|m\tž(o kɛpbƙFrX—txNAvB7x4D{" υ`Tp{qsosAjrtaiUuWs.wM yW@W{o31~:!4$Quz9v}r&wwixv`lyV1KzKޓ>|/?ۑ{}2* QH&.^zxɝ{5p<{g|^}DTؔ_~.JRJ>1$ xTwZ oa]f8]J-SxIUj=0*F~5ͅuĜKmvdS([GQŅG<.x]|1t/Ck-bЖ͉YؔaP;E&:=X,팵ɐ'vʁ{ ǐrIj#1a/RX-%NlD=8+>1{א4р#yoyph{Y_Vs4LOBs)64);J"wNvo&ǜEf$%]%T;KJ@`4rf&v3me9[%R͒VH됱=>`2l:^$%pzMl$rmko9bpZP rPutcGv};x.Q|Ɂ ry+pqoqiߣs#atlYuOƛwRE y!:{R-U ~W攴&ۑ5Iwup8vhw`MxW*yNz[D${9},d4j"v ynzpgQ{&^ {V=|Ml}CǗ7~8v+sKPNOluw9~m(~f]].UcWUL6ɁBQ 7i6*j:6ttlBvdU\6Sٚ;JAr5{) iݐ6rեۈjۢ߈qbˈjZWR1"RI?c4=f'j⍄䎍S 8qWjiaiaOPYPGm=Ȕ!2O%Đ/;og8`W!ODEÖ<&0Бӓ#|Snb՚GfRיu^UUϛM0Cؖb:̘.o!-V ӌYlndᡰh\۞TGKȞB( /8;},˔ W凫nڳZlgįn`۬PoRY3pQrdHӢt6?vI4x( |)Sn=pf⮿q_5rX9t%PzumGΡv>x3ќ{''-~v85[bm?teu^:vW1wOtxFԠy=Ɲ{{2!}&U{j8kXydɬy]MzZV {NR{E|<~b10[%zƗI߁jjy}gc}\n~>T~M4^DC;Ёu1ID$$}3SVibwD-[OcSkK͡C::</#LXnJvT]ha>Y(R JHAy8]-B!8Flg__*XNPƣ`-H۠'@07],or 01f(+>^ÐWJAJO]G[>35k5* C dݗG]R}Uɦ.MEm<Ŝh_3mt(`͘$qZ \Tc\FQTvϜLY{D4;&-199&W` 'ohbpk4r[mڣksp&u rvrtvwvdyxQf{{:T~}^v mqZo-rptrKv7sw'uay twzcTx|P5z}9o|vmkyJ6mz4oO{1p{kr|ԂtT}s v~obwDOyˀG8{Ƃj k򁹫m㝑oqz'sxT)OxxZyxtpqrçsvUtCiPuX[v&#Lv؛<w[&v7x pkqrysh1tRt6gNtYuGJv2c9vk$?ukyQg1jIlʍoqVtCsguW:xFz1}aۮ}nףH~p~Qrr ~t~us/weey%VgEzEc*}0Oֆ!|Nu̡V|v|x,>}Ty<~E}zUqt~{ld!~|UT}D8:/FSz|؟T{P}c"{}U|*~|s|o}b}HS~`CN2.̀-oyTz3z{{z{n|`|RT}r`A~h-lOsix$2yycz,}xzl{6_{Ո!P|@d}s,Q~u<qjĤ`wtxNUx4>yw'vyj z}/]{RN{>|vm*@} I~V#w wkxLʀ=x͕7tyHhy͒4[:zXLz<{8(C{q|wvwBȉwҝ~5xMrx™fywBmzu.օ} }!n8|Poq̄sqyVu%mv`QxQ zA~|-DŽWu3tu#w6xWwykz^{P}o@J,ăՇơG{a|5|}[u怜~ i݀~]YO9(?b+΂6MΟK9VdJt+h:[BM݀:>D„*火s承8~撳~G~3}G~r3~fU~ՇUY-L*V8<̇):|| ?H@}Ԑ}ӎ4}{9}Sp,~d\~X~AIJS~}:~̋'( 0Ɔ6}! }9>}OlyO}V'nF}Wb}kVE}H} 97}ӎ% }n}фY||ǜȂA|֛wY|ؙQlV|ϗ`|ؖTa|┰F|퓷7>|哗"|O9 |||q|b|Cu/|5j/|s1^v|hbR:|YDl|@4{zɕ|S|lGk|j~$|bEsK|IhN| \|PU{ܢBk{2q{ay8/ =g?$ikgl8~ˈnbtphkr\7&u%New>zZ+h}]׆3ndm}osqC}rrrtf݆v[Zʆ-x;Mz;=|*V N sЏyuv^{ldwpօxe^z Yj8{qK҅}<#)O1 pVĆz܆DzȄ{yJ|Qo"}cÄ|}W:~Jx ;Y9(U鄂 _]䅠W)Kw=@myɁb/{VnAyI%1/:=U['j ͅ|ꄱƊDSӆzudXk@`[7TeIG{N8`j%Ȋ P!~U""ti?^s늟ŔMEwJ6b#nρNP/()|t&r+)ǵ4\<]Q 鎨CY54k!n 2R֍Q6xz zpGeZπO6FB39~}N悤:2xjǟzn-Ecր1X7M?>R0~+}& Ђ\$Ev:lWLb[}VТ KC<=~.e}|{;Ygi΀̎lv؍un=l׌fpjaՋrVOtI("wa:RzK'B~C ύmHUlo 2IpuFJrkHPt9`\|uTwG2y9$|&7_ <ɆDr5tH} us/viÊBx)^{y~SzFF|8~%7 $xĄy{ʋzr{kh(6|I]mv}9R:~LEfR6$B 17c~.&zpaf1[vPӆ΁D#a5φ1;#]芉R%x;+nFdƇ^Z,1O{B4E@O!vӅOzkvQHlbކXMrME>c@2Jo,I&ΆÉc}ՐtjՆHaVJ K?0̓ZHّ--݉P+{crj i_ATI{=+5.тs܁)yyp f,~]6)?RFEGa:,A׀ ꧃wԇnцIe.[lѡlPݠÊT8\)񀨜\~8 _gixknӒnep![8rNPd}tC荌w+5z6# ~.l~nvphm\mr dsYՎuOwBy4|z" Tυr9}iVsutkݐZv%bwvXxMzvA|V3~!)Ww{˒@xshyjLPzla${cW|rL}@S42g%j KA} z4<}q֏~IhȎQ~_yU/K5 ?Â:1]=?ւxudp =gv]SIÄ=酈/׈P<d1Svkn6@Ve)߈9\s(R <5Go;'$.e;/yj*}tt7lycnEMZS،PfFo:k-,]~5{#s Oj/aɒXVND2֑c83 *]'|4yΏҜq:` hݚ _pV=LBH5 'ÄSQwom&{gB]!,TʼnLJˈ5@IƟ3gt%hݙK5~IgvƜ/io kfm]oTDUr Jth>Cbv0zz(h% }HluinZmpe+q\ sNRVuHꑹw%=#nyr/|jl ZH{՛qsrlKt.c˕uy[>vQ\xNGĐy< |.~zzavrwj̖xbWyYؓzPiY{F}:䎅~-]冼Pzx{q |SiY|`}X}~mOZLEFǀZ9,ۉVdςKwPokKg_C# Vё:}MxC83+ˇN̋χ݁9uɘ=Vm˖Uce`{]~UKAݍW6p)@&Pt(lċdGˋ[֑eSUCIXO@,4ËS'Dre>;jpQbTZ!tQDH:Ԑ&>b*c2芬%@Qph`_X:O&LF:c:3|&ߐJcmrEf^PWDO/eFe'=#)2.J%j ylфDdh]UUmM}VoDF;fK0ta#4B勫Ѐj>c Չ[КZSKĉC9.Ώ!g"h;i ɏsa`#ZARIJzP{H|~@}7י--V9$ ̄hc8}\x~8Uۢ~N%qGD['? ؁6]oh+rizL\!?b U[/-ThDME=iB4܅*0ψ&,( RqT݀`k]Y̤uSKD-2&;ޙ3R(6 s su_e錬XtQ3J&|B:7A{1S܎&pw^!W gPPHu,]@ʛe8J擨/?}$]d \}Wsvntw^vyKy${{5{}x4ځgtA,j uvl7w 7nx:p yo{qzms{\u|Jkx"~.4?z(1e|jhF}Wj}7l~)n~yp5kkr[HtۀNIJw3sy}kd6fOi.jIkSE&mv!xCoiqYs̓H8v2xyQ|" %bȪeN g/j5flhv2ngp5X'rχFu 18w1 z|iax Yd.giJk'smeo͌V1qߋwDsz/Lu8 x͈`l cYVf!4hk+jqlϓ2cnSTXpCCr6-vt= wIUJ`b£_Teugƞ}njZolan1wR[pTAUq֒+grYiu_xbǔe8gjc{i9m~kQ_gmPo9>p1(pIu`@_θJbVd.gyi%ktk ]_lpMnifxihtxkHynt0zqf{sW|vE~dx02{XtQku_mvyoNweq8xPs0ryTue zuw U{xD}[{#/=z}["ermrPsstuAuv}wwpx&y=cyazTxz| C_|U}.S~[Dpyrznsv{Dt|| u|oOv}bxE~gSyLB;{Os-u}?!J*Ϩ%op:rs sXzDtmuՂ`w-ZQxA&zPD,|- †mqoSprIRx4sktن^v2oPwK?y=a+z؇W }lnK^pqiv r3isf\uRN$v=x )yM |*kΗ_m|0Ho:p>t qgs+zZty8L\u6<3w'(wzegVk:=l❧0n}oqq8erwXs:Jpt:Eu %vAxjln={ioopecnq=Vs :H't7tƘ5"Zt3cI|#jɱ-lUDmYyso%mpIa~q_eTrg9F#s85srC~i{c|fc|i2r|kz}VnJnz}pa{~sIRmuBx-G{ yyjz;l znȄ{{py:| rl|t`}uvQi~cx@z,F} أwqaxrގ-yltnzuwzw6k\{x^|azP#}\{?~}}+Q` U ~v"xPwy59xz( x{uy{iz^|]{F}N|N~>}**hD: 'φRotJuTv >w_tx\hy</Mr{E=|)~0 ākjHs_Sty(8u}1vrw\f-xAYy5KzD;{ '|ׇ 7rFxszÆt{udpvd)wg,WxSIyMd:8z`{%{E/}qݎ{rs钁yt֑Unu*bEvUwx)H*x]|8yDQ#y{Ӄp𜀌frۂsJ6wt1lu `UuwTvFFw}!6x,!wY|p4qrztsĞxit{^/uLQvDv4&w7v s=N~peh(qz}rzss`h t\LtġPue-B u؟1ust <yc?f>)h_%kit6mhfpe\ZrNR/u>~x]*c{ Љ-:~jfAlbn=}p)rr"g%:tZv*M%xH=Iz)V} ;t}Tp{}q~s{~iuq>~vxewYyK{-<}=(Ty օ{w|Aw|yz"}#yo}|zd }{X~n} Jh~E:'^^W -U̖zX}z~{~~xa{m|Obw|ʀ!V}YI~ 9~&wJ y&HyȄIzrRvgzTk{R_`{τvT|]Go}8S}ޅ$~ˁExxӊ~yt^ziz{F^zR{wE| 6|*"}Vslw^ x4|xȐKryyBehy\z#Q*zC{4{ {/}%ЎVvǙmwvzx+pxnf'y"ZynOQyՑBz8l2zQy\e4v_/gwzxwȝnix0(d xXxؙ*M7y&?ya0wya |x v$fvɧvwrlwˣb4x WxNCK^x.=x.=xGrv .ccf+.hx k2mׅ=mbpVrI!uG:xx@& { QYi؄~k}^mve/ol=qa'sUuHNw9Dz%Ӆ}@zo q7~rttJju_wRT>xGz8} $̄߀:7euʆ4v|큶wsyiz^({0Rˁ|hE‚}6#у8C|d]|{+{}GqRy}glp~\6Q\Dy5߁_"悩0DUnHy7woj|evZfOB`4Vtv!0Oms~ }~]|w;~Cmt~ c~X~M~·A2Q 逃}dw~}uZ}؎)k}a}ڌW3}kL}?c~0~3~8~l|ɖn|}asr};[i}?V_}1]U`}0JF}-=}/.}|_|\zz|qZ|՛/g|̙]|ST|H7||;^|X,p{zr|x|JUo|{e|d.\|1Q| Ff{ٞM9m{*0z霆xԎ.cË|f*yhppkfpm\SoQ>yrxDyOu5x," |oiQkVx]empnoXe^Fw4Ç}z}!~JĈAnhpvr.mSscu5YvN\xBAzt3u| )}vt}Futw k_x(bRyMX zMFE{@˅4}e2l,ȇv;nzx{ {=sS|j7|`˄}Vn~_K0Q?)1ui<pn ԅRizqt9h?A^́TڃziJ9:=+/V\=ʄ+_px7soچfYs~]SHi^<29./:atN~vO_vm!d[X;`QE%F:O,!(} {tnĒk|b‚UYOz.'Dɏ8rT*HW{rpUi`W Mu8Bހ6(~{}y#Llp#h^*UKTAp4~ѝ%}~S|= ecyFf.q%hhŏ j_m*wl0w9oϊ:jgƉv_.VMjB*7K)ZTʌTv?Hm~f ]uىT҆KNAL`5Ɗ(Jw It@l4dE[98S EIr?3˃&CAr]9djJtbQ YkQG֔=x1#x3ԉpޞh`@XJXOU\Gw dpe|f@hh`͔djXlOCo^EnUq9яt,ZAw]|@\+vhn#jgl_v-nzW;pdMsrnDAIt8}w"+A0z<_ uTmmo+f5jp^rKUsLƏ`uC@w7wy*3!|isrlsdAu \vJTxwKsDyAލ*z6vf|)%A~aqwjxc8(yz[7zpS+_{uJ%-|@}5SX(# .)pR|hڑ}ka<~Y~Qw{HFQ?+X3NJe&RΊĀnđg6q_ʏuWŎ;OF>=?e 2n$E~nm?e^#VfN'E ̈~;0]#-afkMcяi\r#NTjˍ%LMaCN%I9ˈ.鏡!' !i;0q3{tx&eww}.߀lShegj^lbW n4OfEpFr= tX2sv%]z.рkmdn]^p>UїqN7)s`Eu<w1uyl$^|Di|qbr[t@TyuLvD`zx_;Tz0^|1#]yH؅h:cv@aYwKZxcS(ynKzC'k{:)}>/K&"hm'-kFxfb{_Ԙ{Y |Q}J~[A^8-Ǐl mƉ~eT|^PWl6O/HYe[?ېՃ'6ڏ\=, 5'x yc`\U=NYFF>;&E52B*bpTo 5b-![-iTKL4El<3n (\O`!YR9Js C0F:1^g&< wVI_DW񕒗P՗IQ A*8׎|/֚$-mvJZzbϨ:d\yfVQehoOV jvHQl@-n7zqV,ҙbt% w ~78ah[hjIUEkNImG>o?&q6s+Kvz K`lZFXnT'oM3qF1qr>(mt~5v*:y$| XY }_UpY 8qRsIKtE[u=Yw4|yn)*{1P Vπ^ ntWơ#uQwJƜxpؚhrjt7 lutowUfq]xW5sz[Ev5{/x} ~m_aw%d8xfy%iz4kz{ rm{e>p |Ur}Du~.w |V!_&rb[veΊg~lj iqVlocn T~qUWCrs.2v\ {u˫]"4`džɔcrf@ |XhхoZkCamKRp1Arń,u( yۅP\r1_k&[bMe!+z)gGm@j7s_lPo@?qZ*sSr x<R[kU^\7ag$:dx fkHi5]kUO$n>p?(qIvƄp Z]`bc8Pveޗ:iEhTI[jÓeM=l Ń~Bk?fϡNli4nkpm~qpJq7serucu-tTwvCTydy-|{h hnY:jplqEnxs|fpEu6orvbUtxgSAvyB1xE{,z} /HfuhwjxXly'znz`r|KQt}VAw"~+y l~d}g~ i[~{kc~xmnilVoq_HqWPs@vo+*xer R}Acc1/eg]jvl8jcnG]opdNry>t̄)vޅM {ˡaߖd@f֋E/itk*hSm>U[so[MqjLzp{)|} ܂Q$kt̕muoHw px4trZy^hszz\Fu{MwK|=yK~H({ WYj|k|0m}.~8oV}s.p~Yg@r~ZtOLvDgQnIxwn_dxbQxea~yh-szMkh{*m[|'pM}asV=rvI(|yiZ5u+fvhrwj}wm rGxohfyqZSzsLE|rpiedka^ulݣ_kn~aoMVtpk3Jqy=Rr?-rxpr|z_t|bIF}=e's9ށiv"%yzш,zWeÉzh{zjyva| ll,|na}Qq-Ua~sG~u8Cx$i{_zqxflym~yotzq{j{CsA_|uT|vF}x7{#"}僶vr,wks|xJuryvbhyw^ zyR{zgEp|{6b}}"ۀEkčtxIuy{vzq>w{pgYx|L\ys}(Q3zl~D*{#5K|ـ}!~6su?t}yu=oKvwevwaZxOpOzyIBzZ3{ }Dir,-;sN wtxmGunc}v]XwIMx9@y5M2 zE{;~JՇbq9~-rUusxketpraudWvLKw2S?xZ0`x y 0Qpo/|+q7srDi{sZ_tzU/ujJv@)=Gw.vwvڐ32oڛz plpr#gbr]sՖS#tH u^;u,v7tՏKotxpOoqerj+[s.QXs朻F }K/~2]Rzi€Gwxxoy`2fyQ]pzp}SLzH{bbre)iԆVg`jnVmLo?Cr1ZucyqUfe;y3g|qLihOk_En4UCprJr>luT02x= {#ŀH |7=|4;1|!#{ϕ@4{`q{6Di {cLa{kX{O{FM{y<#{^/{!b!8zrv zzz-_rubpjebgZj1PlF~o:rv,ˊ̓O2„%- nifӃG_^WE8OZsFQnt30wC%zN׎+Vրl`nqeLo^b(qjVNrO wtFRv*=:w1يz$N|")jōshct\uULw M;xXEy;Љ{?0}#|3ibxbyl[.z^S{PK+|TC_}n:6~/(f!#?gO}`f~^YmQ׉ J6?vAR8qg-j 62 eaX^WÈ P.&mH]?톴6Ɔv+1m ŇCc/\މ0ފG534)넨Wu=ǃb-[ tj,v!z( /rb'm}\`oUqpNؒ1r&Gs?ou{6wf+ˎy| ԐaurZs]T7tM}vF[wb>.x5tz*t| 6_铳vY^nwR&xKz D{-<|p3ߌ})&gY Ӌ^l{W̑r|QL:}gJ.~;C :׌02'csGt Džq\V*{O]H6Ab ^91E0m)%TLkӄW[oTʆN#Fv?I7xF.VS#Ӊ=^H*YrSwRЏ+LHE΍I=̋5,!{C,lWʏ˓Q0%JoWCw8<3ƉҖX*mٕ@y\*`VGbPӞgdJ'gClis;^k3n(]jq6 u6{}[ldrUvfcOhZILj^BNls:w%n2 q&'e@s2w_, ~ӀZ<]hlTJj$NkG mA8_o9pq1s&uv_6yۀX lzRHnM3oFq)?-r8?t/v%cy4t|ƒ6WpQ qKTs\EXt>v;7 w.˓dy$Q|:KׄV7uP;v3JbMw]CЖx=-y5}{E-8u}"ő]?xTyNЙ zHЗl{B.|;}=}3Ò~+n  G茍ST~MB20GO@9u2 !)84.HyQԙ KxE•䄱?UZ8=00fll'=_BqրPRgAJ ܉DMC=?6Z.k%ŏ юC TFNԏHOBzƐk;.A4,#܎ѕ peZREgY]•i(a`-kd}?lhpbnkbqnBSsoqBjvKt ,yvK!z^bb"*ddޓfgQijO{xk4lnmiogasoqR_r4tDABuv+Kx5xka| _ib7ldn$ogpyirm&ks`nmuQpw@&syl*v{+}~u]-qΙ_s#bte5uwgw1k}jhxr^{myOoz?r|J)u\}|8%Zy]zU`{cj{v7f7|ih}+\k}NsnV~>q=>) szӁAXk}[с^aށt7dŁgg[4jKLm>iIhhS}uV+Yĥ_u>\j/_^Jb"bQdpCf!3,gњf=iZ kw]hlamndwpgklqj^snOup?xjs)1{v{硦g)ahd~jgtNljvnllipVo]r^qN~tt=w$v(Rz0x}vd}i[fkhhmjot_lqhNnsd[quRM=sTw1~;Xb~e~d~gb~si{4ik^umRoE5qŁ5t!;uH/|'Ia(0c{eqh)gjP\l^PnnCtpr4 r{U;s~[_⌂pbCyd:of䊥eiZk(Om83Ao$2vp5Lq ^ܔZa9wcmeҐchXj MNl@mڍ0oSn^+-`]ubke{ag Vi KGj=l\.Imfl]U}&_psb3id=_f<#UhI~i嚛< kx|s0z:~6|Zq=)mUzyyn{TppG|gq|^{s}nTHtX~,Iu=w&.x,zY2k0w|mT_nnep\\qĂ*RjsGto;Luă,w"Ywo~juwllm}co SZp7Pq.Fs.F9tf+2u9u| is~k ;klbnXozNpČ=DKq 7sH)Qsۍt hyh2qhjA>hkӔT_m0}VnLo,BKp֑5qU&rrwh4otigk^'lbUmKn@o3pc$p%|q|[W{.}@^Mr}a]i~dA`Y~~g:V#jKcm$>p0r6s]U5v za,yo{#cq{fDh|Jh^|k-T}mJ!~up==wr/JuCxxtgwy(iolyk4ftzm4]m{hoBSo|8qMH}su<~*u..xC;"{^~7vlluwEnmx%p;dxq[ys}Rzu#G{v;X|x-~4z>}|Strtut&kvzudchoXjO]mUDo8r*̓uyw}f}o~Ihh4~j_ lW@xnMpCs7āVuT)xz{v|ln=|{mf|or^+}qqU}rL`~tBn&vV6xM(-z~NtHz=qlzrd{YtW\{uTV|svK}xXA*}y5k~{p'})MrdxwjjyEx\cyyZZzzKR{{IIZ{|P?|l}v3}<~&~Mipw1}?hw}a)x~tXyG PyGzi={(H2-{܂u$c|}~ _nucfv_^wpW8xOxhEyV<#yn0z"{ |-Ylte u]veUnw }M>wDx7:ex$.y)R yc zjtctΐ)[uStvKGvnB$w"8hw!,wǑBw ay/Xhsma9tUYtQuFRIu@iv b6vj*vpkuYxr[k1g^cac[ӆdSfJi@̆l5#Vo'Xrvq `icDbmjeZlShR]DjzIDRl?o4r8&<8uPyÀodehg`惼jXlQ n'H pA>}1r2t%)w{mk(fj l_InWw2p@ONrFs=;u1ƃ]w$kzs߇~kLpldŀkq]s-UtN4vE`w{;jy0z#}I,j,~ub~v[)wT?VyLz#C{P:c|/~9! hs}f{Ha8}|Z}|Rm~"}J~V~bA~I8~݀`-bF~ Wf|4_e|yXb|P|iH}1@E}k6}x+}(~H /d{'*]{oDV{mN{G?| >|OZ5=|x,)|)| }pbzJ[zTzԍMzEP{<{663={EJ'{=zב@|)`yYyҔ|Rz9KUz (Cz*Z:z1#1xz#%yjyzi\bȍ^\saXTcMhfDeit;!l_/֋/oY"=tr Lvh)`a`ZcZebSK_gKƉjC,l:o.q!&u Ǝ(yfel_≨gjYO8irQkwJmARo8Bq-tr w} |e jj@^SkWŇmPyXogI q6@s7u,7wJ;z, Xcjo(\ĆwpVE'rO szGąu?fv6sxU+nzR} 0aPt2[uUTvM[wFXx=DŽ=zK4݄:{)愂}Sz ]`yPY_z3R̃{#Kh|DR3} <~$3 t()6JDŽ.^?~WiQ y IIBj:XN1p}&v3 \z̈́U⁢OhvCH6C@ 78/5$瀟kzZTŠM+FNR|? 6̌-"lJ~퍔qX׀;RGKÑDv=Q4~ɓ+~h f}}p~`]O\BZR^SӒYa[L֑~cEʐf=i24l)oTrTpUx#^`XbReKg`DBi`d8 Ċ80='Dq 'PxhOJDΎD&0=R6Z.EE%h. ڂVe\nPV^K$a,Dc>1f!6th. k#5FnrOOqyU`KOmbsI旀dCXf= Ai 5\ek-n"4pCt T|SSۘ}d=N3Cf.Hh%BYj&;l64Mn`,p!;sPCvp~RhJLjG[kA m:oy3qq*ؑ,s `vEy~oQ$ltK\mF;o?.q-9]*r1אht)vy W|6O'pIr#Dps>#t7Ðvk0=Hx ( yj|U9NHu 0J?( bڌG~UAdj<r05yI.{'$]jْˉXxaU\cYe\ng`zt+i{dgkge[+mjLpcm;sip%wsgtxmr^]``ccB}eMfr|ghfjikYl\nnKQnq:qs%uSu~zv4[Cd]g`i{ckpemdh;pXpjr?J mtJ9p|vk$Xsx?}|]X lc[n^!oy`qro cscWfxtViCv:Hl w8nyU#qz{~#U>t X|u"[vFx(^wMmqaxYadyVUgzZGj}{P7mz|V#p%}]Fz?”jR{yVD|&Y|v#\}$k`}_c~Sf ~Fh6Yk!mҀZz9PTPTU.~X! t[^i^^"aRdDpgX4i j~O &R]||Vr*Yщ+g]\e`PxcBeʇ%3LhhT M QizzU3p=Xe[nZ^ÍlNa}A7d91f"jf}LPo@xTT6n*Wu@cZX]fL`N-?AbM/[cӑF;dUQL[OfvpSPslZVb"YV\hK=^=`-aa}cutfUĎZgY[]iJ]yj`nld c/nsgLVpyjHrm8sup"y8syHb\Pd_xfc whemHjhalkhUnn+Gqap7`t!s{"wqu^{"_dDNbfddiv2fkIkhm`CkoT?mqF[os6Yrv7!$~}g\k?_]mP~botcdpj fr{^i^tRkuE!nhw[5Rqy sz?}L Yr2\t|_uLrbtvjhmew]?gxQ{j9yClz4Yo|r}dX| Wz- Zzz]{sp`| fc\|[}e}EOh}Bkk<~2mLYot~.rU}X́x\*n_da΁YdyNg!"@ia1gkflބ(*SW/svZl]qb`JDWbLqe?7h/jjCRm}U؏tY6j\`^V(a8Jd5=fk.)hD`hQ@{TܖrX;h[q^]˓m}/p~qZl{]Pr`Fi)bĀS_e5UgIiׁM=l-no?u[X͆y|[p^SgNa1]cSYfHWhQ;zjc,mlxm;9BWtwxZ[ln]Oen_֌[bN{QdFfڊ9hu*i$k~VvuYYZl\Jcc^ZaOcJDeaC7f3(_gSj+|Us`Xij[[a]XE_uMb xCc5eGE&ReiϊnVcoYwp]Cmr`csJcY9tfMv9j5@xmN1tzmp~ s{|k\~m_unbl-pe_b}qwh!WsjLtm?vp90`xs|2u~rhca|jet l[hjmjPaolVqanKvs5q>{u#sA/VwYuzMx$ f'izh$kr>j-mhloY_mq%U orJ.qt=Ssv}.Nuxx_zcpyeqphsAgKj t^luSmw)Hox<3qy-Tt-{gvv}katw/wcx nf1xekhEy\f1g"f" QlT?sVytYpt]Mgu`t^YvcT xfI.yViEtt9w9vd|njf|fVh}]j}Ulx~>KXn~Ao5qO~&ruEftclre'd{gX[i,S@j2Ilu?}n*3oo%psramjc̉"beZg̈QuixGk#k=l1mЉ(#CnY r=p`h|b`dڏ`XfOzh>oEi6;kJ/k2 k Cp㇝nt_Mfa—Y^cҖsVNezMg D8h_:i-jXi6 8pj<zwVrOxxZ j2y*]_ajy`oXzcN{~fDO|i8}l)p1s1xu\pv _rhwb;_wdW.xgMryj!C){l7|to(~Lr"uwvrbnsdgtg^vviQUwkL9xHmByp5zrw'|u"wup&h`m&qj5e[rl\tmTkuPoJvq@ws4yUu&{ w4~zs.mnCkdo^ocpq6[jr7rS st#Itu?v8w.3wx%yfzZ|`}q;kt'tz2Xu|9$Ew}}zmobizNgkz_m}{Wn|OO|pT}F>q}H}i>(~rl2WoK$>urFR9u}oFwbgxd\`DyyfX+zBhP{kF{mV=|o1Q~!r#5t}-x5mungfvqiz^w}kgVxcm?NyHo$EzjWc_Z\Q@]Ti`bLcSCǂf=:6iE.lK o hs;h\a_4ZEaS6dTKmfBgiv9 l)-nq 0ugX}Ma`R}cYo~Tf$Q~hSJ(AjAjl8o(,qCtg ?xe{"f^{hW|gjP^|lxH}nf@(~"pW6~rc+tw -|cyl]ymV\zo-N{"pG{{rc>|lt5}1u*o~8wz g~b%w/qP[QwrTxsMAyzu%Ezvz=Szw42{yT(|{}}^̀u`du|vYv]wRwExKswyD xz;yL{2vy}'Az~\{b=~8^{s|fWt} Qu}Iv}~fBZw(!9w0xl%yyp|Ã@\rSUswOQtnHu }@u80vT/vօ#w1wr'C{A4ZqYSrHM_s9 Fs؉N>t^6Btъr-u#!u):ul}XpeR,qBKrDgr=s04sc;+Ws~)st8b&W[lZUR]Mч3`IF|c!=7t`^\Z%a_SjaLldE~+e| _}2G}suTxNykmH{y AzC:zf2wz̃^){{6qP{8 RwLx;TFx?x[8y%0yH*'yP ;y'` zXYQvJw*Dw'=wȍ6wَ.wא'%w0*w xYX5SeGZM[]F`9?9b7 e.Ih#zMkv)naǏuX\iR`^L aKEKc>uf%6kh-kC"umvpcxV`PbJReD g==Fip5Ok,Kn!w:psQ{wU*eO)gIKhBfj;Jl4an+wq _sTv'~SiMkMGmATn:p~2مrI*Kt7IvZyE\rQ7nBL 2oF<1q7?$r9t51?_8b0ܑe?([h j[m'xNNؒ\.IY^Cv`=c.7c[e/h'G1jbm# pE{*My`H Yb7BdZi4"k-fm% ,pHrm jv!ӀJahPEVj@gk9m3oQ,(fq.#֋s0ƌul I)yI)lCQn>qo8O{q52 r*t"12vk2x }yGEpBr>H{9N |3 },Ćs~%$JeI8„˃Bn<'7L1*4s#qO(ׄ> Ă@`/:ą5Έ/NoL("!@ тN]fJ]PIs_|T,a6X7uAc#[je__ gOcURifDl^j:4oms8owYWЇl\[}^7^ls`a~ibd]e^gQgjCjml3mp;,prZxV*_LlXa|[Cdq]gg`i\ScjlP|f@nnBip2ksntzRfƃQUhhz XYjp [Ple^VnZaLpOdKriAg3t41jv lw||^iOnA2R8oxUwqn>Xr{dF[sYP_#u1MbCv@geEw0h,y_jz3(}KuOuvvSwflKVnxcN{/e|ih}HI=}.|M }gsP}jSTo}`W~UU[A~J^|=vaU~.2cf\G8zKkqN7h~R{ ^VTKYhI\<_Y,a(dE/xIOpM(fPŊG]-T_RWGZۈ:]JS+$^WncOdD.vGnKǑdO[[XRPVEX<8Z) Zgkb`}IC(,tFԚlIJ=cN YQzObTYD`W:y7&XS'(Xy1daP1c:TydXoofh\eh!_Zj"cHNlQfA1nj1aqm]uoygc^WՁ#_[xa^KncaWd edrY'h2gcMjj`@m&m30eop sHr@{9CZd^*\av0^dqt|%Vf.})Yvh)tM\&j2j^l&aa{n(Vdd)p Kfq=is.l:uo w_~SmZ{$VqnrtYhpNi \Kq__5s3Tb tIdvH>km;Dmp+prst[Fe}w]g~n`iefb_k\&dmQg,oGiq~:.lsl+nur rw5}XlSuZml]Zogc_pZbrtPesEguo9j$v*lxq\pdy{]UAs#sXt*jZu8a]vCX`pwWNcxaDWeyv7hz(j2{n}IyTRzqUzhX{`[{W,^n|w6PoSgV^PY@Ux\smK_A4a4cr%d`kdu1N‡m"QЇe1Tb\WćSZI];?_3,as $-aň)j)?sML[kP[c)Sl ZV6tQXH'[e=]]1@^!^5 lqLJi*O =a\R9XTSP9WVFY<3[/\o\h of~iQvNjU"mkXdmJ\7[:n_Pp?cF rfm9Jt:i*Qvl{1o}|fQWtxg[liF^!cja YldOnWfDpSi8Br{l)Qtoy"qizc^_rd`jjfcazh{eXsjghlNqlljCnmI7Epo([s r;(w6tTx_dpafhch_fjW h6lM+j^nBlp6ScvkJYfxfw|2Jhi}#i~_p6SpUQiX La]ZX][Py_-Fb5Hopo22qr{#stxwpYapjOhc~ka!emXgoa_4bĊb(c;!dЍvdUp7]?WVZN[E]ܐ><_aV30`u ''`@c\)1xprRpirUaHsYXt\JP]u_FvbnbVp:eMqgDsBi:tld.vn xqp }trkii1ccje\lVgTmiLokClq0m9ro-tqvt7 D{woif]iTbBhk[ilS9kngKFm[pBIoq8ps,ruItPw% zzgco5`lepYLgqQips%Ik@t@lu76nwF+pLxOqzs ^x2~9eaWu'^cjv WmevOgcwGi9x>jy5l{)m|cn~7vOc_A{T\aY{Ucv|`Me[|F%g5}=Wh~V3j_2(dkkk&lZgu.Ta]fZ_}SaL+csJDee@;f΃23h&hŅAjSw̓G_[Ј\X]؈AQ_ވ1J6a6BqcLV9d0;ey$eehьBz^Z_W\S9P ^BH~_鎰@am7b.{c,V"bTgύk}ivRb&wTUZwYERx\dJy_Azb7{e,2}hk *o}gsX*`tZYxu]Qv`IwcN@xf6zh+={k~nhr3f:p]|_ r_Ws'bfP;tSdHfug)?vi5xKk*Pynn{p递u-dsn#b]`omdVlpgNr iGsek0>Ytm>4v@o^)Uwq~ysX~xvbkuh][ljTnVkMnomEq6o\=6rq3t#r(autwdv}{`hmYjoRS+lpKmr%D?os;pu2mrv&sex tz{:~_fsX+hRtQUjuIkvBvmw9nx0ozD%Op{ri}Zy_ ]#dyrVOfBz$OhzH:i{@k|d8Glq}F/m~S#nqUpczʂ[>bTyddMf OFzg? iH6j[-bk^!k[n· }%$YJa RbKdbMDeΆ= g4h$+ihʈhmFWl_~Pa!JbBd ;me6?2e)f7f lub{S1[)|V@Tm|tY\L|\aEY}_q<~cbr3%e'&h|kc-xp#`xX3YylZSz]Kz`RD!{c;{|e2&}hp&Bk#mZs^v],X5v_QwaJUxdLByf:fzi 10{kx%}Xmp[4_v_]6smb=VtgdJP$uff`HvkhmAw{j9p}Lsāy[pg^U qi!Ns jGt(l@juLn8vtpL/wr+#yt { v]|kYnvlSLonLpoErq>s5r6t]t-uu"j<7k0n/k_&wl/lEc ^q]PodKJ+f;iCg=hs 6 i<-i$i~j1 kp ZQSSVMDYoF\X?_M7.b6.e-"n7hgjV#q`X~5X6R~ZLw~]yEyp`>\b6eM-g!yJjrYm tWO{\Q|2_&K|aD,}[c=,~ f)4~h, j UmGowUyaOycIzneB{&g;{i3|k*}n6p2r~W(zTvfQNwbhH1x!iA}xk:ym2zos){q^}sJ]ut}MRUt]k8L[u,lFunV?vo9wqz1xs(Qytzv},yJPr=p8JsqDtr> tt7Guuo/Ovv&wsx_=xFz@ {}Np'uHqvBr w<]rx5sy-tz$uE|Qu~o y=Ln@{Go7{A:p,|:q}e3q~P+rvo#rsO wJlEms?>n^88o1o)p$#!p#%>q3JvfIjwC?k=}lf6mH'08mÊ;(2mی1mPo6u3RTSLkVFY@\W9C_+11`a(G7d'gm [MjxuPX-K7ZEVZ]L>„_8 b]0 d'6ig|>i lxBOu\rI^D:a=cZ6߃e.g&.jEKl 4ol{8MW`H1bBd<'rg5i-k/%mKz/o_ *rx}LJ}e2F}dgA4}h:~Ej4X~l,n#{p~irl uJziE{Bkn?{m91|Cn2|p`*}r "J~rsu byHxntCOyBo=yqT7bzer0zt&)!{u s|nwJ}dyV r~GvslAw\t<wu5xv//y&x2'hyyzT{-{E}}E4tx?uy:1vz3v{-cwB|%w~ w#yHY{惞C,r~7=s8t51t+Yu3A#u^u#nwOszOUANq ;qE6Hri"0r݇;)s1!s r u|>I"T DgV?;Ys9 f\!2k^*a"8d4 f~֑+jycHVWCZo=a\7Ŋc_[1za)ŠdI!f3h@l|.G[AÈu^+<^`m6ob0Ld(g* iaKkfo~ES_@pFb;E@d56]f/h1'[j:lDՊ-n3(sDTd!? e9g3Ai-{k&mn|oVqAvBhY=ii8? k29YmO, o$o7pʄ)r2vtuz@l; n6jOo0`q*,r"~t-ւNum$x{h~c>~q$9~Drn4~s.~u(cBvt wZy ΁}'`<|Lu7|w2|xI,}y}&~}}z}|b~~ ~ Հ:zq{:5z|Z0z}*{+~$I{~Y{e~{ |8xSF3xS.y(yM"My|y8iyD{mft2 -Ge % M u EtHHt !"$,%Z&'(*+E,s-.0132e345728]9:;=>;?i@ABD"EPFzGHIKLCMjNOPRS&TKUjVWXYZ\]*^F_b`abcdf g&hAi]jyklmnp q-rMsntuvwxy{ |"}9~Phʄ*AXoĐؑ.<=<:852/+'# ׮ϯǰo]K9'ǼȪɗʄp\H3ҵӒnI#تـT'ݘg5e0[%k&V7Yy.Pw/P^X"7Ni * Jl.[8^!"+#V$%&())*S+~,-/011a23467;8e9:;=>J?z@ABD!EGFlGHIKL$MGNjOPQRSUV5WRXoYZ[\^ _%`>aXbrcdefgij;k[l|mnoprst5uPvkwxyz|}"~Ca{˄8Rmӏ,9FR]hr{|wroljiijkmosvspmkihfeeeeeeeefeedb`]O?.ժ֏rS3ܟuJZ&Br,T t(=KT\ fnf>j#6Ld~  5RpAa / S!x"#$&'#(E)g*+,-/0>1`23457889]:;<=?@A:BUCqDEFGHJ K#L:MPNgO}PQRSTVWX3YDZU[f\x]^_`abdef5gKhcizjklmnpq0rLsituvwxz{2|O}l~Á6Rm֌2G\oəٚ $'+/38=BGMSZ`gnu|“ÚĢŪƬǧȢɜʖˏ̆}sgZL=+بٍqS4ߩS!K_!_Mt*Jf8T[:i&8Ng *@Vl $<T m!"#$%&().*E+\,s-./0124 5"687M8c9x:;<=>?A BC4DHE\FpGHIJKLMOPQ-R@SRTeUwVWXYZ[\^ _`.a@bRcdduefghijkmno"p3qCrTsdttuvwxyz{|},:IWftȍ֎ $0=_u{|;n`S7Tҽb5%bŪ=җ#-x{+Sam@\_:RZ⁨5bI /M]ׇVy1 k~^m~VQ~ᯃp T%=}vC9Ywx~j~đ/]5~P~賋}s슒}AK~3z6~̇5N\Abrtc]wUVƒS΄^o2K""Ճo$q?cOeU\V'.aDZ쉪CTGq b{KUagsԛ{zZjb` bٚ҄K˃҈~0p^Ib(Ufᡉو"ؕ<ޒyސ/j싘V}o1bBUj9JʈϢ.󇷞%|ry뎒|EPnljqt>7h\Q{섺̺(֍ϋP]_"aG}~L5rhfō[GP*_ 24t]W|pςyey Z}bP!DC{őJ||i})f}œHh~~ŊvPzh]҄Sςʄ5v➌̍5VF}rÇ{hM]pHSw`Yy_R<ݒqR |qMLg'\S|k7Qn5M1-UCwz-`p*ދf[񃋆R%[Jǘ5ޜߙbS⃄Sy!ʏnwe:[?QF .&NPӡyڑΝ\=rwqmUcڋZPo h!ϡ^ӎϘ{{)|}"m}|~rBg]"`RfŻ6.]:ݛG1S:a;'{" qm?g_W\R؄ᢡ I~gzDpVf{Ⴭ\g6R̃$"ˆq&ޑ 7yoɋ8ef\ʄRGP7\\ԡJB&njؓIxڍneX[˅e!RxΡĪԓ,S&@wmފ>d~[R"w[pڔJK͐ev#.lΊ#c1Z9}_Q?t靜l& G|~WPtԌ=@kebDYePq[c@{_ 㚪Ē@|spBj>0azDEXzvOu陓[ߞZ{9ɖqӋJh`>W\AOͮ6]ԣ?&՘pǍܡ胜 yɎpmI0g\U^ą!Vd`NYرzԧ{N~{̔ŝ|YJ|}x*T~nudb [2hQτۃ簢wȦΥGĝ@Ҋ逇Z>w6mF`dUׂ4Z⇜Q̄vㄫ.O[`IizvN+l󍻂c̊SUZ&QɄAhhw+ǟΆ̇х~V*]uNl*.cCӄsZQeQƃi:~ABۛGOzC}:tSkf4bÉZZPQÃkgg!受wߍ΅ό{{s" jd*a㆘Yp܅Q<§9-ᖷ~ 8qzqݏiHCarXd!PjmYHB_biiH_yQWPph?L`6WׄOƧ@ȔOD\۔xonSg_-V"OӦ}5_H7u].КWyvʔmet]·8qUNpߥ <wlz~%=u36l_dq1\ڋAUMÄXm{Px{䦷{,|`|{ڙL}s\ ~jb Y@vPυImyϦx|zܘr}gyi]6a]YPՄ37"cƥfՂt;WyGqɂXi@ǂa ҃)XÈPڄ[yڇΆנ8܁T!xUp*Jh1+`L1XPP߄*Fo^E;;wۖoג;g֎`%΅/XW?PلmIT܍ڇ4?v7WnŒ f_rR,WdžDžfPianØ$gDڏ^}ƚYuNjme񍦈w^݇!WLOքʠ2T񨒗Hs|tial&e7]։oVNنdNU؞ҕ!qQz{ntsA kō`cϋ \UiN[䝰ѣYeS:zE,qȒ j5nbjN[T:MӁ}aɓ" kX'{xpǔ i"asZ.mSM^$<|!4j|Mz|w|}֡},v}ng~f?^܎W*!O兯% pی|u#m1me򒕁,^wV(OINٵjh؃As|tP@l薃ea^rVԉPtүxΩĆƤV{ esf.lՃd‘P]VCP U􊟉/Tԣ6zrQkI/d'5]__V;P>s$Aܨˣyy 4qWpj]ac`'\ŋۅV AOĄΘΓʐ0ЇըWxpڊ{ijb\ ]U^>N6ܗ׏mۨ~ˢw Rrohvha/[_釁TƆ'NQy׎ɘԧɖ}Ǣhkv n ag='`׎Š ZvCTPM‚?dU|?3t m|Rf~卮_Z?YZSԆMDׄ@ϭ ]{s꜎Ple^BXWRKh7L؁}PF}g\}CR}~}Cw1}zpCD~i~b[ؐN2U2%O B}ʋYwu}Mvoonhab!ρ$[U5O"huՄ1փs˯|=unמhKHaT[G UO7GA_4 {̩,tߣWn gza!nZtT퉞7OJiƂORn{~Zt SmF+fՅ`DŽZ焥Tى-O[̐ʺBŋYz.s3lsf3_,ZwȦ[p͠jcՕ]א/|݇w}u~~&t_ydUvك>y*zG$z{,|4P|؊} ~/sj~#d8UwxOyoz4jSz{|EX|3 }r~cIUxtqyyƜ}%́px)k^OR߀!4g߃zܢЪ^=NV]ovÀ[jj)^ 臻QX ضӨiy!l%me7♵cu= i nj\uQ)Tx+3 .k9Be4Ý/sjɒgvz[:&Pt~\KDi.8N J^ti~mqf6Z~O~xy1z8{tf|e_}Yo}~_{*lm℟`ЃÁT9:FX識-ۈQFz8}m*! `cNT)8҉KAŘӉ1_eJe+jyQl|_ރvTwՋRƷYgІ͈NIӇZކrx^kЃ2_uIT .׵iiߨSO=XGЄW3wsk.ÆS_ESkNuX`޳/ΐN@ԎJv-j8S^S[˗g"ұšdIx(owE~pti]2Rb2ɷnټ دƇ,[΅) | shHh s\ȇ[QQ튖ʭ}]9nݗ}kѓ|qf΁'[iPm"],dDߟ{ p4qe5ԌZ_PNUlŷCC˯ZNnQͣkyXunc7cҀYOĉ>On~>xFxy짏 zۛȌ>{׏Ċ|ރވ}w$kxi_sSFɴ~e ~~W:Nptvj…_.S͂߃O0"SE\aᤂH+v u׆}j1^XS}ƅ캃箴È٢_mшSdtil^7TS"0&3ޡd^ފ[\݈@t~ h̄(]܂S΃1r)Ǖ-Oϒן 1n匧}erȅg݃5]R]epyʊєa5,|O0qkfȃD\' QQ݄1k泭nTRCم%zԅp%1eĂ܉[CQeKvަ<_a|lڕyF?nՎ`d~ZI;PLbCE"f Tl|]`wIm"c &Y߈6OxHov{l;ڊ[ߋyCqvu􄰖k4a؍)XO Gwx锆y1zy {x|2}s|~hۇwQ]΅S63E}=Y}٩t~/{~7~ԍv~sh-]cSJlјOŕ ɝboi}qwrBugy\CR郡WCDjjHVj{q]f:\bKۊ4X݂CO[gL|ݑĎqTߚo}7usYi]`׃|EWOz W(ZL:ewˋ{]rh b_(?VŁ`HNUw=cxsm,ynUMz^yl{U^|jzl }p,~~fK[݆R+[|}Ms}~#0~3 ykyoZegl[~Ră3Ɂ&˂xvnjRdч[%:Qcòh};a7YX߅qP%9žu ,y<ֈp鍰h`t߅XC8 PmVۢenƒAщ8*whbo$B`{'>~NՃevT 8nN$fȍ>_%AwWpP,%Έ`S(C}=0)uYemŐf+^„wW:XPSk^&׋Q| t7هl!e;,^CvVOnިkUAwւY0zϗ7s dkdD)]9ʆnU񅝅lN삌Aђ ǔ"X?yю-qLj7c_\xZXUB(NC c)4ԣʀZ=x~pӒjiӌ5b^L$[2T]M,q(̙K~Hw)DSoRhIwa$iZZwSDM,7èFT^@ND鄕:_khp{k tDVmIf}`5ZȆS Mh2Mdʕܣyzh=sClQe@_V5@YITSMٜ>BwNy@r!Tk6\nkޛd]e͖l_ڂYʍK*S߃N^hLDž[dž~wޤޅLqvk#Ge$΄_,1YSm2NHH2}ũw>pjS-db+^#Y/S{넨NḮ@⮴6|v1boŞmiuc]א GXnRcM@8F Ng|*uj.Zg (7a9F:[fV$/P/L(Ї|C]yrҢOlqJfB؎`sxZDNUGNP=~yKȁ=ywXzqxx{y{zİ|q{衞}*|k}~~sFc΀xTvTxq?yDBz 5zҀ9?{y6|vđ=}Q~+jrcfTrlwUxdx.ry>y􅭭z{Ȅ|1}q~jcTtvHvqw:Ɂx7ry+z)`{|T}4q$~ b&T=lucm{vc Ǜwoxpay{bz~g{v |p{}bS~ĄTX]tßWeuМ2zvw_x z:{}|"ot}AWa~ZT$rtO<^uj4Ovw?;xtyz|{;n?|ى`}S'[t>Ou@GFvMBwK?xO 'yQ\zZz{d}m|y_}R?~`tTPuBC>v:gw*?x">yszqy {k|% ^}7Qt~Z4]t:u%voszwJDx)!y /ypw)zj{ގ]2|kP~ _ju.YNu %vwe-x/pKx҂yלSuzh{\|(P%}ƄZvԯhwƵvxz {]L|<}z~pǀbJgT2>~"~~N~~{~~J~? ~ p yaT1v} }J>$}е9}su~1~΋ }~Po[!a{T/3| 7-|gF|Ɗv}!}~}~o|~naT.$F{?O{v| |oͤ:|֌}Q;U}ډ{~onC`T-XfLz3N{ij{{K|ZN|؎}cxzV}'m~`FSmz?WzS{3D{>{|zl}Ox}Uk~9^_~نR~cz- Xz]z+{K V{+|#I|$wk}:yj}֊^~siQuz@bhzBhzӧ{&j{y%U{療|du|퐑iz}G]~2P~-zazȳŵLz{9S{teN{͝ |6t|g}4[}ƈP?~dSϔ{{Cs{$h{I{o{y~| |r|xfh| Z}~O~u؋uh[wuxMHuy@z͖|}J|v~nTa`тSS˂La|ɦT}e}篡~dV~蕕%u{!ꀪm߁P`e܁SႬ􂲃dw؃B1Bukz9blc_kS|"΋-PJ #C׀܆z@҅yBׅl=]_S6JHؐhouOyvA=xTQ6kv_FSǃtc"[Uw -4ՏǍ{ŋcw ܉[jQ^/qR[͖vv̙=yiׁcuvmi]GR ˙ Σ1*Vuk%+7: t=thr4/\TQ0uɸɩ`k,1~훺i~ϗ~~er~ŏng7~ۋ[~Pn&̀c׺2攓~ڟx~|~q ~qe~Zq~O~IλހAg@7~ʣ~{~Qo~@TdD~CYf~T#O/~lgZ^u$*Uvk5Awĩ^yzS{Q|xa~Bk_g8Si̪O{\|g_} a}b~55~܄,mwՀRk2D^SRG\jχ{VᆐB΅т2#r)ق=vσN`jǂ^PS< 7 F$ԇ|(˙cjхAuނÄyiقM^.惟S(Huُ]9x'£wmʊ47ހt>i8ۅh]ԁhS1šY5N%C3VsƈhGg]5Rw0񫬄[׃rBʈ΂YQ}͌rV[g23\$QDAمѩJW,~|#miq sf.[D/PЃ(쩷 fP'iɂ[dzoNd2ZM͇jOh I+"$"\!}b!؎<-x΀ؔjmQ1c|݌ Y$sOM ?|dZn/9!قWwDl b,0X#$N~YAt_uwBaxyތ7{6w|uDK~i$^S ¬zٷnu{p|31|ږ&D}~J׆!tZhᄡ]R킦֌ ً((S$oŃyK%o)ue" d[IdQTr0l4ܐs>ȎfC_Ŋ·|܉+x6nMMdZAQ8\Д_1MdvYm/cZ?˄QJ˱ }giFVGG~و;juukbY^P{PmKy+nЍKɐɋj5 }kՏ1t"2jфaÃ:IX݆!OvPW576.;{rӎiL&`ՉcWtN#𑗧Lev~Ή8zP;q.~2h_PuwVENV:BӬԟlVۛexGoх3Df̓O^sUM_O^'tRݘuv"]x7ڐyIzw[|Zn+}d\{Z'QTOyzeS{6֒{􉗐7|%}v拾~mGctZAtQ:,~٤* Ej_TKu(l Mc(YQ#%cC؄ÖAܙ,7f݃+}ጯtk| br(YVQ ȃט=P]'ݎؐ%ώ9k|sEjb QYC+PsũYŎڕ&QoXۄ[{brjxiއnva=}XPnc^ȑ6ϏzڍHyqeh`RW̃7IOwO@Ӕ_bSvxp.g_uW ÅN!ė1PnIs wKW3n)f#$^s0V3XnN@9-@:nz{T:~x_uNJmsяe%Œ](ȉU4M'OfP2|k nϜ}.twЕ$l0cl\ lTWeM3Єbtuvx'}yj{zss|Gj}aɉd}Xف;P\aU)y^zfz؋˖{q|^z}Kr0~PiՋoa9؀XZPLT o~A~g+~ UTyOqXi `QX@アP<䞽=I^Vq$dVxϏ\pth`Z`+΂WrJP.5"r*VwÎoЌPgɄB_RW P!߃Hsod:S̔%O~/NvqknņfC^ԅWOh@'F і!g}K.u\;τz=Cerԑ kdc]HVOZCxЈƀb@yqanj'cA\/UmdN˄!YiN›`A$̊w֔7p刦ib[ևTN4C9ٓK/}bvnjZosh7Ya-[?T9vqMńOӢ[_|Ηulndg΋ `É=Z>·SMUc⊟9{xؓt=&wm!f^n_TYX\RULt3_њezOsl ueR[^X!Q݃+LRu֌XvÅw~xxyq{jU |c;8~ \?lU?|N,i yzJϣLz}؟/{w%|DpE.}/iR~6bd[؋ЀU 7N_}}ȃ뢀~|f~\vLS~oqBhb 耸[v;TׇNXɐժdj`dӏZ^;X׈1RʅR?LdTƄԒ}3w pyڍ/j{c1]׋`X,R!݅L|uȨ(V| u⚽oXhlbގ͋p\͋/WQRg LI |y{t䚀Nn_AgM5au[ϊV#HgPdK򄓉v!w}ͩ5xUwy:qʟz,kD{`eЖ|_[~4YS{MꅇV-zYHz}V{ v{q|[km}>e8~?_ oY/RSV"2MU}nn}|iw}v?~3p^~jbd9^X㌵S2M#{u|oDiρdt]^4N1zAns䠆nЅ9h2ab]MW֋,R)3MzRVyIy4=sJm+E^g_Նa咆\njpW@vQMeP~ThxcSq Mrt!Uu|vܐ8Qx5 yzzm1|kG`}Ӆ3SXF+prs4uנvuZwё?y5yzl|_ }g$Ri~ڃjpRq̥ksX;t!vwsNxؑwz8j{o^!} Q~upIq+s1AtNuߝvw4xqvy(i{H]|P~pýq̵sTteuۡЍwxi_tSy`h zs[|XP#}ʄ pr+jswæAttuצw 7xC-ryzxfzZ|rO}4%|4r~|t|uֲb}\wg:}y~Bzb~| ||}rn1~`܀ES@zy{Yzн{{|h||}Sc}~2~6~{~m`mnGSv=Xyb)z:s&z灈{%|! |ӁÈ}z~\m.+`ASjׂkhxyDy8JzRPz{_ |!o|y}̄Fl}~_2S`xvw(exW}y-)yɞzg5{w|Xx}@k~9A_J*SV wvԗrdw7wx詨y[Νzvz􌳄{ڊwk|Ɉj}Ɔ^~R9ΔvEmw3gx+x󕳛yݎz/V{uu|ai}YX]~KQBśvܿlv vwОEx6yZz1{Nt| h|\}ㆹP~׃ʉvyvШ~wxaXyAy!z͓ s&{gv|<[}PA~xȆv4nvŮnwqxfnPydyΚ};zqn{o6e|KZ}1HO~"Ɛvw*wѮxj5yoly{znzo{50d|Y|O }؄*kzq Xs5uZ|v?xz$=+{yKU}=lC~_k̀NSΜ0xK/y2.zހ2{8|WW}~~xXfk X^UCR<"%w<]AV<qŐ Ewp2j؀^1RD~侱~1^~aզ~^~莢~Evyj* e^/vRҀ}!μ}[}X}̊4$~E~N~ui]ԀR "|v|}ǣ }@U}{"}ˋj~)tK~ h!Y]R(!FP{v|EЭ||ۓm}}e~s}Ìar~3g~\*,QC{K{<#|%|EJ|R|'} |}cq}Ќf{~I4[L~kPr7a{A{I|ӝx|G|uw|M{[}p7}{eO}튋ZZ~_)O~҃׿m{կH{קH|~|>|Z|y|ٔCn}3 c}Y7~O~x|q|%|'B|6B|BÂ|mx |m%|b}OX;}N~)!ΆqTs5stv6Xx9yт{xu4}i~^ WRxxywxz({|=2} ~ui8e1]6@R[Wy~~΃Qs-NP΂Ct/)h䁦]- Rf5$ɫv҂f)ɂ݉Ӄ~ks?>gg\ɁWRKOʂ}Xi?P_ʈK-}}rVLg@|\mR3ekt"5׋.|q$xRfVz[QS/ZԁNÚ̀oc>QzEoӀ EeLGZ̀^PA]ѣ瀮ۘ_!*uېsyn-dRYOiI,r!zؗ*"]rǖ܁w`:mFHc2'הg1:znmrPi`s\XZP=<՛בpNM+eς-ryÄ(qXhʆ`fX pP$4o'Tފ%ȎS"ֈyĊxU4p*g̅c_{WkOq֐i>Ode Oxvmn2f^VNف5-&KRˍ{<} uNm>e]ꃍU^N'ܞ-ȏߗ֍T|ы|tgxl{#Q{€|ny1}r}k$~c^\U NT\~ˍu.+@ x+q"3KjUic=^\K UJNT; o}`w-Sp<|ib![އU>TN]O˛!ǃڗՆ?|ʔŅvLo(h%aʉL[8 TN-א֋}W{Ftϑ6nb ga`Zw Sل?vM󏖝xψZ8sizgҋs}lGf0`YÆ$S8DŽL~ S2;2ry8ur\kፃaeĉ_-LXRTtLb%8Ǚ~ؖSw0qA j(d\]]W7QKꀭ9W}!v’p%ǑiُcZ(][V͈xQzKKWKir‡#t ȠEuX{Jvuxn{yh5 {Wa}ZN~TTNvCwbxzoyt6'zmŔ{gM}`~yZTN |EGzd2m{{y|Psd[|m}f搘~`wTZ+S2Nxɥw~5E~~x $r{l=,f4ހ_ꌬ0YˉSMפU~!w]qʁkvme)F_b YpSLMR҉Ԥ݃M>~}W!vp&ij̄+d^vX{S MكޣH{ш;u5oiE+c]݊X7RlVLR 7AgzXMt1n"hɈb捋,]uSWzQۄL^Մ$N)yRsSm^gZb\M{VۇUQ;&=Kg8{?xŚir~l[f`G[LUㆋPzKqKyN}ewšgSqk e`QZo+U "OԃNK[Rstz.*ut~w4ox{iaycᔦ{^ }OXX&R"M`F5w4~wy|Ʀ4wC+q:lDWNfԕia\JWyt뉀o idk_g?ZZBUą!PcK߂&8?Iy`~sʟw2n/Fhߗc2^iYɆTKP KjK~V7xprӟm8eg閱bÊe] XSTцOTzfKU[}uw7qlcgTaܒc\􎔊QW툱SAg'NJiځsn)u#pvUsw|uoxvyx̊{6z|||Bn~}`}S]+ؘr`vTsw=uy;vnzWw{xy$|Vz}{|~n }`}SO֜p~kmrg~ؼksOJumRv2xeV.yz{qmU}P`~SB/ԏo rq6rPt{꠭vw$yByzۃcl|_~"S6ς0҅n`ŀp q\s6uC MvxxzIk|_P}S+w{nmuFloNPqsϖuۀwOtyyhzʼn\\|yVP~9KFl?TRn{p qɞYsbuDdwms1xgzk[|.P/}݃;lar=n5zZpaqˣLs}u%}x}vz yBzz{|k|}Fx}~ak~_ 퀒RÁ}v'}/w"}x%~:y~ztYuɗW vMzx4`}'y}sqzċf|[Z}UPM~Sqŧs tZѝu>vZw딽{y/#pgzpe|{5Zl|O~:qծIxsȧt\/u|ːHvawĘyxnz,d{cYP|N}ヹrs0ʥt` urjvMGwZxGxʖtm]yb{X[|PVNy}0~n)~Op7H~r`~tV-~v[bIx=z(v{/{j:}^IR[ہ\|u}vh}_wҤ }y~z` ~{|u~ i3c]πR=qĄ{`{{||R}Z~.O~[w:ڭwvxyI'yO}zx{bm|,cq|Y}ʆO~wC7w/xy3 Iy͚$zuEvk{'ol{䎧b |X }pDNv~8wkw֟$xJy|y*zLWtzj{|`|]#W} M}߿#*mfor$]tz'v x~ysT{g}\&QAhtbuɨRwAdxIy7E{5}N|rie}gHH\EQ؁󻤀zȱ{|X y} t}~r|y0qf[؁9}Qu;,GHio#́{Qp9e򀂂/[r˂WQy ~~O~~υ~zWz.Yo eR [f%Q[Â.}ˍʫ}{~!~3h~TH~3x~ч n)dpZaPǀPi}.}b9}mV}M}4~NwX~^mN~cp^YsO΃/w|ؚ,}ϝ}*h}P}t}fu} l%~Ib~XO2Ub|?F|ŝG)|E}N}&Q~2}\lt}j}싽ao~EW~;N~郏|{e؃\}[qQs̴sЪ[u<v+!xtyptzy|Bo[3}e'/ZQF8ԅyƩ Oz{z=|B}CR}x~ndMZ uQׂX(dXڀ:+fu񀴀wyICmcف́Z*DP{q셤zPRL2Zvalxc=TAYˁ:Pс&ӭ5͊aՇ~KSuAkkbdׄYP> JJCҘځTZ!q|̀ۊ sj{yEan[XCAOo(;#@ޕ 8xˁ{jkrv0id`)WzʅGNi_Ş؁--6ǔ\\yq(ҍKh8_ZV_N :b?ǁ{t(xmҒofR^=&U~My~փW73|ˀwrnhEe5]"~ՊT~!L~~׭&^m֤+oЛDqܒsɉuʇwvym{c}YPǃ ;sitؙԉvTw͇y~zu| l2}b%"Y\P=+x yԘ\zďT{|}~}htA~^kfn^bBqY!wPq?}z.~q,~ϖӈ$202:|JbQsjׁ7aXz:PJ₺UWǕXT~g|zW{7riEaXeP&7aS ʇbnyƄqY`rh`C%=WO$ $5]_N.cxap䇲g@_ZzVcNҀQ凨'pŐ܎Cw)npf̈C^1V.N {9fr|r5uo~vuÂʎ?m e}e]LJU`0M}~PņURO4̈́Vq|XtJlLFd1 \TeToʆBL3ćO֔*EՅ0Pc+{5"sBkpWc[GSqLy~ۃޤ6moۏ"rusMuzʊ_wrlyiw{a}XKO݃.ɑs&t(v'5wxyzhq4{h}`u#WBOoYx9y94@zA{,C|x}p~h3@2_]ẂO揘}N}ӏ̌f~]~zIw%oۀUgn_TvW0[;OvNsĂ^L3krz[(y~wvn~n1f^̓V߂OXiʌ쉉},uFׅ(meP^ yVCxNց~Kw{\Mxnwt {ćsYlj#d]3U@NsӍ^ŋ%zv(rBkOc\h-T΁|MsxC˖FDAf;y"Ɏqj)Ib)[7T rL߀#̆zv. wp 0Ch݃aĊZ]=S,L\ؕ ,O@}ۇ˗ZveEznꑠg`qlY`J)RjCwKM8n]p:}r!Vs}1uu+wng0yfF{^c}VO`st^uՐqwZ|^xthz@m~{eЈ}q^,#V_N~wCx&yz{}{t|lÉ}e& ]HJV N˃ٗd|]|}~zb~s @kdti]$nU2ri~x;t2wvqwjWycF{\Q~U"~EN;S<s0t:u}{VwLvxp3@z3i{bx}r[Ԉ*/TՅN%ʐ"wg|x_'yZ|y~zZv {]o`|zh"}b~[^BT|Nu{\|6:|{k}ru~n~h iat4kZQTGAM8ڙχ?& oFzgဈt Xm gb|`܈Z~TTM살i#xƃy6;r|l]hfp[`WY݆[SoM};v!͕䇞~r:wqʎ+k{؅ei%_-Y#ZRރLہ#]kl}A}vӐ3pjq]dv$^Z Xu KRCLG:ψޗN #| SuɌsoB"i`cy]vZW.QKƀ̃里pz%tYugnG药h-bXHW\f&VP؂4|KTk?;uy”Ts8,-m0g#6a_[|U҃P/υJoq]}^rw.trvflx?fz+_ԍ|/Y2~IStfxMst}gv,wDwqK+xkH.zUet@{_Pd}YMNS4܁Mv<􇸡"wLȝxJ|(yIv4hzGpY{Fji|hd܎}^ҋ~XJRYMg΃*Ƞ:{֜{{2|muM}o}iՐ~d4^^LIXpCRނLMYg\ɟl~ߜ%0zDtmnْ7iހc]ʊtX/0RlMM~ћqy3)sdmےh.8bz]߂W]!RbL炏Ğ S}Ț҆xrN`l̑g0aҋn\NW7VՄ QdLO ̂-|Nxw qM kӐOfF*`s[مlVdWPdKŁ灉{ߌvpFjѐeR`ZƈbU߅P`tKL#gÑzz5tזAo .Wi"d>I{_YχTDžhO?J„WQyq@{sԕn"ۏhɎ cOF^0(XS4OJn%p{r-vsq\Qu.l_vgxa{zn\|jW;~}QDL݅t zuIuvpp^wkxf~+zwas|\L}VlQ?LԄewsz)xWu;$y9pzz2k{-e]|U`}[~V[SQ,L˄N~zy`{ctpB|oH|ja}ieM~A`m1([I(VJā6QUWLÃ~}Ϥ~x5~nsl~n3i1dƀ&_xZ݌J_V7 Q-5LU|=twwrǜmhڕ|c_,ӂDZBUPƅUL]܃|+vݟՄqڜYl˜r#gc ^_BYTP?'KςW{<*u?pz kᆂgTb?]!XTrO„AKNރz\}upkbf;Ԉaiy<\ٍ?X9SчCO95J݁ryyt&Wo|j Ie>a`t[ƇWYRNDžJy$x/sDn@8i.dd _[%\RG@NgZJ%4q-jdrm %soucrbvtkxKvFyxyR{zlL}K|_8~RfπoarF‘pskruê t?wJuxؑgw|zKy-{xVz}k|~z^~RUbmyozʴqk{as(|Tt}Uv~x~wfzV{j|9,^\~RE]lCpn:pCr!tɎuӂwҁvhyj${]}R7j꼿mBo/q(+s'?@u|w!ury#6i{{7w]};R)DƻiӐ>lծn_bpmRr~t<vt/xhz\|˃Q~ۂRhwkSDmÓo_qʉt~Nv(rx9gwzQ\|[P~l hj՛m:o^ꓐq sK|uqwՊfvy3[+{P ~hCjlTvjkvl8wo|xqҚyt9Gzvk|xvV}Czj~|]~Q=YtQqutsbvu3wv̘xxmz y`{S{}ub||i\~~i]`lQȀҁ+irxҸtyЭumzۢYv{× w|yB}Dz~aty|1h}\~QlqqXr΀2tQuuw @xxyNs{twg}\~Q zp;q8sHtv4-w}yG8rz߃gX|+\6~Qxo@pnjŨCr*tvKuSEw2|mxq]z^fo|[}PIinHƱNpߦEq;s"ouVvzxKp yeg{}i{m oCprzyt utwPjx`z0W {ćM}azjW{SlǪa{oU~|[q|t}v;~~>xyse zg|\v~Q_y5q!-yrߨzt{CvTX{ww|y}}{3ry~g|g8]~W\KQ@=U wwڱjxx yqz bz:{{|7{|||}q}~f~[րQ#ف+vo~we~JxaSyDnz({d{v|!p}1e~Qg[6gQ{FuG/vR飙we+x^]yWz`zP{xo|1e@}ւZ~P$9StVuyʡvۗ`wFx yɇ"xz8n|Ld`}[ZZ,~lPdys(tɐvw%fx5݁ayPZwtzvmW{Scb|YT~IO8òvstOTuvwxߍvz jl-{;Mbv|v1X}N~Ńr̞˦Is>u5vPL=wix~Uxtyjzߋ8aj|W}[qqs,4v{yx]pfzé7|[(~P +~p~Wrn~tI~u w`yEyzo-|e~HZ$P||v}xI}vyN_}z]~'{p~|{x }n~ds!ZMP@ɱ{}9${}|p~J|~ċ=}MAm}w~[3m~c1Y@Pz%zoomz[{}JK{.|~,}v}l~cc2#YڂtP[TFyz$2z7{N={ۆ~|yu`}#kk}݄bZ~XbIOҀx͏y|Rez.zƋ{Ys}.{.s|j}dah~*`X~O ԪxXy—yAzHz{{:r|8]i|`}WN~oNZxzS3xz0o{2f|D2^F|6U}HM3~Tpwxwny ՉVy8\z$w^zn{Xze{]1|[T}VL~˄zjYlo*Fpqo# suw?xEmxzcy|Ym PskU)pDr !sقgu˂5wJnxv7zl|rc~:Y|PG|v!dwWxmny~Rz~HI|u}v#>}~}vj}ύn3~e~A]~jUY~ɅVMAI<} Ȗ}**}I}Z}J}h;t}l}d}D\~,Tn~hL~tr}%}}#Ԅ},{}2ss}MCk}pct}[~}ډS~LF~JY`j݈lוo:qvCs{usdxDjmUza|XF-O͂ԁ̈pc^qϔJsĆuWx[wzބxrm6zi|^`6~9XʀOkϣ:uuCv؅xny6@}zkyʃ{q|h܃~.`RWUOxz\9{Y|d*}}x6~p@hz_*WU恗OQTƀJ؄HɀćPׁ.wxbo%gF_,VQO.Tl9^R/~Q/v?ل7nbfNW^h+XV_N܂ɜփF㔣W|ၧtTm0 'eEօ]]U~MSŐ(b>CJ{)s؉lWdO^ \2TzMKԃ/udOsԁ1z1ĎrpsKj,|cH[ƆT(Lc[0eÁ˘$d?x~Jq %i֌bVZdSH1L7~e-5~ွwg@MohaGY R~؆?K~Zj͖*mouڊq@^swH>vos&x^gGz_7}V*XNG%o͋qksuD~{vv@qxnnzfx|^^~EV"N˂ۂ tjv>wix|zuD{`m|eل~^V23NtHyzɊ{"|x{Ά}Ct8~l҅~e;]xU܂N$~琝Pezjs4#kVdg}]UXPNm4ڏ7·5ŀDy]TrejރFc+\RvTۃMC%4q xʆpÃi<[b[>TDWMH$" }ą3vJoshÇcaZZŁ{YS݄SL@Pd񃢅|lˍuzpnlgXa`Y dRmL#уwb[!h<o[z_tdmffdo_GkX܀mRyKnˇ3ć7e4 y@rڃJ.kreWT^WA\QdKCtkDxms͏o=qy錉srv1k\xvdGz]d}!UrN#,XoAqsxFu*x݋vqȊ xjވz|c4|^\x~QUANC:ݑBtuׅsw1~]xzwڊypZ{j|b}[CzTɄMڂy?yz4z}_}{vˉ|o}iJ5~bQ[yT|M҂v?Q}x~,(~|B)uƉ)o ̀haT'[9T5&NM܎7Pqkzytm+g炣`؄ĂZ[SMKֆZ\FۆyfsJQl†fqd_B;Y0S$LGN3ZҊq~Qxhrpk%Beut_ɅX肶Rg/Lo⏟dm}?w'qpjdp{N^,XXBQ8K7(h|:uň*oiQTcJ8]舊WΆPʅ?K)փ\L0Ӗ@zE>t͒'nsVh?bL\.VCgPUiJ͍k̖tm+pzrtt5n vcg׋xa:zZ}KSMg+既p cq$syu/svmLxg#z`|mZB~hSVeMQktGbu~ؒ/vxx8r ylzfx)|``S}YІ}S_ׁM<7xtoye}GzYw8{Lqˍ0|@kF}Bel~L_gYaS_M)тr|h}/|l}vc~\p_~jߊe 3^ XzR߃PMs7.ʀ{t3u|goȋi܉ہd#^,zSX^RcqLA .#z2tC]n 0hƉPc&]TWlQƂ탂Lxh~hys"ImgňΆ#b=\zW Q6rKn*}ywюq&lk$1fY:aJG[ZVNzwPKБ |*vlpk2e_`80 ZUbZO灏J5ȀՑzt?u]]o_j#ed[_K̊Yׄ&T&OK,tJYl&5nylpt\rotiZzvcҍx]}{3XG}R^LtZp|~C/r$yfssuqn?+whxc<2z]|Ww~R0L›t>}T1ux4tvrx5m}Rygzby|c]&}WQ䅬1LҁȚw|]?yw@zq֒{lx{gF} b~&\}RW#PQ0L$Ú{{d_|ivS}p%}k䏧~nfL%as\ ܀VʆɁyQzVLă:@tzTuA7omje6`e[`EVDug7pΌ7kSfό aԊ]dX[ŋWkS?jNكJuBpݙloqGgݓscF_*Z ]VrRNZ>J@8t,okpfߒ/b`^79ZUQ}]MăI܃sojfjaN]fɉ1YTU- Q;MCIncfN{pi7qlHssonuqMvt@xvuzry"il|{}]~}P lkm๠n]p]p_r@r2t*t vuw~wyty{}h{}6\~ ~P4aju^lvnx'6qyW s zu{bw%|sy?}h{n~\O}P̀ h|ȵkL}Zm}o~rr~Ht:a~2vlrx5g[z逕[}&Pl gpilɝnރq(Tsi} uqxfzk3[|Pvf8?h[ks nDpoZrĆ{u"pweyZ|MPa~лe4Eh jmmSoo݋r@%zto`wdy|gZ{ڃO~>*d&gmڣ-jTVlג4oV߃qōxt9Zn-v#cyYZ{qN}؂}d;gOi薌lsn|qhw3sߎlvH5bxbX{NX}}Ǵd"nfПKiџ"lO(nǗq0NusknuMax\WznM}, d+f訦iLl.n~9p~t.scXj'u?`gx3Vzt0M]|Drfm:tAiDul?vnwq yBt.~!zvr|*y gU}{[i}P06qmqrot'qޝ'usҒvu·xew}yyq{{`f}@}1[`~~PqEo]tqu;rwqtfx1uzw{:{y;|rpz}e|~Z~vPbtLauvNdkxNnbzSzX|GNf~9riPȥHk(\m~Wo܇q4}s폗tujrwiayWM{XM}ڂԭsi'Rkqƙlm˜}{oș@q|srui wi_yCVZ{$MM}{i,1|keOmfo@qzsxq?un gw]E^yNU{BL}:I.wf xmiQ0yRl<znߏzq{tz|vo}yeK{ZD}P vf\um7SvoSwqxsyuzwky|y_o}A{Ad~}-Z~O ót%sҩuhuEvvȖwxXxy{_zzx{Y|nB|}cc}~YQO݀rzgt{-@u{uv|x}vyL~)wpz~m_|cZ}y?YZ~OȀHnqTr tv6uЁSw%qxv\yl{lb|Y~zO񁺭p?D0q˚sQ9u ӇvrS~dwuyZOkpza|~3Xe~O: oVZqhrEvto,z_z}q{h|B` }W/~ׂN$t^Duivꉌ)w򈮁xxypp{g|-_*}CGVo~Y[Ngmsˑu TvSIwbՀ+xi^wywo=zzf{ ^W|υU}%M`~򂱠s^Ә'tݏuv~xv;ynz&e{D]j|iT}~L~ s#oWteuj`v}wLtxǏly֍8dXz\C| T}!LW~,#:s tB]u}уv{wssxknysc?zW[D{>S]|φ7K}ۃRhf瞴iNlVnq|4t s|'vjbYy'aY{X~>O.7̥"l'`nהq1su{*wrhyi{`})Wg#O ρ}r~t ]~xu~wxyVzq{hҀ}`~~WUNlkm|hxD|y@}dzDj}{3C~|$x~}p~~hs~_VNȁ{:}f{~iX|b~ |I}Aw}o~E}g>~ۀ^|CVNz@z烀{m|O~|0vm}nz}fG~M^;~V mN1E>Syh z({zڄ{x5}{u|mE}$Be>}ʄ]c~xUQ8M~x֎\ytzTO~z{{ss| l&|dH}P\\~-T~LFxby"Ny吤zzz[{5r{~j|=cC|[}^S~=L`~قx>xޗFylz6xz~q({NFi{b|Z}9S}݅SK~x+Awnaxyo yUwzwo{h{1a |>hY|戡R]}K~$V}ig9~iԏτlDŽVo qw܃to߃Ovgy?_J{V̂~hNl nspㆁAr~΂tv͂vnyfȂi{^J}5Vi9BNn4Rar|sfu8;=v}x}]az&}ksS}nlb}Ge}^}ڊ{X ~ QV~LK ~e%gGYj5ElفoRzqsw)tPl3ovdyk]&|UM~MD-lnňdpȆryʅtrSvk`yc{$\}OTlMyqsBPtvyxxqyj{0cB||\~T3M<ՓGRv1wkNx~cz w2{'p|Ci@}fb~[{TS'Mq܂؅>{wׄ|3$[|}6}vZ~Eo~h邌a=C[T MZUUOU_{߃$uMXnDgaZet'S?\L ܃7FztPmQf؁d`)%YRRွLXˍApERy9ŕ?l7/eۀ_QXvnRHDK̀j!~ٌowwEqkd׀q^j8X.{QքRKT/* 0wȑ}1vp?iڀYec ]\Ј)W5PqJGY͗ {9uJϑo]hȀb\suV^BuPFjJ~~h6j׌}m+|A5ouro:t}hwăqy[d|4Sh~Lz^lӇ㌉n܁ap{31rttnXvgy a-{2Z}gSL ȍqYirStz"9v3swmyfg9{`%|Z=~SNgQLՂ `uc[wXVxWyJyr=zlF{ftY}!_~hYS LÂ=KnUzd&_{6~-i| wh|qe}k}~ce._]Y+-RɂLႆm~߂ΈL|݇vp҅xjҀdĄ1^LXROYLQl?z̓G{Rum Go;i@,căw]ŃW߂ QKĀB.KzF\t>tmn{hwb؂\GW:Q( KCu#ڇ|~dž3yۊcs mWgAaむ\ӅV2P.JӀ NhQ}]IwxqlPfVՊ`Ђ[c`UÆ O3JptƔ|vi ;p7kIeTv"_ばuZAT̀bOI؅1J_h9kC|k{mvoprQjPte"wB^!yX熤|kR8 LJ܁mۑo{ngqusptj.{w dxy%^jv{PXv }R;L=isq9ďrze`tqtv o40wipyMc׈7{]|X w~Q1sL0?G~uZ~vyOgwsynLOzWh{c'x|]W)~MWQL$|{yt}zZxB}{Br|%mkx}g݈}b{~\΅WBcQHL9܎}|P#~w~q9*l\ff/a\=VفQɂYKĂ耰ʁ{guڋpik=$:e߆҂[`|[OiVRPFK=E`y…ptg>oSj4dHw_ׅ6ZU}ՃP ̓JŀуC~x8ssn8yi'.cʆ^􄔅ỸrHTЂ`O^ J]jj|ό&wfˌrHqmgb܅U]X߂S셔NހJ{‘vv:hq-k􇥍af:a]FXS>bNRIizl u甄nGpNpk͐rfu0ahw[z$V|Q OK7~ޗmyЕozurqloNsWk 3uAeލ'wH`ً'y^[7{V?V}P΅K/}閵qEx唐rt.rto!]vjQQwe{%d:|*_i}@[#~ZWSP߀ÓK Ӄs{Zod| k|g]u}cg~Z_= [@|WZRPNK_JÂ^2r~nj6fsĀ b^w^iZ~aV`ˁReĂdN>ǂJQYq]miIe!ga‚]Yˉ^UɇFQC3MփN\Iq}p0lʔS hۑd`ڍ3\ۊZYل0U%DŽQe˃MdރI p3vkؓψgߑscď _茬[p X9QT`F*PSLނu5I@ojXg"bT_6[0WۆSՆ(P]LkHiнkbTmeToghq>kʒsnuq} w tqyUw}f{z8[ ~ |OtTii|kk&mnop"rsCut+u|{vcwpxye{&{Z}}OĹgzpܮiralFthnvpw3sHy/zuzp x|.e?z}ZM}~O.exh:yjzKme{ 9o{re|yt}o#ww~dzRY|O=c@fiՖlEnTqxt.nEvڀdyY|?O~ b6e˟h`k^'n"!pׄwFsm,vO c3yY {́O/~}Q)al dgNJ%jpm~pE~usikuԅKbGx%XJ{YN~`cՑSg #vicl匡~otr&juaiakx1WzM}`1..cTʙf]i}>lr|oQ-s6r/iut`qwχVzMX}Sg_u3cqfSeiBd~l0azo jqquh^t_:wyUz=L}_覣]bf$TOi kyn˔pqqg2thi^-w-U ybLv|pbmqyerhtkkunwqyy0to/{wd|zTY~|O,mi`ok֠3qgnfCsptsvuZxxqwnOz`yc|k{Yk~k}O$rlpGmr osqu3swEXuxwwz{myy|cT{}Y}O ajAw#:lnx4nyP.pzYr{it|dvv}^ly ~Jb{Z5X}Oh}pk~N,mk~o#hq~tuv;m_Ão͋Gzr5qtJhw_ypEVk{ƒMa~*=elgTjm8l oYyqȌpWt:glv^y U{aL}yIdНjgz6j1 2l_qowq| nscf"vP]x T{ `Le}]ddO\gVili|nі=v;q8msev\xgMTzL}QtZbupeΛvizwkSxoyqvr{Htl|wb~>zpX}NFҬrYiFAskKun=v_pwr~yu4unzwk|yb}|X8C~Nڀ5po¡rqssju)u!vv}x3xtwyz:j{m{au}"}W~Nunv8pw\rext yZuz|PwU{sny|j z~ `|W~\ Nmi|oK}q5}r~3t~{&v;rmxMiUz,)`P|W;}N>"l,ʜLn2p@rsyu҂yq6wchTy=_{V}}NQVk"䚅mI4oyRqlހsWy!;^{U}Mx~ځajk䘶lSnƌfpƋ)wrvtnvmf=x)]zUJ|L~lAilnD"3pIP}rK}utImvHe,xF]zF4T|.^Lc~ ix"k͘npb|jqt-sl)uQcw[y쇆S{օ#K}̛i~pk(TmŚ=oQ{ qirsjubwZyS {K}hxc Gygfz%i7zl${o{|qs}iti~iw`~zWq}INU Hvi0wkZxn#ypvXzrz{ur|wti"}y`1~|W~>N?>kuoE v;qwas^x{tł!yvyzxEq4{zhb}{_~`}V,N*ـásuVgtvNv'wوwcy xzFxsy{up:{%|g|y}_ }~Vc-N{r${Os{u|v[}Vw}wXy ~oFzl@f{^}YeV~ŀN%cBp* rI"tlu~&vv x]n ýe{M]|ׁU~LMoYqtssPitӅ|vOtwɄlyD6dz˃\|X1T}ςL8 o@p틚rt.{Cuskw?kxņczR\5{ℂT5}[nLn~łVn phHrqsyu@r$v͊rjxYbyU[Z{zS|.K~_ng2pqѓ}samx^t_pvuNi\x@ay#ZL{R|K~ؕXn8ፓoMq~qs&wtov&hBwp`y?Ycz̈(R|IK&}}cl}gf`}ij~+lJ~o7wrotgTw^zV[X}sME{Bi+ {kz|dn ~|p]~}rv~!un~wgfky^g!|U~]Mׁpynڔzdp{r4{tm}|v=u}Bxm~ye~{]}Ud>M7x2t yuՋyw.zxw|d{yt|h{ m}A|Te#~#}]M ~UOMځ?*vzwz*x{y|{8z}Hs{~ l,|~dl}\~:UMruv刖w/xsyy怸rbzk{4c|f\~ TwM"ՕtŅ?u†w-xv}tgw֍mgxfz6_{#aX|DQ}RK~Rr𙼇t'|u`Byvvs*wlCxeyK^zЉW{Q"}KJ~bpcofljہoilrl{@voisr~QU~O~YJ1!o|e|t|v|鐄p}kX}=Je}s`!} Zg}PT~AO1~I~҃Dze&g}܈jwƇmQq/pkÆireu_\xjYb{KRf~$KB k ipRl|ŇnYvÆpq6rjuyTey`szyn4x{h}|b}]d~W^QhK$(H{}t|Fx}rr}m~hg]b \`̀mVρPdKa7d݃e|*3vĂɀq7nk$fria#z[@V.5PrnJ怺m8zׂa&upɃj߁wey1`FZۀeUAOkJvH wyɇtVnY*؆=T:N4I8|N,v{q؀8l]g bsЊE]X`wSc\NGJIv<^N'e|hw쌑k+rPmmYplgֈs!bwu\xW{Q~gK7I4j{팙lYvnnqEpl sguiaنw\$K#V|}4zewqP{?rn|m|h}c~_)ZZc+UOۂ!Jف{UV~WvF~q_lgFc:^J$YVցT6O_kJgz_uǂ}phk/fbb]}XSSN*JxˆHs(oJejz{eՅ.a0!\wWلJOu&ycqyz_mJX{Yh|Hd}1`\e~\#1 WSCNJ]݂tF|pn}l<~WgF~cȇ_yŀ[WVDRqNAekIes{o[-k?Jf򈝁b^^1Z=V^~REMځIr΄5nN0j>H,ea̓]҅YلUQ~MjtIBHq?m2ni$d~`DE\X eTQ oLH@mpl‹:l*h.Gd`̈_\XBTDPm-LvńWHshowj]kWlgݒ0odq_ҍt"[vWXy|S|CNnJLrڗlkUnKmmk68og2$qcds_Iv[P(x]V>zRe};NIJԁr ?nn$0ptj/rDf*t"b͎1u^njDwZiyV|Ru~)N' =JchЎheQ4at^1Z"W, S*P-LLw;\HckqgڎVWdW?`]J.YVd R愓JO-LӃHjfˈ$c|_bD\YRURJKOÄKx,HjGi]k ax\me-ohq)ls^o[xurmx,ucszxX}{NQH~fe/$hhkDjmmwop^rirwtulwxbzHzXz}|NY.dglcFfn}ippl3rnt{qzvvt(xlvzlb:y|LX*|}N`qbPs|me-tܚHhvHjwmx~@pzGtsa{kCvB|ay6}W|! Ng `uzqc{(f{bi|]l}D}o}sr~jvuaxW{ Nm~k^9b6DeQh[kӁg{njrqiiwuW`Zx6;W{GN ~Pا]ߝa4 dg=k]z>nFqmqm)het_wV^zӂMp}G\ŽI`A Uc͋ˊlg"juWxmp?pght^wJSUzhL}%\"@_c4ڈfJi)wm;Qo p~yf[s]vU z Lf}* 0[К[_Ub敱fEH~ivlwmp*e%s`\v6T8yK|܂]H[j_ j2bjej}IiXltlrloގds[vHSyvK|m!^onapfe~rh؇slD~3uotwrkKyua|yW~`{M瀲~$je> lh ;njpm9rpV}trsvuj}y,xa{zWT}}MDnBhlMjn&m%pYo[rcqtv{svosv+xlixzZ`qz|PW}k~M٦]fri4t1ku,nwpxzryrud{Khw|_zv}V|M}=ydyXgz+ej[{l{тSo~|yr }cqt~$h*wD~_]yzVu|M$cÙf^iB-k`nxJqOosg6v^yt U| M~bD 4eKh\!{k*Qm]vpnspf0v2]xUD{L~Kiaq(hdz&Ig"jm$}mJ&up"mrekr'ct[6wˆS7zK}6oK`G~0cQΉ^fb"\iDsyl!qniq؍rbtZNw~RzAPK0|@q5^蜟rbJLseʋu5i@vlozx#oqyrh{{v_}Yy/V5|5MCuoeVphr7jDsmuzpMykw0rpxuhzx&_A|zV8~}v}ex~]{1[UZ}gMhǜDh~UAj~l o;d|qtsm"vaexS\zT|M !'fHiylănr{lp΃Yss" kuudwЂ\7z0KT4|wLz~fhPJkBmzp'r]r'jtZcwW[yS|K~Aerď%h pjm(xooq ritb&v_ZyVR{K}8eDggkjT~~lϏw;oCoqht$(a v=YxPR={PcK }SdߚgsDj }lun(nq`gzsҌf`vBXxQ{J}DuF_gzvCbwBf"xQi\~yelvzon{s ff}'v,^~y\U{|lM!xs4ertsh.Muj_vm}xIpPuyrm{ue|{x7]~zU'}fM )qRkm^rmtBoτuq|w7ttxvmzBx*e{z=\}s|\T~XMHtoqbq>rgrttv!{av/wswy=l3y{zdN{.|K\}|}T~@LInw>5oxGqyWysqz\z;u5{crv|akXx}_cz~P\|i=TK~5Ll|n}yep}r~xxtb~qv;mjLxbyI[Z{倩S}LM]kmołv~qlw|sdpwlexQhMy7kz&myu{pWr|rj}ucT~xJ[0zT'J}Lh"uk6rvmawoWxqxezsq+{-uj|Nxb}uz7[]~|dS~tL{spȋuFrk'vt~wuwIy wWp3zIxiJ{zb||+Z~}SaQLΑtrvFzswhuZx|vyv6xzoCym{h~z}af|.~Zl}!SK~!L}Qq>{r|MOtW|{~u}tw@~5n"x~gzi`{Y}|R~~L!߁p8p Yqρs~/zu Qsvvlxfuy_{ Y|R:}KbȌoQ*q[rmxtU rdu넯kwwLe}x^z~Xp|Q}K$~nY|yR~LgxupGyTqz3syf{ u\s/{w l|xf_}zh_~i|Y2E}Rw'mL $wuex v~y wxEyyr/zzRk{{e||_#}}X~R72KNuzq>v{7}6x |vy|pz}j{!~Bd|$~^`}/X.~;ZQBK@tcu{w8uxUJoykiz}c{%]|cW}Q6~K"{sLNu5"znvut`wnxǃhypbz>\|V}:P~KJMwvwӎvqxAlyfgz b]z≏]m{UX@|oS8}=N}RI?~ b~exhs kmƄenhqbt\w.VTzSPЃ,}rJу i]f|i2wkr.nSlbpgX,szav \4xV{P~>J͂)k{m>vonq8qlisfPuaX;x$[,zjV-"|P^%Jɂ1;぀oz|qMuxsp6ttk-qveځrxl`wz7[2| Ú}P*JŁ΁~9sy]MuRtkavo=sxjOyez` |CZ}Ur  O=kJs}GxCxDyKs5nzTn{TiG|Sd.}M_? ~DZ D;T1O"J} |~|v~]}*q~}l~~nh0c2;^bs/YRTdPO%AJSz}Fu} p}ہKk~}g.~^bJ~]~X/4S|_N͂}IyN|tU|o}7j}wf+}˄Da_~ \~bW~SH `NAeIaw{s|Znc| i|ve}F`\}L[}酴W~F R~_M Ifv{q{&mG|>:h|Ed|҉W_}}'][}~gVi}VQ~PBM?~/H+|ߊGcwuesShn[ki"n~deqt_tyZZ wU,yzO}J1j{ψg+virfrl&mnhՆ#q)cޅs_v_Y\yTЃ{Ojd~J4-zhk9um]qnDolqh-sc9v^+x?YtzTzD|O<7J6xyoLtօqpi#rktgC8vbxX]gz/X |T$~OgJ9&xfsTsĄwtolv=jӃwfxOy,aӂz]V|Xe}SԂ)NJ;Ɂw1wSrsxtnP#yi˂ze{`<|\}WSa#Ny5IZ?v {7qz|m/R|h}d~O` [ʁdWE:yR߁1N)I䂀tȁ0pPl g\gc)_: [ ՁyVRf.MŀyIFxs< o,k 'f+b-^_o+ZIP)V:$Qڀ(MY HrTm}iYMe/a]oEYoτU<Ä{Q+ LHŃq(lڀhۉCd`\q3X^T\PcLlo H~}Fv@dqlfm׌=iiyl`eVo(`߈r \tW܆wSB{NZ~IuGCgq$jEm lho*dq`Ft)\ vWvyjR|"N4"~IKhtLkpml+ogqct _vA[,xzWJzRp}*NvI݁sOo.o&qkDrg$tc?v_6xe[ hzCV|5Rc~-M%IvrKrn4tejbufXwvb(x^tezZ|VF}RW$MЂI/q8svm*wibxehz1a]{a]|Yׄ}Ub~Q̀!M7LImp/}z l#{h\{doY|`}\؄~YjcU Ԁ?QCEM%I25o }k~HgfM~cl_\muXk݀TP{PցɂLˁGvĤm3j ?xflb_ l&[L܂UWVS҂PYVLjނHol҅?h􄣄eY ap^ڄlZoNGV̄!SCSO僸K}yH`:kgdi\`]JZY҆ VCSR O1{K(H+փ^oeLkڑwghtjtdNm"a1o]V.rYu|U-xtQu{yM/a~pIVnhkXQ\ `mc׋z+grQk1fjnЇbrj[u[S.yK}fW[_=c{8xg0Wqj֋xinsarZ%uRvy;K#|Wh^[f_d~c(0w~fߐoj[hn `qYRucQxJ|u]CjGZwl ^:mb oeĀqizx7hn>yBkHqnJjqij{sJmsuJpl/wYsd"yvp\*{yoT~%|OLZ~-igkj&mlpozr&qyrtXskivv4cxx[{E{S}}RLZgom]ioÈ)lbqns}yrq uVqsfw"juxbx;z[=z|S}=~KL[!eshCuNjvkm~wxXoy.pr}zjit{b=w|Zz:~S`|5L[_W_cy"fz2i{s}lw|+wo|oq}htQ~Farw~Z7yR|`)L ~be僢hр|k=unUmnq gs`vxYy8Rb{K~,aedυ +g{0jτPtxmmpkfs/1_uXxĂgQ{zK~E`߇VdgD$yj0>s;m Xlloqer^uX:x`QR{J}ꌏ`|(c"fߍvxaiˌqlk5o~LdrT]u2zWYx Pz˃J^}i:`7R.cbv}fwipplDj)o"cq]t)Vw†:PzQJ}"q[Ȏs3_]^tc ufxw$jq`xmjz*qb{t[}xSbp{LJRoaqAdrg~tmjwumpvwpi]y_sa{,vZ}yS~|KpmgoojqMl}sovtqjovshxv3aWzxZ#|z{R~z}{Kyӑkmw mo`QoqR|Zqs2usunuvgwx`yzY{|R~ ~gK1gis6l.tn~v{.pw`trxmtzg%w{f`)y6|YL{n~Rh}FKÀh`xԆjym[zyo{lsgq|Clt}f9vU}_jx~XzpQ}).KU*g~Qqi~lg~xonJrq"ksre:uD^xXzgQu|K"~߁Q~fhփ}kXw%n'ppnjr҂dOu,]w]Wy(P|=J~re`ih!:|:j݇umdooچ0isrJ~c^t]w VykPs{܂JV~?dgzjotslnuohbhHq݈8bQtI\vVy3O{yJ}OdbgUCygjs>lmYoegFq{ahs'[Evm{UGxON{A%I}su\}v_Twc{uxftyjtmzmgK|*qV`V}stY~xMRy1{KLYsbte v/hzXwqjsxmm#zpf{_s_|vY~3yR4|K8qg/s/jtly>v-nrwq`lUysezv7_;|xX}{2Q;}KԀ Jomqo~sSqxtrqvtk}x.ve=yx^{szX>}|Q~~Kvdn(rz]ps}NrunwsvpuxOjwHydy{(^%z|W|}Q~aVK %lwƁnx{pyurzot{iv|cxR}]pz0~oWR|SQ}4K2kw|mm}jz}o}tgq~]ns~huRbw\y:V{P}iJ5sj ~lقy(o#s-q6mys8gu2aw"[yV({P!|JX~Ł̃iʆ}l#~wnvqplUrft`v[*xUz O|I~biD| kvdmppkr*elt4*_v4@ZCxCJTzMSO |UڀzCP@}AJvAyg{zzjCv.{lp|>o&kn|qe}s`~pvqZ0xU{OՀ~Jrx:lzBy:nuz7po{rj{te4|v`}xZ~zU'b|OO~Jn<~kvqGywrsxtnyvizwd{yF_m|zZ}|mT~~OyJj0}uvuwvwrwxWmy yhzzc{#{^|,|Ys}@~T^~S=O!haJ*u{tWzgvtu{5qw|lqx<|gyY}bzw~B]{~X|S}̀qN~'IzDse~u'tKpUv<k\wzfxPayր] zX!|)BS^}RNO~wIq$xrNstAo(u5jEvփex`yH\@zwWt{R|悩M~I$0iwrrs(muivPmr`lhncq^tYiKwTPzN}I؂g{7~ hv8~xjrq~ll;oFgqbt^BvXy"S{Ń}~PIہy|lqu}nypz}pk~rg~tb;v]xxXzSv|NIށ)x{ps{rvo||utj}ufN}wma~#y]~zX$O|cSd~NI@owyurzvcnZ{owi|xe[|z9`}^{{\I~|W~}Rd9N1|IӁvExyAqyz2m/z{#h{J|dY{|_|}[}d~V~!R~ހ]M7IP_ tw}zpax~ly~gz ck{L_|Z|ҀwVX}R~dpMr/ISsw o2xjy fyb{z^*{*Z|KBU}!\Q}vM~˂Hr]vkmwvaixy-eyUavz#]>zaY5{̄T|P}yL~r!H~DqulvhwKdx؇`y\sziX{\TX|KPV}<_L1~%HI~wd`2rcBnfTj|ine&lao\rWÃovKSNyN<}I=4{vzdOqgm˃iiKSl|e"o7`yr \tW_wRÂzMꂳ}IH€uhGhZqFjlFmh~8o~dU(q_tS[vWy[R|{MȂ2~IQVtIlconokpxgrc(t_E9v[LxVgzR6}MCIZfs0penrksf؀ub2w=^]xZzV8|gQ~&MIIbr ~Nt\m~ui~w!e%xb[y]{3Y|U&}Qv=MFπI2)p}HZmGzՃid{de{탳a|[^e|Z}.W}uSM~XO~9K$H#lzKQhSz܆d{ga{׆:]|?Y|rVh}' R}O(~EKr~փG_qbahmd]iʈ gOeŇpjOamN]ކpkYysUvQ`iz*L}xHpelcgijoeMmaTo]Q6rYqu\U?:xGQ!{@Lփj~.Hă ohkφk(h4mdY;o`r?\̄[tYwT냑yP5|ML~HԂXn(lpjng\pc)r` t\;{vX/xT{P}TLnHAmpjqfhsb܃"uq_ew.[xXpzT8D|Pu~NLHlshu>elva;x,^ yZ{Wy|oS}PPLWHƁw$kwFgx|dyasz]T{Z2=|V΁*~S51OLL `H~gjzf{c|`3}`\~#Y}~V/RqO\8KHRQ*MWJzG3kbh'xee xhHafk-^ZZnZˈMqWWIt*SWw^OͅvzK償}H5ـjfgd%hdS>k`Hm]ȈXpXZNisVuS=xO{KՄ~HLbGi݊iSfkcm`X=pG]=brY؆uVwoRyOjB|Kǃ%Haiyle܈nbp_1r\ktYTvV"yRV{RO:}KHuh7?oeqb.s_/uW\ ~wXӄxUFzRW|O+~vKMH*gHs;d/taRvO^9Kw[QyTX- zU(|VQ}N‚bKy-HdQf`vacHw`ly]az@Z{sWz{|T}QlNgIK0uH"ReU"ybWz_H{\|YσT}VԂ~hSxJP 6N!JEGdSK|ah}^~A[̃"~YV+N#Sg쀺P}WM1J|GcB`c:w]Z}LX?UoRWBOM/JGGK&b4!_pF\JjZ 상WT́1R3ԃOmLX}I-dG_ LcUf Yˍh.^ jb}mf)udojmKrnduq\xuT|eyK}a\c` \f$cNhf|~kj_thnml}qqd=ttP\x\wS{zL~C^VcoaDfVd2i1gKk{bjmnswmqIkpsctXv[wyfS{p|L~g[jR_lpZb[nepz.i+rrqltjpvbsy[?wH{S{}L2~Ykp]rx`tLdHu{ygvqokxmjoGyb\s{QZv|SWz~"LD~`|W{wiD[`xM7_Ay5~czwfzpQj{in|aro}ZIvI~fRz+2K}U}Z}^1~,}db5~}vlf*~o/j%hnu`qYuRhy?K}}T̃Yo ]<*| aZu:ejn$iwag;my`qwYuhQyX;K}3HS~SXD\z`t dՆJmhyfWm_NqXku Qdy(J|߁dSW͍)\qyZ`Jrdtkh{e_l+^mpWthPxJ[|ċS=j8W}~[x(_qdk h;JdlD|]p`VtzP>xJ|SSgV}iiZ:kH^mbbzofr@qjyjtzndbwBr?[z.v/S#}>zK\}~d]g`qidc5kgcedf\Xgi1~jDkwm nproqVi6rt auvZ0yyR|I|:K~ߓ_jbl4en`}hpvkronthorva uGyYx{0R{}EK$N>]pe5`qzd s|rghuujvnmx0gqAy`xt{EVQuOyI|߇WaC[Pz_0tbtnfhbjz>bTn+[qUuWOtyGI|.kWNl[5nf_7}[p;cvbrgo&t7jhvqn`xrY{jv{R:~zVKC~> h]j`؃la{|\e0|Jvhl|pk}zin~cq~]8u3Vx;P{YLJ~Yԇ#]h`Ԁ{d4tgnjՀhnbqO \tVowǁ'P3z4JJ}A\x`ycu!sf݄mj5>gmapу^[t!Uwf{Oz I}["}_9x7cSrFfkilifm`pjZsƄUwO,zII}Gn["|_!vbYq fkiXel3`)pZ;sviTlvӄNzIg}C;nX%op [qx_y3scrtglv~kBezxjo^z{rX|vQ[~zJ~l9^maJ~odxqgqsyk k6un\dwq^3ytW| xVQ%~]{J~ic̃kf}un iVwp/l prTnjutqzd>vt8]y'wWW{{yP}|JLegi4jk|0lvmunp2oq1rkistcvv];xyyVz{ZP}t}JȆeo/hipzjrtmtVopv hrwbu6yk\w{Vzm|P} ~wJ#^d)tWfuyiwslwxSmo'ygqzb4t~{\ w4}V/y~

|fJ)bz}ezx=h{irak|lnV|fq}aVs~B[lv~UyeO|RJK~LaI|yd|vgq4jkmfptS`sDZvU(xOe{0I~Kd`ńQ{cufpijlCeo_r‚Zu~Tx?N{PI}큿I`-9ycZtFfwniiyluadom^rTY?uMq%ptkruf#tw`w)yLZy_{ U\{|O}~JUfhKszju.um+v}oowjqye>t*za_vn{Z\x|T{ ~0Op}RuJQfxytiyt0l$znn{ciq |;dDsr}_u}Yx+~TizO|ՀXI #}e}xh~Ark4~mm~hpKTc\r^Su1YwnSz N|c,I~|dvgqjrlmggoPbpr3:]t%Xbw-SfyN9|IK~>zd[`u_g(phiSkIlflo$Eajq\t5BWvȃRyP:M{I}'y:ctfo@ikj8lern `qH[sΆ1Vvo?RyNMK{oWH}iHuZ|pv]vwaKq#xdkyhezl4`p|=oZ}sUH~wrO^{EJ.)s_-{?tbTuvep9wUhjxkeIzn_{ur9ZX|uT~SxOg|1J)kqd>zsfttioNvl]jwody#q_lztY|@wXT}z9O8d}J$~1oiIxqlkssmn\tpiLv{rUdx/t^yvY{y8TQ}6{O ~}JA|mnBwoprqqmtsshulucawAwh^hy y;Y'z{ T||N~~JP{slos%vJntqlpul]rwUgtxbvoz]xS{yXz@|S|'~/N~Iz*kwumZxp/oyk6qzfs{au|\w}Wy~S&{yN3}iIkTxj |sl`}on}j%p~er~`u!\'wW[y$(R{%M}3I4~w^i0+rwk9mmHip&\drSr_ty[bvVxR4zMu|H~uhq%jAlmQgocwqɄA^sZvUxAMQzfL|lH~HGth ojv!klΈ_fobqP^ s&YuuUNw䄻PzL|&AHz}|yG[wy^r|zb'mC{pehK|3i9c}l^~ pkXtSʀ wN#{IB{wB_vpx7bqy)flkz&i3g{ lIbx|/on]}ArXt~YuS}py3N_|IzhubduUvgIpwjkxlfzoWa{Lr]|tX}wS5~zN9$}^Im8y"siGt/ukovYmjwp(fyrmaFz\t\{wW}yaR~O{N~+I wqmssonuqivseawuz`yqwZ\'zy9WY|W{R}|ME~Ivprqr>tmlsuhuvdwwxo_xy[|z'{XV{|RL}A~s{ gruV{cyv|_x}e[yg~+X z~T|PN}ML=~SHX΂nq~Ajs~fjtbv^wj[ xπQWaz(S{$O|⁓K~5Ht[lp.hruEeKs[auqj]vׂxZ6xCVyR{OQ|K}G$kp?gqޅdRsni`t]$vVY~wȄVy.2R[zN|-K1})G~r]im`jce܀gCaj]>nY~q}UPHd[lxqpi/ysezstb{EvW^|wZ|yWT}{%S~|OQ~^L)HskwuGh#xvdywazly.]{LzmZ |/{V} |S}~3O|~vKH3jvy(gwzcx{ `?y{\z|Ym{}V|x~R}kO&~V|K|EeG)Ciu|fv}bw~_]x~\"y7XzUt{PR |N}vK1~G҂hQudv(awA'^fxSg[CyXWzbT{b Qq|t?N=}pJ~Gg=tO$cu`v]wȃZx҃WHyT1z郟P| wM}+MJ~BGsBl6^i9aeуeb&hG^xk~ZVnWP:r2Sd/uO.yJK>|GփVbkbyhgeZe~h5a}vk^qmZrppVrtS~w+O_zeK}G့kf'g+hdT@kN`ԁ[m]upzYs!VuRӁxO2{wK{4~JHtj"iflcnh`#:p\qrYxuNV!wR+z Ol|Kp~HPi%~5mne~owb~qx_z#sy\ZtupXwpU+ykR>{vN܀}KfLH-h!|qd}^ra}t^~1v3[~wXV yU0}{*Q|N_~K7Հ9HHg-{tc|Yv `|wu]}`xZ}z'W~b{T~|Q]b~-NAJ_GՀ݂)fzx&b{ryC`|zX\|{cZ}1|cV}}gT ~S~eP~oMfxJzG|mey{az|c_&{B}*\${}YS|~VT}0ISx}Px~bM~_Jt Gt'cy`y^"z[8{GwX{U|@R}6O}M~HJ:GL܂bxN__y&]AyZmzW{kT| RN|Os}sL~1I~G* g`dqc+af+^]iG[l^XV_oU*rQvQN4,yJ}HG_f͆vcc͆fQa i ]5k[nWzqTʄ tQdwNzJX}G}-f fcii`akk]`"nrZpWpsTndv7Q#,yM{J~GAeKj;baol_9n\ qYsGVuT wP߂zYMɂi|J\M|Mj]~JvuhGbt_u]Q%wZCxxX _yUF{PR|Oр~)MJ;G'Ta~w=^&xw\}RyYzWZ{T}R~)Ol@PLՀetJGRȂ`~z]]~X{S[~|@Y~}"V}TV~QNvL~IIŀ4G)u_}E}\}~:Z}~X.~(U~zSd~Q~1N~?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~O3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBRRScUuWY[\]_ޟa۞bٝdלe՛fћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjO3PBQQSbUtWYZ[\]ߣ_ݣ`ڢaءbԟdҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgҝgO3PAQQSbUsVXYZ[\ߨ[ۧ\إ^ԢbҠdўfўfўfўfўfўfўfўfўfўfўfўfўfўfўfўfўfO3OAPPRaTrVXYZZY۪Yب[ԥ_ңbѡdРfРfРfРfРfРfРfРfРfРfРfРfРfРfРfРfРfN2OAPPR`SqUWXYXܬVجWԩ\Ҧ_ѤbУdСfСfСfСfСfСfСfСfСfСfСfСfСfСfСfСfСfN2O@POQ_SpTWXWޭUذRԭXҪ\Ѩ`ЦbϥdϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeϣeN2N@OOP^RnU}WWUٴOԱSѮYЫ]ϩ`ΨbΧcΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeΦeM2M?NNO]RlUyVUܳPշMѲTϯYέ]ͫ_ͪaͩc̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨d̨dM1M>MLN[RhTxT߱Q׿FѸOϴUͱZ̯]̮_ˬa˫c˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪d˪dL1L=LKNXRdSzRھGHκP̶V˴Zʲ]ʱ_ɯ`ɮbɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcɮcK0J+"?,Q6_>iDqJvPzS}UVWXYYZZZZZZZZZZZZZZZZZJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P9QGSWUhWxZ\]^behjmoޖsۗtٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvٗvJ*P8QGSWUgWwY[]^`dgilߙoۘrؘu֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙w֙wK*O8PGRVTfVvYZ\]_behkܜn؛rԛuқvқvқvқvқvқvқvқvқvқvқvқvқvқvқvK*O8PFRVTfVvXZ[]^adgݢj١mӞrϝuΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvΞvK*O8PFQUSeVuXY[\^adݪh٩iԧlͤqɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuɢuK*N7OFQUSdUtWYZ\_bޱfڰfհgЫiʧkťoŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsŦsL*N7OEQTScUsVXZ]`a۷cֶeѱfͬgʧhťkĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnĦnL*N7OEPSRbTqVY[]]ܹ]ֹ_ѴbαḓfʩgƧiħkħkħkħkħkħkħkħkħkħkħkħkħkħkħkL*N7NDPSQaSpV|YZZݸYּYҸ]δ`̰cʭeɪfȩhƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjƨjM)M6NDORQ`SnVyYYߵXٿTҼXη\̴`ʱbɮdȬfȪgƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiƪiM)M6MCNPP^TkWuWW۾RSϻX̷\ʴ_ɲaȰcǮeǬgĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhĬhL)L5LBMOP\TgVuU޹SLS̼Xɸ\ȶ_dzaƲcưdůfîgîgîgîgîgîgîgîgîgîgîgîgîgîgîgK(K4K@KMPXTbTxREMSɽXǺ\Ʒ^Ŷ`ŴbijdòefffffffffffffffK(J3I>LIQRSeQzDENTƿYļ\ú^ù`÷b¶cdeeeeeeeeeeeeeeeI'H1G;MDPQPhF|IPUY\^_`bbcccccccccccccccE"B*H.K@GW/k6{AJQVY[]_``abbbbbbbbbbbbbbbAB"H,FC*X2j:wCKQVY[]^^_`aaaaaaaaaaaaaaa>DD/$E-W6f>rEzLRVXZ[[\]^_______________>A/2'E1T:aAjGqMvRzT|V~WXYZ[[\\\\\\\\\\\\\\\>5 !2+B5O=YDaIgLkOnQpSrUsVtVuWuXvYvZwZwZwZwZwZwZwZwZwZwZwZwZwZwZwC#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#P0Q>RMU\WkZz\^`eimprtuwyߔ|ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}ޔ}C#O0P>RLT[WkYy[]_dhlprtvxߔ{ܔ۔۔۔۔۔۔۔۔۔۔۔۔۔C#O0P=RLT[VjXx[]^bgkpruwޕz۔ؕוווווווווווווC#O0P=QKSZViXwZ\^`ejpsuݖyڕ֗ӗҗҗҗҗҗҗҗҗҗҗҗҗҗD#N/O=QKSYUhWvY[]_diosݛwٙ~ԘљΚΚΚΚΚΚΚΚΚΚΚΚΚΚD#N/OH/[7j>vFNSWZ]^_`abcddddddddddddd=BE!?6)I2Z:gAqHxO~TWY[\]^_`aaaaaaaaaaaaaa=A?$#7-I6W>bDjIpOuSyU{W}X~YZ[\]^_____________==&'70F9Q@ZFbKgMkPnRpTqVrWsXtYuZu[v\v\w\w\w\w\w\w\w\w\w\w\w\w\w; '+54AOKQWTcVnYx]bf߶iֽn̴sĭy=J'L2M>OJQVSbWlZu^|ceglƻpv|=K&L2M=NIPUT`WiZq_wc}޾dfimrx=K&K1LK&K1K;LFPQTZXa[g]t]`cegjlotz>J%J0J:LDPNTVW[XjXwV\bdfhjlot{>I%I/I8LBQJTPV^TmK{SY^bdfhjlpuyyyyyyyyyyyy>H$H-H6L>QDSQRbGpI}QW\`ceghjmrtttttttttttt?G#F+H3M9PAPTGe@sHPV[_adeghjnpppppppppppp@E!E(I.M1NDGW:g?uHPVZ^`cdefhkmmmmmmmmmmmm@CE$I'K4GH3Y:h@uH~PUZ]`acdegijjjjjjjjjjjjBAEH#F7-J5[fDoKvQ{UXZ\]_`abdeeeeeeeeeeee< A A0*)<1K:WAaFiKoQsTwVyX{Z|[~\]^`abbbbbbbbbbbb<> 5",,;5HOHSRV[Yc^icp߽dgmrx7CJ)J2L=OFSPVXY^_cao`ekpu|7CI(J1L;ODSMVTZX_]_n^~chmrx7CI'I0L9OBSIVNZT\aYl]|bfimqw}7DH&H/L7O>SDUJVXSdUp]{adgjmpu{7DF%H-L4O:S=SMO[JhQtY~^cfhjmptzƒ7EE#H*L0O3P@MPA_GkOvV[`dfhkmqv|ŁŁŁŁŁŁŁŁŁŁŁ7ED!H&L*M3LD9S@aFmMxTZ^befhkmqv{{{{{{{{{{{8BDH!K$J68G9V@cFnMxSY]`bdfhkmquuuuuuuuuuu8@DHG'<92I:X@dFnMvS|X\^`bdfhjmppppppppppp9 @DE>*,<4K;XBbGkMrSwW{Z~\^`bcegilllllllllll: @ B >$-.=6K=VD_IfMlRpUtXvZx\z]{_|a}b~dfhhhhhhhhhhh;?='.0<8H?REYJ`MdPhSjUmWnYp[q\r^r_satcudvdvdvdvdvdvdvdvdvdvdv:; *.3:;DALFRHWK[N^Q`SbUcWdXeZf[g\g^h_iajajajajajajajajajajaj7'# .+65==@DCJENHQKSNUPWRXSYUYVZW[Y[Z\~[\|]]|]]|]]|]]|]]|]]|]]|]]|]]|]]|]].'1'7/96=@3"!,/4;;FBOHVL\OaRdUgXjZk]m_naocpeqgr~js|lt|lt|lt|lt|lt|lt|lt|lt|lt|lt5<6$"..79>CDJGPIULYP\S^V`XaZc\d]e_faf~cg|ehzgizgizgizgizgizgizgizgizgizgi56 (!1,95>=ACDHFLJOMRPTRUTVVWXX~ZY|[Z{][z_[xa\wb]wb]wb]wb]wb]wb]wb]wb]wb]wb]1  !+4(70;6>;A@CCGEJGLI}OJ|QKzRLyTMxUMvWNuXNtZOs\Pr]Pr]Pr]Pr]Pr]Pr]Pr]Pr]Pr]Pr]P  $*."2)6.:2=6@8|C:zFuL?sN@rO@qQApRAoTBnUBmWClXDlXDlXDlXDlXDlXDlXDlXDlXDlXDc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzuc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzuc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzuc. t5=F(M3S>XI[R^[ebkgpkuoyq}s}t{uzvzvywywywyvzvzuzuzuzuzuzuzuzuzue- v5=F(N3T>XH[R^[ebjhplupxr}t~v|w{w{xzxzxzxzx{w|w|w|w|w|w|w|w|w|wg- x4=F(N2T=WHZR][bbiiontrxt}wx}y}z|{|{{{|{|z}yzzzzzzzzzzzzzzzzzzi- z4=F'N2SVHYQ\Z_cgkorޘv{ؒэ̉džÄs+ 3=H"L+O4S=VEYN\W`_ggߤmrמw{ϗɓďt* 3=H!L*O2S;VCYK[Sa[eg٪lrФt|ȝ|™v* 3=H!K(O0R8V@YH\OaWݵcfҲjrɩq|yw* 3=H K'O/R6U=XC\I_W`e͸grðn|v~x* 3>GK&O-R3U9X?\D[U^deql{szy) 3>GK$O+R0U5X8ZCTT\ccpj{pw{) 3>GK"O(R,U0X1VASSZbaogznt|}) 3>GK N$R'T(U0L?QQY`_mexkry~yx}) 3@GKN Q!R(J3L?POW^]kcviov|ˉvɔqǠmƬsx{{{{{{{{{( 3 AGKNOI+A7ICPNV\\hasf{lryzՂtӌoҗjҤhаmǰp°p°p°p°p°p°p°p°p°(2 CGJLH!8.?;FGMRR]Zf`newi}ms~yx؁t֊p֔m֟g֬eԵeԵeԵeԵeԵeԵeԵeԵeԵ'3 C GIG/%72>>DJKUP^Wf]mbsfxj|ns}yy݀v݈sݑoܛkۡkۡkۡkۡkۡkۡkۡkۡkۡ'5B F F7.(65=ADLJUO^VeZj^obsfvjyn{~r}zx~w}usq~q~q~q~q~q~q~q~q~&8BD<%.+77=BDLJTO\TaXf\j_mcpfrit}muzqwwuxuzxrxqxqxqxqxqxqxqxqxqx%<A=& 0,88>BEJJRMWR\V`Yc\f_hbiek}hlzknwoourprwpq{qq{qq{qq{qq{qq{qq{qq{qq{q&<< )!2-97@?EGHMKROUSXV[Y]\__`}aa{dcyfdvietlfrofprgprgprgprgprgprgprgprgprg$9# !+!4+<4?;BAEFIJLMPPSRUS}XU{ZVy]Ww_XuaYtdZrf[pi[nk\nk\nk\nk\nk\nk\nk\nk\nk\,  %.4(8/;5?:B>FAID~LF{OGyRIwTJvVKtXLrZMq\Mo^Nn`OlcPkePkePkePkePkePkePkePkePkeP %*/#4)8.;2?5|B8yF:wI;uKpQ?nS@mUAlWAjYBi[Ch]Cg_Dg_Dg_Dg_Dg_Dg_Dg_Dg_Dg_D  $).!3%|7)w:+t>-qA/oD0mF1lH2jJ3iL3hN4gP5fQ5eS6cU6bW7aY7aY7aY7aY7aY7aY7aY7aY7aY7X+h0u7? G*M4R=WF^MeS|lXyr\vx_t}arbpcodnenenenememendndndndndndndndndndX+h0u7? G*M4R=WF^MeS|lXyr\vx_t}arbpcodnenenenememendndndndndndndndndndX+h0u7? G*M4R=WF^MeS|lXyr\vx_t}arbpcodnenenenememendndndndndndndndndndZ+i0w7? F*M4R=WF]NdT~kY{q]xw`u}bscqeoeofogogngngnfofoeoeoeoeoeoeoeoeoe\*l/z7? F)M3R=WF[NcTjZ}p^zwaw}dufsgqhqipipipioiphphpgnhnhnhnhnhnhnhnh])n/|6>F)M2RF(M2R;WEZM`Uh[n`ud}{gzixkulsmrmqnqmqmrlpmlnkokokokokokokokoa(r. 6>F'M1S:WD[L^Tf[mateyi}kzmwnuorprpqoropomplrlrlrlrlrlrlrlrlrc't- 6>F&N/T9WBZK^Td[lasfxjm}oyqvrsrqrrqpqnsntoupvpvpvpvpvpvpvpve'v- 5>G%O.S7WAZJ]RbZkarfwkoqzsvtruovnvqurwsxsytytytytytytytytyf&x- 5>H$P-S6V?YH\P`Yj`qfvlptyvuxtyszszuzv{w{x|x|x|x|x|x|x|x|x|h%z, 5>I#O+S4VJ"O)R2V:YB\K^Sg[oeْxmҌs̈xDŽ|~~}~k$}, 5?K O(R/U7X?[G^OeZٟmeИvnʓ~tĎz~l$+ 5@KO&R-U4X<[C^LܫcZҥkeʞsn˜{u{m$+ 4AKN$R+U1X8Z>߳\Kճ`Y̫heäpnxu{n#+ 4AKN"R(U.W3Y:ڿWJϹ^XƱfdmnuv}|p#+ 4BKN Q%T*W-W9SI\Wdckmruz|q"* 5CKNQ"T%V'P7QHZVbcimouw|s"* 5EJNQSS#G6OFXU`aflmtt{|~z|u!* 6 FJMPRK!G4NEVS]`djksqzyzuqrvz||||||||w!)7 FJMOKA#H2MBTQ[]bhhpowv}~xÈrmihlqrrrrrrrrz )9 F JL J5?&H1M?SNZZ`efmmt}tzv|~o҆jБeΞa̫^ʺbļghhhhhhhh~):F I I ;4=*E5L@RKYV_`dhjozqtsxyl|gb]ߦX޵X\^^^^^^^^*=EG? *4"<.C9ICOMWU]]bcgi~lmxrqryulwhydyay]yW{V{V{V{V{V{V{V{V{+@DA*3%;1B;HEMMTTYZ^`cdghzlkurmpxolpiqfqcp`q^r^r^r^r^r^r^r^r,@@%!+4(;2BGCLGPJ~TL{WOxZPu^RraTpdUmhVkkWioXfsYcyZb{Zb{Zb{Zb{Zb{Zb{Zb{Zb{Z  '04&8-<3@8D<H?{LAxPCvSEsVGqYHo\Im_JkbKieLghMekNboOaqOaqOaqOaqOaqOaqOaqOaqO  %+0"5(9,=0|A4xE6uI8rL:pO;nQhY?g\@e_AcaBbdC`hC_iD_iD_iD_iD_iD_iD_iD_iDӾ %+0!}4%w8(s<*p@,nD.kG/iJ1hL2fN2eQ3cS4bV5`X5_[6]]7[`7[a8[a8[a8[a8[a8[a8[a8[a8 %y*s/n3j7!g;"e>$cA%bC&`E&_H']J(\L([O)YQ*XS*WV+UX+UY,UY,UY,UY,UY,UY,UY,UY,R,Z, h2r:xA!{H*zN3wV:u^@rfFomJktMi|OfQdRbS`S_T_T_T_T_T_T`S`S`R`R`R`R`R`R`R`RR,Z, h2r:xA!{H*zN3wV:u^@rfFomJktMi|OfQdRbS`S_T_T_T_T_T_T`S`S`R`R`R`R`R`R`R`RS+[+ j2t:zA!}H*|N2yT:v]AseFplJmtNj{PgReScTaT`U`U`U`U`U`UaTaTaSaSaSaSaSaSaSaSU+^+ l1v9}@!G*M2|S:y[AvdGskKosOlzQjShUfVdVbWaWaWaWbWbWbVbVbUbVbVbVbVbVbVbVW*`* o1y8@ F)M2R:|ZAybGvjLrqPoySmUjWiXfXdYcYcYcYcYcYdXdWbYbYbYbYbYbYbYbYX)c)q0|8? F)L1R:XA}`HyhMvpQrwToWmXkZi[f[d[d\d[d[eZfYd[a\a\a\a\a\a\a\a\Z(e(t07>F(M0R9WA_H}gMynRvvVs}XpZn\k]i]f^e^e^f]g\d]c_b`b`b`b`b`b`b`b`]'h(w/7>F'M/R8W@\GeN}mSytWv|Zs\q^n_k`i`f`g`g_f_eadcedededededededed_'j'y.6?G%N.S6W?[FcMkS}sXz{[w^s`pbmbjcibgbgbfdgehfigigigigigigigiga&m&|.6?H$O,T5X=[EaLjSrX~z\z`ubqdnfkgighhigkhkiljmkmkmkmkmkmkmkmkb%o&- 6@I"P*U2Y;\C_KiRrXz]|bweshqjoknlmlnlolpmqnqnqnqnqnqnqnqnqnd$q%- 7AJ!R(U0X8[@^HgPpXۆy_Հd|hykwmuotpsprptpuquqvqvqvqvqvqvqvqvqf$s$, 7BKR&U-X5[=^EeOْnXҌw`̇fǃjn}p{rysxtxtytytztzszszszszszszszsg#u$, 7CMQ#U*W1Z9]BڟcNјkXʒt`č|gloruv~w}w~w~v~v~u~u~u~u~u~u~u~ui#w#, 8DNQ!T'W-Y4ݪZAӥ`N˞iXØqaygmqtwyzzyyxwwwwwwwwj"x#, 8ENQT#V)X1زT@ͪ]MŤfXnavh~mrvx{||{{zxxxxxxxxk!z", 9FNQSU$ݴS0ҸR?Ȱ[LdWl`sh{nrwz|}~}|{zzzzzzzzm!|"- : GMPRTG.̿P>¶YKbVi`qgxnsw{}~|{{{{{{{{o ~!-: IMPQ޹OD-NIKJ5 ;A'I6QDYP`Zgbniuo{~ttxo{j}f~c~d}h}l|l{l{l{l{l{l{l{x/@HH>/;C$H3PAWM^We_lfysls{pmɅtgǐwbŜz^é{[{Zz^zbybybybybybybyby|/BFB" /9B%J0O=VI\RcZ{jasqglykf܃o`ڎr[כtWԨuSҸuQuTuXvXvXvXvXvXvXvXv0CB"$ /8A)H3N}PBxUEtZHp^KmcMigOflQbrR^yTZTWUSUPUPUPUPUPUPUPUPU! */4#9)>/B4}G8xL;tQ>pU@mYBj]DhaFeeGbjI^oJ[tKX{LTLQMQMQMQMQMQMQMQM պ %+0 5%:*z?.vD1rH4oL6lP8iT9gX;d[]g?Zk@WoATtBQ{CQ{CQ{CQ{CQ{CQ{CQ{CQ{Cش &,~1 w6#r;'n?)kD+hG-fK.dN/bR1`U2^X3\\4Z_5Wc5Ug6Sk7Po8Oo8Oo8Oo8Oo8Oo8Oo8Oo8ϼ !z't,n1i5f: d>"aA#_D$]H%\K&ZM'XQ(VT)TW)RZ*Q^+Oa,Me,Le,Le,Le,Le,Le,Le,Le, |u o i&e+`/]3[7Y:W=U@TCREQHOKMNLQJTIW G[!G[!G[!G[!G[!G[!G[!G[!K,R,Y. d6j=lD!kL(jV/h^4eg8ao;^x>\@YAVBTCQCPCNCNDODPCPCQCQBRBSASASASASASASAL,S,[. e5k=mD!lK(kU/i^4ff9co<`w?]@ZBXCUCSDQDODOEPDQDQDRDRCSBTBTBTBTBTBTBTBN+V+]- h4n<pC!oJ(nS/l\5ie9fm=cu@`}B]CZDXEUFSFRFQFRFRFSFSETEVDVDVDVDVDVDVDVDO*X*`, k4q;sB!sI(qQ/o[5lc:ik>etAc|C`E]FZGXGVHTHSHSHTHTGVGWFXFTGTGTGTGTGTGTGQ)Z)c+ m3t:wA wH(tO/rY5ob;lj?hrBezEcF`H]I[IYJWJUJUJUIWIXHYGVIUJUJUJUJUJUJUJT(\(f* q2x9{A |H'zO/vW5s`;oh@lpCixFfHcJ`K^K[LYLXLVLXKZKYJWKVMVNVNVNVNVNVNVNV'_'i) t1|9@G&N.zT5w^;sf@pnElwHiJfLcMaN^N]N[NZNZMZLYNXPXQXRXRXRXRXRXRXRX'b&l( x09@G%M-S4{[;xdAtmEpuIl~LiNfOdPbQ`Q_Q]P]O[PZR[T\U]V]V]V]V]V]V]V[&d%p'|09@G$M+S3X:}b@xkFttJp}MmPjQgReScTaT_T^T^U_W`XaYbZbZbZbZbZbZbZ]%g$s&/9AG"M)R1W9_?}iExsJt|NpQlTjVgXeYdYcZcZdZe[f\f]g]g]g]g]g]g]g]_$i#v%/ 9AH N'S/W6]>gD~qJx{PtTqWnZm\k]j^i_h_i^j_k`k`l`l`l`l`l`l`l`a#l"x$/ 9BIO$S,W3\;eCڄnK~xRzVwZu]s_qaobncncncococpcpcpcpcpcpcpcpcb"n!{$0 :BJP!U(X/Z8ّbCъkL˅tSƁ}X}\{`ybwduftgsgsftftftftftftftftftftfd"p }$0 :CLSV$X+۞X8җ`CʑiLČqSyY^b~e}g{iyjxjxjxixixhxhxhxhxhxhxhxhf!r$0 : DNSU ߥU)դT7̝]BėfLnTvZ_cfikl~m}m}l}k}j}j}j}j}j}j}j}jg s$0; EPRSڭL(ϩQ6Ƣ[AdKlTtZ|`dhkmnoonmlkkkkkkki u$0; G OQPԶD'ʮO4YAbKiSqZy`eilnpqqponmmmmmmmjw$0< I N O۵GϻC%ŴM3W?_JgSoZv`~eimpqrrqponnnnnnnly$0=K M L 4A$K2U>]IeRlZt`|ejmpr{sxsxrzq}p~o~o~o~o~o~o~on|#0>KK޸D2?"I0R=[HcQjYq_yeim|pwrstptosrrupwowowowowowowop~#0>IG$0< G.P;YF`OgWo^vchyltporkshsfsjqmpoooooooooooooos#0?Gߺ;%/:E+N8VC^MeUl\~taw|frjlnhpcq`r^qapdofofofofofofofov"/?A&3 :C(L5T@\JcQ}jXvr^pzcjgej`l\nXnVnWm[m]m]m]m]m]m]m]mz -;޿+'4>D%K1SHG?C?@@=@=@=@=@=@=@=@ѷ"(.w3p8!k>$gC'dH)aM+^Q,\V.YZ/V_1Sd2Pj3Kp4Hw5D~6A6>7>7>7>7>7>7>7Ӳɾ  {"t(n.h3d9a=^B![F"YJ#WN%TR&RV'O[(M`)Je*Fk*Cp+@v,>{,>{,>{,>{,>{,>{,>{,˺~ wp j"d(`-\2Y7W;T?RBPFNJLMJQHVEZC_ @d =i!;m!;m!;m!;m!;m!;m!;m!ÿzpj d_Z V& R* P/N2L6J9H<F@ECCGAK?O>S;W9\7_7_7_7_7_7_7_E-L,P-U2 [:]B^K]U$[_(Yh,Vq/Rz0O2L3I4G4E4D5B5@5?5?4@4A4C3D3F2F2F2F2F2F2F2G,N+R,W1 ^8`@`J`T$^])\f-Yo0Ux2R3O4L5J5H6F6D6C6A6A6B5D5E4G4G3G3G3G3G3G3G3H+O*U+Z0 a7c?cHcR%a\)^e-[n0Xv3U4Q5O6L7J7I7G8E8D7C7D7F6H6I5F5F6F6F6F6F6F6J*R)W*]/ d6g>fGfP%dZ*ac.^l1[u4X~6T7R8O8M9K9J9H9G9F9G8I8J7H7G8G9G9G9G9G9G9M)T(Z)a- h5k=kEiN%hX*ea/bj2_s5[|7X9U:S:Q;O;M;L;J;J:K:J9J9I:HJ@J@J@J@J@J@J@R'Z&a&i* q4u<vCtJ$pS*n\0jf4gn8cw:`<]>Z?X?V@U@T?T?R>Q=N?MANCODODODODODODODT%]$e%n* v3z;{BzI#vP)rZ/oc4kl9gua@^A\B[BZBXBWAVATBRDSFTGUHUHUHUHUHUHUHW$`#h#r)z2:AH!}N(wV/ta4pj9lt=h~@eBbC`D_E\FZGYGYGYGXIYJZK[L[L[L[L[L[L[LY#c"l"v)2 :AGM&~T-y^3th9pr=l|AiDfGdIbJaK`L_L^L^L]N_O_P`P`P`P`P`P`P`P["e!o!z(2 :@GL$R+[1|f8vo>qyCnGlJjMhNgPeQdQdRdQcRdSeSeTeTeTeTeTeTeT]!h r }(1 9@FL Q'Y/ڂc8|l?xuEt~JrMpPnRlTkUjViViViViVjWjWjVjVjVjVjVjV_ ju '1 9 @FKO#ڏV/щ`8˃i@qF{zKxOvRtUrWqXoYoZnZnZnZnZoYoYoYoYoYoYoYa lw '19 @FKܛJ"ҕS.ː]8Êf@nGvL~Q|TzWxZv[u]t]s]s]s\s\s[s[s[s[s[s[s[cnz&09 A GK֡E!͛Q-ĕZ7c@kGsM{RVY}\|^z_y`x`w_w_w^w]w]w]w]w]w]w]ep|&09A H ܦEѦC ǠN,X7a@iGqMxRWZ]`a~b}b|b{a{`z_z_z_z_z_z_z_fr~%09AI ױ5̫A¥L+V6_?gGnMvS~W[^acdddcb~`~`~`~`~`~`~`ht%/9AߪFҶ3ǰ?J)T5]>dFlMsS{X\_bde|fze|d}cbaaaaaajv$.8Aڵ5ͼ1=H(R3Z=bFjMqSyX\`c|exfugrftevdxcybybybybybybly#-6=. ;F&P2X<`DgLoRvW\~`yctepgmgkglfodqcrcrcrcrcrcrcn|!*1ܷ+, 9D$M0V:^CeJlPtV||[v_qbmeifegcfcegdjcjcjcjcjcjcjcq%% ) 6A"K-T7[@cHjNzqTtyYo]j`ecae^e[e[d^cacbbbbbbbbbbbbt &3?H*Q4Y=aEyhKsoPmwUhYc]^_ZaVbSbRaUaXaY`Y`Y`Y`Y`Y`xٴ*4=F&O0W9x_@qfFlmLfuPa~T\ʼnWWÕZR\O]L]K\L\O]P]P]P]P]P]P]} ѹ ,7 >E"M+yU3r]:kd@ekE`sIZ|MUևPPԔSLҡTIϱUFUEUDVGWHWHWHWHWHWHWձ˿ , 5<C~L&wT-pZ3ja8dh=^oAXxDSGNIJKGLDLBK?L@N@O@O@O@O@O@O ٪θ * 29?xG%rO*lV/g\3bc6]i9WqM@HAEBCABA@AfD!bJ$^P&ZU(V[*Sa,Nh.Ip/Dy1?2;3734323232323232323اʹ¿ ~ v&o-h2c8_>\DXIUN!QS"NX#K^%Fe&Am'=v(9)5*1*.+-+-+-+-+-+-+ϰżyrk f'`-[2W7T<QANEKJHOETCZ>a:i7q 3x 0!-!,!,!,!,!,!,!Ǹulf`[V% R* N/ K4I8F<D@BE@J>O;T7[4a1h.n+v+x+x+x+x+x+xvkb[UOJG D$B)@->1=5 ;9 9= 7B 5G 2L /R ,W *] 'c'd'd'd'd'd'dA-F,I-K0L7 P@QJQTO^Lh!Hq#E{$B%?&='<':'8'7'5'4'4'3'3&3&5%4$3$3$3$3$3$3$B,G+K,M/O5 S?TISSQ]Of!Kp$Hz%E&B'@(>(<(;(9(8(7(7(6(6'6'5&5%5&5&5&5&5&5&D+I*N+P.R4 V=WGVRU[Re"On%Kx&H(E(C)A)?*>*<*;*:*:)9)9(8(6'7'7(7(7(7(7(7(E*L)Q)S,V2 Z<[EZPXY Vc#Sl&Ov(L)I*G+E+C+A+@+?+>+>+=*<*:)9)9*8,8,8,8,8,8,H(O'T(W*\1 _:_C_M]W Za$Wj'Ts)P}+M,K,I-G-E-D-D-C-C-A,@+?+<-;.;/;/;/;/;/;/K'R&X&\(a0 e9eAcJbT _^%\g(Yq*Uz,R-P.N/L/J/I/I/H/G.E.E-A/?1>2@3@3@3@3@3@3N&U$\$a'g/ k7k?iGfQ d[%ae)^n,Zx.W/T0R1Q1P2O2N1L1L0K/H1E4D6E7G8G8G8G8G8G8P$Y#_#f&l- p6q=oElN iX%fb)bl-_u/\1Y2W3V4U4T4R4Q4O4O4M7L9K:L;M[?Z@Z@Y@YAXBXCYCZDZDZDZDZDZDX!bjs$z*2 9@F}N yY&tc.om3lv8i;g>e@dBcCaD`E_E_E_E^F^G_G`G`G`G`G`G`GZdnw#~)18 >DLـV&z`.vi4rr:oz=mAkCjEhGgHfIeJdJdJcJdJdJdJdJdJdJdJdJ\gqz"(06 <AڌHцR&ʁ\.}f5yn;vv?sCqFoHnJmLkMjNiNiMhNiMiMiMiMiMiMiMiM^it}"&.5: ޖ=ӒDʍP%ÈZ.c5k;|s@y{DwHuJsMrOpPoQnQnQmQmPmPmOmOmOmOmOmO`kv!%-37؜6͗BŒM$W-`5hI"S,\4d;kArFzJNQTV}X|X~{X}zW~yVyUxTxTxTxTxTxTeq}!$%Ԯ ɫ/ <G!Q+Z3b;iApFxKORUW|YyZvYuXw~Wx}Vz|Uz|Uz|Uz|Uz|Uz|Ugsݫϳİ- :EO)X2_:g@nFuK~OS}VyXuZr[o[nZpXrWsVsVsVsVsVsVivճ ʹ+8CL(U1]9e?lEsJ{OzRvVqXnZj[h[gZhYkXlWlWlWlWlWlWlyتϷÿ(5@J&S/[7c>jD}qIxyNsRoUjXfZc[`[_ZaYcXeWeWeWeWeWeWo| ҮȻ$2>H#Q-Y5`<|gBwoGqvKlPhScV_X[YYYWXXX[W]V]V]V]V]V]Vr֧ͳ / ;E N)V1{^8ue>plDjtHe}LaP\SXUTVQVOUOURUUUUUUUUUUUUUvѬǸ+ 8BK&zT-t\4nc:ij?drC_{GZKUNQPMQJQHPHPJQLQLQLQLQLQLQ{  զ˱ *5?zI!sQ(mZ.ga4bi9]p=XyAS˃DOʏGKȝHGūJDþJCIBJBKDKDKDKDKDKDK ڠϬŸ +5 |>tFmO"gW(b_-]f1Xn5Sv8N߁;Jݍ>Fܛ?Bڪ@@ؽA>@=@;B6<588696969696969סͮù'x/ p6j>eF`M\T!XZ#Sa&Ni(Jr*E|,A-=.;.9.8.7-5-5-5-5-5-5-ܜЩƵ ~w#p+ i2c9_@[FWLSSOYK` Gh"Bp$>{%9&5'3'1(0(/'/'/'/'/'/'Ҧɲ{ smg% a, \3X9T?QEMJJPGVC]?e:n6x2.+ ) ( ( ( ( ( ( ˯{qib]X%S+ O1 L7 J<GADFAL>R:Y6`2i.s*}'$""""""Ķ}pg_YSMI"F'C,A1>6<; :@ 7E 4K 0R ,Y )a %j "s{sf]VOJ FB>;!9&6*4.22/7-<)A&H"OV^ekkkkkk<,@,C-C0B6A> CICTA^=h:r7|531/.,++**)((&$$#####>+B+D,E/E4E= FHFRD]Af=p:z86421/..-,,,*((&%%%%%?*D*G*H-H3I< JFJQH[EeAn>x<9864322110/-,+('''''A)F(J(L+L1M: ODNNMXJbFlCv@><:8776655220-+ * * * * * D'J&N'P)R/S7 TATKRVO`LiHsE}C A ?!=!=!YHWSU]RgNpKz!H"F"D#C#C#B#A"A"?">!= :#7%7&6'6(6(6(6(6(J$P#V"[%^,`3 `;_E]OZZWdTm!Qw"N#L$J%I%I%H%G$F$E#D"A%@'>)>+=,=,=,=,=,=,M#T!Z `$d*f1g9 eAbL`V]aYj"Vt$T~%R&Q'P'O'M(K(J(I)I)H*G,F.E/E0E0E0E0E0E0O!W^e#j)l.m7 l?hGeRb]_h"\r%Z{'W)U*T,S-R-Q.P.O/O/O/M1L3L4L4M4M4M4M4M4R [bj"o'r-t4 s<pDlNiZfd#bn'_w*]-\/[0Y1X2W3V4U4U4U4T6S7R8S8S8S8S8S8S8U^fn!t&w+z2z9 x@tKpVl`$ij)fs-d{0b2a4`6_7]8\9[9Z:Z:Z:Y;Y`>_>_>^?^?_?_?_?_?_?_?Ycmv|#',2܇9 уD~OzY%vb+sk0ps4n{7m:ki@gAfBeBdBdBcBcBcBcAcAcAcAcA[epy"$(-ԍ5 ˉAÅLV%}_+yh1vo5tw9r

n@mBlDjEiEhEhAh=h9g6g5g5g5g5g5[enx "Ԕ,ɏ;GR#\*d0|l5yt:w|=u@tBrEpFoHmHlHlEl@l{AyDwFuHsJrKqKpHpB~p>}o:}n9}n9}n9}n9}n9_is}Ԟɞ&6 BM!W)`0g6o:v>B~E|HzJxL|wLyuMwtJxuEwt@wrpv=pv=pv=pv=pv=bm y ߖҟɧ !1 >IS'[/c5k:r?zC}FyIuLqNnOkOiNjHj}Cj{?j{>j{>j{>j{>j{>ep {  ֚͢¬/ <GQ&Y-a4h9p>{xBvFrInLjNfOdOaOcIcDcAc?c?c?c?c?gr  ەўȧ,9DN$W+_2~f8yn=tuAo~EkIgKcN_O\OZN[I\E\A\@\@\@\@\@j v ֙͢ë(6AK!T)}]/wd5rk:ms?h|CdF_I[LWMTMRLSHTDUAU@U@U@U@U@m zܔўȧ #2 >H|Q%vZ,pb2ki7fq;az?\CXFTHPIMJKIKFLBM?N>N>N>N>N>q֙ͣí.:{EtN oW'i_-dg2_o6Zx:U=Q@LBIDFDDCDAE>F;>:>8?6?6?6?6?6?6}̥֚¯z%r1k<eF_PZYUa"Qj&Lt*H-Dڍ/@؜1=խ2;29190808/8.8.8.8.8.ܕТƬ{s!k,c6 ^@XJTSO\KeGoCy"?$<%9&7&5%4%3%2%2%2%2%2%2%Ԟʩ{skd']0W9 SB NKJSF\Bf>p:}7420/.,,,,,,ٚͦırj c\ V)P1L9HA EI AQ =;D7L3T /^ +j &x "         ɭwj^VP KFA=$:*70461=-D)L$V bo~´zl_TLFA= 9520#-(*.'4#:BLVb nzqdWKC=951. +)&$ !%+17@ IR[dggggg6+9*:+:.733:-D'O![gs     7*;(<)<,:1681B,M'Y"eq|   9(='?'?*=/966@2K-W(c $n !y          <&?%A%B(@,=3<=9H4T /` ,k )v & $ $ # " " ! >%B#E#F%E)D1B:@E

KI GU D`Ak@v>=<<;;99776666666666G MRUY"Z)Y1U: RE OQL]JhHrG|FEDCBA@????????????JQV[` b'a.^6Z@ WLTYRdPnOxMLKKJ I!H!G!G!F!GGGGGGGGGMTZ`fh%h+f3c< `H^U[`YjWtV|!T"S$R%R&Q'P'O(N(M(N%N#N!NNNNNNPW^ekn"o(n/k7iD fPc\af_o"]w$\'[(Z*Y+X,V-U-T.T.T+T(U%U$U"U"U"U"U"RZaios u%u+t3q@ nLkXib fk$ds'c{*a,`._/^1]2[2Z3Y3Z0Z-Z*Z'Z&Z&Z&Z&Z&U]dmsx{!|%|.y< vIrTo^!mg%ko)iw,g/f1e3d4b5a6`7_7^5^1_-_+_)_)_)_)_)W_gpw|ރ҃*ǀ9 }FyQv[!sd&ql*os.m{1k3j5i7g9f:d:c:b9c4c1c.c,c,c,c,c,Yaj sz؉ˉ'7 CN|X!ya'vi+tp/rx2q5o7m9l;jmt9mt6mr3mr3mr3mr3mr3`ju  ӏʖ-:EOX%`*g/n3}v7y~;u>q@nBk}Dh{DezDfy?fy;gx7gw5gw5gw5gw5gw5b lxٌϓŚ*8 CMV$^)e.{l3wt7s|:o>k@gCdDaD^D^@_<`~8`}6`}6`}6`}6`}6e o{Ԑ˘'5 @JS"[(zc-uj1qr6lz9h=d@`B\CYDWCW@XY@UARBPBO?Q;Q8R6R6R6R6R6kx֐̚¡.:}DwNqV"l^'hf,cn0^v4Z7V:Q=N>K?H>H1<1;0;/;-;,;,;,;,;,|ތјȢxoj)e6_A ZKVTQ]MfIpE{"A·$>͖&;˦'8ɻ(7'6'6&5&5%5%5%5%5%ה̟©qic$]/W:SE OO KXGaCk?v<964210/.....ݏМƧwic\V)Q3M<IEEO AX =b:m6y31.-+*((((((ԙɥ|naZ UO!J*F2B;?C;L7U3_ /k +y ( & $ # " ! ̣íqdXRLGC ?(;/865>1F-O(Z$f uŬtgZOIC?;74#1)./+6&>!FQ^l} xi\PG?;62 /,)&!#' -4<G S`n~}oaTH>72-*&#! #* 1;EQ]gppppp2+4*4+3-/3):"CNZf r|3)6(6)5,21-8&A LXdo z 6(8&9'8)5.05,?'I!Ualw     8&;$<$<&9+523</G*R%^!it~  ;$>"@"?#='==<;::99988888888GMQUZ[$Z+V3R>OJ LV KaIkHuG}GFEEDCBBAAAAA@@@@@JPU[`b!a(^/Z8XE VR T]RgQpPxONNMLKJIHHHHHHHHHHMTY`egh$f*b3a@_M ]X[bYkXsW{VU T!S"R#Q#P$O$N#O OONNNNNOV\ dilml$k.i<gIeTc^ag_o^w ]~"\$Z%Z&X'W(V)U)T(T%T"T TTTTTRY` hmprqr*q8nElPiZgcfk ds#cz%a'`(_*^+],[-Z-Y-Y)Y&Y#Y!X!X!X!X!T[ c kqtv wy&x5uBrMpWm`kh!jo$hw'g)f+d-c.a/`0_1]0],])]&]$]$]$]$]$V^ f n t x {}#~3{? xJuTs]qe"ol%mt(l{*j-i/g1f2d3c3}b3|a0|a,{a){a&{a&{a&{a&{a&X` iq w|Ѐǃ 0= ~H{RxZvb"ti%rq(px+o.m0l2~j4{i5yg6vf6uf2uf.ue+te(te(te(te(te(Yblt{ԁ˅.; FO~X{`"yg&wn)uv,s~/~r2{q4wo6tm7rl7pk7nj4oj0oj-oi*oi)oi)oi)oi)[ dnw~ЅNJ+8 CMV^"~e&|l)~zt,{y|0xw2tv5qt7nr8kq9ip9ho6hn1in.im+im+im+im+im+] fqzւ͉Ž(6 AKT\!c%|j)yr-uz0q}3n{5kz7gx9dw:bu:at7bt3bs/br,br,br,br,br,` it~ӇɎ%3?IRZ {a$wh(sp,ox0k3h5d8a9^}:[{:Zz8[y3\x0\x-\x-\x-\x-\x-bmxڂϋŒ "0< F~OyWu_#qf'mn+iv.e2a5]7Z8W9T9S8T3U0U~.U~-U~-U~-U~-eq|Շː-9 ~CxMsUo]!jd%fl)bt,^}0Z3V5S7O7M7L6M2M0N-N-N-N-N-iu݂эǕ(}5w@qJmRhZdb"`j%[r)W|,S/O2K3H4F4E3E0F.G,G+G+G+G+m{؈͓Û{#u1p< jFfOaW]_Yg!Tp$Pz'L*H,E.B/?/>.?,?*?(?(?(?(?(sҏșxqm+g7cB ^KYTU]QeMnIx!E#B%>';(9'9'8&8%8$8$8$8$8$zڊ͖ğsfb!^0Y;UF QO MYIbFkBu?ł;Ð86433222222Ғȝ|l^WS&P3L>IIES B] >g;r85؎2֟0Գ..,,+++++؎̛¥seXRMI*E5B?>I;S8]4h1u / , * ) ' % $ # # # # # Иƣxj]QK FB!>+;38<4E0O-Z)g%t#!ɢ|naUJD?:7 4'1/.7)?%I!Taq     ªqdWLB;73 /,)!&(#/7@KY i|ugYMC:3/+'# !&- 6AO^n{l_RF;2+&"  #+6BP]jwyyyy.*/).*+-&2 9B MYeo{0)1(1(.+)0#7@J Wbmx2'3%3&1(--&4"=HT_ jt4%6#7#5%1),1*;$EP\gq {    7"9 : 9!6%4.27.B(M#Xcmw          : =>=<"<*:47>2I-T)_&i$s#|""!! =ACCDD'B0?:;E6P3[0f.o.x--,,+**)'''('''&&&&@EGHLL$J,F5C@?K>=<;;;::9 9 9 9 GLPUYZY#U+P4OAMNMY Lc KkJsJ{IIHGFEDCCCBBBBBBBIOS Z^`^[$X/X<WIVT U^TgSoRvQ~POONMKJIIIIHHHHHLR X_ cdc_a)a8`E ^P ]Z[cZkYrXyWVUTSR P O ONNNNNNNNU [c g h g fi%i5gA eLcVb_`g_n^v]}\[!Y"X#W$U$T$T"SSSSSSSQW_fjlmmp"o1m> kIiSh\fdekcrbz a"_#^%]&['Z'Y'~X%}X"}X|W|W|W|W|WS Zbinqss uu.s;qF oPmYkajhhogw!e#d%c'b(~`*{_*y]*w\(v\%v\"u\ u[u[u[u[U \elqvxy{{,y9vD tNrVp^nemlkt"j|$h'|g)zf*we,tc,rb,p`+p`'p`$o`"o_ o_ o_ o_ V ^gouz~)~6|A yKwTu\scqj pq"|ny%ym(vl*sk,pi-nh.lf.je-je)jd%jd#jc"jc"jc"jc"X`jry&4? I|RzZxa}wh yuo#vtw&sr(pq+mo-jn.gl/ek/cj/di*di'dh$dh#dh#dh#dh#[cmv~ƃ#1= GPW{~_w|f t{m#qyu&mx~)jv+gu-dt/ar0^q0]o0]n+^m(^m%^l$^l$^l$^l$]fpz͂È /: D~MzUv]rdnk#ks&g~|)d}+a{-]z/Zx0Xv0Vt0Ws,Wr(Xr&Xq%Xq%Xq%Xq%_itʇ,8~B yKtSp[lbii!eq%az(^*Z-W.T/Q}0O{/Py,Px(Qw&Qw%Qw%Qw%Qw%bnyЄƌ(}4x? sHnQjYf`bh_o#[x&W(S+P-M.J.H-I*I(J&J~$J~$J~$J~$fr̉‘|#v1q<lE hNdV`^\eXnTw"P%L'I)F*C*B*B(B&C$C#C#C#C#jxӅȏysn+i7eA aK \SY[UcQlMuI F#B$?%=%<%;#<"N^m|))))()$,18ALWcnx+(,'*'&* /6 >IU`kt~.&/$.%*'$+2< FR]hq{1#1"1".$('#/ 9CN Ydnw3!542-#+,)6#@JU`j s { 68865 4(12-<'F"Q\fow 9<=;<<%:.681B,M(X&b$l$t$|##""!!  =@ABDC!A)=39=5H2T0^0h/q/y/////..-,,+++*****@CEHKKH$D-?7== < < ; ; ; ; FJ NT WVSLN*O8PEOPNZ Nb Mj LqLyKJIIHGFEDCCBBBBBHMRY[ [ V TW%Y4XAWLVV U^ TfSmRtR|QPONMLJIIHHGGGGK PV]`_^\_!`0`=_H]R \[[cZjYqXxWVUTRQONNN~M}M}M}M}MM RZ`cffd fg-f:eE cO bWa__f^m]u\}[YXW~V{TySxSwRwRvQvQvQvQOU]chkljlm*l7jBiL gUf\ddcjbr`y_~^{] y\!vZ"tY"rW"qWqWpVpVpVpVpVQW`flprpqr'q4p?nI lRjZiaghfo}ewzdxc ua"r`#p_$n]$k\$k[ k[jZjZjZjZjZSZcjquwvww$v2u=sG qPoWm_}lezkmwjtth}rg!of#le$jc%gb&e`%e`"e_e^e^e^e^e^U]fnuy||||!|/z;xE vMtU{r\xqcupkrnrom{ll"ik$fj%ch&ag'_e&_d#_c _c_b_b_b_bW_iry~ -8}B ~{KyzSvxZrwbouiltpisy fq"cp$`o&]m'[k'Yj'Yh$Yh!YgYfYfYfYfYcmv~*6}@ xI tQq~Xm}`j{ggzncyw`w"]v$Zt&Ws'Tq'So'Rn%Sm!SlSkSkSkSk\fq{Ń&}3w=sF oOkVh^deam]uZ~!W}#S{%Py&Nw'Lv&Lt$Ls!MrMqMqMqMq_kv̀{"v/q:mD iL eTb\^c[kWtT~P!M#J$G%E}$E{#Ez FxFwFwFwFwcp|Ȇy so+k7f@bI _Q[YXaTiQrM|IF C!A"?!> ??????iw΃Črjg%c2_<[FWN TV Q_MgJpF{C?=:98888888o~ʊma ]Y+V7SAOJLS I\ Fd Bn?y<96432211111xІő{jYQN"K/I:FDCN@W=a;k 8v 5 20.,,+*****ׂʏteUF@>"3+ (% #* 4?LYiz  vh[NC8.&" %.9 ETfyzk^QF;2)  &1=M`upaTG=3+" (4DWlvhZM@5+#  *:L_s%($(!)+07@IV`kv''&%$&)- 4<GS]hr{*$)#'#"%*0:DOZenw,", * %"%-7 AKVajs{/0.*#!"*3=G R]fow~232.,+&'/!9CNX b k s z 676343"0++5%> IT^gow~9;: ;<:7&2/-9(D&O%Z%c&l&s'z''''''&%%$$##""""<> > B CA<7(22/>1J2U3_3g4o4v4}44332210/..--,,,?B CH I GA:8+;9=E>P>Z>b>j>q>x===<;; 9 8 8 7 655555B EHMNK D @D&G4HAHLHUG^GeFmFt E{ E D D C B A @ ? > = < < ; ; ; E HMRSQNJN!P0Q<PGPQOZNa Ni Mo Lw L~KJIHGFDDCBB A A A GJQVXZXT VX,X9XDWNVV U^ Te SlRsQzQPONL~K|IzIyHxHxGwGwGwGIMUZ^`_\]_)_6^A]J\S [[ Zb YiXpWwVU}T{SyQvPtNsNrMqLqLqLqLqLKPX^cffbce%e3d>bGaP `X __]f\m~[t{Z}yYvXtWrVoTmSlRkQkQkPkPkPkPMS[bhklhij"j0i;gEfM dU c\}bczajx`ru_zs^p]n\kZiYgWfVeVeUeTeTeTeTOV^flpqnn oo-n9lBkK ~iS zhZwgaufhreopdxmbjah`e_c]a\`[`Z_Y_Y_X_X_XQYbjqtvts tt+s6q@}oI ynQ umXrl_pjfmimjhvggefbe_d]b[`Z_Z^Z]Z]Z\Z\Z\S\fouy{zyyy(x4|v>wuF tsN prVmq]jpdhokentbl~_k\jYhWgUeTcTbTbUaU`U`U`V_jsz~~~${~1v|;r{DoyL kxT hw[evbbuj_sr\r|YqVoSnQlOjNiNgOfOfOeOeOeXcoxz!u.q9mBiJ fR c~Y`}`\{hYzpVyzSwPvMtKrHqHoHmHlHkIkIkIk\ht}y so*k5g?cG`O ]W Z^VfSoPxMI}G|DzBxAvAtBsBrBqBqBqanzÃrkg%d1`;]DYLVT S\ PdMmIwFC@><;;|;{;y;y;y;yguʀnb^[,X7U@RIOQLZ Ib FkBu?<:765544444n|ƈ}jZTQ$O0L;IDFMDVA_>h ;s 8 531//.-----w̅wfVI EC'A3?==G:Q8Z6e3p0}., * ( (' & & % % % ҁƎpaRC8 53'220=.H-S+^)k'y%#!ˋxi[M?2' $"#!/:FSaṕ˔ɪŕ~oaSF:/$*6C Q asޜܴseXK?4*! %0=M_rxi[NB8.%  )6FZp}m_QE:0'  .>SitfXJ>2(   %5I_t ''(*/5=GS^js|"%!$%' ,29EO[fpx%##""$(.6BLWblt|( &## +4>HS^hpw~+*' '1:DOYcksz..+%# #-5 ?JU_gou|11.++)$(1:E P Z c k r x  55 3 3 30+"%+4?KU^fmt{88 7:: 60)""-$9'E)P+Y,b,i,p-w-~--,,+*))(''&%%%; <=@@; 2*/'245@6K7U7]7e7l7r7y7766543210//...>?BFEA;7;!>0?<@G@P@Y@a@h@n@u?}?>>=<;99876555@BGJKLGB EG+I8ICILHUH]HdGjGqFxF E D C B A ? }? |> z= z< y< y< y< CDKOSTRLMO'P4P?PIOQOYN`MgMn Lu K} K J ~I{HyFwEuDtC sB rA rA rA rA DHOUZ[ZTUV$W1W<VFUNUVT]Sd Rj Qr }Qz zPxOvNtMqKoJnImHlGlF kF kF kF FKSZ_a`Z[\ ].\9\C[KZSYZ }Xa {Wh xVo vUwtUqToSmQkPiNgMfLfLeKeJeJeJINW_dffaa bb+b6a@`I}_Pz^W w]^ u\e r[lpZunY~kXiWgVdUbSaR`Q`P`O_O_O_OJR[chkkhf gg(f4e>{dFxcNubU ra\ o`c m_jk_rh^|f]c\a[^Y\W[V[U[TZSZSZSZSLU_gmppnlkl%~k1zj;viDshLpgS mfZ jea hdhecpcbz`a^`[_Y]W\UZUYUXUWUWUWUWNXckquvtqp~p"yp.uo9qnAnmIklQ hkX ej_ cig`io]hx[fXeUdSbQ`O_P]P\P[P[P[P[P\gpvy{zv}vxvsv+pu6lt?isGfrOcqV `p] ]oe[nmXmvUlRjOiMgKfJdJbJaJ`J`J`J`Talu{}w| q|n|(j{3g{=czE`yM]xT [w[ Xvc UtkRsuOrLqIoGmElDjDhDgDfDeDeDeYfqzqkg$d0`:]BZJWRU~Y R}a O|jL{sIy~FxCvAu?s=q=o>m>l>k>k>k_lw~nc_\+Y6V?SGQONWK_ Hh Eq B}?=:}8{7y7w7u7t7s7s7sfs~|j[VS%Q1N:LCILFTD]Af>p ;{ 9 64211 0~ 0} 0{ 0{ 0{ n{yfVKHF*D4B>@G>P;Y9c7m4y1/ - + * * ) ) ) ) ) vȃtcRC<: 8,665@3I2T0^-i+v)'%##"!!!!!΀Œ}m^N@2-+ )+'5&@$K#V!c pNJufWI;/#'2>JXgw  {l^PC7+! !-:HXh{ѐΦqcUH<1' '5DVh}ufYK?4*!  .>Rf|zk\NB7-#  &7LbyrcUG;/% 0DZp&%&)-2:EQ]hqy$## %*/7BNYdmu} !  !%*4>JU`iqx#  (1;FQ\eltz&$ %-6ALW`hou{)'" )2<GR[cjpv|-+& # "$-7BLV^elrx0. *+)%& 0 ; FPYahnu{3 2020* !(5@ K"T#\#c$j$q%w%~%%%$#""!! 65685-&!&#*0,;-F.O/X0_0f0m0s1z000/.-,+*)((((98<==;5/ 25+778B9K9T:[:b:i9o9w9~98875432}1|0|0{/{/;;ACGFB;<?'@3A>BGBPBWA^AeAl@s@{@?>~=|<z;x:v8u7t6s6s6s6=?EKOOLEEG#H/I:IDILHTH[GbGhFoFw|EzExD vC tB r@ p? n> m=m<l;l;l;@CIQUVTNLNO,O7OAOINQNX~M^|LeyLlwKtuK} sJ qI nH lG jE iD hC gB fA f@f@f@BGOW[][US TU)U4U>TF}SNzSUwR\uQbsQjqPq oOz lO jN hM fKdJbHaG `F `F `E `E `E CJT[`ba[YZZ&Z1~Z;zYDwXKtWRqWYoV`mUg kUo iTx gS dRbQ`P^O\M[L[K [J ZI ZI ZI EMX`egfb___#|_/x^8u^Aq]Io\Pl[Wj[^hZe fYm cYv aX ^W\VZTXSVQVPVO UN UM UM UM FQ\dikkhdc{d wd,sc6ob?lbFjaNg`Ue`\c_c `^k ^^t \]Y[WZTYRWQUPTPSPR PQ PQ PQ IVahmppni{huiqh)nh3jg<hgDefLbfS`eZ^da [ci Ybr Va}T`Q_O^M\KZKYKWKV KU KU KU MZemruutpvn pnln&hm1em:cmB`lJ]kQ[kXXj` Vih Shq Qg{NfKdIcGaE_E^E\E[EZ EZ EZ R_jqwz{zwptitft"bt-`s7]s?ZrGXrOUqVSp^Pof Mno Kmz HlEjCiAg@e?c?b?` @_ @_ @_ Weow|~~m|b{_{\{*Yz4Wz=TyERyLOxTMw\JvdGum Dtx Bs ?q=p;n:l9j9h 9g 9f 9e 9e ^ku}{j\ WT%R0O9MAJJHRFZCbA~l>|w ;{ 9z 7x 5v 3t 3r 3p 3n 3m 3l 3l eq{xgWNKH*F4D=BE@N>W<`9j7u420. -~-{,x,v ,u ,u ,u lyucSD @>#<-:78@7I5R3\1g/r,*('%%%$$$$uÁp_O@4 20%./-8+B*L(W&b%n#}!zjZK=/$ " $.8CNZhwÉrcTF8,   + 7 BO^mxi[M@3('3@O`qņÛ}n`RE9.# ".<M_s܊ڣսsdVH=1' (7I^twhZL@4)  !2D[q~oaRE7,! +?Ul%$$'*08DP\gow~"! !$&,5@LXckry "(1<HT^gnt{%.8DOYbiou{! "*4?JT\djpv|$   %/9DNW^ekqw}'$  )3>HQY`gmrx* '!" !,7BKT [ b i o u | .*))$  %1<FOW^dkqx0-//+(!!,$7%A&J'R(Y(`)g)m)t)|)))('&%$#"!~!~!3056861( *-'/20=1F2N2V3\3c3j3p3x32210}/{.y,w+v*v)u)u)55:@BB=657"9.:9:B:J;R;Y;_;f:m:t:}}9z9x8v7t6r4q3o2n1n0n0n07:@GKKG@=?@*A5A>BGBNAUA\}Ac{Ajx@qv@zt?r?p>n=l;k:i9h8g7g6f5f59>FMQROIE FG'H2H;HD|HKzGRwGYuG`sFgqFnoEwmEkDiCgBeAc?b>a=a<`;`:`:;ALSWXVPLLM$M/|N8yMAvMHsLOqLVoK]mKdkKliJtgJeIcHaG _E ]D \B[A[@Z?Z?Z?=FQX\]\VRRR!zR,vR6sR>pRFnQMkQTiPZgPbeOicOraN|_N ]M [K YJ WH VG VE UDUCUCUC?JU\aba]W~WyWtW)qW3nW<kVChVJfUQdUXbU``Tg^Tp\SzZR WQ UP SN RL QK PJ PH PHPGPGCOY`egfc]y\ s\o\&k\0i[9f[Ac[HaZO_ZV]Y^[YfYXnWWy TW RU PT NS LQ KO KN KM KL KKKKFS^eikkidtanaja#fa.ca7a`?^`F\`MZ_UX^\V^dT]mQ\w O[ LZ JY HW GV FT FR FQ FP FP FP JXbinpqo~joghfdf af+^f4\f<YfDWeKUeSSdZPcbNckLbuIa G` E^ C] A[ @Y @W @V @U @T @T P]gnsvvu|qmnal^l[l'Xl1Vl:TlBQkIOkQMjXKiaHijFhtCg Ae ?d =b ;a ;_ ;] ;[ ;Z ;Z ;Z Vclty|}{zyjv[t WsTs$Qs.Os6Ms?KrFIrNGqVDp_Bph@or=n;l9k 7i 5g 5e 5c5a5`5`5`\irzxh~W|N{L{I{)G{3Ez;DzCBzK@yT>x\;xf9wq7v}4t2s0q/o/m.j.i.g.g.gcoyudTF B@$>.<6;?9G7P6Z4d1o/|-}+|)z(x(u's'q'o'o'okwq`QA864'2009/B-K,U*`(k&y%#! |zxxxt}m\L>/)(&($1#;!D OZgu~wgWH:-(1;FS` n  o`QB5)%0;GUduufXJ=0%#.:GWh{{k]OB6*   *7FXlсϙ̱paSF:.$ #2CXnteWI=1& ,>Un|m^PB4) ':Pi#"#$(.7CO[elsz!  !$)3?KW`hou|$/;GR[cjpw|"+6BMV^ekqw| '1=GPX`flqw|  ",6AJSZaglrw}!  %0;DMT[bgmsy$ *4>GOV]ciou|'! " - 8AJQX_ekry*$'&'$ (3<E M T![!a!g"n"u"}""! ~|zyxxx,*,242-$#&#(.)8*A*H+P+W+],c,j,q,z,}+{+y*w)u's&q%p$p#o#o#./5<>=82-01*243=3E3L4S4Y~4`|4gz4nx4vv4t3r3p2n0m/k.i,i+h*h*h*/3=CFFB<6 79&:0:9:A};Iz;Px;Vv;]t;dr:kp:sn:}m9k9i8g7e5c4b3a1a0a0a019CJMMJD>>?"@-{@6xA>uAEsALq@So@Zm@ak@hj@qh?{f?d>b=`<^:]9\8[6[6Z5Z54>IOSSQKED}ExF*uF3rF;oFCmFJkEPiEWgE^eEfcEnaDx_D]C[BYAX?W>V<U;U:U9U97CMTXYWQL|JvKrK'oK0lK8iK@gJGeJNcJUaJ\_Jd^Il\IvZHXHVGTERCQBP@P?P>P=P=;HRY]^\XRwP qOmP$iP-fO6dO=aOD_OK^OR\OZZNbXNjVNtTMRLPKNJLHKFKEKCKBKAKA?MV]acb^XrUkTgU!dT+aT3_T;\TB[TIYTPWSXUS`SSiQRsOR~MQKOINGLFJFIFGFFFFFFDQ[bfggd}_mZfZbZ^Z(\Z1ZY9XY@VYGTYORYVPX^NXgLWqJV}GUETCSBQAOAMALAKAJAJIV_fjllj{elb`_\_Y_%V_.T_6R_>P_EO_MM^TK^]H]eF\oD\{B[@Y>XbzjY0 -+!**(2';&D$N"X!dq~{yvtrqqs}zjYJ;-! "+4=GS_m} ~ |{{|tdTE7*  ! + 5?KXfv|l]N?2&   *5@N]lsdUG9-!  (3@OasxiZL?2'%1?PcyŒî}m_PC7+   !.>Qf~rcTF:.# *<Qhyj[L>1&$8Oh!!!"%,5BOYbipw}  &1>JT]elrx~"-9EOX`gmsx~ )4?IRZagmsx~ $/:CLT\bhmrx~  )3=FNV\bhmsx#-7@HPW]chnsz '1:CJRX^diov} *4=E L S Y _ e l sz  } | |{!"#  $.8@GNU[ahow~|zxvtsrrq#")/0.(! *"3#<#C$J$Q$W%]~%d|%kz%sx%|v%t$r$p#n!m kjjii$(28:94.& (*%+/,8,?~,F{-My-Sw-Zu-as-hr-pp-yn-l-j,h+f)e(c'b&b%a$a$&0:@CA=8002!2+{34x4<u4Cs4Jq4Po4Wm4]l4ej4mh4vf4d3c3a2_0]/\-[,[+[*[*+7@FIIE@97|8w9(t91q:9o:@l:Fj:Mh:Tg:[e:bc:ja:t_:^9\8Z7X6W4V3U1U0U/U/.<FLOOLGAz= u>q>$m?.k?6h?=f?Dd?Jb?Q`?X_?`]?h[?rY?}X>V=T<R:Q9P7P6O5O4O44AKQTURMHuC oCkC!gD+eD3bD:`DA^DG\DN[DVYD^WDfVCpTC{RBPBN@L?K=K;J:J9J8J89FOVYZXS~NpIiHeHbI(_H0\H7ZH>XHEWHLUHTTH\RHdPHnNHyLGKFIEGCFAE@E>E=E<E<=JTZ^_]Y{TlOdM`M\M%YM.WM5UM<SMCRMJPMROMZMMcKMlILxGLEKCIBHAF@D@B@A@@@@BOX^bdc_yZjV^S ZSWS"TR+RR3PR:NRAMRHKRPIRXHRaFRkDQvBP@O>N=LVu^T<]^;]h9\s7[5Z3Y2W1U1S1Q1P1O1NS_gnrttrtoflUhGe CeAe"?e*=e21lF0lO.kY-kc+jo)i~'h&f$e#c$`$^$\$[$[altzo~_{Oy?v2u 0u.u!,u*+u2)t:(tB'tK%sU$sa"rm q{pnljhedcbis{}l[K<-%#"~$ ~,~4~=}F}Q|]|j{xywuspnlkkq{wgVG9*%-6@ K X et|ywutt{qaQB4' %.8CP^myiZK<0# $/:FUdvpaRD6*#.:IYkvfWI</#   +9J^r{k\M@4((7J_xדկpaRC7+   %6JbzvgXI:." #5Jc| #*4ALV_fmsy$0=GQZahotz +7BLT\ciotz  '2<FOW]dintz  !,6@IPW^dinty &0:BJRX^cintz  *4<DLSY^cinu|$.7?FMSY_djpw  '09AHNTZ`flt|~|zxwvuu   *3;BIOV\bi~p|yzwusqpnml l k &+,*% %.7>E~K|QyXw^vetmrvpnljhfedccc&/5750*"!# $*|%3y%:w&At&Gr&Np&To'[m'bk'ii'rg'}e'c&a%`$^"]!\ [[[ .7=?>94-){+w,&t,/q-7o-=l-Dj-Jh-Qg.We._c.ga.p`.{^.\-Z,Y+W)V(U'U%U$T$&4>CFEA<6y1 t1p2#m2+j33h3:e3Ac3Ga3M`4T^4\\4d[4mY4xW3V3T2R0Q/P-O,O+O*N)-:CIKKHC=s7m7i8f8(c80a87_9>]8D[8KY9RX9YV9bU9kS9vQ9P8N7L5K4J2J1I/I/I.2?HNPQNI}Do=g<c=`=%]=-[=4Y=;W=AU=HT=OR=WQ>`O>iM=tL=J<H;G:E8E7D5D4D3D27DMRUVTOzJkDbA^BZB#WB+UA2SA8QA?OAFNBMMBUKB^JBhHBsFBEAC@A>@<@;@9?8?7?6<HQWZ[YUwPiK]G XFUF RF(PF/MF6LF=JFDIGKHGSFG\EGfCGqAF~?E>DKpQG=QP;QY:Qc8Qn7P{5O3N2L1J1H1G1E1D1CKW_eijjgsde`U\FX CW@W >W(=W/;W6:W>8WE7WN5WW4Wa2Vl1Vz/U-T,R+P+N+L+J+I+HQ]ekoppnrkdhSdB`;^9^7^%6^,4^33^;1^C0^K/^U-]_+]k*\x(['Z%X$V$T%R%P%O%NXckquwwupraoPk@h3f 1f/f .f(,f0+e7)e?(eH'eR%e\#dh"cv ba_]ZXWUU_jrw{~~~|my]wMs=q.o'n&n$n##n+!n3 n;mDmNmYlfktjhgdb`^]\gqyziY~I|:z,yx www&w.w6w?vJvUub tp s qomj h f e dpyudSE6(  '0:DP]~k}|{yvtqonmy~n^N@2%  (2=HVev|zxxvgWH:-  )4?M]n}m^OA3' (4AQcwsdUF9,   '4CUjyiZK=1% #2EZq΋ͦ~n^OA4( 1D]xsdTE7+ 0E]x '3?IS[cjpv{".:DNV^ekqv{)4?HQY_ekpv{ $/9BKSY`ekpu{  )3<ELTZ`ejou{ #-6?FNTZ_diou|'09AHNTZ_djpw~ !*3;BIOTZ_ekrz~|{{z #,5<CIOUZ`fnv|zwutrqpoo &/7 > D J P~ V| \y cw ju ss}q o m k i h gfee #()&! !*2|9y@wFuLsRqXo_mgkoiygeca`^]]\\$-231-'|x%u.r5p<n Bl Hj Nh Uf!\d!cb!l`!v^!] [ YWVVUUU,5:;:60)y# t$p%!m%*j&1h'8f'>d'Db'K`'Q^(X\(`[(iY(tW(U'T'R%P$O"O!N NN%2;@BA=82s+l*i+e,&c,.`-5^-;\-AZ-GY-NW-VV.^T.gR.qP.~O-M-K+J)I(I'H%H$H$,8AFHGD?|9n3f0b1_2#\2+Z22X28V2>T2ER2KQ3SO3[N3eL3oJ3|I2G2F0D/C-C,C*C)C)1=EKMMKEy@k:`6 \6Y6 V7(S7/Q75O7;N7BL7IK7QI8YH8cF8nE8zC7B6@5?3>2>0>/>.>-6BJORRPKvFh@[< V;S;P;%M;,K;3I;9H;@G;GE<=;;9:8969493:2:1;FOTWWVQsLfGXBP@M@J@#H@*F@1D@7C@>B@E@AM?AV>A_5<5:58575655?KSX\\[WrSeNVIKEGEEE CE(AE.?E5>E<0=0;0:09EPX]aa`]qYdUUPFK AK?K=K%;K,:K38K:7KA6KI4KR3K\1Kg0Jt.J-I+G*E*C*A+@+>+>JU]bfgf~dp`c]TXCS;Q9Q7Q"5Q*4Q02Q71Q?0QG.QP-QZ+Pf*Ps(O'N%M$K$I$F%E%C%CP[bhkml}jogbdR`A[4X 1X0X.X&-X.+X5*X<)XD'WN&WX$Wd#Vq!V TSQNLJIHWainrss|qnn_kOg?d/`)_'_&_"$_*#_1"_9 _A_K^U^a]o\[YWUSQPO^houxzz{yku[rKo0$  #.;J\oqbRD6)".<NbzwgWH;."  .>Riǃß|l\M>2%-AXqqaQB5( +@[x%0;FOX`fmrx} +6@JSZagmrx} &1;DMT[bgmrw}  !+5>GNV\bglqw}&/8AHPV\afkqw~ !*2;BIPV[`ekpw$-5<CJPUZ`ekry '/7>DJPUZ`flt}~{ywvuuu  !)18?EJPU[a}h{pxyvtqonlkjii #+39~@|EzKwQuWs]qdolmvkigecb``__ %%#  { &w -u4r;pAnFlLkSiYgaeicsa_][YX W W V V "*/0-)#z uq!n)k0i7g=eBcHaO_V^]\fZpX|VTRQPOOON*27862-&slif%c ,a 3_!9]!?[!EY!KW"RV"ZT"cR"mP"yO"M!K JIHHHH$19=?>:5{/n(e$a%^&![&)Y&0W'6U'<T'BR'HP'OO(XM(aK(kJ(wH(F'E&C$B#B!B BB*6>CEDA<w6k0_+ Z+W+U+&R,,P,3O,9M,?K,EJ-MH-UG-^E-iD-uB-@,?+=)=(=&=%=$=#0;CHJJGBt=g7Z1T0Q0N0#L0*J00H16F1<E1CD1JB2SA2\@2g>2s<2;1:08.8,8+8)8(8'5@GLOOLGrBe=W8N5K5H5 F5'D5-B53A5:@6A>6H=6Q<6[:7e97r76654433313/3.3,3+:DLQTTR}MpHcDV>I: E:C:@:%?:+=:1<:8::?9;F8;O7;Y5;d4;p2;1:/9.7.5.3.2/0/0>IQVXYW|SoObKTEE@ @?=?;?"9?)8?/6?65?=4@E3@M1@W0@b.@o-?~+>*=);(9)8*6*5*4CNU[]^]{YnVaRSMDH:D7D5E 4E'2E-1E40E;.EC-EK,EU*Ea)Em'D|&C$B#@#>$<$:%9%8ISZ`cdc{`m\aYSUBO4K 1K/K.K$,K++K2)K9(K@'KI%KS$K_"Jl!JzIGECA?>=OY`ehjizglc`aP\@W1S*R(R&R!%R($R/"R6!Q> QGQQQ]PjPyOMKIGEDCU_flopoynlk]hMc=_.\"Y YYY$Y+Y3Y;YDXNXZWgWwVT R P MKJI]fmruwwxuiqYnJk:g,ecbaa a'a/a7 a@ `K `W_d^s][YWUSQPemty}~~u|dxTvEr6p(nl k kkj"j*j3j<iGiSh`gofdb_][YXmv|p_O}@z2y$wv uuuut%t-t7sAsNr\qko|nkifdbav~yiYI;-  '0;~G}V|ezwyvtromlrbRC5( (3@N_q~|{zyiYI;." )5CTg}o_PA4' )7H[qtdUF8+(8Kc}zjZJ</" );Qj߅ۤo_O@3& (>Wq"-8BKT[bintz (3=FNV]cinty  $.7@HPW^cinsy(2:BJQX]chmsy#,5=DKQW]bglry '/7>EKQW\afls{!*18?EKQV[afmt}~}{{z$,3:@FKPV[agox}zxusqpooo &-4:@FK~Q|Vy\wcujssp~nlihfeddc  '|/z5w;uAsFrLpQnXl_ifgoezca_]\[ZYY""  }xt"q)n0l6j <h Ag Ge Mc T` [^ c\ mZ xX V U S RQQPP (,-*& tmjg$d+b1`7^=]C[IYPWWU`SjQuONLJIIHH H (0453/*z#nea^ \'Z.X4V:T?RFQLOTM]KgJsHFDCBBBAA#/7:<:72v,j%_ ZW T $R *P!1N!6M!<K!CI"JH"QF"[D#eC#pA#~?">!=;;<<<)5<@BA=8s3g-Z'S%P%M%!K&'I&-G&3F&9D'@C'GA'O@(X>(c=(o;(}:'8&7%6#6!6 66/:AEGFC}>p:d4W.M* J*G*E+$C++A+1?+7>+==,D<,M:,V9-a7-m6-{4,3+2)1'1&1$2#2"4>EJLLI{Dn?b:U5H0 D/A/?/"=/(;/.:/480;70B61K51T31_21k01y/0./-.,,,*-(-'-&8BINPQNzJlEaAS;E6>4;49474&64,44235925@15I06R.6]-6j+5x*5)4'2'0'.(-(+)*=GNSUVTyPlK`GRBD=99 694929$19*/90.:7-:>,:G*:Q):\':h&:v%9#8"7!4"3#1#/$.BLSXZ[YxVkR_NRJCE4? 0>.?,?!+?(*?.(?5'?<&?E$?O#?Z"?g ?u>=;97543GQX]`a_w\jY_VRRAL2G)E(E&E%E%#E,"E3!E:ECEMEXDeDsCB@><:98MW^cegfwcj`_]OY?T0O#L LLL"L)K0K8K@KJKVKcJqIHF DB@>=T]dilmlvjjh\dL`<[-X USSSS&S-S5S= RG RS R`QnPOMKHFD C[dkpstsvrgnXkHg9c*`^\ \ \["[)[1[:[DZPZ]YkX|VTROMLKclrwz{zsxbuSrCn5k'ig feeee%d-d6d@cLbYah`x_\ZWVSRltz~m~]{Mx>v0t#rqpp ooo n(n1n;mGlTkcjthfdb^]\u}wgWG9~+}|{zzz zyy"y+y5xAwOv^uosrnljifo_O@2%  $.9GWi}~}ywutwgWG9, $/=Nau}m]M?1$ $1ATirbSC6( #3F\uxhXH:, #5JdҁѠο}m]M=0# %9Qk*5>GOW^djpu{ %09BJRY_ejou{  !*4<DLSY_djou{%.7?FMSY^cint{  )19@GMSX]bhnt}$,3:AGLRW\bgnv &.5;AGLQV\bhox}zxwvut!(/5;AFKQV\c|jzrw}trpnljiii #*06}<{AyFwKuQsWr^oemnkxhfdb`_^^^ ~y$v+s1q6o<mAlGjLhRfYdaaj_t][YWVUTTSw rnk%h,f2d7b=aB_H]N[UY]WfUqR~QOMLKKJJ&)*'#zogc ` ^ '\ -Z 3X 8V >TDRJQROZMdKoI|GED C B BBB&.120,'u!j_ ZWU#S)Q/O4M:L@JGHNFWEaClAz?><;;;;; "-48973~/r)f#ZROMK%I+G1F7D=BDAL?T>_<j:x97655556(3:=?>:{5o0c*W$M HF D "B (@ .?!4=!:BDC@y;m6a1T+H&B$@%=%;%%:%+8%17&86&?5'G3'P2'[1'f/'t.',&+%*#*!+++3<CGIIEwAk<_7R2E-<):)7)5)#3)(2*/1*50+=/+E.,N-,Y+,e*,s(+'*&)%'%%&$'"'!7AGLMNKvFjB^>Q9D48/ 4.2.0. /.&-/-,/3+/;*0C)0L'0W&0c$0q#0"/!- + *!("&"%<ELPRSPuLiH]DQ@C;55.3,3+3)4$(4+'41&49$5A#5J"5U 5b5o4320.,+*@JQUWXVtShO]KPGCB4=)9 '9%9$9""9)!9/ 97:?:H:S:`9n9~86420/.FOVZ]]\tYhV]SPOAI2D$@ ??? ?&?-?4?=?F?Q?^?l>}=; 9 7543LU\`ccbt`h]]ZNV>P0L"HFFFF#F*F2F:FD EO E\ EjDzCA?=; 9 8R[bfijisghdZaK\;X-TQN M M M M'M/M7MAMLLYLgKwIHECA?>ZbimpqpsnekVhFc8_)\YWVVVV$V,U4U>UITVSdRtQOMJHFEbjptwx~wqu`qQnBj3g%ec a` `__ _(_0^:^E]R\a[pZXUSPNMjrx||~l{[xKt=r/p!nlkjjjii#h+h5hAgNf\emcb^\ZXVs{ueTE|7z)ywvuut ttts&s/s;rHqWphn{lkgecb}~m]M>0#  (3A~P|b{uywuqonteTE7) +8GYm~}{j[K<."  ,;Nd|p`PA3& .@UmvfVF8*0F_zșŷ{k[K;.! 3Kg '1;CKSZ`flqw}  ",5>FNU[afkpv}'08@HOU[`ejpv}"*3;BIOUZ_djov~ &-5<CINTY^cipw (/6=CHMRX]cipy~|{ #*17=BGLRW]cjs}|zwusqpoo %,17=BG~L|QzWx]vetmqwoljhfedcb&|,y2w7u<sBqGoLnRlXj`gherc~`^\ZYXXX   }xs!p'm-k2i7g=fBdGbM`T^[[dYnWzUSQPONNN zr mie"b(`-^3\8Z=YCWIUPSXQaOkMwKIGFEEED$''$ uj b ]ZX#V)T.R4P9N?MEK LI TG ^E iC uA @ >==<<<%+//-)|$qf[S P N L$J*H/F5E;CABI@Q>[<f;s9765 5 5 5 5!+25640y,n&b WL HFD!B&@,>2=8<>:F9O7Y5d4q21/..///'17;<;7w2k-`(T"HA?=;#9)8/655<4C2L1V/b.o,+)(()**-6<@A@=u8j3].Q)E#< 864 3 &1 ,0 2/!9.!A-"J+"T*"`("m'"}%!$ ##$%%1:ADFEBs>h9\5P0D+8% 2$0$.$,$#+$)*%0)%7(&?'&H&'R$'^#'l!'| &$"   6?EIKJHrCg?[;O6C26,-)+)))')!&)'%*.$*5#*=!+F +Q+]+j+z*)'%#" ;CINPO~MrIfE[BO=B964(/ %.#.".!.% /,/3/;/D0O0[/i/x.-+)'&%?HNSUU}SqPfLZIODB@4:&64444#4*41494B5M4Y4g4w3 2 0 .,*)DMTXZZ}YqVeSZPOLAG2A$=: :::!:':/:7:@ :K :W :e9t87531/ .JSY]``|_q]eZ[WMS>M/I"EA @ @ @ @% @,@4@>@H@U@b?r><;8643QY`dfg|fqdfaY^IY:T,PMJH HHH"H*H2H;GFGRF`EoECA><:9X`fkmn|mqkdhUdE`6\(XUSR QQQP'P/P8OCOON]MlL~KHFCB?`hnruu|tor_nPj@g2d$a^ ]\ [ZZY#Y+Y4X?XLWZViT{SPNLIHipvz||z{jxYtJq;n-lihffe eddc&c0b;bGaV`f^x\[WUTRry~sc~R{Cx5v'tr qppoo onn!n*m5mBlPkaitgeb`^]{|k[K<.!}|{{{zzz zzz#z.y;xJw[vntqpljirbRC4'  %2ARg~}zwyhYH:,'6I]tn^N>1# ):OhtdTC5'  ,@XsyiYI9, .Gc  $.7?HOV\bgmrx )2:BJPW\bglrx#,5=DJQV\afkqx '/7>EJPUZ`ekqy#*18>DJOTY_dkr{ %,29>DINSX^dkt~}{yxvu '-39>CHMRX^~e{nywvtqomkjih "(.3}8{=zBxGvLtRrYp`nhkri~fdb`^]\\ }y#v)s.p3n8m=kBjGhMfSd[ac_m\xZXVTSRQQ  }wrnk#h)e.c3b8`=^B\HZOXVV_ThQtOMKJIHGG um hc`]$Z)X/V4U9S>QDOJMRK[IeGqECA@??>>!$$"{pf ] XURP%N*L/J4I:G@EGCNAX?b=n;|:877666#),,*&x!mbWN JHF D&B +@ 0? 6= << C: K8 U6 `4 l3 {1 0 ///// */331-u)j#_SHA?<;"9'8-62593@2I0S/^-k+z*('' ( ( )&/58984s/h*\%QE; 8542$1*/0.6->+F*P(\'i%x$"!!"## ,4:=>=}:q5f1Z,O&C!81/-,!*')-(4';&D$N#Z!g v09>BCB|?p;e6Y2N-B)7$, )'%$$# +" 1!!9 !B!L"X"e!t! 5=CFHG{EoAd<X9M4A/6+*& #$!$ $$"$)%/%7&@&J&V&d&s%$" 9AGKMLzJnFcBX?M;A662)-) ))) )'*-*5*>+H+U+b*q * ( ' % # !>FLPRQzPnMcIXFMBA>59'4/ ..//$/+/3/< 0F 0R 0`/o/-,)'&$CKRUXWyVnScPXMMIAE2?$:75 5 5 5" 5)515:5D5P5^4m4~21/,*)IQW[^]y\nZcWYUMP=K/F!B> < <<< <'FLRX]chms{  )19@FLRW\agmt| $,3:@FLQV[`fmt~ &.4:@FKPUZ`fmv~| "(/5:@EINTY_goy|ywtrqpo $*/4:?CH~M|SzYx`uisrp~nkigedcb%|*y/w4u9s>qCpHnMlTj[hcelcx`^\YXWVV |xsp%m*j/i4g9f>dCbH`O^V[^YgVsTRPNMLKK xr mie b%_*]/\4Z9X>VCTJRQPYNcKnI|GEDBBAA{phc^ZW T%R*Q/O4M9K?IEHMEUC_Ak?x=;:9988!!wlaY TPMJ!H&F+E0C5A;?A>I<R:\8h6u4321100!'*)'#si^S J FC@>"=';,91876>4F3O1Z/f-s,+*))))(-00.|*q&f![PE< 97 5 4 #2 (0 ./ 4- ;, C* M( X' d% s$ # " """"%-3664z1o-d(Y#NB81 .-+*%(*'1&8%@#J"V bq   *28;<:y7n3c.W)L$A 6, (&$#""(!. 6>HTao /7<?A?x=l8b4V0K+@'5"+" %,4<FR_n3;ADEDxBl>a9V6K2@-5)*$ # * 2!:!D!P!] !l !}    8?EHJIwGkD`@V=K8@450*,'$$$$!%(%0 &8 &B &N&[&j%{$#!<DJMOOwMkJ`FVCK?@;57'2-* * * * *&+.+7+@+L+Y+h*x)'%#! AIOSUTvSkPaMVJLGAC2=%84 1 0000%1,151>1J0W0f/v/-+(&%GOUY[[vYkWaTWRLN=H/C!?;8 8777"7*737<7H6U6d5t420.,)NV[_aav`l^b\WYHT9O+JFCA@ ??> >(>0>:=E=S`/]"YWTSR QPPO!O*N4N?MML\KmIHECA?fmquwwwvfrVnFj8g*db_^]\[ [ZYY%X0X;WIVYUjS~QOLJHouz}~~o{_xNu@q1o$mj iggffe edd c*c6bDaT`f^{\ZXTSx~xhW~G{8x*wusrqqqqpp ooo#o/n=mNlajvhfdb^o^N>0#}}||||||| |||'|5{FzYyowtrpoueTD6'  +<Pf|kZJ;, 1E\vq`O?1#"5MivfUD5' '=WtΕʽ'08@GNTZ_djov}"+3;BHNTY^ciov~ &.5<BHNSX]bhow!(06<BHMRW\bhpy #*16<AFKPU[ahq{~|zxw%+16;@EJOU[b~j|tyvsqnlkjj  &+0~6}:{?yDwIvNtUq\odmmjyheca_]]] }y!v's+q0o5m:k>jCiIgOdVb^`h]sZXUTRQPP|wrnj"g'e+c0a4`9^>\DZJXQUYSbQnO{LJHGFEE {sl hc`\"Z&W+V0T4R9P?NEMLJTH^FiDvA?>=<;;  vld^ YUQO"M&K+I0G5F:DABH@P>Z;e9r8654332}rh ]TP KHEC"A'?,=1;6:=8D6M4W2b0o/-,++++%''$z!oeZP FB><97#6(4-2319/A-I+T*`(m&}%$$###&+..+x(m$cWMB 9 530.-$+)*/(6'>%G#Q!^ k{$+1342w.k*a%U!K@6- ) ' & $ # &! , 3 ; DP\j {  )16897v4j0`,T'I"?5+" #)19BN[iz    .5:=><u:i6_1S.I)>%4 *  '.7@L Y g w 29?BCAt?h;^7S4I/>+4'*#  % , 5 >JWeu6>CFH~GtDhA^=S:I6?25.+*%    #!+!3"="H"U"c!s!;BHKM~LsJhG^CTAJ=?966(0,'%&&&"&)'1';'F'S'a&q%#"@HMPR}RsPhM^JTHJDAA3;%62 .- ,,, ,',0,9,D,Q,_+p*(&$" FMSVX}XsWiT_RUOLL=F/A!=964 3333%3-372B2O2^1n0/,*'&LTY]^}_s^i[`YVWGQ8L*GC@=< ;::9#9+959@8M8[7l6520.+T[`de}ftejcaaQ\BW4R&NK HFED CBA A(A2@=@J?Y>j=};9753\cgkm}mtlkj[fKb<^.Y VSQONM LKJJ%J/I:HGHVFgEzCB><:dkost}tuteoTlEh6d(a^\ZYXWV UUT S*S6RCQRPdNxLKIEDmsx{|~{nx^uMr>n0k"igeccbba` __^%^1]>\N[`YtWUSQNw|vf}U{Ew6u)sqonmmmllkkjjj*i8hHgZfoda_^[~m]L=.}!|{yyxxxxwwwwww"w0v@uSthromkjtcRB3%  &6J`y}{zziYH9*+?Uoo^M=/!1IctdSB3%"8QpÓ#,5<DJPV[`ekqx '07>DJPUZ_djqy"*18>DIOTY^djr{ %,28>CHMRW]cks~ &-38=BGLQV]dlv}zxvtrq "'-27<AEJP}Vz]xeuos{pnkhfedd#}(z,x1v6u;s@qEpJnPlWj_ghetb_]ZXWVW |wtp#m(k,i1g5f:e?cDaJ_Q\YZcWnT{RPNLKJK~wq lheb#_'],\0Z5X:V?TERLOTM^KiIvGDBA@??vmhc^ZWT#Q'O,N0L5K:I@GGEOBY@d>q<:86655 | qg_Y TPLJG"E'C,B1@6><<C:K8U6`4m2|0/.--- xnd YPK GC@=;#9(7-62483?1H/Q-]+j)y(&&%%%#$$!vkaVLC> :7420$.)-.+5)<(D&N$Z#g!v $)++)t%i!_TI? 62 .+)' &%$+#1!9 ALXet"*/11~/s+h(^#RH=4+ & # "(.6?J V ds'/467}5r1g.\)Q%G =3)      % , 4= H T b r    ,38;;|:q7f3\/Q+F'<#3)     " ) 2;FR`p   18<?@|?q<e8[5Q2G-<)3%)!    (09DP_n 5<ADE{DpBe>[;Q8G4=04-+)% &.7BO]m:AEIJzIpGfD[AQ>H;>754)/*%" """"$",#6#@#M#["k!} ?FKNOzOpMfJ\HREIB@?3:%50 ,) ((((#(+(4(>(K(Y'i&|%"!DLQTUzUpTfQ]OSMJJ=D/?!:631 0/..!.).2.=.I-X-h+z*(&$!KRW[\z\q[gY^WUTGO8J*EA=:87 6555&505:4G4U3f2x0/,*(RY^bczcqbh`__PZAU3P%LH EBA@ ?>==#<-<8@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./012456789:;<=>?@ABCDEFGHIJKLMNOPRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~񪌫ۊa۶iUֆAaߖg\;~cibvBAj+0}" d[dgܿδӟr<@\12d&(WuD{ܳX7pѣxWH;_¸ܼаaDXhC9sB6 ix qjbT$WЧwF$Gۯ[?)7ܽkZS̾ҳǢhM3ڪ~V3c҆S%FB -bznTcYQ^G HÝdG3 AƲp[M;Aô˪x_GGϟuR3%j;|UbjI4c"8dy5qmUA1!n׼zk\PD3nȻë~eLqѢzY=# Xܓ]0 79/Ps`N(>R0{#O/  {ri_TE4Ӽy]絎oU=% a4uu+Vy: ! I|qnb Y;QpM JQHE?Ȩ|viYIݴz`I3ByI#%+_|kT@.En1`1|=#)wƼxT7!)w=Ia/TtDxoi\ Q0FZ=5.[*%rVh%;Oe~ܱ{tomlls~6Pj[R;&Ft6^KB p(Cb󒡶aF2# REypbUAJg@6.I%|,y M?8Z#7I\q˭uja[UPKJLQ`xW/8#?}'Pv%P}'a) x 0Ga}ŻuYC1"&/u2g_[QF6=]4+*"[ hG5PnFASdv鼟}qg^XRMIGDGRd3 ;n%Kp6aW-8T$5H]tǽy_L=0' &O>}s;gc]T$KIBq8%-V!%2Lv-C\wlhzƥ|tmhc^YVTV\l0@O{>c9c* &?k$=XwK9J[lŽxcUIB<72.*'%&+4Kpf4\ -wRmyb;-Iq /JjH+;MavԪ~|{}E6,$  BwP+{(Mq,R"Bc/LmS ,>Qhu}tmhda_^]^chv) %[J q*N7q@e8 <[h );Pgdx˽aZUQONMMORZez)JPjt*Qt6?gY5Sv(1EZsltPLIGHIJLSYh|<.\`Ak߂) 9VwK/CXp҄xUIJMRY^pV0Jhp>^y򣅦desc Little CMS Little CMSdesc2.x 2.xlcms2-2.6/testbed/new.icc0000644002406300000240000005000012311617072014624 0ustar mariamausersPlcms mntrRGB XYZ 2 acspAPPL-lcms5pv_9\desc\bcprt>dmddblumidwtptxbkptclrt~vcgt rXYZ 4gXYZ HbXYZ \rTRC pgTRC pbTRC ptarg DDevD DCIED DmetaN,desc4384BR2textThis profile is free of known copyright restrictions.desc4384BR2XYZ *XYZ z ZXYZ clrtRed8!FGreen0Y 9BlueoXvcgt5Pk & @[v1Kf !!"<#V$q%&'()+,,-G.a/|012356778R9l:;<=>@ A'BBC]DwEFGHIJKLN OP&Q4RBSPT^UkVyWXYZ[\]^_abc d-e;fIgWheisjklmnopqrsu vw'x5yBzP{^|l}z~̈́ۅ؏̐ymaVJ>2&ߣӤǥti]QE9-! ڸιú|pdXL@4)ʰ˘fM5ӹԡՈoV>% ݪޑx_G.hP7qY@'zbI0  !"#$%&'()*+,-./01234|5z6w7u8r9p:m;kc?a@^A\BYCWDTERFOGMHJIHJEKCL@M>N;O9P6Q4R1S/T,U*V'W%X#Y Z[\]^_`a b cdeffghijklmnopqrstuvwxyz{|}~~|ywtromjhec`^[YVTQOMJHEC@>;9641/,*'%"  v0aL | 7 g " R =m(XCs.^  !"J##$z%5%&'e( ()*P+ +,-;-./k0&012V3345A567q8,89:\;;<=G>>?x@2@ABcCCDENF FG~H9HIJiK$KLMTNNOP?PQRoS*STUZVVWXEYYZv[0[\]t^U_7``abcd~e`fAg"hhijkljmKn-oopqrsutVu7vvwxyz{`|B}#~~ǀkL-чuW8܎aB$ۖ֗ј̙ǚ›|wrmhc^YTOJE@;61,'" ;ιϴЯѪҥӠXYZ qB XYZ `1rXYZ $ curvtextCTI3 DISPLAY "4384BR2" ORIGINATOR "colord-session" DESCRIPTOR "Calibration Target chart information 3" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB_XYZ" TARGET_INSTRUMENT "X-Rite DTP94 [Quato Silver Haze Pro]" INSTRUMENT_TYPE_SPECTRAL "NO" NORMALIZED_TO_Y_100 "YES" LUMINANCE_XYZ_CDM2 "128.252500 134.440000 137.132500" NUMBER_OF_FIELDS 7 NUMBER_OF_SETS 64 BEGIN_DATA_FORMAT SAMPLE_ID RGB_R RGB_G RGB_B XYZ_X XYZ_Y XYZ_Z END_DATA_FORMAT BEGIN_DATA 1 100 100 100 95.38896326 99.97025138 101.9931578 2 100 100 100 95.37408895 100 102.0080321 3 100 100 100 95.38896326 99.97025138 101.9857207 4 100 100 100 95.3815261 100 101.9634092 5 0 0 0 0.1933660568 0.1710545887 0.3867321136 6 25 0 0 1.487431206 0.951955972 0.5577867024 7 50 0 0 7.161981258 4.313550498 1.308939462 8 75 0 0 18.5557043 11.06648817 2.491447271 9 100 0 0 42.52565819 25.18964748 3.31697159 10 0 25 0 1.152759185 2.149338093 0.7362784471 11 0 50 0 5.652238584 11.35653726 2.394764242 12 0 75 0 15.63290198 31.48148148 5.689424364 13 0 100 0 35.52729436 70.19187863 9.958351926 14 0 0 25 0.6247211066 0.2751747732 2.550944519 15 0 0 50 2.863305072 0.8180871635 13.96697903 16 0 0 75 8.158560167 2.141900937 40.94154395 17 0 0 100 17.21701621 4.625911052 87.2973375 18 6.25 6.25 6.25 0.2082403689 0.1859289008 0.3495463335 19 12.5 12.5 12.5 0.5652238584 0.5726610144 0.6247211066 20 18.75 18.75 18.75 1.487431206 1.546928455 1.591551391 21 25 25 25 2.959988101 3.116168377 3.175665625 22 31.25 31.25 31.25 5.109326194 5.399375279 5.600178492 23 37.5 37.5 37.5 7.942882642 8.411423472 8.850215678 24 43.75 43.75 43.75 11.38628588 12.00356983 12.62085379 25 50 50 50 15.75933363 16.62204373 17.49962814 26 56.25 56.25 56.25 20.88353414 22.02885617 23.96995389 27 62.5 62.5 62.5 26.98943924 28.49918191 31.47404433 28 68.75 68.75 68.75 34.22579206 36.18176409 40.16064257 29 75 75 75 43.07600773 45.45589766 49.89587982 30 81.25 81.25 81.25 52.8409936 55.62248996 62.04819277 31 87.5 87.5 87.5 63.90748178 67.31369924 75.19708463 32 93.75 93.75 93.75 77.49516585 81.31786405 88.57652834 33 100 0 100 60.01784917 29.78580991 92.38435222 34 100 100 0 77.90420943 95.29971739 12.91090287 35 0 100 100 52.7071248 74.86241261 97.06232337 36 54.227 0 100 25.63587684 9.556745501 89.57310724 37 0 67.814 100 29.29495761 29.15365164 91.70013387 38 0 100 34.283 36.61311914 70.5860479 15.07511528 39 0 34.855 100 19.6043433 9.467499628 88.3459765 40 100 0 53.821 46.03599584 26.05979473 20.93559423 41 100 55.006 0 49.44965045 39.275621 5.838167485 42 56.429 100 0 44.95760821 75.84411721 11.18548267 43 100 42.757 100 63.84054737 37.62457236 93.81228618 44 100 100 56.832 82.01695672 96.4301651 33.56388517 45 42.451 100 100 57.79413952 77.83727503 98.79518072 46 0 100 67.815 41.82656552 71.90242451 41.48445634 47 58.183 100 44.674 47.79860181 76.85557043 22.01398185 48 42.409 33.398 100 24.33437454 11.84738956 89.97471367 49 0 63.335 42.399 12.04075562 21.16614607 12.86627993 50 54.78 0 52.865 11.89201249 5.986910605 17.88636026 51 100 46.703 55.499 51.09326194 35.79503198 24.4087461 52 55.807 54.103 0 15.7816451 19.03911944 3.978878477 53 0 36.169 56.382 6.485200059 6.314145471 20.37780753 54 45.803 70.663 100 36.65774208 35.36367693 94.09489811 55 99.231 23.678 26.672 43.98334077 27.09355942 6.440577123 56 27.345 72.335 11.447 16.00475978 29.85274431 5.644801428 57 27.483 78.209 75.536 27.88189796 39.07481779 48.8844266 58 94.03 74.092 26.52 49.38271605 50.78833854 11.12598542 59 25.852 29.218 73.777 10.9103079 5.986910605 40.86717239 60 64.983 25.469 23.618 14.51732857 10.06247211 4.246616094 61 84.07 24.167 72.32 33.19946452 18.42183549 41.64807378 62 66.623 77.218 13.019 30.87163469 42.45128663 8.03956567 63 29.388 82.697 43.101 24.26000297 42.49590956 17.04596162 64 27.732 0.39212 49.211 4.425107839 1.770043136 13.92235609 END_DATA CAL ORIGINATOR "colord-session" DESCRIPTOR "Device Calibration Curves" DEVICE_CLASS "DISPLAY" COLOR_REP "RGB" TARGET_INSTRUMENT "dtp94" NUMBER_OF_FIELDS 4 NUMBER_OF_SETS 256 BEGIN_DATA_FORMAT RGB_I RGB_R RGB_G RGB_B END_DATA_FORMAT BEGIN_DATA 0 0 0 0 0.003921568627 0.00431372549 0.003868337153 0.002849707156 0.007843137255 0.00862745098 0.007736674306 0.005699414311 0.01176470588 0.01294117647 0.01160501146 0.008549121467 0.01568627451 0.01725490196 0.01547334861 0.01139882862 0.01960784314 0.02156862745 0.01934168577 0.01424853578 0.02352941176 0.02588235294 0.02321002292 0.01709824293 0.02745098039 0.03019607843 0.02707836007 0.01994795009 0.03137254902 0.03450980392 0.03094669722 0.02279765724 0.03529411765 0.03882352941 0.03481503438 0.0256473644 0.03921568627 0.0431372549 0.03868337153 0.02849707156 0.0431372549 0.04745098039 0.04255170868 0.03134677871 0.04705882353 0.05176470588 0.04642004584 0.03419648587 0.05098039216 0.05607843137 0.05028838299 0.03704619302 0.05490196078 0.06039215686 0.05415672014 0.03989590018 0.05882352941 0.06470588235 0.0580250573 0.04274560733 0.06274509804 0.06901960784 0.06189339445 0.04559531449 0.06666666667 0.07333333333 0.0657617316 0.04844502165 0.07058823529 0.07764705882 0.06963006875 0.0512947288 0.07450980392 0.08196078431 0.07349840591 0.05414443596 0.07843137255 0.0862745098 0.07736674306 0.05699414311 0.08235294118 0.09058823529 0.08123508021 0.05984385027 0.0862745098 0.09490196078 0.08510341737 0.06269355742 0.09019607843 0.09921568627 0.08897175452 0.06554326458 0.09411764706 0.1035294118 0.09284009167 0.06839297173 0.09803921569 0.1078431373 0.09670842883 0.07124267889 0.1019607843 0.1121568627 0.100576766 0.07409238605 0.1058823529 0.1164705882 0.1044451031 0.0769420932 0.1098039216 0.1207843137 0.1083134403 0.07979180036 0.1137254902 0.1250980392 0.1121817774 0.08264150751 0.1176470588 0.1294117647 0.1160501146 0.08549121467 0.1215686275 0.1337254902 0.1199184517 0.08834092182 0.1254901961 0.1380392157 0.1237867889 0.09119062898 0.1294117647 0.1423529412 0.1276551261 0.09404033613 0.1333333333 0.1466666667 0.1315234632 0.09689004329 0.137254902 0.1509803922 0.1353918004 0.09973975045 0.1411764706 0.1552941176 0.1392601375 0.1025894576 0.1450980392 0.1596078431 0.1431284747 0.1054391648 0.1490196078 0.1639215686 0.1469968118 0.1082888719 0.1529411765 0.1682352941 0.150865149 0.1111385791 0.1568627451 0.1725490196 0.1547334861 0.1139882862 0.1607843137 0.1768627451 0.1586018233 0.1168379934 0.1647058824 0.1811764706 0.1624701604 0.1196877005 0.168627451 0.1854901961 0.1663384976 0.1225374077 0.1725490196 0.1898039216 0.1702068347 0.1253871148 0.1764705882 0.1941176471 0.1740751719 0.128236822 0.1803921569 0.1984313725 0.177943509 0.1310865292 0.1843137255 0.202745098 0.1818118462 0.1339362363 0.1882352941 0.2070588235 0.1856801833 0.1367859435 0.1921568627 0.211372549 0.1895485205 0.1396356506 0.1960784314 0.2156862745 0.1934168577 0.1424853578 0.2 0.22 0.1972851948 0.1453350649 0.2039215686 0.2243137255 0.201153532 0.1481847721 0.2078431373 0.228627451 0.2050218691 0.1510344792 0.2117647059 0.2329411765 0.2088902063 0.1538841864 0.2156862745 0.237254902 0.2127585434 0.1567338936 0.2196078431 0.2415686275 0.2166268806 0.1595836007 0.2235294118 0.2458823529 0.2204952177 0.1624333079 0.2274509804 0.2501960784 0.2243635549 0.165283015 0.231372549 0.2545098039 0.228231892 0.1681327222 0.2352941176 0.2588235294 0.2321002292 0.1709824293 0.2392156863 0.2631372549 0.2359685663 0.1738321365 0.2431372549 0.2674509804 0.2398369035 0.1766818436 0.2470588235 0.2717647059 0.2437052406 0.1795315508 0.2509803922 0.2760294118 0.2475735778 0.182381258 0.2549019608 0.2801470588 0.2514419149 0.1852309651 0.2588235294 0.2842647059 0.2553102521 0.1880806723 0.262745098 0.2883823529 0.2591785893 0.1909303794 0.2666666667 0.2925 0.2630469264 0.1937800866 0.2705882353 0.2966176471 0.2669152636 0.1966297937 0.2745098039 0.3007352941 0.2707836007 0.1994795009 0.2784313725 0.3048529412 0.2746519379 0.202329208 0.2823529412 0.3089705882 0.278520275 0.2051789152 0.2862745098 0.3130882353 0.2823886122 0.2080286224 0.2901960784 0.3172058824 0.2862569493 0.2108783295 0.2941176471 0.3213235294 0.2901252865 0.2137280367 0.2980392157 0.3254411765 0.2939936236 0.2165777438 0.3019607843 0.3295588235 0.2978619608 0.219427451 0.3058823529 0.3336764706 0.3017302979 0.2222771581 0.3098039216 0.3377941176 0.3055986351 0.2251268653 0.3137254902 0.3419117647 0.3094669722 0.2279765724 0.3176470588 0.3460294118 0.3133353094 0.2308262796 0.3215686275 0.3501470588 0.3172036465 0.2336759868 0.3254901961 0.3542647059 0.3210719837 0.2365256939 0.3294117647 0.3583823529 0.3249403209 0.2393754011 0.3333333333 0.3625 0.328808658 0.2422251082 0.337254902 0.3666176471 0.3326769952 0.2450748154 0.3411764706 0.3707352941 0.3365453323 0.2479245225 0.3450980392 0.3748529412 0.3404136695 0.2507742297 0.3490196078 0.3789705882 0.3442820066 0.2536239368 0.3529411765 0.3830882353 0.3481503438 0.256473644 0.3568627451 0.3872058824 0.3520186809 0.2593233512 0.3607843137 0.3913235294 0.3558870181 0.2621730583 0.3647058824 0.3954411765 0.3597553552 0.2650227655 0.368627451 0.3995588235 0.3636236924 0.2678724726 0.3725490196 0.4036764706 0.3674920295 0.2707221798 0.3764705882 0.4077941176 0.3713603667 0.2735718869 0.3803921569 0.4119117647 0.3752287038 0.2764215941 0.3843137255 0.4160294118 0.379097041 0.2792713012 0.3882352941 0.4201470588 0.3829653782 0.2821210084 0.3921568627 0.4242647059 0.3868337153 0.2849707156 0.3960784314 0.4283823529 0.3907020525 0.2878204227 0.4 0.4325 0.3945703896 0.2906701299 0.4039215686 0.4366176471 0.3984387268 0.293519837 0.4078431373 0.4407352941 0.4023070639 0.2963695442 0.4117647059 0.4448529412 0.4061754011 0.2992192513 0.4156862745 0.4489705882 0.4100437382 0.3020689585 0.4196078431 0.4530882353 0.4139120754 0.3049186656 0.4235294118 0.4572058824 0.4177804125 0.3077683728 0.4274509804 0.4613235294 0.4216487497 0.31061808 0.431372549 0.4654411765 0.4255170868 0.3134677871 0.4352941176 0.4695588235 0.429385424 0.3163174943 0.4392156863 0.4736764706 0.4332537611 0.3191672014 0.4431372549 0.4777941176 0.4371220983 0.3220169086 0.4470588235 0.4819117647 0.4409904354 0.3248666157 0.4509803922 0.4860294118 0.4448587726 0.3277163229 0.4549019608 0.4901470588 0.4487271098 0.33056603 0.4588235294 0.4942647059 0.4525954469 0.3334157372 0.462745098 0.4983823529 0.4564637841 0.3362654444 0.4666666667 0.5025 0.4603321212 0.3391151515 0.4705882353 0.5066176471 0.4642004584 0.3419648587 0.4745098039 0.5107352941 0.4680687955 0.3448145658 0.4784313725 0.5148529412 0.4719371327 0.347664273 0.4823529412 0.5189705882 0.4758054698 0.3505139801 0.4862745098 0.5230882353 0.479673807 0.3533636873 0.4901960784 0.5272058824 0.4835421441 0.3562133944 0.4941176471 0.5313235294 0.4874104813 0.3590631016 0.4980392157 0.5354411765 0.4912788184 0.3619128088 0.5019607843 0.5393627451 0.4951471556 0.3650566336 0.5058823529 0.5430882353 0.4990154927 0.368494576 0.5098039216 0.5468137255 0.5028838299 0.3719325185 0.5137254902 0.5505392157 0.506752167 0.3753704609 0.5176470588 0.5542647059 0.5106205042 0.3788084034 0.5215686275 0.5579901961 0.5144888414 0.3822463458 0.5254901961 0.5617156863 0.5183571785 0.3856842883 0.5294117647 0.5654411765 0.5222255157 0.3891222307 0.5333333333 0.5691666667 0.5260938528 0.3925601732 0.537254902 0.5728921569 0.52996219 0.3959981156 0.5411764706 0.5766176471 0.5338305271 0.3994360581 0.5450980392 0.5803431373 0.5376988643 0.4028740005 0.5490196078 0.5840686275 0.5415672014 0.406311943 0.5529411765 0.5877941176 0.5454355386 0.4097498854 0.5568627451 0.5915196078 0.5493038757 0.4131878279 0.5607843137 0.595245098 0.5531722129 0.4166257703 0.5647058824 0.5989705882 0.55704055 0.4200637128 0.568627451 0.6026960784 0.5609088872 0.4235016552 0.5725490196 0.6064215686 0.5647772243 0.4269395977 0.5764705882 0.6101470588 0.5686455615 0.4303775401 0.5803921569 0.613872549 0.5725138987 0.4338154826 0.5843137255 0.6175980392 0.5763822358 0.437253425 0.5882352941 0.6213235294 0.580250573 0.4406913675 0.5921568627 0.6250490196 0.5841189101 0.4441293099 0.5960784314 0.6287745098 0.5879872473 0.4475672524 0.6 0.6325 0.5918555844 0.4510051948 0.6039215686 0.6362254902 0.5957239216 0.4544431373 0.6078431373 0.6399509804 0.5995922587 0.4578810797 0.6117647059 0.6436764706 0.6034605959 0.4613190222 0.6156862745 0.6474019608 0.607328933 0.4647569646 0.6196078431 0.651127451 0.6111972702 0.4681949071 0.6235294118 0.6548529412 0.6150656073 0.4716328495 0.6274509804 0.6585784314 0.6189339445 0.475070792 0.631372549 0.6623039216 0.6228022816 0.4785087344 0.6352941176 0.6660294118 0.6266706188 0.4819466769 0.6392156863 0.669754902 0.6305389559 0.4853846193 0.6431372549 0.6734803922 0.6344072931 0.4888225618 0.6470588235 0.6772058824 0.6382756303 0.4922605042 0.6509803922 0.6809313725 0.6421439674 0.4956984467 0.6549019608 0.6846568627 0.6460123046 0.4991363891 0.6588235294 0.6883823529 0.6498806417 0.5025743316 0.662745098 0.6921078431 0.6537489789 0.506012274 0.6666666667 0.6958333333 0.657617316 0.5094502165 0.6705882353 0.6995588235 0.6614856532 0.5128881589 0.6745098039 0.7032843137 0.6653539903 0.5163261013 0.6784313725 0.7070098039 0.6692223275 0.5197640438 0.6823529412 0.7107352941 0.6730906646 0.5232019862 0.6862745098 0.7144607843 0.6769590018 0.5266399287 0.6901960784 0.7181862745 0.6808273389 0.5300778711 0.6941176471 0.7219117647 0.6846956761 0.5335158136 0.6980392157 0.7256372549 0.6885640132 0.536953756 0.7019607843 0.7293627451 0.6924323504 0.5403916985 0.7058823529 0.7330882353 0.6963006875 0.5438296409 0.7098039216 0.7368137255 0.7001690247 0.5472675834 0.7137254902 0.7405392157 0.7040373619 0.5507055258 0.7176470588 0.7442647059 0.707905699 0.5541434683 0.7215686275 0.7479901961 0.7117740362 0.5575814107 0.7254901961 0.7517156863 0.7156423733 0.5610193532 0.7294117647 0.7554411765 0.7195107105 0.5644572956 0.7333333333 0.7591666667 0.7233790476 0.5678952381 0.737254902 0.7628921569 0.7272473848 0.5713331805 0.7411764706 0.7666176471 0.7311157219 0.574771123 0.7450980392 0.7703431373 0.7349840591 0.5782090654 0.7490196078 0.7740686275 0.7388523962 0.5816470079 0.7529411765 0.7776470588 0.7427207334 0.585379068 0.7568627451 0.7811764706 0.7465890705 0.5892091673 0.7607843137 0.7847058824 0.7504574077 0.5930392666 0.7647058824 0.7882352941 0.7543257448 0.5968693659 0.768627451 0.7917647059 0.758194082 0.6006994652 0.7725490196 0.7952941176 0.7620624191 0.6045295646 0.7764705882 0.7988235294 0.7659307563 0.6083596639 0.7803921569 0.8023529412 0.7697990935 0.6121897632 0.7843137255 0.8058823529 0.7736674306 0.6160198625 0.7882352941 0.8094117647 0.7775357678 0.6198499618 0.7921568627 0.8129411765 0.7814041049 0.6236800611 0.7960784314 0.8164705882 0.7852724421 0.6275101604 0.8 0.82 0.7891407792 0.6313402597 0.8039215686 0.8235294118 0.7930091164 0.6351703591 0.8078431373 0.8270588235 0.7968774535 0.6390004584 0.8117647059 0.8305882353 0.8007457907 0.6428305577 0.8156862745 0.8341176471 0.8046141278 0.646660657 0.8196078431 0.8376470588 0.808482465 0.6504907563 0.8235294118 0.8411764706 0.8123508021 0.6543208556 0.8274509804 0.8447058824 0.8162191393 0.6581509549 0.831372549 0.8482352941 0.8200874764 0.6619810542 0.8352941176 0.8517647059 0.8239558136 0.6658111536 0.8392156863 0.8552941176 0.8278241508 0.6696412529 0.8431372549 0.8588235294 0.8316924879 0.6734713522 0.8470588235 0.8623529412 0.8355608251 0.6773014515 0.8509803922 0.8658823529 0.8394291622 0.6811315508 0.8549019608 0.8694117647 0.8432974994 0.6849616501 0.8588235294 0.8729411765 0.8471658365 0.6887917494 0.862745098 0.8764705882 0.8510341737 0.6926218487 0.8666666667 0.88 0.8549025108 0.6964519481 0.8705882353 0.8835294118 0.858770848 0.7002820474 0.8745098039 0.8870588235 0.8626391851 0.7041121467 0.8784313725 0.8905882353 0.8665075223 0.707942246 0.8823529412 0.8941176471 0.8703758594 0.7117723453 0.8862745098 0.8976470588 0.8742441966 0.7156024446 0.8901960784 0.9011764706 0.8781125337 0.7194325439 0.8941176471 0.9047058824 0.8819808709 0.7232626432 0.8980392157 0.9082352941 0.885849208 0.7270927426 0.9019607843 0.9117647059 0.8897175452 0.7309228419 0.9058823529 0.9152941176 0.8935858824 0.7347529412 0.9098039216 0.9188235294 0.8974542195 0.7385830405 0.9137254902 0.9223529412 0.9013225567 0.7424131398 0.9176470588 0.9258823529 0.9051908938 0.7462432391 0.9215686275 0.9294117647 0.909059231 0.7500733384 0.9254901961 0.9329411765 0.9129275681 0.7539034377 0.9294117647 0.9364705882 0.9167959053 0.7577335371 0.9333333333 0.94 0.9206642424 0.7615636364 0.937254902 0.9435294118 0.9245325796 0.7653937357 0.9411764706 0.9470588235 0.9284009167 0.769223835 0.9450980392 0.9505882353 0.9322692539 0.7730539343 0.9490196078 0.9541176471 0.936137591 0.7768840336 0.9529411765 0.9576470588 0.9400059282 0.7807141329 0.9568627451 0.9611764706 0.9438742653 0.7845442322 0.9607843137 0.9647058824 0.9477426025 0.7883743316 0.9647058824 0.9682352941 0.9516109396 0.7922044309 0.968627451 0.9717647059 0.9554792768 0.7960345302 0.9725490196 0.9752941176 0.959347614 0.7998646295 0.9764705882 0.9788235294 0.9632159511 0.8036947288 0.9803921569 0.9823529412 0.9670842883 0.8075248281 0.9843137255 0.9858823529 0.9709526254 0.8113549274 0.9882352941 0.9894117647 0.9748209626 0.8151850267 0.9921568627 0.9929411765 0.9786892997 0.8190151261 0.9960784314 0.9964705882 0.9825576369 0.8228452254 1 1 0.986425974 0.8266753247 END_DATA dict$ "6$*8>T ^t  MEASUREMENT_devicedtp94MAPPING_device_idxrandr-Lenovo Group LimitedQualitylowLicenseCC0DATA_sourcecalibCMF_version0.1.29CMF_binarycolord-sessionCMF_productcolordlcms2-2.6/testbed/testcms2.h0000755002406300000240000000602012311617072015276 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #ifndef TESTCMS2_H #define TESTCMS2_H #ifdef _MSC_VER # define _CRT_SECURE_NO_WARNINGS 1 # include "crtdbg.h" # include #endif #include "lcms2_internal.h" #define cmsmin(a, b) (((a) < (b)) ? (a) : (b)) // Used to mark special pointers void DebugMemDontCheckThis(void *Ptr); cmsBool IsGoodVal(const char *title, cmsFloat64Number in, cmsFloat64Number out, cmsFloat64Number max); cmsBool IsGoodFixed15_16(const char *title, cmsFloat64Number in, cmsFloat64Number out); cmsBool IsGoodFixed8_8(const char *title, cmsFloat64Number in, cmsFloat64Number out); cmsBool IsGoodWord(const char *title, cmsUInt16Number in, cmsUInt16Number out); cmsBool IsGoodWordPrec(const char *title, cmsUInt16Number in, cmsUInt16Number out, cmsUInt16Number maxErr); void* PluginMemHandler(void); cmsContext WatchDogContext(void* usr); void ResetFatalError(void); void Die(const char* Reason); void Dot(void); void Fail(const char* frm, ...); void SubTest(const char* frm, ...); void TestMemoryLeaks(cmsBool ok); void Say(const char* str); // Plug-in tests cmsInt32Number CheckSimpleContext(void); cmsInt32Number CheckAllocContext(void); cmsInt32Number CheckAlarmColorsContext(void); cmsInt32Number CheckAdaptationStateContext(void); cmsInt32Number CheckInterp1DPlugin(void); cmsInt32Number CheckInterp3DPlugin(void); cmsInt32Number CheckParametricCurvePlugin(void); cmsInt32Number CheckFormattersPlugin(void); cmsInt32Number CheckTagTypePlugin(void); cmsInt32Number CheckMPEPlugin(void); cmsInt32Number CheckOptimizationPlugin(void); cmsInt32Number CheckIntentPlugin(void); cmsInt32Number CheckTransformPlugin(void); cmsInt32Number CheckMutexPlugin(void); cmsInt32Number CheckOptimizationPluginLeak(void); // Zoo void CheckProfileZOO(void); #endif lcms2-2.6/testbed/toosmall.icc0000755002406300000240000000023612311617072015676 0ustar mariamauserslcms prtrGRAYLab   acspMSFTlcms-lcmsdesccprtX"B2lcms2-2.6/testbed/test4.icc0000755002406300000240000016713412311617072015122 0ustar mariamausers\lcms spacRGB Lab %acspMSFT-lcms4V*Lm,W!֌] desclA2B0ttA2B1uB2A0w8t4B2A1lrig0h wtpttcprtPchad,dmnd2dmdd8$mluc enUSPTest profile, not suitable for real usemAB  PsparaparaparaparaparaparawyBRn aJe zT]oVvPO8RHBɢ=D: 6N#2&?.(*,P%/а xX0z|g~s#8jeWa*YLQJaD]"&>& :(B7P*A3-0N0z,@3|(S6F$o~rQ8uxAyoX[~Df(]. QT"Mi%F(ה@+<|.81-4441m7<-:*`<9&gui!k~ 5pt!tk"$fya'LY)P,GI.錶C1ʐ>4:-6B5:!2b=/@5+C`(q)_R*(`'\aV(e0{v(i4p+ng~.s^,0z-Uc3>MZ5̈́F7@Q9m;<7D@n4Ce0wFT-IH)6QVk51W3X1Z탑0^*x2rcm57hd8Gn[ :TtR)v~DsA? D:JGp46YI2PLu.O+AN.AO?O=rP9R`:Wv/<]j?-c4`Ai^WCoO$F6u_H2IzBK!=;Nd8P׈v4jS&0MU3,sMFLF]2LFȞIGMEGEK0DPNstFVgH]\KYdST MjLPKpES+v?V{;^Xrw6Z82\ׇ.V[>\??ǮY?TV>Re=vP?]NCB}O"HpPRQcS*XYU_JQ7XSeJKZl"C]r9>R`OwE9bd{5dOP0oi)9Rh9/g8̮He 7B(an5]568[t6Z$:|{ZBn\L~`^*SWKaZO`baHNegBJhsm YgEPʕKI',E|<,J,QT!+*)b(իk'&9:&Ϙ&.v'v*{-w/]o 6c>SXݝODhP$S)Ȼ*>)(?Zi' i%ϭ?$.#ѭ "]" "#bh%$4*>x0/OnQ+6b̥5={Wk1 {S wrɑRjIΔa Z?xRl)'KTE @P"1B/6>512G4੏.7˫ *:^'uYw xᅤ{6|  s_"SNj$`&KRX(Pf+0J."hC10>A4 :c6693Y;Ƥ/>H,AA)I%mo&p'r[(ux*-yjo,H~Tf .2\/ׇTr2]8M65;yG7h@:<8=38F?4B61E/-G *m/f:1g1tiވ2@l3sp uY4et k6xbr8X~XY:43Q2yD!:dFw6zHf2Kq/N'+<^` =_>t`Ӑ=Mb.SR^RqT̃AR2XwSH^lScbUPiYWsooQY(tJ[zC]U >6_! 9`5"b$0`FaGdaGawH`HJ_~KB_EO;]USt]GYoi^_^`dVajROcpRHehucAgIz@eM;nksFpp@qu:szV5z{ sB$}ErHos{OgcsUZ5tZR"va/Kx8fEyl^>{q8ۆ+9!¤v98ps8涾\8u F7ݪ7#[677r9,~=g{'}cC4mF}Jh`~zPW~VWO܀]"IÂxcCyh<6T7O6*p5޴5 4U3'3FA3z l5߅9x@jj҇G!^NVKOSNYH\_AR5Ū5l4ט4 3S3E2z1ez1 1,4W'a8pu_{>h瑢En]}LUE{QMWRF֠s3c3)3=13312ӳ2q=1tv16 0›01Oi4Bj8s>|g/D\JT@P L1Ǩ2)1L1rϨq0\F0o0/b6..2/013|7aq2$=eģxC[pDIRد/ȵ<0vj0e65/Ĺ˰.ֵ-ױ9-nX,dk#+_+ZQ+m,D/N12zc6o<dBZ5dw:e"w2n Uf$]mUN I!#BC %><(W:R+Ѯ6.C31̱/r4+X7G'-Ɍ?{?*rrC '$il!`#{X%/Pe)NI+ܣC.E>0Ƨ;3~C76\4,9S0<9W_65a'0X8TZV-U\.WmR\Xȗ\-Z9[]4[`ze[dp\MiOf]m^^s1U`nxN"b'}'Gxc܁@eh<gO7ch2dM0g[NJhP~iQGhRkgTBfVσMf8Zwfe_lfdpcgi/[fB>󼨋?bJ@e@Њ@2@kCA# PCE}=K!pQ[dV[҇*[TPbaMNftF‹k?E;S7<5<5B<>˔<6< ;Ρ_<&<2?(yBz;GnuMaPSyYʑGXRd]KcDtr9˜:69)9!B9ű#9U9J89ߙ9f:X V Q![IL7v77Ӥ77÷7&7Z7#JC6x67X=8H+;Q?;t衧DtiJ^O&VSO"56365͹P5y5 w4磌45H4}4֘]53 6ڇ9%~%=KsBhG]qLTƳ"3h+G4Ă4_=43&q3!2άȲ2[2X2fns2U3Y5O]7p{;q@fıAE\HDy%X{ߛ sQZja< wY"RZ$vL"'AF)5?,</$a8u2}45Z=183I-; a*jpI I"5S~#ٓvw%Zn& d(h\'+S-MlL/ĦxF21@x4㪾<7ìF9^:6=ʮ2@/pC,%ׅU(r9*у,bz-{q/!h1Ob_3.W5KOs8_H:rmB[<ɤ=?Y:sB^7D3G30aIK-.k~ 0~3Ј6q7cw8m:Jd<[=S?ZLhB#ED,?G<Ik8K5ND1Ph."8ur;Wv=wn?xA{}"B~ysCӂwjDE,Ta8FXH`PJfJ>L|SCNy>vPQ:S?6Uo3 W/lD)mJ;FmHnJpKr2LuiyMxpJN|gJP_^QeV?SNTH:VAXՔ=Z͗9\Ӛ[5^1OdRe=TfěUgVjWxlcXovXswmrYwdZ{\\mS]L_;Fnm19nI4h4T3kUZlVݧnoWnY}m[,m]mkavzqme3pkn0iXgoFm^_-p~rOWaqvOs{lItB_uɃQntVcu҂[8k_aلVd=Z-bhRΆmKrE7wo>0C{ҎD`E(EtF):F!GaH qJOd L~9Qs\\\U˙a5Nj)fFP[=]>U>z>nG>:>\>ɥIX>۟ ?PA?Џ1CnYG0ySKn7GPaUZZSѣ^K;Rɳ;%< {<}_<z<R< q<GF@DwYIl)NX`iSXݪX0P9<ʦj9Ė9S9غ9Q9o99{9ݮt:1:< =^B\uFjmOL_wPVQ6G7vH8'7J79h7xO7P7HI7>d7d07Ŗ 8E9v<}n?s=YDzhI]Ě?c9+E w"o#?f$e?^5&RcV(XN+H-/B04> 1wf:u4)68!3;0>߸,#r0[&(*I)Θ}{'+r,Oi-_/X 1f9O3I6PHC]9>< S;? r7A4D<~15F-+%<.0/,2~3&v51m^6d*8\>[a:WRåEA ?CM.3l6W9(;m郦=pz>GSqw?ސhmAl_CWDOmG;XHI9BK> N:PHC7R3T۪//<}S,Wu\LkX`_byd[5hTBlLrDDy˳7E FhFݜ}GGH{Id֜XJuߜHL[O3}Ss SXhОJ\_C`XdQj/HoAjBBݤCPbCDߤDWD EhF{zI(L?{0]OpUAf1Y]]V bM4}>~?}IJ?ؾg?\@,>S@d!@AޫA9B_C E?sIjx M>naRscV[\P10"S>iGB>h9?~H@:BFvߴJlwOaaTXb:#Ź/:2;;ýu;k;;»;ũ,m;䣗I< <<*<@p~ Cu`H=jMU_6" $&mۄ'|({at)\l*>c#+Z,Rs.rL0-$F*3@r4<9D8<)5r?2 BX_.*$',ܚE.E 0N1MwY2:,n3te4ڨ\6WgT?8IL:F-JȮG:MTx7iO4Qޱ08[Hi;n>@ֆBu~-D6uEmFטd HO[_JS L)L3NJFPf?RW IY/C][T>o\Y:^ۦ!7`3I}kM}HP}S~hyUXY;weZY nt[Ge\ߍ]`^-U`1N?aژ9Gc4AceFn:M?oǙ;Jq6`krdl6|gZlNim˜ko#^lpދmr݃5nuzQoxqap|hrVz`sjGXtQ#uJeww_Dx>Gz_8mbpcsOdΪuevg wh1xjVyfmzplw?zsno{wfC}z^@~e~@V́OpH܉B,a:<yKZi|:[ظ#]3^q{_$`ИRb~"eSg}Äk(tCnkr6cu\?yyT}RMOF1?RJTV2WBX^%Yv[ b\_Pbzefqqih䑩mjaq!Y”[tRr=yK<}CMē Na]OyLMqӡNN<硚OP:PLR7U~YOuy<]^kRa$cRre[ͧ"hT\mL EͨFŌ{GEHШHI2IȦ(GJozwKrLeNJQ|U%rYik ]`ƮqaXްf9PiC CDF[D寋DwTEjkEFrrG& HZI?豞K7}MzQ1pVgZ^>_JT@q @Z}AT|tAŽB BV&B%>C_CD'GDޓ[FC_)HEPKJxKNnz3SdXZ=X}>+>Đ_?\h?|[n?G?ǰ1%@h\@>o@AAECA%E6n-GwKlPa*ew,|-.t/^yg/ٰ=q'0h0dr_10W2+O4 KI7C8ɽ[>=(:@V]7PC3EǾ0R1.L3:$5j7"w8<,|:9t93k;:ӭa; Y<ƱPS>J9ADC4?FE;H8TK\~4M1U75΢:o=h ?߇@ ASvBznuCdD\$FESH!LjJ]F"Lv?NSYbl:[7K]Ͱ3AEfIHL/OEQَS~l, :m6qX?}\}P_}b}ϙey~{PaØ~bƁd*qe4^f'NDg!Xhk/mapwfsnڌpvfz _,:}WɁPLI,BYȻ[S\%0]˯w^ܧ_|ac ɓe~h0}/kwtInl,ordluZ\ܚ9xU||N#FS̑T~lUH:WX*Y>5ZpB[䕩]jk`?cJzɟpfqwj i~mMa䣬pZrDtUV"ZXu^^5lacҴ{e[鶏iSXG*GɃFH鲉I!߳{I sJNMJqKLM˶_M=NM*PJR|cVsZiɻ6^{`CbWDPDEZF@,FG2GHPTHI9d IhdK2M6ɿOzZ RpEWg\[]@YASBkƐ BC(zïCS6ZCCЬ/|DYŗD0E9m Q?܁@FBx@ϰpAQgA´^BZVCe NDE HGGAJ!=L!:kO*6Qq$3@>ѦcA8 D}F* G}ŃHt{dI(]sGIjsJڭaU0;WT8Y4cD}m9HgK-җN&YnO[P~JQvhz:j6S7ϲ WD3[e^gauᏃbӎdq~ e9ufRmgdhܚA\juCTl MmaGo7ZAp̦@='r.8t\ `dYݥgjAl0m͇nzp brtqIjrx|asYuR$vKx2Ez`šbc:4fih}ktnlTr eu6]ZexU|MsQ$TBEUV᧚XY#wZ%[Q{z\Ƭ5^o`ÃoczSgqjziCmbHNqZjtQN%;mO&OêoQůRK#%SznT{~Uy|dV$X Y1\/F"_twʷ)bnfdg?i_&OmVnwK6̲L)LňXMrkN'N޹jOv"PhݺQZ*nRSXUXB~[u_ lQbcg?ZGӺH_I'JsRKKKL4MMXNO1&QĻT|Ws..[i__nDtE 6FFwXFF`GPɌGH:ʫH͡(IˊJx K׌#zMԃPzT+pXfC;;=+=Z>">6v>A{J>5s)> j>b=FZ=dP?ýJAsDTD9$?=G#G;Ic8 Lc48ACdEKF4FG!}\GduVGmHdHz\+HSJSLLV FRNG@@QP|o}QEfQɵ^bRdVSNUyQHWBZY>[2Y:r]6IK ^NKQɡkTߓVg."WxXL*z~X評r~Y«iZa [X\RP^dJ`Da]?VcI;e+7QDU|YT\%S^C_M`}aVub{mcddا\f Tg^Mi nGjAlr=nL?8Y8 E]9`ѓZ3d%NghȔijykךqlם'i>mΟ9`&odXp¤jQr>tKs¨1ETuF?w:aĺe=timOdorȏMs/~tG[~uw^uvmwex™t][z4QU{Nm}EH~ˢC rC.{/}K}u9m+eiSc]ډnV1~PN۝Gҍ j2͒tjĤSkSl'lmuwno̓Tq*]s7vzWxre{jA~ob郎[VބŞ:OLa֛6b*bcdf _g ЦJht2iߐlnGq wso3vgy`PT}+XPm"Ynպ%['\']\]+^Z{_ۥaUbSdInfLi}yl/to.lyr^gJfk[ƼL5ֶLMMrN]ônNԽxOZŃO!fP8QhRvȖSa-TɤW BYi~v\u`Gl"ΕdbĔH׃IȇJ.ˇ'JoVJ=̴J߻͎KL]Kð(LlM&oN O>LYPōRӅҞU_|ӧXsEՀ\hC]ID۹ءEr:E֐ElNEE[wE6pD h*EƇ`^D^WDsO#DHH)CNJ>mMpDz:Odz6HBKL}MMOMѷrmN-NXyN`qNiOaOmYO6QQRiRj:Xɶ\:G_]bG(d衮fXYgFƁhyh0r iaMijCPaVk8+Yal QlmKinEpH[?r0;;` cӚ\g$jX;lњ9nڛOop}qur]ms?e"tF]#u|'UvNx+tHyC%{]r=HgkēM5o¬\rbu/wGy;z(J{'Dy{aq|Üi}f}`~ơYj+nR0cL6+F@)pgtދx$|z)ׁkČvj~vwn/Zf^&ڛMVϋ-OAIώ CRz{v~ǃ@ zuVԊU]݋>Ru6x{26rWj󒑐Kb[qiTDpMٛF{|9#|me{Ϻ{kR{ԩԔ|BO}&g~ ftxW2pDhs``Y QϢ3Js1zs[#sws|sʮcgts)uF8vxۢ1wʍyl{E}}u|:m^e^3$AVnNܛiԵjzk ä8kqel,lݪmnǚp άqɭEsĂٮBv1zoxr{j޲~bc1[l9SCa0؜bЫcgcԿ&daze}fgy7hgxjZ7lkF ne,`q?wsovh$y`Z}gWخ[pز,\І}]9]{Z^#^ֳ_iV`Mac{!xe] gR i}lu@Yomrdfvm[뷂VºsW"WXsELYY$ZN[/\ű]HcU^`gǒbsȝedzhvr?˺kip_1QŸQRƩSS\SɃT[ʑToˈU`V`6WX.mZN\Cϱ^S3aux idoCheSɡLMԶͯN$NDЬNOO4ӳP=9ԄQ?ReRyTRE UתW^Y:ٍ]]uuK`kLK߾2LѿMY˞lMzL?LRLƨ|LgtL;&mLL*qeKˀ^FK VlJeNJ,HYMy=BNQ>=SdO9PܸR{S1oTT,U-UQ0~U5vMU.znUkg-UH_UƞXDVDPWoJ|XƉDXZ!r>\<Ɲ:UNW㳺Yx[P\p:]]$]jx2]spC]ῠh^M4a{^Y_aQ`pKaEb@ d;ZKd]R_a[Mc2dְe ezf"Zrf`k8gOcg\h5bT%iMSj'Gk#Al<`p@$cfQQ*h)lkl֎emnmZ}nuonofCp^qGWr Os@Its~D v!>fס龯j.)m`pM7rEt?vw#LawUyxqxiyLaz@VZe{6R|w L}ڲ G _@m>ˆq3uřSxȘ6{}؞}c~ :v }a~9uLm.eQ1]섍=VхOŇI0CvƯz풑;~wqWz뚈˒7)=ၪ˗yŋcr$jaŽ2ZmTqSM?FMN뇺u8 ސOH+Œ%su0~= vUדnf^VWњPIRϘő=/9zصgCi-ќI)ṫ*r‰;{m֋swk*cG\@JUMF|K{v{w´{0F{&{़|}&~-SVtbGfxepxha+AYQrs7sZ̨sq{ssѭCtxzuQEvtx ny{Y}}u/möÃHUTlAV*]S_a$brcRc(dL|zd`W|Ld@:tdMmkdZfd_eX2e[Pf?rJg'DhQŕ>b +dó"f޳é^hٳj\٘8k֏l6\l~lCwlo}lwh]m2amZnR2nKoEpU?fjA}l+ogzq| sAǒVt5+tܱu yu6rmuku湷cvL\vTw)Nx;HDzZAmvÌp짷DtBƯv٦y1Z{O|Xx}YJ}꫰}S~u~"n~f_hX/PށﶒJabDst#xʼ{~ß8P׃ q1Ѣ0ŀydNqꇱj&bt魐[7ܮTHMqG6}Ḿ6Єʘ3,Q8덺ۚFU%(}-y un f'Ts^hWP͖J-ԓ_DŁ](_LѢfՑfҘד≴yry0jWb=p[BT]M-?%ҊL퉦ԉIΉH~󖟢Sk⍁o~9~sYSvpogd_`XuʜP=Z^ ž?CWnPi‚ݣӃjBPϋJ*qʼn2{sɍkdx;SXy>{e}n}u`mZMf]]{l.ျ]l]إlpy$laȀ;lLêllޱImnVǧo}=Rp̒trt:vz,y r͐{jPbaeMģe]4e[ҰefVʣene'f/#fή?gЦhɟsj4k4m\,o 0\qwtodxif˼^2w^z^^ԛѸ^5^<ԇ^s}_yc_+ab5z؏c{./dfڀhvj}qEmt>qFkEWQ WܻWXXʐYO!zZq[RK[|@WZZYEY}Yҍv;Y$nYhjY>ԱaXkZXԼT"XAMXZdGK[@`aÀbĮKb,)c'mcMȜcVZcI1 c̨wbp bNib\c3zƗ蝕Õ,jdc}UkvnΠt%fD_@XlP畇ܙǑX[$#`5UƧE%PCz&nSrƪ?k1cd[᭏RT@`գŊ:ɩp 3׮3Ka\ݰ^xNm5ۍeJ)~(3v.oa:g˶'`!WdBgb?ҵqUgEϸk֣WR3„R,߇n{)sQl/dg#\J}#||IIl{ʾ{+R~{" {({Ã|.}\5~2żՃ"x݅tqU9i@>`jttܻ?tvnŇt5;Ǒs)sݼRs4KtXiu̽u6w0#xL}yᅉ`{}}е}uOmӥe'MmCmކJm^l"!ltѹl̿ҚmTtmNCnL nհo!>q;rΊרtYvzzyar"|bieӒe߹՚eטee%eÖf#hf>܄gF *hFi?cdjkXߟm=To"SrYww[uRn]VG]R]Fm]}Խ]u0^oNjQ_4_ҹ`{abc{eDHfE1hBj}znt(bc_B/b} biVbj#@b7asaՅYazatּsa.\l`f_`P_uاY_R`)עLa`FDgHki)_j6ҭ|j:cjˣ*kɔlk jcjС{jѩtiҠn icӏgigahz[hBShMFiEG!lz3nI_pÃypo.qlrcrOrǗrUr^}orevQqmoEqiqAlcp\gpХUpaMqHqAs}̺ uRw55xiyDVzzFчrzo$;zLx?zWq?yjyydy7˩^y.AVy4Oy-IZvιy{丗X}¸N u 2D&zb 7sulÁ]fR`XQwňJD}"q‚ͷbΦ3$8Z#9ty}Unv?8o=hqݿaӊiZpShELj.[Cn$6Q,v9[А]}ۀcyCϴr:۶k=5d`]|4VZwOL&XAڥE"> Ǧ]L̩GW|SuhnKg(N`/@jYnnR$ci:Nr\ܟG?%k$y3 g'6ylWrTF j𥽪c\iɭUFr>ǣۗVK˪K>җɝ(cљt#&}h3v,P o:g^B_ZjX0z ё԰*AÞP5ȲF>)qcjXM͉zBҷzOHrktc%[e⊴?F@w V,7ۿ1[q5/(qh,~!wo)hg;`橽!LiªBPĻ]lxǧT9w%%^؛ɞ2ʋK{BtJj)ldb}iƏ}|gY|$Q{ǩ{Ud*{Gk{Jzѕ{㧮 |wb}ү~kD.[$xm~qˈ}h*uu?ttզtw t@00t8jtRٸtYulvP`wxPxܹyꅫ{}h~ u&mDkmmmܳm\ջfm3i߀mmG3mimnw:/o8p]@Nq s%tmwz2yrfce;eeH?eњf ʚfkÉQfμgF|ghԧQiƟ jXl3npo#~rw jskкk|vj Sj_jtl^jdi:imٓhQxh]qg]kBf&efF^eXUfۡQf9K)oUq#˾rL̘nrҩs(@yNYn󘏳mU}'*v?o]PhZb[),S_$n#8½H޺g-٩)?n󘡡яޯD 䲢y:rf#kdġܸ^Vٳ]ȥT%@mߩC=MǜQ̌*2:ͪ|umn\g`Yܠ`݂cӂiI°< vg(q v{ZqޠA=գ0ޥyϦr(kg"d`\yz& x=җ:.#+.ݽ9?׽,+#<}vio>&Wg_F.둝ܖ(˃ݐp01?=%ϐl-*ڡ_xƔƔJz@sSk5dHɊ劕7-˪LJA5+u(W{pojOϋ]Fōoߐwцp DhDhw}9ӛ8a t˃x!92n![݆)PP{@t-l=~&c}{}bߖz|\|Pܻ|Ƹ{޼{u{֯|djV|}ؘ'1~ ကF|x呆p۶vvKuuuZ u(Wt³t1uާonimncmD߇]lCWہXRt.Q}iŲ\v%\3/B w^)ז-f2Ӎ~}ԙxiՓq#~k~Re}`}^װYs|FR>sȶ.O$ŸIQ>|CYʀ_˹hۉfvys]"m(gB a^Zԅ/ӐS[nҋ'=$T0.šJ8%ː V4@Z?V|;u-̢nhЍcb\TϻU+뽒pνyD\˶~5c^i€3ä~,xSƥqikLdӖ!y^}=Wc&Ù`"u1!@nJ&q<!-W;;¿zC4s m%CfמĄ`PY֊ |-Ѳ( ĩ?\w;>>0G}ڬѡ%ۮc\谩ᲒyqslT·,ee^ĦߨS֯yƊץvrJuȦO󦧜ʺwl¨axڄ-U}:!vPomҰKhAa%{q۪zG ݞÖhGܞ̩[!̠%âZÈmXՁG2kz( s&EkҪ)dXĈNǘYzژ3ϨuGٿD՗߶DuEf ="ѕq׍gœ1̃~!TJvóh̟λu۵^ӖA!hh*Ֆ̑bR,}Q{:ߕ‚5p{ֈ4s=3l>/dFRwم@c:ݚQxtPݦގQ)参߻}wlnoEɅ3f)Ғl%h샱u噃ti؅N=ؓȆ͋fm{ s,M?~~qހ} ,}L}VZ}%i*}$}--W}|}!~h9}]pԃw^wuwN}wKlvdvvGvgv=¹vDwnvd&vȬwr!2x,{xiykz^!{|Q{זł|J}Z\}ٲ3}?w|sIU{޲hzy<-x(w{ wtzvL2n2uhdubtE\vs LyXҹ3JDqId,|+us‹neKâgNaҴO۵ {سֳؾi`ϴGɴ4Aܺ+zor~ݺ}w: qUjOоcgپcԭ°SÜÉL;Uǡf.l \.泘zasdm)fǒAޮʂTWTo̫}ȧ&̹/a& ˗ݕf͍Wʊ V~%ɡw#(Xp.Shiyѝ_YңA}}0ӳ;Ÿá]6nӠ٢!ԓQNwڂ18Vzs,l\ % %dG4lܮ!G4"dK݋`如5Z_MMGܖ~ܞ4w}ܾ pn`-YUJo䡒[c叓嶓Vԓ+݊D''ߘ{篚s=m]'ctg~i鉌_VꄌJPT f샌:MczF؏^mrZ-v{P2짇!ƆɆO$Ѯ)(+ƲT!nl{#JQz򞀭􎀽y'ݙR$3p$!~~}tgР7GcurvcurvcurvmAB  PHyS6{j,paraffc G 33paraffc G 33paraffc G 33mBA  Psparaparaparaparaparapara?ĪtZ k"z%e۔$8LN&&(sqtz(茪f(]d(by J! '! $"n"3 aʡFy Z!Q#k%$)Ɖ)du)r'ϋd6(ӊb(1\!e("&""L"߇# zų1쥻 ed!%#Nxt'LjEx )ck)c0)U^#}I #xf'#~$D$!}$d%!u8"ŵ`:aʔFL}#~uy'Y|m)+yrc )bs{Qo(vyM1%5m*f&t\&%w@"&A|' &o 3tN/[f:{88sud"sn 'ncx)KhR)%mN&f6%\f%'Nj"(rF!u(v0M){WɋE 8z] u|tMoEgq dc'aY~(^K(X8(NX((e] #'b)OhhErXNiA[}ˡU}¢ n"iv`z{Yj/T[3%QO(M>+I,*N',USa9ZbIgZY>r4d)|p,lV8jjd ]: W.Qyt?4H.` CS${@yDn)=,5,>+Q4HE3#T>MKXx VactnCqayH~ ][FΓYiM:H @os>9+]0Jl#.:(((7d51)B>#N*IIUXT(bs]nixzuS7+g0!3Ip>=udM60sA ,+^L('L1#%=8W$.qD,Y)Oj5$Z?6!ndK4-mVc+ycbfOr~!x+~0 +C/)5u'#%w.-#a6O\>4F?E1RQ&^([*%d4!o@$vJjWweזp`]+/+p/$<"04~LB rlLT5] RN!W<^E-eU#$o%!w/u1CHTKa+/+/' ƢBP؋[x 7{`[if"ZkhHn9s({ ~"! J*S?gDLRU*`+/+/MQ]Ʈ_uRnBRrgԆu qxy*g|4V^b>Fn7%ݑt "!ԡ"q@OJt,w.x,.iwTYgLqՙ pvcؕb|TeuDЛ5@%*z!8[$!÷'j#-6@ #0, oXykT[/J;-%м'!%"#%5$'*%._֟TͯZ鲯z#@PصM dS=S]+A/"Čh&/#&c%c&b&&SO ("A,>%F7$${&כ͋&(.YuO(ݍEg^(e (gb KA (!$7xWsŞ= Ҝ#Л!%tl$ۊ'-)0#sN'Ōed(ċFc&'[ G!%" "j"i#pߟT i U!×x$K.#y'x(o(ecl(_"vH"{'#~$@#? $dyJ%30+6`ʭ9@ۘîzh?%~xw'U}on)%{d)wV(wL$op-3&u'%z"$&f}H&~('?' y"+t_o'pUd|(lV)mN&g6z$g%v'l")s (y;)|X5= =_  lV|nyr΅UmkuS .gCgm&cZ'a:M(\6;'Y((5^"T(d92DlJGu5ZM:mϓ6 Φ w:xp eaQ]BnUeW^%TNP'uP@)L/B*yP-%2 UY?M^yKi[ u0gSso6nXLkѲ ^kWz=vJe!^GJPoT^7Lq?\|')#h#G$&%aƮ'%!@=!ӑ৥̪zzm}/+p@WTBS'6 '#'ǘ&' ''7䮝ܢm! %!Ɨ$ &&v!(Xw*g`(e"ύ/_#.c\U ("yN?JJYjc ڠ#䘴%Pm$'(t*(Jf(c'Zy 2F!I&0" " tx7k.١}gOӫQ !Y$ؖ'x'z(Nq((Ie (߉R`!H",~(#Rt$#`$f[%HnmgPb(i즖"#6u"G{'ls)~7g)zYg(*ymLq$/r-$u%%h} !f&&Ä'.r!cG3 ,}g]!wt' u i(q])nO&Xjk8%1i%(oV"{(s)b{n.-聚Z<PÐ M" levPpOzXjj&e] 'cbO'^=(0\*'_R,'f|a6oMz+]ˀn4 zѣ7 [mt{jmarIU[b%*XNS(%SD)P2<+O5W| AaM k^xSiiVyTisBs$5o] jeΛsM\ KT)ng&OPv_,MP2aJ A5H029oIiDStPV]]ij@uKdv+eի0eΗ`T8N0 $Im0Ey^7B N>??C;AO0"GCx RhN]YheDOuqr|?Ќv+0%aQ]`L#BA#A,2(>n7<:^3D8OK7@&Pn8i0T:"k^F&ghQs ]Ii3v]`~1.q+u0 @5P413ȂA2pL16aRY/SWV.bC8\R-2w`/#i9VsE~RzbKQm Nt+0%+/!%m"3<&De(P)x/YV(8g_-&X'c#Gg^!b5j C#sM){|5xES_, Vlu+/-+/'9)4|I`ZՑb ~ikml]-p?Lu-lpQc8BFS&)?FPV-S"`?`Mlmy${n1h yjcf@-]K!W./wSDwV9=Ng%A?K5X1GHHL\K19OPhM;*TQZQ_P\:lhxBt@M+0/%xW7RnNN.IKV=LG{wG>DsgZO BXTAIYqB"9]JD,"aIkTwa/oyPg+0++0.%?2*? >>1M<`y W,:j/\9o\a(7OLIe75;h8,l<.cu7HW'meYp3]7w\+02+02/N/Nɮ?:/rS 2.^2~d1oh/`l-OpQ+t>+sj*D-v,k~8:G.U+b:իoL+08,/ЖEzuوX"e' n)DMr'wv%\gy#4T{B}/ނ b#@&qK64HT2T>],/Ж,.ФlWsX? ! ЂL^o \Kύ<=JB,' ="#,0"MF6SI,/М{!:&*d?[iE|(6o~ni!XG6$4 a%_#Oz(r${Ɵ*%)#~;y"ו!ԣuϥų4 XޒfyB c/NQ#@-&g!q&\%&ǿ'&A)\&Д5$ٸ#z"QeϽČٵŤaP'q4^0N(2l["(%(gɗ*)?)(= ӧy}禚)!S;n$á`#΢qI&8&M(z)Xu*9jV$b@$w^s'W!Az #Ϩwe!S;u"f$o#ʞc&y+(N~w(oZ(od"\ +Dlu%1bQ u,PӦI&|h m$h_M$!b'ꂤ)]sl(g(-` 셬I 4)!ֈM#g# l R"Z%PHE蹮HyUՠ"˔# %it(كm#*`<'}ZN y8/#w|g%%xJp&U'ˇ<E<8Ҹ qyˆɋ!}ya&y}nA(vb}(psMRO%|p8=$nz*))Is -z 1TQ`~DOԔh؋m>⃋zԅ'Dvw,Fqj/m[/jJ/%g6(0g.";8lPFcu5Ú)k5Loam҈ 3t S [w\%=q-lt3qg^d7cvVF8`D;`w1?]a gHmgWt*dqm~ {|_%*ɺ s9#dl-if6a4r={]1bBvZiRG+YBKG[2 O.^"jVce7p`q|^}%Amۍps*os^iE*a'I8[kGBW pJTaTQRR-USBYV3^[&%a_omlG|myTGmH}qa[k],`+%Y9TGPveQ~Mq XKb^*KGRbKmC#fN4jIRO'@mXn z%d(O;r䓊|ky)+0(6*1 JT4K"lKH,aXF`DsyeSCYeiAkTn@@Dr%CT5uEF( xLZ:דfhgt#){+0<+0#I9R7L8#_;iR;m:wq8iNu6X y74F|345L6'u:H-+KJ[9 Xe*r+0rͫ,/#ЮSB%Zf)t0|y2|1+.?n̂+\)MJӇ&9.%'ˋ(?q;2MFvxU4c,/Т,/мvW"߁_$(A%^#w bUPd >z/M!ҫ&"6~tD ÏUj ,/ Щ0$Oݍ]#6i bŢ٤V%#=YmN[|Jj9㯖%,M "*'$ƻ)%WC!%-%0ڱ$O!B\ΟuLھ`'6_!kF<&X1CeZ)21#'0&'tȷ('d0-)%˞%/ر#zdu əɾ!I7$rf`"Pnɒ4M)$)P')f)'(t*H(sƪ 2_t Oīg!.ǨW$ #&ģAN&ԏ(0q)#},(o% cn$_!s#G & #q!%n,oӧ "n$)#Q&yK(z(ϕq$ey#Û^y0=ڒ$#ic ըg͸&yT 0$ $ 'SO)Wu(mi#^e 鈸J /B!: L!z$Ֆ"f`"a?&u'ͅx)m(*b'Y~P< }^:"V&u$Ӆ*B&ɇ3&` Fw|ձRҘPQgP%#+;v.~_i.{ Y-x>F*_v1,Zt"R2|~D~@V_k<#z`tӭ(mc ^#h,F~72yq5u+c]6*qR6'o>09*p,E@oh.JzBZsmڑuqHn7  3ڸ!:5,y{4t|9ko0l>;kj^@hM-Ch:%IXk$*uN4m[wgKwFLG{o ڣ D~ (%u砽4o=i{Eek'K c&[vPbK"TGd6;Xtgy,]jgqti@t0s䁾Q}%rEFvި xܢ!r#d4 jCBcL)_lzS]jZ+["[N^\Kb|_TkdgTB[kTKomW=fs>[/v>`@"t~?iNuC~+03B+62-V.-B^T0VQ"bOHjN }nLns>B 0E !ДR_ 2Xl_t|,/1Ч,/7c/9u3i8cQ:}:R-r8v5wdo3S\1CB1000138!.<>|zPxiY3fq,/#Юo(L~'&S+~-- ]+~~F*jE(X3!%5F=!3ȤtI O )-Z:L%VZ,/еM&߾&ڤ%ѯ+˭X.@kq¬$_kS^Mp~S:%`#$(%*&4,I"&ř9'`L&bلR#[՘ŽH#GК1Hmr!Z{G,u')((T*( 9+'ޝ<'1ݣ&%؜!VB Rʔ#*˵Qct&bʦ.R 6`X&*9(a)$))<*(R? Fk !u" ŧ#qC'ʔh'1a(x9')Ф~~)ht%d$p_w&,G$$$&)$$j^C|K P9 | !ʪvz$U#d•4&ᢆ'u%)vz(imr$x`z>]+!7"P%aQ6٫ ~5z#u<$o.$v")zV+n(` v6L=0R 씋#%'hO I6ިjg&!ݜ%O))Ґ4-Yw-hb,ևW&B#!1($/%4BgUmr=ض^Aאܠx\=)B H1ʆ6kly9:|j;yZ = wFAx&3Fy"Nc~{A^(o2fw۝PW$1{Ó%2NN9|@wuEt]f I^rULqaCRs3Wv$L^{9lzj{|]O';CY*v07~LM`̑_ 2+0=M.T6:@_O]@aZ);lXVtVW )xVYx;}[TfSUV?F.Y7z]h*d7p_y5O+0&u,.{W KgMӵvN2}O49NTWM*zJha8IIWwJGbL8 P+Uc?oEwO,.i_-0.tҊqc:=BM|DÏ&DȓYB~?Wl=[5<8J;:9=)iBSU^༚m5,/-кv,`꾈,ܟ0P4#f748 5sP3xqƦ1_/N*;pa'7'w--$7@2ŜR6ƶa`8)])C+K))o2$q&À&%TM$%z4[#fS@u>|(n&q&ȵ*S&J?{#ɾR"荈(Ez+((0'ۮ,!mЃʖ8rʞ4P=-pSX] ɈKt/6':*))++c(,S(e1(r(8'>ڸö#pH]!nѻ v w&! dk!JSΦZ8q̈'1+i")?*d*)˴+z)W۹& ,b!"HE"cK#,!';^'v(y)~)Gu-%.eEU (#\(2&ƿ'(&.' &- Ϭ:! "{+#%/#O'"K|ů(sb ߫Sp"fL##)фi-Uqv+\f–xO(6g,+"*w&h)ұf+?\R?w@.%J o(-v13~2pp1`@+rH %;-%׌'LQAΝw@bЪ2E | WQhi (ؤS.ߕ\3’7+$x8i7V6@9*<jJ5z]%];kS"ɣjhj-!8/r6<8@υIs}BbODRKNVHB:N^+>UUcpn4j|eŗt86W1+T8vB lHـ~N}nRB{U^GUzoKZb|v:_,fς<"o=B|ӗōin9`B' t=7ܶ^DOXz?Vw}\umat\fuLjj/x{jw0W~{{!L-S`#\ (&k*)kpcj3rt?ItxY!nej"oMhu]gz0z(fn4~+fp]ˁh?N3k?_)p 1t$ m}I? !+0GY3!ZdqGheq9]elc7vaR~`tr_A^*oO]d^^NbH?;f2tPk<%(t)}+00р-.ҒcbSuW"X&XX1X VHmTCqS`9SPjV@Z3w_f&4Cgԯrq|,.sj-J.Ң}@s"I [sLȽ,NHO# L%IXtXGcOFRFA~JY1^M""TKcÄp,/7~./ي4Oꃫ;r$>xBCO>K;yov8gix6Vx_3C1<.ܽ3G ǺW!cf7 :+爏+͡b,.t/>0?Υ_04J.,D,)6P)n.:&Zů EIZ0Z*(,('ʯE$oWK#Ē)ᝢA*í*ަ4*&I̩&Y!U~*ї!St#!az΂ :N;2(+CB+*,@)V˱- ()ދ)l)Bݚƨ&|ٶ#!։#^#tM!Siӹ"$#,yr#cf,#kUY, :Ͷ(P,@ *+ ̝+E*JS,)XK!OX!L"޳x"ڮ-#.'p'ڪW*TP*ѧ8)u&KCg驩G !ǁ+~$)u'C(;(v'j8",$c!3#"Fkj$:\'+1*@ *֨):r%ꦚdCû(?% &(tƮ&*3%ۜZؽaܯ!s#!%D)癰*+4(o Wd7*"V& g) Iw+]^=SK^Sv!{+ի -1F4u4Ay64^g07O)2x+9u-X:EަRf fT5Տƙ)֩ձ 4h8v͏;=~r?=p^<ҐGG?ΐ0DCё:N'e_p* ?ޅۑ&fĄ5J0VxMZg^*UcFCiD4QnnQ&CtYmv"Q #st&^1K٦@ȏTM؈߬lWԄ,f_*`e~wj~eo ~UseENvڄ6,{w'֋c$}Z (|.BŊلQ׃W^P}f+gz?oxň v~w~wyw4f}xUs{Fp86j)ŊOE )p-x.spZpa !+0Jц: `S$k2lm+wktkʼnjph摘gGyfggWWjwGѝm8ٟr,"y? Ɓ跚 +09ь-1.ҩnZbaʔGbo b4{`ǟ7]{r\h]JX_Hb88e+kGu? - .|w-c.Ҹ Jw'1R uWYE,8Ys8SVTS}wrQ\k˱PZôPIx,S77˸U_(Ĺ]-Xj` v0,/@ҁv5휙 6.pBu|J᮸LmȧpM`YHiEɽB5oV?^$‹-C.҆PŸ_(,,5fM[x} g4pqyIP/o8u^ O@C͋1M#GQl#! -DrN2tI}aI6FnFzO|"{,l3z@ yxoy^8{OZ>@у2ޟ=$# *"Y3 _CFg\owvX uދt;sק~s>WqRҟpLp⢭p_rOu@ݩIzP3(k&W%{ m,.|`-Wv`琉qk}l lGljSgf]r^XfgawhQjg@Ln2s$oz MÏm-.҃xJ]N-dZ oR/8zi5-0.tҋT6}?-ZK~TWZWySi]OhLx4IfL˾FR>ΌDX:/ 4B7fGӈGƳ9Cଐմ@ *-+,U,+X͏-D*O^F" ٶh#s$5'?d(R*j+,ω.4-iv(U\#6N,&4˱*(*K))(%WCwA ΂D[b5#s%5'R*nT +?}..u%+˹m &IwU$+'ʟ))_'+'7&u&c۹@=8 krҔ4"c{^'ʘ)u'a!M¹bm>&$(*}ȳ&w@m Md ߺlTWߚ\ܾ/p ַ&/(5FyF8o '8mx4Q](1bE:S2ܸHV4ōtvǚBd 'ca\.*i6Ƚ@|G>xL"M>pMcTVN:YT^'_zkֲc$ Rz#د c$%-.ᅭ@<7J)ݮR>Y^]f(~Q`cjMd!Ti*@3pw0va}k&W&眩(T*٨38zB{ֻO~7Z9rb{hm'z`qߘfuԙnTzݛbC64J$} ( K,'1%C.T'ӏ`1UGiqf xv}ґxl̒fDž?UɈqF;6EC 'Bq1^+00*@ rVʕGeҔpeQz ̋? @=x2'g<4VG8$j)C 9٪!0=t _8z#TǀiGx|Å+ޅA@K՘^oÜ ygg/cW{~HN\8Dz*L!'.a 6|cSSmSis{oع~F^}ҳ%}ɦ{*,zz!Jyhd{HX}HL؀84D)JǾk- .҇k^~Oe)q둢vLߝv+Avku.21ϼ.g,Ε.+G5X'-Zͳ. .A`ײ/S1\1~XU0&]ٱ.`-vZh,S~+j*Y(x@6+.Ͼ,,-c+,-+|O+5 #$ 'Ym(xq,ͅ.ˑU.G.˦vC* !]%.&͋+()*L(Sm˛ݩ I%?"AΓ'ݫ[,hλ.} .EX,m<)~Q&%,()*}9(4+˹'Fè1 9hHݏD"'Ua-Sіe.̶.QI+LJe'&`B[!H+'jB Ń!;v!i Bf&;ܛє3(8:<=Η>,;'a7$>::J!M!_T^x6" ey"_$$_^~(a.֭=F?Pbƣ@T VzSWP`Y̻Be]+hj{&?&|&۱(j<+55^8FL,5R2\|\XHcWg,(jҭtnS^sHy*5~N$#Ժ  f]a)qtY+X/Ī8FI\M?XcXøl orx]6|5p>^FKN9d9)F.띂+ߔP.ᙳ4kK^ShȮs ̸{ɞåA[Iڜ7pBZ^vrNDm=q|-ٙ {.e.3~eI~]oZyڈzꙒ/:;Ô'\g=p]_?>yOd?0 !yׯ0 2u%H~[ep䮂ߌ^T2t̍ۖY'ƒ@Cq ]`+,O֭ĒL?7f0"!CFAj)Z:r \pwr5Ø2[㵡vb騬!H7Մqq׷ a+WOڹt>ъ`/c㌋Y/-.ҒraZk찗tt:K֑+Cb+|[Tz\8QyTsPHyaCzO+|<}~+v<-1.қVᘗ_4BfiyNpģx߿ƤwdȪu3qםoR̯m`uQilra΢lMn9q&jy"̃ <^H?E-OMo[G`b5nm CiDeرbK؉_wS]}bEL]K܌]o6 b*Y m&v$2b56vM;z4JRSZWz[۷Y^ TbhQ.KψFGt4RA6[F:A4إA1O+Ѫ](ϸj& e0梧4V58eP7B{D6ܮ:ͰV6tw4Q2k0WRٓ/)@;r/10/-]ѰK*WbZ(x/X/6!2,v2Dׇ3و3أ2}Q1 L)/-.J-ls-Z;*B9_,/Т--ϊ.,d.z+#ҘTW $-GI #ŗ@+. -/˷.T.$ζC8ӣsۃd|cSjV(WbD څ1u̲ vV].b뵭=k鰼w=>(7VӬ}z^+xO~ vjgvpUՎw&@nyL,Л~%Ƈ=",Ddş JT&SaFh#֨pFrGpl]i*f}ڶdfޱ`BOKc9}i,Ѻr( |E%[4b9ҼE"N_oZ^׫]^ݺ[ޙVcKSRޤOwJ_jEhFp4H4+iY<-Fәc)om&2Q469+>~D;}HުJޢD!5t!!3!230%&ǚ,1:.~/1Lt.^+.9l.ϲR+KД/+?,K+)C,ν($!ȏ]#mG$a,!@" ^&*ߝD-Ol0u~0U.ŀ[.e.ӑBD.{/.I*N"Wy "#&!˻)Td' cu-c1b/;\MDE-JI܈FH}jESEK&{.Yi<#um"d}/ѿ&K&(,ŏ+8I3pY@p TMZܹZwdĹhڥkWΎnԴuJq9/ZhtA7y!%B>Z*Cy+յa-̼OZ2KU]ؠg?0o\y+v?˨{liˊ҃Sts膵[|LACˉ+Ȓ̾7-_k024ˮ Lw]Vn5wxōKžUʿь*r W]yI"4̟Â!6Lj/R3#{|E5[A.l~,s%y.bϝ8 "mqn}^Lĸ:)3G3JDߑ\VkP~{")q܄j뢋IHXH0ueөNq_EKOڰP>ݳ2-#~G6nnM5Z>o4Cp֛2v2h֋E.&[t+Ӏc)3⍴+4Ѫ6 ֹ6ݯ7!ۚ 9:گ56;4O3._2٤1'm0PZ/Eԩ/1If/Y./-vmX*"9~/H C$f&ݩ(Gڍ -X.u/lȓ4.`."t,^^+ Б0+;V.+i"++)# $ӻ 0!C $Iy'ߨj( g-pb/ i/cS .c.Zpl/67SS_ڮUrBSHӛ(41H^e{Ү:h$Uy”Br0aȓ9 S*Q^=s!b᤭{֊ѵ\յҴϢӴp,s{i4WVGM6S濁$7R_;Cq 1嫄vܗ1Y\pڮ %Ȟ`2,Yۏ7{Ři|PWl(EB3?S"U_%tqYzg‡c~ʖju'1k̶T0Γ>f|Ͼ^iW̡D/`uJi(qv꿥陸V' 3 dٓù#٥3ILo|QafuQTӵQ;Ɣ. R&;`}c\j(tJѴ3j׼ۑµ KiI"sԁ^֮HL4,&'LAYZKbVhvzriw>ضzصU{18wNtMۤro^ko+VSn?Yu01>|,rV( E9KP4w\a;d2i}Led0ޞ`!ޕ^L~[{yXe&XvP_Z9ڝc0Cn+`wm)U45*7H ALq٨Q%WH]8YFR~PKF75L6$ 7t؞:۷Gw!G\o۔6<5t44/iڟ2n1[ڔ0FN092"E0;/Ѯ0D-ԛ\%+6" v7q "X&߰(5I$)m^-ӷ.ΒR/’.c. q-Λ_,1,B.,dШ,,v*$_$Z"u8#?&Mܮ)N).co/tИ/O..͞lP0!St-12. ю.~.)F, L$b%&gC'j2&% T'\G*K.{ͽ0W1t/#w.~1Wef1B<0#1D+T}){$}%î(A˫)Z+}#,JD293إGevQ|W޹yW5U>ހp>S2NW2gw,Hܐ'Fl$(%v*iw,ə/Ϙ;ډOR\o3hЄr uQExux}|1b:F&=2Eځ%E#0-T/df1xRʺRXsd~u@iwŒ: nEۇqoY4Wz'f>'ڧ֊02SN"\~.dwVёו2~Ӡk)'aq[<[JDDZWձ/ >%4.@WkZk5f_DuR뾛ؗIĮĥLl7!\*NCrùZ^̒JQ8*&AZ bwªgi yѶ4\ Gtԙq Y`fscYR`IOǵ=?+ZDd눗iwt~D奚␪܏հUNĴ=Ƀ3öpT@zȶsft`QNRκ;*lxu}ʉ( 湘^Zt梺7Ȫ ۫Zס(֚Ȇ C*r.a]2HJ4GV+}'lu+ufzsuK馼3̛zџCڧԷ޵Rݟ٩bc~*'i'ԛSSӀ>Ӫ1Ph+zbjj#nD-z%l?ӏ؏$V́; inj^y.u{_J͆5Ӟ/;ݑ,+RȦtaOcjmNӀx^ݔ=J)8A5]ځY1'la-@n*&5{X :OSi84י;tHw ,K=Ko.B!6Lܪ5ہ3o^ڸ3b\.2UGm1b2#1 0;KOu.Ղ]-+$S!`"eMt%m'7$)so*d \.m/΢/( .ej.&q-t_K-с1j-I/h-5--R+%DS-&$W%2A(+,+߆/"Ͷ/٤T/>(.E;-͢k0+S.H1./>.Ѻ-Q$&˨'`(X())`(,+e/1R&2ӖR1s.~"1ibd2ՒA1&2}I(ل,WYڣ(;%'ō)f+o+Ps.4Sr=S;5N[@ӽ]>9&_x߂Zp r\WS[8 r?.iދ*s&*j^+qp-yˊ4uЮKݓX5[c oٲqwoy߁޹Ȃg!e&M8*ͣ"%.07-c3".Y\\ӄ+lTQszXۂ:CnngIϚݟ\orG۳Z@!Aũ/w%!1"V5SX^qY'k#ߴ}x xBKͶ3%DTԓ c}Ǵhbص'նJg50+3NW\km y]W;Ԍ&Ӯݹ_Φ4Tk\{`}?՜h$S@y?Ď/L={u]\k}`7}P1dT-Sػ˻Mɮɮ=lʜaˢPY}|δjWxX ϱ5EФz3[$j_.؜m;4%G.d^rի1 DׂB}6N h ԁS׿?j0mzuAs";椝浱1乼yndomvsDڵ赓.!݉etx_J߫6 ]0qYiw넘~LQ/m%ՠ6d9Ч 1@?QZkQ˚kPVZh]BWӑ3PZ/.ace{m?\q^5~˕Aߟׂ,ܰB;J\xG׉&buՌL>(8JG0ӷ-͞_*sc!0ejrgӮ{~y`҄A݊}zڣx`p*FxZ׾zGֱ}6480Ӟ,IfLM\BasMcjg߉mۮqc׽ܲpŶiWg!iVf2GڲfkiCcT6ݾgZ>|n3Xvw/ v+ʲ9KutPrUޓ]ݡ/^xٽar^W,0SPyJdTeIP5RJ7ܙ` 2bgQ.cr+6>XRr;I-ݣL.۷QZګVEߎJ<{D6M53oz4]5KZ2320[r.)a,dparaparaparamBA  @paraparaparas`para  {para*,{paraGI {fU"YNX|3-$ ˙oݦparaj !49gRȪ=parajuELV>8parajELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Kmlcms2-2.6/testbed/zoo_icc.c0000755002406300000240000001667212311617072015170 0ustar mariamausers//--------------------------------------------------------------------------------- // // Little Color Management System // Copyright (c) 1998-2014 Marti Maria Saguer // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //--------------------------------------------------------------------------------- // #include "testcms2.h" // ZOO checks ------------------------------------------------------------------------------------------------------------ #ifdef CMS_IS_WINDOWS_ static char ZOOfolder[cmsMAX_PATH] = "c:\\colormaps\\"; static char ZOOwrite[cmsMAX_PATH] = "c:\\colormaps\\write\\"; static char ZOORawWrite[cmsMAX_PATH] = "c:\\colormaps\\rawwrite\\"; // Read all tags on a profile given by its handle static void ReadAllTags(cmsHPROFILE h) { cmsInt32Number i, n; cmsTagSignature sig; n = cmsGetTagCount(h); for (i=0; i < n; i++) { sig = cmsGetTagSignature(h, i); if (cmsReadTag(h, sig) == NULL) return; } } // Read all tags on a profile given by its handle static void ReadAllRAWTags(cmsHPROFILE h) { cmsInt32Number i, n; cmsTagSignature sig; cmsInt32Number len; n = cmsGetTagCount(h); for (i=0; i < n; i++) { sig = cmsGetTagSignature(h, i); len = cmsReadRawTag(h, sig, NULL, 0); } } static void PrintInfo(cmsHPROFILE h, cmsInfoType Info) { wchar_t* text; cmsInt32Number len; cmsContext id = 0; len = cmsGetProfileInfo(h, Info, "en", "US", NULL, 0); if (len == 0) return; text = _cmsMalloc(id, len); cmsGetProfileInfo(h, Info, "en", "US", text, len); wprintf(L"%s\n", text); _cmsFree(id, text); } static void PrintAllInfos(cmsHPROFILE h) { PrintInfo(h, cmsInfoDescription); PrintInfo(h, cmsInfoManufacturer); PrintInfo(h, cmsInfoModel); PrintInfo(h, cmsInfoCopyright); printf("\n\n"); } static void ReadAllLUTS(cmsHPROFILE h) { cmsPipeline* a; cmsCIEXYZ Black; a = _cmsReadInputLUT(h, INTENT_PERCEPTUAL); if (a) cmsPipelineFree(a); a = _cmsReadInputLUT(h, INTENT_RELATIVE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadInputLUT(h, INTENT_SATURATION); if (a) cmsPipelineFree(a); a = _cmsReadInputLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_PERCEPTUAL); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_RELATIVE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_SATURATION); if (a) cmsPipelineFree(a); a = _cmsReadOutputLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_PERCEPTUAL); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_RELATIVE_COLORIMETRIC); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_SATURATION); if (a) cmsPipelineFree(a); a = _cmsReadDevicelinkLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); if (a) cmsPipelineFree(a); cmsDetectDestinationBlackPoint(&Black, h, INTENT_PERCEPTUAL, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_RELATIVE_COLORIMETRIC, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_SATURATION, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_ABSOLUTE_COLORIMETRIC, 0); cmsDetectTAC(h); } // Check one specimen in the ZOO static cmsInt32Number CheckSingleSpecimen(const char* Profile) { char BuffSrc[256]; char BuffDst[256]; cmsHPROFILE h; sprintf(BuffSrc, "%s%s", ZOOfolder, Profile); sprintf(BuffDst, "%s%s", ZOOwrite, Profile); h = cmsOpenProfileFromFile(BuffSrc, "r"); if (h == NULL) return 0; printf("%s\n", Profile); PrintAllInfos(h); ReadAllTags(h); ReadAllLUTS(h); // ReadAllRAWTags(h); cmsSaveProfileToFile(h, BuffDst); cmsCloseProfile(h); h = cmsOpenProfileFromFile(BuffDst, "r"); if (h == NULL) return 0; ReadAllTags(h); cmsCloseProfile(h); return 1; } static cmsInt32Number CheckRAWSpecimen(const char* Profile) { char BuffSrc[256]; char BuffDst[256]; cmsHPROFILE h; sprintf(BuffSrc, "%s%s", ZOOfolder, Profile); sprintf(BuffDst, "%s%s", ZOORawWrite, Profile); h = cmsOpenProfileFromFile(BuffSrc, "r"); if (h == NULL) return 0; ReadAllTags(h); ReadAllRAWTags(h); cmsSaveProfileToFile(h, BuffDst); cmsCloseProfile(h); h = cmsOpenProfileFromFile(BuffDst, "r"); if (h == NULL) return 0; ReadAllTags(h); cmsCloseProfile(h); return 1; } static int input = 0, disp = 0, output = 0, link = 0, abst = 0, color = 0, named = 0; static int rgb = 0, cmyk = 0, gray = 0, other = 0; static int count_stats(const char* Profile) { char BuffSrc[256]; cmsHPROFILE h; cmsCIEXYZ Black; sprintf(BuffSrc, "%s%s", ZOOfolder, Profile); h = cmsOpenProfileFromFile(BuffSrc, "r"); if (h == NULL) return 0; switch (cmsGetDeviceClass(h)) { case cmsSigInputClass : input++; break; case cmsSigDisplayClass : disp++; break; case cmsSigOutputClass : output++; break; case cmsSigLinkClass : link++; break; case cmsSigAbstractClass : abst++; break; case cmsSigColorSpaceClass : color++; break; case cmsSigNamedColorClass : named ++; break; } switch (cmsGetColorSpace(h)) { case cmsSigRgbData: rgb++; break; case cmsSigCmykData: cmyk++; break; case cmsSigGrayData: gray++; break; default: other++; } cmsDetectDestinationBlackPoint(&Black, h, INTENT_PERCEPTUAL, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_RELATIVE_COLORIMETRIC, 0); cmsDetectDestinationBlackPoint(&Black, h, INTENT_SATURATION, 0); cmsCloseProfile(h); return 1; } void CheckProfileZOO(void) { struct _finddata_t c_file; intptr_t hFile; cmsSetLogErrorHandler(NULL); if ( (hFile = _findfirst("c:\\colormaps\\*.*", &c_file)) == -1L ) printf("No files in current directory"); else { do { if (strcmp(c_file.name, ".") != 0 && strcmp(c_file.name, "..") != 0) { CheckSingleSpecimen( c_file.name); CheckRAWSpecimen( c_file.name); count_stats(c_file.name); TestMemoryLeaks(FALSE); } } while ( _findnext(hFile, &c_file) == 0 ); _findclose(hFile); } ResetFatalError(); } #endif lcms2-2.6/testbed/Makefile.in0000644002406300000240000004012712311617072015431 0ustar mariamausers# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # Makefile for building testcms # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = testcms$(EXEEXT) subdir = testbed DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am_testcms_OBJECTS = testcms2.$(OBJEXT) testplugin.$(OBJEXT) \ zoo_icc.$(OBJEXT) testcms_OBJECTS = $(am_testcms_OBJECTS) testcms_DEPENDENCIES = $(top_builddir)/src/liblcms2.la testcms_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(testcms_LDFLAGS) \ $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(testcms_SOURCES) DIST_SOURCES = $(testcms_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIB_JPEG = @LIB_JPEG@ LIB_MATH = @LIB_MATH@ LIB_THREAD = @LIB_THREAD@ LIB_TIFF = @LIB_TIFF@ LIB_ZLIB = @LIB_ZLIB@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acx_pthread_config = @acx_pthread_config@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ inline = @inline@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/src # CFLAGS = --pedantic -Wall -std=c99 -O2 testcms_LDADD = $(top_builddir)/src/liblcms2.la testcms_LDFLAGS = @LDFLAGS@ testcms_SOURCES = testcms2.c testplugin.c zoo_icc.c testcms2.h EXTRA_DIST = test1.icc bad.icc toosmall.icc test2.icc \ test3.icc test4.icc \ test5.icc ibm-t61.icc all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testbed/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign testbed/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list testcms$(EXEEXT): $(testcms_OBJECTS) $(testcms_DEPENDENCIES) $(EXTRA_testcms_DEPENDENCIES) @rm -f testcms$(EXEEXT) $(testcms_LINK) $(testcms_OBJECTS) $(testcms_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testcms2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testplugin.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoo_icc.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am check: if [ $(top_srcdir) != $(top_builddir) ]; then \ cp $(top_srcdir)/testbed/*.ic? $(top_builddir)/testbed; \ fi ./testcms if [ $(top_srcdir) != $(top_builddir) ]; then \ rm -f $(top_builddir)/testbed/*.ic?; \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: lcms2-2.6/testbed/test3.icc0000755002406300000240000006750412311617072015121 0ustar mariamausersoDlcmsspacRGB Lab  1 acspMSFT-lcmsdescA2B060B2A0760wtptncprtn,#dmndnPdmddntdesc,Test profile, not suitable for real use-Test profile, not suitable for real usemft1  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ymb XPIC$<+6209+?%FLR z {~ ~sh^VN$G*@0963<-B'I!OUopt|yq!~g%^)U-M2E7>=7B1H*M$SY,i-j-m/q{1uq3zg6^:U>MBEF=K6O/T)Y"_=d>e>g?jAm{CrpEvgG{^JUNMQEU=Y6]/b(f!N`NaObPdQgRjzTnpVsgXx^[}U^MaEd=h5l.p'^[^\_]__`aadcgydkofpfht]kyUm~LpDs=w5z.nWnXnYoZo\p^qasexthovlfxq]zuU}zLD=5}S}S}T~U~WY\_bwfnien]rTvL{D=OOPQRTVY\_vcngek\oTsLwDKKLMNOQTVY~]v`mddh\lTpLG©GHIJKMOQTW}Zu]lade\iTCƷDķDEFGHJLOQT}Wt[l^cb[@@@ABCDFHJLOR|UsXk\c<<<=>?@ACEGJLO{RsVj8899:;<=?ACEGJMzPr{od ZRKD&>-731:+@%G MS ~ uj`W O%H+A1:74=.C'I"OUtvy~ }s#h&_*V/N4F9?>8C1I+N%TY.m.n/q0t|2xr5}h7_;V?MCFG>K7P0U)Z#_>g?h?j@lBp{DtqFxgH}^KUNMREV=Z6^/b(g"ObOcPdPfQiSlzTppVtgYy^[~U^MaEe=h6l/p(_]_^__``acbeciyempgqgiu^kzUn~MqEt=w6{.nYnYoZo[p]q`rbsfxuiovmfxr]{vU}{ME=5}T}U~U~VXZ]_cwfnjfn]sUwL{E=PPQRSUWZ]`wcngek]oTtLxDLLMNOPRTWZ]vamdeh\lTpLH©HIIJLMORTW~Zu^lade\iTDƷDŷEEFGIKMORU}Xt[l_db[@@AABCEFHJMOR|UsYk\c<===>?@BDFHJMP{SsVk999::;<>?ACEHJMzPr ~ r g]UM#F)?/963<-B'H!NTxmcZ#R(J.C4<95?/E)K"QV }!~"$u&j)a-X1P6H;@@9E2J,O&UZ0t0u1v3y~4|s7i9`=W@ODGH?M8Q1V*[$`@lAmAnBqCt|EwrG{hJ_MVPNSFW>[7_0c)h"PfPgQhRjSlTo{VsqXwhZ{_\V_NbFf>i6m/q(```a`bacbechdkzfophsgjw^l{VoMrEu>x6{/o[o\p\p^q_qbsethyukpwogys^{wU~|ME=6~V~W~WXZ\^adxholfp]tUxM}E=RRSTUWY[^awenhel]pUuMyENNNOPRTVX[^vbmeei]mTqLI©JJKLMOQSVX~\u_mbdf\jTEǷEŸFFGIJLNPSV}Yt\l`dc\AABBCDFGIKNPS|VtYk]c=>>>?@ACDFIKNP{SsWk:::;;<=>@BDFHKNzQrxlcZ#Q(J-B3<95?/E(K"PV}q!g$^(U-M2E7><7B1G*M$SX%&')x+n.d1[5R9J>BB;G4L-Q'W!\4|4}5~68u:k=b@YCPGHKAO9T2X+]%bCsCtDuEwFy~H|tJjLaOXROUGY?]8a1e*i#RlRlSmToUqVt|XwrY{i\~`^WaOdGg?k7n0r)aebebfchcjdlfo{grqivhkz_m~WpNsFv>y7|/p_q`q`qarcsethukzwnpxrgzv_}zV~NF>6ZZ[\]_adgxjongr^vVzM~F>UUVVXY[^`dwgojfn^rUvMzEPPQRSTVXZ]`wdngek]oUsMLêLLMNOQSUWZ~]v`mdeh]kTGǸGŸH¸HIJLNPRTW}Zu^lade\CCDDEFGIKMORT|Wt[l^d???@ABCDFHJLOR{UsXk;;;<==>@ACEGJLOzRr~ s"h&_*V.N3F8?=8C1H+N%SY"#$&w(l+b/Y3Q7IMBEF>K6P0T)Y"_99:;nAeD[GSJKNCR;V4[-_&d G{G|H}H~JKvMlOcRZUQXI\A_:c2g+k%UsUsVtVuWwYy~Z|t\k^aaYcPfHi@m9p1t*dkdkdlemfogqht|iwskzim~`oXrOuGx@{8~1rdresesfthujvlwo{xrqzuh|y`~}WOG?7^__`acehkynpqhu_yW|NF?YYYZ[]_adgxjomgq^uVxN|FSTTUVWY[]`cwfojfm^qUuMOëOOPQRTUXZ]`vcnfej]mUJǹJŹJ¹KLMNPRTWY~\u`mcef]EFFFGHJKMOQTV}Yt\l`dAABBCDEFHJLNQS|VtYk===>??@BCEGIKNQ{Ts''(*y,o/e2[6S:K>CCZ6^/c(g"KLLMNOyQoSeV\YT\K_CbXAOEGI@N8R1W+\$a56689w;m>cAZDQHILAP:T3Y,^%c<<=>@{ApDgF]IUMLPDT=X5].a(f!FFFGHJvLlNbQYTQWI[A^9b2f+k$QQRRSU|VrXhZ_]W`NcFf>j7n0q)]^^^_`bycoefh]jUmLpDs=v5z.jzkzkzk{l|m~npwqmsdu\wSzK}C;4xqxrxrysytzv{x|z~~|ulcZRJB:jjkkmnprt|wszj}bYQIAccdefghjmo{rruixa{XPH]]^^_`bdfhkymqpht`wWzOWĮW®XXYZ[]_adfxiolgo_sWRɼRǼRüSSTVWY[]`bwenhfl^LMMMNOPRSUWY\~_vbneeHHHHIJKLNOQTVY}[u^mCCCDDEFGIJLNPSU|Xt<<=>?{ApCgF]IULLPDT=X5\.a'f!??@AB}DrFhI_LVONRFV>Z7^/c)g"EEEFHIuKkNbPYSQVHZ@^9b2f+j$MMNNOQzSpUfW]ZU]L`Dc=g5k.o'WWXXYZ\v^l`cbZeQhIkAn:r2u+bcccdeg|hrjil`nWqOtGw?z7}0oooppqrtyupwgy^{U~ME=6{y|y|y|z}{~|~~wne\TLDxxyyz{|~wne]ULEppqqrsuvxz~|uld\SKiæijjklmoprt|wsyk|cZRbdzbijccdefgikmo{rrujwazY\\\]]^_abdfhkymqpis`VVVWWXYZ\^_bdfxiplgPPQQRRSTVWY[]`bweoKKKLLMNOPRSUWY\~^vPPPQRT|UrWhZ_\V_NbFe>i7m/q(RRSSTV}WsYj\a^XaOdGg?k8n0r)VVWWXZ[v]l_caZdQgIjAn9q2u+\]]^^`aycoefg]iTlLoDrw6{/eeeffgi~jtlknbpYsPuHx@{91lllmmnoqxrotfv]yT{L~D<5uuuuvwxy}zt|j~aYQHA9~~ypg^VNF>vmd\SKC|sjbYQI yqh`WOwƬwìwwxyz{}~wof^VoɸoǹpĹpqqrsuvxz~|umeĄ]hhhiijklmoqsu|wtyl|caabbccdeghjknp{rruj[[[\\]^_`acegikymqUUUVVWWXZ[\^`bdgxccddefg}itjjmaoXqPtHw@z8~1eeefghi~julknbpYsQuIxA|91hhhijklmvomqds[uRxJ{B~:3mmmnnopryspufw]zU|ME=5ssttuvwx}ys{j}aXPH@8{{||}}~wne]TLD<|sjbYQIAypg_VNFvmd\TLĤ¥|skbZR~ǰ~Ű~°~zqi`Xv˼vɼvżwwxyz{}~ÂwĄoņglj_ooooppqrtuwxz~|vmҁehhhhiijklnoqsu|wtylaaaabccdeghjlnp{rs[[[[\\]^_`bcegikylĹmijmīmġnėoōpŃqyspufw^yU|M~E=5n¹n³n¬o¢pØpÎrĄsztpvgx^{V}ME=6qqqrrstu{wryi{`}WOG?7uuuvwwxz~{t}kbZQIA9{{{||}~xne]TLD<|riaXPH@wne]TLD|sjbYQIĞypg_WOƩĩvme]TɴǴĴ|skcZ}Ϳ}}~~€‚ÃĄņƈzNJqɌiʎauuvvvwxyz{}~р҂xԄoՆgnnnooppqrtuwxz~|vnggghhiijkmnoqsu|wt`aaaabcdefgijlnp{vȼvȷvȰvȦwȜxɒyɈz|u}lcZRIA:wƽwƷwǰxǧxǝyǓzȉ{}v~lc[RJB:yĽzĸzızĨ{Ğ|Ŕ}Ŋ~Ɓwne\TKC<}~~~ƒypg^VME>|sjaYPH@wne\TLD‘{ri`XPHĚwne]ULƤä|skbZRɮƮ®yph_W˸ɹƹvm™eě]ÄÄĄĄąąņŇƈljȋɌʎ|ːt͑kΔc|||}}~~рҁӃԄՆֈz׊q،iuuuuvvwxyz{}~ကxpmnnnnoppqstuwyz~|vggggghiijkmnpqsu|̴̻̫͎͘͡΄zqh_WNF>˻˴ˬˢ̘̎̅{ri`WOG?ȼɵɭɣəʏʆ|sjaXPH@ŽŶŮťƛƑLj~ulcZRJB‹Šxnf]ULDÑ{ri`XPHĘvmd\TLƠàzqi`XPȩƩªvne]U˳ɳų|skbZͽ˽Ƚþ™ÚĜyŝpǟhȡ`ȋȋȋȋȌɌɍʎʏː̑͒Δ~ϕvїnҙeӃӃӃӄӄӄԅԆՇֈ։׊،َ|ۏtܑk{{|||}}~ဤၛ⃓ㄊ䆂zrttttuuvwxyz{}~xmmmmnnoppqstuwyz~ÈпиаѦѝѓ҉Ҁvmd\SKCÉϿϹϰϧНГЊрwne\TLDċ͹ͱͨΞΔ΋ρxof]UMEĎʺʲʩʠ˖ˍ̃zqh_WNFœżŴūƢƘǏDž|sjbYQIƘ؈vme\TLǟğzqh`XOɧƧ§~umd\T˯ɯİzqi`X͸˸ǹ¹vn­eĮ]ššššÛÛÜĜŝƞƟǠɢ|ʣs˥kͧc͓͓̒̒̒͒ΔΔϕϖЗљҚӛy՝p֟h׊׊׊׊׋؋،،ٍڎڏۑܒݔ~ߕvnㄽㅶ䆮䇦初払犍茄|t{{{{{||}~zsstttuuvwxyz{}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !!"#$%&'()*+,-../0123456789:;<<=>?@ABCDEFGHIIJKLMNOPQRSTUVVWXYZ[\]^_`abccdefghijklmnoppqrstuvwxyz{|}~~  !!"#$%&'()*+,-../0123456789:;<<=>?@ABCDEFGHIIJKLMNOPQRSTUVVWXYZ[\]^_`abccdefghijklmnoppqrstuvwxyz{|}~~kP7kP7kP7kP7kP7kP7kP7kP7kP 7 !!!!!!!!!k Q$7- 111111111k*Q68< ?????????-l>QF8K!MMMMMMMMM.ElPQW8Z"\\\\\\\\\-JYlbRg9j#kkkkkkkkk(NallsRw9y${ { { { { { { { { Qgu~mR:%|` F ,  |` F ,  |` F ,  |` F ,  |` F ,  |` F ,  |`F-|aF-|aF$-+--------}a/F8-=>>>>>>>>}8aDGJ.NOOOOOOOO?}NaWG\/^________DW}bbiHm/oppppppppG^l}ub{H~0Heu~bI1 j~~cI2/0011q2V2;2!22222222/0011q2V2;2!22222222/0011q2V2;2!22222222/0011q2V2;2!22222222./001q1V1;1!11111111*+,,-q-V-;-!--------%&'((q(V);)") ) ) ) ) ) ) ) !!q"V"<"""(")")")")")")")"r$V3<:#=>>>>>>>.r@VI';`tsX?(e|ˌsY@) ˢtZA+BCCDDDfDJE/EEEEEEEEBCCDDDfDJE/EEEEEEEEBCCDDDfDJE/EEEEEEEE@AABBBfCJC/CCCCCCCC=>>??@f@J@/@@@@@@@@9:;;<S SSSSSSSNOOPPPwPZP>Q!QQQQQQQJJKLLLwLZL>M!MMMMMMMDEEFFFwGZG?#G"*G,G,G,G,G,G,G<==>>?w2?[???F?#I?J?J?J?J?J?J?/122)3E3wR3[Z4@_4$a4b4b4b4b4b4b46Rb xk \q!@u!%v!w!w!w!w!w!w!?^o{x\A' Dg{y]B( Goҕy]C*uӬz^D,z_F. {`G0ijjjkkkjkLk.kkkkkkkghhiiiijjLj.jjjjjjjffgggghjhMh.hhhhhhhccddeeejeMe/eeeeeee_``aaaajbMb/bbbbbbbZ[\\\]]j]M]0] ]]]]]]TUUVVVVk%WN3W0:W =W=W=W=W=W=WKLMMN(NBNkNNNUN1YO[O[O[O[O[O[O?@AB=BUCcClkCOpC2sCtCtCtCtCtCtC-./L0e1s1}2l2P232222222WqƂ m P 5  _|ƜmQ6eƴnR8oS:!pU;$ qV=(}}}~~~~z~\~=~~{{{||||z}\}=}}}}}}}xyyyzzz{z\z=zzzzzzzuuvvvww{w]w>wwwwwwwqqrrrss{s]s>ssssssslllmmmm{n]n? nnnnnnneefffgg|5g^Cg@JgMgOgOgOgOgOg\\]]^;^R^|^^^f^@j^l^n^n^n^n^n^PPQ!RPRfRsS||S_SAS!SSSSSS??5@`AwABB}B`CBC#CCCCCC @!m#$ٕ%&'}'`'D(&((((((Xwٰ~aE(bF+ cH-dJ0fL3lL(lL(mM)mM*mN+}}~~~~n N&,046666vvvwww-wFxnSxOZx-^xaxaxaxaxaxmmmn nMnbnooowoP{o/~ooooooaaa>bcbwcccocQc1ccccccPQPQtRR̗SSSpSRT2TTTTTTW7^89::̳;;#vZ@'}\8}\9}]:}]:~^;~(^;p stttt~~~~<_s`?rrrVrvs߉ssttat@ttttttPbPbhbccߪddddbeBeeeeeeLLLMNNOOOcODOOOOOO""#%&(())d*F*#*****eH'gJ+hL/ jN3lImImJnKnL>oNMW"\^___)Shtp}N$SqфpO'>>>lѨqP*…ÅÅÅÅttttuuuvvrvRv-vvvvv___``aaabsbSb0bbbbb???@ABBCCuCUC3DDDDDvW6wY:y[=z]@"Ο}Z-˟~Z/Ơ~[0\2\3(15667R`]i5orsttDfy^7/h䖢â`9xxx亖Ė˖ЖaԖ<֖זؖؖؖχڇ⇤臃b>rrrrssttttdtAt tuuuWWWWXXYYYYeYCZZZZZ!"$$%&g&F&&'''iI$kL*mO/kA߱ߏkBڲڏlCղՐmDβΑm6FDLOQQNdzeǑsn|G[xՋoIeeee|մĴpɴK̴δϴддͨרިrMʘʘʘʘ՘sOtQ%lllllmmnnnvnTn*nnnnDDDDEEFGGGwGVH/HHHHyX4{[9}^=|S|T}U~W;PX\!cgij>>>>pƩѤс[)Ƥǂ\-Һ^1`5b9d=______``aaafaAabbb iD kHlJf1f3g5i7"2Ufjr:y}Vw؊푡k=xxxxxػm?ٶٓnBͷ͔pEqHsKuOwwwwwwwxxxxwyRyyyyMMMMMMNOOPPyPUP&PPPMMMMMMNOOPPyPUP&PPPMMMMMMNOOPPyPUP&PPPxHyIzK{M4BIMQk||OKKKKKKnǫ}Q~SV ߦXѧу[ ](`/a1a1a1a1\^_EaWahk?jفc ھe&g,i1k6m;׻ؖo?׻ؖo?׻ؖo?׻ؖo?׻ؖo?׻ؖo?  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~XYZ MtextNot suitable for real usedesc Little CMS Little CMSdesc2.x 2.xlcms2-2.6/testbed/Makefile.am0000644002406300000240000000136712311617072015423 0ustar mariamausers# # Makefile for building testcms # # Don't require all the GNU mandated files AUTOMAKE_OPTIONS = 1.7 foreign INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/src check_PROGRAMS = testcms # CFLAGS = --pedantic -Wall -std=c99 -O2 testcms_LDADD = $(top_builddir)/src/liblcms2.la testcms_LDFLAGS = @LDFLAGS@ testcms_SOURCES = testcms2.c testplugin.c zoo_icc.c testcms2.h EXTRA_DIST = test1.icc bad.icc toosmall.icc test2.icc \ test3.icc test4.icc \ test5.icc ibm-t61.icc check: if [ $(top_srcdir) != $(top_builddir) ]; then \ cp $(top_srcdir)/testbed/*.ic? $(top_builddir)/testbed; \ fi ./testcms if [ $(top_srcdir) != $(top_builddir) ]; then \ rm -f $(top_builddir)/testbed/*.ic?; \ fi lcms2-2.6/testbed/testthread.cpp0000644002406300000240000000466612311617072016247 0ustar mariamausers #include #include "lcms2_plugin.h" static cmsContext ctx; static cmsHPROFILE prof_cmyk, prof_rgb; static volatile int rc = 0; static void* MyMtxCreate(cmsContext id) { return (void*) CreateMutex( NULL, FALSE, NULL); } static void MyMtxDestroy(cmsContext id, void* mtx) { CloseHandle((HANDLE) mtx); } static cmsBool MyMtxLock(cmsContext id, void* mtx) { WaitForSingleObject((HANDLE) mtx, INFINITE); return TRUE; } static void MyMtxUnlock(cmsContext id, void* mtx) { ReleaseMutex((HANDLE) mtx); } static cmsPluginMutex MutexPluginSample = { { cmsPluginMagicNumber, 2060, cmsPluginMutexSig, NULL}, MyMtxCreate, MyMtxDestroy, MyMtxLock, MyMtxUnlock }; static DWORD WINAPI one_thread(LPVOID lpParameter) { int i, j; cmsUInt8Number rgb[3*1000]; cmsUInt8Number cmyk[4*1000]; Sleep(rand() % 500 ); cmsHTRANSFORM xform = cmsCreateTransformTHR(ctx, prof_rgb, TYPE_RGB_8, prof_cmyk, TYPE_CMYK_8, 0, 0); for (i=0; i < 100000; i++) { for (j=0; j < 1000; j++) { rgb[j * 3 ] = 189; rgb[j * 3 + 1] = 100; rgb[j * 3 + 2] = 75; } cmsDoTransform(xform, rgb, cmyk, 1000); for (j=0; j < 1000; j++) { if (cmyk[j * 4 ] != 37 || cmyk[j * 4 + 1 ] != 188 || cmyk[j * 4 + 2 ] != 195 || cmyk[j * 4 + 3 ] != 7) { OutputDebugString(L"ERROR\n"); rc = 1; } } } cmsDeleteTransform(xform); return 0; } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { int i; cmsContext ctx; OutputDebugString(L"Test in progress...\n"); ctx = cmsCreateContext(NULL, 0); prof_cmyk = cmsOpenProfileFromFileTHR(ctx, "USWebCoatedSWOP.icc", "r"); prof_rgb = cmsOpenProfileFromFileTHR(ctx, "AdobeRGB1998.icc","r"); #define NWORKERS 10 HANDLE workers[NWORKERS]; for (int i=0; i

oAnBlDkEiFiFhEgEgDgDgDgDgDgDgD]gr| "#ە%ϓ2 ŏ?JT$]+e1|m6zt:w|=u@tBrEqFoHnHmHlHkGkGkFkFkFkFkFkF_iu~՚!ʘ0 <GQ$Z+b1j6q:}y>{AyDwFuHtJrKqKpJpIoHoGnGnGnGnGnGalwݚОŜ.:EO#X*`1h6o:v>B~E|HzJxL|wLzvMxuLxtKysJzrIzrIzrIzrIzrIzrIcny֟ ˢ+8CM"V)^0f6m:t?|BFI|Kx~Mu|Ns{NqzNqyLrxKtwJtvJtvJtvJtvJtvJep|ٚУŧ)6AK T(\/d5k:r?zC}FyIuLrNnOlOjOj~Ml}Lm|Kn{Kn{Kn{Kn{Kn{Kgsԝ˦&4 ?IR'Z.b4i9p>{xBwFsIoLkNhOeOcOcNeMgLgKgKgKgKgKiv٘ϡŪ#1 =GP%X,`3g8zn=uuAp~ElHhKdM`O^O\O[N]M_L`K`K`K`K`Kly Ԝʥ . :DM#V*~]0xe6sl;ns?j|CeGaI]LYMVNTMTLULXKXKXKXKXKXKp } ڗϡŪ+7AK }S'w[-qb3li8hq|HvQ#pY)k`.fg3ao7\w;X>SAODKEHFFEFEEEGFHFHFHFHFHFyږϡū !/ {;tEnNiV$d^)_e-Zm1Vu5Q8M;I=E>C?A?@>??>@?@?@?@?@?@Ԝʧ {+t7 mAgJbS]["Xc&Tk*Os-K}0G҉2CЗ4@Υ6>̷6<6<5:7888989898989ڗΣĮ|u*n4 h>cG^PYWT_Pg!Lo$Hy&D)A*=+;,9,8+6-4/3/3/3/3/3/ҟȪ}un'h0b9 ]AYIUPQXM`IhDq@| =":#8#6#5"4!1$0$0$0$0$0$֛˧²~t mg"a+[3 W; SBPILPHWD^@g6H3S 1^ .h ,r)|'%$""   9+<*>+>.<3<<:G7Q 5\ 2f0p-z+)'&%$$##"!!;*?)A)A,@2@;>D =O :Z 7d5n2x0.,+*)((''&$#" =(A'C'D*E0E8CB BL @W=a:k7u5~310/..--,+))&#!     @&D%G%I'J.K6I? HI FTC^@h=r;{97655443210.+(('''''B$H#L#N%Q,Q3O< NF LQJ[GeDoAx?><<;;:98762100/////F#K!P T#X*X1U8TB SMPXMbJlHuF~DCCBA@?>=<:98 8!7"7"7"7"7"I!OTZ"^(_.]5Z> YIVTS_PiNrL{KJIGFEDDCCB!A#@$?%?&?&?&?&?&LSY`!d&e,d2b: _D\PZ[WfUoRxQP O!N"M#L#K$K$J$J$I&H(G)F)F*F*F*F*F*OV]ei$k*k/i6f@ dLaW^b\kZs X|#W$V&U'T(S(R)Q*P*P*O+N,N-M-M.M.M.M.M.QYbin"q'r,q2o< lHhSf]cf ao#_w&^(\)[+Z,Y-X.W/V/V/U/T0T1S1S1S1S1S1S1T\ems v$x(x.v8 sDpOmYjb!gk%es(d{*b-a.`0_1^2]3\3[4[4Z4Y4Y4Y4Y4Y4Y4Y4V_iqw{!}$(}4z@vLsVp_"ng&ko*jw-h/g1e3d4c6b7a7`8_7^7^7]7]7]7]7]7]7Xaktzօ#̄1À>}IySv\"td'ql+os.m{1l3k5i7h9f:e;d;c;b:b:b9a9a9a9a9a9Zcnv}݇Њ Ɖ/;FP|Y"ya'wi+tp/sx2q5o7n9l;kg=g=fzj=zi=zi=zi=zi=zi=^hs|ڊѐƓ*7 BKT!\'d+k/|r3zz6y9w<u>|t@yrAvqBtpAso@sn?tn?tm>tm>tm>tm>tm>`ju~ Վ̔'5 @IR Z&b+i/p3x7~:||=xz?uyArwCovCmuCmtBmsAmr@nq?nq?nq?nq?nq?bmxڊВǘ%2 =GPX%`+g/n3}v7y~:v>r@oBk}Ci{DgzDfyCfxBgwAhv@hv@hv@hv@hv@dp { ֎̕œ"0;ENV$^*e/|l3wt7s|:o=l@hBeDbD`D_C_~B`}Ab{@b{@b{@b{@b{@f s ~ Ғș -9CLT#\(zc-vj2qr6mz9i=e?aB^C[DYDXCXBYA[A[A[A[A[Ai v ٍΖÞ*6 @J~R yZ&ta+oh0kp4gx7c;^>Z@WBTBRBQBQAQ@S@S@S@S@S@mzӒɛ&3 >}GwPrX#m_(if,en1`v4\8X;T=P?M?K?J?J?I>K>K>K>K>K>rڌϗĠ!/}: vDqMlUg]$bd(^k,Zs0U}3Q6M8J:F;D;D:C:B;C;C;C;C;C;wԒʝ|*u6 o@jJeR`Z\b#Wi&Sq*O{-K0G2D3A4?4>4=4<5;6;6;6;6;6~ۍϙţxr$m1g< bF]OYWU_QgMo"Iy%EDŽ(AƑ*>Ġ+<°,:,9+8,7.6/6/6/6/6/ԕɠ|pje,`7[A VJRSN[KcGlCv@ہ<ڎ!9؞"7֮"5"4"3#2$1&1&1&1&1&ڐ͝ħtke_(Y2U;QD NM JUF]Ce@n[ :d7n3z0.,*)((((((ʣ~pd\ VQL$H,D3A:>@;G8O4W1` -k *w & $ " !      ītg[TN JEA#>);/855;2A.H+Q&Z"eswj^RKFA =:64#1(/.,3)9%@ HQ\hu {m`TJC>962 /,*(!%%"*06>G Q[envvvvv3,5+6,4/15.=+G&R"]hr|    5*7)8*7-433<0E+P'[#f!py            7)9(:(:+818:5C1N,Y)c'm%w # !              9'<%=&=(=.=7;A8K3V0` .j +t )} ( ' & % % $ $ # # !          <%?#A#A%C,C4A>>H:R7] 5g 2p 1y / . - , , + + * ) ( ' % " !      >#B!E G#J*J2H:EDAO >Y |=<<;;98766543222222EJNTX%X,V3R<OF MQ J\ HgFpEyDCBAA@??>>=<;::9999HNSZ^#_)]/Y7VATM RY OcNlLtK|KJIIHGFEEDCBA A A A A A KQX_c!e&d+a3^=\I YTX^VgToSwRQPOONM L K K!J"I#H$H$G$G$G$G$NU]dhj"j'h-f8dD aO_Z]c\kZsYzX W!V"U#T$S%R%Q%Q%P&O'N'N'N'N'N'N'PXahloo!n'm4k@ iKfVd_bg`o_v!^~#]$\&['Z(Y)W*V*V*U*T*T+S*S*S*S*S*SZdkprsu"t1r= oHmRj[hcfk er#cz%b'a)`*_,^-\-[.Z.Y.Y.X-X-W-W-W-W-U]gnsvw zz.x: uErOpXn`lh!jo$iv'g~)f+e-c.b0a0_1^1^1]0\0\/\/\/\/\/W` iqvy} ǀ+~7 {BxLuUs]qe"ol%ms(l{*j-i/h1f2e3d4~b4}b3|a2{a2{`1{`1{`1{`1{`1Yb lsy ~͂…(5@}J{Sx[vb"tj&rq)px+o.m0l2~k4{i5yh6wg6vf5ue4ue3td3td3td3td3td3Zd n v |Ђdž&3> HQ}Y{`"yg&wn)uv,s~/~r1{q4xo6un7rl7pk7oj7oi6oi5nh4oh4oh4oh4oh4\ g q yր̆‹#1< ENW^"~e&|l)zt,{y|/xw2uv5qt7ns8lq9jp9io8in7hm6il5il5il5il5il5^ i s |҄Ɋ .: CLT\!c%}j)yq-u~z0r}3n{5kz7hx9ev:cu:bt9bs8br7bq6cq6cq6cq6cq6a lvψŎ ,7 AJRZ {a%wh)so,pw/l2h5e7b~9_}:]{:\z9[y8\x7\w7\v6\v6\v6\v6cozքˌ)5?HPzXu_#qf'mn+ju.f~2b4^7[8X9V:U9U~8U}7U|7U|6U|6U|6U|6fs~҈Ǒ%2< ~FyNtVo]!ke%gl)ct-`}0\3X5T7Q8O8N8N7N6N6N6N6N6N6jwڃ΍Ö!.~9 xCrLnTi[ec"aj&]r*Y{-U0Q2N4K5H5G5G4G4F4F4F4F4F4o|ԉɓ}*v6q@ lIgQcY_`[h"Wp%Sy(O+K.G/D0B1A0@0@1?1?1?1?1?1u܃Ϗřyt%o2j< eF`N\VX^TePm Lv#I%E(B)?*<+;*;*:+9,9,9,9,9,|Պʖ~p kf,a7]A YJ URQ[McJkFtC? <"9#7#6"6"5$3%3%3%3%3%݅ϒŝwh_\$X0T;PEMN IV F_Cg@q=|:Έ7͗4˧2ɻ110.....ԎɚpbXTP)L4I>FGCP@Y=b :k 8v520.ߵ,+*)))))͘ãvh[S OJ#F,C5@==E:N7W4`1k.w , ) ( & % $ # " " " " ơzm`TMHD@$=,:37:4A1I-R*\'h#t ~pdWMFA =96!4(1..4+:'B#KUao     tgZOE>95 2/,*!'&$,!29BL X fuxj]QG>62.+' %" #)0 8ANZfq}.+0*/+,.'4$<FQ\f p y0*2)1)/,*1):%D OZdnw        2(4&4'2*//.8,B'L!Wakt}   5%7$7$5&5-562?.I)T%^!hqz       8#:!;!:#<*<39<6F1P-[*e'n%w%~$$#""!!     :!=>@!B'B0@9=B9L5W2a/k.s-{-,,++*)('&%% $ # # # # # # =ACGI%I,G5D>@Hu =| = < < < ; : : 98876554444DINTW W%T,P4M>KJIUH_ Gh Fp FwEEDDCBAA@?>==<<<<<GLSY\\!Z&W.U9TERP QZ PcOkNsMzLKKJIHGFFEDCCBBBBJOW]aa_]']4\A[L YVW_VgUnTvS}RQPPONLLKJIIHHHHLR [aeecd"e0d=bH `R^[]c[kZrYyXWVUT S!R!Q!P!O"N"N"M"M"M"M"OV _ehh h kk-j9hD fNdWc_ag`n^u]}\ [!Z"Y#X$V%U%U%T%S%S$R$R$R$R$QY b h k mn pq*p6nA lKjTh\gdekdrby a"`#_%^&\'[(Z(Y(~X'}W'|W&|W&|W&|W&|W&S [ d j nrsvw'u4s> qHoQmYlajhhogv!e~#d%c'b(~a*{_*y^*x]*w\*v\)v[(u[(u[(u[(u[(U ^g mrvxz{${1y< vFtOrWp^nemlkt"j|$i'}g)zf*we,uc,rb-qa,p`+p`+p_*o_)o_)o_)o_)W `iov{}!/~:{D yLwUu\scqj pq"|ny%ym(vl*tk,qi-nh.lg.ke.je-jd,jc+jc+jc+jc+jc+Yclsz ,8A ~J|RzZxa}wh zuo#vtw&sr(pq+no-kn.hm/fk/ej/di.dh-dg,dg,dg,dg,dg,[fnw~ *5? HPX{~_x|f t{m#qyu&nx~)kv+hu-es/br0`p0^o0^n/^m.^l-^l-^l-^l-^l-]hq{Ȃ'3= F~NzVv]rdok#ks&h~|(e|+b{-^z/\x0Yv0Xt0Xs/Xr.Xq.Xq-Xq-Xq-Xq-`kuŇ$0; ~DyLtTp[mbii!fq%bz'_*[,X.U~/S|0Q{0Qy/Qw.Qv-Rv-Rv-Rv-Rv-coz̄ -~8xA sJoRkYg`ch `o#\x&Y(U+R-O.L.K.K-J~-K}-K|,K|,K|,K|,hsȉ })w5r? mGiOeWa^]fZm Vv#R&O(K*H+F,D+D+D+D+D+D+D+D+myυďzu%p1k;gD bM^U[\WdSkPtL~!H$E&B'@'>'>&='='='='='='sրʌ|qlh,c7_A[I XQTYPaMiIrF|B? @;"9,754>2G0Q-[+f(r&$"!àwi\PE=963"1*.2+9(B%K"V bp{m`TI?830-*'%%,!2:DO\ k {qdWLB91-)& # $*2 ;FTbsugZND;2+&"  ")2<IWfs)*))'*#-3;D OZdnv~+(,'*(&+ 09BM X bkt|.&.%-%)(&.%7 @JU_ h qy0$1"0"-$-++4)=#GR\env} 3!443!4(310:+D&N"Xbksz6879;&:-764@/J+T(^&g$p$w#~"""!  9;<@A"A*>2;;6E3P0Z/d.l-t-|,,,,++**)))('' & & & & <?BFHG%D-@6=@9K8V7`7h7p7w7~6666554322 1 0 0 / / / / ?CGLNM I'E0B:BFBQA[Ad@k@s@y ? ? > > = = < ; : : 9877777BFMRSRNJ(K5LAKLJVJ_ Ig Hn Gu G| FFEEDCBA@??>====EI Q VXVPR#T1T=THRRQ[ Pc OjNqNxMLKKJIHGFEDDCCCCHMU Z [ YW Z\-\9[DZN XW W_VfUmTtS{RQPPNMLKJJIHHHHJ QY ]^`_ ac)c5a@`J ^S ][\c[jYpXwWVUTSRQPO~N~N}M}M}M}ML T\`dfegi&h2g=eG dP bXa_`f^m]t\|[ZYX~W{U yT xSwSwRvRvQvQvQNW_chkjln#n/l:kD iM gUf]ddcjbqay`~^{] y\!w["tZ"sX"rX"qW!qV pV pV pV pV PZagmppqr r-q8pB nK lSjZiaghfo}ewzdxc ub!sa#p_$n^$l]$l\#k[#kZ"kY!kY!kY!kY!R\dkqtuv ww*v6t?rH qPoXm_}lezkmwjtth}rg!of#me$jd%hb&fa&f`%e_$e^#e]"e]"e]"e]"T^fntxz{||({3y=wF uNtV{r]xqcupkrnrom{ll"ik$gj%dh&bg'`e'`d&`c%`b$`b#`b#`b#`b#Vajry}%1~;|D ~{LzyTvx[svbouimtpjry gq"dp$ao&^m'\k'Zj'Zi'Zh&Zg%Zf$Zf$Zf$Zf$Ydmv}".9}B yJ tRq~Ym|`j{ggzndxvaw"^v$[t&Xr'Vq'To'Tm'Tl&Tk%Tj$Tj$Tj$Tj$]gr{+}6x?sH oPlWh^eebl^u[~~!X|#Uz%Ry&Pw'Nu'Ms&Nr&Nq%Np$Np$Np$Np$`kwƀ |(w3r=nE jMfUc\_c\jYsU|R!O#L%I~%H|%Gz%Gy$Gw$Gv$Gv$Gv$Gv$eq|Åzu$p0l:hCdK `S]ZYaViSqO{LI!F"C#A#A"A"@"@~"@~"@~"@~"jwʂzrmi,e7a@]H ZP VWS_PgLoIyFB@=;;::::::p~ʼnvjd`&]2Y<VDSMOU L\ IdFmCw@=:865544444yˆtcZVS,P6M@KHHPEYBa ?j &H$S#_!lzߞݲtfYMB7-* '% #( 09CO\jz xj]QF<2)%" "*2< HUev}naTI?5-% "*3?N^pseXKA7/'   !+6DUfv$)#(),19CMXaks{&'%&"&).7 AJU_hqx)%(#%# %,5> GR\enu|,"+ ( #!#)!2;EO Xbjry..,*+&)/%8AKU^go v | 11/12#0+-3(=#FQZcksy454887&3//8*B'L%V$`#h#o$v$}$$$$$##"!!!!!    78;>> = < < ; : 9 8 8 8 8 @ DK N M GEIK-L9LDLMKVJ^IeIl Hr Hy G F F E DCBA@??>>>>C HORQQN QS(T5T@SIRRQZPa Oh No Nu M}LKKJIHFFEDCCCCELRUXYVXZ%[1Z<YFXOWW V^ Ue TkSrRyQQPON~L|KzJyJxIxHwHwHwHGOUZ^_]^`!a.`9_C^L\T [[ ZbYhXoWvVU}T{SxRvQtPsOrNrMqMqLqLqLIRX^ceccef+e6d@cIaQ `X __^f]m~\t{[|yZvYtXrWpUnTmSlRkQkQkPkPkPJT[cgjii jj(j4i=gFfN eU c\}bczajx`qu_zs^p]n\l[jYhXgWfVfUfUfTfTfTMW_flnnmno&n1m;lDjL ~iS zhZwgaufhreopdwmckbh`f_d^b\a[aZ`Y`Y`X`X`XPZbjprsrss#s/r9qA|oI ynQ umXrk_pjfmimjhuhgefce`d^b\a[_[^[][][\[\[\S]fntwwwxx x,w6|v?wtG tsO qrVmq]kpdhokemsbl}`k]j[hXgWeVdVbVaV`V`V`V`V`jrx|||}}}){|4w{=szEoyM lxTiw[fubcti`sq]r{ZpWoUnSlQjPiPgPfPePePePeYdow} z&v1q;mCjK f~R c}Y`|`]{hZypWxyTwQuOtLrKpJnJmJkJjJjJjJj]is|yt#p.l8hAdIaP ^W [^XfUnRwN~K|I{FyDwCuCsCrCqCpCpCpbnyzrmi+e5a>^F[N XU U\RdOlLuHEC@>=}={=y=x=w=w=whutk ea&^1Z:WCTKQRNZ Kb HjEsB~?=:97777777o|pc\X U,R6P?MGJOGWE_ Bg ?q <|97532210000wDŽ}n_S NK%I0F9DBBK@S=[;d8n6y 3 1 / - , , + * ***̀Œzk[LB@='<2:;8D6M4V2_0i.u,)(&%%$####NJsdVH;31/&-0,9+C)M(W&b$n"} zk]PC7,# !"+5?KWdrӃҖЪ pcVI>3)  '0: F TcsuhZNB8.%  !)4@O_qzl^QF;2)!  ",8GYlpbUH>4+#  $0?Qdv'''*/6@JU_hpx~!%$%',4>GR\fmu{##!!!#* 2;EOYbjqx~% #'/ 8AKU_gnuz)'"! $,4= GQ[cjqw},*&(( %( 09CMV _ g n t z /--/.+#&+!3=HR[cjpv|21 4 540+$$,"7$B%M&V'^(f(l(s(y(((((''&%%$$####5 49 ; 94,+%.20=2H2R3Z3b3h3o3u3{222210/..--,+++8 9?@=526 9-;9CDCA= @B(D4D?DIDQDYC`CgBmBtB{AA@? > = < ; ; : 9 9 9 9 =BGILKGHK$L0L;LEKNKUJ]IcIjHpHw G F F E D C B }A {@ z? y> y> y> y> >FKPSSNPR S-S8RARJQRPYO`Nf Nm Mt L| L K }J{IxHvGuFtEsDrCrCrCrCAINUYZUVXY*Y5X>WGVOUVT]Sc Sj Rq |Qy zPxPvOsNqLoKnJmIlHlHlGlGlGCLSZ^_\\ ]^&^2];\D[LZSYZ }Xa {Wg xVn vVvtUqToSmRkQiOhNgMfLfLfKfKfKFOW^cdaabc$b/b9aA`I}_Qz^X w]^ u\e r[lpZtnY}lXiWgVeUcTbRaQaPaPaOaOaOIR[bghfefg!g,f6e?{dGxcNubU ra\ o`c m_jk_ri^{f]d\a[_Y]X\V\U[T[T[S[S[SLU_fklkjkkk*~k4zj=viEshLpgS mfZ jea hdhfcpcbyaa^`\_Z^X\WZVYVXVWVWVWVWOYcjopono o}p'yo1uo:qnBnmJklQ hkX fj_ cifahn^gw[fYeWdTbS`Q_Q]Q\Q[Q[Q[Q[R]gotssst }txu$tt/pt8ls@irHfrOcqV ap] ^oe[nlYmuVkSjQiOgMeKdKbLaL`L_L_L_Ublsxwwx~ywzrz!nz,kz6gy>dyFaxM^wT [v[ Yuc VtkSssPq~NpKnImGkFiFhFfFeFdFdFdZgpx|{|~xplh)e3a<^D[KY~RV}Y S|a P{iMzrKx|HwEuCtAr@p@n@l@k@j@j@j`lv~}rj ea%^/[9XAUHRPPWM_ Jg GpEzB?}=|;z:x:v:t:r:q:q:qfr|{nc]Y V+S5Q=NELMIUG\De An >x <975444|3{3z3z3zmyyj^T PM%K0H9FADIBQ?Y=b;k8v5 3 1 / . . - - - - - vugZMFC@)?3=<;D9L7U5^3h1s/,*)'''&&&&reVI<75!3*240</E-N,X*b(n&{$"!ˆ|oaRD8, )' %)$2";!EOZftvhZL?4)$-7BN [ i yŊÝ|n`RF:/% '2>KZiz׍ԡҶseWK?4+!  +8FVhzxi\OC8.% $1@Rdw}n`RF;1( )9K_q&% %(+4=HS]fnu{#""$)2;EPZckqw}! '/8BLW`gnty~  %,4>HS\cjpv{"!)0:DNW_flrw|%"$, 5?IS[bhnty(% % &#&/ 9 C MV^dkqv|+ (+ , )"'3>HQY`g m s y  .-21, $ ""&.(9)C*L*U+\+c+i+o+u,|++++*)(('&&%%%13762/* .1)243>4H4P5X5_5e5k4r4x44433210/.----38;<>;68:$<0<:=D=L=T=[=by=w<v;t:t9s9s9s98@EKNMHHIK(K3K<KEJMITI[HaHhGn~Gv|F~yFwE uD sC qB pA n@ m? m> m> l= l= ;CJQTSNN PQ%Q0Q9PBPJOQNX}N^{MeyLlwLsuK| sK pJ nI lH jG iE hD gC gC fB fB fB >FPVZXTTUV"V-V7U?UG|TNySUwR\uRbsQiqPq nPy lO jN hM fLdKcJbIaH aG aF aF aF AJT[^]ZYZZ[*[4}Z=zYDwXKtXRqWYoV`mUg kUo iTw gT eSbR`Q^O]N\M\L\K[J[J[JDNX_a`^]^__'{_1x^:t^Bq]Io\Pl[Wj[^hZe fYm dYu aX _W]V[UYSXRWPWOWNWNWMWMGR\cedbbb czc$vc/sc8ob?laGjaNg`Ue`\c_c a^k ^]s \]~Z[XZVYTWRVRTRSRRRQRQRQJV`ghgffgzhuh!qh,ng5kg=hgEefLceS`eZ^da \ci Ybr Wa|U`R_P]N\MZLYLWMVMUMUMUN[dkkkjk|lulpmlm)im3fl;clC`lJ^kQ[jXYi_ Vhg Tgp RfzOeMdKbIaG_G]G\G[GZGZGZS_ionnn~ovqorjrfr&cr0`r9^rA[qHXqOVpVTo^Qne Omn Llx IkGjEhCfBeAcAaB`B_B_B_Xdmrrrryupvix dx`y#]y-Zy6Xy>UxFSwMPwTNv\KudItl Fsv Dr Ap?o=my ;x 9v 8t 6r 6q 6n 6m 6l 6k 6k epy{zz|rh\U QN%L/I7G?EGCOAW?_ ;8#7,553=2E0N/W-a+l)x'%$"!"!!!!}wj^QE8/-+$*-(5'>%G$P"[!fssg[NA5) "+4=GR^k{ }pdWI<1&   '1;FR`oyk]OC7,"",7CQ`qʄȗƫpbTH<1'  &1>N_qߛݬ۾ugYL@5+" +9J]ozk]PC8.%  $4EXk}$ ##$)1;FR\dkqw|!  !&/9CNX`gmsx}$,5@KT]djouz~!)2<FPX_fkqv{  %.7AKS[bgmrw|   (2<ENV]cinsx~!   !+6@IQY_e k p v { $ #!  $/:CLT[agmrx&&)% * 5!>"G"O#V#]#c#i$o$u$|$$$##"! ),.--*$ &)%+0,:,C-K-R-Y-_.e.k.r.y.---,+*)(~(}'}'}'+12896103 4+565?6G6N6U6\6b6h5o5v5~554}3{2z1x0v/u.u.u-u-/5:@B?:9;<'=2=;=C=K=R=Y<_l=j<i;h:g9g8g8g86=GMNLHGHI I+I4I=~ID|HKyHRwGYuG_sGfqFmoFumEkEiDgCeBdAb@b?a>a=a=a=9CLRRQLLMNN(N1{N:xNBuMIsMOqLVoL]mKdkKkiJsgJ}eIcIaH _G ^E \D \C \B[A[A[A<GQVVURQR R}S%yS.vS7sR?pRFnQMkQSiPZgPaeOicOqaO{_N ]M [L ZK XI WH WF WE VE VD VD ?KUYYXVUV |WwW"tW,pW5mW<kVChVJfUQdUXbU_`Tg^To\SyZR XQ VP TO SM RL RJ RI RH RH RH BPY\\\ZZ~[w[r\o\)k[2h[:f[Ac[HaZO_ZV]Y^[YeYXnWWw UW SU QT OS NQ MP MN MM ML ML ML GT]___^^y_r`m`i`&f`0d`8a`?_`F\_MZ_TX^\V^dT]lR\v P[ NZ LY JW HV HT HR HQ HP HP HP LXabccb{csdme hede$ae-^f5\e=ZeDXeKUdSSdZQcbObjMatJ` H_ F^ E\ CZ BY BW CV CU CT CT Q]effffvhnigj bk^k [k*Yk3Wk;TkBRkIPjQNiXLi`JhhGgrEf~ Ce Ac ?b >` =^ =\ =[ =Z =Y =Y Vbiiiijrminap\qXqUq'Sq0Pq8Nq@LqGJpNHpVFo^DngAmp?l|=k ;j 9h 8f 7d 7b 8a 8` 8_ 8_ \gmmmm}noqet[wUx QxNx#Kx-Ix5Hx=FxDDxLBwS@v\>vd;un9tz7r5q3o2m1l1i1h1f1f1fcnqqqqyskwbyW}MHFC)B1@9>A=H;P9Y7~b5}l3|x1{/y-w,v+t+q+o+n+m+mjuvuuvvxi|^SH?=:#9,745<4D2L1U/_-i+u*(&%$}$z$x$w$v$vr{zzz~{rfZOD820/&-.+6*>)F'P&Z$d"q!{zncVK@4) %#"& /7?IS^kywk_SG<1& %-6? J V cqsh\PD9.# !*4>JXfv}qfZL?4)  '1<IXiz|m_QE9.$!,9HYj}ԒӧжrdVI=2( &4DWkwi[MA5+! /?Sh|"!!"%/:EPYagmsx} #,7BMU]djoty~ !)3>HQY`fkpuz~&/9CLT[bglqvz  !*4>GOW]chmrv|  $/8AJQX^dinsx~ (2<DLTZ`ejou{  !, 6 ? G OV\aglry  &1:BJQW]ciou}$$))&"!#,$5%>%F&M&S&Z&_&e&k&r'z'&&&~%|$z#x"w"w!v v $(/330,)+-'.1.:.B.I.P/V/\/b/h/o/w}/{/y.w.u-s,r*p*o)o(n'n')-7;;852 35#5-666>6E6L6S~6Y|6_{6ey6lw6tu6}s5q5o4m3l2j1i0h/h.g-g-,5>AA?<9:;<)<2<:~`=^<];\:\9[8[7[73@IJJIFEE FzF#wG,tG4qG<oFCmFJjFPiEWgE^eEecEmaEv_D]D\CZBX@W?W>V=V<V;V;8DMNNMJIJyKuK qK)nK2kK9iK@gKGeJNcJTaJ\_Jc^Jk\IuZIXHVGUFSDRCQAQ@Q@Q?Q?<IPQQQONzOtOpPlP&iP/fO7dO>aOD_OK^OR\OZZNaYNjWNsUM~SLQKOJNHMGLELDLCLCLCAMSTTTS}RuSoTkTgT$dT,aT4_T;\TB[TIYTPWSXUS_SShRRqPR|NQLOJNIMHKGIGHGGGFGFEQVWXWWxWqXjX fYbY!_Y*\Y2ZY9XY@VYHTYORXVPX^NWfMWpKV{IUGTESDQCOCNCLCKCJCJJUYZ[ZZs[l\e]`^\^Y^'W^0U^7S^>Q^FO^MM^TK]\I]eG\nE[yCZAY@X?V>T=R>Q>P>O>OOZ]]^^|^n`fa`cZcVdSd$Qd-Od5Md<KdCJdKHdRFcZDbcBbl@aw>`<^;]9[8Y8W8V9U9T9TT_`aaaxbkebfZhTi PjMj!Kj*Hj2Gj9EjACjHBjP@iX>iaq>=qE;qM:pU8p^6oh4ns2m0l/j-h-f-d-b-a-`-`ahhhh{ipken[qRsGw@y=y;y"9y+8y26y:5yA4xI2xR1w[/we-vq+u~)s(r'p&n&l&j&h&g&ghlllmxmnoatWwNzC}9 421&/..6,=+E)N(W&b%m#~{!| {yvtrqoopqqqqurju_zT~I?4+ (& %(#0"7!?HR]iw}{zxxwvvv|vryg}[PE;0% (08AKWc q }|{{z}ncXLA7,"  '09CN[hxvk`TI>3)  %.8CP^nsh]QF;0& "+6BQas~rf[NB6+!  (3AQcvʋɢǸ}paSF:/%  #0?QdxufXJ>2( ,=Pdx #-9DMV]djoty}!*5@IRY`fkpuy~'1;EMU\bglquz #-6@HPW]chlqv{  '1:CKRX^chmqv|  ",5=EMTY_dimrx~&/8@HOUZ`ejou{  )2;CJPV\afl r y   #-6>ELRX]ciov~}{zyxx $#!(19AHNTZ_e l s {} { ywusrqppp"+--+'" $%#&,'5'='D'J(P(V~(\|(bz(ix(pv(yt(r(p(o'm&k$j$i#h"h"h!!+24420,,-.(/1/9~/@{/Fy/Mw/Su/Yt/_r/fp/nn/vm/k/i/g.f-d+c*b)a)a(a(%29::863344$|5-y55v5<t5Cr5Ip5Pn5Vm5]k5di5kg5tf5~d5b4`4_3]1\0\/[.[-[-+8=??>;99 }9y:!u:*r:2p;9n:@l:Fj:Mh:Sf:Ze:ac:ia:r_:|]:\9Z9Y7W6V5V3V2U2U21=ACCB?>|>w?s?o?'l?/j?6h?=f?Dd?Jb?Q`?X_?_]?g[?pY?zX>V>T=S<R:Q9P8P7P6P66BEFGFC~BwCrCmDjD$gD,dD3bD:`DA^DG\DN[DUYD]XDeVDnTCyRCQBOAN@L>L=L;K:K:K9;FHJJIGyGrGmH hHdH!aI)_I1\H8ZH>XHEWHLUHSTH[RHcQHmOHwMGKFJEHDGBGAG?G>G=G=?IKMMM~KtKnLhL cM_M\M'YM.WM5UM<SMCRMJPMROMYMMbLMkJLvHLFKEIDHCFBDBCBBBABACLNOPPzOpOiPcQ^RZRWR$TR,RR3PR:NRAMRHKRPJRXHR`GQiEQtCPAO@N?L>J=I=G>F>E>EHPQSSSvSkTdU^VXWUWQW"OW*MW1KX8IX?HXFFXNEWVCW^AVh@Vr>U]\<\f:[q9[}7Y5X4V3U3S3Q3O4N4NSWXYYzZoZc]\_SaMbHcEcCc$Ac,?c3=d:j;j!:j)8j06j75j>4jF2jN1iW/ia.hl,gy+f)e(c'a'_']'[(Z(Z^_``}`rahc^fUhLkBn9q 5r3r2r%0r,/r3-r;,qB+qK)qT(p^&pi%ov#n"l!j hf d c a accddydoeegZkQnHq>t4x,z*z(z 'z(&z/$z6#z>"zF yPyZxfwsvtrpnljiihhhhviljbmWqMuDx:{0% ")19AKVbo~ ~ | y w u s r qmmm}msnip_tTxI|@6,"" * 2 : DO[hw~}|{srrzrqtfx[}PE;2( !*2<GSaoyxxyxm}bWMB7.$  )2<IWfvvj_TI?4*! &1<JZk~sh]RG<2'  ".:K]q~rg\PC7,! +9J^s܉ڞگٽ~sdUG;/$(8J_s",7AJRZ`fkpty~(3=FNV\bglpuz%.8AIQW]chlquz  *3<DLSY^chlqv{  $.6?FMTY_chlqw} (19AHOUZ_chmrx#,4<CJPUZ_diou|%/7>EKQV[`fkry}||| ) 2 9 @ G M R X ]cipx~|zx v u s s r r  #,5<BINTZ~_|fzmxuv~trpomlkjii%''&#( 0 8!>}!Ez!Ky!Pw!Vu!\s"cq"jp"rn"{l"j!h!f eccbba',..-+'%&'$|(,y(4w(;t(Ar(Gp(Mo(Sm(Yk)`j)gh)pf)yd)b)`(_']&\%\$[#["["#.24421., {-w. t.(r.0o.7m.>k.Di.Jh/Pf/Vd/]b/ea/m_/w]/[/Z.X-W,V*U)U(U(U'*3689754z3u3q3n4%k4-i44g4:e4Ac4Ga4M_4T^4[\4cZ4kY5uW5U4T3R2Q1P/P.O-O,O,/7:<=<9z8t8o8k8h8"e9*b91`97^9>\9D[9JY9QX9YV9aU9jS9tQ9P9N8M7L5K4J2J1J1J04;>?@?}=u<o<j< f=b=_=']=.Z=5X=;W=AU=HS=OR=WQ>_O>hN>rL>~K=I<H;G9F8F6E5E5E49>ACCCy@q@jAeA`A]BZB$WB+UA2SA8QA?OAFNBMMBULB]JBfIBqGB}EAD@C?B=A<A:A9A8A8=ADEF~FuDlDfE`F[FXFUF"RF)PF0NF6LF=JFDIGKHGSFG[EGeDFoBF{AE?D>C=A<@<>===<=;ADGHI{IqHhHaI[JVK RKOKMK'JK.HK4GL;ELBDLICLQALZ@Lc?Kn=KzQOW09WE8WM7VV5V_4Vj2Uv1T0S/Q.O-M.L.J.I.HLOQQ{RqRfS\VUWMYE[@\ =\;]9]&7]-6]44];3]B2]J1\S/\].\h,[t+Z*Y)W(U'S(Q(O(N)NPSTUwUmVcWYZR[J]B`:c6c4d2d#0d*/d1-d8,c?+cG)cP(cZ'be%ar$a#_"^!\ Y!W!V"U"TUWXXsYjY`[W^O`Fc>e5i.k+k*k(k&'k-%k4$k<#kD!jM jWibioh}fec`^\[[Z[\{\p]g^]`ScKfBi:l0o&r"s ss"s)s0s7s?rIrSq_qkpznlj hfdcb_``v`madbZePiGl>o5s,v"y| |||#|*|2|: {C {N zZzfxuwuspnmlkde~dsejebhWlLpCs:w1z(~ $,4=GS`o}{xvutjiziqjik^oSsIx?|6,#$,5?KXgwooxopoesZyP}E;1( #,6AO^ouuwumyb~WLA7-$ !+6CRcv||uj_TI?4*! )6DVi}si^RG=3( &4EZn҄ИЪϹ~sh^SE8-!  #3DZq*4=FNU\bglquz&/9AIQX^chlquz !+4<ELSY_chlqu{  &/8@GNTZ_chlqv| !*3;BIOUZ^cglqw~ %-5=DJPUZ^chmsz (08?EKPUZ_diov~"*3:@FLQV[`els{~{yxwvuu  %-5<BHMRW]c}i{py yw usqpnmlll  (07>C}I{NyTwZv`tgrnpwnljhgedcc c  ""!#|+z3x9v?tErKpPnVm]kdilgueca`^]\[[["&))(&# {w t!'r!/p"6n"<l"Bj"Gh"Mf"Se"Zc#aa#i_#r]#}\#Z#X"W VUUTT!(,..-,|)x&t&p'm'$j(+h(2f(8d(>b(Da(J_)P])W\)_Z)gX)pV){U)S)R(P&O%O$N#N"N!&-0231|0v.r,m, j-f- d-(a-/_.5^.;\.AZ.GX.MW.UU.\T/eR/oP/zO.M.L-J,I*I)I(I'I&+14665x4r2l1h2 d2`2]2%[2,Y22W28U2>T2DR3KQ3RO3ZN3cL3mK4xI3H3F2E0D/D-D,D+D+/479:|9t7m6g6b6^7[7X7"U7)S7/Q75O7;N7BL7IK7PJ8XH8aG8kE8wD8C7A6@4?3?1?0?/@.38:<<x<p9i9c:];Y;U;R;P;&M;-K;3I;9H;@G;GF;=:<8;7;5;4;3;26;=??u?l=d=^>Y?T? P@M@J@$H@*F@1D@7C@>B@EA@L?AU>A^=Ah;@t:@9?8>7<6;69787776:=@A|BrBiA`AYCTCODKDGEEE!CE(AE/?E5>E<=ECADFGuHkHaHWJQKKMDN?O y4}+" '0:GVfxlulnldpYuOzD:0' &0<K\n}surlua{VKA7,# $0>Nav}yu|j_TI?4*!  "0@Rg}ȒƦŸsi^SH>4* /BWl'/8AIQX^chmqv{ "+4=EMSZ_dhmqv{  '08@HOUZ_dhlqv|#+3;CJPUZ_chlqw~ &/6>EKPUZ^cglrx!*19?FKPUY^chmt| $,4:@FKPUY^cipx~|{zzz '.5<AGLPUZ`fl}t{~ywusrqppo !)07=BH}L{RzWx\vctjsrq{omkihgfff  $~,{ 2y 8w >v Dt Ir Nq To Zm `k hi qg {e c b ` _ ^]]\  {xu's.q4o:m@kEjKhQfWd^bf`n^y][YXVVUUU!#$#~!yvspm#j*h0g6e<cBaG`M^T\[ZcYlWwUSRPONNNN"'()(x's%o"l i f!c!&a"-_"3]"9\"?Z"DX#JW#QU#XS#aQ$jP$uN$L#K#J!H HHHH!'+--z,s+n)i'f& b&_'\'#Z'*X'0W'6U(;S(AQ(HP(NN(VM)_K)hI)sH)F)E(D'C%B#B"B!B!%+.01v0o.i-d,`,\,Y,V, T,&R,-P,3N,9L,?K-EI-LH-TG.]E.fD.qB.~A-@,>+>)=(='>&>%).13{4r3k2e0_0[0W0 S0P1N1$L1*J10H16F1<E1CD1JB2RA2[@2e>2p=2}<2;1:/9.9,9+9*9),146x6o6h5a3[4V5Q5 N5K5H5!F5'D5-B53A5:@6A>6H=6P<6Y;7c97o86|76655342404/5.5-0478u9l9d8\7V8Q9L9H9E9C:A:%?:+=:1<:8;:?9:F8;N7;X6;b5;m3;z2:1907060402011137:};r;i<a<X;R<L=G=C> @>=>;?#:?)8?/7?65?=4?D3?L2?V1?`0?l.?y->,=+;+:+8+6,5,46:<z>o>f>^?T?M@GABB>C :C8D6D!4D'3D-1D40D;/DB.DJ-DT+D^*Dj)Cw(C'A&@&>&<&:'9'8:=?w@lAcAZBPCJDDE>G9H4I2J0J/J%-J+,J2+J8)J@(JH'JR&J\$Ih#Iu"H!F E C A!?!>"=>@BsChD_DWEMGGHAI;K4M.O ,P*P(P"'P)%P/$P6#P="PF POPZOfNsMLJHFDCBBD|FoFeG\HTHKKEK>M8P0R(V$W"W!WW%W,W3W:WCVLVWUcUqTRPNLJIHFHwIkJaJYKQLINBP;R4U,X$[^ ^^^"^(^/^7^?^I]T ]` \n [} Y WUS Q P OKLsMhM^NVONPFS?U8X0[(^ adff f f$ f+f2e;eDeOd[cibxa_][XWVO{PnQdQ[RTSLUCY;[4_,b$ehkn nnnn&n-n6m?mJlVkcjrigeca`_TvUjUaUYVRXH[?`7c/f'ilo ruuvww w(w0w9vCvPu]tms~qomkih~ZqZgZ_ZX[N_Dc;h3k+n"ruwz}~ ~")2<HVf~x|{xvutx_m_e___UcKg@l7q.u&x{~  "*5@N^ptdkded\gQlGr=w3|)   *5CTf{rjljdmYrNxC~9/% *8I[osplraxVK@6," *9Lawtyj_TI?4*  +<Pf{ߐݠ۬ #,4=EMSY_dhmqv|  (09AHOUZ_dhmrw}#,4<CJPUZ_dhmrw~ '/7>EKPUZ^chlry#+29@FKPUY^cgms{ &-4:AFKPTY^chnv!(/6;AFKOTY^djrz}{ywvutts #*17<AFK~P}U{Zz`xfvntwrpnmlkjji %~,|2z8y=wBvGtLsQqWo]nclkjthfecba```  ~{x u's.q4p9n>mCkHjNhTfZeacias_~][ZYXWWW{wv s p m "k )i /h 5f ;e@cEaK`Q^X\`ZhXrV~TSQP O O O O ztpmk hfc%a+_1^7\<[BYHWNVUT]RfPpN|MKIHGGGG!#}$u$o"j gda^\!Z(X.V4U9S?QEPKNRL[KdInGzFDCBAAAA"%'y(p(j&e%a#^![ X!U!S!%Q!+O!1N"6L"<J"BI"IG#PF#XD#bC$lA$y@#>#=!< ;<<< &)+u+m+f*a(\'X&U& Q&O&L&!J&(I&.G&3E'9D'?B'FA(N@(V>(`=(k;(w:(9'8&7%6#7!7 7 #),|.r.i.b.],X*S+O+L*I+F+D+%B++A+0?+6>+==,D<,L:-U9-^8-i6-v5,4,3*2)2'2&3%3$'+.y0o1f1_1Y/S.N/J/F/ C/A/?/"4;494 74&64,44235925@15H05Q/5[.5g-5s+5*4*2)1)/)-*,*+-13s5i6`6Y6R6J6D7@7<888694929$19*/90.97-:>,:F+:O*:Z):e'9r&9%8%6$5$3%1%0&/14}6p7f8]9V9N9E:@;;<7<3= 1>/>->",>(*>.)>5(?<'?D%?M$?X#>c">p!= <;975 4!347y9m:c;Z;R;K<C>>>9?3A.C +C)D'D&D&$D,#D3"D:!DB DKDVCaCnB}A@>;:987:v<j=_=W>O>H?@A;B6C/F)H$J"J JJ#J)J0J7J?JHJSI_IlH{GECA?=<;>r?f@\@TALAEC>D9F3H,J%MP QQQ Q&Q-Q4Q<PFPPP\ Oi Nx M K I G E C B?{AmBbCYCQDJEBF[5_-c%fil ortvw wxyz${,{5{AzNz]xnwutqonnWdW\WVWM[C_:d0i(l psvy{~ %.9FVg{||j\b\\\T_Id?i5o,s#w{~ %0=M^ribcb[dPiFo;u1{'  %1@Sg~jhcjXpMvC|8.$&5G[qkpavV}K@6+!  &7JaxҏѡϬ  (09AHOUZ_chmrw} $-5<DJPVZ_cgmrx (07?EKQUZ^bgmry $+3:@FKPUY]bgms{'.5;AFKPTX]bhnv ")06<AFKOSX]ciqz~}{zyyy $+17<AFJOSX~^|ezlxuvtsqponnm&,~2}7{<zAxFwJvOtTsZqaohmqk{jhfeddcc |zx!v(t.s3q8p=nAmFlKjQiWg^eecnay_^\[ZZZZ ~ y wt rpm#k)j/h4g9e>dCbHaM_T^[\cZlXwVUSRRQQQ ~wqnl khfc%b+`0^5]:\?ZEY KW QU YS aR kP vN L K JIIIH xpkgdca ^\ Z'X,W2U7T=RBQHOOMWK`IjHuFDCBA A A A }s kfa^\Y WUS#Q)O.N4L9K?IEGMFUD^BhAt?><;;;;; y#o#g#a#\!YVS PNL J&H+F1E6C<BC@J?R=\<f:r98665556 $v&k'c']&X$T"P!M!J G E C #A!(@!.>!4=!:<"@:"H9#P8#Z6#e5#q3#~2"1!0 0001$'r(h)`*Y)T(P%K%G%D% A%?%=% ;%%:%+8%17&76&>5'F3'N2(X1(c0(o.(}-',&,$+"+ ,-"&|)o+e,],V,P+K)F)B)?)<)9)7)5)#3)(2*/1*50+</+D.,M-,W,,b+,n),|(+(*'('&'$(#("%)y,l-b.Z.S.M.G-B->-:.7. 4.2.0.!/.'-/-,/3+/:*0B)0K(0U'0`&0l%0{$/#.","*"(#'$&',v.j/`0W1P0J0D0=1925222 /3-3+3*3%(4+'41&48%4@$4I#5S!4^ 4k4y320.,+**.s1g2]3T3M3G3@3955507-7)8'8&9$9"#9)"9/ 969>9G9Q9]9i8x76420/..~1o3d4Z5Q5J5D6=77839.:(<$= !> >> >&>->4><>E>O>Z=g=v<:975321z4l6`7W7N8G8A8::5;0<+>%@C DDDD$D*D1D9DBDLDX Ce Bs A @ > < : 8 75u7h9]:S:K:E;>;8=3>-@(B!EHK KKK! K' K. K6 J?JIJTIaHoGEDB@>=9q;d<Y=P=I=B>M^q~{zyw`UYUTTLWB\8a.f%kor vy|~  *6EVi_ZZZS\Ha>g4m*r w|!,;L`va`ZaPgEm:t0z&  .?SjbgXmMsB{8-#!2F]sɉɝǫ $-5<DKPV[_chlqx!)18?FLQVZ^cglry $,3:@GLQUY^bgls| (/5;AGKPTX]bgmv #*17<AFKOSX]bhpy%,27<AEJNSX]cj}t{~yxvutssr  '-27<}@|E{IyNxSwYu_sfqooynljihggg~ |zx"w(v.u3t7r<q@oEnJlOkTi[hbfkduba`^]]\\|yusqom#l)j.i3h8f<e@dFcKaQ`W^_\h[rY~WVUTSSS { t omk hgec%b*`/_4^8\=[BZGXMWTU\SeRpP|NMLKJJK ~tmhd ca `^\ Z&X+W0U5T:S?QDPKNRMZKdInG{FECCBBB xnga^[Z YVTR"Q (O -N 2L 7K <J BH IF QE YC cA n? {> = < ;;;;sib\XUSQPMKJ$H*F/E4D:B@AG?O=X<b:m8z76544 4 4 |oe^XSPMKH FDB!A&?,>1=7;=:D8L7V5`4l2y10/..//xl!b"Z"T"O KHEB @><:#9)7.645;3B2J1T/^.j-w,**))**u"i$_%W%Q$K#G"C @ = :864 3 &1 ,0 2/!9.!@-"H+"R*#])#i("v&"%!%$$%%!r$f&\'T'M'H&C%?$;$8$5$ 2$0$.$,$#+$)*%0)%6(&>'&F&'P%'[$'g"'u!&!% # ! ! }$o&c(Y)Q)K)E)@(;(6(3(0(-)+)))')!&)'%*.$*5#*<"+E!+N +Y+f*s*)'%#"!#z&l)`+V+N+H+B+=+7+1,.,+-(- %.$.".!.% .,/3/:/C/M/X/d/r.-+)'&%%w)i+]-T-L-E-?-:-4.//+0&1#2 3333#3*40484A4K4V3b3p21/-+*)(s,f.Z/Q/I0B0<07012-2(3$578999!9'9.969>9H9T 8` 8n 7} 6 4 2 0 . -,o/b0W1N2F2@2:253/4+5&7!9;> ??? ?% ?+ >3 >;>E>P=\=j @CE HK KKKK%K,K4K=JHJTIcHrGFCB@>p7b9V9M:E:?:::5;.>(@"CFILOP QRRS!S(S0R9RDRPQ^PnOMLIGFj;]<R=I=C===9=1@*D$GJMP RUW X XYZ[$[,[5[?ZKZYXiW{UTRPOe@Y@O@G@A@=@5C.G&K NQT WZ]__ `abcd&e/e9dFdTccav`^\[X_DTDLDFDAC:G1K)O"SVZ ]`beghi jklm!o)p4o?oNn^lpkigfeZIQIKHFH?J6O-T$Y\` cgiloqrst vwy{"}+~7}E|V{hy}wusrWNPMLLDO;T1Y(^cg knrtwy|} #/=M`uVSRRKTAZ7_,e#jpsw{~ &4DWlXXRYG_=e2l(rx}  *:MbzY_OdDk:r/z%,?Um!)18?FLQV[_chmsz %-4;AGLQVZ^chnt|!(/6<BGLPUY^bhnv $+17=BFJOTX]bipy&,28=AEINSX]cjs}~|zyyxx !'-27<@DI~M|SzXy^weunsxqonllkkk~|{"y(x.w3v7u<t@rDqHpMoSmZlajihsfdcaa``_}xu rpon$m)l.k3j7i;h?gDeIdOcUa]_e^o\|ZYWVVUUysoki gfec%b*b.`3_7^;]@\EZKYRWYVaTlRxPONMLLLzqjeca_]\[ Z%Y*W/V3U8T<RAQGONNVL^KiIuGFEDDCC t j c^ [ YX VUSR"P&O+M0L4K9J>HDGKESD\BgAs?>=<<<< znd]XTR P O NLJI#G(F,E1C6B<AB?I>R<[;f9r8665555 ui`YSOLJH G E C B @ %? )> /< 4; :: A8 H7 Q5[3g2s0/ . . ...qe\UOJFDBA?=;:!8'7,62483?1G0P.Z-e+r*)('' ( ( |nbYQKFB?=;9 7532$0)//.5-<+D*N)X'd&p%$#"""#yk_V N H C>;853 1/-,!*')-(3':&B$L#V"b!o~vh\!S"K"E"?!;!7 30.+ )'%$$# *" 1!!8 !A!J"U"a!n!} se"Z#P$H$B$=$8#4#/#,#)#&# ##"$ $$"$(%/%6%?&H&S&_%m%|$" o!b$W%M&F&?&:&5&1%,&''$'!(())) )&)-*4*=*F*Q*^*k)z(&% "! | l$_&T'K(C(=(7(3(.())%*!+,- ....$.+/2/;/D /O .[ .h -w ,+)'% $y#i&\)Q*H*@*:*5*0*,+&,#,.02 34 4 3" 3( 30383A3K3X3e2t1/.,*(t&e)X+N,E,>,8,3,.,*-%.!0246 9 9999&9-949=8H8T8b7p6531/.p*a-U.J.B/;/6/1/-/(0#2468 ;> >???#?*>1>:>E>Q=^ @C DDEE E&E.E7EADMDZCjB{@?<;:f1X3M4D4=47434/4(6"9<>A DGIJ KKLM#M*M3M=LHLVKeJwHFEBA`6T7I7A7;76626,9%<?BE HKMPQ RSTUV&V.V8UCTQTaRsQOMLJ[:O:F:?::969/<(?!CFJ MORUWXZ [\]^!`)`3_>_L^[]m[YWVUU>K>C>>=:<3?+C$GKO RUX[^`abd efhi$k-k8jEiUhgf|eca`QBHBBA?@8C/G'LQUY\_begiklno qsuw&y1x>wNv`utrpomNGHFDE=G4L+R!W\`dgjmpsuwxz|~(5EWk~MKIJCL9Q/W&]ch lotwy|  -<NczOPJQ@W5]+d!jp uy} $3EZpQVG\==<<vi ` Y U QONL KJIH"G&F+E/C4B9A>@E>M=V;`:l8y766555p d[TNK H GF DCBA?#>'=,<1;69<8B7K5T4^2j1w0//...y k`WOIEB@ ? > =<:9 7$6)5.443:1A0I/S- ^, j*w)((((( ug\SKEA=;98 7 5 4 2 1 "0 '/ ,- 2, 9+ @)I(T&_%k#z" " ! """ rdYOHB=964310.,+*$(*'0&7$?#H"R ]jx   naVLE?:620-+) (&$#""(!. 5=FP\iw|k^SIB<73/,)&$" %,3;DOZgvxh[PG?940,)%! # * 1 9!B!M!Y!f t      ueXM D!=!7!2!. * & " ""# #$$$!$(%/ %7 %@ %J %V %b$q$" qbV!K"B#:#5#0#+"'"$"#$%'( ) ) ) )%),)4)<)G)R)_)n(~'%#!n_"R#H%?%8%2%-%)$%$"%&'(* - ....#.).1.:.D.O.\-k,{+)'&$j"[$O&E'<'6'0'+''&$' ')+,/1 2333 3'3.373@3L3Y2h1y0/,*)e%W'K(A):)3).)*)&)#)+-/1 36 7 8999$9+949=9H8V8e7v5430/a)S*H+>,7,1+-+)+&+ -024 69;< =>?@!@(@0@:@E?R>a=s<:985\,O-D.;.5.0.,-)-#/257 9<?AB DEFGH$H,H6GAGNF]EnCA?>>V0J1@19131/0,/&2 58;=@CEHIK LMOP Q(Q2P<PIOXNiL~KIGFQ4F4=47423/2)5"8<?B EHKNPQST VWY[#[-[7ZDZSXdWxUSQOL8B8;86736-8&<@DG KNQTVYZ\]_ aceg'g1g>fLe^cra_]\G<@<:;7:1<)@!DIN RUX[^acdfhik mor!u+t7sFrXqkoljiE@??<>6@-E$JOT Y]`cfilnprtvxz |#/>Ocy}{yDEACCHMQUY^djs~ '-39>BGKOTY^dkv~| "(.49=AEJNSX^en{~|{yvsq#).38<@D~H|M{SyYx`vhtsrpomkjhg|y xwvu$u)u.t3s7r;q?oCnHmMkTj[hcgme{cba_^]\ysomkjih h%g)g.g2f6d:c>bCaH_O^V\^[gYuWVUSRRRvnhdb` ^^]] \%\)\-Z1Y5X:W?UDTJSQQZPcNpM~KJHHGGyme_[XVU TSRR Q%Q)P-O1N5M:K@JFIMGVF_DlCyA@?>>>pf]VRONL KJIIH!H%G)E-D2C6B<@B?J>R=\;h:v977666zj_WPKHFDC BA@??!>&=*<.;3:98?7G6O5Y3e2r10//..sfZ Q J E A ?=<; :9877"5'4+30261=0D/M-X,c+p*)((((n a VMF@<9 7 654 3210/$-(,.+3*:)B(K'V%b$o#~""!""{j ^RIB<8420 / . . ,+)(!'&&+%2$9#A! K U b o~w gZOF?941.+)( ( & % # " ! $ * 1 8ALWdq  t dWLC<61-*'%#"  #)07@JVbp  qaTI@93/*'$!  '.5>IT ` m }     m^RG>71,($!  $ + 3 ; EP]jzj[OD;4/*&"   "( 0 8 B M Z hwgXLA92,($  ! ####$&$-$5$?$J$W$e#u"!cUI? 6 0 * &" ! # %' (())#)*)3)<)G)T(c(s&%$! `RF!<"4"-"("$!!!  "#% ')+ ,-..!.(.0.9.D.Q-`-p+*('$[ N"B#9$1$+$&### ""$&' ),.0 12444%4-464A4N3]2m1/-,,W#J%?&6&/&)&%%"% $&(* ,/145 7 8:;;";*;3;>:J:Y9j8}6421R'E(;)3)-(((%'#&)+-0 257:;= >@BCC&C/B:BFAU@f?z=;:8L+A+8,0+++(*&) +.14 69;>ABDE GIKM"M+L5LAKPIaHuGDBAG.=/5//.+-),#.158 ;=@CFHJLNP RTVW&W1V=UKT[RpQNMKB29232/1,/'1 59= @CFILORTVWY[ ^`c!d+c7cEbU`i^\YX>6763503+5#9=B FJMQTWZ\^`bdfh knq%r1q?oOnblxjhf<:794809'=BH MRVY\`cfhjlnprux {)7G[}pzyu<>9<5=,B"HNTZ^cfiloruwy|~  .?Rg~>A;A1G'NU[agkpswz} $4G]sAF7L-T#[b iouy~+>Si %,39?DIMRV[`flt~!'.4:?DHLQUZ`fnw~ #)/49>BGKOTZ`hp{}xt$*/48=AEJOTZa}j|uzxvutqmj ~||{%{*{/{3{7y;x?wDuItNrTq[odmnlzjhgfeb`}wsponmm m%m)l.l2k6j:h>gCfIdOcVa^`h^t][ZYXVUxojfcb a``` `%`)`-_1^5\9[>ZCYJWQVYTcRoQ}ONMMKJwld^[XVV UUTT T$S(R-Q1P5O9N?LEKLJUH^GjFwDCBBA@|nd[UQNML JJIII I$H(G,F1E5D;BAAH@Q>Z=f<s::9877tg\SMIFDBA A@@@? ?$>(=-<1:79=8D7M6W5b4o210///naVMFA><;:9 88776!5%4)3.231:0A/J.T-_,l+}*)(((yi\QHA<854321 00/.-",&+++0*7)>(G'Q&\%k$z#"!""teW L C < 7 3 0 .,+* ) )('&&#%($-#4"<!E OZhwpaS H @93/, ) ' % $$ #"!  %+2:CMZgvl^ PE=60,(%"    #)09 B M Y gui [ MB:3-)%!       " ) 1:D N Z g v  f XK@70+&"    ' . 6?JVds  cUH=5.($    $+3<GTbq`RE;3,&"   !(1:EQ`o]OB80*$   &. 7 B O^mYK?6.'"   ! "#$$$$,$5$@$L$Z#k"}!VH<3+%  !# % ')))")))3)=)J)X(i'{%$"!QD90)# "$&(* ,.///'0/0:/F/U.e-y,*(&M@ 6!-!'!"  ! #%'),.0 2 4677#7,666C5Q5a3u20.-H"<#2$+$%#!"! !$& (+-02468 : <>? ?)>3>>=M<];q9864C%8&/&(&$%!$#$'* ,/2479;=?A CFII$H/H:GHFYDkB@>=>)4*-)'($'"&'*- 1469<?ACEGJL NQT S*R6QDPTOfM}KJG9-1-+,'+%) *.2 59<?BEHKMOQSVY \_a$`0_=^M\`ZuXVT61/0+/)-$.27 ;?BFJMPSUXZ\^acfimo*n7mGlYkmhfd44/3-1)2 7<AFKNRVY]`bdgiknqtw{#0@~R{fx~vt4826.6%;AGMSX\`cfimortvy|(7J^u7;4:*@!FM U[afimqtwz}.@Uk:?0E&LT[bintx| $6J`u  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./012456789:;<=>?@ABCDEFGHIJKLMNOPRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~Q՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԛfԜfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԜgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՛eԜfԜfԜfԜgԜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՜eԜfԜfԜfԜgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՜eԜfԜfԜfԜgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՛e՜eԜfԜfԜfԜgԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՜e՜eԜfԜfԜfԜfӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՜eԜeԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgQ՛d՛d՜eԜeԜeԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgQ՛d՜d՜dԜeԝeԝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgR՛d՜d՜dԝdԝeԝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgR՜c՜d՝dԝdԝeӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgR՜c՝c՝cԝdӝeӝfӝfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMgY՛e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛fԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛fԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMhY՛e՛e՛eԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMiY՛e՛e՛eԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMiZ՛e՛e՛eԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMjZ՛e՛e՛eԛfԛfԛfԛgԛgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMjZ՛e՛e՛eԛfԛfԛfԜgԜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMkZ՛d՛e՛eԛfԛfԜfԜfԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgMkߜZ՛d՛e՛eԛfԛfԜfԜfԜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgLlޜ[՛d՛e՛eԛfԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgLnۛ]՛d՛e՛eԜfԜfԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgLo؛a՛d՛e՛eԜeԜeԝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgLr՛d՛d՛e՜eԜeԝeӝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgKu՛d՛d՜d՜dԝdԝeӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgK}՛c՜d՜dԝdԝeӝeӝfӜfӜfӜfӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgL՛c՜c՝cԝdӝeӝeӝfӜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgM՜c՝bԞcӝdӝeӝeҝfҝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJNT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJOT՚e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՚e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJPT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJQT՛e՛e՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgJQT՛e՛e՛eԛfԛfԛfԛfԛgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgIQT՛e՛e՛eԛfԛfԛfԜfԜgԜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgIRT՛e՛e՛eԛfԛfԜfԜfԜfԜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgIRT՛e՛e՛e՛fԛfԜfԜfԜfԜgӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgISU՛e՛e՛e՛eԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgITU՛d՛e՛e՜eԜeԜfԜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgHVU՛d՛e՛eԜeԝeԝeӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgHWU՛d՛d՜dԝdԝeӝfӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgGZU՛d՜d՝dԝdӝeӝfӝfӜfӜfӜfӜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgI]V՛d՜cԝcӝdӝeӝfӝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgJfߞX՜cԞbӝdӝeӝeҝfҝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgKqP՞`ԞcӝdӝeҝeҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH:QiZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QjZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QjZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QkZ՚e՚fԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgH;QlZ՚e՚fԛfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgHQr[՛e՛f՛fԛfԛfԜfԜfԜgԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgG>Qs[՛e՛e՛fԛfԜfԜfԜfԜfӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF?Qtߛ\՛e՛e՛eԜfԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF?Qvܛ^՛e՛e՛eԜeԜeԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgF@Py؛b՛e՛e՜eԜeԝeԝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgEAP|՛d՛e՜d՜dԝdԝeӝfӜfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgDCP՛d՛d՜d՝dԝdӝeӝfӝfӜfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgDDP՛d՜c՝cԝdӝeӝeӝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgEFP՜c՝bԞcӝdӝeҝeҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgGMMߥOԞbӝdӝeҝeҝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgHWH#6BʻLʷRʴWʲZʱ\ʰ^ʯ_ʯ`ʯ`ʮaʮaʮbʮbʮbʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcʮcG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OPW]՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OQW^՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhG+OQWߙ_՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgG+ORWޙ`՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgG+OSWݙa՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OSWܙa՚fԚfԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OSWۙb՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OTWښb՚fԚfԛfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OTWٚc՚fԚfԛfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,OTWؚd՚fԚfԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,NUW֚d՚f՚fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF,NUW՚e՚f՚fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF-NUW՚e՚f՛fԛfԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgF-NVW՚e՚f՛fԛfԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE-NVW՚e՚f՛fԛfԛfԛfԛfԜgԜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE-NWW՚e՚f՛f՛fԛfԛfԜfԜfԜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE.NXW՚e՚e՛e՛fԛfԜfԜfԜfԜfӜgӜgӜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE.NYW՚e՛e՛e՛eԜfԜfԜfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD.NZW՚e՛e՛e՜eԜeԜfԝfԜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD/M\W՚e՛e՛e՜eԜeԝeԝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgC0M^W՛e՛d՜d՜dԝdԝeӝfӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgC1M`X՛d՜d՜dԝdԝeӝeӝfӜfӜfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgB2LdX՛d՜c՝cԝdӝeӝeӝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg@3LhT՜c՝bԝcӝdӝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgA4JiNۧKԞcӝdӝeҝeҝfҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgC6Jhߴ@+;DKǽQǻUǹXǸZǷ\Ƕ]Ƕ^ǵ^ǵ_Ƶ`Ƶ`ƴ`ƴaƴaŴbŴbŴbŴbŴbŴbŴbŴbŴbŴbŴbŴbE==]o)w3}TeZۙcԚfԚfԚfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM>TfZٙd՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM>TgZؙd՚fԚfԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM?ThZ֚e՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhFM?ThZ՚f՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM?TiZ՚f՚fԚfԛfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM@TjZ՚f՚fԛfԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM@TjZ՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgEM@Tk[՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE LATl[՚f՚f՛fԛfԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛgE LATl[՚f՚f՛fԛfԛfԛfԛfԜgԜgӜgӛgӛgӛgӛgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgE LATm[՚f՛e՛f՛fԛfԜfԜfԜfԜgӜgӜgӛgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD LBTo[՚e՛e՛e՛eԛfԜfԜfԜfԜgӜgӜgӜgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD LCTp[՚e՛e՛e՛eԜfԜfԜfԜfӜfӜgӜgӜgӜgӜgӜgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgD!LCTr[՚e՛e՛e՜eԜeԜfԜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgC!KETt[՛e՛e՜e՜eԝeԝeӝfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgC!KFTw[՛d՛d՜dԝdԝeӝeӝfӜfӜfӜfӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgB"KHT{Z՛d՜d՝dԝdӝeӝeӝfӜfӜfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgA#JJSX՜c՝cԝcӝdӝeӝfӝfҝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg@#ILO{S՜bԞbӝdӝeӝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg?$HPLvLحBԢ\ӝdҝeҝeҝfҝeҞeџeџeџeѠeѠeРeСeСeСeСeТeϢeϢeϢeϢeϢeϢeϢeϢeϢeϢe<%FFGp(0>FLQTVÿXÿZþ[¾\¾]¾]¾^^___```````````?#CF`#o.x6|>EJNRTVWXYYZ[[\]^^^^^^^^^^^?$ = K+S4X;^@dDiHmIpLsNuPwQxRzTzU{V|W}W}X~Y[[[[[[[[[[[;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_ؙfԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SHXi\_՚fԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚh;M+SIXk\_ԚfԚgԚgԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԛhԛhԛhԛhԛhԛhԛhԛhԛhԛhԛh<M,SJXl\`ԚfԚfԚgԚgԚgԚgԚgԚgԚgԛgԛhԛhԛhԛhԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛh=M,SKXn\aԚfԚfԚgԚgԚgԚgԚgԛgԛgԛgԛgԛhԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh=L-SLXo\aԚfԚfԚgԚgԚgԛgԛgԛgԛgԛgԛgԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh>L-SLXp\ޘbԚfԚfԚfԚgԛgԛgԛgԛgԛgԛgԛgԛgԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh>L-SMXq\ۙc՚fԚfԚfԛgԛgԛgԛgԛgԛgԛgԛgԛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh?L.SNXr\ٙd՚fԚfԚfԛgԛgԛgԛgԛgԛgԛgԛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh?L.SNXt\֚e՚fԚfԛfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh?L.SOXu\՚f՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh@L.ROXv\՚f՚fԚfԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh@L/RPXv\՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhAL/RPXw\՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhAL/RQXx\՚f՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛgӛgӛgӛgӛhӜhӜhӜhӜhӜhӜhӜhӜhӜhAK/RRXz\՚e՚f՛fԛfԛfԛfԛfԛgԜgӛgӛgӛgӛgӛgӛgӛgӛgӜgӜhӜhӜhӜhӜhӜhӜhӜhӜhӜhBK0RRX{\՚e՛e՛e՛fԛfԜfԜfԜgԜgӜgӛgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgBK0RSX|\՚e՛e՛e՛eԜfԜfԜfԜfԜgӜgӜgӛgӛgӛgӛgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgCK1RTX~[՚e՛e՛e՜eԜfԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgӜgDK1RUW[՛e՛e՛e՜eԜeԜeԜfӜfӜfӜgӜgӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgCJ2RWW[՛e՛d՜eԜeԝeԝeӜfӜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgCJ3RYVZ՛d՜d՜dԝdԝeӝeӝfӜfӜfӜfӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgBJ4Q[TY՛d՜c՝cԝdӝeӝeӝfӜfӜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgBI5O[QV՜c՝cԝcӝdӝeӝfҝfҝfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgAH7KXL|P՝aԞbӝdӝeӝeҝfҝfҝfҝfҜfҜfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg?G9GNL{߭Gֶ<ҫOѦZѤ^ѤaУbФbФcϤcϤcϤcϥdΥdΥdΥdΦdΦeͦeͧeͧeͧeͧeͧeͧeͧeͧeͧeͧe>@/HNAr2>GMQTWYZ¿[¿\¿]^^__``aaaaaaaaaa;B*>Ja(n1w9|@GKORTUVWXXYZ[\\^^^^^^^^^^;;*>$L/T7Z=^BbFeGgHiIkKmMoOpPqQrSsTtUuVuWvYwZx[x[x[x[x[x[x[x[x[x9".*63;9@;D=I?MAQCTEVGXIZK[M\N]P^Q_S`TaUaWbYcZcZcZcZcZcZcZcZcZc. ?O4WM[f]_cݗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. ?O4WM[f]_cݗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. ?O4WM[f]_cݗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. ?O4WM[f]_cۗfԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. @P5WN[h]_c՚gԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚiԚi. AQ6WP[j]_ߗdԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚiԚi/ AR6WQ[l]_ۘeԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhԚhԚhԚiԚiԚiԚiԚiԚiԚiԚi/ BR7WR[n]_יfԚfԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԚhԚhԚhԚhӛhӛhӛhӛhӛhӛhӛhӛhӛh0 BR7WSZp\_ԚfԚfԚgԚgԚgԚgԚgԚgԚgԚhԚhԚhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh0 CR8WTZr\`ԚfԚfԚgԚgԚgԚgԚgԛgԛgԛgԛhԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh0 D R9WUZt\`՚fԚfԚfԚgԚgԛgԛgԛgԛgԛgԛhԛhԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh1 D R9WVZv\ߘa՚fԚfԚfԚgԛgԛgԛgԛgԛgԛgԛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh1 E Q:WVYw\ݙb՚fԚfԚfԛfԛgԛgԛgԛgԛgԛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh1 E Q:WWYy\ۙc՚fԚfԛfԛfԛgԛgԛgԛgԛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh2 F!Q;WXYz\ٙd՚f՚fԛfԛfԛgԛgԛgԛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh2 F!Q;VYY{[֚e՚f՛fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛgӛgӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛhӛh2 F!Q;VZX}[՚e՚f՛fԛfԛfԛfԛgԛgӛgӛgӛgӛgӛgӛgӛgӛhӛhӛhӜhӜhӜhӜhӜhӜhӜhӜhӜh3 G!QT]WZ՚e՛e՛e՜eԜeԜfԜfԜfӜgӜgӜgӜgӜgӜgӜgӜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh4 J"Q?T]VZ՛e՛d՛e՜eԜeԝeԜfӜfӜgӜgӜgӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg5 J#Q@S^UY՛d՛d՜d՜dԝeԝeӝfӜfӜfӜgӜgӜgӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg6 J#PAR^TW՛d՜d՜dԝdԝeӝeӝfӜfӜfӜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg7I$OAP]QU՜c՜c՝cԝdӝeӝeӝfӜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg9I%L@L[MzQ՜b՞aԝcӝdӝeӝfҝfҝfҜfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg;H&I=HSMzMڪHԞaӝdӝeҝeҝfҝfҝfҝfҜfҜfҜfҜgҜgҜgҜgҜgҜgҝgҝgҝgҝgҝgҝgҝgҝgҝg>G&C6IOIwܹ<5ϸEγOͰU̯Y̮[̭]˭^˭`˭`˭aʭbʭcʭcʭdɭdǭdƮeĮfĮfĮfĮfĮfĮfĮfĮfĮf?@ C+EP3n!1>FLPTWYZ\]^^_`abcddddddddd=;A.,J!^,k4t;zB~HMPSTVWXYZ[\]_`bbbbbbbbb3<+,>(K2S9Z?_DcFfHiIkKmMnOoPpRqSrTsVtWtYuZv\v^w_w_w_w_w_w_w_w_w8.#$.-65=:BWWZr\^ޘcԚfԚgԚgԚgԚgԚgԚgԚhԚhԚhԚhԛhӛhӛiӛiӛiӛiӛiӛiӛiӛiӛiӛiӛi~%7G)U?WXYt[]ۙcԚfԚfԚgԚgԚgԚgԚgԛhԛhԛhԛhӛhӛhӛhӛiӛiӛiӛiӛiӛiӛiӛiӛiӛi%7G)U@WYYu[]ؙd՚fԚfԚgԚgԛgԛgԛgԛgԛhӛhӛhӛhӛhӛhӛhӛiӛiӛiӛiӛiӛiӛiӛiӛi&7H)T@VZXv[]՚f՚fԚfԚfԛgԛgԛgԛgԛgӛhӛhӛhӛhӛhӛhӛhӛhӛiӛiӛiӛiӛiӛiӛiӛi&8H*TAVZXwZ]՚f՚fԚfԛfԛgԛgԛgԛgӛgӛgӛhӛhӛhӛhӛhӛhӛhқiқiқiқiқiқiқiқi&8H*SAU[XxZ]՚e՚fԛfԛfԛfԛgԛgԛgӛgӛgӛgӛhӛhӛhӛhӛhқhқhқhқhқhқhқhқhқh&8I+SAU[WyZ\՚e՛e՛fԛfԛfԛgԛgӛgӛgӛgӛgӛhӛhӜhӜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh&9I+RBT\WzY\՚e՛e՛eԛfԛfԛfԜgӛgӛgӛgӛgӜgӜhӜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh'9J+RBT\VzY\՛e՛e՛e՛eԜfԜfԜfӜgӛgӛgӜgӜgӜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh':K,QBS\UzX[՛d՛d՜eԜeԜeԜfӜfӜgӜgӜgӜgӜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh':L,PBR\TzWZ՛d՛d՜dԜeԝeԝfӜfӜgӜgӜgӜgҜgҜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜhҜhҜh(;M,OBQ[SyUY՛d՜d՝dԝdԝeӝfӜfӜfӜgҜgҜgҜgҜgҜgҜgҜgҜhҜhҜhҜhҜhҜhҜhҜhҜh(<N,NAOZPvSW՜c՝cԝcԝdӝeӝfӜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜhҜhҜhҜhҜhҜhҜhҜh)=L+L@LWMqPR՝bԞbԝdӝeӝeҝfҝfҜfҜfҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜgҜg*>J*H=HQMnOߩLبKӞcӝdӝeҝeҝfҝfҜfҜfҜfҜgҜgҜgҜgѝgўgϠhΡhΡhΡhΡhΡhΡhΡhΡh+@F(D7IILoH0ҸAаNϬWϩ[Ϩ^Χ`ΧaΧbͧcͧdͧd̨ęf˩fʪgȫhūi¬j¬j¬j¬j¬j¬j¬j¬j-CA#C-ILDl0>GǿNǼSƻWƺZŹ\Ÿ^Ÿ_ķa·abcdfgikkkkkkkk/@;D-@Le'v0=.F%X/e7n=tByH}MQSUVXY[\^`bdgiiiiiiii47:+";,H4Q;X@]EbGeHhJjLlNnQoRpTqVrXsZt\u_vavdwfwfwfwfwfwfwfwfw07"'.067=;B=G?KANCPESFTIVKWMXOYQZS[U\X]~Z^|\^z__yb`yb`yb`yb`yb`yb`yb`yb`4 !*,%/*2.427598<:><@=~B?|D@zFAxHBwJBuLCtODrQEqSFoVGnXGl[Hl[Hl[Hl[Hl[Hl[Hl[Hl[H  "%)-"z0$w3%s5'q7(o9)m<*l>+j@,iB-hD.gG/fI0dL1cN1bQ2`T3`T3`T3`T3`T3`T3`T3`T3h#g+ m9qD$yM4UE[U`cdogyjlnoqqrsstuvwyyzzzzzzzzh#g+ m9rD%zM4UE[U`ddpgzjlnoqqrsstuvwyyzzzzzzzzi#h+ n9sD%}N5VG\X_gctf~ikmopqrrstuvwxyzzzzzzzzi#j+ p9tE&N7VI\Z^jbwehkmnpqqrstuvwxyzzzzzzzzj"k+ q9vE'O8WK\]^m`{dgjlnopqrrstuwxyyzzzzzzzk"l, s9xE(O:XM\_^p_cfikmnpqqrstuwwxyzzzzzzzl"n, t:|E)P;YO[b]s_behjlmnpqrstuvwxzzzzzzzzm"o, v:F*QXSZh\}]_begݗhڗiؘiטi֘j֘jטlؗnؗpؗrؗtؗvؗyؗ{ؗ{ؗ{ؗ{ؗ{ؗ{ؗ{o!s- z;H,U?WTYj[]^beܗfؘgԚgԚhԚhԚhԚhԚiԚiӚjԙmՙpՙsՙvՙxՙxՙxՙxՙxՙxՙxp!t- {;H,T@VUYk[\^aݘe֙fԚgԚgԚgԚhԚhԚiԚiӚiӚiӚiӚkӚoӚsӚuӚuӚuӚuӚuӚuӚuq!u- |;I,S@VUXlZ\^aٙeԚgԚgԚgԚgԚhԚhԚhӚiӚiӛiӛiӛiқlқpқrқrқrқrқrқrқrr!v- ~<J-S@UVWlY[]ߙa՚fԚfԚgԚgԚgԚhԚhӛhӛiӛiӛiӛiқiқiҜnќqќqќqќqќqќqќqr!w- <K-R@TVWmY[]ݙa՚fԚfԚfԚgԛgԛgӛhӛhӛhӛiӛiқiқiқiќmќoќoќoќoќoќoќos x. <L-Q@TVVmXZ\ܚa՚f՚fԛfԛgԛgӛgӛhӛhӛhӛhқiқiқiқiќmНoНoНoНoНoНoНos y. <L-Q@SVUmWY[ښa՛e՛fԛfԛfԛgӛgӛgӜhӜhҜhҜiҜiҜiҜiНmОoОoОoОoОoОoОot z.=N-P@RUTlVXZٛa՛e՛e՛eԜfԜfӛgӜgӜhҜhҜhҜhҜiҜiҜiОmϟoϟoϟoϟoϟoϟoϟou {.=N,O?QTSkUWYٜ`՛d՜dԜeԝeӜfӜgӜgҜgҜhҜhҜhҜhќiѝjϟnΠpΠpΠpΠpΠpΠpΠpu |.>M,N?OSQiSUWڝ\՜c՝cԝdӝeӜfҜgҜgҜgҜgҜhҜhҜhѝiϠl͢p̢q̢q̢q̢q̢q̢q̢qv ~/>L+L=MQOfP{RTܡV՝bԞcӝeӝeҜfҜgҜgҜgҜgҜgҜhѝhϠḳn˥rʦsʦsʦsʦsʦsʦsʦsw /?J*J;KNMaPwQQۧNա\ӝdӝeҝfҝfҜfҜgҜgҜgОgΠi̢jʥmȧpŪu«x«x«x«x«x«x«xy0AH)G8HINZOyNܰGմBҬQѧ[Ѥ`ѢcТdТeϢeϣfΤg˥hȦiƨlêo˿rɻwƹzĹzĹzĹzĹzĹzĹzz0BE&C3I@M]KyݸB5нBͷM̳T̰Y˯]˭`ʭbʬcɬeƭfĮhƿjźlķp´sy{{{{{{{|1DA!C+IAI^ݿA*2C#X,g4s:|CJOSWZ[]_bdgkotxzzzzzzz!46=0*?)O2[9d?kDpIuNxP{S~UWZ\_behlpvxxxxxxx /9/'%7.B6L<@=~C?{F@yHBwKCuNDsPEqSFoWGmZHk]IjaJheKggKggKggKggKggKggKggK  $(,"~0$y3&u6(r8*p;+n>,l@-jC.iF/gI0eK1dO2bR3`U4^Y5\]6\^6\^6\^6\^6\^6\^6\^6  { up l$i(f+c.a0_3^6\8[;Y>WAVDTG SK QN!OR"NT"NT"NT"NT"NT"NT"NT"]%W*T3 Y?eG"oN0vV=z\H|aR~fYj`md~ph}rk}tm|wn{yo{{pz}qzryrxrxqxpxoxnylylylylylylyl]%X*V3 Z?hF$sN1yU?}[JaTe]iclholqotqvs~xt~zu}|v|v|v{vzv{u{s|rzqzqzqzqzqzqzq^$Y*W3 ]>lF%vN3|T@[M`We`igllopqssvuwwyyz{z~{~{~{}z~y~w~v{v{v{v{v{v{v{v_$Z*Y3 a>oF&zN4TBZO`Zecijlpntqxszu|v}xz}}|{|{|{|{|{|{|{|{`$[)Z3 e=tF'~N6UDZQ`]dghnkunyp}rtuwy|~󁍁}}}}}}}a$\)\3i=xF(N7UF[T^`ckgsjzmoqstvxz}󉃉񆈈b#])^3m=}F)O9VH\W^daofxilnqrstvxz{}툈녎肕肕肕肕肕肕肕c#^(`3r<F*P:WJ[Y]g_sd}hknpqstvxy{|鎁苇戎䅗䅗䅗䅗䅗䅗䅗d#_(b3v<G+Q;XKZ[]i^vafjmoqrtvxy{}厄㋋ቓ߆߆߆߆߆߆߆d#`(f3z<G+RL*N9PIRZTkV{XY[\^۞cћjОmΟr͡vˡ{Ȣšßj!g&}1>K)L8NHPXRhTwUWYYުXԨ]Сf̢jʥqɥvŦ}¥k!g&1?J(K6LENTPcSpU|VUܲQӳRϬ]ͧeɦiŨnvʼƻk!i&1@H&H4IBLOQ\SkSRڼHҾJͶU˱]ʬcƫgʿlɺsƵ}òl!l%1AF$F1G=MHPXQnN>BMɻVǶ]Ƴbf»kqym q%1BC!B,I6MEN\Jp/:ENVü\¹aeinvo v$1 B?C%I1KHE^+p1=GPV\`cgms{p |#2 >=DG4AJ(^/n6{@HPV[_bfkqxŁƌǙƣr"29 >C >6$J,[4i:sA|IPVZ]adiov}͇ΑΝyϫyϫyϫyϫyϫyϫyϫt!28>;#7(H0V8a>jDqJwP|TWZ^bflrz؂׋y֕t֡t֡t֡t֡t֡t֡t֡|199##4,B4N;WA_FeKjMnQqTtXw[y_{c|h}n~u~~}}{|v~ppppppp27!(/0:8D>KCQEWG[J^MaQdTfXh\j`kdl{inxonuvns}nqmnmnmnmnmnmnmnm3 "+'4097;==B@GCJEMIPLRPTSU}WWz[Yw_Ztd[qi\no]ku]h{]f]f]f]f]f]f]f]   $)-#0)4.73:6=9@;}D=zG?wJAuNBrQDpUEmYFj]HhbIehJbmK_rK\zK\zK\zK\zK\zK\zK\zK  !&*/#{2%v6(r9*p<+m@-kC.iF/gJ1eM2bQ3`V4^[5[`6Ye7Vj8Rp9Rp9Rp9Rp9Rp9Rp9Rp9Կ  zto$k(h,d/b2_6^9\<Z@XC VG!TK"QP#OU$MZ$K_%Ge&Ge&Ge&Ge&Ge&Ge&Ge&}slg b^[ X U# S& P) O-M0K3J7H:F?DCBH@M>RmF%sM0vU;x[EyaMyfSxkXxo\ws_vwbu{ct~esfrfpfpfqfqercockchcgcgcgcgcgcgcV%Q+K1 Y6h>rF&yM2{S=}ZH~`P~eW}j]}na{rezvgxziw}kvlultmtlulujuipjljiihihihihihihiW%R+O0 _5n=xE'M4S?XJ_Td[ibmgqj~um}xp||qzrysxsysyrzpuqqqmpkpjojojojojojoX%S*S. d4s<~E(M5SAYM]Wc_hfllpptswv{x~y}z|z}y~wzxuxqxowlvkukukukukukuY$T*W, i3x<E(M5TBYN]Yabgjkqousyv|z~~zvs~p}o{nznznznznznzZ$U*Z+m2}<E(N6UCZO\[_edniun{ruy~􆆆逗zwttt€tttttt[$V)^*r2;F(O6VCYP[\^gapgxlqtx}򊁍팄膐‡{yyyyyyyyyy\$W)a(v1;F(Q5TBWPZ\\h_rd{kpsw{捇ڀ~~~~~~~]#X)e'y1<G'P4SAVOX\[h]s`}hpsy}䑂ފׄх̆ȅĄ„]#Z(h'}0<H&O3Q@TMWZYg\r^}eotz㐁܎Ӊ͊ȋŋŠ^#\'k&0<I%M1O>RKUXWdZp]{`lt~؍ΏȐĐ_#^&n%0<J$K/MDG'K1N9R@UFVUTcTr^el}a"h#{#0 >CG#K*N0P;PKFZFiOwYaitˆb"k!"0 ?BGK"L/K?9O>^DlLxV_fo~ǐãc!o "/> BGH!F2/C7R>`DlLwU]dkw̘ͅzȩe!t /> B DB$)50E7S>_EjLtU|\ahqӍwҠrͰw{~g!z0=A>!'*72E9R@]FfLnTuY{_elw܅wړm٦hԸmȹpsuuuuuum3<; #(,74D;OBXH`MgRlWq\vbyi|q~{|}x|ofੁ`ݾbf€hhhhhhu38 &(/57?=ICQHWK]ObTfYj_meo{lqwursrpphs`uYvYvZvZvZvZvZvZv~0& )%2099?ABHDMHRLVQYV\[_|aawgcsnenwfjefdae[gTiQiQiQiQiQiQi   #, 4)70:7=<@ADEHHMK|RNxVPu[RqaTmgUioWdxW`W\WYVTWQXQXQXQXQXQX ֿ  !'+ 0&4+80<3~?7zD9vHpQ@lVAi[CfaEbgF^oGYxHUHQHMHKGKGKGKGKGKGغ  "',{0"v5%q8(n=*kA,hE-fJ/cN0`S2]Y3Z_5Vf6Qn7Mw8I8E8C9C9C9C9C9C9ڴ} vq"l'h,d0a4^8\<Z@WD UI!RO"OU#L[%Hc&Dk'@s'<}(:(:(:(:(:(:(Ͻyojea] Y V$ S( P,N0L4J9H=FBCHAO>V:]6d3l1r1r1r1r1r1rznf_YT PLIFC@">&<):.83684>2D .K +R (Y '] '] '] '] '] '] G)B0<7>9A> KFROVW"W^(Xe-Xl1Wr4Vx6T~8R9Q:O;M;KP>M?K?K?L>L>M=M5B7H< RDXL\T%^\,_c1^j6]p9\vY?W@UASBQBNBOBOBPAQ@Q?Q>N>M?L?L?L?L?L?J(D/A4E5M: WB]J`S'bZ.cb4bh9an=`t@^zB]C[EYEWFTGSGSGTFTEUDVBRCQDPDPDPDPDPDPDK(E.D2I3 R8\@bH eQ)gX1g`7gf=fmAdsDbyFaH_J]K[KYLXLXLYKZJZHXHUITJQJPJPJPJPJPJL'F.H0M0 X6b>gF"kN+lV3m^:le@jkEiqIgwKe}MdObP`Q]Q]Q^Q^P_O^NZOYPUPSPSPSPSPSPSPM'G-K.R. ^5h=nE#qL-rT5r[=qbDpiInoMluPj|ShUfVdWcWcWcWdVdT_V]WYWXVWVWVWVWVWVWVN'H-P,W,d3n<uC$xK.xQ7xY@w`GugMsmRqtUozXlZk\h]i]h]i\i[e\b]^]]]\\[[[[[[[[[[[[O&J,T*\*j2t:{B$J.P8~VB}^J{ePykVvrZty^q`obmcmcmcnbkbgccdadacabbabababababaP&M*X(a(p1{:B$J.P9UC[KcSjY|p^xxbuerhqiqiqhpgjjfjejfighgggegegegegegeQ&P)\'e'u09A#I.P8UCZL`Uh\ob}wgykumtotoumnojpjqkplnlmlklilililililiR%T'_&j&z/8A"J,P7VBZL]Ue^nevk~oyrwtvsstnvowpvqtrrrpqnqlqlqlqlqlqlS%V&b$n%~.8A J+R6U@YK\Ua^kftm}s}wwywxr{t|u|vzwxwvwsvquouououououoS%Y%e#r$. 8BL)Q3U>XH[R_\ifro|v~|txz{|€}~|{|x{vzszqzqzqzqzqzqT%[$h"u#- 7DM&Q0T:WDZN^Xfcrnٍz̈́~zxu}r}r}r}r}r}rU$^#k!y", 8FL#P,T5W>ZG^Pd^եnoȚ|||yvssssssU$`"n |!, :HLP'S.V6Y=\J^]dzinu}}zwttttttV$b!q ,<HLO!S&U+W3OHY[dmo|~{xuuuuuuW$e t-> HKOQR!G0MDVX`jkzyt{yvvvvvvX#hw.A G KML<&F2MATT]fgvus͌gɫox~{yvvvvvv["k{/BGIF0:*B7JDRQ\`dpp}r܂eڠaϺkrx}~{xvvvvvv^!o0BEC $/!8.@:GGNSX_ajktwy|mb઀^elqv|yz{w~u~u~u~u~u~uct0@@% %/$80?xNBsTEn[HibKdkM^uOWOQOLNGPESFTGVGVGVGVGVGV ݳ #)/!4&9+y=/uC2pI5lO8hU;d\=_c?ZlASxBMCGCBB?AAD?F?F?F?F?F?FѼ !'z-t2 n7#j=&fB(cH*`N,\T.X[0Tc2Nm3Hy4B5<67545747474747474ӷ~x ql$g*b/_4[:X?UDRJ OQ!KX"Ga$Al%;y&6'1(-()()()()()()(ճɾulg b]Y U% R* O/L4J9G?DEAL>T9]4h/u*'""""""˻ujb[V QLHEA!?&=+;0866<3C /L *V &` "k w       wkaZTNJG C@=;9 6$4)1..4+:&A!JS[ffffff>,9267999=8C %<&:'8(6(4)1)/).)/(0(2'3&4%4%3%2&2&2&2&2&?+:2:4=6>9?? EIHRI[Ic Hk#Ft&C}(A)>*<+:+7,5,2,3,4,6+7*8):(8)5*3*3*3*3*3*@+;1=2A4B7D= JFMONXNa"Nj&Kr)I{+F-C.A/>/<0908090;/-;.8/8/8/8/8/8/A*<1A0D1F5J; PDSMTV T_%Tg)Rp-Ox/L1I2F3C4@5=5?5@4A4B3C2D2A3=4<4<5<5<5<5<5B*>/D.I/K1P8 VAYJ[S"[\(Ze-Xm1Uv3R6N7K8H9D:D:E:G9H9I7J7G9C:B:A;A:A:A:A:A:C)A-H,N,Q.X5]=`FaP$aY+`b0^j4[s8X}:TI?J?L?M?N>PI@GAGAFAG@G@G@G@G@D)D+M*S*W,_3e;gChL&gU-f_3dh8`q<]z?YAUCPDODPEQDRDTBRDNFMGLGMGNFOFOFOFOFOFE)H)Q(X(^)f1l9oAoH'nQ.l[5jd;fn?cwC`F\HXITJUJWJWHWISLRMSMTMULVKVKVKVKVKVKF(L(U&]&c'm/ s7w?xG'vN/tX6qa=njBjtGfJcM^NZOZO[N\NXQWSYSZS[R\Q\P\O\O\O\O\OG(O&Y$b$i%s- {6>F&M.|T7y^>ugEqqJm|NiQdS`T]T_R\U\X_Y`YaXbWbUbTbSbSbSbSbSH(R%]#f"n#z+ 6>F$M-S6Z>}dExnLszQnUiXeYbX`Yb]d^f_g^g\h[hYgWgVgVgVgVgVI'U#`!j s!+ 6?G!N*S4XהfL͌rXņah|myoxoynymyjxhwevbu`t^s]s]s]s]s]O$] iu+8 DOSU#W-֧V=˟bLmXzckqttrpm~j|g{dybx_w^w^w^w^w^Q#_lx+9G OQSغG+̲R;]KiXudmtxxurolhe}c|`{_{_{_{_{_S"bo|+:KM N ۽EB(½O9ZIeWpc~muy|zwtpmjfda~`~`~`~`~`V!dr+;IJߺE2?%K6VFaUlayltvzo{sxzu~qnjgebaaaaaX gv*<FA'4="H3SC]Qi^uiurkwcygwnttqxn|khecaaaaa[kz&:?(6?G.P>ZMfYwrdkǃmaÚrXtZscripomsjvgye{c|a|a|a|a|a_o 1) 5?H)P9XG|cSop]c݁eX٘kPӶmOlWm^mdkiimfpdrbtatatatatact ) 4=!F+M6V@{`JnkTb{\V`NbIcMfSgYg_ecdgbi`k_k_k_k_k_iz  պ*4<"B+I5Q=w[ElfLasRVVLWHVG[J^O`T`Y_\^_]a\a\a\a\a\o ֳ!+28!>)D1{M8rV>j_DbkIXzLNOFODNCSEVJXNXQXTXVWVWVWVWVWvڬϺ&-39&{@,tH1mP6gY;`c?XoBODFF?FAD?I@LDNGOIOKPKPKPKPKP Ҵ !(.z4 r;%lB)gK-bS1\\4Vf6Nr9F;=<7<:::=;@AF>N9X3d-t& бŻ|oe^WQ LHC?$<*:0774?0G +R %_ n        ǹrf\UOJF B>;85$2*/0+6'>!HTcr ui]SMHD@= :742/,#*)&/#6?IT _krrrrr6.0526382<0B+I&S&] %h#r!|  6.1545565:3@/H+Q +[ *f(p%{#  7.246384886>3E2O 2Y0c.n+x(%"  8-5291<2<5;;8B 9L 9V7`4k1v.+(%"!$'#"!9-80=.@/A2@8=? ?I@T?^/.?-=/<2<3?4@4B4B3B3B3B3B3=*F'N%T$X&Z)^1 a:aD`O_Y$]c)Zn,Vy/R1N3K4H4F4F3C2C3A7C9F:H:I:J9K8K8K8K8K8@)J%R#Y"^#b'g/ j8jAhJgU%e`+bj/^u3Z5V7S8P9O8L8K7G;J>M?O@Q?Q?R>R=R=R=R=R=C'M#V!^ d i%o- s7t?rGoQ%l\+ig1er5a9];Z|EyM$tX+pd2lo7g};c?`B]D[EZFYGZI\J]J^I_H_G^E^D^D^D^D^DH$S ^gov#}+4 <DK!T)z`1tl9ny?kEhIeLcMbNaNbOcPdOdMdKdJcHcFcFcFcFcFJ#Vakt|")3 ;CIQ%څ\1~g:xsCtIpNnRkTjUiTjUjTjRjPiNhLhJgHgHgHgHgHM"Ydnx!(2; BGؕK$ΏX0ʼnc;nD~zLzRwVtYrZqZqYpWpUoSnPmNlLjJjJjJjJjJO![gr| &09@ ڣ<ΞG"ĘT0_;jEuNTZ}]z_x_w]vZuXsUrRpPoNnLnLnLnLnLQ ^ju#.7ݩ:Ь7ƦD Q.\:fEqN~V\`bb~`|]zZxWvTtQrOqMqMqMqMqMS`my(.Ժ"ȵ3AM,X9cDmNyV]b{dudxb|^~[}XzUxRvPtNtNtNtNtNVcp}ؾ 0 >J*U7`BjMvU]wboejembr_v\yY{V}|S~zQxOxOxOxOxOXfsֳ, :F&R4\?gJ~rSu[l`ed_dbbh_m\qYtVvTwRy}Oy}Oy}Oy}Oy}O\jw֫θ'6C#N0Y;~dFtoOk}Wc][`UaV_^^c[hYlVnTpRrPrPrPrPrP_n| ٥бȾ'3?K*V6ua@lmIc{QZVRZM[LZSZYY_WcUfShQjOjOjOjOjOdr ҫʷ)6 >H$wS/n_9djA[yHRӋNKϢQFRCRITOUUTYS]Q_PbNbNbNbNbNix զͲþ(3<}FtQ'k\0ag8Xt>OCHFCG=G@KEMJNONSMVLXKXKXKXKXKoڠϭƸ%/8v@nK#fU*_a/Vm4M~8E;A;=:8@>A?C?C?C?C?C?֣̰º}u% m-f5`>ZGTQN["Fi%>y'6)/*,*,)/,1042649595959595۟Ϭŷw pjc& ]-W6R>MGGQA]9k2}* #! !& (!)$+&.(.(.(.(.(ѩǵuld \WQ$L, H4 D< ?E;O4[,j%~!"""""Ԧɲui`XR LGA ='9.561?,J%W g }         ˰xk_UNID ?;74"0),0(8#AN^ rö|nbWLGB>:6 30-)#&)"19DRdxrfZPGA=962/ ,*'$!#*1; GUcq-1*5-5-7+;'A!HR]iu.1,4/305.9*?%FP[ gs  /1/2213327.<*D"MXdp }    00205/606439/A)J!Ua m y          105-9,;-:0865=0F(Q'] %h #t    3.9+=)?*?->1;87B5M 4X 1d/o,{)'%#!  6,<(A'D'E)D-B4@> @H ?T=_:j7u420.,+**(%#')+,,,,9)@&F$J$L%K)K0J: JE JPH[EfBq?|<:766531,'!,#0$3$5$6$7$7$7$7$<'D$J"O!R"T&U-S5 S@ SKRWObLmHxF C!A!@!?!>!< 9!4%5'9)<*>*?)@)@)@)@)@)?%G"OUX\$^+]2]< \GZRX^UiQt!O#L$K%J%H%G$E$A)?,A.D/F/G/H.H-H-H-H-H-B$K SZ_d"g(g/g8 eBcM`Z]e Zq$W~&U(S*P,O-M-M-K0I3K4M4O4O3O2O1O1O1O1O1D"NW^ek n&p,q5 p>lHiUfb!bm'_y+]/[1Y3W5V6U6T7S9U9V9V8V7V6U4U4U4U4U4G!Q[bkqu$x*z1z: wDtPo]#lh*hs/f4c7b:`<^=]=\=[>\>\=\<\:[8[7Z6Z6Z6Z6JT^fov{!&-5 ڂ?~LyX$uc,qn2ny8lf=ei=i=i=i=S_iu  ՚Σæ 1 >J!U+`4j{l>{l>{l>Ual x ֗ϟƩ-;GR)]3g;qB{~HtMnQiSeRfPkMn|JqxGsuDtsBuq@vp?vp?vp?vp?Xdp} ړќɥ)8DO&Z0d9zn@rzGlLeP`R[R\ObMfJi~Gl{EnxBovApu@pu@pu@pu@[h tԘ̡ê%4 AL#W,ya5ql=jxCcI\MVORORNXL]JaGeEg~Ci{Aiz@iz@iz@iz@_l yڔϞǧ0 =HyS(q^0ii8bu>[DTHNJJJHJOITHYF\D_BaAb@b@b@b@cpԚʤ*8xDpP"i[*af1Zs7SF>J>M=O=Pg8x1.+)$(!+$.%0'1'1'1'1'ԝɩ{ne^WQ%L/G8CC >N 8Z1i+{%""%&&&&ڙ̧±}pd[T NHC$>-:56?0J*W$h |       ϤŰqeYOJD ?:6 2(.0*9#CQc z    ǮtgZNE@:61 -)& "(1; HZqxk_SH>940-)%"!*3?Oc~}ocWLC:40-)&# # ,6DUh{%4&4'4&5#:?G P\gs&3(2*2)4&7!=ENYeq~'2+0-0-1*5%:BK Vcp{*0/.1-1./2*7%>GS _kw..2+5*5+3.03+:#CNZfr ~  1+6(9':'9*6.15.?*J%V bmx          4)9%=#>#>%<);19;6F1Q-]+h )s '~ % $ # " ! !        7&=#A!D D!D%D.B7@A<:9!;!=!>!> > > > > @ HOTY^`$_+]3Y=WI UVSbQnOyNMLK J H!H!F#D%D&E&F&F%F$F#F#F#F#CLSY`dg!h'f.c7bD _Q]][hYsX}!V#U%T'R(Q(P(O*M+M+M*N)M(M'L&L&L&L&FOV]ejmo"o(n1l? jLgXecbn"`x&_)]+\-Z.Y/W/V/U0U/T.T-S+R*Q)Q)Q)Q)HRZa iosuww,v; sHpTm_ ki%is)g~-e0c2a4`5^5]4[4[3Z1Y/X-W,V+V+V+V+KT] e msx{~ˀ(7 |DyPv[!se&po+nz0l3j6h8f9d9b9a7`6_4^1\/[.Z-Z-Z-Z-MW_ i q x }Ղ͆É$4AM~X!{b'xk-uv2r6p9n;l=j=|h<{g:|e8|d6}b3}`1}_0}^.}^.}^.}^.OYblu |փΈō 0>JT _'h-|r3y}7w;~u>yr?up@sn?rmlp;nm9pk6qi4rg2se1se1se1se1T^ ht}Ն̎”*8 DOY%c,}l2ww7r_AZBWAW?\~=`y:bu8er5fp4gn2gn2gn2gn2Yeq}ֈ̑™ !1=IzS t]'ng-gr3a8\S5A6F5J4M3O2Q1Q1Q1Q1fs߃ґǛztn.h; bG\SV_Pj Kw%E(@+<,:,8-7/<0@0D0F/H/H/H/H/l|ٌ̘âshc%^4YA SNNZHgCu>φ:Κ!6˳"4!2$/'2)7*:+<+>+>+>+>+tѕǠ{la[U,P:LGGT Ba>o962/,((,"0#2$4$4$4$4$~א˝rdZ TO%I1E<@I;V7d 2t .+('""%(****ދϛŦvi\RLGB'>19<4G/U*d%w!    ӘȤyk_RID?:6%2..8(C"Qbw   ʣ{maTJ@;61-) %(!1<J \tìqcVJ@72-)$ ! ) 3AUmuh[OD:0)%   *8Kczm`TI?6.&" %1AUl 4"2!248>EOYeq|"2$0$0"26; BLWbo{$0'.'-&/"38?IT_lw(.++++*,&/ 4< DP\gs~++.)0'/(++&07@K Wbny/)2%4$3$1&,+(3%=GR^i t~2&6"8 8 6!3&3/08,C&N!Ydoy          5#9<=<<"<+:47>2I.T*`(k&u&&%%$#"      ! ! ! ! 8 =ABCFE'C/@9=D9P6[4g3q3{2210/.-- , *((*+,,,,;AEHKNN#L*I4F?CK@W?c>m >w > = = <;:997544555555>EILRVVT%Q-N8LEKRK] Jh IrI{HGGEDCB@?==>>====AHMR Y\][Y%W1W?WL VX UcSmRvQPONMKJIGEEEDDCCCDKQ W ^ aba_b,b;aH _T^^\h[qZ{XW V"T#S#Q#P#N#L"L!K JIIIIFNT\b f gghk(k7jD hOfZddbmaw _#^%]&[(Y(W(V(T'S%R$P"O!N NNNHP W`fjmopt$s3r@ pLmVl`jjhs#f}&d(b*a,_,],}[+{Z*zX(zW&zU$zT#zS!zR!zR!zR!KS Zdjotvx { {0y= wHuSs]pf np$lz(j+h-}g/zd0vc0ta.s_,s^*s\(tZ&tX$tW#tW"tW"tW"MU]gnuz}-: ~E|PyZwc!um%rw)}p,yn/um1qj2nh2lg1ke.lc,ma)n^'o\&o[$oZ$oZ$oZ$OXakszƀ)7CMW~a ~{j%zyt)uw-qu0ms2iq4eo4dm2ck0eh-ge+hc(ia'j_%j^%j^%j^%Q Zdnx̀†%4@ JT|^wg$rq)n|-i|0ez3`x4]v4[t3[r1]n.`k,bh)ce(dc&ec&ec&ec&T ]hs}ȅ !0= HzRu[pe#kn'fz,a/]2X4U}4S{3Sx1Vu.Yq,[m*]j(^h'_g&_g&_g&Wamy΃ċ,9 yDsOnYib dl%_w)Z-U0P2M2K1K0N{.Qv,Ts*Vp(Xn'Xm'Xm'Xm'[erʉ}'w5rA lLgVb`\j!Wu%R)M,I.E.D-C-E,I~+Ly)Ov(Qs'Qr&Qr&Qr&_jyІŐy t!o0j<dH _RZ]UgPs K#F&B(>(=';)<)@(D'F~&Iz&Iy%Iy%Iy%dq؁ˍpie)a7\CWN RYMdHpC~?; 8!7 4"3$7$;$=$@#@#@#@#izщƕ|k] YV.R<MHIT E` @m<{8521.,-146777rل˒ufVKH"E1B??M;Z8h4w 1Љ .Ϡ+̼* '$#'*,---~юƛ{l^QC?;%936A3O/],m)&$"  !"""׊ʙqdVJ>941'.3*?&M"]o    ΗâugZNC82-*&$"/:IZ o ơxj]PE;1*&" (4BUl|m_RF<3*"  +:NgreXK@5+" "1E_xj]QF<2*!  *<Tr20026<CLWbnz0..049@IT_kw!.",!+-0 5=FP\gr}$+&)%("),28BLXbmx((*&*$'%!',4=HS^is|,%.".!,!'" &09D NZdnw/#120,*#(,%5?IU_ i s { 2 565342'/0*:%E!P[eox59;:;<:"7+45/@,K*W)a)k)u)~))))(('&%$" ! ! " # # # 8<?? CDB>$;.795E5R6]7g7p7y77766432 1 / - , - - - - - ;@C EJ KID?%?2A@CLCXCbCkCt B} B A A @ > =<:97555555>CFKP Q N HGL,N;OGNSN] Mf Lo LxKJIHGEDB@>=<<;;;AF JQUVURSW'X6XCXNWY VbUkTtS}RQONLJIGEDCB~A~A~ACIMUZ\^]\`#a2a?`J _U ]^\g[pZzXWVTRP}O{MyKxJxHxGwFwFwFEKQY^cfee hi/h;gG fQd[cdam`v^][ |Z!yX!vV!tT sSrQrOrMrLrKrKrKG NU]dilmlop+o8nD lNkXiagjfs~d}{c!wa#t_$q]$n[$mZ"kX kVkTlRlPlOlOlOJ PXaiortsuv(v5tA sKqUo^~ng{lpwjz sh"pg$le&ic&fa&e_$d]"d[ eXfVgUgTgTgTLS\entxzz|}$|2{>yI wR|v[xtdtrmppw lo#hm&ek'ai(^g'^e%]c#^`!_]a[aYbXbXbXNU`jsy~!/;F z~Pu}Yq{bmykiwu eu#at&]r(Zo(Wm(Vk&Vh$Wf"Yc [`\]\\\\\\QXdox,~8xC sMoVk_fhbr^}~"Z{%Vy'Rv(Ot'Oq&On$Pk"Sg UdVbWaWaWaT\iu~|'v5q@mJ hSd]_f[pW| R#N%K~&H|&Gy%Gu#Hr"Km NjOgPfPfPfWbo{Äxs"o0j<fF aP]ZXdTnOzK G"C#A"@"?~!@z CuFqHnIlIlIl[hvʂ{ojf+b7^BYM UWQaLlHxD@<:987;~>y@uAsAsAs`o~ʼnzh_[#X1T=QHMS I^ EiAv=96331/2589|9|9|gxˆvdTOL(I5FBCM@Y<)977D5Q2_/m,~*'%$" !$%%%}ˍvgYK=0 ,*((6&D%T#d!uӊѣ    Љŗ|m_QD8,# !'4BSf{     ɕqcVI>3( $0 >Qf~ tfYLA6,# *9Ldxi[NC8.%  "2F`~oaTG;0&  *>Z}ugZNB8.% "7Su0.. 049@IT`lx.,,-16=FP]it}+))* -28BLXdox!(!&%&).4=GS_js{$%$""!!$ (09CNZdnv~("(&!#,5?IU_iqy+,+& (0 :DPZdmt|.0.+)(%# ,5?J U _ h q y       133 /21-(%"/9EP[dm u!}!!"!!47779 83-'&%2)?+K-V/`0i0q0y000//-,+*(&$#$$$7: :>@>8 //4,7::F;Q;[DFCA;=A'D5EBFMFWF`EiEqEz D D C A @ > = ; 9 7 5 4 ~4 ~4 ~4 = @BIKNMIHL"N1O>OIOSO\Ne Mm Mv L KJHGEC|Bz@y=x<w; v: v: v: ? BGNSVWTR UW-X:XEWOVY Ua Tj SrR|QP~O{MxKvItHrFqCpBp@p?p?p?AEKRY]_]Z]_*_6_B^L]U \^ [fZoYx|WyVvUsSpQnOlMkKjIjGjEjDjDjDCGOW_cedbde&f3e?dIcR b[~ad{`lx^vu]q\nZkXhVfTeRdPdNdLdJeIeHeHEJS]diljhjl#l0k<jFiP {hXxgatejqdsnc~jag`d^a\_Z^X^U]S^Q_O_M_M_MGKWbioqpop rr-r9}pCyoM unVqm^nkgjjpgh{dg`e]cZaX_X]WZWXXUYSZQZQZQJO\gntvuuw xx*{x6wwAsvJ otS ks\hredpn`oy]mYkViSgQdQbQ_Q]SZTWUUUUUULTaltz{{|}~~y&u3p~>l|Gh{Q ezYayb]wlZuwVtRrOpLmJkJhJeJcL_N\OZOZOZOYfqz~vr"n/j:fDbN ^W Z`WjS}tO{KyHwEuCrCoClCiEeGbI_I_I_R_mwwn if*b6^A[KWT S] OgLrHDA>~<{l@iBfBfBfVfs~sf`\$Y1V<SGOQL[ He DpA~=:7654}4y6t8p:m:m:m]n{paU QO*L6IAFLCW@b:;537":0<<=G>P>Y>b>j>r>z==<;97~6|4z2x/w-w,v,v,88<@FHGA> BD+F8GCGMGVG^FfFnEwED C }B z@ x> u< s: r8 p6p4o3o2o2:;@GNQPKHKM(O4O?OIORN[NcMkLt }K~ zJ wI tH rF oD mB k@ j> i< i9i8h8h8<=DNUXWTQSU$V1V<VFUOUX~T`{Sh xRq uQ{ rPpOmMjLgJfHdF cC cA b? b> c= c= >?IT[^]ZXZ[!\.]9\C}\Lz[UwZ] tYf qXn nWxkViTfScQ`O_M^K]I \F \D ]B ]B ]B @COY`cb`_` bc+~c6zbAwbJtaRq`[ n_c k^lh]ve[bZ_Y\VYTXRXPWMWK WH XG XF XF BGT^ehgfef g|h'xi4th>qgGnfPkfX hea ecjbbt^a[_X^U\SYRWQUQRQORM RK SJ SJ DKYcjlkkklzmvn$rn0on;kmDhlMelV bk^ ^jg [hqXg}UeRcOaL_K\KZKWKTLR MP MO MO FP^hppppqzrstot lu-ht8etBbsK^rS[q\ Xpe UnoQm{NkKjHgFeEbD`D]EZFW GU HT HT IWdnuutuwsyl{ h{d{)a{4^{>[zHXyQUxZ Qwc Nvm KtyGrDqAo?l>i>f>c>`?] AZ AY AY M]jt{zyz||ne_\$Y0V;TDQNMWJaG~k D|w @{=y:w8t8q7m7j7g8c :a ;_ ;_ Tdq{yj^VSP*M6K@HJESB^?hD!K Xgx{wj]O@3& %2?M ] n   ƇteVH;." "0>N`tyj\MA4),<Nbzԗи}n`RE9-"  '8LdqcUG;0&!4JexiZL>2'  /Gf~pbTG;/$)De +)**-2:DQ]hqy( &&'*.6@MYdlt{%#"$%)0;HT_gou}"  #,7CNYaipw}'2=IS[cjqw}#-8CMV^ekrx~  '1<FPX`fmsz#   +6@JS[biov~& $ #/:D M V ^ elt| ) '"$  (4>HQZaip x ,*)*,+' ""%/':)D*M+V,^,e-m-u-~-,+*('}%{#y!xwww/,/3884/*.1*364@5J6R7Z7b7j7r7{665|3z2w0t.r,q)p'o%o$o$1.4<BB?:68;&=2><?F?O?W?_?g?o}>x{>x=v<s;q9n7l5j2i0h.h,g+g+32:DJIGB@AC"E.F9GCGLGT}F\zFdxFluEusDpCnBkAi?f=e;c8b6a4a2a1a156AJPONKHIKL+M6~N@{NIxMQvMYsLaqLjnKslJ}iI fH dF aD _B ]@\>\;[9[7[6[67:FPUTSQOP R~S({T3xT=uTFrSOoSWmR_jRghQpeP{ bO `M ]L ZJ XG WE VCV@V>U<V:V:8>LVZYXWUW}XxY%uZ1rZ;oZDlYLjYTgX]dWebVn _Uy \T YS WQ TO RL QJ QG PEPBP@P?P?:CQ[^^]\[}]w^r_"o_.l`8i_Af_Jd^Ra^Z^]c\\l Y[w VY SX PV NT LQ KO KL KIKGKEKCKC<IV`bbaa~awcpdleie*fe5ce>`eG^dO[dXXcaVbj S`u P_ M] J\ GY FW ET EQ EN ELEJFHFH?O\effffxgqijj fkbk'`k2]k;ZkDXjMUjURi^OhhLfs Ie Fd Cb A_ ?] ?Z ?W ?T ?Q?O@M@MDUbkjjjjtmkocq^r[r#Xr.Vr8SqAQqJNpSKo\HnfFmqCl~ @j =h ;f 9d 9` 9] 9Z9W9U:S:SK\hponnoqrgu\xVySyPy)Ny4Ky=IxFGxPDwYAvc>uoL<V9a7~l4|z2{/y-v+t+p+l*h+e+c,`,`\kvzyxxxyl}^SF>;9(725<4F2Q0].i,w)'%#}#y#u"q#n"l$i$ies~}~thZNB5/-+*)5(?&J$V"d!r{xusso}}pdWJ>1$ +6AN\l~  ~~zyl`SF:.!  *6CRbtui]PC6*)6DUg}sgXJ=0$ '5DXmdžĥzk\NA5) "2DZto`QD8,"  -B\zteVH:/$(>]{m^QC7+$<[('&')08CP\dmt{ %$##%+3>KV_hov| "  %-9FQZbipv} )4@KT\djpw} $/:DNV^dkqw} )3>GPW_ekqw~  #-7AIRY`flsy   '1;DLT[bhnu}  +5>GOW^dkr{"  $ /9BKSZahpx}{y y x x $ $'&"*4 >"G#O#V$^$e%m%u%%$}#z"x usqppoo'!&031.*# &)%*0,:-C.K.S/Z/b/j~/r{/|y/v.t-q+o)m(j%i#h ggg)'09;:74002!4,566?7H~7P|8Xy8_w8gu8ps7zq7n6l5i3g1e/c-a*a(`&`$`$*+8ABA?<99;<)~=3{><y>Ev?Mt?Ur?]p?en>ml>wi=g<d;b:_7]5\3[0Z.Z,Z*Z*,1>GGGEB@A B{C%xD0uE9rEBpEJnERlEZiEbgDkeDubC`B]A[?X=W;V8U5T3T1T/T/.7DLLLKIFHyIuJ"qK-oK7lK@jLHhKPfKXcK`aJi^Js\IYHWFTDRBQ@P=O:O8N6N4N4/=JPPPPNLyNsOoPlQ*iQ4gQ=dQEbQM`QV]P^[PgYOqVN}SMQKNILGKDJBI?I<I:I8I82BOTTTTSzRsTmUiVfW'cW1aW:^WC\WKZVSXV\UUeSToPS{MRKPHOFLEIDGDDDAD?D=D<6HTXXXXXtXmZg[ c\`\$]].[]8Y]@V]IT\QR[ZO[cMZmJYyGXDVBT@Q?O?L?I?F?C?B?A=MY\\\\}\o^g`aa\bYb!Vc+Tc5Rc=PbFNbNKaWIaaF`kD_wA]>\)H(S&~_$}m"|} {xvrnjgdbbdrutsrvsku_yR}H<0& #"# -7AMZhx|wtpnlkn{{yx}xryf}ZNC8,  $.9 E Raq~zxwvy~{nbVJ>3($/;HWh{wk_RG;0$ $/<K]pth\OD8,!  !-<NczsfYJ=1%+;Pg҄Ϩ|l]NA4) );RnqbRD7+  %;Utyj[M@2&  9X|&###'-6BMW`hpv}#!"'0=HR[cjqw}!+7BLU]dkqw}&1<ENW^dkpv}  !+5?GPW^ejpv}  %/8AJQX_ekpw~  )2;DKSY_ekry #-6>FMT[agnu} &09AIPW]cjrz~|{{{    *4 < D L SZahpy|y w u srqqp "  %/8@HOV]e~m|vywtromkihhg g %*,+(% "+$4%<&D}&L{'Sy'Zw'bu'js'sp'~n'l&i%g#e!ca``__ .3431.*(*,'|-0z.9w/Au/Is0Pq0Xo0_m0hk0qi0|f/d.a-_+])['Z$Y"YYX )69:98531 }3x4#u5-r66p6>n7Fl7Mj7Uh7]f7ed7ob7z_6]5Z4X2V0T-S+S(R%R$R#!0<>??>;9{9v:r; o<*l=3j=;g=Ce>Kd>Sb>[_>c]=m[=xY<V;T9R7P5N3M0M-M+M)M(%6ACDDC@{>u?p@lAiB'fC0dC9aDA_DI^DP\DYZCaWCkUBvSAP@N?K<I:H8H5H2G0G.H-*;EGHHG~FvDoEjF fGcH$`I.^I6\I>ZIFXINVIVTI_QHiOHtMGJEHDEAD?C<C9B7B4B2B11AIKLLKzKpJjKdM `N]N"ZN+XO4VO<TODROLPOTNN]LNgIMrGLDKBI@G>D>A=>=;>9>7>66FMOOOOvOkOdQ^SZSWTTT(RT1PT9NTALTJJTRHT[FSeCRqAQ~>P`D<`M;`V9_a6^m4]z2\0Z.X-U-Q,N-K-H-F-EJXZ[[[u[k\__WaNdEg@g=g;g&9g/8g76g@4gI3fS1f^/ej-dx+c)a'_&\&X&U&Q&O&M'LR__`_|_q_ha\dSfJi@l7o 4o2o!0o*.o3-n<+nE)nO(mZ&mg$lu"j ifc`\XVTRZddddxdndeeYiOlFo;r0v)x'w%w$#w-"w6 w@vJvVuctrsqnkgda^\[djjihuhliakVoKrAv7y,} &09DP~^ }m |zwtp l i g e dmpon}mrmio]rRvFz<~2''2<IWfx~zwspnmxwutzspsewY{NB7-" (3@N^o|zy~|zzzm}aUI>3( )5BSf{vi]QF:/$ (5EXntg[OC8-!  %5H_yĘsfZK>1%"3Ie~n^O@4( 3LjvgXI;.! 4Pq"  #*4>IS\ckqx~#.9CLU]dkqw}(3=FNW^ekqw} #-6?HPX_ekpv} '09BJQX_djpv}  !+3<DKRY^djpw%.6>FMSY_ekqy  (19@GNTZ`fmu~~~ "+4;CIPV\biq{|ywvttss   &/7>ELRY`g}o{ yx vsqomkjiii   *2:A}H{OyVw]uesmqwnljgeca ` ``` $&%# %|.y6v>tErLp Sn Zl bj kh uf ca^\[YXXXX )+--*(%" {#w$!s%+q&3n';l(Bj(Ih(Pf)Xe)`b)i`)s^)\(Y'W%U"S!RQQQQ(/2331/|-x+s+o,l-'j.0g/8e/?c0Fa0M_0U^0]\0fY0qW0}U/R.P,N)M'L%K"K KK/47887}4w3q2m2i3f4$c5-a65_6<]6D[6KY6SW6[U6eS6oQ6{O5L4J2H/F-F*E(E%E#E!$59;<<;x9q7l8g9 c:`;"];*[<2Y<:Wl<f>a?]@Z@WA(UA0SA8QA?OBGMBOLAWJAaGAlE@xC?A>?<=9<7;4;1<.<,<+1=ACCDxCpBgBaC[EWETFQF%OG-MG5KG=IGDHGMFGUDG_BFj@Ew=D;C9A7>7;786673717/6BEFGGuGlGaG[IVJQK NLKL"IL+GL3EM:CLBBLJ@LS>L]R7=R?;RH9RQ8R[6Qf4Ps2O/N-L,I+F,B,?,<-:-9BJMNNxNnOdOZRSSKUDX?X=Y;Y$9Y,7Y46X<4XE2XN1XX/Wd-Vq+U)T'R%O%L%H&E&B&@'>IOQRRtRjSaTWVPXGZ?]7_ 4_2` 1_(/_0._9,_A*_K)^U'^a%]o#\~!ZXUROK H F DQTVV|VqVgW^XTZL]C_:b1f+g)g'g#&g,$g4"f=!fGfRe^dkc|a_\YUROMKYZ[[x[mZd[[\Q`Hb?e6h,k!o ooo&o/o8nBnMmZlhkx i g d a ] Z WUS_``_t_j_b_XbMfDh;k1o'rux y x x( x2w<wGvTubtrrpmifc_]\ffe}dqdhd_eThIl?p6s,v"z} !+5@M\~l}zwspljgfmlkyjoigi[mPqEu:y1|' ",8ETey{xtsqtrqwooocrWwL{@6,!  #.:J\p}{ywxvly_~SG<1'".=Od}vi\PD9.# !/@Umtg[NB8-" /C\y؜th\L>1%  -EdsdTE7).Hj '1:CLU]elrx~!)3=FOW_flrx~$-7@IQX_fkqw~  (1:CKRY_ejpw~ #,4=DLRX^djpw &/7?FLRX^dipx!)19@GMSX^djrz$,4;BHNSY_fmv}{yyxwv '/6=CIOU[b~i|rz}xvsqpnmlll !*28?~E|KzQxXv_tgrppzmkigecbbaa %|-y 4v ;t Bs Hq Oo Vm]kfiofzda _ ] [ZYXXX ~ zv s)p1n8l>jEhLfSd[bc`m]x[YVTRQQP P P "%''%}#x urnk%h-f 5d ;b!B`!I^"P\"XZ"aX"jV"vT!Q OMKJJIII#(+,,~+w)r'n%j$ g%d&"a'*_(2](9[(?Y)FW)NU)VS)_Q)hO)tM(J'H&F#D!DCCCC)-011y0r.m-h+d, `,]-[.'X./V/6T/=S/DQ/KO/TM/]K/gI/rF.D-B,@)>'>$>">>>$-145~5u5n3h1b1^2Z2W3T4%R4,P54N5;M5BK5II5RG5[E5eC4q@4>3<1:/9,9)9'9$9"9 +1589z9q8j8c5]7X8T8Q9O9"L:*J:1H:8G:?E:GC:PA:Y?:c=9o;9}987654414.4+4)4&5%059;<w<n<f<]:X<S=N> K>H?F?'D?/C?6A@=?@E=?Mn5>|3<1;08.6/3/0/-0+0)59=>?t@j?b@X@RAMBHCEDBD@E$>E,=E3;E;9EC8EK6EU4D`2Dl0Cz.A,@*=):)8*5*2+/+.9>@B|CpCgC_CTENFHHBI>JBDFxFmFdG[GQJKKDL=O7P 4Q2Q0Q&/Q.-Q5,Q=*QF(PP&P[%Oh#Nw!MKHEB?< 9 8CFIItJiJ`JXKNNHOAQ9S0W,X*X(X"&X*%X2#X:"WC WMVYVeUtSQOLHEB@>IKM~NqNfN]NUOLQES=V5Y,\#_ ___%_-_6_?^I^U]c\rZ X V S OLIGENQRyRmRcRZRRSIVAY9[0^'behhg g(g1 g: fE fPe^dmb`^[WTPNMUVWuWiV`VXVPXE\=_4b+e"hk oppp"o+o4o?nJmXlhkyifc`\YWU\\\q[g[^[V[K_Ac8f/i&mpsvx xyy$y.y8xDwRvbussqnjfca_bbzan`e`]`RcGg}3)  (5FZqw~uvtkv^{QF:/%(8Le}uh\OC8-"  );Sn̒ȿth[OB8-" *@[{wl`PA1$ )De%,4=GPX_fmsy%.8AJRY`flry   )2;DLSZ`ekrx $-5>FMSY_djqw '08?FMSX^cipx"*29@GMRX]cjqy %-4:AGMRX]dks~~|{z (/6<BHMSX_fn}x{ywusrqppo "*17=C}I{NyTx[vbtjqtomkihffeee ~%{,y3v9t?sEqKoQmXk_iggqe}ca_]\[ZZZ  ~{yu r(p/m5l;jAhHfNdUb]`f^p\}YWUTRRQQQyus q m j $h+f2d8b?`E^L\SZ\XeVpS|QNLJ I IIII  !!x rnki eb `(^/\5Z<XBVITQRYPcNmKzIGDCBBB B B !%&{'s&m$h"d a^[Y %V!,T!3S"9Q"@O"GM"NK#WI#aG"lD"yB!@ ><<<<<<!')+w+n+h)c'^&[%X%U&R'"P')N(0L(6J(=H)DG)LE)UC)_@(j>(w<':&8$6!66677 &+-~/s/j/d.^,Y+U+Q, N,L-J-&H.-F.4D.;B.BA.J?.S=.];.h9-u6,4+2)1&1$1!122%*/1{2o2g2`2Z1T0O1L1 H2F2D3$B3+@32>39=4@;4H94Q73[53g32t11/0-.++,),&-#-!.).24w5l5d6\5V5O5J6F7B7@8>8!<8):9099679>59F49O28Y08e.7s+6)5(3&0&-'*(((%)#-257t8i9`9Y9R9I:D;@<<= :=8>6>&4>-3>41></>D.>M,=X*=c(m?c?Z?R@JACC=D7F0H,J*J(J &J'%J.#J6"J? IHISH_GmF~DB?<9642;?AvBjB_BWCOCGEAF:H3J,M$P !Q QQ#P+P3P;PEOPO]NkM|K I F B?<:8@CErFfF\FTFLGEH>J7L/O(RVXXXX'X/X8 WA WL VYUgTwRPMIFC@?FH|InJbJYJQJJJBM:O3R+U#X[_ ```"_*_3_<^H]T\c[sZWUQNKHFLMwNjN_NVNONHO>R6U.Y&\_b eg hhh$g-g7gBfOe]dnb`]ZWSQORSrSfS\RURNRDV:Y1])`!cfiln oppq'q1q<pHoWnil|kge`]ZYY|YnXcX[WTVJZ?^5b,e$iloruwx yz{ |)}4|A|Pzbyvvtpmhfd_w_k^b][\P_Ec:h0l'psv y| !,9HZo~{xtpfseiccbXeLiAn6t+x!|  #/>Qg}mrkkialTqHv<|1& "1CZu|ttrkt^yQE9.# #4Kg|v}i]QD7,! $8Rrvk_TG;-"&>] (09BKS[agmsz !*3<EMU[aglry  %.7?GNU[`fkqx  )19@HNTZ_djpx#+3:AGMSX^djqz &-4;AGMRW]cjr~ (/5<AGLRW]dlw~{yxvvuts #*06<AGL}R{Xy_wguqr}pnlkjiihh~%|,z2x8v=tBsHqNoTm[kcimfxdba_^]]^^| xvt!q'o.n4l9j>hDfJdPcWa`_i]u[YWUTTTTT { v sp nki#g*d0b6a;_A^G\NZUX^VgTsQOMLKJJJJ {snjh gda_&],[ 2Y 8W >V ET LR TP ]N gK sI F D CBBABBumhc`_]ZX"U)S/R6P<NBLJJRH[FfCrA?<;: : :;; {!p!h!b ^ZXUSPN&L-J3H9G@EGCPAY?d<p:8643445 5 !$v%l&d%]%Y#U!RO L J G!#E!*D"0B"7@">?"E="M;"W9"b6"n4!}2 0...//0 %'s)h)`)Y)T'P%L%I%F&C&A'!?''>'.<(5:(;9(C7(K5(U3(`1'm.'|,%*$)!()**+$(}+o,e,],V,P+K*G*C+@+=,;,:-%8-,6-25-93-A1-J/-S--_+,k),{'*%(#&##$!%&&"(+y.l/b/Y/R/M/F/A/=0:1 715242#22)120/27-2?,2H*2R(2]&1j#0y!/ -+(% "! "&+/v1i2_2V2O2I2B3<4854617/7.7 ,7'*7.)75'7=&7E$7P"7[ 6h5x42/-*'$"*/2r4f5\5S5L5F6>7984:/;+< )='=%=$$=+"=2!=:=C4?.A'D GJ JJJ%I,I4I> IH HT GaFpEC@=:74 29<u=g>[?R?J?D?>?7A1D*F#ILP Q Q Q!P(P0P9ODOPN]MlLIGD@=;8>@pBcBXBOBHBBB;C3F-I&LOR UX XXX$X,W5W?VKVYUhS{ROLHEB@D|ElF_FUFMFFE@F8I0L(O!RVY\^ __``'`0`:_F_T^d\vZYUQNJIJuKgK[KRJKIFI^C\J[QYYWbUmSzQOMLKKKM w pkhe ca_]%[*Z0X5W:U@SGRNPVN_LjIwGEDCBBCC zphc_ ]\ ZXV!T'R-P2O8M=KDILHTE^CiAv?=<:::;; tjb]YVU T Q O M $K *I 0G 6F <DCBK@T>^<j9w7 5 4 33334 }oe]XSPNL JHF!D'B-@3?9=A;I9R7\5h2v0.,+ , ,-.xk a!Y S NKHFCA?=$<*:1877>5F3P1Z/g,u*(&%&'( ( u"h#^$V$O#J#F!C@= ; 9 7!"6!(4!.2"51"</"D-"N+"Y)!e'!s% #!  "#$#q%d&Z'R'L&G&B%>$;%8%5&3&1&0&&.',-'3+':)'B''L%'W#'d!&r%#!"}&n(a)W*O*I)C)>)9)5*2*/+-+,,*,#(,*',1%,8#,@",J ,U+b+p)(&#  %z)k+^,T,L,F,@,;,4.0/-/*0 '1%1$1!"1'!1.161>1H1T0`/o.-*'%"$)v,g.[/Q/I/C/=/8011-2)4$5 6677%7,746<6F6R5_5m 3~ 2 0- * '$"(,r/d1X2N2G2@2;253/4+5&7 :< <<<"<)<1<: 48536-7(9";>A C C C B&B-B6B?AKAX@f>w=;952/-2z5j6\8Q8H8A7;76819*;$>@CFI JII"I*I2H;HGGTFbEsDB?;8637u9e;X;N;F;?:::5;->'@ CFI LO PPQQ%Q.P7PBOON^MpKJFD@<;<o>`?U?K?C>>=9=1@)D#FJM PSUV WXY!Y)Y2Y=XJXZVlURQMJEB{BjC\DQCIBBA>@5C-G%KNQ UW[]^ `abc#d-c8cEbUaf_}]ZVSPMtHdHXHOGHFCE:H1K(P SWZ^`dfgi jkmn&o1o>nNmakwifd_\YmN`NUMNLIJ?L5Q,U"Z^aehjnqrtv wy{~)6~F|YzoxtqliehT]TUROPFR;W0\&afimqtwz}!-=Qgxte[\YWWNYA^6d+i ot w{ $3G^zda__W`Jf=l1s&x~ (;SphgagTmHs2& 1Nq  (09AIQX^djpv~  "+3<CJQW]ciov~ &.6=DJPU[agnv (07=DIOTY_fnw ")07=CHMRX^foy|zz $*17<AGLQW^gq}}zwtsponn%+17<}A{FzKxQvXt`rjpumkigedcbc{ xwu t&s,r1q7o;m@lFjLiRgZedcoa}_\[YXXXYxsomkih"g'f-e2c7b<`A^G]N[UY_WjUwSQONMMNO~tmiec a_^]#[)Z.X3W8U=TCRJPRO[MfKrIGEDCCDEvkd`]ZX WUS R%Q*O/N4L:K@IFGOFXDbBp@><;;;;<| o e ] X U SQ ONLJ"I'G,F1D7C=AD?L>V<`9m7|6433334 vi_XRNL J I HEDB$@*?/=5<;:C8K6U4`2m0|.-,+,,- qd[SMIFDBA ? = < !:'9-745:3B1K/U-a+n)~' & %%%&& }m`WOIDA>=; 9754%2+01/8-@+I)S'_%m"}   !yi]SLE@=:7531/.",(*/)6'>%G#Q!]k{  uf Z!P!H!B!=!9 5 2/- + ) ( &!&%!-#!4!!< !E!P!\ jzq c#W#M$E$?$:$6#2#-$*$(%%%#&"& &$&+&2&:&C&N&Z%h$y# !   n#`%T&J&C&<&7&3&/')(%)"*+ +++"+(+0+8+A+L+Y *f )v '&#   |#k&\(Q)G)@):)5)0),*&+#,.0 0111&1-15 0> 0I0U/c.r-+(%""x'g)Y+N+D,=+7+2+.,),%. /146 6 6 6#6*626;5E5R4`3p21.*'%"&s*c-U.J.B.;.5.0.,.'/"1368< <<< <'AK@Y?j>}<;751.{0i3Z4N5D4<47323.3'5!8;=@CFG HIJJ'J0J:IFIUHeFzDB>;86u5d7V8J8A8:76625+8#;>AD GJMN OQRS"S+S6SARPQaOvMJIDB>n;^<Q<G<?;::69.;'>BEI LORUWX Y[\^&^0]<]K\\ZpXVRPKIh@YANAE@>>;=3?*C"GKO RUX[^`ac dfh j*j6iEhWfkda^\VTbFUFKEDD@B8D.H%MQU Y]_cfiklnp rtw#y/x=wOuds~plig`\LRKKJFG>I3N)SY] aeiloruwy{~ &5G\v~yvpYRRPMNEP9U.[#`f joswz}+=SmYXUUMVA\4c)iou{~!2Hc]]V^Jc?j3p'w~ '=XyaeUkJq@x4),Hi  $-5=ELSY^djqy'/7?FLRX]bhox!)18?EKQV\bhoy #+28>DJOUZ`gpz~}| %+28>CHMSY`hrytqoo&,17<AFLRY}a{jyuvtqolhfed }|{ z&y,x1w7u<sAqFpLnSlZjdhnf~dba_\ZZZxtqomkj!j'i,i1g6e;d@bFaM_U]^[hYwWUTRQPPP|rlheb `_^^"](\-[1Y6W<VATHSOQYOcMqKJHFEEFFqhb^[XV UTSR#Q(P-N2M7K=JDHKGTE^ClA|?=<<;<>wi`ZURON LKJI H%G*E/D4B:A@?H>Q<[:h8w6543346oc Z S MJHFE CBA@">'=,<1:79=7E6N4Y2e0t.-,+,,.zj ^UMHD A ??=<:97$6)5.342;0C/L-W+c)r'&%%%%%u fZPIC>;98 8 6531!0'/ ,- 3, :* B( L& W$ c" r   qbVLE?:74321 /-,*%)+'2%9#B!LXet   m^SIA;730.,* )'&$##)!07@JVds {i[OF>840-*'%# !  '.5>IUbr       wfXLC<61-)&"      % , 4!< G R _ntcU I!@!9!3!.!* ' #!"#$%%%%"&) %1 %9%C%O$\$k"}!p_!R"F#=#6#1#,#(#%#!#%&(* * ** *&*.*6*@*L)Y)h(z&$!l!\$O%C&;&4&/%*%&%#%&()+ . 0000#0+03/=/H/V.e-x+)&$ z!h%X'K(@(8(2(-(('%'"'*+- 034556 6(505:5E4S4c2v1/-)&$u%c)T*G+=+6+0*+*')$)+.02 589 :;<<$<-<6? @BCE D)D2D>CKB\Ao?=:942i/Y1K2@28120./+.$0369 ;>ADFH IKMN$N.M9LGKWJkHFCA<:c4S5G6=56413.1(3 7:= @CFIMOPR TVXY)Y4XBWRVfT~QNKIC\:N:C:;96735,7#;?C FIMPSVXZ\^ `ce#f/e<dLba`x]ZVTQV?J?A>;<7:0<'?DI MQTX[^adfhjl oru't5sEqYoqmiea]REHDAB=?6A+F!KP UY^adgjnpruwz|  -=QjzvqlOJHHDF=G1L&RX^cgkoruy|~ $5Ia}OPKMDM8S,Z `g mrv{ *>WuSTMTAZ6a*gnu|3Lj‘W\LaAg6n+u|(A`ڻ  (08?GNU[`fls{ "+2:AHNSY^eks} $,3:@GLRW]ckt}| &-39?EJPU\ckv{urq  '-38>CHNT[cmy~{ytnigf !'-27<}A{FyMwTu\seqqomkhea^]\|ytsrqp!o'o,o1m6l;j@iFgMeUc_ai_w][YXURRR|snife cbba"a'a,_1]6\;Z@XGWOUXScRpPNLKIHHH|pga]ZXW VUTS"S'R,P1O6M<LBJIHSG^EjDzBA?>>>?rf]WSPNL JIIHH#G(F,D2C7A>@E>N=Y;e:t8764467zk_VOJGECA A@?? >$<);.:48:7A6J4U3a1o/.,,,-/sdYOHC?=;:9 8776!5&3+2017/>.G-Q+^)m(&%$%%'n`S J C = 9 6543 210/.#,(+.*4);'E&O$["j!{!|i [ OE>94 1 / . -, +*)'!&&%,$2":!CMZhzwe WKB:50-*)( ' & $# "  $ * 1 9 B N Z hys bTH?72-*'$#"  #*1:DO\ j z   o^QE<5/*'#!!(/8 A LXfw  k[MB92,($!  % , 4=HUdt |hXJ?60*%" " ) 1 : ERas wdUG<4-(#  !#$$$ $'$/$8$B$O#_#p!s`QD : 1 + & "! #%' ()**$*,*5*@)M)\(n&%"n\M!A"7#/#)"$" !  !#% '*, -/00!0)020=/J/Y-l,*'&!i X#I$=%4%,%'$#$ #"#%( *,/13 4677&7/696F5V4i31/,*&c%S'E(:(1(+'&'"% $&(+ -/2579 ;=??"?+?6>C=R@B DGII'H2H?GNE`CxB?<97W.H/=/4/-.),'*!,/2 58;>ADFIKM PRU"T-T9SIQ[OsMIFB@Q3D4:322-0+.$037 ;>ADHKNQSUXZ ]`b'a4`C^V\lYWSPJK8@88725/3)4 8<AEILPSWZ]_bdgjmq r-q<oOmeifb^XG>>=8;58.9$=CHMRUZ]adgjloqtx{&5G]|zxsohDC>A;>5>)DJPV[`dhkorux{~-?Vr{EHAECHNU]g}t{xusleb`_}{zzy"x'w,w2v7t<rApGoNmVk_ikfzedb_YVUTxqnkj hgff"f'f,e1d5b:a@_G]P[YYdXqUTRRMKKJ}qhc_]ZY XXWW"W'V,U0S5R;PAOIMSK]JjH|GEDBA@@qe]VSOMLK KKJJ"J'H,G1F6D<CCAL@X>d<u;:98778vg\SMGECA@ @@?>=#<(;,92887?6G5S4_3o10/...0n`TKD?<:876 55543$2)1.04/;-C,O+[*k)}(&&%'(yhYNE=8521/. . ---+ *%)+(1'8&@%K$W"g!y "tcTI?83/,*((' '&&%$"#(".!5 =HTcto_PD ; 4 / * ' $#"! !   %+3;ERask[L A 8 1 + & #    #)1:DP_ p  {gW I>5.(#          ! ( 0 9 D Q _ o wd TF;2+%!     '.7AN\m r ` PC8/(#   $+4?KZk o ]M@5-&!   ")2<IXj~ kYJ=3*$  '/:FUf}gUF:0("  ! #$$$$%-$7$D$S#e!{ bQB7-&  !#% (***"***4*A)P)b'x&#!]M?3 * # !$&)+- /111(111>1L0^/t,+'$#XH!;"0#(""!  "%'),/13 68::$:.::9H8[6p42/,)R#C%7&-&&%!$" !# &(+.1479<> ADE D*C6BDAW@l>;852L(>)3*+)%(!&#$' *-0369<?ADGJ MPP%P1O?MRKgIFC?;F-:.0-),%*#'(,/369=@CFILORUX\_ ^,]:[MYaW{SPKFA262.1*/',",159=ADHKORUX[^ae imp&n4lFj[gtb_[S<746/4-1'16;@EINRVY]`cehkorw {->S{lvrod:<5:27-7"<B HNTX\aeiloruy| %6Kdx;@8=4<(BIPX^dilquy}-B\|?D@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06='D8LLTaZu`d޾fڹgִhԭiѦjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћjћj' * 06<'D8KLSaYv]`aѻa̴bƭccѻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻdۻd' * 06<&C7KLRaWv[]^Ǽ_`aıa̩cԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩcԩc' * 06<&C7JKQaUwY\]^__`ǟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟbΟb' * 06<%C6IKOaTvX\]]^_`—bȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗbȗb& ) 06<$B5HJN`SuX[\]^_`bbbbbbbbbbbbbbbbb& ) 07<#B4GIL_SsWZ\]^_accccccccccccccccc&* 17EFTOaTlYt\z_~a{cwfrhrhrhrhrhrhrhrhrhrhrhrhrhrhrhrhrh$,550 71=ADONZTcYj\o_r{buwdxsfzpi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|pi|%.4*. 5/;7G={OAvUErZGp\Im^JkaKicMheNheNheNheNheNheNheNheNheNheNheNheNheNheNheNheNheN# &-!4(;.xC3sK6oQ9lV:jYe_?da?da?da?da?da?da?da?da?da?da?da?da?da?da?da?da?da?}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww}' ) .4:#C2LCUV^hfynu{⟀ߚۖՑwwwwwwwwwwwwwww~' ) .4:"C1KCTV\id{krvzܞ~ؙϑ~īwīwīwīwīwīwīwīwīwīwīwīwīwīwīw& ) .4:"B1JCSV[jb|hmqݨtڢw֝{˒}ɯ|yͧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}ǧ}& ) .4:!B0ICRVYj`}ei޴kۭnاpԡr̛xήvФ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|ʤ|& ( .4:!A0IBQVXk^beۺfشgԮjϪnɦsЮuҡz̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z̡z& ( .4: A/HBPVVk[_aӽ`ͶcǰehʺlаtӠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠyΠy&( .4: @/HAOVUlY\^Ⱦ__a³cɬfϤmҟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟxΟx&( .4:@.GANVSkX\]^^^_Ǡb͙hЕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕrΕr%( . 4:@-G@MURkW[\]]^_`ȏe̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l̋l%( . 4:@,F?LTQjV}Z\]]^_aeŃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃjǃj%' . 4:?+F=JTPiU{Y\\]^`be}i}i}i}i}i}i}i}i}i}i}i}i}i}i}i$' . 5:?)C=HSOgUyX[]^_ac|fxixixixixixixixixixixixixixixi$'/ 5;>(@=GRNeTuX[]_`b}dwgsjsjsjsjsjsjsjsjsjsjsjsjsjsjsj#(/ 6<;(>=DQMbSpW|[^`b}dwfsiokokokokokokokokokokokokokokok#(07 96)==GFPNVT|[Xw_[tb^qe_ngalicikdgmegmegmegmegmegmegmegmegmegmegmegmegmegmegme"*%!(.#5-<5D=MCzTGuZJr]Mo`OlbPjdQhfSfiTekUekUekUekUekUekUekUekUekUekUekUekUekUekUekU!#%+2&9-~@3wJ8rQ;nW=lZ?j]Ah_BfaCecCceDbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfEbfE  !'. 6%u<*nD-jL0gQ2dU3cX4bZ5a\5`^6_`7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7^a7v' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrv' ( ,29A,K;UK_[ijsv|𖄉쓌萓匘≝ކ}trrrrrrrrrrrrrw& ( ,28@+J;TK^\gkpyy闉哐⎕ߋօzqpppppppppppppx& ( +28@+I:SL\]enm|u}朄▊ߒێ̃wsttttttttttttty&( +28?*H:QLZ^cojry~ܕؑ€twxxxxxxxxxxxxxz&' + 28?*H:PLX_`qgntyޞ}ژӒy{|||||||||||||{%' + 28?)G9OLW_^rekoߩrۣv՟}ϛèà|%' + 28>)F9NLV_]schjܰn֫sЧyʣ¸ĥŜ}%' + 28>(E9MLU`[s`dݾgֹkѳpʮué{÷ƢƘ~%' + 28>(E8LKT`Yt^aeϽhȸl³qwõ~ơǕ~%& + 28='E8LKR_Xt[_bľehlpéwƟ~Ȓ$& + 28=&D7KJQ_VtZ]_bdgkžqƘzǎŒ$&+ 28=%D6JIP^UsY\]^`cfkčsƊˆ$&, 28=$C4IHN^TrX[\\]^bfn{$%, 28="C2GHM]SpWZ\]^_aeyjutuyuyuyuyuyuyuyuyuyuyuyuyuy#%, 3 8= @2DGK[RmW}Z\^_aczftjoqntntntntntntntntntntntntnt#%,3 9<<2CFJYQiVwY\_aczetholjqisisisisisisisisisisisisis"%-4 :8;2@EHVPeVqY{]`bzeugpjkmgrfsfsfsfsfsfsfsfsfsfsfsfsfs!&.672 92?BGQO^UiZq]xa}zcvfqhmkindsctctctctctctctctctctctctct &/5.1!80=?EKNVU_Zf^l{bpvdsrgvoixklzho|dr~cscscscscscscscscscscscscs'0.'/ 6-<9CDLMTTZZ{^^vbaredohfljhiligokcrmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsmcsm',&,3)93@;JCRHyXMt]Pq`RncTkeVihWgjYemZbp[bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\bq\$ #)0$7,=2}G8wO&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysoooooooooooop' {( + 07>&I3TA_Oj\ugpw}󇚁쁦|ysooooooooooooq&}( * 06>&H3SB]Ph^rj|t|􎏂쇝鄣恨yqmmmmmmmmmmmmr&~' * 06=%G3QB[Qe`omxy𒊊돒狙䇟~unqqqqqqqqqqqqs&' * /6<%F2OBYRcblqt}}옆甎䏔مzqrttttttttttttu%& ) /6<$E2NBWSadisqy鞁嘈܍͂wrvxxxxxxxxxxxxu%& ) /5<#D2MBVS^efunu|✂ޕؒȈ~wz||||||||||||v%& ) /5;#D1LBTT\fdwkrwߡ}؝љĐ|~w%& ) /5;"C1KAST[fbxhms٨zТʞx$&) /5;"C0JARTYg`yejܶpҮvʧ}ãy$%) /5;!B0IAQTXg^zbhֽn̴sĭyy$%) /5; B/I@PSVg[{aglƻpv|z$%) /5; A.H?OSUgY{_dhmrx{#%) / 5;A-G>NRSgXz]aehmrw}#$) 0 6;@+G=LQReWxZ^adglqx~~~~~~~~~~~~~#$)0 6;@)F;JPQdVvY\]`cfkq{zyyyyyyyyyyyyy"$)0 6;@'B;HOPbUsX[]^`b{fvkqsnpppppppppppp"#*1 7<<'@;FNO`ToX}[^`b{dugpkkqgyffffffffffff!#*18 :7(>:DLM\SjXv[^a|dvgpilmgqcxa~a~a~a~a~a~a~a~a~a~a~a~ #+28 46(=9BILWScXn\v_}~bwerhnkinds`x^}^}^}^}^}^}^}^}^}^}^}^}#,43 -5(;7AEJQR[Xd\k`pycusfxoi{kl}hods_w]{]{]{]{]{]{]{]{]{]{]{]{$,1& ,3'93??HIQRWY\_yactdfpgimjkjlmgoocrq`ws]zt]zt]zt]zt]zt]zt]zt]zt]zt]zt]zt]zt$+'#*1$7/=8FAOGVMx\Qt`UpcWlfZji[gk]en^bq`_ua]xb]xb]xb]xb]xb]xb]xb]xb]xb]xb]xb]xb"$!'- 4);1B7|L.rG2nO5jU7gY9e];d__f>]i?\l@ZoAZoAZoAZoAZoAZoAZoAZoAZoAZoAZoAZoA  &-y4!q:%jB(fH*cN,aS-_V.]Z/\\0\^0Z`1Yb2Xe2Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3Wg3  "y)q0j6d<aB!^F"\J#ZN$YP$XS%WU%VW&TY&S\'R^'R^'R^'R^'R^'R^'R^'R^'R^'R^'R^'R^'i't( ~* .5'F6MHU[[nbiѼpDzu|v#$&- 39>&E5LGSZYn`~gmrxw##&- 39>%E4KFRZWm^~ekpu|x"#'- 39>$D3JDPXVl\|bglrx~~~~~~~~~~~y"#'- 39="C0HCNWUjZ{^chlrxxwwwwwwwwwww{!"'.4 9>B/FCMVShXy[_cglq~xyurqqqqqqqqqqq}!"'.4 9==/DBKTReWuZ\_cgxksqnxk‚iÒkġkġkġkġkġkġkġkġkġkġkġ !'.5 :9cInTy]djos{vxyu{r}n~ih}iyiyiyiyiyiyiyiyiyiyh%t%~' + 28@&K2V?`KkWvaiqv{~{wrmjlm}m}m}m}m}m}m}m}m}m}i%u%' + 18?%J2T?^LiYsd}nv}쁥}yrlmoppppppppppk$w%& + 17>%H1R?\Nf[phzs|쌍臖䂟~{upqsttttttttttl$x$& + 17>$G1P?ZNd]mkvw叇ۈօςzuuwxxxxxxxxxxm$y$%+ 17=#F0O?XOb_jnr|zޕؒю̋ljzy{||||||||||n#{#%+ 17<"E0N?VO_`gpnޢw֝ϘɔÑ}o#|#%+ 16TO]adrlשtΣ}Ǟp#}#$+ 16SO[abr۸jЯrȨyq""$+ 16<B-J=QNYa`qhʶov~r""$+ 1 6;B+I;PMW`_qf~Ľls{s""$+1 6;A*H:NLU_]pd}jqw~u!!$+1 6;@'G7LJS^[na|hnt{{zzzzzzzzzzzv!!$+1 7;@%D6KIR\Ym_zekrxƀÉ}usssssssssssx  $+27<=#B5HHPZWk\xaflry}ɁwnjsǗn¡lllllllllll{%,28 :8$@5FGOXUgYu]bg~lwrqylʂhʍeʙeɩeeeeeeeeee~%,3848$?5DEMTTbYn\y`|ctgmmgsc{_΄]Ϗ\Р]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ]ӯ%,33 .7$=3BBKOS[Yf]oavwe|pijmdr_x[׀W։T֖T٢T٢T٢T٢T٢T٢T٢T٢T٢T٢%,1% .5$;1A>IIRSX\^czbisfnmjrhnvcsy_x{[~}W~SPPPPPPPPPP$*&# ,3#9.?9GBPJXQ{]Wub\og`jkcfofbsh_xj[}lWnToQpQpQpQpQpQpQpQpQpQp"## *0 6*=2E:NAzVFt\JoaNkeQgiTdmVaqX^uZ[z[X]U^R_R_R_R_R_R_R_R_R_R_  &,3$:+~A1wK6qS:mY>i^@fbCcfEajF^nH\qIYuJWzLTMRNRNRNRNRNRNRNRNRNRN  "(/~6$t=(mE,iN/eT1cY3a]5_a7]d8[h9Yl:Wp;TtP~>P~>P~>P~>P~>P~>P~>P~>P~>  $}+t2l9 g@#cF%`L']Q([U)YY*W]+Ua,Td-Sg-Qk.Op/Mt0Mt0Mt0Mt0Mt0Mt0Mt0Mt0Mt0Mt0ۼ   } t'l.f4a9]?ZDXHVLTP SS QV!PY"N\"M`#Kd#Ig$Ig$Ig$Ig$Ig$Ig$Ig$Ig$Ig$Ig$} s k"e)_.[3W8U<S@QCPFNIMLLNKQITHWFZFZFZFZFZFZFZFZFZFZ[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T[(e(m* s-x2z:~C!|Q)y^1vk8rw>pBnFmIlKjMiNgOePcQaR`S_S]T\T\T\T\T\T\T\T\T\T](g'o) v, z2}9B!O*}\2zi:uu@sEqIpMnOmQlSjTgUeVcWbX`Y^Y]Y]Y]Y]Y]Y]Y]Y]Y]Y_'i'r( y+ ~18@!M*Y4f<{rDx~JvOtSsVqXpZm\j^h_f`daba_b```````````````````&k&t' |* 07?!K+W5c>oG}{NzTxYw\u`sbpdmfkghiejcjcgcececececececececeb%m%v' * 07>!I+U6`@lJwRY|^zcxgujrlpnmpiqfreqflgigigigigigigigigid%o%y& ) 06= H+S6^BiLtV^d}jznwrturwnyj{gzhvipjmjmjmjmjmjmjmjmjme$p${%) /6< F+Q7\CfOqY|ckq}wy{urokj€lzmumqmqmqmqmqmqmqmqmqf$r#}%) /5<E*O7ZDdQn]xh튂q鄌y~{yxvpnpqyquququququququququh#t#$( /5;C)M7WEaSk`tl}wሆ܅ւр~|vstu}uyuyuyuyuyuyuyuyuyi#u"$( / 4:B)L6UE_ThcpqߖyzّҌ̉ȆÄ|wyy€y|y|y|y|y|y|y|y|y|j"w"#( . 4:A(J5SE]Ueenr؝w{Зɓď|}}~~~~~~~~~~~~~~~~~~l"x"#(. 4:@&I5QDZUceګkrФt{ɝ|™m"z!"(. 49?%G3ODXU޻aeӲiqʪq{£yn!{!"(. 49>$F2NBVT_d͹gqİn{v~o!| "(. 49>"E0L@TS]cepl{szp ~ "(. 4 9> D-J?RR[bcoizpw~~}}}}}}}}}r "(/4 9=C*H=PPYa`ngymt|{vvvvvvvvvvvt"(/4 9=>)G;ONW_^lewkqy~ysooooooooooov")/59 9=)E:MLU\\jbuh~ov{̉uʕpȡlŬgghhhhhhhhhx")/56 4<)C9KJSYYg_rezj~qwypՃkӎgҚcҧ`̱``````````|")/4, 3;)A8IGQTXa\l`u{f|sklrfza؄]؏ZלWةXջX̾X̾X̾X̾X̾X̾X̾X̾X̾").,)29(?6FBONWY]b}ajufpmjvgozav~[}V߆SޑPޝP஀Q~Q~Q~Q~Q~Q~Q~Q~Q~!&)(07'=2D=NGVP\Wwb]qgbklgeqj`vn[}pWrStPtMuKtKtKtKtKtKtKtKtKt"'.4$;.A7K?TFx[KqaPlfTgjXco[_u][{_WaTcQdMeKeKeKeKeKeKeKeKeKe$+1 8(>/|H6vQ;pY?l^CgcFdhI`mK]rMZwOV~PTRQSNTLULULULULULULULULU !'-4"{;(qC,lM0hU3e[6b_8_d:]hWr?Tx@R}BOCMDKDKDKDKDKDKDKDKDKD  "){0r7 j>#fF&bM(_S*\Y,Y^-Xb/Vf0Sk1Qp2Ou3Mz4J5I5I5I5I5I5I5I5I5I5   z%q,j2d9`?\EYK WO!UT"SX#Q\$Oa%Me&Ki&In'Gt(Ex(Ex(Ex(Ex(Ex(Ex(Ex(Ex(Ex(ջ y p i'c-]3Z8W=TBRFPJNMMQKUIXG\F`CeBhBhBhBhBhBhBhBhBhyph b" \' W,T1Q5O9M=K@JCHFGIFLDOCRAV?Y?Y?Y?Y?Y?Y?Y?Y?YU)^(e* j- m2n:oCoQ#l`)ik.ex2c5b8`:_;^=]>\>\?Z@W@VAVAUATASASASASASASASASAU)^(e* j- m2n:oCoQ#l`)ik.ex2c5b8`:_;^=]>\>\?Z@W@VAVAUATASASASASASASASASAU)^(e* j- m2n:oCoQ#l`)ik.ex2c5b8`:_;^=]>\>\?Z@W@VAVAUATASASASASASASASASAV(_(g) l, p1q9rBsO#p^*lj/iv4f8d;c=b?a@`A_B^C\DZDYEXEWEUFUFUFUFUFUFUFUFUFX'a'i( o+ t0v8w@xL$v[+rg2ns7k!H.R;\JfXodڑymҌs͇xȄ{Á~}}wv|vvwpvmvmvmvmvmvmvmvmg!s !&, 27= G-P;ZJcYڟmdјumʒ~tĎy}}{€{y{s{p{p{p{p{p{p{p{ph!u !&, 27=E+N:WJݬaXӥjdʞrnØ{u{|ussssssssj v &,1 7<C)L8UIִ_XͫhdĤpnxu{xuuuuuuuuk x&,1 6;B'J6SHк]WDzecmmuu}|zwwwwwwwwly&,1 6;A%H5QG[Vcckmruz||yyyyyyyyn{&,1 6;?!E3OEYUabhlouw|{zz}z{z{z{z{z{z{z{z{o}&,16 :>D1MDVS_`fkmtt{|}yssss|s|s|s|s|s|s|s|q&,16 9:C/LBTQ\^dijrqzyytplkkk}k}k}k}k}k}k}k}t&,1529B-J?ROZ\aghpowv}}wĉqlhdccd}d}d}d}d}d}d}d}v%+1//8@,H+E9NGUT\^cgzinrpslxxf|`~[ WੀU຀S~TyTwTwTwTwTwTwTwTw~#%"-5<*B6KBTL[Vza^rgeklkdro^zsXuTwPwNwMvMrMqMqMqMqMqMqMqMq# ,39'@1I;RD{ZKtaQmfWgl[br_]ycWfShOiLjIjHhHhHhHhHhHhHhHhHh ! )06#=,F4zP:sY@n_EidIdjM_pP[wRWUSWOXLYJZGZFZFZFZFZFZFZFZFZ &,3:&wA+pK1kU5g\8ca<`g>\mAXsCUzEQFNHKIIJFKEKEKEKEKEKEKEKEK ־ !(/x6n=#iF'dN*`U-]\/Za1Xg3Um4Rs6Oz7L8I9G:D;C;C;C;C;C;C;C;C; ٷ #w*o1g8b?^F [M"XS$UX%R^&Pd(Mi)Ko*Hv+F|+D,A-@-@-@-@-@-@-@-@-߱п  v n%g,`2\9X?UDRIPNNSLXI]GbEgBm @s!>{!=}!=}!=}!=}!=}!=}!=}!=}!Һ um f _& Z,V1R7P;M@KDIHHLFPDTBX?]=b;g:j:j:j:j:j:j:j:jul e^Y! T& P* M/ K3 I6 G:E=D@BD@G?K=N;R9V8X8X8X8X8X8X8X8XN)V)\*a- b2b:`C]R]`![l%Xx(V*T+S-R.Q.Q/P/O0O0M0J0J0I0I0H0H0H0H0H0H0H0H0N)V)\*a- b2b:`C]R]`![l%Xx(V*T+S-R.Q.Q/P/O0O0M0J0J0I0I0H0H0H0H0H0H0H0H0O)W(^*b- e2e9cBaP`_"^j&[w)Y,W.V/U0T1S2R2Q3Q3O3M3L4L4K4K3K3K3K3K3K3K3K3Q(Z'a(f+ h0i7h@gMe]#ch(`t,^/\1Z3Y4X5W6V7V8T8R9Q9P9P9O9O9O9O9O9O9O9O9O9S'\'c'i* l/ m6m?mJkZ$hf*eq.b~2`5^7]9\:[;ZU>T?T?S?R?S=S=S=S=S=S=S=S=U&^&f&l) p. r5r=sGqW%mc,jo1g{5d9c`?^A]B\CYDXEXEVFUFVDVAVAVAVAVAVAVAVAW&`%i%o( t- v4w<yEwS&ta-ol4lw9i=gAeDdFbHaI^K]L\M[MYNYLZIZFZFZFZFZFZFZFZFY%c$k$s' x, {3}:C}P'z]/vi7qt=nBlGiJgMePdRaS`U_V]W\U]R^N^K^K^K^K^K^K^K^K[$e#n#v%|+ 29AM(Z1}f9xqAt|HqMnRkViYf[d^b`aa``a[aWbTbPbPbPbPbPbPbPbP]#h"q"z%+ 18?K(W2b<mE{xMvTrZn_kciehfhfgfefebf]fYfTfTfTfTfTfTfTfT_"j!t!}$* 17>H(T3_>jHtR{}[watergpinkmkmkkkjgjbj^jYjXjXjXjXjXjXjXa"l v $* 0 6=F'Q3\?gKpW݃z^c{hykvmtosprpqpologobn\n\n\n\n\n\n\n\b!n y $*0 5;D&O2Y@cMۑmWӋw_͆eǂjm}pzrysxtwttqtksfr`r`r`r`r`r`r`r`d p{$*/ 5;B$M1W?ܞaMӘjW˒s`ō|fkoruv}w}wxuxoxiwcwcwcwcwcwcwcwce q}#)/ 4:A"J/߬T>ե_L̞hWĘp`ygmqtwyzz}y}r|lzezezezezezezezegs#)/49? H-ڳR=ϫ\KŤfWn`vg~mrvy{||{un~h~h~h~h~h~h~h~hhu#)/3 8>F,ӺP<ɱZKcVk`sh{nrwz|}~}wqjjjjjjjjjv#).3 7<C*N;÷XIaVi_qgxnsw{}y~s}l}l}l}l}l}l}l}lkx#).37 :A)L:VH_Tg_ngun~sx{~~z€w{wtvmvmvmvmvmvmvmvmmz#(.25 4?'J8TG\Sd]kfsm{sw{~~yur€o|ovooooooooooooooooo}"(-123>%H6RDZQb\idpkxqv|zv}qmjg|hvhphohohohohohohor"'+-'4<"F3OBXN_Ygbniuoz~tsxn{i}d~a~_{`v`o`o`o`o`o`o`o`ou!%''4=E/M>UK]Ud^lexskq|pk˅tfɑwaǞy\ĬzY½zWxWsXnXnXnXnXnXnXnXnx!( 2:B,K:SFZPbYwi`ppeiyjc߃n^ݏqY۝sUثtQսtOsPoQjQjQjQjQjQjQjQj} ' 08?*H5P@~XIv_RofXhm^bvb\fWhRjNkKkIjIgJdJdJdJdJdJdJdJd & .5<&D/N8wV?p^FieKdlP^sTX}XS[O]K^H_E_E]E[E[E[E[E[E[E[E[ؼ # +29"}@)uJ/oT5i\:db>`iB[pEVyHRJNLJNGOEPCPAOAOAOAOAOAOAOAO   '.~5t<"lE'gN+bW/_^2[e4Wl7St9O|;L=H>E?C@AA>A>A>A>A>A>A>A>Aһ  #~*u1l8f?aH"]O$YV&U](Rd*Ok+Lt-H|.E/B1@1=2;3;3;3;3;3;3;3;3Ե} t%l,e2_9Z@VGSMPSMYJ` Gg!Dn"Aw#>~$<%:%7&7&7&7&7&7&7&7&װ̽ |rj c% ],X2T8P>NCKHINFSDXA_>e;l9s6{33333333ι{q ib\ V% Q* N0 K5 I9F>DBBF@K>P;U9Z6`4e1m1m1m1m1m1m1m1mƾ|qha ZUPL#I(F, D0 B3 @7 >: <> ;B 9F 7J 4O 2S /Y /Y /Y /Y /Y /Y /Y /Y H*O*T+W. X3 V:TERRO_LlJxG F!D!C"B"B"A#@#@#@#>#<";";":":":":":":":":"I*P)U*Y- Z2 X9VDTQQ^OkLwJ!H"G#F#E$D$D$C$B$B$@$>$>$=$<$<$<$<$<$<$<$<$J)R(X)\, ]1 \8ZAXNU\SiQu!O#M%K&J&I'I'H(G(G(F(C(C(B(A(A(A(A(A(A(A(A(A(L(T'Z(^+ `/ `6^?[LY[Xg Ur#S&Q'P)N*N*M+L+K,K,H,G,G,F,E,E,F+F+F+F+F+F+F+N'V&]'b)d. e5c>`H^X]d"[p&X|)V+U,S.R/Q/P0P1N1L1K2K2J2J2J0K/K/K/K/K/K/K/P&Y%`&e(h, j4i<gEeUcb$`m(^y,[/Z1X2W4V5U6T7Q7P8P8O8N8O7O5P4P4P4P4P4P4P4S%\$c$i&m+ o2o:nClQ j_&gj+cv0a3_6]8\:ZU?T@S@SAT?TI'ޝT5ԗ^ȂhKŋqSyY^b~e|gziyjxjwiudt_sYrVrVrVrVrVrVrVcny!',1 6<G%إR4͝\AŗeKnSvZ_cfik~l}m}lzhxbw\vYvYvYvYvYvYvYdp| &,05;ݰD$ѪO3ǣZ@cKkSsZ|`dhkmnook}d{_z[z[z[z[z[z[z[fr~ &+04 9ظA"̰M2X?aJiSqZy`eilnpqqmga~]~]~]~]~]~]~]gt %*/2 5Ѿ?!ƶK0U>^IgRnZv`~eimpqrr|o{izcy_y_y_y_y_y_y_iv %*-0/=I/S<\HdQlYt`|ejmprzswstqtkses`s`s`s`s`s`s`kx$(++, ;G-Q;ZFbPiXq_yeim{pvsrtotlrlllflblblblblblblbm{"%%* 8D+O8WD_NgWn^vc~hylspnrjsgsdrdlefebebebebebebebp~ + 7B(L6UB]LeTl[}taw|fqjkmfpbq^q\p\k]f^b^b^b^b^b^b^bs - 6@$J2S>[HbP|jWuq]ozbiÃfcj^lZmVnTmTiUdVaVaVaVaVaVaVaw , 6> G.P9XC{`KsgRmoXgx\aԂ`\ҎdWϛfRͩgO˻hLgMdN`N]N]N]N]N]N]N]{ع * 3;D)M3zU7<7:797979797979797٫θ z$ q+i3b:]BYIUQRX N_"Jg#Gp%Cy&@'=(:)8*6*5*5*5*5*5*5*5*ܦѴǿyp h& a-[3W:SAOGLNITF[Bb?k;u8~530///////Ӱɻx ng_ Y% T+ O2 L7I=FBDHAN>T:[7c3k0t.}+)))))))˸vld ]WQM#I)F. C3 A7 ?< <@ :E 8K 4Q 1W .^+e)l'r'r'r'r'r'r'rýylc\U PKGD!A%?)=-;194785=2A0F-L *Q 'V &Z &Z &Z &Z &Z &Z &Z C+H*M+O.N3 M; JEGQD^@k=w;98765543330/..,,,,,,,D*J)O*Q-Q1 P9 MCKOH\DiAu?=<;:99887643311111111E)L(Q)T+U0 S7 QBONLZHgFsCA@?>==<<;987665555555G(N'T(W*X/ W5 U?SKPXMeJqH}FED C B!A!A!@!?!=!\AZCXDXDWEVEWCX?YeCcEbGaI_J^K]K]K\J^F^B^?_<_;_;_;_;_;_;X bks z&,2 9AM#}Z,xd5so=pyBmFjIhLgNeOdPcPbQbPcLcGdDc@c?c?c?c?c?c?[enw~%+1 7?J"V,݁a6|k>wuDt~IqMoOmRlSjTiUhUgUhQhLhHgDhChChChChChC]gqz%*0 5<G ݎS,ԉ^7̓h?~qFzzKwOuRsUrWpXoYnZmYmVmPlLlHkGkGkGkGkGkG^is}$).4 :EՖQ+͐\6Ŋe?nFvL~Q{TyWxYv[t\s]r]rZqTpPoKoJoJoJoJoJoJ`kv#(-2 8ڡBϜN*ƖY6c?kGsM{RVY}\{^z_y`x`v^uWtSrNrMrMrMrMrMrMbmx#(,05ԧ@ɡL)W5`?hGpMxRWZ]`a~b|b{ayZwUvPvOvOvOvOvOvOcoz"&*.۲0 έ>ĦJ(U4^>fFnMvS~W[^acddc~]~|W|zR|yQ|yQ|yQ|yQ|yQ|yQeq}!%()պ- ɳ;H'R3\=dFlMsS{X\_bdf|fyex_wYv~Tv~Sv~Sv~Sv~Sv~Sv~Sgs #$޺!* Ĺ9F%P2YI+R6Z?bGiNyqSsyXn]i`dc`d\eYdYaZ\[W[V[V[V[V[V[VqԶ /;F'O2X;`CxgJroPlwUfYa\\_XaTaQaQ^RZSVSUSUSUSUSUSUu خϻ "/ 9C#M-~U6w]>peEjmJduO_SYȊVUƗYPæ[M[J[IYJVKRLQLQLQLQLQLQz ҳ"- 7@~I'vR0o[7ic>cjC]sGX}KRۉNNٗQJ֦RFԷSDSCQDOELEKEKEKEKEKEK լ̹ * 3~;uE!nO(hW/b_5\g:Wo>RyAMDHFEGBH@H>G>E?D?C?C?C?C?C?C٧ϳſ' /u7l@fI!aS%\\)Wd-Sl0Nt3J6F8B9?:=;;::999999999999999ѮȺ# v+ n3f:`C[LWTS\"Ne$Jn&Gw(C*?+<-:-8-6-5-5-5-5-5-5-5-ԩ˶ vm& f- _4Z<UDQLNSJ[FcBl>v;7 5!3"1"0"/"/"/"/"/"/"إͲü~tld ^' W- S4 O;KBHHEOAV=^:g6q2|/,*(((((((ϯŹ~rj b[UP%K+H1 E7 B= ?B ,;0956:4@1F-M )T %\ "e l v y y y y y y vi^VOJ FB?<9"7&5*3.02.7+<(B$H!NT[]]]]]]>+C*F+G.G3D; AD >P:]6i2u0.,+*))((''%#"" @*E)H*J,I2G9 DC AN=[:g6t420/.--,,++(''%$$$$$$$A)G(K(L+L0J7 HA EMBY>e;q8~654322100/-,+*)))))))C(I'M'P)P.N5 L? JJGVCc@o={<:987766632100///////E&L%Q%T'U,T3 R< PHMTI`FlDxB@?>>=<<:987666666666H%O$U$X%Z)Z1 X9 VDSQP]MiKuIGFE D C!C!B!@!?!>!>!> >>>>>>>>K$R"X"]#`(a/ `7 \@YMVZTfRqP|!N#M$L%K&J'I'G(F(E(D(E'E&E$E#F"F"F"F"F"F"N"V \ a!f&g- g5 d=`H^V\cZn"Wx%U(T*R,Q-P.N/M0L1K1K0L.L,M*M(M'M'M'M'M'M'P!Y`fk%n,n3 l;iDgRd_!aj&^u*\.Z1X3V5U6T7S7R8Q8Q8R5S2S/T-T,T,T,T,T,T,S \djp$t*u1 t8rApNm[#if)fp/bz3`6_9]:\<[=Z>Y>X>W>X;Y8Z5[2Z0Z0Z0Z0Z0Z0U_gou#y){/ |6 {>yJuW$qb+ml2jv6h:e=d?cAaB`C_D^D]D]A_=`:_7_5_5_5_5_5_5Xajsz"~(.4 ;G~S$z^,uh3qr9nz=l@jCiEgFfHeIdIcIcGdBd>e;d8d8d8d8d8d8Zdmv~!',2 9ߋDՆP#́[-|e4xn:uv?rBpEoHmJlKjMiMhMhLiGiBh?hǓK"V,_4h;pAxE|IzLxOwQuRsSrTqSrNpIoEnAnAnAnAnAnA_ju"%(أ-˞<H!S+]4e;mAuF}JM~P|SzUxVwVvVvQtKsGrDrDrDrDrDrDalw !ߥ!Ѩ+ƣ:FQ*[3c;kArFzJNQTV}X|X}{X|zS{xNzwIyvFyvFyvFyvFyvFyvFcnyڮ̭(8DO)Y2a:iApFxKORUX|YxZvYuUt}Ps{KszGszGszGszGszGszGep|Ӵdz&5BM(V1_9f@nFuK~OS|VxXtZq[nZnWmQmMmImImImImImIgrլ̺ #3@J&T0]8d?lEsJ{OzSuVqYmZi[g[fXfRfNfJfJfJfJfJfJiu٥а0 =H$R.Z6b=iD}qIxyNsRnUiXeZb[_Z^X_S_N_K_K_K_K_K_Klx  өʵ- :E!O+X3`;{gAvnFpvKkOfSbV]XZYWYUWWRWNXJXJXJXJXJXJo} ףήĺ)7BL'U0z]7te=nlCitHd}L_OZRVTRUOUMTOOPLPIPIPIPIPIPIs  Ҩɴ$3>I"yR+sZ2mb8gj=brB\{FWJSLNNKOHOFNGKHHIFIFIFIFIFIFx֣ͮù$0 ;yEqO%kX+e`1`h6Zp;Uz?PЅBLΒDH̡FDʲGBGAFADABB@B@B@B@B@B@~۝ЩǴ"- x7qAjKdT$^\)Ye.Tm2Ow5J8F:BWGSPOXJaFjBt >!;#8$6$4$3$2#1#1#1#1#1#1#ݛѨdzy pia'[/ U7 Q?MFINEVA^=h:s620.,+++++++ԥʰxog`Y S'N.J5 G< CC @J *@+@.?3<:7D 3O .\ *h &t # !            ;*?)B*B,A1>9:B 7N 2Z .f +r '~ % # # " !               =(A(D(E+D0A7?@ AI >U 9a6m3y1//.-,,++)('%$## # # # # # A&G$K$M&M*K2J< HF DR@^=j:u8765443310/.-,,,,,,,,D$J#O"R$R'S/Q8 NC KOH[EgBr@}>><<;;:8765555555555G#N!S W!Y&Z-X5 U? RKOWLcIoHyFEDCBB@?>====>>>>>>>J!RW[_$a+`3 ]< YGVTS`QkPuNL K!J#I#H$G%F%E%D%E$E"F!FFFFFFFMU[`e#h*h1e9 aB_O\\ZgWq!U{$S&R(Q)P*O+N,M,L,L,L*M(M&M$N#N"N"N"N"N"PX_ek"n(o.m6 j>hKeXbc _m%]w([+Z-X/W0V1U2T2S3R3R1S.T+T)T'T'T'T'T'T'S[cjp t&u,u3 s;qGnTj_"gi'es+b|/a1_3^5]6\7[8Z8Y8X8Y4Z0Z.[+[+[+[+[+[+U^fnuy$|*}0|8 zDvPr[#oe)ln.iw1g4f7d9c:bh?fAeAdBcBd=d9e6d3d2d2d2d2d2Yclu| $(ۍ/ω=ƅIU#|^*yg0vo5tw8r