From be984903a3a3e5be5a018fafbbc6b216f5247a42 Mon Sep 17 00:00:00 2001 From: Manuel Bachmann Date: Mon, 5 Jan 2015 15:19:36 +0100 Subject: [PATCH] Imported Upstream version 1.3.1 --- BUILDING.txt | 272 ++- CMakeLists.txt | 213 +- ChangeLog.txt | 157 +- Makefile.am | 268 ++- Makefile.in | 389 ++-- README | 36 +- README-turbo.txt | 336 ++- acinclude.m4 | 10 +- aclocal.m4 | 40 + bmp.c | 6 +- bmp.h | 4 - change.log | 18 + cjpeg.1 | 16 +- cjpeg.c | 84 +- cmakescripts/getdate.bat | 3 - cmakescripts/md5cmp.cmake | 15 + config.h.in | 9 + configure | 1286 ++++++++--- configure.ac | 387 ++-- djpeg.1 | 15 +- djpeg.c | 54 +- doc/html/annotated.html | 65 +- doc/html/bc_s.png | Bin 677 -> 676 bytes doc/html/bdwn.png | Bin 0 -> 147 bytes doc/html/classes.html | 66 +- doc/html/closed.png | Bin 126 -> 132 bytes doc/html/doxygen.css | 591 ++++-- doc/html/doxygen.png | Bin 3942 -> 3779 bytes doc/html/dynsections.js | 97 + doc/html/ftv2blank.png | Bin 0 -> 86 bytes doc/html/ftv2cl.png | Bin 0 -> 453 bytes doc/html/ftv2doc.png | Bin 0 -> 746 bytes doc/html/ftv2folderclosed.png | Bin 0 -> 616 bytes doc/html/ftv2folderopen.png | Bin 0 -> 597 bytes doc/html/ftv2lastnode.png | Bin 0 -> 86 bytes doc/html/ftv2link.png | Bin 0 -> 746 bytes doc/html/ftv2mlastnode.png | Bin 0 -> 246 bytes doc/html/ftv2mnode.png | Bin 0 -> 246 bytes doc/html/ftv2mo.png | Bin 0 -> 403 bytes doc/html/ftv2node.png | Bin 0 -> 86 bytes doc/html/ftv2ns.png | Bin 0 -> 388 bytes doc/html/ftv2plastnode.png | Bin 0 -> 229 bytes doc/html/ftv2pnode.png | Bin 0 -> 229 bytes doc/html/ftv2splitbar.png | Bin 0 -> 314 bytes doc/html/ftv2vertline.png | Bin 0 -> 86 bytes doc/html/functions.html | 67 +- doc/html/functions_vars.html | 67 +- doc/html/group___turbo_j_p_e_g.html | 797 +++---- doc/html/index.html | 53 +- doc/html/installdox | 112 - doc/html/jquery.js | 62 +- doc/html/modules.html | 61 +- doc/html/nav_f.png | Bin 159 -> 153 bytes doc/html/nav_g.png | Bin 0 -> 95 bytes doc/html/nav_h.png | Bin 97 -> 98 bytes doc/html/open.png | Bin 118 -> 123 bytes doc/html/search/all_63.html | 12 +- doc/html/search/all_63.js | 4 + doc/html/search/all_64.html | 18 +- doc/html/search/all_64.js | 5 + doc/html/search/all_68.html | 12 +- doc/html/search/all_68.js | 4 + doc/html/search/all_6e.html | 12 +- doc/html/search/all_6e.js | 4 + doc/html/search/all_6f.html | 18 +- doc/html/search/all_6f.js | 5 + doc/html/search/all_72.html | 12 +- doc/html/search/all_72.js | 4 + doc/html/search/all_74.html | 21 +- doc/html/search/all_74.js | 75 + doc/html/search/all_77.html | 12 +- doc/html/search/all_77.js | 4 + doc/html/search/all_78.html | 12 +- doc/html/search/all_78.js | 4 + doc/html/search/all_79.html | 12 +- doc/html/search/all_79.js | 4 + doc/html/search/classes_74.html | 21 +- doc/html/search/classes_74.js | 6 + doc/html/search/enums_74.html | 26 + doc/html/search/enums_74.js | 6 + doc/html/search/enumvalues_74.html | 26 + doc/html/search/enumvalues_74.js | 27 + doc/html/search/functions_74.html | 26 + doc/html/search/functions_74.js | 19 + doc/html/search/groups_74.html | 26 + doc/html/search/groups_74.js | 4 + doc/html/search/search.css | 45 +- doc/html/search/search.js | 87 +- doc/html/search/typedefs_74.html | 26 + doc/html/search/typedefs_74.js | 5 + doc/html/search/variables_63.html | 12 +- doc/html/search/variables_63.js | 4 + doc/html/search/variables_64.html | 18 +- doc/html/search/variables_64.js | 5 + doc/html/search/variables_68.html | 12 +- doc/html/search/variables_68.js | 4 + doc/html/search/variables_6e.html | 12 +- doc/html/search/variables_6e.js | 4 + doc/html/search/variables_6f.html | 18 +- doc/html/search/variables_6f.js | 5 + doc/html/search/variables_72.html | 12 +- doc/html/search/variables_72.js | 4 + doc/html/search/variables_74.html | 26 + doc/html/search/variables_74.js | 9 + doc/html/search/variables_77.html | 12 +- doc/html/search/variables_77.js | 4 + doc/html/search/variables_78.html | 12 +- doc/html/search/variables_78.js | 4 + doc/html/search/variables_79.html | 12 +- doc/html/search/variables_79.js | 4 + doc/html/structtjregion.html | 125 +- doc/html/structtjscalingfactor.html | 101 +- doc/html/structtjtransform.html | 145 +- doc/html/sync_off.png | Bin 0 -> 853 bytes doc/html/sync_on.png | Bin 0 -> 845 bytes doc/html/tab_a.png | Bin 140 -> 142 bytes doc/html/tab_b.png | Bin 178 -> 169 bytes doc/html/tab_h.png | Bin 192 -> 177 bytes doc/html/tab_s.png | Bin 189 -> 184 bytes doc/html/tabs.css | 1 + doxygen.config | 1 + filelist.txt | 214 -- install.txt | 1096 ---------- java/CMakeLists.txt | 5 +- java/Makefile.am | 26 +- java/Makefile.in | 61 +- java/README | 65 +- java/TJBench.java | 874 ++++++++ java/TJExample.java | 227 +- java/TJUnitTest.java | 653 +++--- java/doc/allclasses-frame.html | 2 - java/doc/allclasses-noframe.html | 2 - java/doc/constant-values.html | 2 - java/doc/deprecated-list.html | 40 +- java/doc/help-doc.html | 2 - java/doc/index-all.html | 54 +- java/doc/index.html | 37 +- java/doc/org/libjpegturbo/turbojpeg/TJ.html | 53 +- .../org/libjpegturbo/turbojpeg/TJCompressor.html | 154 +- .../org/libjpegturbo/turbojpeg/TJCustomFilter.html | 12 +- .../org/libjpegturbo/turbojpeg/TJDecompressor.html | 222 +- .../libjpegturbo/turbojpeg/TJScalingFactor.html | 2 - .../org/libjpegturbo/turbojpeg/TJTransform.html | 8 +- .../org/libjpegturbo/turbojpeg/TJTransformer.html | 45 +- .../org/libjpegturbo/turbojpeg/package-frame.html | 2 - .../libjpegturbo/turbojpeg/package-summary.html | 2 - .../org/libjpegturbo/turbojpeg/package-tree.html | 2 - java/doc/overview-tree.html | 2 - java/doc/serialized-form.html | 2 - java/org/libjpegturbo/turbojpeg/TJ.java | 128 +- java/org/libjpegturbo/turbojpeg/TJCompressor.java | 284 ++- .../org/libjpegturbo/turbojpeg/TJCustomFilter.java | 16 +- .../org/libjpegturbo/turbojpeg/TJDecompressor.java | 360 +++- java/org/libjpegturbo/turbojpeg/TJLoader.java.tmpl | 59 + .../libjpegturbo/turbojpeg/TJScalingFactor.java | 2 +- java/org/libjpegturbo/turbojpeg/TJTransform.java | 50 +- java/org/libjpegturbo/turbojpeg/TJTransformer.java | 60 +- java/org_libjpegturbo_turbojpeg_TJ.h | 4 + java/org_libjpegturbo_turbojpeg_TJCompressor.h | 16 + java/org_libjpegturbo_turbojpeg_TJDecompressor.h | 16 + jccolext.c | 3 +- jccolor.c | 3 +- jcdctmgr.c | 3 +- jchuff.c | 5 +- jcmainct.c | 2 +- jcmarker.c | 114 +- jcmaster.c | 5 +- jconfig.h.in | 3 + jcparam.c | 3 +- jcstest.c | 4 +- jdapistd.c | 3 +- jdatadst-tj.c | 12 +- jdatadst.c | 22 +- jdatasrc-tj.c | 15 +- jdatasrc.c | 19 +- jdcoefct.c | 3 +- jdcolext.c | 3 +- jdcolor.c | 88 +- jdct.h | 48 + jddctmgr.c | 52 +- jdhuff.c | 3 +- jdhuff.h | 3 +- jdinput.c | 77 +- jdmainct.c | 3 +- jdmarker.c | 21 +- jdmaster.c | 232 +- jdmerge.c | 3 +- jdmrgext.c | 3 +- jdphuff.c | 1 + jdsample.c | 3 +- jidctint.c | 2236 +++++++++++++++++++- jmorecfg.h | 6 +- jpegcomp.h | 4 + jpeglib.h | 9 +- jpegtran.1 | 5 +- jpegtran.c | 5 +- jquant1.c | 3 +- jquant2.c | 3 +- jversion.h | 15 +- libjpeg.map.in | 1 + libjpeg.txt | 15 +- md5/Makefile.am | 4 + md5/Makefile.in | 515 +++++ md5/md5.c | 322 +++ md5/md5.h | 49 + .../turbojpeg/TJLoader.java => md5/md5cmp.c | 38 +- md5/md5hl.c | 97 + rdbmp.c | 3 +- rdswitch.c | 3 +- release/ReadMe.rtf | 8 +- release/Welcome.rtf | 4 +- release/copyright | 1 - release/deb-control.tmpl | 36 +- release/libjpeg-turbo.nsi.in | 41 +- release/libjpeg-turbo.spec.in | 184 +- release/makecygwinpkg.in | 20 +- release/makedpkg.in | 49 +- release/makemacpkg.in | 180 +- release/makesunpkg.in | 143 -- release/pkginfo.in | 16 - release/uninstall.in | 53 +- sharedlib/CMakeLists.txt | 9 +- simd/CMakeLists.txt | 9 +- simd/Makefile.in | 6 + simd/jdclrss2-64.asm | 8 +- simd/jdclrss2.asm | 9 +- simd/jdmrgss2-64.asm | 10 +- simd/jdmrgss2.asm | 9 +- simd/jsimd_arm.c | 2 +- simd/jsimd_arm_neon.S | 13 +- structure.txt | 8 +- testimages/nightshot_iso_100.txt | 25 + testimages/testimg.bmp | Bin 35050 -> 0 bytes testimages/testimgari.ppm | 4 - testimages/testimgcrop.jpg | Bin 2662 -> 0 bytes testimages/testimgflt-nosimd.jpg | Bin 5755 -> 0 bytes testimages/testimgflt.jpg | Bin 5753 -> 0 bytes testimages/testimgflt.ppm | 4 - testimages/testimgfst.jpg | Bin 5454 -> 0 bytes testimages/testimgfst.ppm | 4 - testimages/testimgfst100.jpg | Bin 18884 -> 0 bytes testimages/testimgfst1_2.ppm | 4 - testimages/testimgfst1_4.ppm | 4 - testimages/testimgfst1_8.ppm | 4 - testimages/testimggray.jpg | Bin 4333 -> 0 bytes testimages/testimgint.ppm | 4 - testimages/testimgint1_2.ppm | 4 - testimages/testimgint1_4.ppm | 4 - testimages/testimgint1_8.ppm | 4 - testimages/testimgp.jpg | Bin 5645 -> 0 bytes tjbench.c | 67 +- tjbenchtest.in | 22 +- tjbenchtest.java.in | 179 ++ tjexampletest.in | 22 +- tjunittest.c | 66 +- transupp.c | 37 +- transupp.h | 17 +- turbojpeg-jni.c | 122 +- turbojpeg-mapfile.jni | 9 + turbojpeg.c | 294 ++- turbojpeg.h | 113 +- usage.txt | 16 +- win/jconfig.h.in | 1 + win/jpeg62-memsrcdst.def | 104 + win/jpeg7-memsrcdst.def | 106 + 265 files changed, 12407 insertions(+), 5430 deletions(-) delete mode 100644 cmakescripts/getdate.bat create mode 100644 cmakescripts/md5cmp.cmake create mode 100644 doc/html/bdwn.png create mode 100644 doc/html/dynsections.js create mode 100644 doc/html/ftv2blank.png create mode 100644 doc/html/ftv2cl.png create mode 100644 doc/html/ftv2doc.png create mode 100644 doc/html/ftv2folderclosed.png create mode 100644 doc/html/ftv2folderopen.png create mode 100644 doc/html/ftv2lastnode.png create mode 100644 doc/html/ftv2link.png create mode 100644 doc/html/ftv2mlastnode.png create mode 100644 doc/html/ftv2mnode.png create mode 100644 doc/html/ftv2mo.png create mode 100644 doc/html/ftv2node.png create mode 100644 doc/html/ftv2ns.png create mode 100644 doc/html/ftv2plastnode.png create mode 100644 doc/html/ftv2pnode.png create mode 100644 doc/html/ftv2splitbar.png create mode 100644 doc/html/ftv2vertline.png delete mode 100755 doc/html/installdox create mode 100644 doc/html/nav_g.png create mode 100644 doc/html/search/all_63.js create mode 100644 doc/html/search/all_64.js create mode 100644 doc/html/search/all_68.js create mode 100644 doc/html/search/all_6e.js create mode 100644 doc/html/search/all_6f.js create mode 100644 doc/html/search/all_72.js create mode 100644 doc/html/search/all_74.js create mode 100644 doc/html/search/all_77.js create mode 100644 doc/html/search/all_78.js create mode 100644 doc/html/search/all_79.js create mode 100644 doc/html/search/classes_74.js create mode 100644 doc/html/search/enums_74.html create mode 100644 doc/html/search/enums_74.js create mode 100644 doc/html/search/enumvalues_74.html create mode 100644 doc/html/search/enumvalues_74.js create mode 100644 doc/html/search/functions_74.html create mode 100644 doc/html/search/functions_74.js create mode 100644 doc/html/search/groups_74.html create mode 100644 doc/html/search/groups_74.js create mode 100644 doc/html/search/typedefs_74.html create mode 100644 doc/html/search/typedefs_74.js create mode 100644 doc/html/search/variables_63.js create mode 100644 doc/html/search/variables_64.js create mode 100644 doc/html/search/variables_68.js create mode 100644 doc/html/search/variables_6e.js create mode 100644 doc/html/search/variables_6f.js create mode 100644 doc/html/search/variables_72.js create mode 100644 doc/html/search/variables_74.html create mode 100644 doc/html/search/variables_74.js create mode 100644 doc/html/search/variables_77.js create mode 100644 doc/html/search/variables_78.js create mode 100644 doc/html/search/variables_79.js create mode 100644 doc/html/sync_off.png create mode 100644 doc/html/sync_on.png delete mode 100644 filelist.txt delete mode 100644 install.txt create mode 100644 java/TJBench.java create mode 100644 java/org/libjpegturbo/turbojpeg/TJLoader.java.tmpl create mode 100644 md5/Makefile.am create mode 100644 md5/Makefile.in create mode 100644 md5/md5.c create mode 100644 md5/md5.h rename java/org/libjpegturbo/turbojpeg/TJLoader.java => md5/md5cmp.c (68%) create mode 100644 md5/md5hl.c delete mode 100755 release/copyright delete mode 100644 release/makesunpkg.in delete mode 100644 release/pkginfo.in create mode 100644 testimages/nightshot_iso_100.txt delete mode 100644 testimages/testimg.bmp delete mode 100644 testimages/testimgari.ppm delete mode 100644 testimages/testimgcrop.jpg delete mode 100644 testimages/testimgflt-nosimd.jpg delete mode 100644 testimages/testimgflt.jpg delete mode 100644 testimages/testimgflt.ppm delete mode 100644 testimages/testimgfst.jpg delete mode 100644 testimages/testimgfst.ppm delete mode 100644 testimages/testimgfst100.jpg delete mode 100644 testimages/testimgfst1_2.ppm delete mode 100644 testimages/testimgfst1_4.ppm delete mode 100644 testimages/testimgfst1_8.ppm delete mode 100644 testimages/testimggray.jpg delete mode 100644 testimages/testimgint.ppm delete mode 100644 testimages/testimgint1_2.ppm delete mode 100644 testimages/testimgint1_4.ppm delete mode 100644 testimages/testimgint1_8.ppm delete mode 100644 testimages/testimgp.jpg create mode 100755 tjbenchtest.java.in create mode 100755 win/jpeg62-memsrcdst.def create mode 100644 win/jpeg7-memsrcdst.def diff --git a/BUILDING.txt b/BUILDING.txt index 26a42ca..adf4eaa 100644 --- a/BUILDING.txt +++ b/BUILDING.txt @@ -1,5 +1,5 @@ ******************************************************************************* -** Building on Unix Platforms (including Cygwin) +** Building on Un*x Platforms (including Cygwin and OS X) ******************************************************************************* @@ -10,6 +10,9 @@ Build Requirements -- autoconf 2.56 or later -- automake 1.7 or later -- libtool 1.4 or later + * If using Xcode 4.3 or later on OS X, autoconf and automake are no longer + provided. The easiest way to obtain them is from MacPorts + (http://www.macports.org/). -- NASM (if building x86 or x86-64 SIMD extensions) * 0.98, or 2.01 or later is required for a 32-bit build @@ -33,14 +36,26 @@ Build Requirements NOTE: the NASM build will fail if texinfo is not installed. -- GCC v4.1 or later recommended for best performance - --- If building the TurboJPEG/OSS Java wrapper, JDK or OpenJDK 1.5 or later is + * Beginning with Xcode 4, Apple stopped distributing GCC and switched to + the LLVM compiler. Xcode v4.0 through v4.6 provides a GCC front end + called LLVM-GCC. Unfortunately, as of this writing, neither LLVM-GCC nor + the LLVM (clang) compiler produces optimal performance with libjpeg-turbo. + Building libjpeg-turbo with LLVM-GCC v4.2 results in a 10% performance + degradation when compressing using 64-bit code, relative to building + libjpeg-turbo with GCC v4.2. Building libjpeg-turbo with LLVM (clang) + results in a 20% performance degradation when compressing using 64-bit + code, relative to building libjpeg-turbo with GCC v4.2. If you are + running Snow Leopard or earlier, it is suggested that you continue to use + Xcode v3.2.6, which provides GCC v4.2. If you are using Lion or later, it + is suggested that you install Apple GCC v4.2 through MacPorts. + +-- If building the TurboJPEG Java wrapper, JDK or OpenJDK 1.5 or later is required. Some systems, such as OS X 10.4, Solaris 10 and later, and Red Hat Enterprise Linux 5 and later, have this pre-installed. On OS X 10.5 and later, it will be necessary to install the Java Developer Package, which can - be downloaded from http://connect.apple.com. For systems that do not have a - JDK installed, you can obtain the Oracle Java Development Kit from - http://www.java.com. + be downloaded from http://developer.apple.com/downloads (Apple ID required.) + For systems that do not have a JDK installed, you can obtain the Oracle Java + Development Kit from http://www.java.com. ================== @@ -61,9 +76,9 @@ directory. For in-tree builds, these directories are the same. Building libjpeg-turbo ====================== -The following procedure will build libjpeg-turbo on Linux, FreeBSD, 32-bit -OS X, Cygwin, and Solaris/x86 systems (on Solaris, this generates a 32-bit -library. See below for 64-bit build instructions.) +The following procedure will build libjpeg-turbo on Linux, FreeBSD, Cygwin, and +Solaris/x86 systems (on Solaris, this generates a 32-bit library. See below +for 64-bit build instructions.) cd {source_directory} autoreconf -fiv @@ -71,40 +86,44 @@ library. See below for 64-bit build instructions.) sh {source_directory}/configure [additional configure flags] make -NOTE: Running autoreconf in the source directory is only necessary if building -libjpeg-turbo from the SVN repository. +NOTE: Running autoreconf in the source directory is usually only necessary if +building libjpeg-turbo from the SVN repository. This will generate the following files under .libs/ libjpeg.a - Static link library for libjpeg-turbo + Static link library for the libjpeg API - libjpeg.so.{version} (Linux, Solaris) + libjpeg.so.{version} (Linux, Unix) libjpeg.{version}.dylib (OS X) cygjpeg-{version}.dll (Cygwin) - Shared library for libjpeg-turbo + Shared library for the libjpeg API + + By default, {version} is 62.1.0, 7.1.0, or 8.0.2, depending on whether + libjpeg v6b (default), v7, or v8 emulation is enabled. If using Cygwin, + {version} is 62, 7, or 8. - libjpeg.so (Linux, Solaris) + libjpeg.so (Linux, Unix) libjpeg.dylib (OS X) + Development symlink for the libjpeg API + libjpeg.dll.a (Cygwin) - Development stub for libjpeg-turbo shared library + Import library for the libjpeg API libturbojpeg.a - Static link library for TurboJPEG/OSS + Static link library for the TurboJPEG API - libturbojpeg.so (Linux, Solaris) - libturbojpeg.dylib (OS X) - Shared library and development stub for TurboJPEG/OSS + libturbojpeg.so.0.0.0 (Linux, Unix) + libturbojpeg.0.0.0.dylib (OS X) + cygturbojpeg-0.dll (Cygwin) + Shared library for the TurboJPEG API - cygturbojpeg.dll (Cygwin) - Shared library for TurboJPEG/OSS + libturbojpeg.so (Linux, Unix) + libturbojpeg.dylib (OS X) + Development symlink for the TurboJPEG API libturbojpeg.dll.a (Cygwin) - Development stub for TurboJPEG/OSS shared library - -{version} is 62.0.0, 7.0.0, or 8.0.2, depending on whether libjpeg v6b -(default), v7, or v8 emulation is enabled. If using Cygwin, {version} is -62, 7, or 8. + Import library for the TurboJPEG API libjpeg v7 or v8 API/ABI Emulation @@ -117,6 +136,16 @@ API/ABI-compatible with libjpeg v8. See README-turbo.txt for more information on libjpeg v7 and v8 emulation. +In-Memory Source/Destination Managers +------------------------------------- + +When using libjpeg v6b or v7 API/ABI emulation, add --without-mem-srcdst to the +configure command line to build a version of libjpeg-turbo that lacks the +jpeg_mem_src() and jpeg_mem_dest() functions. These functions were not part of +the original libjpeg v6b and v7 APIs, so removing them ensures strict +conformance with those APIs. See README-turbo.txt for more information. + + Arithmetic Coding Support ------------------------- @@ -129,13 +158,12 @@ add --without-arith-enc or --without-arith-dec to the configure command line to disable encoding or decoding (respectively.) -TurboJPEG/OSS Java Wrapper --------------------------- +TurboJPEG Java Wrapper +---------------------- Add --with-java to the configure command line to incorporate an optional Java -Native Interface wrapper into the TurboJPEG/OSS dynamic library and build the -Java front-end classes to support it. This allows the TurboJPEG/OSS dynamic -library to be used directly from Java applications. See java/README for more -details. +Native Interface wrapper into the TurboJPEG shared library and build the Java +front-end classes to support it. This allows the TurboJPEG shared library to +be used directly from Java applications. See java/README for more details. You can set the JAVAC, JAR, and JAVA configure variables to specify alternate commands for javac, jar, and java (respectively.) You can also @@ -161,13 +189,14 @@ For example, will install the header files in /usr/local/include and the library files in /usr/local/lib64. If 'prefix' and 'libdir' are not specified, then the default is to install the header files in /opt/libjpeg-turbo/include and the library -files in /opt/libjpeg-turbo/lib. +files in /opt/libjpeg-turbo/lib32 (32-bit) or /opt/libjpeg-turbo/lib64 +(64-bit.) NOTE: You can specify a prefix of /usr and a libdir of, for instance, /usr/lib64 to overwrite the system's version of libjpeg. If you do this, however, then be sure to BACK UP YOUR SYSTEM'S INSTALLATION OF LIBJPEG before overwriting it. It is recommended that you instead install libjpeg-turbo into -a non-system directory and manipulate the LD_LIBRARY_PATH or create sym links +a non-system directory and manipulate the LD_LIBRARY_PATH or create symlinks to force applications to use libjpeg-turbo instead of libjpeg. See README-turbo.txt for more information. @@ -177,8 +206,8 @@ Build Recipes ============= -32-bit Library Build on 64-bit Linux ------------------------------------- +32-bit Build on 64-bit Linux +---------------------------- Add @@ -187,8 +216,8 @@ Add to the configure command line. -64-bit Library Build on 64-bit OS X ------------------------------------ +64-bit Build on 64-bit OS X +--------------------------- Add @@ -198,8 +227,8 @@ to the configure command line. NASM 2.07 or later from MacPorts must be installed. -32-bit Library Build on 64-bit OS X ------------------------------------ +32-bit Build on 64-bit OS X +--------------------------- Add @@ -208,8 +237,8 @@ Add to the configure command line. -64-bit Backward-Compatible Library Build on 64-bit OS X -------------------------------------------------------- +64-bit Backward-Compatible Build on 64-bit OS X +----------------------------------------------- Add @@ -223,8 +252,8 @@ to the configure command line. The OS X 10.4 SDK, and NASM 2.07 or later from MacPorts, must be installed. -32-bit Backward-Compatible Library Build on OS X ------------------------------------------------- +32-bit Backward-Compatible Build on OS X +---------------------------------------- Add @@ -247,8 +276,8 @@ Add to the configure command line. -32-bit Library Build on 64-bit FreeBSD --------------------------------------- +32-bit Build on 64-bit FreeBSD +------------------------------ Add @@ -304,20 +333,48 @@ examples accordingly. Additional build requirements: - gas-preprocessor.pl (https://github.com/yuvi/gas-preprocessor) should be - installed in your PATH. + gas-preprocessor.pl + (https://sourceforge.net/p/libjpeg-turbo/code/HEAD/tree/gas-preprocessor) + should be installed in your PATH. Set the following shell variables for simplicity: - IOS_PLATFORMDIR="/Developer/Platforms/iPhoneOS.platform" - IOS_SYSROOT="$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS4.3.sdk" - IOS_GCC="$IOS_PLATFORMDIR/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2" + Xcode 3.2.x / iOS 4.3 SDK: + IOS_PLATFORMDIR=/Developer/Platforms/iPhoneOS.platform + IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS4.3.sdk + IOS_GCC=$IOS_PLATFORMDIR/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 + + Xcode 4.5.x / iOS 6.0 SDK: + IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform + IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS6.0.sdk + IOS_GCC=$IOS_PLATFORMDIR/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 + + Xcode 4.6.x / iOS 6.1 SDK: + IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform + IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS6.1.sdk + IOS_GCC=$IOS_PLATFORMDIR/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 + + Xcode 5.0.x / iOS 7.0 SDK: + IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform + IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS7.0.sdk + IOS_GCC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang ARM v6 only (up to and including iPhone 3G): + [NOTE: Requires Xcode 4.4.x or earlier] IOS_CFLAGS="-march=armv6 -mcpu=arm1176jzf-s -mfpu=vfp" - ARM v7 only (iPhone 3GS and newer, iPad): + ARM v7 only (iPhone 3GS-4S, iPad 1st-3rd Generation): + GCC: IOS_CFLAGS="-march=armv7 -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon" + Clang: + IOS_CFLAGS="-arch armv7 -no-integrated-as" + + ARM v7s only (iPhone 5, iPad 4th Generation): + [NOTE: Requires Xcode 4.5 or later] + GCC + IOS_CFLAGS="-march=armv7s -mcpu=swift -mtune=swift -mfpu=neon" + Clang: + IOS_CFLAGS="-arch armv7s -no-integrated-as" Follow the procedure under "Building libjpeg-turbo" above, adding @@ -328,8 +385,14 @@ Follow the procedure under "Building libjpeg-turbo" above, adding to the configure command line. -Once built, lipo can be used to combine the ARM v6 and v7 variants into a -universal library. +Once built, lipo can be used to combine the ARM v6, v7, and/or v7s variants +into a universal library. + +NOTE: If you are building libjpeg-turbo from the "official" project tarball, +then it is highly likely that you will need to run 'autoreconf -fiv' in the +source tree prior to building ARM v7 or v7s iOS binaries using the techniques +described above. Otherwise, you may get a libtool error such as "unable to +infer tagged configuration." ******************************************************************************* @@ -373,8 +436,8 @@ Build Requirements -- NASM (http://www.nasm.us/) 0.98 or later (NASM 2.05 or later is required for a 64-bit build) --- If building the TurboJPEG/OSS Java wrapper, JDK 1.5 or later is required. - This can be downloaded from http://www.java.com. +-- If building the TurboJPEG Java wrapper, JDK 1.5 or later is required. This + can be downloaded from http://www.java.com. ================== @@ -409,17 +472,17 @@ on which version of cl.exe is in the PATH. The following files will be generated under {build_directory}: jpeg-static.lib - Static link library for libjpeg-turbo + Static link library for the libjpeg API sharedlib/jpeg{version}.dll - DLL for libjpeg-turbo + DLL for the libjpeg API sharedlib/jpeg.lib - Import library for libjpeg-turbo DLL + Import library for the libjpeg API turbojpeg-static.lib - Static link library for TurboJPEG/OSS + Static link library for the TurboJPEG API turbojpeg.dll - DLL for TurboJPEG/OSS + DLL for the TurboJPEG API turbojpeg.lib - Import library for TurboJPEG/OSS DLL + Import library for the TurboJPEG API {version} is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or v8 emulation is enabled. @@ -442,17 +505,17 @@ build of libjpeg-turbo. This will generate the following files under {build_directory}: {configuration}/jpeg-static.lib - Static link library for libjpeg-turbo + Static link library for the libjpeg API sharedlib/{configuration}/jpeg{version}.dll - DLL for libjpeg-turbo + DLL for the libjpeg API sharedlib/{configuration}/jpeg.lib - Import library for libjpeg-turbo DLL + Import library for the libjpeg API {configuration}/turbojpeg-static.lib - Static link library for TurboJPEG/OSS + Static link library for the TurboJPEG API {configuration}/turbojpeg.dll - DLL for TurboJPEG/OSS + DLL for the TurboJPEG API {configuration}/turbojpeg.lib - Import library for TurboJPEG/OSS DLL + Import library for the TurboJPEG API {configuration} is Debug, Release, RelWithDebInfo, or MinSizeRel, depending on the configuration you built in the IDE, and {version} is 62, 7, or 8, @@ -469,17 +532,17 @@ MinGW This will generate the following files under {build_directory} libjpeg.a - Static link library for libjpeg-turbo + Static link library for the libjpeg API sharedlib/libjpeg-{version}.dll - DLL for libjpeg-turbo + DLL for the libjpeg API sharedlib/libjpeg.dll.a - Import library for libjpeg-turbo DLL + Import library for the libjpeg API libturbojpeg.a - Static link library for TurboJPEG/OSS + Static link library for the TurboJPEG API libturbojpeg.dll - DLL for TurboJPEG/OSS + DLL for the TurboJPEG API libturbojpeg.dll.a - Import library for TurboJPEG/OSS DLL + Import library for the TurboJPEG API {version} is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or v8 emulation is enabled. @@ -503,6 +566,16 @@ API/ABI-compatible with libjpeg v8. See README-turbo.txt for more information on libjpeg v7 and v8 emulation. +In-Memory Source/Destination Managers +------------------------------------- + +When using libjpeg v6b or v7 API/ABI emulation, add -DWITH_MEM_SRCDST=0 to the +CMake command line to build a version of libjpeg-turbo that lacks the +jpeg_mem_src() and jpeg_mem_dest() functions. These functions were not part of +the original libjpeg v6b and v7 APIs, so removing them ensures strict +conformance with those APIs. See README-turbo.txt for more information. + + Arithmetic Coding Support ------------------------- @@ -515,13 +588,12 @@ add "-DWITH_ARITH_ENC=0" or "-DWITH_ARITH_DEC=0" to the cmake command line to disable encoding or decoding (respectively.) -TurboJPEG/OSS Java Wrapper --------------------------- +TurboJPEG Java Wrapper +---------------------- Add "-DWITH_JAVA=1" to the cmake command line to incorporate an optional Java -Native Interface wrapper into the TurboJPEG/OSS dynamic library and build the -Java front-end classes to support it. This allows the TurboJPEG/OSS dynamic -library to be used directly from Java applications. See java/README for more -details. +Native Interface wrapper into the TurboJPEG shared library and build the Java +front-end classes to support it. This allows the TurboJPEG shared library to +be used directly from Java applications. See java/README for more details. If you are using CMake 2.8, you can set the Java_JAVAC_EXECUTABLE, Java_JAVA_EXECUTABLE, and Java_JAR_EXECUTABLE CMake variables to specify @@ -622,8 +694,8 @@ MinGW Build on Linux The following commands can be used to create various types of release packages: -Unix ----- +Unix/Linux +---------- make rpm @@ -642,6 +714,9 @@ make dmg Create Macintosh package/disk image. This requires the PackageMaker application, which must be installed in /Developer/Applications/Utilities. + Note that PackageMaker is not included in recent releases of Xcode, but it + can be obtained by downloading the "Auxiliary Tools for Xcode" package from + http://developer.apple.com/downloads. make udmg [BUILDDIR32={32-bit build directory}] @@ -656,35 +731,24 @@ make udmg [BUILDDIR32={32-bit build directory}] make iosdmg [BUILDDIR32={32-bit build directory}] \ [BUILDDIRARMV6={ARM v6 build directory}] \ [BUILDDIRARMV7={ARM v7 build directory}] \ + [BUILDDIRARMV7S={ARM v7s build directory}] On OS X systems, this creates a Macintosh package and disk image in which the libjpeg-turbo static libraries contain ARM architectures necessary to build iOS applications. If building on an x86-64 system, the binaries will also contain the i386 architecture, as with 'make udmg' above. You should first - configure ARM v6 and ARM v7 out-of-tree builds of libjpeg-turbo (see - "Building libjpeg-turbo for iOS" above.) If you are building an x86-64 + configure ARM v6, ARM v7, and/or ARM v7s out-of-tree builds of libjpeg-turbo + (see "Building libjpeg-turbo for iOS" above.) If you are building an x86-64 version of libjpeg-turbo, you should configure a 32-bit out-of-tree build as well. Next, build libjpeg-turbo as you would normally, using an out-of-tree build. When it is built, run 'make iosdmg' from the build directory. The build system will look for the ARM v6 build under {source_directory}/iosarmv6 by default, the ARM v7 build under {source_directory}/iosarmv7 by default, - and (if applicable) the 32-bit build under {source_directory}/osxx86 by - default, but you can override this by setting the BUILDDIR32, BUILDDIRARMV6, - and/or BUILDDIRARMV7 variables on the make command line as shown above. - -make sunpkg - - Build a Solaris package. This requires pkgmk, pkgtrans, and bzip2. - -make csunpkg [BUILDDIR32={32-bit build directory}] - - On 64-bit Solaris systems, this creates a combined package that contains - both 32-bit and 64-bit libraries. You should first configure a 32-bit - out-of-tree build of libjpeg-turbo, then configure a 64-bit out-of-tree - build, then run 'make csunpkg' from the 64-bit build directory. The build - system will look for the 32-bit build under {source_directory}/solx86 by - default, but you can override this by setting the BUILDDIR32 variable on the - make command line as shown above. + the ARM v7s build under {source_directory}/iosarmv7s by default, and (if + applicable) the 32-bit build under {source_directory}/osxx86 by default, but + you can override this by setting the BUILDDIR32, BUILDDIRARMV6, + BUILDDIRARMV7, and/or BUILDDIRARMV7S variables on the make command line as + shown above. make cygwinpkg @@ -733,11 +797,11 @@ Invoking 'make testclean' or 'nmake testclean' (if using NMake) or building the 'testclean' target (if using the Visual Studio IDE) will clean up the output images generated by 'make test'. -On Unix/Linux platforms, more extensive tests of the TurboJPEG/OSS C and Java +On Unix/Linux platforms, more extensive tests of the TurboJPEG C and Java wrappers can be run by invoking 'make tjtest'. These extended TurboJPEG tests essentially iterate through all of the available features of the TurboJPEG APIs that are not covered by the TurboJPEG unit tests (this includes the lossless transform options) and compare the images generated by each feature to images generated using the equivalent feature in the libjpeg API. The extended TurboJPEG tests are meant to test for regressions in the TurboJPEG wrappers, -not in the underlying libjpeg-turbo library. +not in the underlying libjpeg API library. diff --git a/CMakeLists.txt b/CMakeLists.txt index e7cbbf9..d3c0972 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,18 +2,25 @@ # Setup # -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 2.8.8) +cmake_policy(SET CMP0022 OLD) project(libjpeg-turbo C) -set(VERSION 1.2.1) +set(VERSION 1.3.1) if(MINGW OR CYGWIN) execute_process(COMMAND "date" "+%Y%m%d" OUTPUT_VARIABLE BUILD) string(REGEX REPLACE "\n" "" BUILD ${BUILD}) elseif(WIN32) - execute_process(COMMAND "${CMAKE_SOURCE_DIR}/cmakescripts/getdate.bat" - OUTPUT_VARIABLE BUILD) - string(REGEX REPLACE "\n" "" BUILD ${BUILD}) + execute_process(COMMAND "wmic.exe" "os" "get" "LocalDateTime" OUTPUT_VARIABLE + BUILD) + string(REGEX REPLACE "[^0-9]" "" BUILD "${BUILD}") + if (BUILD STREQUAL "") + execute_process(COMMAND "cmd.exe" "/C" "DATE" "/T" OUTPUT_VARIABLE BUILD) + string(REGEX REPLACE ".*[ ]([0-9]*)[/.]([0-9]*)[/.]([0-9]*).*" "\\3\\2\\1" BUILD "${BUILD}") + else() + string(SUBSTRING "${BUILD}" 0 8 BUILD) + endif() else() message(FATAL_ERROR "Platform not supported by this build system. Use autotools instead.") endif() @@ -39,7 +46,8 @@ option(WITH_ARITH_ENC "Include arithmetic encoding support" TRUE) option(WITH_ARITH_DEC "Include arithmetic decoding support" TRUE) option(WITH_JPEG7 "Emulate libjpeg v7 API/ABI (this makes libjpeg-turbo backward incompatible with libjpeg v6b)" FALSE) option(WITH_JPEG8 "Emulate libjpeg v8 API/ABI (this makes libjpeg-turbo backward incompatible with libjpeg v6b)" FALSE) -option(WITH_JAVA "Build Java wrapper for the TurboJPEG/OSS library" FALSE) +option(WITH_MEM_SRCDST "Include in-memory source/destination manager functions when emulating the libjpeg v6b or v7 API/ABI" TRUE) +option(WITH_JAVA "Build Java wrapper for the TurboJPEG library" FALSE) if(WITH_ARITH_ENC) set(C_ARITH_CODING_SUPPORTED 1) @@ -56,14 +64,19 @@ else() endif() if(WITH_JAVA) - message(STATUS "TurboJPEG/OSS Java wrapper enabled") + message(STATUS "TurboJPEG Java wrapper enabled") else() - message(STATUS "TurboJPEG/OSS Java wrapper disabled") + message(STATUS "TurboJPEG Java wrapper disabled") +endif() + +set(SO_AGE 0) +if(WITH_MEM_SRCDST) + set(SO_AGE 1) endif() set(JPEG_LIB_VERSION 62) set(DLL_VERSION ${JPEG_LIB_VERSION}) -set(FULLVERSION ${DLL_VERSION}.0.0) +set(FULLVERSION ${DLL_VERSION}.${SO_AGE}.0) if(WITH_JPEG8) set(JPEG_LIB_VERSION 80) set(DLL_VERSION 8) @@ -72,10 +85,17 @@ if(WITH_JPEG8) elseif(WITH_JPEG7) set(JPEG_LIB_VERSION 70) set(DLL_VERSION 7) - set(FULLVERSION ${DLL_VERSION}.0.0) + set(FULLVERSION ${DLL_VERSION}.${SO_AGE}.0) message(STATUS "Emulating libjpeg v7 API/ABI") endif(WITH_JPEG8) +if(WITH_MEM_SRCDST) + set(MEM_SRCDST_SUPPORTED 1) + message(STATUS "In-memory source/destination managers enabled") +else() + message(STATUS "In-memory source/destination managers disabled") +endif() + if(MSVC) # Use the static C library for all build types foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE @@ -103,6 +123,22 @@ else() message(STATUS "32-bit build") endif() +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + if(MSVC) + set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_PROJECT_NAME}) + else() + set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_PROJECT_NAME}-gcc) + endif() + if(64BIT) + set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_INSTALL_PREFIX_DEFAULT}64) + endif() + set(CMAKE_INSTALL_PREFIX "c:/${CMAKE_INSTALL_PREFIX_DEFAULT}" CACHE PATH + "Directory into which to install libjpeg-turbo (default: c:/${CMAKE_INSTALL_PREFIX_DEFAULT})" + FORCE) +endif() + +message(STATUS "Install directory = ${CMAKE_INSTALL_PREFIX}") + configure_file(win/jconfig.h.in jconfig.h) configure_file(win/config.h.in config.h) @@ -243,6 +279,40 @@ else() endif() enable_testing() + +set(MD5_JPEG_INT 9a68f56bc76e466aa7e52f415d0f4a5f) +set(MD5_JPEG_FAST 0e1502e7fa421835e376a314fac2a39f) +set(MD5_JPEG_FAST_100 7bf72a8e741d64eecb960c97323af77c) +set(MD5_JPEG_FLOAT d1623885ffafcd40c684af09e3d65cd5) +set(MD5_JPEG_FLOAT_NOSIMD fb4884c35f8273f498cb32879de5c455) +set(MD5_JPEG_INT_GRAY 72b51f894b8f4a10b3ee3066770aa38d) +set(MD5_PPM_INT d1ed0d11f076b842525271647716aeb8) +set(MD5_PPM_FAST 048298a2d2410261c0533cb97bcfef23) +set(MD5_PPM_FLOAT 7f5b446ee36b2630e06785b8d42af15f) +set(MD5_PPM_FLOAT_NOSIMD 64072f1dbdc5b3a187777788604971a5) +set(MD5_PPM_INT_2_1 9f9de8c0612f8d06869b960b05abf9c9) +set(MD5_PPM_INT_15_8 b6875bc070720b899566cc06459b63b7) +set(MD5_PPM_INT_7_4 06a177eae05f164fac57f7a2c346ee87) +set(MD5_PPM_INT_13_8 bc3452573c8152f6ae552939ee19f82f) +set(MD5_PPM_INT_3_2 f5a8b88a8a7f96016f04d259cf82ed67) +set(MD5_PPM_INT_11_8 d8cc73c0aaacd4556569b59437ba00a5) +set(MD5_PPM_INT_5_4 32775dd9ad2ab90f4c5b219b53e0c86c) +set(MD5_PPM_INT_9_8 d25e61bc7eac0002f5b393aa223747b6) +set(MD5_PPM_INT_7_8 ddb564b7c74a09494016d6cd7502a946) +set(MD5_PPM_INT_3_4 8ed8e68808c3fbc4ea764fc9d2968646) +set(MD5_PPM_INT_5_8 a3363274999da2366a024efae6d16c9b) +set(MD5_PPM_INT_1_2 e692a315cea26b988c8e8b29a5dbcd81) +set(MD5_PPM_INT_3_8 79eca9175652ced755155c90e785a996) +set(MD5_PPM_INT_1_4 79cd778f8bf1a117690052cacdd54eca) +set(MD5_PPM_INT_1_8 391b3d4aca640c8567d6f8745eb2142f) +set(MD5_PPM_FAST_1_2 f30bcf6d32ccd44cbdd9aeaacbd9454f) +set(MD5_BMP_256 4980185e3776e89bd931736e1cddeee6) +set(MD5_JPEG_ARI e986fb0a637a8d833d96e8a6d6d84ea1) +set(MD5_PPM_ARI 72b59a99bcf1de24c5b27d151bde2437) +set(MD5_JPEG_PROG 1c4afddc05c0a43489ee54438a482d92) +set(MD5_JPEG_PROG_ARI 0a8f1c8f66e113c3cf635df0a475a617) +set(MD5_JPEG_CROP b4197f377e621c4e9b1d20471432610d) + if(WITH_JAVA) add_test(TJUnitTest ${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR} TJUnitTest) add_test(TJUnitTest-yuv ${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR} TJUnitTest -yuv) @@ -253,121 +323,115 @@ add_test(tjunittest tjunittest) add_test(tjunittest-alloc tjunittest -alloc) add_test(tjunittest-yuv tjunittest -yuv) add_test(cjpeg-int sharedlib/cjpeg -dct int -outfile testoutint.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-int-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint.jpg testoutint.jpg) +add_test(cjpeg-int-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_INT} -DFILE=testoutint.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(cjpeg-fast sharedlib/cjpeg -dct fast -opt -outfile testoutfst.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-fast-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst.jpg testoutfst.jpg) +add_test(cjpeg-fast-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_FAST} -DFILE=testoutfst.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(cjpeg-fast-100 sharedlib/cjpeg -dct fast -quality 100 -opt -outfile testoutfst100.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-fast-100-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst100.jpg testoutfst100.jpg) +add_test(cjpeg-fast-100-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_FAST_100} -DFILE=testoutfst100.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(cjpeg-float sharedlib/cjpeg -dct float -outfile testoutflt.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) if(WITH_SIMD) -add_test(cjpeg-float-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgflt.jpg testoutflt.jpg) +add_test(cjpeg-float-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_FLOAT} -DFILE=testoutflt.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) else() -add_test(cjpeg-float-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgflt-nosimd.jpg testoutflt.jpg) +add_test(cjpeg-float-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_FLOAT_NOSIMD} -DFILE=testoutflt.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) endif() add_test(cjpeg-int-gray sharedlib/cjpeg -dct int -grayscale -outfile testoutgray.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-int-gray-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimggray.jpg testoutgray.jpg) +add_test(cjpeg-int-gray-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_INT_GRAY} -DFILE=testoutgray.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(djpeg-int sharedlib/djpeg -dct int -fast -ppm -outfile testoutint.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-int-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint.ppm testoutint.ppm) +add_test(djpeg-int-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_INT} -DFILE=testoutint.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(djpeg-fast sharedlib/djpeg -dct fast -ppm -outfile testoutfst.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-fast-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst.ppm testoutfst.ppm) +add_test(djpeg-fast-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_FAST} -DFILE=testoutfst.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(djpeg-float sharedlib/djpeg -dct float -ppm -outfile testoutflt.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) if(WITH_SIMD) -add_test(djpeg-float-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgflt.ppm testoutflt.ppm) +add_test(djpeg-float-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_FLOAT} -DFILE=testoutflt.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) else() -add_test(djpeg-float-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm testoutflt.ppm) +add_test(djpeg-float-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_FLOAT_NOSIMD} -DFILE=testoutflt.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) endif() -add_test(djpeg-int-1_2 sharedlib/djpeg -dct int -scale 1/2 -ppm -outfile testoutint1_2.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-int-1_2-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint1_2.ppm testoutint1_2.ppm) +foreach(scale 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8) +string(REGEX REPLACE "_" "/" scalearg ${scale}) +add_test(djpeg-int-${scale} sharedlib/djpeg -dct int -nosmooth -scale ${scalearg} -ppm -outfile testoutint${scale}.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) +add_test(djpeg-int-${scale}-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_INT_${scale}} -DFILE=testoutint${scale}.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) +endforeach() add_test(djpeg-fast-1_2 sharedlib/djpeg -dct fast -scale 1/2 -ppm -outfile testoutfst1_2.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-fast-1_2-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst1_2.ppm testoutfst1_2.ppm) -add_test(djpeg-int-1_4 sharedlib/djpeg -dct int -scale 1/4 -ppm -outfile testoutint1_4.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-int-1_4-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint1_4.ppm testoutint1_4.ppm) -add_test(djpeg-fast-1_4 sharedlib/djpeg -dct fast -scale 1/4 -ppm -outfile testoutfst1_4.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-fast-1_4-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst1_4.ppm testoutfst1_4.ppm) -add_test(djpeg-int-1_8 sharedlib/djpeg -dct int -scale 1/8 -ppm -outfile testoutint1_8.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-int-1_8-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint1_8.ppm testoutint1_8.ppm) -add_test(djpeg-fast-1_8 sharedlib/djpeg -dct fast -scale 1/8 -ppm -outfile testoutfst1_8.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-fast-1_8-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst1_8.ppm testoutfst1_8.ppm) +add_test(djpeg-fast-1_2-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_FAST_1_2} -DFILE=testoutfst1_2.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(djpeg-256 sharedlib/djpeg -dct int -bmp -colors 256 -outfile testout.bmp ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-256-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimg.bmp testout.bmp) +add_test(djpeg-256-cmp ${CMAKE_COMMAND} -DMD5=${MD5_BMP_256} -DFILE=testout.bmp -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(cjpeg-prog sharedlib/cjpeg -dct int -progressive -outfile testoutp.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgp.jpg testoutp.jpg) +add_test(cjpeg-prog-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_PROG} -DFILE=testoutp.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(jpegtran-prog sharedlib/jpegtran -outfile testoutt.jpg testoutp.jpg) -add_test(jpegtran-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint.jpg testoutt.jpg) +add_test(jpegtran-prog-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_INT} -DFILE=testoutt.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) if(WITH_ARITH_ENC) add_test(cjpeg-ari sharedlib/cjpeg -dct int -arithmetic -outfile testoutari.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-ari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg testoutari.jpg) +add_test(cjpeg-ari-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_ARI} -DFILE=testoutari.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake ) add_test(jpegtran-toari sharedlib/jpegtran -arithmetic -outfile testouta.jpg ${CMAKE_SOURCE_DIR}/testimages/testimgint.jpg) -add_test(jpegtran-toari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg testouta.jpg) +add_test(jpegtran-toari-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_ARI} -DFILE=testouta.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) +add_test(cjpeg-prog-ari sharedlib/cjpeg -dct int -progressive -arithmetic -sample 1x1 -outfile testoutpa.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) +add_test(cjpeg-prog-ari-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_PROG_ARI} -DFILE=testoutpa.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake ) endif() if(WITH_ARITH_DEC) add_test(djpeg-ari sharedlib/djpeg -dct int -fast -ppm -outfile testoutari.ppm ${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg) -add_test(djpeg-ari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgari.ppm testoutari.ppm) +add_test(djpeg-ari-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_ARI} -DFILE=testoutari.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(jpegtran-fromari sharedlib/jpegtran -outfile testouta.jpg ${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg) -add_test(jpegtran-fromari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint.jpg testouta.jpg) +add_test(jpegtran-fromari-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_INT} -DFILE=testouta.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) endif() add_test(jpegtran-crop sharedlib/jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(jpegtran-crop-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgcrop.jpg testoutcrop.jpg) +add_test(jpegtran-crop-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_CROP} -DFILE=testoutcrop.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(tjunittest-static tjunittest-static) add_test(tjunittest-static-alloc tjunittest-static -alloc) add_test(tjunittest-static-yuv tjunittest-static -yuv) add_test(cjpeg-static-int cjpeg-static -dct int -outfile testoutint.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-static-int-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint.jpg testoutint.jpg) +add_test(cjpeg-static-int-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_INT} -DFILE=testoutint.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(cjpeg-static-fast cjpeg-static -dct fast -opt -outfile testoutfst.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-static-fast-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst.jpg testoutfst.jpg) +add_test(cjpeg-static-fast-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_FAST} -DFILE=testoutfst.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(cjpeg-static-fast-100 cjpeg-static -dct fast -quality 100 -opt -outfile testoutfst100.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-static-fast-100-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst100.jpg testoutfst100.jpg) +add_test(cjpeg-static-fast-100-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_FAST_100} -DFILE=testoutfst100.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(cjpeg-static-float cjpeg-static -dct float -outfile testoutflt.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) if(WITH_SIMD) -add_test(cjpeg-static-float-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgflt.jpg testoutflt.jpg) +add_test(cjpeg-static-float-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_FLOAT} -DFILE=testoutflt.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) else() -add_test(cjpeg-static-float-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgflt-nosimd.jpg testoutflt.jpg) +add_test(cjpeg-static-float-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_FLOAT_NOSIMD} -DFILE=testoutflt.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) endif() add_test(cjpeg-static-int-gray cjpeg-static -dct int -grayscale -outfile testoutgray.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-static-int-gray-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimggray.jpg testoutgray.jpg) +add_test(cjpeg-static-int-gray-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_INT_GRAY} -DFILE=testoutgray.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(djpeg-static-int djpeg-static -dct int -fast -ppm -outfile testoutint.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-static-int-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint.ppm testoutint.ppm) +add_test(djpeg-static-int-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_INT} -DFILE=testoutint.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(djpeg-static-fast djpeg-static -dct fast -ppm -outfile testoutfst.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-static-fast-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst.ppm testoutfst.ppm) +add_test(djpeg-static-fast-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_FAST} -DFILE=testoutfst.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(djpeg-static-float djpeg-static -dct float -ppm -outfile testoutflt.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) if(WITH_SIMD) -add_test(djpeg-static-float-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgflt.ppm testoutflt.ppm) +add_test(djpeg-static-float-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_FLOAT} -DFILE=testoutflt.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) else() -add_test(djpeg-static-float-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm testoutflt.ppm) +add_test(djpeg-static-float-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_FLOAT_NOSIMD} -DFILE=testoutflt.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) endif() -add_test(djpeg-static-int-1_2 djpeg-static -dct int -scale 1/2 -ppm -outfile testoutint1_2.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-static-int-1_2-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint1_2.ppm testoutint1_2.ppm) +foreach(scale 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8) +string(REGEX REPLACE "_" "/" scalearg ${scale}) +add_test(djpeg-static-int-${scale} djpeg-static -dct int -nosmooth -scale ${scalearg} -ppm -outfile testoutint${scale}.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) +add_test(djpeg-static-int-${scale}-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_INT_${scale}} -DFILE=testoutint${scale}.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) +endforeach() add_test(djpeg-static-fast-1_2 djpeg-static -dct fast -scale 1/2 -ppm -outfile testoutfst1_2.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-static-fast-1_2-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst1_2.ppm testoutfst1_2.ppm) -add_test(djpeg-static-int-1_4 djpeg-static -dct int -scale 1/4 -ppm -outfile testoutint1_4.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-static-int-1_4-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint1_4.ppm testoutint1_4.ppm) -add_test(djpeg-static-fast-1_4 djpeg-static -dct fast -scale 1/4 -ppm -outfile testoutfst1_4.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-static-fast-1_4-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst1_4.ppm testoutfst1_4.ppm) -add_test(djpeg-static-int-1_8 djpeg-static -dct int -scale 1/8 -ppm -outfile testoutint1_8.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-static-int-1_8-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint1_8.ppm testoutint1_8.ppm) -add_test(djpeg-static-fast-1_8 djpeg-static -dct fast -scale 1/8 -ppm -outfile testoutfst1_8.ppm ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-static-fast-1_8-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgfst1_8.ppm testoutfst1_8.ppm) +add_test(djpeg-static-fast-1_2-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_FAST_1_2} -DFILE=testoutfst1_2.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(djpeg-static-256 djpeg-static -dct int -bmp -colors 256 -outfile testout.bmp ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(djpeg-static-256-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimg.bmp testout.bmp) +add_test(djpeg-static-256-cmp ${CMAKE_COMMAND} -DMD5=${MD5_BMP_256} -DFILE=testout.bmp -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(cjpeg-static-prog cjpeg-static -dct int -progressive -outfile testoutp.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-static-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgp.jpg testoutp.jpg) +add_test(cjpeg-static-prog-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_PROG} -DFILE=testoutp.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(jpegtran-static-prog jpegtran-static -outfile testoutt.jpg testoutp.jpg) -add_test(jpegtran-static-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint.jpg testoutt.jpg) +add_test(jpegtran-static-prog-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_INT} -DFILE=testoutt.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) if(WITH_ARITH_ENC) add_test(cjpeg-static-ari cjpeg-static -dct int -arithmetic -outfile testoutari.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) -add_test(cjpeg-static-ari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg testoutari.jpg) +add_test(cjpeg-static-ari-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_ARI} -DFILE=testoutari.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake ) add_test(jpegtran-static-toari jpegtran-static -arithmetic -outfile testouta.jpg ${CMAKE_SOURCE_DIR}/testimages/testimgint.jpg) -add_test(jpegtran-static-toari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg testouta.jpg) +add_test(jpegtran-static-toari-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_ARI} -DFILE=testouta.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) +add_test(cjpeg-static-prog-ari cjpeg-static -dct int -progressive -arithmetic -sample 1x1 -outfile testoutpa.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.ppm) +add_test(cjpeg-static-prog-ari-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_PROG_ARI} -DFILE=testoutpa.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake ) endif() if(WITH_ARITH_DEC) add_test(djpeg-static-ari djpeg-static -dct int -fast -ppm -outfile testoutari.ppm ${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg) -add_test(djpeg-static-ari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgari.ppm testoutari.ppm) +add_test(djpeg-static-ari-cmp ${CMAKE_COMMAND} -DMD5=${MD5_PPM_ARI} -DFILE=testoutari.ppm -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_test(jpegtran-static-fromari jpegtran-static -outfile testouta.jpg ${CMAKE_SOURCE_DIR}/testimages/testimgari.jpg) -add_test(jpegtran-static-fromari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgint.jpg testouta.jpg) +add_test(jpegtran-static-fromari-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_INT} -DFILE=testouta.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) endif() add_test(jpegtran-static-crop jpegtran-static -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg ${CMAKE_SOURCE_DIR}/testimages/testorig.jpg) -add_test(jpegtran-static-crop-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimages/testimgcrop.jpg testoutcrop.jpg) +add_test(jpegtran-static-crop-cmp ${CMAKE_COMMAND} -DMD5=${MD5_JPEG_CROP} -DFILE=testoutcrop.jpg -P ${CMAKE_SOURCE_DIR}/cmakescripts/md5cmp.cmake) add_custom_target(testclean COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmakescripts/testclean.cmake) @@ -380,18 +444,18 @@ add_custom_target(testclean COMMAND ${CMAKE_COMMAND} -P if(MSVC) set(INST_PLATFORM "Visual C++") set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-vc) - set(INST_DIR ${CMAKE_PROJECT_NAME}) + set(INST_REG_NAME ${CMAKE_PROJECT_NAME}) elseif(MINGW) set(INST_PLATFORM GCC) set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-gcc) - set(INST_DIR ${CMAKE_PROJECT_NAME}-gcc) + set(INST_REG_NAME ${CMAKE_PROJECT_NAME}-gcc) set(INST_DEFS -DGCC) endif() if(64BIT) set(INST_PLATFORM "${INST_PLATFORM} 64-bit") set(INST_NAME ${INST_NAME}64) - set(INST_DIR ${INST_DIR}64) + set(INST_REG_NAME ${INST_DIR}64) set(INST_DEFS ${INST_DEFS} -DWIN64) endif() @@ -405,12 +469,17 @@ else() set(INST_DEFS ${INST_DEFS} "-DBUILDDIR=") endif() +STRING(REGEX REPLACE "/" "\\\\" INST_DIR ${CMAKE_INSTALL_PREFIX}) + configure_file(release/libjpeg-turbo.nsi.in libjpeg-turbo.nsi @ONLY) +if(WITH_JAVA) + set(JAVA_DEPEND java) +endif() add_custom_target(installer makensis -nocd ${INST_DEFS} libjpeg-turbo.nsi DEPENDS jpeg jpeg-static turbojpeg turbojpeg-static rdjpgcom wrjpgcom - cjpeg djpeg jpegtran tjbench + cjpeg djpeg jpegtran tjbench ${JAVA_DEPEND} SOURCES libjpeg-turbo.nsi) install(TARGETS jpeg-static turbojpeg turbojpeg-static rdjpgcom wrjpgcom tjbench diff --git a/ChangeLog.txt b/ChangeLog.txt index 2f1242a..3ec6c18 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,3 +1,140 @@ +1.3.1 +===== + +[1] On Un*x systems, 'make install' now installs the libjpeg-turbo libraries +into /opt/libjpeg-turbo/lib32 by default on any 32-bit system, not just x86, +and into /opt/libjpeg-turbo/lib64 by default on any 64-bit system, not just +x86-64. You can override this by overriding either the 'prefix' or 'libdir' +configure variables. + +[2] The Windows installer now places a copy of the TurboJPEG DLLs in the same +directory as the rest of the libjpeg-turbo binaries. This was mainly done +to support TurboVNC 1.3, which bundles the DLLs in its Windows installation. +When using a 32-bit version of CMake on 64-bit Windows, it is impossible to +access the c:\WINDOWS\system32 directory, which made it impossible for the +TurboVNC build scripts to bundle the 64-bit TurboJPEG DLL. + +[3] Fixed a bug whereby attempting to encode a progressive JPEG with arithmetic +entropy coding (by passing arguments of -progressive -arithmetic to cjpeg or +jpegtran, for instance) would result in an error, "Requested feature was +omitted at compile time". + +[4] Fixed a couple of issues whereby malformed JPEG images would cause +libjpeg-turbo to use uninitialized memory during decompression. + +[5] Fixed an error ("Buffer passed to JPEG library is too small") that occurred +when calling the TurboJPEG YUV encoding function with a very small (< 5x5) +source image, and added a unit test to check for this error. + +[6] The Java classes should now build properly under Visual Studio 2010 and +later. + +[7] Fixed an issue that prevented SRPMs generated using the in-tree packaging +tools from being rebuilt on certain newer Linux distributions. + +[8] Numerous minor fixes to eliminate compilation and build/packaging system +warnings, fix cosmetic issues, improve documentation clarity, and other general +source cleanup. + + +1.3.0 +===== + +[1] 'make test' now works properly on FreeBSD, and it no longer requires the +md5sum executable to be present on other Un*x platforms. + +[2] Overhauled the packaging system: +-- To avoid conflict with vendor-supplied libjpeg-turbo packages, the +official RPMs and DEBs for libjpeg-turbo have been renamed to +"libjpeg-turbo-official". +-- The TurboJPEG libraries are now located under /opt/libjpeg-turbo in the +official Linux and Mac packages, to avoid conflict with vendor-supplied +packages and also to streamline the packaging system. +-- Release packages are now created with the directory structure defined +by the configure variables "prefix", "bindir", "libdir", etc. (Un*x) or by the +CMAKE_INSTALL_PREFIX variable (Windows.) The exception is that the docs are +always located under the system default documentation directory on Un*x and Mac +systems, and on Windows, the TurboJPEG DLL is always located in the Windows +system directory. +-- To avoid confusion, official libjpeg-turbo packages on Linux/Unix platforms +(except for Mac) will always install the 32-bit libraries in +/opt/libjpeg-turbo/lib32 and the 64-bit libraries in /opt/libjpeg-turbo/lib64. +-- Fixed an issue whereby, in some cases, the libjpeg-turbo executables on Un*x +systems were not properly linking with the shared libraries installed by the +same package. +-- Fixed an issue whereby building the "installer" target on Windows when +WITH_JAVA=1 would fail if the TurboJPEG JAR had not been previously built. +-- Building the "install" target on Windows now installs files into the same +places that the installer does. + +[3] Fixed a Huffman encoder bug that prevented I/O suspension from working +properly. + + +1.2.90 (1.3 beta1) +================== + +[1] Added support for additional scaling factors (3/8, 5/8, 3/4, 7/8, 9/8, 5/4, +11/8, 3/2, 13/8, 7/4, 15/8, and 2) when decompressing. Note that the IDCT will +not be SIMD-accelerated when using any of these new scaling factors. + +[2] The TurboJPEG dynamic library is now versioned. It was not strictly +necessary to do so, because TurboJPEG uses versioned symbols, and if a function +changes in an ABI-incompatible way, that function is renamed and a legacy +function is provided to maintain backward compatibility. However, certain +Linux distro maintainers have a policy against accepting any library that isn't +versioned. + +[3] Extended the TurboJPEG Java API so that it can be used to compress a JPEG +image from and decompress a JPEG image to an arbitrary position in a large +image buffer. + +[4] The tjDecompressToYUV() function now supports the TJFLAG_FASTDCT flag. + +[5] The 32-bit supplementary package for amd64 Debian systems now provides +symlinks in /usr/lib/i386-linux-gnu for the TurboJPEG libraries in /usr/lib32. +This allows those libraries to be used on MultiArch-compatible systems (such as +Ubuntu 11 and later) without setting the linker path. + +[6] The TurboJPEG Java wrapper should now find the JNI library on Mac systems +without having to pass -Djava.library.path=/usr/lib to java. + +[7] TJBench has been ported to Java to provide a convenient way of validating +the performance of the TurboJPEG Java API. It can be run with +'java -cp turbojpeg.jar TJBench'. + +[8] cjpeg can now be used to generate JPEG files with the RGB colorspace +(feature ported from jpeg-8d.) + +[9] The width and height in the -crop argument passed to jpegtran can now be +suffixed with "f" to indicate that, when the upper left corner of the cropping +region is automatically moved to the nearest iMCU boundary, the bottom right +corner should be moved by the same amount. In other words, this feature causes +jpegtran to strictly honor the specified width/height rather than the specified +bottom right corner (feature ported from jpeg-8d.) + +[10] JPEG files using the RGB colorspace can now be decompressed into grayscale +images (feature ported from jpeg-8d.) + +[11] Fixed a regression caused by 1.2.1[7] whereby the build would fail with +multiple "Mismatch in operand sizes" errors when attempting to build the x86 +SIMD code with NASM 0.98. + +[12] The in-memory source/destination managers (jpeg_mem_src() and +jpeg_mem_dest()) are now included by default when building libjpeg-turbo with +libjpeg v6b or v7 emulation, so that programs can take advantage of these +functions without requiring the use of the backward-incompatible libjpeg v8 +ABI. The "age number" of the libjpeg-turbo library on Un*x systems has been +incremented by 1 to reflect this. You can disable this feature with a +configure/CMake switch in order to retain strict API/ABI compatibility with the +libjpeg v6b or v7 API/ABI (or with previous versions of libjpeg-turbo.) See +README-turbo.txt for more details. + +[13] Added ARM v7s architecture to libjpeg.a and libturbojpeg.a in the official +libjpeg-turbo binary package for OS X, so that those libraries can be used to +build applications that leverage the faster CPUs in the iPhone 5 and iPad 4. + + 1.2.1 ===== @@ -77,8 +214,8 @@ are in violation of the spec, other JPEG implementations handle them correctly. [7] Added ARM v6 and ARM v7 architectures to libjpeg.a and libturbojpeg.a in -the official OS X distribution package, so that those libraries can be used to -build both OS X and iOS applications. +the official libjpeg-turbo binary package for OS X, so that those libraries can +be used to build both OS X and iOS applications. 1.1.90 (1.2 beta1) @@ -124,7 +261,7 @@ NEON instructions. TurboJPEG 1.2 API uses pixel formats to define the size and component order of the uncompressed source/destination images, and it includes a more efficient version of TJBUFSIZE() that computes a worst-case JPEG size based on the level -of chrominance subsampling. The refactored implementation of TurboJPEG/OSS +of chrominance subsampling. The refactored implementation of the TurboJPEG API now uses the libjpeg memory source and destination managers, which allows the TurboJPEG compressor to grow the JPEG buffer as necessary. @@ -200,12 +337,12 @@ and libjpeg-turbo should now produce identical output to libjpeg v6b in all cases. [2] Despite the above, the fast integer forward DCT still degrades somewhat for -JPEG qualities greater than 95, so TurboJPEG/OSS will now automatically use the -slow integer forward DCT when generating JPEG images of quality 96 or greater. -This reduces compression performance by as much as 15% for these high-quality -images but is necessary to ensure that the images are perceptually lossless. -It also ensures that the library can avoid the performance pitfall created by -[1]. +JPEG qualities greater than 95, so the TurboJPEG wrapper will now automatically +use the slow integer forward DCT when generating JPEG images of quality 96 or +greater. This reduces compression performance by as much as 15% for these +high-quality images but is necessary to ensure that the images are perceptually +lossless. It also ensures that the library can avoid the performance pitfall +created by [1]. [3] Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler. @@ -278,7 +415,7 @@ INCOMPLETE_TYPES_BROKEN macro should be defined. [1] 2983700: Further FreeBSD build tweaks (no longer necessary to specify --host when configuring on a 64-bit system) -[2] Created sym. links in the Unix/Linux packages so that the TurboJPEG +[2] Created symlinks in the Unix/Linux packages so that the TurboJPEG include file can always be found in /opt/libjpeg-turbo/include, the 32-bit static libraries can always be found in /opt/libjpeg-turbo/lib32, and the 64-bit static libraries can always be found in /opt/libjpeg-turbo/lib64. diff --git a/Makefile.am b/Makefile.am index aa2426b..79594bf 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,9 +1,16 @@ -lib_LTLIBRARIES = libjpeg.la libturbojpeg.la -libjpeg_la_LDFLAGS = -version-info ${SO_MAJOR_VERSION}:${SO_MINOR_VERSION} -no-undefined -libturbojpeg_la_LDFLAGS = -avoid-version -no-undefined -include_HEADERS = jerror.h jmorecfg.h jpeglib.h turbojpeg.h +lib_LTLIBRARIES = libjpeg.la +libjpeg_la_LDFLAGS = -version-info ${LIBTOOL_CURRENT}:${SO_MINOR_VERSION}:${SO_AGE} -no-undefined +include_HEADERS = jerror.h jmorecfg.h jpeglib.h + +if WITH_TURBOJPEG +lib_LTLIBRARIES += libturbojpeg.la +libturbojpeg_la_LDFLAGS = -version-info 0:0 -no-undefined +include_HEADERS += turbojpeg.h +endif + nodist_include_HEADERS = jconfig.h + HDRS = jchuff.h jdct.h jdhuff.h jerror.h jinclude.h jmemsys.h jmorecfg.h \ jpegint.h jpeglib.h jversion.h jsimd.h jsimddct.h jpegcomp.h @@ -17,28 +24,26 @@ libjpeg_la_SOURCES = $(HDRS) jcapimin.c jcapistd.c jccoefct.c jccolor.c \ jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c if WITH_ARITH - libjpeg_la_SOURCES += jaricom.c - endif if WITH_ARITH_ENC - libjpeg_la_SOURCES += jcarith.c - endif if WITH_ARITH_DEC - libjpeg_la_SOURCES += jdarith.c - endif -libturbojpeg_la_SOURCES = $(libjpeg_la_SOURCES) turbojpeg.c turbojpeg.h \ - transupp.c transupp.h jdatadst-tj.c jdatasrc-tj.c SUBDIRS = java + +if WITH_TURBOJPEG + +libturbojpeg_la_SOURCES = $(libjpeg_la_SOURCES) turbojpeg.c turbojpeg.h \ + transupp.c transupp.h jdatadst-tj.c jdatasrc-tj.c + if WITH_JAVA libturbojpeg_la_SOURCES += turbojpeg-jni.c @@ -54,12 +59,17 @@ endif libturbojpeg_la_SOURCES += $(TJMAPFILE) if VERSION_SCRIPT - libturbojpeg_la_LDFLAGS += $(VERSION_SCRIPT_FLAG)$(srcdir)/$(TJMAPFILE) -libjpeg_la_LDFLAGS += $(VERSION_SCRIPT_FLAG)libjpeg.map +endif endif + +if VERSION_SCRIPT +libjpeg_la_LDFLAGS += $(VERSION_SCRIPT_FLAG)libjpeg.map +endif + + if WITH_SIMD SUBDIRS += simd @@ -72,8 +82,16 @@ libjpeg_la_SOURCES += jsimd_none.c endif -bin_PROGRAMS = cjpeg djpeg jpegtran rdjpgcom wrjpgcom tjbench -noinst_PROGRAMS = tjunittest jcstest + +bin_PROGRAMS = cjpeg djpeg jpegtran rdjpgcom wrjpgcom +noinst_PROGRAMS = jcstest + + +if WITH_TURBOJPEG + +bin_PROGRAMS += tjbench + +noinst_PROGRAMS += tjunittest tjbench_SOURCES = tjbench.c bmp.h bmp.c tjutil.h tjutil.c rdbmp.c rdppm.c \ wrbmp.c wrppm.c @@ -86,6 +104,9 @@ tjunittest_SOURCES = tjunittest.c tjutil.h tjutil.c tjunittest_LDADD = libturbojpeg.la +endif + + cjpeg_SOURCES = cdjpeg.h cderror.h cdjpeg.c cjpeg.c rdbmp.c rdgif.c \ rdppm.c rdswitch.c rdtarga.c @@ -120,8 +141,8 @@ jcstest_LDADD = libjpeg.la dist_man1_MANS = cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1 -DOCS= install.txt coderules.txt filelist.txt jconfig.txt change.log \ - rdrle.c wrrle.c BUILDING.txt ChangeLog.txt +DOCS= coderules.txt jconfig.txt change.log rdrle.c wrrle.c BUILDING.txt \ + ChangeLog.txt docdir = $(datadir)/doc dist_doc_DATA = README README-turbo.txt libjpeg.txt structure.txt usage.txt \ @@ -139,7 +160,43 @@ dist-hook: rm -rf `find $(distdir) -name .svn` +SUBDIRS += md5 + +MD5_JPEG_INT = 9a68f56bc76e466aa7e52f415d0f4a5f +MD5_JPEG_FAST = 0e1502e7fa421835e376a314fac2a39f +MD5_JPEG_FAST_100 = 7bf72a8e741d64eecb960c97323af77c +MD5_JPEG_FLOAT = d1623885ffafcd40c684af09e3d65cd5 +MD5_JPEG_FLOAT_NOSIMD = fb4884c35f8273f498cb32879de5c455 +MD5_JPEG_INT_GRAY = 72b51f894b8f4a10b3ee3066770aa38d +MD5_PPM_INT = d1ed0d11f076b842525271647716aeb8 +MD5_PPM_FAST = 048298a2d2410261c0533cb97bcfef23 +MD5_PPM_FLOAT = 7f5b446ee36b2630e06785b8d42af15f +MD5_PPM_FLOAT_NOSIMD = 64072f1dbdc5b3a187777788604971a5 +MD5_PPM_INT_2_1 = 9f9de8c0612f8d06869b960b05abf9c9 +MD5_PPM_INT_15_8 = b6875bc070720b899566cc06459b63b7 +MD5_PPM_INT_7_4 = 06a177eae05f164fac57f7a2c346ee87 +MD5_PPM_INT_13_8 = bc3452573c8152f6ae552939ee19f82f +MD5_PPM_INT_3_2 = f5a8b88a8a7f96016f04d259cf82ed67 +MD5_PPM_INT_11_8 = d8cc73c0aaacd4556569b59437ba00a5 +MD5_PPM_INT_5_4 = 32775dd9ad2ab90f4c5b219b53e0c86c +MD5_PPM_INT_9_8 = d25e61bc7eac0002f5b393aa223747b6 +MD5_PPM_INT_7_8 = ddb564b7c74a09494016d6cd7502a946 +MD5_PPM_INT_3_4 = 8ed8e68808c3fbc4ea764fc9d2968646 +MD5_PPM_INT_5_8 = a3363274999da2366a024efae6d16c9b +MD5_PPM_INT_1_2 = e692a315cea26b988c8e8b29a5dbcd81 +MD5_PPM_INT_3_8 = 79eca9175652ced755155c90e785a996 +MD5_PPM_INT_1_4 = 79cd778f8bf1a117690052cacdd54eca +MD5_PPM_INT_1_8 = 391b3d4aca640c8567d6f8745eb2142f +MD5_PPM_FAST_1_2 = f30bcf6d32ccd44cbdd9aeaacbd9454f +MD5_BMP_256 = 4980185e3776e89bd931736e1cddeee6 +MD5_JPEG_ARI = e986fb0a637a8d833d96e8a6d6d84ea1 +MD5_PPM_ARI = 72b59a99bcf1de24c5b27d151bde2437 +MD5_JPEG_PROG = 1c4afddc05c0a43489ee54438a482d92 +MD5_JPEG_PROG_ARI = 0a8f1c8f66e113c3cf635df0a475a617 +MD5_JPEG_CROP = b4197f377e621c4e9b1d20471432610d + test: testclean all +if WITH_TURBOJPEG if WITH_JAVA $(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest $(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -bi @@ -149,62 +206,85 @@ endif ./tjunittest ./tjunittest -alloc ./tjunittest -yuv +endif ./cjpeg -dct int -outfile testoutint.jpg $(srcdir)/testimages/testorig.ppm - cmp $(srcdir)/testimages/testimgint.jpg testoutint.jpg + md5/md5cmp $(MD5_JPEG_INT) testoutint.jpg ./cjpeg -dct fast -opt -outfile testoutfst.jpg $(srcdir)/testimages/testorig.ppm - cmp $(srcdir)/testimages/testimgfst.jpg testoutfst.jpg + md5/md5cmp $(MD5_JPEG_FAST) testoutfst.jpg ./cjpeg -dct fast -quality 100 -opt -outfile testoutfst100.jpg $(srcdir)/testimages/testorig.ppm - cmp $(srcdir)/testimages/testimgfst100.jpg testoutfst100.jpg + md5/md5cmp $(MD5_JPEG_FAST_100) testoutfst100.jpg ./cjpeg -dct float -outfile testoutflt.jpg $(srcdir)/testimages/testorig.ppm if WITH_SSE_FLOAT_DCT - cmp $(srcdir)/testimages/testimgflt.jpg testoutflt.jpg + md5/md5cmp $(MD5_JPEG_FLOAT) testoutflt.jpg else - cmp $(srcdir)/testimages/testimgflt-nosimd.jpg testoutflt.jpg + md5/md5cmp $(MD5_JPEG_FLOAT_NOSIMD) testoutflt.jpg endif ./cjpeg -dct int -grayscale -outfile testoutgray.jpg $(srcdir)/testimages/testorig.ppm - cmp $(srcdir)/testimages/testimggray.jpg testoutgray.jpg + md5/md5cmp $(MD5_JPEG_INT_GRAY) testoutgray.jpg ./djpeg -dct int -fast -ppm -outfile testoutint.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgint.ppm testoutint.ppm + md5/md5cmp $(MD5_PPM_INT) testoutint.ppm ./djpeg -dct fast -ppm -outfile testoutfst.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgfst.ppm testoutfst.ppm + md5/md5cmp $(MD5_PPM_FAST) testoutfst.ppm ./djpeg -dct float -ppm -outfile testoutflt.ppm $(srcdir)/testimages/testorig.jpg if WITH_SSE_FLOAT_DCT - cmp $(srcdir)/testimages/testimgflt.ppm testoutflt.ppm + md5/md5cmp $(MD5_PPM_FLOAT) testoutflt.ppm else - cmp $(srcdir)/testimages/testorig.ppm testoutflt.ppm + md5/md5cmp $(MD5_PPM_FLOAT_NOSIMD) testoutflt.ppm endif - ./djpeg -dct int -scale 1/2 -ppm -outfile testoutint1_2.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgint1_2.ppm testoutint1_2.ppm + ./djpeg -dct int -nosmooth -scale 2/1 -ppm -outfile testoutint2_1.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_2_1) testoutint2_1.ppm; + ./djpeg -dct int -nosmooth -scale 15/8 -ppm -outfile testoutint15_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_15_8) testoutint15_8.ppm; + ./djpeg -dct int -nosmooth -scale 7/4 -ppm -outfile testoutint7_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_7_4) testoutint7_4.ppm; + ./djpeg -dct int -nosmooth -scale 13/8 -ppm -outfile testoutint13_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_13_8) testoutint13_8.ppm; + ./djpeg -dct int -nosmooth -scale 3/2 -ppm -outfile testoutint3_2.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_3_2) testoutint3_2.ppm; + ./djpeg -dct int -nosmooth -scale 11/8 -ppm -outfile testoutint11_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_11_8) testoutint11_8.ppm; + ./djpeg -dct int -nosmooth -scale 5/4 -ppm -outfile testoutint5_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_5_4) testoutint5_4.ppm; + ./djpeg -dct int -nosmooth -scale 9/8 -ppm -outfile testoutint9_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_9_8) testoutint9_8.ppm; + ./djpeg -dct int -nosmooth -scale 7/8 -ppm -outfile testoutint7_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_7_8) testoutint7_8.ppm; + ./djpeg -dct int -nosmooth -scale 3/4 -ppm -outfile testoutint3_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_3_4) testoutint3_4.ppm; + ./djpeg -dct int -nosmooth -scale 5/8 -ppm -outfile testoutint5_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_5_8) testoutint5_8.ppm; + ./djpeg -dct int -nosmooth -scale 1/2 -ppm -outfile testoutint1_2.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_1_2) testoutint1_2.ppm; + ./djpeg -dct int -nosmooth -scale 3/8 -ppm -outfile testoutint3_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_3_8) testoutint3_8.ppm; + ./djpeg -dct int -nosmooth -scale 1/4 -ppm -outfile testoutint1_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_1_4) testoutint1_4.ppm; + ./djpeg -dct int -nosmooth -scale 1/8 -ppm -outfile testoutint1_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_1_8) testoutint1_8.ppm; ./djpeg -dct fast -scale 1/2 -ppm -outfile testoutfst1_2.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgfst1_2.ppm testoutfst1_2.ppm - ./djpeg -dct int -scale 1/4 -ppm -outfile testoutint1_4.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgint1_4.ppm testoutint1_4.ppm - ./djpeg -dct fast -scale 1/4 -ppm -outfile testoutfst1_4.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgfst1_4.ppm testoutfst1_4.ppm - ./djpeg -dct int -scale 1/8 -ppm -outfile testoutint1_8.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgint1_8.ppm testoutint1_8.ppm - ./djpeg -dct fast -scale 1/8 -ppm -outfile testoutfst1_8.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgfst1_8.ppm testoutfst1_8.ppm - ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimg.bmp testout.bmp + md5/md5cmp $(MD5_PPM_FAST_1_2) testoutfst1_2.ppm + ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testimages/testorig.jpg + md5/md5cmp $(MD5_BMP_256) testout.bmp if WITH_ARITH_ENC ./cjpeg -dct int -arithmetic -outfile testoutari.jpg $(srcdir)/testimages/testorig.ppm - cmp $(srcdir)/testimages/testimgari.jpg testoutari.jpg + md5/md5cmp $(MD5_JPEG_ARI) testoutari.jpg ./jpegtran -arithmetic -outfile testouta.jpg $(srcdir)/testimages/testimgint.jpg - cmp $(srcdir)/testimages/testimgari.jpg testouta.jpg + md5/md5cmp $(MD5_JPEG_ARI) testouta.jpg + ./cjpeg -dct int -progressive -arithmetic -sample 1x1 -outfile testoutpa.jpg $(srcdir)/testimages/testorig.ppm + md5/md5cmp $(MD5_JPEG_PROG_ARI) testoutpa.jpg endif if WITH_ARITH_DEC ./djpeg -dct int -fast -ppm -outfile testoutari.ppm $(srcdir)/testimages/testimgari.jpg - cmp $(srcdir)/testimages/testimgari.ppm testoutari.ppm + md5/md5cmp $(MD5_PPM_ARI) testoutari.ppm ./jpegtran -outfile testouta.jpg $(srcdir)/testimages/testimgari.jpg - cmp $(srcdir)/testimages/testimgint.jpg testouta.jpg + md5/md5cmp $(MD5_JPEG_INT) testouta.jpg endif ./cjpeg -dct int -progressive -outfile testoutp.jpg $(srcdir)/testimages/testorig.ppm - cmp $(srcdir)/testimages/testimgp.jpg testoutp.jpg + md5/md5cmp $(MD5_JPEG_PROG) testoutp.jpg ./jpegtran -outfile testoutt.jpg testoutp.jpg - cmp $(srcdir)/testimages/testimgint.jpg testoutt.jpg + md5/md5cmp $(MD5_JPEG_INT) testoutt.jpg ./jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgcrop.jpg testoutcrop.jpg + md5/md5cmp $(MD5_JPEG_CROP) testoutcrop.jpg testclean: @@ -239,93 +319,87 @@ testclean: tjtest: sh ./tjbenchtest if WITH_JAVA - sh ./tjexampletest + sh ./tjbenchtest.java endif -if X86_64 - -install-exec-hook: - __PREFIX=`echo ${prefix} | sed -e 's@\/*$$@@'`; \ - if [ "$$__PREFIX" = "/opt/libjpeg-turbo" ]; then \ - cd $(DESTDIR)/${prefix}; \ - if [ -d lib -a ! -d lib64 -a ! -h lib64 ]; then \ - $(LN_S) lib lib64; \ - fi \ - fi +pkgscripts/libjpeg-turbo.spec: pkgscripts/libjpeg-turbo.spec.tmpl + cat pkgscripts/libjpeg-turbo.spec.tmpl | sed s@%{__prefix}@$(prefix)@g | \ + sed s@%{__bindir}@$(bindir)@g | sed s@%{__datadir}@$(datadir)@g | \ + sed s@%{__docdir}@$(docdir)@g | sed s@%{__includedir}@$(includedir)@g | \ + sed s@%{__libdir}@$(libdir)@g | sed s@%{__mandir}@$(mandir)@g \ + > pkgscripts/libjpeg-turbo.spec -else - -install-exec-hook: - __PREFIX=`echo ${prefix} | sed -e 's@\/*$$@@'`; \ - if [ "$$__PREFIX" = "/opt/libjpeg-turbo" ]; then \ - cd $(DESTDIR)/${prefix}; \ - if [ -d lib -a ! -d lib32 -a ! -h lib32 ]; then \ - $(LN_S) lib lib32; \ - fi \ - fi - -endif - -rpm: all +rpm: all pkgscripts/libjpeg-turbo.spec TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \ mkdir -p $$TMPDIR/RPMS; \ ln -fs `pwd` $$TMPDIR/BUILD; \ - rm -f ${PACKAGE_NAME}-${VERSION}.${RPMARCH}.rpm; \ + rm -f ${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \ rpmbuild -bb --define "_blddir $$TMPDIR/buildroot" \ --define "_topdir $$TMPDIR" \ --target ${RPMARCH} pkgscripts/libjpeg-turbo.spec; \ - cp $$TMPDIR/RPMS/${RPMARCH}/${PACKAGE_NAME}-${VERSION}-${BUILD}.${RPMARCH}.rpm \ - ${PACKAGE_NAME}-${VERSION}.${RPMARCH}.rpm; \ + cp $$TMPDIR/RPMS/${RPMARCH}/${PKGNAME}-${VERSION}-${BUILD}.${RPMARCH}.rpm \ + ${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \ rm -rf $$TMPDIR -srpm: dist-gzip +srpm: dist-gzip pkgscripts/libjpeg-turbo.spec TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \ mkdir -p $$TMPDIR/RPMS; \ mkdir -p $$TMPDIR/SRPMS; \ mkdir -p $$TMPDIR/BUILD; \ mkdir -p $$TMPDIR/SOURCES; \ mkdir -p $$TMPDIR/SPECS; \ - rm -f ${PACKAGE_NAME}-${VERSION}.src.rpm; \ + rm -f ${PKGNAME}-${VERSION}.src.rpm; \ cp ${PACKAGE_NAME}-${VERSION}.tar.gz $$TMPDIR/SOURCES; \ cat pkgscripts/libjpeg-turbo.spec | sed s/%{_blddir}/%{_tmppath}/g \ | sed s/#--\>//g \ > $$TMPDIR/SPECS/libjpeg-turbo.spec; \ rpmbuild -bs --define "_topdir $$TMPDIR" $$TMPDIR/SPECS/libjpeg-turbo.spec; \ - cp $$TMPDIR/SRPMS/${PACKAGE_NAME}-${VERSION}-${BUILD}.src.rpm \ - ${PACKAGE_NAME}-${VERSION}.src.rpm; \ + cp $$TMPDIR/SRPMS/${PKGNAME}-${VERSION}-${BUILD}.src.rpm \ + ${PKGNAME}-${VERSION}.src.rpm; \ rm -rf $$TMPDIR -deb: all +pkgscripts/makedpkg: pkgscripts/makedpkg.tmpl + cat pkgscripts/makedpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \ + sed s@%{__docdir}@$(docdir)@g | sed s@%{__libdir}@$(libdir)@g \ + > pkgscripts/makedpkg + +deb: all pkgscripts/makedpkg sh pkgscripts/makedpkg +pkgscripts/uninstall: pkgscripts/uninstall.tmpl + cat pkgscripts/uninstall.tmpl | sed s@%{__prefix}@$(prefix)@g | \ + sed s@%{__bindir}@$(bindir)@g | sed s@%{__datadir}@$(datadir)@g | \ + sed s@%{__includedir}@$(includedir)@g | sed s@%{__libdir}@$(libdir)@g | \ + sed s@%{__mandir}@$(mandir)@g > pkgscripts/uninstall + +pkgscripts/makemacpkg: pkgscripts/makemacpkg.tmpl + cat pkgscripts/makemacpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \ + sed s@%{__bindir}@$(bindir)@g | sed s@%{__docdir}@$(docdir)@g | \ + sed s@%{__libdir}@$(libdir)@g > pkgscripts/makemacpkg + if X86_64 -udmg: all +udmg: all pkgscripts/makemacpkg pkgscripts/uninstall sh pkgscripts/makemacpkg -build32 ${BUILDDIR32} -iosdmg: all - sh pkgscripts/makemacpkg -build32 ${BUILDDIR32} -buildarmv6 ${BUILDDIRARMV6} -buildarmv7 ${BUILDDIRARMV7} +iosdmg: all pkgscripts/makemacpkg pkgscripts/uninstall + sh pkgscripts/makemacpkg -build32 ${BUILDDIR32} -buildarmv6 ${BUILDDIRARMV6} -buildarmv7 ${BUILDDIRARMV7} -buildarmv7s ${BUILDDIRARMV7S} else -iosdmg: all - sh pkgscripts/makemacpkg -buildarmv6 ${BUILDDIRARMV6} -buildarmv7 ${BUILDDIRARMV7} +iosdmg: all pkgscripts/makemacpkg pkgscripts/uninstall + sh pkgscripts/makemacpkg -buildarmv6 ${BUILDDIRARMV6} -buildarmv7 ${BUILDDIRARMV7} -buildarmv7s ${BUILDDIRARMV7S} endif -dmg: all +dmg: all pkgscripts/makemacpkg pkgscripts/uninstall sh pkgscripts/makemacpkg -if X86_64 - -csunpkg: all - sh pkgscripts/makesunpkg combined ${BUILDDIR32} - -endif - -sunpkg: all - sh pkgscripts/makesunpkg +pkgscripts/makecygwinpkg: pkgscripts/makecygwinpkg.tmpl + cat pkgscripts/makecygwinpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \ + sed s@%{__docdir}@$(docdir)@g | sed s@%{__libdir}@$(libdir)@g \ + > pkgscripts/makecygwinpkg -cygwinpkg: all +cygwinpkg: all pkgscripts/makecygwinpkg sh pkgscripts/makecygwinpkg diff --git a/Makefile.in b/Makefile.in index 4e82f3c..d4faed1 100644 --- a/Makefile.in +++ b/Makefile.in @@ -41,31 +41,34 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -@WITH_ARITH_TRUE@am__append_1 = jaricom.c -@WITH_ARITH_ENC_TRUE@am__append_2 = jcarith.c -@WITH_ARITH_DEC_TRUE@am__append_3 = jdarith.c -@WITH_JAVA_TRUE@am__append_4 = turbojpeg-jni.c -@VERSION_SCRIPT_TRUE@am__append_5 = $(VERSION_SCRIPT_FLAG)$(srcdir)/$(TJMAPFILE) -@VERSION_SCRIPT_TRUE@am__append_6 = $(VERSION_SCRIPT_FLAG)libjpeg.map -@WITH_SIMD_TRUE@am__append_7 = simd -@WITH_SIMD_FALSE@am__append_8 = jsimd_none.c +@WITH_TURBOJPEG_TRUE@am__append_1 = libturbojpeg.la +@WITH_TURBOJPEG_TRUE@am__append_2 = turbojpeg.h +@WITH_ARITH_TRUE@am__append_3 = jaricom.c +@WITH_ARITH_ENC_TRUE@am__append_4 = jcarith.c +@WITH_ARITH_DEC_TRUE@am__append_5 = jdarith.c +@WITH_JAVA_TRUE@@WITH_TURBOJPEG_TRUE@am__append_6 = turbojpeg-jni.c +@VERSION_SCRIPT_TRUE@@WITH_TURBOJPEG_TRUE@am__append_7 = $(VERSION_SCRIPT_FLAG)$(srcdir)/$(TJMAPFILE) +@VERSION_SCRIPT_TRUE@am__append_8 = $(VERSION_SCRIPT_FLAG)libjpeg.map +@WITH_SIMD_TRUE@am__append_9 = simd +@WITH_SIMD_FALSE@am__append_10 = jsimd_none.c bin_PROGRAMS = cjpeg$(EXEEXT) djpeg$(EXEEXT) jpegtran$(EXEEXT) \ - rdjpgcom$(EXEEXT) wrjpgcom$(EXEEXT) tjbench$(EXEEXT) -noinst_PROGRAMS = tjunittest$(EXEEXT) jcstest$(EXEEXT) -DIST_COMMON = README $(am__configure_deps) $(dist_doc_DATA) \ - $(dist_example_DATA) $(dist_man1_MANS) $(include_HEADERS) \ + rdjpgcom$(EXEEXT) wrjpgcom$(EXEEXT) $(am__EXEEXT_1) +noinst_PROGRAMS = jcstest$(EXEEXT) $(am__EXEEXT_2) +@WITH_TURBOJPEG_TRUE@am__append_11 = tjbench +@WITH_TURBOJPEG_TRUE@am__append_12 = tjunittest +DIST_COMMON = README $(am__configure_deps) $(am__include_HEADERS_DIST) \ + $(dist_doc_DATA) $(dist_example_DATA) $(dist_man1_MANS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in $(srcdir)/jconfig.h.in \ $(srcdir)/libjpeg.map.in $(srcdir)/tjbenchtest.in \ - $(srcdir)/tjexampletest.in $(top_srcdir)/configure \ + $(srcdir)/tjbenchtest.java.in $(srcdir)/tjexampletest.in \ + $(top_srcdir)/configure \ $(top_srcdir)/release/Description.plist.in \ $(top_srcdir)/release/Info.plist.in \ $(top_srcdir)/release/libjpeg-turbo.spec.in \ $(top_srcdir)/release/makecygwinpkg.in \ $(top_srcdir)/release/makedpkg.in \ $(top_srcdir)/release/makemacpkg.in \ - $(top_srcdir)/release/makesunpkg.in \ - $(top_srcdir)/release/pkginfo.in \ $(top_srcdir)/release/uninstall.in compile config.guess \ config.sub depcomp install-sh ltmain.sh missing subdir = . @@ -78,12 +81,11 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h jconfig.h -CONFIG_CLEAN_FILES = pkgscripts/libjpeg-turbo.spec \ - pkgscripts/makecygwinpkg pkgscripts/makedpkg \ - pkgscripts/makemacpkg pkgscripts/Description.plist \ - pkgscripts/Info.plist pkgscripts/uninstall \ - pkgscripts/makesunpkg pkgscripts/pkginfo tjbenchtest \ - tjexampletest libjpeg.map +CONFIG_CLEAN_FILES = pkgscripts/libjpeg-turbo.spec.tmpl \ + pkgscripts/makecygwinpkg.tmpl pkgscripts/makedpkg.tmpl \ + pkgscripts/makemacpkg.tmpl pkgscripts/Description.plist \ + pkgscripts/Info.plist pkgscripts/uninstall.tmpl tjbenchtest \ + tjbenchtest.java tjexampletest libjpeg.map am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -170,13 +172,18 @@ am__objects_10 = $(am__objects_1) libturbojpeg_la-jcapimin.lo \ libturbojpeg_la-jutils.lo libturbojpeg_la-jmemmgr.lo \ libturbojpeg_la-jmemnobs.lo $(am__objects_6) $(am__objects_7) \ $(am__objects_8) $(am__objects_9) -@WITH_JAVA_TRUE@am__objects_11 = libturbojpeg_la-turbojpeg-jni.lo -am_libturbojpeg_la_OBJECTS = $(am__objects_10) \ - libturbojpeg_la-turbojpeg.lo libturbojpeg_la-transupp.lo \ - libturbojpeg_la-jdatadst-tj.lo libturbojpeg_la-jdatasrc-tj.lo \ - $(am__objects_11) $(am__objects_1) +@WITH_JAVA_TRUE@@WITH_TURBOJPEG_TRUE@am__objects_11 = libturbojpeg_la-turbojpeg-jni.lo +@WITH_TURBOJPEG_TRUE@am_libturbojpeg_la_OBJECTS = $(am__objects_10) \ +@WITH_TURBOJPEG_TRUE@ libturbojpeg_la-turbojpeg.lo \ +@WITH_TURBOJPEG_TRUE@ libturbojpeg_la-transupp.lo \ +@WITH_TURBOJPEG_TRUE@ libturbojpeg_la-jdatadst-tj.lo \ +@WITH_TURBOJPEG_TRUE@ libturbojpeg_la-jdatasrc-tj.lo \ +@WITH_TURBOJPEG_TRUE@ $(am__objects_11) $(am__objects_1) libturbojpeg_la_OBJECTS = $(am_libturbojpeg_la_OBJECTS) +@WITH_TURBOJPEG_TRUE@am_libturbojpeg_la_rpath = -rpath $(libdir) +@WITH_TURBOJPEG_TRUE@am__EXEEXT_1 = tjbench$(EXEEXT) binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +@WITH_TURBOJPEG_TRUE@am__EXEEXT_2 = tjunittest$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) am_cjpeg_OBJECTS = cjpeg-cdjpeg.$(OBJEXT) cjpeg-cjpeg.$(OBJEXT) \ cjpeg-rdbmp.$(OBJEXT) cjpeg-rdgif.$(OBJEXT) \ @@ -200,15 +207,22 @@ jpegtran_DEPENDENCIES = libjpeg.la am_rdjpgcom_OBJECTS = rdjpgcom.$(OBJEXT) rdjpgcom_OBJECTS = $(am_rdjpgcom_OBJECTS) rdjpgcom_DEPENDENCIES = libjpeg.la -am_tjbench_OBJECTS = tjbench-tjbench.$(OBJEXT) tjbench-bmp.$(OBJEXT) \ - tjbench-tjutil.$(OBJEXT) tjbench-rdbmp.$(OBJEXT) \ - tjbench-rdppm.$(OBJEXT) tjbench-wrbmp.$(OBJEXT) \ - tjbench-wrppm.$(OBJEXT) +am__tjbench_SOURCES_DIST = tjbench.c bmp.h bmp.c tjutil.h tjutil.c \ + rdbmp.c rdppm.c wrbmp.c wrppm.c +@WITH_TURBOJPEG_TRUE@am_tjbench_OBJECTS = tjbench-tjbench.$(OBJEXT) \ +@WITH_TURBOJPEG_TRUE@ tjbench-bmp.$(OBJEXT) \ +@WITH_TURBOJPEG_TRUE@ tjbench-tjutil.$(OBJEXT) \ +@WITH_TURBOJPEG_TRUE@ tjbench-rdbmp.$(OBJEXT) \ +@WITH_TURBOJPEG_TRUE@ tjbench-rdppm.$(OBJEXT) \ +@WITH_TURBOJPEG_TRUE@ tjbench-wrbmp.$(OBJEXT) \ +@WITH_TURBOJPEG_TRUE@ tjbench-wrppm.$(OBJEXT) tjbench_OBJECTS = $(am_tjbench_OBJECTS) -tjbench_DEPENDENCIES = libturbojpeg.la libjpeg.la -am_tjunittest_OBJECTS = tjunittest.$(OBJEXT) tjutil.$(OBJEXT) +@WITH_TURBOJPEG_TRUE@tjbench_DEPENDENCIES = libturbojpeg.la libjpeg.la +am__tjunittest_SOURCES_DIST = tjunittest.c tjutil.h tjutil.c +@WITH_TURBOJPEG_TRUE@am_tjunittest_OBJECTS = tjunittest.$(OBJEXT) \ +@WITH_TURBOJPEG_TRUE@ tjutil.$(OBJEXT) tjunittest_OBJECTS = $(am_tjunittest_OBJECTS) -tjunittest_DEPENDENCIES = libturbojpeg.la +@WITH_TURBOJPEG_TRUE@tjunittest_DEPENDENCIES = libturbojpeg.la am_wrjpgcom_OBJECTS = wrjpgcom.$(OBJEXT) wrjpgcom_OBJECTS = $(am_wrjpgcom_OBJECTS) wrjpgcom_DEPENDENCIES = libjpeg.la @@ -230,8 +244,8 @@ SOURCES = $(libjpeg_la_SOURCES) $(libturbojpeg_la_SOURCES) \ DIST_SOURCES = $(am__libjpeg_la_SOURCES_DIST) \ $(am__libturbojpeg_la_SOURCES_DIST) $(cjpeg_SOURCES) \ $(djpeg_SOURCES) $(jcstest_SOURCES) $(jpegtran_SOURCES) \ - $(rdjpgcom_SOURCES) $(tjbench_SOURCES) $(tjunittest_SOURCES) \ - $(wrjpgcom_SOURCES) + $(rdjpgcom_SOURCES) $(am__tjbench_SOURCES_DIST) \ + $(am__tjunittest_SOURCES_DIST) $(wrjpgcom_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ @@ -244,12 +258,13 @@ MANS = $(dist_man1_MANS) dist_docDATA_INSTALL = $(INSTALL_DATA) dist_exampleDATA_INSTALL = $(INSTALL_DATA) DATA = $(dist_doc_DATA) $(dist_example_DATA) +am__include_HEADERS_DIST = jerror.h jmorecfg.h jpeglib.h turbojpeg.h includeHEADERS_INSTALL = $(INSTALL_HEADER) nodist_includeHEADERS_INSTALL = $(INSTALL_HEADER) HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) ETAGS = etags CTAGS = ctags -DIST_SUBDIRS = java simd +DIST_SUBDIRS = java simd md5 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -311,9 +326,11 @@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ +LIBTOOL_CURRENT = @LIBTOOL_CURRENT@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ +MEM_SRCDST_FUNCTIONS = @MEM_SRCDST_FUNCTIONS@ NAFLAGS = @NAFLAGS@ NASM = @NASM@ OBJEXT = @OBJEXT@ @@ -324,6 +341,7 @@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGNAME = @PKGNAME@ RANLIB = @RANLIB@ RPMARCH = @RPMARCH@ RPM_CONFIG_ARGS = @RPM_CONFIG_ARGS@ @@ -335,6 +353,7 @@ SIMD_I386_FALSE = @SIMD_I386_FALSE@ SIMD_I386_TRUE = @SIMD_I386_TRUE@ SIMD_X86_64_FALSE = @SIMD_X86_64_FALSE@ SIMD_X86_64_TRUE = @SIMD_X86_64_TRUE@ +SO_AGE = @SO_AGE@ SO_MAJOR_VERSION = @SO_MAJOR_VERSION@ SO_MINOR_VERSION = @SO_MINOR_VERSION@ STRIP = @STRIP@ @@ -355,6 +374,8 @@ WITH_SIMD_FALSE = @WITH_SIMD_FALSE@ WITH_SIMD_TRUE = @WITH_SIMD_TRUE@ WITH_SSE_FLOAT_DCT_FALSE = @WITH_SSE_FLOAT_DCT_FALSE@ WITH_SSE_FLOAT_DCT_TRUE = @WITH_SSE_FLOAT_DCT_TRUE@ +WITH_TURBOJPEG_FALSE = @WITH_TURBOJPEG_FALSE@ +WITH_TURBOJPEG_TRUE = @WITH_TURBOJPEG_TRUE@ X86_64_FALSE = @X86_64_FALSE@ X86_64_TRUE = @X86_64_TRUE@ ac_ct_AR = @ac_ct_AR@ @@ -400,12 +421,13 @@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ -lib_LTLIBRARIES = libjpeg.la libturbojpeg.la +lib_LTLIBRARIES = libjpeg.la $(am__append_1) libjpeg_la_LDFLAGS = -version-info \ - ${SO_MAJOR_VERSION}:${SO_MINOR_VERSION} -no-undefined \ - $(am__append_6) -libturbojpeg_la_LDFLAGS = -avoid-version -no-undefined $(am__append_5) -include_HEADERS = jerror.h jmorecfg.h jpeglib.h turbojpeg.h + ${LIBTOOL_CURRENT}:${SO_MINOR_VERSION}:${SO_AGE} -no-undefined \ + $(am__append_8) +include_HEADERS = jerror.h jmorecfg.h jpeglib.h $(am__append_2) +@WITH_TURBOJPEG_TRUE@libturbojpeg_la_LDFLAGS = -version-info 0:0 \ +@WITH_TURBOJPEG_TRUE@ -no-undefined $(am__append_7) nodist_include_HEADERS = jconfig.h HDRS = jchuff.h jdct.h jdhuff.h jerror.h jinclude.h jmemsys.h jmorecfg.h \ jpegint.h jpeglib.h jversion.h jsimd.h jsimddct.h jpegcomp.h @@ -418,24 +440,25 @@ libjpeg_la_SOURCES = $(HDRS) jcapimin.c jcapistd.c jccoefct.c \ jdmarker.c jdmaster.c jdmerge.c jdphuff.c jdpostct.c \ jdsample.c jdtrans.c jerror.c jfdctflt.c jfdctfst.c jfdctint.c \ jidctflt.c jidctfst.c jidctint.c jidctred.c jquant1.c \ - jquant2.c jutils.c jmemmgr.c jmemnobs.c $(am__append_1) \ - $(am__append_2) $(am__append_3) $(am__append_8) -libturbojpeg_la_SOURCES = $(libjpeg_la_SOURCES) turbojpeg.c \ - turbojpeg.h transupp.c transupp.h jdatadst-tj.c jdatasrc-tj.c \ - $(am__append_4) $(TJMAPFILE) -SUBDIRS = java $(am__append_7) -@WITH_JAVA_TRUE@libturbojpeg_la_CFLAGS = ${JNI_CFLAGS} -@WITH_JAVA_FALSE@TJMAPFILE = turbojpeg-mapfile -@WITH_JAVA_TRUE@TJMAPFILE = turbojpeg-mapfile.jni + jquant2.c jutils.c jmemmgr.c jmemnobs.c $(am__append_3) \ + $(am__append_4) $(am__append_5) $(am__append_10) +SUBDIRS = java $(am__append_9) md5 +@WITH_TURBOJPEG_TRUE@libturbojpeg_la_SOURCES = $(libjpeg_la_SOURCES) \ +@WITH_TURBOJPEG_TRUE@ turbojpeg.c turbojpeg.h transupp.c \ +@WITH_TURBOJPEG_TRUE@ transupp.h jdatadst-tj.c jdatasrc-tj.c \ +@WITH_TURBOJPEG_TRUE@ $(am__append_6) $(TJMAPFILE) +@WITH_JAVA_TRUE@@WITH_TURBOJPEG_TRUE@libturbojpeg_la_CFLAGS = ${JNI_CFLAGS} +@WITH_JAVA_FALSE@@WITH_TURBOJPEG_TRUE@TJMAPFILE = turbojpeg-mapfile +@WITH_JAVA_TRUE@@WITH_TURBOJPEG_TRUE@TJMAPFILE = turbojpeg-mapfile.jni @WITH_SIMD_TRUE@libjpeg_la_LIBADD = simd/libsimd.la @WITH_SIMD_TRUE@libturbojpeg_la_LIBADD = simd/libsimd.la -tjbench_SOURCES = tjbench.c bmp.h bmp.c tjutil.h tjutil.c rdbmp.c rdppm.c \ - wrbmp.c wrppm.c +@WITH_TURBOJPEG_TRUE@tjbench_SOURCES = tjbench.c bmp.h bmp.c tjutil.h tjutil.c rdbmp.c rdppm.c \ +@WITH_TURBOJPEG_TRUE@ wrbmp.c wrppm.c -tjbench_LDADD = libturbojpeg.la libjpeg.la -lm -tjbench_CFLAGS = -DBMP_SUPPORTED -DPPM_SUPPORTED -tjunittest_SOURCES = tjunittest.c tjutil.h tjutil.c -tjunittest_LDADD = libturbojpeg.la +@WITH_TURBOJPEG_TRUE@tjbench_LDADD = libturbojpeg.la libjpeg.la -lm +@WITH_TURBOJPEG_TRUE@tjbench_CFLAGS = -DBMP_SUPPORTED -DPPM_SUPPORTED +@WITH_TURBOJPEG_TRUE@tjunittest_SOURCES = tjunittest.c tjutil.h tjutil.c +@WITH_TURBOJPEG_TRUE@tjunittest_LDADD = libturbojpeg.la cjpeg_SOURCES = cdjpeg.h cderror.h cdjpeg.c cjpeg.c rdbmp.c rdgif.c \ rdppm.c rdswitch.c rdtarga.c @@ -459,8 +482,8 @@ wrjpgcom_LDADD = libjpeg.la jcstest_SOURCES = jcstest.c jcstest_LDADD = libjpeg.la dist_man1_MANS = cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1 -DOCS = install.txt coderules.txt filelist.txt jconfig.txt change.log \ - rdrle.c wrrle.c BUILDING.txt ChangeLog.txt +DOCS = coderules.txt jconfig.txt change.log rdrle.c wrrle.c BUILDING.txt \ + ChangeLog.txt docdir = $(datadir)/doc dist_doc_DATA = README README-turbo.txt libjpeg.txt structure.txt usage.txt \ @@ -472,6 +495,38 @@ EXTRA_DIST = win release $(DOCS) testimages CMakeLists.txt \ sharedlib/CMakeLists.txt cmakescripts libjpeg.map.in doc doxygen.config \ jccolext.c jdcolext.c jdmrgext.c +MD5_JPEG_INT = 9a68f56bc76e466aa7e52f415d0f4a5f +MD5_JPEG_FAST = 0e1502e7fa421835e376a314fac2a39f +MD5_JPEG_FAST_100 = 7bf72a8e741d64eecb960c97323af77c +MD5_JPEG_FLOAT = d1623885ffafcd40c684af09e3d65cd5 +MD5_JPEG_FLOAT_NOSIMD = fb4884c35f8273f498cb32879de5c455 +MD5_JPEG_INT_GRAY = 72b51f894b8f4a10b3ee3066770aa38d +MD5_PPM_INT = d1ed0d11f076b842525271647716aeb8 +MD5_PPM_FAST = 048298a2d2410261c0533cb97bcfef23 +MD5_PPM_FLOAT = 7f5b446ee36b2630e06785b8d42af15f +MD5_PPM_FLOAT_NOSIMD = 64072f1dbdc5b3a187777788604971a5 +MD5_PPM_INT_2_1 = 9f9de8c0612f8d06869b960b05abf9c9 +MD5_PPM_INT_15_8 = b6875bc070720b899566cc06459b63b7 +MD5_PPM_INT_7_4 = 06a177eae05f164fac57f7a2c346ee87 +MD5_PPM_INT_13_8 = bc3452573c8152f6ae552939ee19f82f +MD5_PPM_INT_3_2 = f5a8b88a8a7f96016f04d259cf82ed67 +MD5_PPM_INT_11_8 = d8cc73c0aaacd4556569b59437ba00a5 +MD5_PPM_INT_5_4 = 32775dd9ad2ab90f4c5b219b53e0c86c +MD5_PPM_INT_9_8 = d25e61bc7eac0002f5b393aa223747b6 +MD5_PPM_INT_7_8 = ddb564b7c74a09494016d6cd7502a946 +MD5_PPM_INT_3_4 = 8ed8e68808c3fbc4ea764fc9d2968646 +MD5_PPM_INT_5_8 = a3363274999da2366a024efae6d16c9b +MD5_PPM_INT_1_2 = e692a315cea26b988c8e8b29a5dbcd81 +MD5_PPM_INT_3_8 = 79eca9175652ced755155c90e785a996 +MD5_PPM_INT_1_4 = 79cd778f8bf1a117690052cacdd54eca +MD5_PPM_INT_1_8 = 391b3d4aca640c8567d6f8745eb2142f +MD5_PPM_FAST_1_2 = f30bcf6d32ccd44cbdd9aeaacbd9454f +MD5_BMP_256 = 4980185e3776e89bd931736e1cddeee6 +MD5_JPEG_ARI = e986fb0a637a8d833d96e8a6d6d84ea1 +MD5_PPM_ARI = 72b59a99bcf1de24c5b27d151bde2437 +MD5_JPEG_PROG = 1c4afddc05c0a43489ee54438a482d92 +MD5_JPEG_PROG_ARI = 0a8f1c8f66e113c3cf635df0a475a617 +MD5_JPEG_CROP = b4197f377e621c4e9b1d20471432610d all: config.h jconfig.h $(MAKE) $(AM_MAKEFLAGS) all-recursive @@ -537,26 +592,24 @@ stamp-h2: $(srcdir)/jconfig.h.in $(top_builddir)/config.status distclean-hdr: -rm -f config.h stamp-h1 jconfig.h stamp-h2 -pkgscripts/libjpeg-turbo.spec: $(top_builddir)/config.status $(top_srcdir)/release/libjpeg-turbo.spec.in +pkgscripts/libjpeg-turbo.spec.tmpl: $(top_builddir)/config.status $(top_srcdir)/release/libjpeg-turbo.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ -pkgscripts/makecygwinpkg: $(top_builddir)/config.status $(top_srcdir)/release/makecygwinpkg.in +pkgscripts/makecygwinpkg.tmpl: $(top_builddir)/config.status $(top_srcdir)/release/makecygwinpkg.in cd $(top_builddir) && $(SHELL) ./config.status $@ -pkgscripts/makedpkg: $(top_builddir)/config.status $(top_srcdir)/release/makedpkg.in +pkgscripts/makedpkg.tmpl: $(top_builddir)/config.status $(top_srcdir)/release/makedpkg.in cd $(top_builddir) && $(SHELL) ./config.status $@ -pkgscripts/makemacpkg: $(top_builddir)/config.status $(top_srcdir)/release/makemacpkg.in +pkgscripts/makemacpkg.tmpl: $(top_builddir)/config.status $(top_srcdir)/release/makemacpkg.in cd $(top_builddir) && $(SHELL) ./config.status $@ pkgscripts/Description.plist: $(top_builddir)/config.status $(top_srcdir)/release/Description.plist.in cd $(top_builddir) && $(SHELL) ./config.status $@ pkgscripts/Info.plist: $(top_builddir)/config.status $(top_srcdir)/release/Info.plist.in cd $(top_builddir) && $(SHELL) ./config.status $@ -pkgscripts/uninstall: $(top_builddir)/config.status $(top_srcdir)/release/uninstall.in - cd $(top_builddir) && $(SHELL) ./config.status $@ -pkgscripts/makesunpkg: $(top_builddir)/config.status $(top_srcdir)/release/makesunpkg.in - cd $(top_builddir) && $(SHELL) ./config.status $@ -pkgscripts/pkginfo: $(top_builddir)/config.status $(top_srcdir)/release/pkginfo.in +pkgscripts/uninstall.tmpl: $(top_builddir)/config.status $(top_srcdir)/release/uninstall.in cd $(top_builddir) && $(SHELL) ./config.status $@ tjbenchtest: $(top_builddir)/config.status $(srcdir)/tjbenchtest.in cd $(top_builddir) && $(SHELL) ./config.status $@ +tjbenchtest.java: $(top_builddir)/config.status $(srcdir)/tjbenchtest.java.in + cd $(top_builddir) && $(SHELL) ./config.status $@ tjexampletest: $(top_builddir)/config.status $(srcdir)/tjexampletest.in cd $(top_builddir) && $(SHELL) ./config.status $@ libjpeg.map: $(top_builddir)/config.status $(srcdir)/libjpeg.map.in @@ -591,7 +644,7 @@ clean-libLTLIBRARIES: libjpeg.la: $(libjpeg_la_OBJECTS) $(libjpeg_la_DEPENDENCIES) $(LINK) -rpath $(libdir) $(libjpeg_la_LDFLAGS) $(libjpeg_la_OBJECTS) $(libjpeg_la_LIBADD) $(LIBS) libturbojpeg.la: $(libturbojpeg_la_OBJECTS) $(libturbojpeg_la_DEPENDENCIES) - $(LINK) -rpath $(libdir) $(libturbojpeg_la_LDFLAGS) $(libturbojpeg_la_OBJECTS) $(libturbojpeg_la_LIBADD) $(LIBS) + $(LINK) $(am_libturbojpeg_la_rpath) $(libturbojpeg_la_LDFLAGS) $(libturbojpeg_la_OBJECTS) $(libturbojpeg_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" @@ -1959,8 +2012,6 @@ install-data-am: install-dist_docDATA install-dist_exampleDATA \ install-nodist_includeHEADERS install-exec-am: install-binPROGRAMS install-libLTLIBRARIES - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-info: install-info-recursive @@ -2008,14 +2059,14 @@ uninstall-man: uninstall-man1 html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dist_docDATA \ install-dist_exampleDATA install-exec install-exec-am \ - install-exec-hook install-includeHEADERS install-info \ - install-info-am install-libLTLIBRARIES install-man \ - install-man1 install-nodist_includeHEADERS install-strip \ - installcheck installcheck-am installdirs installdirs-am \ - maintainer-clean maintainer-clean-generic \ - maintainer-clean-recursive mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \ - pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ + install-includeHEADERS install-info install-info-am \ + install-libLTLIBRARIES install-man install-man1 \ + install-nodist_includeHEADERS install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-dist_docDATA \ uninstall-dist_exampleDATA uninstall-includeHEADERS \ uninstall-info-am uninstall-libLTLIBRARIES uninstall-man \ @@ -2026,59 +2077,81 @@ dist-hook: rm -rf `find $(distdir) -name .svn` test: testclean all -@WITH_JAVA_TRUE@ $(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -@WITH_JAVA_TRUE@ $(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -bi -@WITH_JAVA_TRUE@ $(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv -@WITH_JAVA_TRUE@ $(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv -bi - ./tjunittest - ./tjunittest -alloc - ./tjunittest -yuv +@WITH_JAVA_TRUE@@WITH_TURBOJPEG_TRUE@ $(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest +@WITH_JAVA_TRUE@@WITH_TURBOJPEG_TRUE@ $(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -bi +@WITH_JAVA_TRUE@@WITH_TURBOJPEG_TRUE@ $(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv +@WITH_JAVA_TRUE@@WITH_TURBOJPEG_TRUE@ $(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv -bi +@WITH_TURBOJPEG_TRUE@ ./tjunittest +@WITH_TURBOJPEG_TRUE@ ./tjunittest -alloc +@WITH_TURBOJPEG_TRUE@ ./tjunittest -yuv ./cjpeg -dct int -outfile testoutint.jpg $(srcdir)/testimages/testorig.ppm - cmp $(srcdir)/testimages/testimgint.jpg testoutint.jpg + md5/md5cmp $(MD5_JPEG_INT) testoutint.jpg ./cjpeg -dct fast -opt -outfile testoutfst.jpg $(srcdir)/testimages/testorig.ppm - cmp $(srcdir)/testimages/testimgfst.jpg testoutfst.jpg + md5/md5cmp $(MD5_JPEG_FAST) testoutfst.jpg ./cjpeg -dct fast -quality 100 -opt -outfile testoutfst100.jpg $(srcdir)/testimages/testorig.ppm - cmp $(srcdir)/testimages/testimgfst100.jpg testoutfst100.jpg + md5/md5cmp $(MD5_JPEG_FAST_100) testoutfst100.jpg ./cjpeg -dct float -outfile testoutflt.jpg $(srcdir)/testimages/testorig.ppm -@WITH_SSE_FLOAT_DCT_TRUE@ cmp $(srcdir)/testimages/testimgflt.jpg testoutflt.jpg -@WITH_SSE_FLOAT_DCT_FALSE@ cmp $(srcdir)/testimages/testimgflt-nosimd.jpg testoutflt.jpg +@WITH_SSE_FLOAT_DCT_TRUE@ md5/md5cmp $(MD5_JPEG_FLOAT) testoutflt.jpg +@WITH_SSE_FLOAT_DCT_FALSE@ md5/md5cmp $(MD5_JPEG_FLOAT_NOSIMD) testoutflt.jpg ./cjpeg -dct int -grayscale -outfile testoutgray.jpg $(srcdir)/testimages/testorig.ppm - cmp $(srcdir)/testimages/testimggray.jpg testoutgray.jpg + md5/md5cmp $(MD5_JPEG_INT_GRAY) testoutgray.jpg ./djpeg -dct int -fast -ppm -outfile testoutint.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgint.ppm testoutint.ppm + md5/md5cmp $(MD5_PPM_INT) testoutint.ppm ./djpeg -dct fast -ppm -outfile testoutfst.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgfst.ppm testoutfst.ppm + md5/md5cmp $(MD5_PPM_FAST) testoutfst.ppm ./djpeg -dct float -ppm -outfile testoutflt.ppm $(srcdir)/testimages/testorig.jpg -@WITH_SSE_FLOAT_DCT_TRUE@ cmp $(srcdir)/testimages/testimgflt.ppm testoutflt.ppm -@WITH_SSE_FLOAT_DCT_FALSE@ cmp $(srcdir)/testimages/testorig.ppm testoutflt.ppm - ./djpeg -dct int -scale 1/2 -ppm -outfile testoutint1_2.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgint1_2.ppm testoutint1_2.ppm +@WITH_SSE_FLOAT_DCT_TRUE@ md5/md5cmp $(MD5_PPM_FLOAT) testoutflt.ppm +@WITH_SSE_FLOAT_DCT_FALSE@ md5/md5cmp $(MD5_PPM_FLOAT_NOSIMD) testoutflt.ppm + ./djpeg -dct int -nosmooth -scale 2/1 -ppm -outfile testoutint2_1.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_2_1) testoutint2_1.ppm; + ./djpeg -dct int -nosmooth -scale 15/8 -ppm -outfile testoutint15_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_15_8) testoutint15_8.ppm; + ./djpeg -dct int -nosmooth -scale 7/4 -ppm -outfile testoutint7_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_7_4) testoutint7_4.ppm; + ./djpeg -dct int -nosmooth -scale 13/8 -ppm -outfile testoutint13_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_13_8) testoutint13_8.ppm; + ./djpeg -dct int -nosmooth -scale 3/2 -ppm -outfile testoutint3_2.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_3_2) testoutint3_2.ppm; + ./djpeg -dct int -nosmooth -scale 11/8 -ppm -outfile testoutint11_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_11_8) testoutint11_8.ppm; + ./djpeg -dct int -nosmooth -scale 5/4 -ppm -outfile testoutint5_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_5_4) testoutint5_4.ppm; + ./djpeg -dct int -nosmooth -scale 9/8 -ppm -outfile testoutint9_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_9_8) testoutint9_8.ppm; + ./djpeg -dct int -nosmooth -scale 7/8 -ppm -outfile testoutint7_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_7_8) testoutint7_8.ppm; + ./djpeg -dct int -nosmooth -scale 3/4 -ppm -outfile testoutint3_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_3_4) testoutint3_4.ppm; + ./djpeg -dct int -nosmooth -scale 5/8 -ppm -outfile testoutint5_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_5_8) testoutint5_8.ppm; + ./djpeg -dct int -nosmooth -scale 1/2 -ppm -outfile testoutint1_2.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_1_2) testoutint1_2.ppm; + ./djpeg -dct int -nosmooth -scale 3/8 -ppm -outfile testoutint3_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_3_8) testoutint3_8.ppm; + ./djpeg -dct int -nosmooth -scale 1/4 -ppm -outfile testoutint1_4.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_1_4) testoutint1_4.ppm; + ./djpeg -dct int -nosmooth -scale 1/8 -ppm -outfile testoutint1_8.ppm $(srcdir)/testimages/testorig.jpg; + md5/md5cmp $(MD5_PPM_INT_1_8) testoutint1_8.ppm; ./djpeg -dct fast -scale 1/2 -ppm -outfile testoutfst1_2.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgfst1_2.ppm testoutfst1_2.ppm - ./djpeg -dct int -scale 1/4 -ppm -outfile testoutint1_4.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgint1_4.ppm testoutint1_4.ppm - ./djpeg -dct fast -scale 1/4 -ppm -outfile testoutfst1_4.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgfst1_4.ppm testoutfst1_4.ppm - ./djpeg -dct int -scale 1/8 -ppm -outfile testoutint1_8.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgint1_8.ppm testoutint1_8.ppm - ./djpeg -dct fast -scale 1/8 -ppm -outfile testoutfst1_8.ppm $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgfst1_8.ppm testoutfst1_8.ppm - ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimg.bmp testout.bmp + md5/md5cmp $(MD5_PPM_FAST_1_2) testoutfst1_2.ppm + ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testimages/testorig.jpg + md5/md5cmp $(MD5_BMP_256) testout.bmp @WITH_ARITH_ENC_TRUE@ ./cjpeg -dct int -arithmetic -outfile testoutari.jpg $(srcdir)/testimages/testorig.ppm -@WITH_ARITH_ENC_TRUE@ cmp $(srcdir)/testimages/testimgari.jpg testoutari.jpg +@WITH_ARITH_ENC_TRUE@ md5/md5cmp $(MD5_JPEG_ARI) testoutari.jpg @WITH_ARITH_ENC_TRUE@ ./jpegtran -arithmetic -outfile testouta.jpg $(srcdir)/testimages/testimgint.jpg -@WITH_ARITH_ENC_TRUE@ cmp $(srcdir)/testimages/testimgari.jpg testouta.jpg +@WITH_ARITH_ENC_TRUE@ md5/md5cmp $(MD5_JPEG_ARI) testouta.jpg +@WITH_ARITH_ENC_TRUE@ ./cjpeg -dct int -progressive -arithmetic -sample 1x1 -outfile testoutpa.jpg $(srcdir)/testimages/testorig.ppm +@WITH_ARITH_ENC_TRUE@ md5/md5cmp $(MD5_JPEG_PROG_ARI) testoutpa.jpg @WITH_ARITH_DEC_TRUE@ ./djpeg -dct int -fast -ppm -outfile testoutari.ppm $(srcdir)/testimages/testimgari.jpg -@WITH_ARITH_DEC_TRUE@ cmp $(srcdir)/testimages/testimgari.ppm testoutari.ppm +@WITH_ARITH_DEC_TRUE@ md5/md5cmp $(MD5_PPM_ARI) testoutari.ppm @WITH_ARITH_DEC_TRUE@ ./jpegtran -outfile testouta.jpg $(srcdir)/testimages/testimgari.jpg -@WITH_ARITH_DEC_TRUE@ cmp $(srcdir)/testimages/testimgint.jpg testouta.jpg +@WITH_ARITH_DEC_TRUE@ md5/md5cmp $(MD5_JPEG_INT) testouta.jpg ./cjpeg -dct int -progressive -outfile testoutp.jpg $(srcdir)/testimages/testorig.ppm - cmp $(srcdir)/testimages/testimgp.jpg testoutp.jpg + md5/md5cmp $(MD5_JPEG_PROG) testoutp.jpg ./jpegtran -outfile testoutt.jpg testoutp.jpg - cmp $(srcdir)/testimages/testimgint.jpg testoutt.jpg + md5/md5cmp $(MD5_JPEG_INT) testoutt.jpg ./jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg $(srcdir)/testimages/testorig.jpg - cmp $(srcdir)/testimages/testimgcrop.jpg testoutcrop.jpg + md5/md5cmp $(MD5_JPEG_CROP) testoutcrop.jpg testclean: rm -f testout* @@ -2110,77 +2183,81 @@ testclean: tjtest: sh ./tjbenchtest -@WITH_JAVA_TRUE@ sh ./tjexampletest - -@X86_64_TRUE@install-exec-hook: -@X86_64_TRUE@ __PREFIX=`echo ${prefix} | sed -e 's@\/*$$@@'`; \ -@X86_64_TRUE@ if [ "$$__PREFIX" = "/opt/libjpeg-turbo" ]; then \ -@X86_64_TRUE@ cd $(DESTDIR)/${prefix}; \ -@X86_64_TRUE@ if [ -d lib -a ! -d lib64 -a ! -h lib64 ]; then \ -@X86_64_TRUE@ $(LN_S) lib lib64; \ -@X86_64_TRUE@ fi \ -@X86_64_TRUE@ fi - -@X86_64_FALSE@install-exec-hook: -@X86_64_FALSE@ __PREFIX=`echo ${prefix} | sed -e 's@\/*$$@@'`; \ -@X86_64_FALSE@ if [ "$$__PREFIX" = "/opt/libjpeg-turbo" ]; then \ -@X86_64_FALSE@ cd $(DESTDIR)/${prefix}; \ -@X86_64_FALSE@ if [ -d lib -a ! -d lib32 -a ! -h lib32 ]; then \ -@X86_64_FALSE@ $(LN_S) lib lib32; \ -@X86_64_FALSE@ fi \ -@X86_64_FALSE@ fi - -rpm: all +@WITH_JAVA_TRUE@ sh ./tjbenchtest.java + +pkgscripts/libjpeg-turbo.spec: pkgscripts/libjpeg-turbo.spec.tmpl + cat pkgscripts/libjpeg-turbo.spec.tmpl | sed s@%{__prefix}@$(prefix)@g | \ + sed s@%{__bindir}@$(bindir)@g | sed s@%{__datadir}@$(datadir)@g | \ + sed s@%{__docdir}@$(docdir)@g | sed s@%{__includedir}@$(includedir)@g | \ + sed s@%{__libdir}@$(libdir)@g | sed s@%{__mandir}@$(mandir)@g \ + > pkgscripts/libjpeg-turbo.spec + +rpm: all pkgscripts/libjpeg-turbo.spec TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \ mkdir -p $$TMPDIR/RPMS; \ ln -fs `pwd` $$TMPDIR/BUILD; \ - rm -f ${PACKAGE_NAME}-${VERSION}.${RPMARCH}.rpm; \ + rm -f ${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \ rpmbuild -bb --define "_blddir $$TMPDIR/buildroot" \ --define "_topdir $$TMPDIR" \ --target ${RPMARCH} pkgscripts/libjpeg-turbo.spec; \ - cp $$TMPDIR/RPMS/${RPMARCH}/${PACKAGE_NAME}-${VERSION}-${BUILD}.${RPMARCH}.rpm \ - ${PACKAGE_NAME}-${VERSION}.${RPMARCH}.rpm; \ + cp $$TMPDIR/RPMS/${RPMARCH}/${PKGNAME}-${VERSION}-${BUILD}.${RPMARCH}.rpm \ + ${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \ rm -rf $$TMPDIR -srpm: dist-gzip +srpm: dist-gzip pkgscripts/libjpeg-turbo.spec TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \ mkdir -p $$TMPDIR/RPMS; \ mkdir -p $$TMPDIR/SRPMS; \ mkdir -p $$TMPDIR/BUILD; \ mkdir -p $$TMPDIR/SOURCES; \ mkdir -p $$TMPDIR/SPECS; \ - rm -f ${PACKAGE_NAME}-${VERSION}.src.rpm; \ + rm -f ${PKGNAME}-${VERSION}.src.rpm; \ cp ${PACKAGE_NAME}-${VERSION}.tar.gz $$TMPDIR/SOURCES; \ cat pkgscripts/libjpeg-turbo.spec | sed s/%{_blddir}/%{_tmppath}/g \ | sed s/#--\>//g \ > $$TMPDIR/SPECS/libjpeg-turbo.spec; \ rpmbuild -bs --define "_topdir $$TMPDIR" $$TMPDIR/SPECS/libjpeg-turbo.spec; \ - cp $$TMPDIR/SRPMS/${PACKAGE_NAME}-${VERSION}-${BUILD}.src.rpm \ - ${PACKAGE_NAME}-${VERSION}.src.rpm; \ + cp $$TMPDIR/SRPMS/${PKGNAME}-${VERSION}-${BUILD}.src.rpm \ + ${PKGNAME}-${VERSION}.src.rpm; \ rm -rf $$TMPDIR -deb: all +pkgscripts/makedpkg: pkgscripts/makedpkg.tmpl + cat pkgscripts/makedpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \ + sed s@%{__docdir}@$(docdir)@g | sed s@%{__libdir}@$(libdir)@g \ + > pkgscripts/makedpkg + +deb: all pkgscripts/makedpkg sh pkgscripts/makedpkg -@X86_64_TRUE@udmg: all +pkgscripts/uninstall: pkgscripts/uninstall.tmpl + cat pkgscripts/uninstall.tmpl | sed s@%{__prefix}@$(prefix)@g | \ + sed s@%{__bindir}@$(bindir)@g | sed s@%{__datadir}@$(datadir)@g | \ + sed s@%{__includedir}@$(includedir)@g | sed s@%{__libdir}@$(libdir)@g | \ + sed s@%{__mandir}@$(mandir)@g > pkgscripts/uninstall + +pkgscripts/makemacpkg: pkgscripts/makemacpkg.tmpl + cat pkgscripts/makemacpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \ + sed s@%{__bindir}@$(bindir)@g | sed s@%{__docdir}@$(docdir)@g | \ + sed s@%{__libdir}@$(libdir)@g > pkgscripts/makemacpkg + +@X86_64_TRUE@udmg: all pkgscripts/makemacpkg pkgscripts/uninstall @X86_64_TRUE@ sh pkgscripts/makemacpkg -build32 ${BUILDDIR32} -@X86_64_TRUE@iosdmg: all -@X86_64_TRUE@ sh pkgscripts/makemacpkg -build32 ${BUILDDIR32} -buildarmv6 ${BUILDDIRARMV6} -buildarmv7 ${BUILDDIRARMV7} +@X86_64_TRUE@iosdmg: all pkgscripts/makemacpkg pkgscripts/uninstall +@X86_64_TRUE@ sh pkgscripts/makemacpkg -build32 ${BUILDDIR32} -buildarmv6 ${BUILDDIRARMV6} -buildarmv7 ${BUILDDIRARMV7} -buildarmv7s ${BUILDDIRARMV7S} -@X86_64_FALSE@iosdmg: all -@X86_64_FALSE@ sh pkgscripts/makemacpkg -buildarmv6 ${BUILDDIRARMV6} -buildarmv7 ${BUILDDIRARMV7} +@X86_64_FALSE@iosdmg: all pkgscripts/makemacpkg pkgscripts/uninstall +@X86_64_FALSE@ sh pkgscripts/makemacpkg -buildarmv6 ${BUILDDIRARMV6} -buildarmv7 ${BUILDDIRARMV7} -buildarmv7s ${BUILDDIRARMV7S} -dmg: all +dmg: all pkgscripts/makemacpkg pkgscripts/uninstall sh pkgscripts/makemacpkg -@X86_64_TRUE@csunpkg: all -@X86_64_TRUE@ sh pkgscripts/makesunpkg combined ${BUILDDIR32} - -sunpkg: all - sh pkgscripts/makesunpkg +pkgscripts/makecygwinpkg: pkgscripts/makecygwinpkg.tmpl + cat pkgscripts/makecygwinpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \ + sed s@%{__docdir}@$(docdir)@g | sed s@%{__libdir}@$(libdir)@g \ + > pkgscripts/makecygwinpkg -cygwinpkg: all +cygwinpkg: all pkgscripts/makecygwinpkg sh pkgscripts/makecygwinpkg # 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. diff --git a/README b/README index 0e9b429..9100869 100644 --- a/README +++ b/README @@ -1,8 +1,8 @@ -libjpeg-turbo note: This file contains portions of the libjpeg v6b and v8 -README files, with additional wordsmithing by The libjpeg-turbo Project. -It is included only for reference, as some parts of it may not apply to -libjpeg-turbo. Please see README-turbo.txt for information specific to -libjpeg-turbo. +libjpeg-turbo note: This file has been modified by The libjpeg-turbo Project +to include only information relevant to libjpeg-turbo, to wordsmith certain +sections, and to remove impolitic language that existed in the libjpeg v8 +README. It is included only for reference. Please see README-turbo.txt for +information specific to libjpeg-turbo. The Independent JPEG Group's JPEG software @@ -17,7 +17,8 @@ Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers, and other members of the Independent JPEG Group. -IJG is not affiliated with the official ISO JPEG standards committee. +IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee +(also known as JPEG, together with ITU-T SG16). DOCUMENTATION ROADMAP @@ -45,7 +46,6 @@ Programmer and internal documentation: libjpeg.txt How to use the JPEG library in your own programs. example.c Sample code for calling the JPEG library. structure.txt Overview of the JPEG library's internal structure. - filelist.txt Road map of IJG files. coderules.txt Coding style rules --- please read if you contribute code. Please read at least the files install.txt and usage.txt. Some information @@ -129,7 +129,7 @@ with respect to this software, its quality, accuracy, merchantability, or fitness for a particular purpose. This software is provided "AS IS", and you, its user, assume the entire risk as to its quality and accuracy. -This software is copyright (C) 1991-2010, Thomas G. Lane, Guido Vollbeding. +This software is copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding. All Rights Reserved except as specified below. Permission is hereby granted to use, copy, modify, and distribute this @@ -160,15 +160,6 @@ commercial products, provided that all warranty or liability claims are assumed by the product vendor. -ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, -sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. -ansi2knr.c is NOT covered by the above copyright and conditions, but instead -by the usual distribution terms of the Free Software Foundation; principally, -that you must include source code if you redistribute it. (See the file -ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part -of any program generated from the IJG code, this does not limit you more than -the foregoing paragraphs do. - The Unix configuration script "configure" was produced with GNU Autoconf. It is copyright by the Free Software Foundation but is freely distributable. The same holds for its supporting scripts (config.guess, config.sub, @@ -274,11 +265,12 @@ with body FILE FORMAT WARS ================ -The ISO JPEG standards committee actually promotes different formats like -"JPEG 2000" or "JPEG XR", which are incompatible with original DCT-based -JPEG. IJG therefore does not support these formats (see REFERENCES). Indeed, -one of the original reasons for developing this free software was to help -force convergence on common, interoperable format standards for JPEG files. +The ISO/IEC JTC1/SC29/WG1 standards committee (also known as JPEG, together +with ITU-T SG16) currently promotes different formats containing the name +"JPEG" which are incompatible with original DCT-based JPEG. IJG therefore does +not support these formats (see REFERENCES). Indeed, one of the original +reasons for developing this free software was to help force convergence on +common, interoperable format standards for JPEG files. Don't use an incompatible file format! (In any case, our decoder will remain capable of reading existing JPEG image files indefinitely.) diff --git a/README-turbo.txt b/README-turbo.txt index 899a368..b81299f 100755 --- a/README-turbo.txt +++ b/README-turbo.txt @@ -2,24 +2,26 @@ ** Background ******************************************************************************* -libjpeg-turbo is a derivative of libjpeg that uses SIMD instructions (MMX, -SSE2, NEON) to accelerate baseline JPEG compression and decompression on x86, -x86-64, and ARM systems. On such systems, libjpeg-turbo is generally 2-4x as -fast as the unmodified version of libjpeg, all else being equal. - -libjpeg-turbo was originally based on libjpeg/SIMD by Miyasaka Masaru, but -the TigerVNC and VirtualGL projects made numerous enhancements to the codec in -2009, including improved support for Mac OS X, 64-bit support, support for -32-bit and big-endian pixel formats (RGBX, XBGR, etc.), accelerated Huffman -encoding/decoding, and various bug fixes. The goal was to produce a fully -open-source codec that could replace the partially closed-source TurboJPEG/IPP -codec used by VirtualGL and TurboVNC. libjpeg-turbo generally achieves 80-120% -of the performance of TurboJPEG/IPP. It is faster in some areas but slower in -others. - -In early 2010, libjpeg-turbo spun off into its own independent project, with -the goal of making high-speed JPEG compression/decompression technology -available to a broader range of users and developers. +libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, SSE2, +NEON) to accelerate baseline JPEG compression and decompression on x86, x86-64, +and ARM systems. On such systems, libjpeg-turbo is generally 2-4x as fast as +libjpeg, all else being equal. On other types of systems, libjpeg-turbo can +still outperform libjpeg by a significant amount, by virtue of its +highly-optimized Huffman coding routines. In many cases, the performance of +libjpeg-turbo rivals that of proprietary high-speed JPEG codecs. + +libjpeg-turbo implements both the traditional libjpeg API as well as the less +powerful but more straightforward TurboJPEG API. libjpeg-turbo also features +colorspace extensions that allow it to compress from/decompress to 32-bit and +big-endian pixel buffers (RGBX, XBGR, etc.), as well as a full-featured Java +interface. + +libjpeg-turbo was originally based on libjpeg/SIMD, an MMX-accelerated +derivative of libjpeg v6b developed by Miyasaka Masaru. The TigerVNC and +VirtualGL projects made numerous enhancements to the codec in 2009, and in +early 2010, libjpeg-turbo spun off into an independent project, with the goal +of making high-speed JPEG compression/decompression technology available to a +broader range of users and developers. ******************************************************************************* @@ -27,7 +29,7 @@ available to a broader range of users and developers. ******************************************************************************* Most of libjpeg-turbo inherits the non-restrictive, BSD-style license used by -libjpeg (see README.) The TurboJPEG/OSS wrapper (both C and Java versions) and +libjpeg (see README.) The TurboJPEG wrapper (both C and Java versions) and associated test programs bear a similar license, which is reproduced below: Redistribution and use in source and binary forms, with or without @@ -71,16 +73,32 @@ JPEG images: libjpeg API: This is the de facto industry-standard API for compressing and decompressing JPEG images. It is more difficult to use than the TurboJPEG - API but also more powerful. libjpeg-turbo is both API/ABI-compatible and - mathematically compatible with libjpeg v6b. It can also optionally be - configured to be API/ABI-compatible with libjpeg v7 and v8 (see below.) + API but also more powerful. The libjpeg API implementation in libjpeg-turbo + is both API/ABI-compatible and mathematically compatible with libjpeg v6b. + It can also optionally be configured to be API/ABI-compatible with libjpeg v7 + and v8 (see below.) +There is no significant performance advantage to either API when both are used +to perform similar operations. + +====================== +Installation Directory +====================== + +This document assumes that libjpeg-turbo will be installed in the default +directory (/opt/libjpeg-turbo on Un*x and Mac systems and +c:\libjpeg-turbo[-gcc][64] on Windows systems. If your installation of +libjpeg-turbo resides in a different directory, then adjust the instructions +accordingly. ============================= Replacing libjpeg at Run Time ============================= -If a Unix application is dynamically linked with libjpeg, then you can replace +Un*x +---- + +If a Un*x application is dynamically linked with libjpeg, then you can replace libjpeg with libjpeg-turbo at run time by manipulating LD_LIBRARY_PATH. For instance: @@ -97,67 +115,51 @@ For instance: user 0m0.029s sys 0m0.010s -NOTE: {lib} can be lib, lib32, lib64, or lib/64, depending on the O/S and -architecture. +({lib} = lib32 or lib64, depending on whether you wish to use the 32-bit or the +64-bit version of libjpeg-turbo.) -System administrators can also replace the libjpeg sym links in /usr/{lib} with +System administrators can also replace the libjpeg symlinks in /usr/lib* with links to the libjpeg-turbo dynamic library located in /opt/libjpeg-turbo/{lib}. This will effectively accelerate every application that uses the libjpeg dynamic library on the system. -The libjpeg-turbo SDK for Visual C++ installs the libjpeg-turbo DLL -(jpeg62.dll, jpeg7.dll, or jpeg8.dll, depending on whether it was built with -libjpeg v6b, v7, or v8 emulation) into c:\libjpeg-turbo[64]\bin, and the PATH -environment variable can be modified such that this directory is searched -before any others that might contain a libjpeg DLL. However, if a libjpeg -DLL exists in an application's install directory, then Windows will load this -DLL first whenever the application is launched. Thus, if an application ships -with jpeg62.dll, jpeg7.dll, or jpeg8.dll, then back up the application's -version of this DLL and copy c:\libjpeg-turbo[64]\bin\jpeg*.dll into the -application's install directory to accelerate it. - -The version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for -Visual C++ requires the Visual C++ 2008 C run-time DLL (msvcr90.dll). +Windows +------- + +If a Windows application is dynamically linked with libjpeg, then you can +replace libjpeg with libjpeg-turbo at run time by backing up the application's +copy of jpeg62.dll, jpeg7.dll, or jpeg8.dll (assuming the application has its +own local copy of this library) and copying the corresponding DLL from +libjpeg-turbo into the application's install directory. The official +libjpeg-turbo binary packages only provide jpeg62.dll. If the application uses +jpeg7.dll or jpeg8.dll instead, then it will be necessary to build +libjpeg-turbo from source (see "libjpeg v7 and v8 API/ABI Emulation" below.) + +The following information is specific to the official libjpeg-turbo binary +packages for Visual C++: + +-- jpeg62.dll requires the Visual C++ 2008 C run-time DLL (msvcr90.dll). msvcr90.dll ships with more recent versions of Windows, but users of older Windows releases can obtain it from the Visual C++ 2008 Redistributable Package, which is available as a free download from Microsoft's web site. -NOTE: Features of libjpeg that require passing a C run-time structure, such -as a file handle, from an application to libjpeg will probably not work with -the version of the libjpeg-turbo DLL distributed in the libjpeg-turbo SDK for -Visual C++, unless the application is also built to use the Visual C++ 2008 C -run-time DLL. In particular, this affects jpeg_stdio_dest() and +-- Features of the libjpeg API that require passing a C run-time structure, +such as a file handle, from an application to the library will probably not +work with jpeg62.dll, unless the application is also built to use the Visual +C++ 2008 C run-time DLL. In particular, this affects jpeg_stdio_dest() and jpeg_stdio_src(). +Mac +--- + Mac applications typically embed their own copies of the libjpeg dylib inside the (hidden) application bundle, so it is not possible to globally replace -libjpeg on OS X systems. If an application uses a shared library version of -libjpeg, then it may be possible to replace the application's version of it. -This would generally involve copying libjpeg.*.dylib from libjpeg-turbo into +libjpeg on OS X systems. Replacing the application's version of the libjpeg +dylib would generally involve copying libjpeg.*.dylib from libjpeg-turbo into the appropriate place in the application bundle and using install_name_tool to -repoint the dylib to the new directory. This requires an advanced knowledge of -OS X and would not survive an upgrade or a re-install of the application. -Thus, it is not recommended for most users. - -======================= -Replacing TurboJPEG/IPP -======================= - -libjpeg-turbo is a drop-in replacement for the TurboJPEG/IPP SDK used by -VirtualGL 2.1.x and TurboVNC 0.6 (and prior.) libjpeg-turbo contains a wrapper -library (TurboJPEG/OSS) that emulates the TurboJPEG API using libjpeg-turbo -instead of the closed-source Intel Performance Primitives. You can replace the -TurboJPEG/IPP package on Linux systems with the libjpeg-turbo package in order -to make existing releases of VirtualGL 2.1.x and TurboVNC 0.x use the new codec -at run time. Note that the 64-bit libjpeg-turbo packages contain only 64-bit -binaries, whereas the TurboJPEG/IPP 64-bit packages contained both 64-bit and -32-bit binaries. Thus, to replace a TurboJPEG/IPP 64-bit package, install -both the 64-bit and 32-bit versions of libjpeg-turbo. - -You can also build the VirtualGL 2.1.x and TurboVNC 0.6 source code with -the libjpeg-turbo SDK instead of TurboJPEG/IPP. It should work identically. -libjpeg-turbo also includes static library versions of TurboJPEG/OSS, which -are used to build VirtualGL 2.2 and TurboVNC 1.0 and later. +repoint the libjpeg-turbo dylib to its new directory. This requires an +advanced knowledge of OS X and would not survive an upgrade or a re-install of +the application. Thus, it is not recommended for most users. ======================================== Using libjpeg-turbo in Your Own Programs @@ -165,8 +167,8 @@ Using libjpeg-turbo in Your Own Programs For the most part, libjpeg-turbo should work identically to libjpeg, so in most cases, an application can be built against libjpeg and then run against -libjpeg-turbo. On Unix systems (including Cygwin), you can build against -libjpeg-turbo instead of libjpeg by setting +libjpeg-turbo. On Un*x systems and Cygwin, you can build against libjpeg-turbo +instead of libjpeg by setting CPATH=/opt/libjpeg-turbo/include and @@ -183,20 +185,20 @@ If using MinGW, then set Building against libjpeg-turbo is useful, for instance, if you want to build an application that leverages the libjpeg-turbo colorspace extensions (see below.) -On Linux and Solaris systems, you would still need to manipulate -LD_LIBRARY_PATH or create appropriate sym links to use libjpeg-turbo at run -time. On such systems, you can pass -R /opt/libjpeg-turbo/{lib} to the linker -to force the use of libjpeg-turbo at run time rather than libjpeg (also useful -if you want to leverage the colorspace extensions), or you can link against the -libjpeg-turbo static library. +On Un*x systems, you would still need to manipulate LD_LIBRARY_PATH or create +appropriate symlinks to use libjpeg-turbo at run time. On such systems, you +can pass -R /opt/libjpeg-turbo/{lib} to the linker to force the use of +libjpeg-turbo at run time rather than libjpeg (also useful if you want to +leverage the colorspace extensions), or you can link against the libjpeg-turbo +static library. -To force a Linux, Solaris, or MinGW application to link against the static -version of libjpeg-turbo, you can use the following linker options: +To force a Un*x or MinGW application to link against the static version of +libjpeg-turbo, you can use the following linker options: -Wl,-Bstatic -ljpeg -Wl,-Bdynamic On OS X, simply add /opt/libjpeg-turbo/lib/libjpeg.a to the linker command -line (this also works on Linux and Solaris.) +line. To build Visual C++ applications using libjpeg-turbo, add c:\libjpeg-turbo[64]\include to the system or user INCLUDE environment @@ -234,8 +236,10 @@ time with: #ifdef JCS_EXTENSIONS -At run time, attempting to use these extensions with a version of libjpeg -that doesn't support them will result in a "Bogus input colorspace" error. +At run time, attempting to use these extensions with a libjpeg implementation +that does not support them will result in a "Bogus input colorspace" error. +Applications can trap this error in order to test whether run-time support is +available for the colorspace extensions. When using the RGBX, BGRX, XBGR, and XRGB colorspaces during decompression, the X byte is undefined, and in order to ensure the best performance, libjpeg-turbo @@ -252,34 +256,47 @@ extensions at compile time with: jcstest.c, located in the libjpeg-turbo source tree, demonstrates how to check for the existence of the colorspace extensions at compile time and run time. -================================= -libjpeg v7 and v8 API/ABI support -================================= +=================================== +libjpeg v7 and v8 API/ABI Emulation +=================================== With libjpeg v7 and v8, new features were added that necessitated extending the compression and decompression structures. Unfortunately, due to the exposed nature of those structures, extending them also necessitated breaking backward -ABI compatibility with previous libjpeg releases. Thus, programs that are +ABI compatibility with previous libjpeg releases. Thus, programs that were built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is based on the libjpeg v6b code base. Although libjpeg v7 and v8 are still not -as widely used as v6b, enough programs (including a few Linux distros) have -made the switch that it was desirable to provide support for the libjpeg v7/v8 -API/ABI in libjpeg-turbo. Although libjpeg-turbo can now be configured as a -drop-in replacement for libjpeg v7 or v8, it should be noted that not all of -the features in libjpeg v7 and v8 are supported (see below.) +as widely used as v6b, enough programs (including a few Linux distros) made +the switch that there was a demand to emulate the libjpeg v7 and v8 ABIs +in libjpeg-turbo. It should be noted, however, that this feature was added +primarily so that applications that had already been compiled to use libjpeg +v7+ could take advantage of accelerated baseline JPEG encoding/decoding +without recompiling. libjpeg-turbo does not claim to support all of the +libjpeg v7+ features, nor to produce identical output to libjpeg v7+ in all +cases (see below.) By passing an argument of --with-jpeg7 or --with-jpeg8 to configure, or an argument of -DWITH_JPEG7=1 or -DWITH_JPEG8=1 to cmake, you can build a version -of libjpeg-turbo that emulates the libjpeg v7 or v8 API/ABI, so that programs +of libjpeg-turbo that emulates the libjpeg v7 or v8 ABI, so that programs that are built against libjpeg v7 or v8 can be run with libjpeg-turbo. The following section describes which libjpeg v7+ features are supported and which aren't. -libjpeg v7 and v8 Features: ---------------------------- +Support for libjpeg v7 and v8 Features: +--------------------------------------- Fully supported: +-- libjpeg: IDCT scaling extensions in decompressor + libjpeg-turbo supports IDCT scaling with scaling factors of 1/8, 1/4, 3/8, + 1/2, 5/8, 3/4, 7/8, 9/8, 5/4, 11/8, 3/2, 13/8, 7/4, 15/8, and 2/1 (only 1/4 + and 1/2 are SIMD-accelerated.) + +-- libjpeg: arithmetic coding + +-- libjpeg: In-memory source and destination managers + See notes below. + -- cjpeg: Separate quality settings for luminance and chrominance Note that the libpjeg v7+ API was extended to accommodate this feature only for convenience purposes. It has always been possible to implement this @@ -287,38 +304,47 @@ Fully supported: -- cjpeg: 32-bit BMP support +-- cjpeg: -rgb option + -- jpegtran: lossless cropping -- jpegtran: -perfect option +-- jpegtran: forcing width/height when performing lossless crop + -- rdjpgcom: -raw option -- rdjpgcom: locale awareness -Fully supported when using libjpeg v7/v8 emulation: - --- libjpeg: In-memory source and destination managers - - Not supported: +NOTE: As of this writing, extensive research has been conducted into the +usefulness of DCT scaling as a means of data reduction and SmartScale as a +means of quality improvement. The reader is invited to peruse the research at +http://www.libjpeg-turbo.org/About/SmartScale and draw his/her own conclusions, +but it is the general belief of our project that these features have not +demonstrated sufficient usefulness to justify inclusion in libjpeg-turbo. + -- libjpeg: DCT scaling in compressor cinfo.scale_num and cinfo.scale_denom are silently ignored. - There is no technical reason why DCT scaling cannot be supported, but - without the SmartScale extension (see below), it would only be able to - down-scale using ratios of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and 8/9, - which is of limited usefulness. + There is no technical reason why DCT scaling could not be supported when + emulating the libjpeg v7+ API/ABI, but without the SmartScale extension (see + below), only scaling factors of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and + 8/9 would be available, which is of limited usefulness. -- libjpeg: SmartScale cinfo.block_size is silently ignored. SmartScale is an extension to the JPEG format that allows for DCT block - sizes other than 8x8. It would be difficult to support this feature while - retaining backward compatibility with libjpeg v6b. - --- libjpeg: IDCT scaling extensions in decompressor - libjpeg-turbo still supports IDCT scaling with scaling factors of 1/2, 1/4, - and 1/8 (same as libjpeg v6b.) + sizes other than 8x8. Providing support for this new format would be + feasible (particularly without full acceleration.) However, until/unless + the format becomes either an official industry standard or, at minimum, an + accepted solution in the community, we are hesitant to implement it, as + there is no sense of whether or how it might change in the future. It is + our belief that SmartScale has not demonstrated sufficient usefulness as a + lossless format nor as a means of quality enhancement, and thus, our primary + interest in providing this feature would be as a means of supporting + additional DCT scaling factors. -- libjpeg: Fancy downsampling in compressor cinfo.do_fancy_downsampling is silently ignored. @@ -331,9 +357,97 @@ Not supported: -- Lossless RGB JPEG files This requires the SmartScale feature, which is not supported. +What About libjpeg v9? +---------------------- + +libjpeg v9 introduced yet another field to the JPEG compression structure +(color_transform), thus making the ABI backward incompatible with that of +libjpeg v8. This new field was introduced solely for the purpose of supporting +lossless SmartScale encoding. Further, there was actually no reason to extend +the API in this manner, as the color transform could have just as easily been +activated by way of a new JPEG colorspace constant, thus preserving backward +ABI compatibility. + +Our research (see link above) has shown that lossless SmartScale does not +generally accomplish anything that can't already be accomplished better with +existing, standard lossless formats. Thus, at this time, it is our belief that +there is not sufficient technical justification for software to upgrade from +libjpeg v8 to libjpeg v9, and therefore, not sufficient technical justification +for us to emulate the libjpeg v9 ABI. + +===================================== +In-Memory Source/Destination Managers +===================================== + +By default, libjpeg-turbo 1.3 and later includes the jpeg_mem_src() and +jpeg_mem_dest() functions, even when not emulating the libjpeg v8 API/ABI. +Previously, it was necessary to build libjpeg-turbo from source with libjpeg v8 +API/ABI emulation in order to use the in-memory source/destination managers, +but several projects requested that those functions be included when emulating +the libjpeg v6b API/ABI as well. This allows the use of those functions by +programs that need them without breaking ABI compatibility for programs that +don't, and it allows those functions to be provided in the "official" +libjpeg-turbo binaries. + +Those who are concerned about maintaining strict conformance with the libjpeg +v6b or v7 API can pass an argument of --without-mem-srcdst to configure or +an argument of -DWITH_MEM_SRCDST=0 to CMake prior to building libjpeg-turbo. +This will restore the pre-1.3 behavior, in which jpeg_mem_src() and +jpeg_mem_dest() are only included when emulating the libjpeg v8 API/ABI. + +On Un*x systems, including the in-memory source/destination managers changes +the dynamic library version from 62.0.0 to 62.1.0 if using libjpeg v6b API/ABI +emulation and from 7.0.0 to 7.1.0 if using libjpeg v7 API/ABI emulation. + +Note that, on most Un*x systems, the dynamic linker will not look for a +function in a library until that function is actually used. Thus, if a program +is built against libjpeg-turbo 1.3+ and uses jpeg_mem_src() or jpeg_mem_dest(), +that program will not fail if run against an older version of libjpeg-turbo or +against libjpeg v7- until the program actually tries to call jpeg_mem_src() or +jpeg_mem_dest(). Such is not the case on Windows. If a program is built +against the libjpeg-turbo 1.3+ DLL and uses jpeg_mem_src() or jpeg_mem_dest(), +then it must use the libjpeg-turbo 1.3+ DLL at run time. + +Both cjpeg and djpeg have been extended to allow testing the in-memory +source/destination manager functions. See their respective man pages for more +details. + + +******************************************************************************* +** Mathematical Compatibility +******************************************************************************* + +For the most part, libjpeg-turbo should produce identical output to libjpeg +v6b. The one exception to this is when using the floating point DCT/IDCT, in +which case the outputs of libjpeg v6b and libjpeg-turbo are not guaranteed to +be identical (the accuracy of the floating point DCT/IDCT is constant when +using libjpeg-turbo's SIMD extensions, but otherwise, it can depend heavily on +the compiler and compiler settings.) + +While libjpeg-turbo does emulate the libjpeg v8 API/ABI, under the hood, it is +still using the same algorithms as libjpeg v6b, so there are several specific +cases in which libjpeg-turbo cannot be expected to produce the same output as +libjpeg v8: + +-- When decompressing using scaling factors of 1/2 and 1/4, because libjpeg v8 + implements those scaling algorithms a bit differently than libjpeg v6b does, + and libjpeg-turbo's SIMD extensions are based on the libjpeg v6b behavior. + +-- When using chrominance subsampling, because libjpeg v8 implements this + with its DCT/IDCT scaling algorithms rather than with a separate + downsampling/upsampling algorithm. + +-- When using the floating point IDCT, for the reasons stated above and also + because the floating point IDCT algorithm was modified in libjpeg v8a to + improve accuracy. + +-- When decompressing using a scaling factor > 1 and merged (AKA "non-fancy" or + "non-smooth") chrominance upsampling, because libjpeg v8 does not support + merged upsampling with scaling factors > 1. + ******************************************************************************* -** Performance pitfalls +** Performance Pitfalls ******************************************************************************* =============== diff --git a/acinclude.m4 b/acinclude.m4 index 70e2555..afb4359 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -40,7 +40,7 @@ case "$host_os" in ;; esac ;; - freebsd* | netbsd* | openbsd*) + kfreebsd* | freebsd* | netbsd* | openbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then objfmt='BSD-a.out' else @@ -144,26 +144,26 @@ AC_DEFUN([AC_CHECK_COMPATIBLE_ARM_ASSEMBLER_IFELSE],[ ac_save_CFLAGS="$CFLAGS" CFLAGS="$CCASFLAGS -x assembler-with-cpp" CC="$CCAS" - AC_COMPILE_IFELSE([[ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ .text .fpu neon .arch armv7a .object_arch armv4 .arm pld [r0] - vmovn.u16 d0, q0]], ac_good_gnu_arm_assembler=yes) + vmovn.u16 d0, q0]])], ac_good_gnu_arm_assembler=yes) ac_use_gas_preprocessor=no if test "x$ac_good_gnu_arm_assembler" = "xno" ; then CC="gas-preprocessor.pl $CCAS" - AC_COMPILE_IFELSE([[ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ .text .fpu neon .arch armv7a .object_arch armv4 .arm pld [r0] - vmovn.u16 d0, q0]], ac_use_gas_preprocessor=yes) + vmovn.u16 d0, q0]])], ac_use_gas_preprocessor=yes) fi CFLAGS="$ac_save_CFLAGS" CC="$ac_save_CC" diff --git a/aclocal.m4 b/aclocal.m4 index 47ae922..361861c 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -6600,6 +6600,46 @@ AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) +# serial 2 + +# AM_PROG_CC_C_O +# -------------- +# Like AC_PROG_CC_C_O, but changed for automake. + +# Copyright (C) 1999, 2000, 2001, 2003 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. + +AC_DEFUN([AM_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +ac_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +]) + # -*- Autoconf -*- diff --git a/bmp.c b/bmp.c index 4caefb4..fa4479d 100644 --- a/bmp.c +++ b/bmp.c @@ -169,7 +169,7 @@ int loadbmp(char *filename, unsigned char **buf, int *w, int *h, nlines); } cinfo.next_scanline+=nlines; - } + } (*src->finish_input)(&cinfo, src); @@ -236,7 +236,7 @@ int savebmp(char *filename, unsigned char *buf, int w, int h, int srcpf, _throw("savebmp(): Could not initialize PPM writer"); } - dst->output_file=file; + dst->output_file=file; (*dst->start_output)(&dinfo, dst); (*dinfo.mem->realize_virt_arrays)((j_common_ptr)&dinfo); @@ -258,7 +258,7 @@ int savebmp(char *filename, unsigned char *buf, int w, int h, int srcpf, } (*dst->put_pixel_rows)(&dinfo, dst, nlines); dinfo.output_scanline+=nlines; - } + } (*dst->finish_output)(&dinfo, dst); diff --git a/bmp.h b/bmp.h index 0d1e4dc..c50c260 100644 --- a/bmp.h +++ b/bmp.h @@ -39,8 +39,4 @@ int savebmp(char *filename, unsigned char *buf, int w, int h, int pf, const char *bmpgeterr(void); -#ifdef __cplusplus -} -#endif - #endif diff --git a/change.log b/change.log index 704d8b2..b60ddd6 100644 --- a/change.log +++ b/change.log @@ -1,6 +1,21 @@ +NOTE: This file was modified by The libjpeg-turbo Project to include only +information relevant to libjpeg-turbo. + CHANGE LOG for Independent JPEG Group's JPEG software +Version 8d 15-Jan-2012 +----------------------- + +Add cjpeg -rgb option to create RGB JPEG files. +Using this switch suppresses the conversion from RGB +colorspace input to the default YCbCr JPEG colorspace. +Thank to Michael Koch for the initial suggestion. + +Add option to disable the region adjustment in the transupp crop code. +Thank to Jeffrey Friedl for the suggestion. + + Version 8b 16-May-2010 ----------------------- @@ -31,6 +46,9 @@ Thank to Roberto Boni from Italy for the suggestion. Version 7 27-Jun-2009 ---------------------- +New scaled DCTs implemented. +djpeg now supports scalings N/8 with all N from 1 to 16. + cjpeg -quality option has been extended for support of separate quality settings for luminance and chrominance (or in general, for every provided quantization table slot). diff --git a/cjpeg.1 b/cjpeg.1 index 6fb7299..113efd5 100644 --- a/cjpeg.1 +++ b/cjpeg.1 @@ -1,4 +1,4 @@ -.TH CJPEG 1 "31 January 2012" +.TH CJPEG 1 "18 January 2013" .SH NAME cjpeg \- compress an image file to a JPEG file .SH SYNOPSIS @@ -49,6 +49,11 @@ By saying .BR \-grayscale , you'll get a smaller JPEG file that takes less time to process. .TP +.B \-rgb +Create RGB JPEG file. +Using this switch suppresses the conversion from RGB +colorspace input to the default YCbCr JPEG colorspace. +.TP .B \-optimize Perform optimization of entropy encoding parameters. Without this, default encoding parameters are used. @@ -190,6 +195,11 @@ selects 4000000 bytes. If more space is needed, temporary files will be used. .BI \-outfile " name" Send output image to the named file, not to standard output. .TP +.BI \-memdst +Compress to memory instead of a file. This feature was implemented mainly as a +way of testing the in-memory destination manager (jpeg_mem_dest()), but it is +also useful for benchmarking, since it reduces the I/O overhead. +.TP .B \-verbose Enable debug printout. More .BR \-v 's @@ -308,6 +318,10 @@ Wallace, Gregory K. "The JPEG Still Picture Compression Standard", Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. .SH AUTHOR Independent JPEG Group +.PP +This file was modified by The libjpeg-turbo Project to include only information +relevant to libjpeg-turbo, to wordsmith certain sections, and to describe +features not present in libjpeg. .SH BUGS Support for GIF input files was removed in cjpeg v6b due to concerns over the Unisys LZW patent. Although this patent expired in 2006, cjpeg still diff --git a/cjpeg.c b/cjpeg.c index 0475c02..0c23fe7 100644 --- a/cjpeg.c +++ b/cjpeg.c @@ -1,10 +1,11 @@ /* * cjpeg.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2003-2008 by Guido Vollbeding. - * Copyright (C) 2010, D. R. Commander. - * This file is part of the Independent JPEG Group's software. + * Modified 2003-2011 by Guido Vollbeding. + * libjpeg-turbo Modifications: + * Copyright (C) 2010, 2013, D. R. Commander. * For conditions of distribution and use, see the accompanying README file. * * This file contains a command-line user interface for the JPEG compressor. @@ -138,6 +139,7 @@ select_file_type (j_compress_ptr cinfo, FILE * infile) static const char * progname; /* program name for error messages */ static char * outfilename; /* for -outfile switch */ +boolean memdst; /* for -memdst switch */ LOCAL(void) @@ -154,6 +156,7 @@ usage (void) fprintf(stderr, "Switches (names may be abbreviated):\n"); fprintf(stderr, " -quality N[,...] Compression quality (0..100; 5-95 is useful range)\n"); fprintf(stderr, " -grayscale Create monochrome JPEG file\n"); + fprintf(stderr, " -rgb Create RGB JPEG file\n"); #ifdef ENTROPY_OPT_SUPPORTED fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n"); #endif @@ -185,6 +188,9 @@ usage (void) #endif fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); fprintf(stderr, " -outfile name Specify name for output file\n"); +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) + fprintf(stderr, " -memdst Compress to memory instead of file (useful for benchmarking)\n"); +#endif fprintf(stderr, " -verbose or -debug Emit debug output\n"); fprintf(stderr, "Switches for wizards:\n"); fprintf(stderr, " -baseline Force baseline quantization tables\n"); @@ -226,6 +232,7 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv, simple_progressive = FALSE; is_targa = FALSE; outfilename = NULL; + memdst = FALSE; cinfo->err->trace_level = 0; /* Scan command line options, adjust parameters */ @@ -278,7 +285,7 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv, fprintf(stderr, "%s version %s (build %s)\n", PACKAGE_NAME, VERSION, BUILD); fprintf(stderr, "%s\n\n", JCOPYRIGHT); - fprintf(stderr, "Emulating The Independent JPEG Group's libjpeg, version %s\n\n", + fprintf(stderr, "Emulating The Independent JPEG Group's software, version %s\n\n", JVERSION); printed_version = TRUE; } @@ -288,6 +295,10 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv, /* Force a monochrome JPEG file to be generated. */ jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); + } else if (keymatch(arg, "rgb", 3)) { + /* Force an RGB JPEG file to be generated. */ + jpeg_set_colorspace(cinfo, JCS_RGB); + } else if (keymatch(arg, "maxmemory", 3)) { /* Maximum memory in Kb (or Mb with 'm'). */ long lval; @@ -306,7 +317,7 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv, #ifdef ENTROPY_OPT_SUPPORTED cinfo->optimize_coding = TRUE; #else - fprintf(stderr, "%s: sorry, entropy optimization was not compiled\n", + fprintf(stderr, "%s: sorry, entropy optimization was not compiled in\n", progname); exit(EXIT_FAILURE); #endif @@ -323,11 +334,21 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv, simple_progressive = TRUE; /* We must postpone execution until num_components is known. */ #else - fprintf(stderr, "%s: sorry, progressive output was not compiled\n", + fprintf(stderr, "%s: sorry, progressive output was not compiled in\n", progname); exit(EXIT_FAILURE); #endif + } else if (keymatch(arg, "memdst", 2)) { + /* Use in-memory destination manager */ +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) + memdst = TRUE; +#else + fprintf(stderr, "%s: sorry, in-memory destination manager was not compiled in\n", + progname); + exit(EXIT_FAILURE); +#endif + } else if (keymatch(arg, "quality", 1)) { /* Quality ratings (quantization table scaling factors). */ if (++argn >= argc) /* advance to next argument */ @@ -388,7 +409,7 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv, scansarg = argv[argn]; /* We must postpone reading the file in case -progressive appears. */ #else - fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n", + fprintf(stderr, "%s: sorry, multi-scan output was not compiled in\n", progname); exit(EXIT_FAILURE); #endif @@ -467,7 +488,9 @@ main (int argc, char **argv) int file_index; cjpeg_source_ptr src_mgr; FILE * input_file; - FILE * output_file; + FILE * output_file = NULL; + unsigned char *outbuffer = NULL; + unsigned long outsize = 0; JDIMENSION num_scanlines; /* On Mac, fetch a command line. */ @@ -510,19 +533,21 @@ main (int argc, char **argv) file_index = parse_switches(&cinfo, argc, argv, 0, FALSE); #ifdef TWO_FILE_COMMANDLINE - /* Must have either -outfile switch or explicit output file name */ - if (outfilename == NULL) { - if (file_index != argc-2) { - fprintf(stderr, "%s: must name one input and one output file\n", - progname); - usage(); - } - outfilename = argv[file_index+1]; - } else { - if (file_index != argc-1) { - fprintf(stderr, "%s: must name one input and one output file\n", - progname); - usage(); + if (!memdst) { + /* Must have either -outfile switch or explicit output file name */ + if (outfilename == NULL) { + if (file_index != argc-2) { + fprintf(stderr, "%s: must name one input and one output file\n", + progname); + usage(); + } + outfilename = argv[file_index+1]; + } else { + if (file_index != argc-1) { + fprintf(stderr, "%s: must name one input and one output file\n", + progname); + usage(); + } } } #else @@ -550,7 +575,7 @@ main (int argc, char **argv) fprintf(stderr, "%s: can't open %s\n", progname, outfilename); exit(EXIT_FAILURE); } - } else { + } else if (!memdst) { /* default output file is stdout */ output_file = write_stdout(); } @@ -573,7 +598,12 @@ main (int argc, char **argv) file_index = parse_switches(&cinfo, argc, argv, 0, TRUE); /* Specify data destination for compression */ - jpeg_stdio_dest(&cinfo, output_file); +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) + if (memdst) + jpeg_mem_dest(&cinfo, &outbuffer, &outsize); + else +#endif + jpeg_stdio_dest(&cinfo, output_file); /* Start compressor */ jpeg_start_compress(&cinfo, TRUE); @@ -592,13 +622,19 @@ main (int argc, char **argv) /* Close files, if we opened them */ if (input_file != stdin) fclose(input_file); - if (output_file != stdout) + if (output_file != stdout && output_file != NULL) fclose(output_file); #ifdef PROGRESS_REPORT end_progress_monitor((j_common_ptr) &cinfo); #endif + if (memdst) { + fprintf(stderr, "Compressed size: %lu bytes\n", outsize); + if (outbuffer != NULL) + free(outbuffer); + } + /* All done. */ exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); return 0; /* suppress no-return-value warnings */ diff --git a/cmakescripts/getdate.bat b/cmakescripts/getdate.bat deleted file mode 100644 index b4251bb..0000000 --- a/cmakescripts/getdate.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -for /f "tokens=1-4 eol=/ DELIMS=/ " %%i in ('date /t') do set BUILD=%%l%%j%%k -echo %BUILD% diff --git a/cmakescripts/md5cmp.cmake b/cmakescripts/md5cmp.cmake new file mode 100644 index 0000000..c315aa8 --- /dev/null +++ b/cmakescripts/md5cmp.cmake @@ -0,0 +1,15 @@ +if(NOT MD5) + message(FATAL_ERROR "MD5 not specified") +endif() + +if(NOT FILE) + message(FATAL_ERROR "FILE not specified") +endif() + +file(MD5 ${FILE} MD5FILE) + +if(NOT MD5 STREQUAL MD5FILE) + message(FATAL_ERROR "MD5 of ${FILE} should be ${MD5}, not ${MD5FILE}.") +else() + message(STATUS "${MD5}: OK") +endif() diff --git a/config.h.in b/config.h.in index b76c3dc..1d95275 100644 --- a/config.h.in +++ b/config.h.in @@ -72,6 +72,9 @@ /* libjpeg-turbo version */ #undef LIBJPEG_TURBO_VERSION +/* Support in-memory source/destination managers */ +#undef MEM_SRCDST_SUPPORTED + /* Define if you have BSD-like bzero and bcopy */ #undef NEED_BSD_STRINGS @@ -81,6 +84,9 @@ /* Define if you have sys/types.h */ #undef NEED_SYS_TYPES_H +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + /* Name of package */ #undef PACKAGE @@ -102,6 +108,9 @@ /* Define if shift is unsigned */ #undef RIGHT_SHIFT_IS_UNSIGNED +/* The size of a `long', as computed by sizeof. */ +#undef SIZEOF_LONG + /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS diff --git a/configure b/configure index 2f7fce0..e10e209 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59 for libjpeg-turbo 1.2.1. +# Generated by GNU Autoconf 2.59 for libjpeg-turbo 1.3.1. # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation @@ -421,8 +421,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='libjpeg-turbo' PACKAGE_TARNAME='libjpeg-turbo' -PACKAGE_VERSION='1.2.1' -PACKAGE_STRING='libjpeg-turbo 1.2.1' +PACKAGE_VERSION='1.3.1' +PACKAGE_STRING='libjpeg-turbo 1.3.1' PACKAGE_BUGREPORT='' ac_default_prefix=/opt/libjpeg-turbo @@ -463,7 +463,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP CCAS CCASFLAGS build build_cpu build_vendor build_os host host_cpu host_vendor host_os EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL JPEG_LIB_VERSION JPEG_LIB_VERSION_DECIMAL SO_MAJOR_VERSION SO_MINOR_VERSION VERSION_SCRIPT_TRUE VERSION_SCRIPT_FALSE VERSION_SCRIPT_FLAG WITH_ARITH_ENC_TRUE WITH_ARITH_ENC_FALSE WITH_ARITH_DEC_TRUE WITH_ARITH_DEC_FALSE WITH_ARITH_TRUE WITH_ARITH_FALSE JAVAC JAVACFLAGS JAR JAVA JNI_CFLAGS WITH_JAVA_TRUE WITH_JAVA_FALSE WITH_JAVA JAVA_RPM_CONTENTS_1 JAVA_RPM_CONTENTS_2 RPM_CONFIG_ARGS NASM NAFLAGS WITH_SIMD_TRUE WITH_SIMD_FALSE WITH_SSE_FLOAT_DCT_TRUE WITH_SSE_FLOAT_DCT_FALSE SIMD_I386_TRUE SIMD_I386_FALSE SIMD_X86_64_TRUE SIMD_X86_64_FALSE SIMD_ARM_TRUE SIMD_ARM_FALSE X86_64_TRUE X86_64_FALSE RPMARCH DEBARCH BUILD LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP CCAS CCASFLAGS build build_cpu build_vendor build_os host host_cpu host_vendor host_os EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL JPEG_LIB_VERSION JPEG_LIB_VERSION_DECIMAL SO_MAJOR_VERSION SO_MINOR_VERSION LIBTOOL_CURRENT SO_AGE MEM_SRCDST_FUNCTIONS VERSION_SCRIPT_TRUE VERSION_SCRIPT_FALSE VERSION_SCRIPT_FLAG WITH_ARITH_ENC_TRUE WITH_ARITH_ENC_FALSE WITH_ARITH_DEC_TRUE WITH_ARITH_DEC_FALSE WITH_ARITH_TRUE WITH_ARITH_FALSE JAVAC JAVACFLAGS JAR JAVA JNI_CFLAGS WITH_JAVA_TRUE WITH_JAVA_FALSE WITH_JAVA JAVA_RPM_CONTENTS_1 JAVA_RPM_CONTENTS_2 NASM NAFLAGS WITH_SIMD_TRUE WITH_SIMD_FALSE WITH_SSE_FLOAT_DCT_TRUE WITH_SSE_FLOAT_DCT_FALSE SIMD_I386_TRUE SIMD_I386_FALSE SIMD_X86_64_TRUE SIMD_X86_64_FALSE SIMD_ARM_TRUE SIMD_ARM_FALSE X86_64_TRUE X86_64_FALSE WITH_TURBOJPEG_TRUE WITH_TURBOJPEG_FALSE PKGNAME RPMARCH RPM_CONFIG_ARGS DEBARCH BUILD LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -984,6 +984,10 @@ ac_env_JNI_CFLAGS_set=${JNI_CFLAGS+set} ac_env_JNI_CFLAGS_value=$JNI_CFLAGS ac_cv_env_JNI_CFLAGS_set=${JNI_CFLAGS+set} ac_cv_env_JNI_CFLAGS_value=$JNI_CFLAGS +ac_env_PKGNAME_set=${PKGNAME+set} +ac_env_PKGNAME_value=$PKGNAME +ac_cv_env_PKGNAME_set=${PKGNAME+set} +ac_cv_env_PKGNAME_value=$PKGNAME # # Report the --help message. @@ -992,7 +996,7 @@ 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 libjpeg-turbo 1.2.1 to adapt to many kinds of systems. +\`configure' configures libjpeg-turbo 1.3.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1058,7 +1062,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libjpeg-turbo 1.2.1:";; + short | recursive ) echo "Configuration of libjpeg-turbo 1.3.1:";; esac cat <<\_ACEOF @@ -1091,11 +1095,16 @@ Optional Packages: backward incompatible with libjpeg v6b.) --with-jpeg8 Emulate libjpeg v8 API/ABI (this makes libjpeg-turbo backward incompatible with libjpeg v6b.) - --without-arith-enc Omit arithmetic encoding support - --without-arith-dec Omit arithmetic decoding support - --with-java Build Java wrapper for the TurboJPEG/OSS library + --without-mem-srcdst Do not include in-memory source/destination manager + functions when emulating the libjpeg v6b or v7 + API/ABI + --without-arith-enc Do not include arithmetic encoding support + --without-arith-dec Do not include arithmetic decoding support + --without-turbojpeg Do not include the TurboJPEG wrapper library and + associated test programs + --with-java Build Java wrapper for the TurboJPEG library --with-gas-preprocessor Force using gas-preprocessor.pl on ARM. - --without-simd Omit SIMD extensions. + --without-simd Do not include SIMD extensions Some influential environment variables: CC C compiler command @@ -1129,6 +1138,7 @@ Some influential environment variables: '-I/usr/java/include -I/usr/java/include/solaris' on Solaris, and '-I/usr/java/default/include -I/usr/java/default/include/linux' on Linux) + PKGNAME distribution package name (default: libjpeg-turbo) Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1228,7 +1238,7 @@ fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -libjpeg-turbo configure 1.2.1 +libjpeg-turbo configure 1.3.1 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. @@ -1242,7 +1252,7 @@ cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libjpeg-turbo $as_me 1.2.1, which was +It was created by libjpeg-turbo $as_me 1.3.1, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ @@ -1887,7 +1897,7 @@ fi # Define the identity of the package. PACKAGE='libjpeg-turbo' - VERSION='1.2.1' + VERSION='1.3.1' cat >>confdefs.h <<_ACEOF @@ -2026,6 +2036,8 @@ cat >>confdefs.h <<\_ACEOF _ACEOF + + # Checks for programs. SAVED_CFLAGS=${CFLAGS} SAVED_CPPFLAGS=${CPPFLAGS} @@ -4205,6 +4217,7 @@ else fi + # By default we simply use the C compiler to build assembly code. test "${CCAS+set}" = set || CCAS=$CC @@ -4212,6 +4225,109 @@ test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS +if test "x$CC" != xcc; then + echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 +echo $ECHO_N "checking whether $CC and cc understand -c and -o together... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 +echo $ECHO_N "checking whether cc understands -c and -o together... $ECHO_C" >&6 +fi +set dummy $CC; ac_cc=`echo $2 | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval "test \"\${ac_cv_prog_cc_${ac_cc}_c_o+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest.$ac_objext >&5' +if { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + test -f conftest.$ac_objext && { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest.$ac_objext >&5' + if { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + test -f conftest.$ac_objext && { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f conftest* + +fi +if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + +cat >>confdefs.h <<\_ACEOF +#define NO_MINUS_C_MINUS_O 1 +_ACEOF + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +ac_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: @@ -4899,7 +5015,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 4902 "configure"' > conftest.$ac_ext + echo '#line 5018 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -6237,7 +6353,7 @@ fi # Provide some information about the compiler. -echo "$as_me:6240:" \ +echo "$as_me:6356:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 @@ -7271,11 +7387,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7274: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7390: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7278: \$? = $ac_status" >&5 + echo "$as_me:7394: \$? = $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 @@ -7504,11 +7620,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7507: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7623: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7511: \$? = $ac_status" >&5 + echo "$as_me:7627: \$? = $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 @@ -7564,11 +7680,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7567: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7683: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7571: \$? = $ac_status" >&5 + echo "$as_me:7687: \$? = $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 @@ -8898,7 +9014,7 @@ linux*) libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) - echo '#line 8901 "configure"' > conftest.$ac_ext + echo '#line 9017 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -9769,7 +9885,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:12165: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:12053: \$? = $ac_status" >&5 + echo "$as_me:12169: \$? = $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 @@ -12106,11 +12222,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12109: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12225: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:12113: \$? = $ac_status" >&5 + echo "$as_me:12229: \$? = $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 @@ -12617,7 +12733,7 @@ linux*) libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) - echo '#line 12620 "configure"' > conftest.$ac_ext + echo '#line 12736 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -13488,7 +13604,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:14532: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:14420: \$? = $ac_status" >&5 + echo "$as_me:14536: \$? = $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 @@ -14473,11 +14589,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:14476: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14592: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:14480: \$? = $ac_status" >&5 + echo "$as_me:14596: \$? = $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 @@ -15787,7 +15903,7 @@ linux*) libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) - echo '#line 15790 "configure"' > conftest.$ac_ext + echo '#line 15906 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -16528,11 +16644,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16531: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16647: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16535: \$? = $ac_status" >&5 + echo "$as_me:16651: \$? = $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 @@ -16761,11 +16877,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16764: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16880: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16768: \$? = $ac_status" >&5 + echo "$as_me:16884: \$? = $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 @@ -16821,11 +16937,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16824: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16940: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:16828: \$? = $ac_status" >&5 + echo "$as_me:16944: \$? = $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 @@ -18155,7 +18271,7 @@ linux*) libsuff= case "$host_cpu" in x86_64*|s390x*|powerpc64*) - echo '#line 18158 "configure"' > conftest.$ac_ext + echo '#line 18274 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -19026,7 +19142,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&6 fi -# Check whether compiler supports pointers to undefined structures -echo "$as_me:$LINENO: checking whether compiler supports pointers to undefined structures" >&5 -echo $ECHO_N "checking whether compiler supports pointers to undefined structures... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF +# When the prefix is /opt/libjpeg-turbo, we assume that an "official" binary is +# being created, and thus we install things into specific locations. + +old_prefix=${prefix} +if test "x$prefix" = "xNONE" -a "x$ac_default_prefix" != "x"; then + prefix=$ac_default_prefix +fi +DATADIR=`eval echo ${datadir}` +DATADIR=`eval echo $DATADIR` +if test "$DATADIR" = "/opt/libjpeg-turbo/share"; then + datadir='${prefix}' +fi +DATADIR=`eval echo ${datarootdir}` +DATADIR=`eval echo $DATADIR` +if test "$DATADIR" = "/opt/libjpeg-turbo/share"; then + datarootdir='${prefix}' +fi + +old_exec_prefix=${exec_prefix} +if test "x$exec_prefix" = "xNONE"; then + exec_prefix=${prefix} +fi + +if test "x${libdir}" = 'x${exec_prefix}/lib' -o "x${libdir}" = 'x${prefix}/lib'; then + LIBDIR=`eval echo ${libdir}` + LIBDIR=`eval echo $LIBDIR` + if test "$LIBDIR" = "/opt/libjpeg-turbo/lib"; then + case $host_os in + darwin*) + ;; + *) + echo "$as_me:$LINENO: checking for long" >&5 +echo $ECHO_N "checking for long... $ECHO_C" >&6 +if test "${ac_cv_type_long+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ - typedef struct undefined_structure * undef_struct_ptr; +$ac_includes_default int main () { - +if ((long *) 0) + return 0; +if (sizeof (long)) + return 0; ; return 0; } @@ -20190,37 +20342,31 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + ac_cv_type_long=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - -cat >>confdefs.h <<\_ACEOF -#define INCOMPLETE_TYPES_BROKEN 1 -_ACEOF - +ac_cv_type_long=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - -if test "x${GCC}" = "xyes"; then - if test "x${SAVED_CFLAGS}" = "x"; then - CFLAGS=-O3 - fi - if test "x${SAVED_CPPFLAGS}" = "x"; then - CPPFLAGS=-Wall - fi fi +echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 +echo "${ECHO_T}$ac_cv_type_long" >&6 -echo "$as_me:$LINENO: checking whether __SUNPRO_C is declared" >&5 -echo $ECHO_N "checking whether __SUNPRO_C is declared... $ECHO_C" >&6 -if test "${ac_cv_have_decl___SUNPRO_C+set}" = set; then +echo "$as_me:$LINENO: checking size of long" >&5 +echo $ECHO_N "checking size of long... $ECHO_C" >&6 +if test "${ac_cv_sizeof_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + if test "$ac_cv_type_long" = yes; then + # The cast to unsigned long works around a bug in the HP C Compiler + # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects + # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. + # This bug is HP SR number 8606223364. + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -20230,9 +20376,8 @@ $ac_includes_default int main () { -#ifndef __SUNPRO_C - char *p = (char *) __SUNPRO_C; -#endif +static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)]; +test_array [0] = 0 ; return 0; @@ -20260,51 +20405,20 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ac_cv_have_decl___SUNPRO_C=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_have_decl___SUNPRO_C=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_have_decl___SUNPRO_C" >&5 -echo "${ECHO_T}$ac_cv_have_decl___SUNPRO_C" >&6 -if test $ac_cv_have_decl___SUNPRO_C = yes; then - SUNCC="yes" -else - SUNCC="no" -fi - -if test "x${SUNCC}" = "xyes"; then - if test "x${SAVED_CFLAGS}" = "x"; then - CFLAGS=-xO5 - fi -fi - -# Checks for libraries. - -# Checks for header files. -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#include -#include -#include -#include - +$ac_includes_default int main () { +static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; +test_array [0] = 0 ; return 0; @@ -20332,108 +20446,567 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ac_cv_header_stdc=yes + ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_header_stdc=no +ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f 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 >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* 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 >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + done else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 -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 >conftest.$ac_ext <<_ACEOF +cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#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))) +$ac_includes_default int main () { - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); +static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)]; +test_array [0] = 0 + + ; + return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_lo= ac_hi= +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_lo=`expr '(' $ac_mid ')' + 1` +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_long=$ac_lo;; +'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (long), 77 +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } ;; +esac +else + if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run test program while cross compiling +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +long longval () { return (long) (sizeof (long)); } +unsigned long ulongval () { return (long) (sizeof (long)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + exit (1); + if (((long) (sizeof (long))) < 0) + { + long i = longval (); + if (i != ((long) (sizeof (long)))) + exit (1); + fprintf (f, "%ld\n", i); + } + else + { + unsigned long i = ulongval (); + if (i != ((long) (sizeof (long)))) + exit (1); + fprintf (f, "%lu\n", i); + } + exit (ferror (f) || fclose (f) != 0); + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_long=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute sizeof (long), 77 +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +rm -f conftest.val +else + ac_cv_sizeof_long=0 +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 +echo "${ECHO_T}$ac_cv_sizeof_long" >&6 +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + + if test "${ac_cv_sizeof_long}" = "8"; then + libdir='${exec_prefix}/lib64' + elif test "${ac_cv_sizeof_long}" = "4"; then + libdir='${exec_prefix}/lib32' + fi + ;; + esac + fi +fi +exec_prefix=${old_exec_prefix} +prefix=${old_prefix} + +# Check whether compiler supports pointers to undefined structures +echo "$as_me:$LINENO: checking whether compiler supports pointers to undefined structures" >&5 +echo $ECHO_N "checking whether compiler supports pointers to undefined structures... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + typedef struct undefined_structure * undef_struct_ptr; +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + +cat >>confdefs.h <<\_ACEOF +#define INCOMPLETE_TYPES_BROKEN 1 +_ACEOF + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test "x${GCC}" = "xyes"; then + if test "x${SAVED_CFLAGS}" = "x"; then + CFLAGS=-O3 + fi + if test "x${SAVED_CPPFLAGS}" = "x"; then + CPPFLAGS=-Wall + fi +fi + +echo "$as_me:$LINENO: checking whether __SUNPRO_C is declared" >&5 +echo $ECHO_N "checking whether __SUNPRO_C is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl___SUNPRO_C+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef __SUNPRO_C + char *p = (char *) __SUNPRO_C; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl___SUNPRO_C=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl___SUNPRO_C=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl___SUNPRO_C" >&5 +echo "${ECHO_T}$ac_cv_have_decl___SUNPRO_C" >&6 +if test $ac_cv_have_decl___SUNPRO_C = yes; then + SUNCC="yes" +else + SUNCC="no" +fi + +if test "x${SUNCC}" = "xyes"; then + if test "x${SAVED_CFLAGS}" = "x"; then + CFLAGS=-xO5 + fi +fi + +# Checks for libraries. + +# Checks for header files. +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#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)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no @@ -21202,25 +21775,25 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include - int is_shifting_signed (long arg) { - long res = arg >> 4; - - if (res == -0x7F7E80CL) - return 1; /* right shift is signed */ - - /* see if unsigned-shift hack will fix it. */ - /* we can't just test exact value since it depends on width of long... */ - res |= (~0L) << (32-4); - if (res == -0x7F7E80CL) - return 0; /* right shift is unsigned */ - - printf("Right shift isn't acting as I expect it to.\n"); - printf("I fear the JPEG software will not work at all.\n\n"); - return 0; /* try it with unsigned anyway */ - } - int main (void) { - exit(is_shifting_signed(-0x7F7E80B1L)); - } + int is_shifting_signed (long arg) { + long res = arg >> 4; + + if (res == -0x7F7E80CL) + return 1; /* right shift is signed */ + + /* see if unsigned-shift hack will fix it. */ + /* we can't just test exact value since it depends on width of long... */ + res |= (~0L) << (32-4); + if (res == -0x7F7E80CL) + return 0; /* right shift is unsigned */ + + printf("Right shift isn't acting as I expect it to.\n"); + printf("I fear the JPEG software will not work at all.\n\n"); + return 0; /* try it with unsigned anyway */ + } + int main (void) { + exit(is_shifting_signed(-0x7F7E80B1L)); + } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 @@ -21262,7 +21835,7 @@ cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int possibly_duplicate_function () { return 0; } - int possibly_dupli_function () { return 1; } + int possibly_dupli_function () { return 1; } int main () { @@ -21437,15 +22010,15 @@ if test "${with_jpeg8+set}" = set; then withval="$with_jpeg8" fi; - if test "x${with_jpeg8}" = "xyes"; then - JPEG_LIB_VERSION=80 + if test "x${with_jpeg8}" = "xyes"; then + JPEG_LIB_VERSION=80 + else + if test "x${with_jpeg7}" = "xyes"; then + JPEG_LIB_VERSION=70 else - if test "x${with_jpeg7}" = "xyes"; then - JPEG_LIB_VERSION=70 - else - JPEG_LIB_VERSION=62 - fi + JPEG_LIB_VERSION=62 fi + fi fi JPEG_LIB_VERSION_DECIMAL=`expr $JPEG_LIB_VERSION / 10`.`expr $JPEG_LIB_VERSION % 10` @@ -21457,24 +22030,60 @@ cat >>confdefs.h <<_ACEOF _ACEOF -echo "$as_me:$LINENO: checking libjpeg shared library version" >&5 -echo $ECHO_N "checking libjpeg shared library version... $ECHO_C" >&6 if test "x$SO_MAJOR_VERSION" = "x"; then - case "$JPEG_LIB_VERSION" in - 62) SO_MAJOR_VERSION=$JPEG_LIB_VERSION ;; - *) SO_MAJOR_VERSION=`expr $JPEG_LIB_VERSION / 10` ;; - esac + case "$JPEG_LIB_VERSION" in + 62) SO_MAJOR_VERSION=$JPEG_LIB_VERSION ;; + *) SO_MAJOR_VERSION=`expr $JPEG_LIB_VERSION / 10` ;; + esac fi if test "x$SO_MINOR_VERSION" = "x"; then - case "$JPEG_LIB_VERSION" in - 80) SO_MINOR_VERSION=2 ;; - *) SO_MINOR_VERSION=0 ;; - esac + case "$JPEG_LIB_VERSION" in + 80) SO_MINOR_VERSION=2 ;; + *) SO_MINOR_VERSION=0 ;; + esac +fi + +RPM_CONFIG_ARGS= + +# Memory source/destination managers +SO_AGE=0 +MEM_SRCDST_FUNCTIONS= +if test "x${with_jpeg8}" != "xyes"; then + echo "$as_me:$LINENO: checking whether to include in-memory source/destination managers" >&5 +echo $ECHO_N "checking whether to include in-memory source/destination managers... $ECHO_C" >&6 + +# Check whether --with-mem-srcdst or --without-mem-srcdst was given. +if test "${with_mem_srcdst+set}" = set; then + withval="$with_mem_srcdst" + +fi; + if test "x$with_mem_srcdst" != "xno"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define MEM_SRCDST_SUPPORTED 1 +_ACEOF + + SO_AGE=1 + MEM_SRCDST_FUNCTIONS="global: jpeg_mem_dest; jpeg_mem_src;"; + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-mem-srcdst" + fi fi -echo "$as_me:$LINENO: result: $SO_MAJOR_VERSION:$SO_MINOR_VERSION" >&5 -echo "${ECHO_T}$SO_MAJOR_VERSION:$SO_MINOR_VERSION" >&6 + +echo "$as_me:$LINENO: checking libjpeg shared library version" >&5 +echo $ECHO_N "checking libjpeg shared library version... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $SO_MAJOR_VERSION.$SO_AGE.$SO_MINOR_VERSION" >&5 +echo "${ECHO_T}$SO_MAJOR_VERSION.$SO_AGE.$SO_MINOR_VERSION" >&6 +LIBTOOL_CURRENT=`expr $SO_MAJOR_VERSION + $SO_AGE` + + + @@ -21537,7 +22146,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - VERSION_SCRIPT_FLAG=-Wl,--version-script,; echo "$as_me:$LINENO: result: yes (GNU style)" >&5 + VERSION_SCRIPT_FLAG=-Wl,--version-script,; + echo "$as_me:$LINENO: result: yes (GNU style)" >&5 echo "${ECHO_T}yes (GNU style)" >&6 else echo "$as_me: failed program was:" >&5 @@ -21585,7 +22195,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - VERSION_SCRIPT_FLAG=-Wl,-M,; echo "$as_me:$LINENO: result: yes (Sun style)" >&5 + VERSION_SCRIPT_FLAG=-Wl,-M,; + echo "$as_me:$LINENO: result: yes (Sun style)" >&5 echo "${ECHO_T}yes (Sun style)" >&6 else echo "$as_me: failed program was:" >&5 @@ -21661,7 +22272,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ljt_cv_inline="__attribute__((always_inline))" + ljt_cv_inline="inline __attribute__((always_inline))" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 @@ -21811,6 +22422,7 @@ cat >>confdefs.h <<_ACEOF _ACEOF +# Arithmetic coding support echo "$as_me:$LINENO: checking whether to include arithmetic encoding support" >&5 echo $ECHO_N "checking whether to include arithmetic encoding support... $ECHO_C" >&6 @@ -21820,15 +22432,16 @@ if test "${with_arith_enc+set}" = set; then fi; if test "x$with_arith_enc" = "xno"; then - echo "$as_me:$LINENO: result: no" >&5 + echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-arith-enc" else cat >>confdefs.h <<\_ACEOF #define C_ARITH_CODING_SUPPORTED 1 _ACEOF - echo "$as_me:$LINENO: result: yes" >&5 + echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 fi @@ -21851,15 +22464,16 @@ if test "${with_arith_dec+set}" = set; then fi; if test "x$with_arith_dec" = "xno"; then - echo "$as_me:$LINENO: result: no" >&5 + echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-arith-dec" else cat >>confdefs.h <<\_ACEOF #define D_ARITH_CODING_SUPPORTED 1 _ACEOF - echo "$as_me:$LINENO: result: yes" >&5 + echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 fi @@ -21884,6 +22498,25 @@ else fi +# TurboJPEG support +echo "$as_me:$LINENO: checking whether to build TurboJPEG C wrapper" >&5 +echo $ECHO_N "checking whether to build TurboJPEG C wrapper... $ECHO_C" >&6 + +# Check whether --with-turbojpeg or --without-turbojpeg was given. +if test "${with_turbojpeg+set}" = set; then + withval="$with_turbojpeg" + +fi; +if test "x$with_turbojpeg" = "xno"; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-turbojpeg" +else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +fi + +# Java support if test "x$JAVAC" = "x"; then JAVAC=javac @@ -21903,38 +22536,40 @@ fi -echo "$as_me:$LINENO: checking whether to build TurboJPEG/OSS Java wrapper" >&5 -echo $ECHO_N "checking whether to build TurboJPEG/OSS Java wrapper... $ECHO_C" >&6 +echo "$as_me:$LINENO: checking whether to build TurboJPEG Java wrapper" >&5 +echo $ECHO_N "checking whether to build TurboJPEG Java wrapper... $ECHO_C" >&6 # Check whether --with-java or --without-java was given. if test "${with_java+set}" = set; then withval="$with_java" fi; +if test "x$with_turbojpeg" = "xno"; then + with_java=no +fi -RPM_CONFIG_ARGS= WITH_JAVA=0 if test "x$with_java" = "xyes"; then - echo "$as_me:$LINENO: result: yes" >&5 + echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 - case $host_os in - darwin*) - DEFAULT_JNI_CFLAGS=-I/System/Library/Frameworks/JavaVM.framework/Headers - ;; - solaris*) - DEFAULT_JNI_CFLAGS='-I/usr/java/include -I/usr/java/include/solaris' - ;; - linux*) - DEFAULT_JNI_CFLAGS='-I/usr/java/default/include -I/usr/java/default/include/linux' - ;; - esac - if test "x$JNI_CFLAGS" = "x"; then - JNI_CFLAGS=$DEFAULT_JNI_CFLAGS - fi + case $host_os in + darwin*) + DEFAULT_JNI_CFLAGS=-I/System/Library/Frameworks/JavaVM.framework/Headers + ;; + solaris*) + DEFAULT_JNI_CFLAGS='-I/usr/java/include -I/usr/java/include/solaris' + ;; + linux*) + DEFAULT_JNI_CFLAGS='-I/usr/java/default/include -I/usr/java/default/include/linux' + ;; + esac + if test "x$JNI_CFLAGS" = "x"; then + JNI_CFLAGS=$DEFAULT_JNI_CFLAGS + fi - SAVE_CPPFLAGS=${CPPFLAGS} - CPPFLAGS="${CPPFLAGS} ${JNI_CFLAGS}" + SAVE_CPPFLAGS=${CPPFLAGS} + CPPFLAGS="${CPPFLAGS} ${JNI_CFLAGS}" for ac_header in jni.h do @@ -22089,15 +22724,15 @@ fi done - CPPFLAGS=${SAVE_CPPFLAGS} + CPPFLAGS=${SAVE_CPPFLAGS} - RPM_CONFIG_ARGS=--with-java - JAVA_RPM_CONTENTS_1='%dir /opt/%{name}/classes' - JAVA_RPM_CONTENTS_2=/opt/%{name}/classes/turbojpeg.jar - WITH_JAVA=1 + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --with-java" + JAVA_RPM_CONTENTS_1='%dir %{_datadir}/classes' + JAVA_RPM_CONTENTS_2=%{_datadir}/classes/turbojpeg.jar + WITH_JAVA=1 else - echo "$as_me:$LINENO: result: no" >&5 + echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi @@ -22114,7 +22749,6 @@ fi - # optionally force using gas-preprocessor.pl for compatibility testing # Check whether --with-gas-preprocessor or --without-gas-preprocessor was given. @@ -22142,6 +22776,10 @@ if test "${with_simd+set}" = set; then fi; if test "x${with_simd}" != "xno"; then + require_simd=no + if test "x${with_simd}" = "xyes"; then + require_simd=yes + fi # Check if we're on a supported CPU echo "$as_me:$LINENO: checking if we have SIMD optimisations for cpu type" >&5 echo $ECHO_N "checking if we have SIMD optimisations for cpu type... $ECHO_C" >&6 @@ -22230,7 +22868,7 @@ case "$host_os" in ;; esac ;; - freebsd* | netbsd* | openbsd*) + kfreebsd* | freebsd* | netbsd* | openbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then objfmt='BSD-a.out' else @@ -22299,7 +22937,7 @@ echo "${ECHO_T}$NAFLAGS" >&6 echo "$as_me:$LINENO: checking whether the assembler ($NASM $NAFLAGS) works" >&5 echo $ECHO_N "checking whether the assembler ($NASM $NAFLAGS) works... $ECHO_C" >&6 cat > conftest.asm <&5 echo "${ECHO_T}yes (i386)" >&6 @@ -22432,7 +23070,7 @@ case "$host_os" in ;; esac ;; - freebsd* | netbsd* | openbsd*) + kfreebsd* | freebsd* | netbsd* | openbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then objfmt='BSD-a.out' else @@ -22501,7 +23139,7 @@ echo "${ECHO_T}$NAFLAGS" >&6 echo "$as_me:$LINENO: checking whether the assembler ($NASM $NAFLAGS) works" >&5 echo $ECHO_N "checking whether the assembler ($NASM $NAFLAGS) works... $ECHO_C" >&6 cat > conftest.asm <&5 echo "${ECHO_T}yes (arm)" >&6 @@ -22562,6 +23200,11 @@ echo $ECHO_N "checking if the assembler is GNU-compatible and can be used... $EC CFLAGS="$CCASFLAGS -x assembler-with-cpp" CC="$CCAS" cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ .text .fpu neon @@ -22605,6 +23248,11 @@ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test "x$ac_good_gnu_arm_assembler" = "xno" ; then CC="gas-preprocessor.pl $CCAS" cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ .text .fpu neon @@ -22661,18 +23309,32 @@ echo "${ECHO_T}yes" >&6 echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 with_simd=no - { echo "$as_me:$LINENO: WARNING: SIMD support can't be enabled. Performance will suffer." >&5 -echo "$as_me: WARNING: SIMD support can't be enabled. Performance will suffer." >&2;} fi - ;; + if test "x${with_simd}" = "xno"; then + if test "x${require_simd}" = "xyes"; then + { { echo "$as_me:$LINENO: error: SIMD support can't be enabled." >&5 +echo "$as_me: error: SIMD support can't be enabled." >&2;} + { (exit 1); exit 1; }; } + else + { echo "$as_me:$LINENO: WARNING: SIMD support can't be enabled. Performance will suffer." >&5 +echo "$as_me: WARNING: SIMD support can't be enabled. Performance will suffer." >&2;} + fi + fi + ;; *) echo "$as_me:$LINENO: result: no (\"$host_cpu\")" >&5 echo "${ECHO_T}no (\"$host_cpu\")" >&6 - { echo "$as_me:$LINENO: WARNING: SIMD support not available for this CPU. Performance will suffer." >&5 -echo "$as_me: WARNING: SIMD support not available for this CPU. Performance will suffer." >&2;} with_simd=no; - ;; + if test "x${require_simd}" = "xyes"; then + { { echo "$as_me:$LINENO: error: SIMD support not available for this CPU." >&5 +echo "$as_me: error: SIMD support not available for this CPU." >&2;} + { (exit 1); exit 1; }; } + else + { echo "$as_me:$LINENO: WARNING: SIMD support not available for this CPU. Performance will suffer." >&5 +echo "$as_me: WARNING: SIMD support not available for this CPU. Performance will suffer." >&2;} + fi + ;; esac if test "x${with_simd}" != "xno"; then @@ -22682,6 +23344,8 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi +else + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-simd" fi @@ -22745,6 +23409,22 @@ else fi + +if test "x$with_turbojpeg" != "xno"; then + WITH_TURBOJPEG_TRUE= + WITH_TURBOJPEG_FALSE='#' +else + WITH_TURBOJPEG_TRUE='#' + WITH_TURBOJPEG_FALSE= +fi + + + +if test "x$PKGNAME" = "x"; then + PKGNAME=$PACKAGE_NAME +fi + + case "$host_cpu" in x86_64) RPMARCH=x86_64 @@ -22760,6 +23440,7 @@ esac + cat >>confdefs.h <<_ACEOF #define BUILD "$BUILD" _ACEOF @@ -22773,34 +23454,38 @@ _ACEOF ac_config_headers="$ac_config_headers jconfig.h" - ac_config_files="$ac_config_files pkgscripts/libjpeg-turbo.spec:release/libjpeg-turbo.spec.in" + ac_config_files="$ac_config_files pkgscripts/libjpeg-turbo.spec.tmpl:release/libjpeg-turbo.spec.in" - ac_config_files="$ac_config_files pkgscripts/makecygwinpkg:release/makecygwinpkg.in" + ac_config_files="$ac_config_files pkgscripts/makecygwinpkg.tmpl:release/makecygwinpkg.in" - ac_config_files="$ac_config_files pkgscripts/makedpkg:release/makedpkg.in" + ac_config_files="$ac_config_files pkgscripts/makedpkg.tmpl:release/makedpkg.in" - ac_config_files="$ac_config_files pkgscripts/makemacpkg:release/makemacpkg.in" + ac_config_files="$ac_config_files pkgscripts/makemacpkg.tmpl:release/makemacpkg.in" ac_config_files="$ac_config_files pkgscripts/Description.plist:release/Description.plist.in" ac_config_files="$ac_config_files pkgscripts/Info.plist:release/Info.plist.in" - ac_config_files="$ac_config_files pkgscripts/uninstall:release/uninstall.in" - - ac_config_files="$ac_config_files pkgscripts/makesunpkg:release/makesunpkg.in" + ac_config_files="$ac_config_files pkgscripts/uninstall.tmpl:release/uninstall.in" - ac_config_files="$ac_config_files pkgscripts/pkginfo:release/pkginfo.in" +if test "x$with_turbojpeg" != "xno"; then + ac_config_files="$ac_config_files tjbenchtest" - ac_config_files="$ac_config_files tjbenchtest" +fi +if test "x$with_java" = "xyes"; then + ac_config_files="$ac_config_files tjbenchtest.java" - ac_config_files="$ac_config_files tjexampletest" + ac_config_files="$ac_config_files tjexampletest" +fi ac_config_files="$ac_config_files libjpeg.map" ac_config_files="$ac_config_files Makefile simd/Makefile" ac_config_files="$ac_config_files java/Makefile" + ac_config_files="$ac_config_files md5/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 @@ -22997,6 +23682,13 @@ echo "$as_me: error: conditional \"X86_64\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi +if test -z "${WITH_TURBOJPEG_TRUE}" && test -z "${WITH_TURBOJPEG_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"WITH_TURBOJPEG\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"WITH_TURBOJPEG\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files @@ -23268,7 +23960,7 @@ _ASBOX } >&5 cat >&5 <<_CSEOF -This file was extended by libjpeg-turbo $as_me 1.2.1, which was +This file was extended by libjpeg-turbo $as_me 1.3.1, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -23331,7 +24023,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -libjpeg-turbo config.status 1.2.1 +libjpeg-turbo config.status 1.3.1 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" @@ -23441,21 +24133,21 @@ for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. - "pkgscripts/libjpeg-turbo.spec" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/libjpeg-turbo.spec:release/libjpeg-turbo.spec.in" ;; - "pkgscripts/makecygwinpkg" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/makecygwinpkg:release/makecygwinpkg.in" ;; - "pkgscripts/makedpkg" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/makedpkg:release/makedpkg.in" ;; - "pkgscripts/makemacpkg" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/makemacpkg:release/makemacpkg.in" ;; + "pkgscripts/libjpeg-turbo.spec.tmpl" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/libjpeg-turbo.spec.tmpl:release/libjpeg-turbo.spec.in" ;; + "pkgscripts/makecygwinpkg.tmpl" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/makecygwinpkg.tmpl:release/makecygwinpkg.in" ;; + "pkgscripts/makedpkg.tmpl" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/makedpkg.tmpl:release/makedpkg.in" ;; + "pkgscripts/makemacpkg.tmpl" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/makemacpkg.tmpl:release/makemacpkg.in" ;; "pkgscripts/Description.plist" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/Description.plist:release/Description.plist.in" ;; "pkgscripts/Info.plist" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/Info.plist:release/Info.plist.in" ;; - "pkgscripts/uninstall" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/uninstall:release/uninstall.in" ;; - "pkgscripts/makesunpkg" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/makesunpkg:release/makesunpkg.in" ;; - "pkgscripts/pkginfo" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/pkginfo:release/pkginfo.in" ;; + "pkgscripts/uninstall.tmpl" ) CONFIG_FILES="$CONFIG_FILES pkgscripts/uninstall.tmpl:release/uninstall.in" ;; "tjbenchtest" ) CONFIG_FILES="$CONFIG_FILES tjbenchtest" ;; + "tjbenchtest.java" ) CONFIG_FILES="$CONFIG_FILES tjbenchtest.java" ;; "tjexampletest" ) CONFIG_FILES="$CONFIG_FILES tjexampletest" ;; "libjpeg.map" ) CONFIG_FILES="$CONFIG_FILES libjpeg.map" ;; "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "simd/Makefile" ) CONFIG_FILES="$CONFIG_FILES simd/Makefile" ;; "java/Makefile" ) CONFIG_FILES="$CONFIG_FILES java/Makefile" ;; + "md5/Makefile" ) CONFIG_FILES="$CONFIG_FILES md5/Makefile" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "jconfig.h" ) CONFIG_HEADERS="$CONFIG_HEADERS jconfig.h" ;; @@ -23615,6 +24307,9 @@ s,@JPEG_LIB_VERSION@,$JPEG_LIB_VERSION,;t t s,@JPEG_LIB_VERSION_DECIMAL@,$JPEG_LIB_VERSION_DECIMAL,;t t s,@SO_MAJOR_VERSION@,$SO_MAJOR_VERSION,;t t s,@SO_MINOR_VERSION@,$SO_MINOR_VERSION,;t t +s,@LIBTOOL_CURRENT@,$LIBTOOL_CURRENT,;t t +s,@SO_AGE@,$SO_AGE,;t t +s,@MEM_SRCDST_FUNCTIONS@,$MEM_SRCDST_FUNCTIONS,;t t s,@VERSION_SCRIPT_TRUE@,$VERSION_SCRIPT_TRUE,;t t s,@VERSION_SCRIPT_FALSE@,$VERSION_SCRIPT_FALSE,;t t s,@VERSION_SCRIPT_FLAG@,$VERSION_SCRIPT_FLAG,;t t @@ -23634,7 +24329,6 @@ s,@WITH_JAVA_FALSE@,$WITH_JAVA_FALSE,;t t s,@WITH_JAVA@,$WITH_JAVA,;t t s,@JAVA_RPM_CONTENTS_1@,$JAVA_RPM_CONTENTS_1,;t t s,@JAVA_RPM_CONTENTS_2@,$JAVA_RPM_CONTENTS_2,;t t -s,@RPM_CONFIG_ARGS@,$RPM_CONFIG_ARGS,;t t s,@NASM@,$NASM,;t t s,@NAFLAGS@,$NAFLAGS,;t t s,@WITH_SIMD_TRUE@,$WITH_SIMD_TRUE,;t t @@ -23649,7 +24343,11 @@ s,@SIMD_ARM_TRUE@,$SIMD_ARM_TRUE,;t t s,@SIMD_ARM_FALSE@,$SIMD_ARM_FALSE,;t t s,@X86_64_TRUE@,$X86_64_TRUE,;t t s,@X86_64_FALSE@,$X86_64_FALSE,;t t +s,@WITH_TURBOJPEG_TRUE@,$WITH_TURBOJPEG_TRUE,;t t +s,@WITH_TURBOJPEG_FALSE@,$WITH_TURBOJPEG_FALSE,;t t +s,@PKGNAME@,$PKGNAME,;t t s,@RPMARCH@,$RPMARCH,;t t +s,@RPM_CONFIG_ARGS@,$RPM_CONFIG_ARGS,;t t s,@DEBARCH@,$DEBARCH,;t t s,@BUILD@,$BUILD,;t t s,@LIBOBJS@,$LIBOBJS,;t t diff --git a/configure.ac b/configure.ac index 59f50ff..f90a75a 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ([2.56]) -AC_INIT([libjpeg-turbo], [1.2.1]) +AC_INIT([libjpeg-turbo], [1.3.1]) BUILD=`date +%Y%m%d` AM_INIT_AUTOMAKE([-Wall foreign dist-bzip2]) @@ -11,22 +11,71 @@ AC_PREFIX_DEFAULT(/opt/libjpeg-turbo) # Always build with prototypes AC_DEFINE([HAVE_PROTOTYPES], 1, [Define if your compiler supports prototypes]) +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + # Checks for programs. SAVED_CFLAGS=${CFLAGS} SAVED_CPPFLAGS=${CPPFLAGS} AC_PROG_CPP AC_PROG_CC +m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) AM_PROG_AS +AM_PROG_CC_C_O AC_PROG_INSTALL AC_PROG_LIBTOOL AC_PROG_LN_S +# When the prefix is /opt/libjpeg-turbo, we assume that an "official" binary is +# being created, and thus we install things into specific locations. + +old_prefix=${prefix} +if test "x$prefix" = "xNONE" -a "x$ac_default_prefix" != "x"; then + prefix=$ac_default_prefix +fi +DATADIR=`eval echo ${datadir}` +DATADIR=`eval echo $DATADIR` +if test "$DATADIR" = "/opt/libjpeg-turbo/share"; then + datadir='${prefix}' +fi +DATADIR=`eval echo ${datarootdir}` +DATADIR=`eval echo $DATADIR` +if test "$DATADIR" = "/opt/libjpeg-turbo/share"; then + datarootdir='${prefix}' +fi + +old_exec_prefix=${exec_prefix} +if test "x$exec_prefix" = "xNONE"; then + exec_prefix=${prefix} +fi + +if test "x${libdir}" = 'x${exec_prefix}/lib' -o "x${libdir}" = 'x${prefix}/lib'; then + LIBDIR=`eval echo ${libdir}` + LIBDIR=`eval echo $LIBDIR` + if test "$LIBDIR" = "/opt/libjpeg-turbo/lib"; then + case $host_os in + darwin*) + ;; + *) + AC_CHECK_SIZEOF(long) + if test "${ac_cv_sizeof_long}" = "8"; then + libdir='${exec_prefix}/lib64' + elif test "${ac_cv_sizeof_long}" = "4"; then + libdir='${exec_prefix}/lib32' + fi + ;; + esac + fi +fi +exec_prefix=${old_exec_prefix} +prefix=${old_prefix} + # Check whether compiler supports pointers to undefined structures AC_MSG_CHECKING(whether compiler supports pointers to undefined structures) AC_TRY_COMPILE([ typedef struct undefined_structure * undef_struct_ptr; ], , -AC_MSG_RESULT(yes), -[AC_MSG_RESULT(no) -AC_DEFINE([INCOMPLETE_TYPES_BROKEN],[1],[Compiler does not support pointers to undefined structures.])]) + AC_MSG_RESULT(yes), + [AC_MSG_RESULT(no) + AC_DEFINE([INCOMPLETE_TYPES_BROKEN], [1], + [Compiler does not support pointers to undefined structures.])]) if test "x${GCC}" = "xyes"; then if test "x${SAVED_CFLAGS}" = "x"; then @@ -49,7 +98,8 @@ fi # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([stddef.h stdlib.h string.h]) -AC_CHECK_HEADER([sys/types.h], AC_DEFINE([NEED_SYS_TYPES_H], 1, [Define if you have sys/types.h])) +AC_CHECK_HEADER([sys/types.h], + AC_DEFINE([NEED_SYS_TYPES_H], 1, [Define if you have sys/types.h])) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST @@ -60,85 +110,118 @@ AC_CHECK_TYPES([unsigned char, unsigned short]) AC_MSG_CHECKING([if right shift is signed]) AC_TRY_RUN( - [#include - int is_shifting_signed (long arg) { - long res = arg >> 4; - - if (res == -0x7F7E80CL) - return 1; /* right shift is signed */ - - /* see if unsigned-shift hack will fix it. */ - /* we can't just test exact value since it depends on width of long... */ - res |= (~0L) << (32-4); - if (res == -0x7F7E80CL) - return 0; /* right shift is unsigned */ - - printf("Right shift isn't acting as I expect it to.\n"); - printf("I fear the JPEG software will not work at all.\n\n"); - return 0; /* try it with unsigned anyway */ - } - int main (void) { - exit(is_shifting_signed(-0x7F7E80B1L)); - }], - [AC_MSG_RESULT(no) - AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED], 1, [Define if shift is unsigned])], - [AC_MSG_RESULT(yes)], - [AC_MSG_RESULT(Assuming that right shift is signed on target machine.)]) + [#include + int is_shifting_signed (long arg) { + long res = arg >> 4; + + if (res == -0x7F7E80CL) + return 1; /* right shift is signed */ + + /* see if unsigned-shift hack will fix it. */ + /* we can't just test exact value since it depends on width of long... */ + res |= (~0L) << (32-4); + if (res == -0x7F7E80CL) + return 0; /* right shift is unsigned */ + + printf("Right shift isn't acting as I expect it to.\n"); + printf("I fear the JPEG software will not work at all.\n\n"); + return 0; /* try it with unsigned anyway */ + } + int main (void) { + exit(is_shifting_signed(-0x7F7E80B1L)); + }], + [AC_MSG_RESULT(no) + AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED], 1, [Define if shift is unsigned])], + [AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(Assuming that right shift is signed on target machine.)]) # test whether global names are unique to at least 15 chars AC_MSG_CHECKING([for short external names]) AC_TRY_LINK( - [int possibly_duplicate_function () { return 0; } - int possibly_dupli_function () { return 1; }], [ ], - [AC_MSG_RESULT(ok)], - [AC_MSG_RESULT(short) - AC_DEFINE([NEED_SHORT_EXTERNAL_NAMES], 1, [Define if you need short function names])]) + [int possibly_duplicate_function () { return 0; } + int possibly_dupli_function () { return 1; }], [ ], + [AC_MSG_RESULT(ok)], + [AC_MSG_RESULT(short) + AC_DEFINE([NEED_SHORT_EXTERNAL_NAMES], 1, + [Define if you need short function names])]) # Checks for library functions. AC_CHECK_FUNCS([memset memcpy], [], - [AC_DEFINE([NEED_BSD_STRINGS], 1, - [Define if you have BSD-like bzero and bcopy])]) + [AC_DEFINE([NEED_BSD_STRINGS], 1, + [Define if you have BSD-like bzero and bcopy])]) AC_MSG_CHECKING([libjpeg API version]) AC_ARG_VAR(JPEG_LIB_VERSION, [libjpeg API version (62, 70, or 80)]) if test "x$JPEG_LIB_VERSION" = "x"; then - AC_ARG_WITH([jpeg7], - AC_HELP_STRING([--with-jpeg7], [Emulate libjpeg v7 API/ABI (this makes libjpeg-turbo backward incompatible with libjpeg v6b.)])) - AC_ARG_WITH([jpeg8], - AC_HELP_STRING([--with-jpeg8], [Emulate libjpeg v8 API/ABI (this makes libjpeg-turbo backward incompatible with libjpeg v6b.)])) - if test "x${with_jpeg8}" = "xyes"; then - JPEG_LIB_VERSION=80 + AC_ARG_WITH([jpeg7], + AC_HELP_STRING([--with-jpeg7], + [Emulate libjpeg v7 API/ABI (this makes libjpeg-turbo backward incompatible with libjpeg v6b.)])) + AC_ARG_WITH([jpeg8], + AC_HELP_STRING([--with-jpeg8], + [Emulate libjpeg v8 API/ABI (this makes libjpeg-turbo backward incompatible with libjpeg v6b.)])) + if test "x${with_jpeg8}" = "xyes"; then + JPEG_LIB_VERSION=80 + else + if test "x${with_jpeg7}" = "xyes"; then + JPEG_LIB_VERSION=70 else - if test "x${with_jpeg7}" = "xyes"; then - JPEG_LIB_VERSION=70 - else - JPEG_LIB_VERSION=62 - fi + JPEG_LIB_VERSION=62 fi + fi fi JPEG_LIB_VERSION_DECIMAL=`expr $JPEG_LIB_VERSION / 10`.`expr $JPEG_LIB_VERSION % 10` AC_SUBST(JPEG_LIB_VERSION_DECIMAL) AC_MSG_RESULT([$JPEG_LIB_VERSION_DECIMAL]) -AC_DEFINE_UNQUOTED(JPEG_LIB_VERSION, [$JPEG_LIB_VERSION], [libjpeg API version]) +AC_DEFINE_UNQUOTED(JPEG_LIB_VERSION, [$JPEG_LIB_VERSION], + [libjpeg API version]) -AC_MSG_CHECKING([libjpeg shared library version]) -AC_ARG_VAR(SO_MAJOR_VERSION, [Major version of the libjpeg-turbo shared library (default is determined by the API version)]) -AC_ARG_VAR(SO_MINOR_VERSION, [Minor version of the libjpeg-turbo shared library (default is determined by the API version)]) +AC_ARG_VAR(SO_MAJOR_VERSION, + [Major version of the libjpeg-turbo shared library (default is determined by the API version)]) +AC_ARG_VAR(SO_MINOR_VERSION, + [Minor version of the libjpeg-turbo shared library (default is determined by the API version)]) if test "x$SO_MAJOR_VERSION" = "x"; then - case "$JPEG_LIB_VERSION" in - 62) SO_MAJOR_VERSION=$JPEG_LIB_VERSION ;; - *) SO_MAJOR_VERSION=`expr $JPEG_LIB_VERSION / 10` ;; - esac + case "$JPEG_LIB_VERSION" in + 62) SO_MAJOR_VERSION=$JPEG_LIB_VERSION ;; + *) SO_MAJOR_VERSION=`expr $JPEG_LIB_VERSION / 10` ;; + esac fi if test "x$SO_MINOR_VERSION" = "x"; then - case "$JPEG_LIB_VERSION" in - 80) SO_MINOR_VERSION=2 ;; - *) SO_MINOR_VERSION=0 ;; - esac + case "$JPEG_LIB_VERSION" in + 80) SO_MINOR_VERSION=2 ;; + *) SO_MINOR_VERSION=0 ;; + esac +fi + +RPM_CONFIG_ARGS= + +# Memory source/destination managers +SO_AGE=0 +MEM_SRCDST_FUNCTIONS= +if test "x${with_jpeg8}" != "xyes"; then + AC_MSG_CHECKING([whether to include in-memory source/destination managers]) + AC_ARG_WITH([mem-srcdst], + AC_HELP_STRING([--without-mem-srcdst], + [Do not include in-memory source/destination manager functions when emulating the libjpeg v6b or v7 API/ABI])) + if test "x$with_mem_srcdst" != "xno"; then + AC_MSG_RESULT(yes) + AC_DEFINE([MEM_SRCDST_SUPPORTED], [1], + [Support in-memory source/destination managers]) + SO_AGE=1 + MEM_SRCDST_FUNCTIONS="global: jpeg_mem_dest; jpeg_mem_src;"; + else + AC_MSG_RESULT(no) + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-mem-srcdst" + fi fi -AC_MSG_RESULT([$SO_MAJOR_VERSION:$SO_MINOR_VERSION]) + +AC_MSG_CHECKING([libjpeg shared library version]) +AC_MSG_RESULT([$SO_MAJOR_VERSION.$SO_AGE.$SO_MINOR_VERSION]) +LIBTOOL_CURRENT=`expr $SO_MAJOR_VERSION + $SO_AGE` +AC_SUBST(LIBTOOL_CURRENT) AC_SUBST(SO_MAJOR_VERSION) AC_SUBST(SO_MINOR_VERSION) +AC_SUBST(SO_AGE) +AC_SUBST(MEM_SRCDST_FUNCTIONS) AC_DEFINE_UNQUOTED(LIBJPEG_TURBO_VERSION, [$VERSION], [libjpeg-turbo version]) @@ -146,7 +229,7 @@ VERSION_SCRIPT=yes AC_ARG_ENABLE([ld-version-script], AS_HELP_STRING([--disable-ld-version-script], [Disable linker version script for libjpeg-turbo (default is to use linker version script if the linker supports it)]), - [VERSION_SCRIPT=$enableval], []) + [VERSION_SCRIPT=$enableval], []) AC_MSG_CHECKING([whether the linker supports version scripts]) SAVED_LDFLAGS="$LDFLAGS" @@ -156,12 +239,16 @@ VERS_1 { global: *; }; EOF -AC_LINK_IFELSE(AC_LANG_PROGRAM([], []), - [VERSION_SCRIPT_FLAG=-Wl,--version-script,; AC_MSG_RESULT([yes (GNU style)])], []) +AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], + [VERSION_SCRIPT_FLAG=-Wl,--version-script,; + AC_MSG_RESULT([yes (GNU style)])], + []) if test "x$VERSION_SCRIPT_FLAG" = "x"; then LDFLAGS="$SAVED_LDFLAGS -Wl,-M,conftest.map" - AC_LINK_IFELSE(AC_LANG_PROGRAM([], []), - [VERSION_SCRIPT_FLAG=-Wl,-M,; AC_MSG_RESULT([yes (Sun style)])], []) + AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], + [VERSION_SCRIPT_FLAG=-Wl,-M,; + AC_MSG_RESULT([yes (Sun style)])], + []) fi if test "x$VERSION_SCRIPT_FLAG" = "x"; then VERSION_SCRIPT=no @@ -179,7 +266,7 @@ AC_SUBST(VERSION_SCRIPT_FLAG) AC_MSG_CHECKING(for inline) ljt_cv_inline="" AC_TRY_COMPILE(, [} __attribute__((always_inline)) int foo() { return 0; } -int bar() { return foo();], ljt_cv_inline="__attribute__((always_inline))", +int bar() { return foo();], ljt_cv_inline="inline __attribute__((always_inline))", AC_TRY_COMPILE(, [} __inline__ int foo() { return 0; } int bar() { return foo();], ljt_cv_inline="__inline__", AC_TRY_COMPILE(, [} __inline int foo() { return 0; } @@ -189,30 +276,49 @@ int bar() { return foo();], ljt_cv_inline="inline")))) AC_MSG_RESULT($ljt_cv_inline) AC_DEFINE_UNQUOTED([INLINE],[$ljt_cv_inline],[How to obtain function inlining.]) +# Arithmetic coding support AC_MSG_CHECKING([whether to include arithmetic encoding support]) AC_ARG_WITH([arith-enc], - AC_HELP_STRING([--without-arith-enc], [Omit arithmetic encoding support])) + AC_HELP_STRING([--without-arith-enc], + [Do not include arithmetic encoding support])) if test "x$with_arith_enc" = "xno"; then - AC_MSG_RESULT(no) + AC_MSG_RESULT(no) + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-arith-enc" else - AC_DEFINE([C_ARITH_CODING_SUPPORTED], [1], [Support arithmetic encoding]) - AC_MSG_RESULT(yes) + AC_DEFINE([C_ARITH_CODING_SUPPORTED], [1], [Support arithmetic encoding]) + AC_MSG_RESULT(yes) fi AM_CONDITIONAL([WITH_ARITH_ENC], [test "x$with_arith_enc" != "xno"]) AC_MSG_CHECKING([whether to include arithmetic decoding support]) AC_ARG_WITH([arith-dec], - AC_HELP_STRING([--without-arith-dec], [Omit arithmetic decoding support])) + AC_HELP_STRING([--without-arith-dec], + [Do not include arithmetic decoding support])) if test "x$with_arith_dec" = "xno"; then - AC_MSG_RESULT(no) + AC_MSG_RESULT(no) + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-arith-dec" else - AC_DEFINE([D_ARITH_CODING_SUPPORTED], [1], [Support arithmetic decoding]) - AC_MSG_RESULT(yes) + AC_DEFINE([D_ARITH_CODING_SUPPORTED], [1], [Support arithmetic decoding]) + AC_MSG_RESULT(yes) fi AM_CONDITIONAL([WITH_ARITH_DEC], [test "x$with_arith_dec" != "xno"]) -AM_CONDITIONAL([WITH_ARITH], [test "x$with_arith_dec" != "xno" -o "x$with_arith_enc" != "xno"]) +AM_CONDITIONAL([WITH_ARITH], + [test "x$with_arith_dec" != "xno" -o "x$with_arith_enc" != "xno"]) + +# TurboJPEG support +AC_MSG_CHECKING([whether to build TurboJPEG C wrapper]) +AC_ARG_WITH([turbojpeg], + AC_HELP_STRING([--without-turbojpeg], + [Do not include the TurboJPEG wrapper library and associated test programs])) +if test "x$with_turbojpeg" = "xno"; then + AC_MSG_RESULT(no) + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-turbojpeg" +else + AC_MSG_RESULT(yes) +fi +# Java support AC_ARG_VAR(JAVAC, [Java compiler command (default: javac)]) if test "x$JAVAC" = "x"; then JAVAC=javac @@ -230,55 +336,58 @@ if test "x$JAVA" = "x"; then JAVA=java fi AC_SUBST(JAVA) -AC_ARG_VAR(JNI_CFLAGS, [C compiler flags needed to include jni.h (default: -I/System/Library/Frameworks/JavaVM.framework/Headers on OS X, '-I/usr/java/include -I/usr/java/include/solaris' on Solaris, and '-I/usr/java/default/include -I/usr/java/default/include/linux' on Linux)]) +AC_ARG_VAR(JNI_CFLAGS, + [C compiler flags needed to include jni.h (default: -I/System/Library/Frameworks/JavaVM.framework/Headers on OS X, '-I/usr/java/include -I/usr/java/include/solaris' on Solaris, and '-I/usr/java/default/include -I/usr/java/default/include/linux' on Linux)]) -AC_MSG_CHECKING([whether to build TurboJPEG/OSS Java wrapper]) +AC_MSG_CHECKING([whether to build TurboJPEG Java wrapper]) AC_ARG_WITH([java], - AC_HELP_STRING([--with-java],[Build Java wrapper for the TurboJPEG/OSS library])) + AC_HELP_STRING([--with-java], [Build Java wrapper for the TurboJPEG library])) +if test "x$with_turbojpeg" = "xno"; then + with_java=no +fi -RPM_CONFIG_ARGS= WITH_JAVA=0 if test "x$with_java" = "xyes"; then - AC_MSG_RESULT(yes) + AC_MSG_RESULT(yes) - case $host_os in - darwin*) - DEFAULT_JNI_CFLAGS=-I/System/Library/Frameworks/JavaVM.framework/Headers - ;; - solaris*) - DEFAULT_JNI_CFLAGS='-I/usr/java/include -I/usr/java/include/solaris' - ;; - linux*) - DEFAULT_JNI_CFLAGS='-I/usr/java/default/include -I/usr/java/default/include/linux' - ;; - esac - if test "x$JNI_CFLAGS" = "x"; then - JNI_CFLAGS=$DEFAULT_JNI_CFLAGS - fi + case $host_os in + darwin*) + DEFAULT_JNI_CFLAGS=-I/System/Library/Frameworks/JavaVM.framework/Headers + ;; + solaris*) + DEFAULT_JNI_CFLAGS='-I/usr/java/include -I/usr/java/include/solaris' + ;; + linux*) + DEFAULT_JNI_CFLAGS='-I/usr/java/default/include -I/usr/java/default/include/linux' + ;; + esac + if test "x$JNI_CFLAGS" = "x"; then + JNI_CFLAGS=$DEFAULT_JNI_CFLAGS + fi - SAVE_CPPFLAGS=${CPPFLAGS} - CPPFLAGS="${CPPFLAGS} ${JNI_CFLAGS}" - AC_CHECK_HEADERS([jni.h], [DUMMY=1], - [AC_MSG_ERROR([Could not find JNI header file])]) - CPPFLAGS=${SAVE_CPPFLAGS} - AC_SUBST(JNI_CFLAGS) - - RPM_CONFIG_ARGS=--with-java - JAVA_RPM_CONTENTS_1='%dir /opt/%{name}/classes' - JAVA_RPM_CONTENTS_2=/opt/%{name}/classes/turbojpeg.jar - WITH_JAVA=1 + SAVE_CPPFLAGS=${CPPFLAGS} + CPPFLAGS="${CPPFLAGS} ${JNI_CFLAGS}" + AC_CHECK_HEADERS([jni.h], [DUMMY=1], + [AC_MSG_ERROR([Could not find JNI header file])]) + CPPFLAGS=${SAVE_CPPFLAGS} + AC_SUBST(JNI_CFLAGS) + + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --with-java" + JAVA_RPM_CONTENTS_1='%dir %{_datadir}/classes' + JAVA_RPM_CONTENTS_2=%{_datadir}/classes/turbojpeg.jar + WITH_JAVA=1 else - AC_MSG_RESULT(no) + AC_MSG_RESULT(no) fi AM_CONDITIONAL([WITH_JAVA], [test "x$with_java" = "xyes"]) AC_SUBST(WITH_JAVA) AC_SUBST(JAVA_RPM_CONTENTS_1) AC_SUBST(JAVA_RPM_CONTENTS_2) -AC_SUBST(RPM_CONFIG_ARGS) # optionally force using gas-preprocessor.pl for compatibility testing AC_ARG_WITH([gas-preprocessor], - AC_HELP_STRING([--with-gas-preprocessor],[Force using gas-preprocessor.pl on ARM.])) + AC_HELP_STRING([--with-gas-preprocessor], + [Force using gas-preprocessor.pl on ARM.])) if test "x${with_gas_preprocessor}" = "xyes"; then case $host_os in darwin*) @@ -293,8 +402,12 @@ fi # SIMD is optional AC_ARG_WITH([simd], - AC_HELP_STRING([--without-simd],[Omit SIMD extensions.])) + AC_HELP_STRING([--without-simd], [Do not include SIMD extensions])) if test "x${with_simd}" != "xno"; then + require_simd=no + if test "x${with_simd}" = "xyes"; then + require_simd=yes + fi # Check if we're on a supported CPU AC_MSG_CHECKING([if we have SIMD optimisations for cpu type]) case "$host_cpu" in @@ -302,12 +415,12 @@ if test "x${with_simd}" != "xno"; then AC_MSG_RESULT([yes (x86_64)]) AC_PROG_NASM simd_arch=x86_64 - ;; + ;; i*86 | x86 | ia32) AC_MSG_RESULT([yes (i386)]) AC_PROG_NASM simd_arch=i386 - ;; + ;; arm*) AC_MSG_RESULT([yes (arm)]) AC_MSG_CHECKING([if the assembler is GNU-compatible and can be used]) @@ -315,19 +428,31 @@ if test "x${with_simd}" != "xno"; then [AC_MSG_RESULT([yes]) simd_arch=arm], [AC_MSG_RESULT([no]) - with_simd=no - AC_MSG_WARN([SIMD support can't be enabled. Performance will suffer.])]) - ;; + with_simd=no]) + if test "x${with_simd}" = "xno"; then + if test "x${require_simd}" = "xyes"; then + AC_MSG_ERROR([SIMD support can't be enabled.]) + else + AC_MSG_WARN([SIMD support can't be enabled. Performance will suffer.]) + fi + fi + ;; *) AC_MSG_RESULT([no ("$host_cpu")]) - AC_MSG_WARN([SIMD support not available for this CPU. Performance will suffer.]) with_simd=no; - ;; + if test "x${require_simd}" = "xyes"; then + AC_MSG_ERROR([SIMD support not available for this CPU.]) + else + AC_MSG_WARN([SIMD support not available for this CPU. Performance will suffer.]) + fi + ;; esac if test "x${with_simd}" != "xno"; then AC_DEFINE([WITH_SIMD], [1], [Use accelerated SIMD routines.]) fi +else + RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-simd" fi AM_CONDITIONAL([WITH_SIMD], [test "x$with_simd" != "xno"]) @@ -336,6 +461,13 @@ AM_CONDITIONAL([SIMD_I386], [test "x$simd_arch" = "xi386"]) AM_CONDITIONAL([SIMD_X86_64], [test "x$simd_arch" = "xx86_64"]) AM_CONDITIONAL([SIMD_ARM], [test "x$simd_arch" = "xarm"]) AM_CONDITIONAL([X86_64], [test "x$host_cpu" = "xx86_64" -o "x$host_cpu" = "xamd64"]) +AM_CONDITIONAL([WITH_TURBOJPEG], [test "x$with_turbojpeg" != "xno"]) + +AC_ARG_VAR(PKGNAME, [distribution package name (default: libjpeg-turbo)]) +if test "x$PKGNAME" = "x"; then + PKGNAME=$PACKAGE_NAME +fi +AC_SUBST(PKGNAME) case "$host_cpu" in x86_64) @@ -349,6 +481,7 @@ case "$host_cpu" in esac AC_SUBST(RPMARCH) +AC_SUBST(RPM_CONFIG_ARGS) AC_SUBST(DEBARCH) AC_SUBST(BUILD) AC_DEFINE_UNQUOTED([BUILD], "$BUILD", [Build number]) @@ -359,18 +492,22 @@ AC_DEFINE_UNQUOTED([BUILD], "$BUILD", [Build number]) # jconfig.h is a minimal version that allows this package to be built AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([jconfig.h]) -AC_CONFIG_FILES([pkgscripts/libjpeg-turbo.spec:release/libjpeg-turbo.spec.in]) -AC_CONFIG_FILES([pkgscripts/makecygwinpkg:release/makecygwinpkg.in]) -AC_CONFIG_FILES([pkgscripts/makedpkg:release/makedpkg.in]) -AC_CONFIG_FILES([pkgscripts/makemacpkg:release/makemacpkg.in]) +AC_CONFIG_FILES([pkgscripts/libjpeg-turbo.spec.tmpl:release/libjpeg-turbo.spec.in]) +AC_CONFIG_FILES([pkgscripts/makecygwinpkg.tmpl:release/makecygwinpkg.in]) +AC_CONFIG_FILES([pkgscripts/makedpkg.tmpl:release/makedpkg.in]) +AC_CONFIG_FILES([pkgscripts/makemacpkg.tmpl:release/makemacpkg.in]) AC_CONFIG_FILES([pkgscripts/Description.plist:release/Description.plist.in]) AC_CONFIG_FILES([pkgscripts/Info.plist:release/Info.plist.in]) -AC_CONFIG_FILES([pkgscripts/uninstall:release/uninstall.in]) -AC_CONFIG_FILES([pkgscripts/makesunpkg:release/makesunpkg.in]) -AC_CONFIG_FILES([pkgscripts/pkginfo:release/pkginfo.in]) -AC_CONFIG_FILES([tjbenchtest]) -AC_CONFIG_FILES([tjexampletest]) +AC_CONFIG_FILES([pkgscripts/uninstall.tmpl:release/uninstall.in]) +if test "x$with_turbojpeg" != "xno"; then + AC_CONFIG_FILES([tjbenchtest]) +fi +if test "x$with_java" = "xyes"; then + AC_CONFIG_FILES([tjbenchtest.java]) + AC_CONFIG_FILES([tjexampletest]) +fi AC_CONFIG_FILES([libjpeg.map]) AC_CONFIG_FILES([Makefile simd/Makefile]) AC_CONFIG_FILES([java/Makefile]) +AC_CONFIG_FILES([md5/Makefile]) AC_OUTPUT diff --git a/djpeg.1 b/djpeg.1 index e5e46f2..8bb7d27 100644 --- a/djpeg.1 +++ b/djpeg.1 @@ -1,4 +1,4 @@ -.TH DJPEG 1 "11 October 2010" +.TH DJPEG 1 "18 January 2013" .SH NAME djpeg \- decompress a JPEG file to an image file .SH SYNOPSIS @@ -62,8 +62,9 @@ runs noticeably faster in this mode. .TP .BI \-scale " M/N" Scale the output image by a factor M/N. Currently the scale factor must be -1/1, 1/2, 1/4, or 1/8. Scaling is handy if the image is larger than your -screen; also, +M/8, where M is an integer between 1 and 16 inclusive, or any reduced fraction +thereof (such as 1/2, 3/4, etc.) Scaling is handy if the image is larger than +your screen; also, .B djpeg runs much faster when scaling down the output. .TP @@ -172,6 +173,10 @@ selects 4000000 bytes. If more space is needed, temporary files will be used. .BI \-outfile " name" Send output image to the named file, not to standard output. .TP +.BI \-memsrc +Load input file into memory before decompressing. This feature was implemented +mainly as a way of testing the in-memory source manager (jpeg_mem_src().) +.TP .B \-verbose Enable debug printout. More .BR \-v 's @@ -242,6 +247,10 @@ Wallace, Gregory K. "The JPEG Still Picture Compression Standard", Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. .SH AUTHOR Independent JPEG Group +.PP +This file was modified by The libjpeg-turbo Project to include only information +relevant to libjpeg-turbo, to wordsmith certain sections, and to describe +features not present in libjpeg. .SH BUGS To avoid the Unisys LZW patent, .B djpeg diff --git a/djpeg.c b/djpeg.c index 2438856..589c580 100644 --- a/djpeg.c +++ b/djpeg.c @@ -1,9 +1,10 @@ /* * djpeg.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. - * Copyright (C) 2010-2011, D. R. Commander. - * This file is part of the Independent JPEG Group's software. + * libjpeg-turbo Modifications: + * Copyright (C) 2010-2011, 2013, D. R. Commander. * For conditions of distribution and use, see the accompanying README file. * * This file contains a command-line user interface for the JPEG decompressor. @@ -86,6 +87,8 @@ static IMAGE_FORMATS requested_fmt; static const char * progname; /* program name for error messages */ static char * outfilename; /* for -outfile switch */ +boolean memsrc; /* for -memsrc switch */ +#define INPUT_BUF_SIZE 4096 LOCAL(void) @@ -156,6 +159,10 @@ usage (void) #endif fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); fprintf(stderr, " -outfile name Specify name for output file\n"); +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) + fprintf(stderr, " -memsrc Load input file into memory before decompressing\n"); +#endif + fprintf(stderr, " -verbose or -debug Emit debug output\n"); exit(EXIT_FAILURE); } @@ -179,6 +186,7 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv, /* Set up default JPEG parameters. */ requested_fmt = DEFAULT_FMT; /* set default output file format */ outfilename = NULL; + memsrc = FALSE; cinfo->err->trace_level = 0; /* Scan command line options, adjust parameters */ @@ -246,7 +254,7 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv, fprintf(stderr, "%s version %s (build %s)\n", PACKAGE_NAME, VERSION, BUILD); fprintf(stderr, "%s\n\n", JCOPYRIGHT); - fprintf(stderr, "Emulating The Independent JPEG Group's libjpeg, version %s\n\n", + fprintf(stderr, "Emulating The Independent JPEG Group's software, version %s\n\n", JVERSION); printed_version = TRUE; } @@ -324,6 +332,16 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv, usage(); outfilename = argv[argn]; /* save it away for later use */ + } else if (keymatch(arg, "memsrc", 2)) { + /* Use in-memory source manager */ +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) + memsrc = TRUE; +#else + fprintf(stderr, "%s: sorry, in-memory source manager was not compiled in\n", + progname); + exit(EXIT_FAILURE); +#endif + } else if (keymatch(arg, "pnm", 1) || keymatch(arg, "ppm", 1)) { /* PPM/PGM output format. */ requested_fmt = FMT_PPM; @@ -442,6 +460,8 @@ main (int argc, char **argv) djpeg_dest_ptr dest_mgr = NULL; FILE * input_file; FILE * output_file; + unsigned char *inbuffer = NULL; + unsigned long insize = 0; JDIMENSION num_scanlines; /* On Mac, fetch a command line. */ @@ -536,7 +556,30 @@ main (int argc, char **argv) #endif /* Specify data source for decompression */ - jpeg_stdio_src(&cinfo, input_file); +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) + if (memsrc) { + size_t nbytes; + do { + inbuffer = (unsigned char *)realloc(inbuffer, insize + INPUT_BUF_SIZE); + if (inbuffer == NULL) { + fprintf(stderr, "%s: memory allocation failure\n", progname); + exit(EXIT_FAILURE); + } + nbytes = JFREAD(input_file, &inbuffer[insize], INPUT_BUF_SIZE); + if (nbytes < INPUT_BUF_SIZE && ferror(input_file)) { + if (file_index < argc) + fprintf(stderr, "%s: can't read from %s\n", progname, + argv[file_index]); + else + fprintf(stderr, "%s: can't read from stdin\n", progname); + } + insize += (unsigned long)nbytes; + } while (nbytes == INPUT_BUF_SIZE); + fprintf(stderr, "Compressed size: %lu bytes\n", insize); + jpeg_mem_src(&cinfo, inbuffer, insize); + } else +#endif + jpeg_stdio_src(&cinfo, input_file); /* Read file header, set default decompression parameters */ (void) jpeg_read_header(&cinfo, TRUE); @@ -620,6 +663,9 @@ main (int argc, char **argv) end_progress_monitor((j_common_ptr) &cinfo); #endif + if (memsrc && inbuffer != NULL) + free(inbuffer); + /* All done. */ exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); return 0; /* suppress no-return-value warnings */ diff --git a/doc/html/annotated.html b/doc/html/annotated.html index 16a9c48..1e3fbd0 100644 --- a/doc/html/annotated.html +++ b/doc/html/annotated.html @@ -2,35 +2,45 @@ + + TurboJPEG: Data Structures + + - + + - - - -
+ +
-
TurboJPEG 1.2.1
+
TurboJPEG +  1.2.1 +
+ + + -
-
-
-
Data Structures
-
-
-
Here are the data structures with brief descriptions:
- - - -
tjregionCropping region
tjscalingfactorScaling factor
tjtransformLossless transform
-
+
+ All Data Structures Functions Variables Typedefs Enumerations Enumerator Groups
@@ -81,8 +80,24 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
- +
+
+
Data Structures
+
+
+
Here are the data structures with brief descriptions:
+ + + + +
oCtjregionCropping region
oCtjscalingfactorScaling factor
\CtjtransformLossless transform
+
+
+ + diff --git a/doc/html/bc_s.png b/doc/html/bc_s.png index e4018628b5b45cb4301037485a29d7d74ac22138..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 100644 GIT binary patch delta 665 zcmV;K0%rZC1*8R#7k?fI1^@s65rAI}0007ONkly__>=_9%My{eRLXUpWx-eUjCm06>Xt z+I1jc5)9aAVDb0VuL%I4g!%?1xA7bv@z>dYlf9SR@`nP>-O&$CG`J;+GqR^Y%Iat- zfdBb{ADLXlS!q5>VhTWK``>Bah!Fa+(Q9WJ1_h_%>Rb`%y{!Y9MV(dVopvifMS$)i zaOT$ALR^DcCVv+2*z+WIO)Kh>4n%IeDSh((I;U7~;thi{irTLOC$GOQ1%hV5Fzj`T zIr2>XYJg@RHn=6L0W(Ktl++{Cb8Q>|C><;p`NL}}%9686ss)9wyaE790?VRroPg5caq)Gw6_$9Ry)c}7&C)vCO4_Ky1n;dAxVY-DeLPbE%wJ2)A|6jn;VNa zbV*jeR)65})cj&*s5lRy$b&*W@2j+e8bOBgqIgldUJl zG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66A~!21vmF3H2{ngD z;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpKoYWVNxtPI00000NkvXXu0mjfOd>TD delta 666 zcmV;L0%iTA1*HX$7k?lK1^@s6FYr0g0007PNkl6B-qV zm?w#RWPfTl+MU>k+Q8#@KjqJJN`gRj(~)RmNrck9ht@LelPtVOwp(J;k!T=gC#%o( z13-^E+g@aqc()pf{+j|0w)AH*Mq$54UjLv#jV$RYpz3Vjg$$=u>yjfBQOhL=^@ z+#4#$l|{~}HZ-?1Yy{lI*$N}*YDC`<{+;>_#S@USZ+nzZ2><{907*qoM6N<$g4HoZ AIsgCw diff --git a/doc/html/bdwn.png b/doc/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + TurboJPEG: Data Structure Index + + - + + - - - -
+ +
-
TurboJPEG 1.2.1
+
TurboJPEG +  1.2.1 +
+ + + -
-
-
-
Data Structure Index
-
-
- - -
  T  
-
tjregion   tjscalingfactor   tjtransform   
-
+
+ All Data Structures Functions Variables Typedefs Enumerations Enumerator Groups
@@ -80,8 +80,26 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
- +
+
+
Data Structure Index
+
+
+ + + + + + +
  T  
+
tjscalingfactor   tjtransform   
tjregion   
+ +
+ + diff --git a/doc/html/closed.png b/doc/html/closed.png index b7d4bd9fef2272c74b94762c9e2496177017775e..98cc2c909da37a6df914fbf67780eebd99c597f5 100644 GIT binary patch delta 102 zcmV-s0Ga=OgaMEwU`t6vK~#7F?cHq+Kp_Z*(MM~U$pSaPEnp^d>2z}grjWq#{_^k< z0YK$zeE_O5fQ^L-P$j`%%l^MkvJEaeFhpymi^7`@cp?ebn<=3b5O~rx^#A|>07*qo IM6N<$f|rOX*#H0l delta 96 zcmZo+tec<`s7MjVWp=ECAagp<1j^;uU0fEn(IvIe#)78&qol`;+0I1v| A!2kdN diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css index 74445fe..dabaff2 100644 --- a/doc/html/doxygen.css +++ b/doc/html/doxygen.css @@ -1,13 +1,12 @@ -/* The standard CSS for doxygen */ +/* The standard CSS for doxygen 1.8.3.1 */ body, table, div, p, dl { - font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; - font-size: 12px; + font: 400 14px/19px Roboto,sans-serif; } /* @group Heading Levels */ -h1 { +h1.groupheader { font-size: 150%; } @@ -17,14 +16,34 @@ h1 { margin: 10px 2px; } -h2 { - font-size: 120%; +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; } -h3 { +h3.groupheader { font-size: 100%; } +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + dt { font-weight: bold; } @@ -72,8 +91,6 @@ div.qindex, div.navtab{ background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; - margin: 2px; - padding: 2px; } div.qindex, div.navpath { @@ -123,12 +140,12 @@ a.el { a.elRef { } -a.code { - color: #4665A2; +a.code, a.code:visited { + color: #4665A2; } -a.codeRef { - color: #4665A2; +a.codeRef, a.codeRef:visited { + color: #4665A2; } /* @end */ @@ -137,20 +154,72 @@ dl.el { margin-left: -1cm; } -.fragment { +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 4px; + margin: 4px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { font-family: monospace, fixed; - font-size: 105%; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; } -pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; - padding: 4px 6px; - margin: 4px 8px 4px 2px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; } div.ah { @@ -183,15 +252,15 @@ div.groupText { } body { - background: white; + background-color: white; color: black; margin: 0; } div.contents { margin-top: 10px; - margin-left: 10px; - margin-right: 5px; + margin-left: 12px; + margin-right: 8px; } td.indexkey { @@ -200,6 +269,8 @@ td.indexkey { border: 1px solid #C4CFE5; margin: 2px 0px 2px 0; padding: 2px 10px; + white-space: nowrap; + vertical-align: top; } td.indexvalue { @@ -292,6 +363,13 @@ span.vhdllogic { color: #ff0000 } +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + /* @end */ /* @@ -345,6 +423,24 @@ table.memberdecls { padding: 0px; } +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { @@ -359,8 +455,11 @@ table.memberdecls { color: #555; } -.memItemLeft, .memItemRight, .memTemplParams { - border-top: 1px solid #C4CFE5; +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; } .memItemLeft, .memTemplItemLeft { @@ -374,6 +473,7 @@ table.memberdecls { .memTemplParams { color: #4665A2; white-space: nowrap; + font-size: 80%; } /* @end */ @@ -406,15 +506,29 @@ table.memberdecls { padding: 0; margin-bottom: 10px; margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; } .memname { - white-space: nowrap; font-weight: bold; margin-left: 6px; } -.memproto { +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { border-top: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; @@ -422,45 +536,55 @@ table.memberdecls { color: #253555; font-weight: bold; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; /* opera specific markup */ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 8px; - border-top-left-radius: 8px; + border-top-right-radius: 4px; + border-top-left-radius: 4px; /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -moz-border-radius-topright: 8px; - -moz-border-radius-topleft: 8px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; /* webkit specific markup */ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -webkit-border-top-right-radius: 8px; - -webkit-border-top-left-radius: 8px; - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; + -webkit-border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; } -.memdoc { +.memdoc, dl.reflist dd { border-bottom: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; - padding: 2px 5px; + padding: 6px 10px 2px 10px; background-color: #FBFCFD; border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; /* opera specific markup */ - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); /* firefox specific markup */ - -moz-border-radius-bottomleft: 8px; - -moz-border-radius-bottomright: 8px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); /* webkit specific markup */ - -webkit-border-bottom-left-radius: 8px; - -webkit-border-bottom-right-radius: 8px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; } .paramkey { @@ -478,9 +602,13 @@ table.memberdecls { .paramname em { font-style: normal; } +.paramname code { + line-height: 14px; +} .params, .retval, .exception, .tparams { - border-spacing: 6px 2px; + margin-left: 0px; + padding-left: 0px; } .params .paramname, .retval .paramname { @@ -498,105 +626,116 @@ table.memberdecls { vertical-align: top; } +table.mlabels { + border-spacing: 0px; +} +td.mlabels-left { + width: 100%; + padding: 0px; +} +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} -/* @end */ - -/* @group Directory (tree) */ - -/* for the tree view */ +span.mlabels { + margin-left: 8px; +} -.ftvtree { - font-family: sans-serif; - margin: 0px; +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; } -/* these are for tree view when used as main index */ -.directory { - font-size: 9pt; - font-weight: bold; - margin: 5px; -} -.directory h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} +/* @end */ -/* -The following two styles can be used to replace the root node title -with an image of your choice. Simply uncomment the next two styles, -specify the name of your image and be sure to set 'height' to the -proper pixel height of your image. -*/ +/* these are for tree view when not used as main index */ -/* -.directory h3.swap { - height: 61px; - background-repeat: no-repeat; - background-image: url("yourimage.gif"); -} -.directory h3.swap span { - display: none; +div.directory { + margin: 10px 0px; + border-top: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + width: 100%; } -*/ -.directory > h3 { - margin-top: 0; +.directory table { + border-collapse:collapse; } -.directory p { - margin: 0px; - white-space: nowrap; +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; } -.directory div { - display: none; - margin: 0px; +.directory td.entry { + white-space: nowrap; + padding-right: 6px; } -.directory img { - vertical-align: -30%; +.directory td.entry a { + outline:none; } -/* these are for tree view when not used as main index */ - -.directory-alt { - font-size: 100%; - font-weight: bold; +.directory td.entry a img { + border: none; } -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); } -.directory-alt > h3 { - margin-top: 0; +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; } -.directory-alt p { - margin: 0px; - white-space: nowrap; +.directory img { + vertical-align: -30%; } -.directory-alt div { - display: none; - margin: 0px; +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; } -.directory-alt img { - vertical-align: -30%; +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; } -/* @end */ - div.dynheader { margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } address { @@ -606,6 +745,8 @@ address { table.doxtable { border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; } table.doxtable td, table.doxtable th { @@ -619,9 +760,72 @@ table.doxtable th { font-size: 110%; padding-bottom: 4px; padding-top: 5px; - text-align:left; } +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 5px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 2px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + .tabsearch { top: 0px; left: 10px; @@ -637,6 +841,7 @@ table.doxtable th { font-size: 11px; background-image:url('tab_b.png'); background-repeat:repeat-x; + background-position: 0 -5px; height:30px; line-height:30px; color:#8AA0CC; @@ -664,6 +869,10 @@ table.doxtable th { display:block; text-decoration: none; outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; } .navpath li.navelem a:hover @@ -702,7 +911,6 @@ div.summary a div.ingroups { font-size: 8pt; - padding-left: 5px; width: 50%; text-align: left; } @@ -731,47 +939,74 @@ dl padding: 0 0 0 10px; } -dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section { - border-left:4px solid; - padding: 0 0 0 6px; + margin-left: 0px; + padding-left: 0px; } dl.note { + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; border-color: #D0C000; } dl.warning, dl.attention { + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; border-color: #FF0000; } dl.pre, dl.post, dl.invariant { + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; border-color: #00D000; } dl.deprecated { + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; border-color: #505050; } dl.todo { + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; border-color: #00C0E0; } dl.test { + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; border-color: #3030E0; } dl.bug { + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; border-color: #C08050; } +dl.section dd { + margin-bottom: 6px; +} + + #projectlogo { text-align: center; @@ -833,3 +1068,117 @@ dl.bug font-weight: bold; } +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 20px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png index 635ed52fce7057ac24df92ec7664088a881fa5d0..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 100644 GIT binary patch literal 3779 zcmV;!4m|ORP)tMIv#Q0*~7*`IBSO7_x;@a8#Zk6_PeKR_s92J&)(m+);m9Iz3blw)z#Gi zP!9lj4$%+*>Hz@HCmM9L9|8c+0u=!H$O3?R0Kgx|#WP<6fKfC8fM-CQZT|_r@`>VO zX^Hgb|9cJqpdJA5$MCEK`F_2@2Y@s>^+;pF`~jdI0Pvr|vl4`=C)EH@1IFe7pdJ8F zH(qGi004~QnF)Ggga~8v08kGAs2hKTATxr7pwfNk|4#_AaT>w8P6TV+R2kbS$v==} zAjf`s0g#V8lB+b3)5oEI*q+{Yt$MZDruD2^;$+(_%Qn+%v0X-bJO=;@kiJ^ygLBnC z?1OVv_%aex1M@jKU|Z~$eI?PoF4Vj>fDzyo zAiLfpXY*a^Sj-S5D0S3@#V$sRW)g)_1e#$%8xdM>Jm7?!h zu0P2X=xoN>^!4DoPRgph2(2va07yfpXF+WH7EOg1GY%Zn z7~1A<(z7Q$ktEXhW_?GMpHp9l_UL18F3KOsxu81pqoBiNbFSGsof-W z6~eloMoz=4?OOnl2J268x5rOY`dCk0us(uS#Ud4yqOr@?=Q57a}tit|BhY>}~frH1sP`ScHS_d)oqH^lYy zZ%VP`#10MlE~P?cE(%(#(AUSv_T{+;t@$U}El}(1ig`vZo`Rm;+5&(AYzJ^Ae=h2X z@Re%vHwZU>|f0NI&%$*4eJweC5OROQrpPMA@*w|o z()A==l}(@bv^&>H1Ob3C=<^|hob?0+xJ?QQ3-ueQC}zy&JQNib!OqSO@-=>XzxlSF zAZ^U*1l6EEmg3r};_HY>&Jo_{dOPEFTWPmt=U&F#+0(O59^UIlHbNX+eF8UzyDR*T z(=5X$VF3!gm@RooS-&iiUYGG^`hMR(07zr_xP`d!^BH?uD>Phl8Rdifx3Af^Zr`Ku ztL+~HkVeL#bJ)7;`=>;{KNRvjmc}1}c58Sr#Treq=4{xo!ATy|c>iRSp4`dzMMVd@ zL8?uwXDY}Wqgh4mH`|$BTXpUIu6A1-cSq%hJw;@^Zr8TP=GMh*p(m(tN7@!^D~sl$ zz^tf4II4|};+irE$Fnm4NTc5%p{PRA`%}Zk`CE5?#h3|xcyQsS#iONZ z6H(@^i9td!$z~bZiJLTax$o>r(p}3o@< zyD7%(>ZYvy=6$U3e!F{Z`uSaYy`xQyl?b{}eg|G3&fz*`QH@mDUn)1%#5u`0m$%D} z?;tZ0u(mWeMV0QtzjgN!lT*pNRj;6510Wwx?Yi_=tYw|J#7@(Xe7ifDzXuK;JB;QO z#bg~K$cgm$@{QiL_3yr}y&~wuv=P=#O&Tj=Sr)aCUlYmZMcw?)T?c%0rUe1cS+o!qs_ zQ6Gp)-{)V!;=q}llyK3|^WeLKyjf%y;xHku;9(vM!j|~<7w1c*Mk-;P{T&yG) z@C-8E?QPynNQ<8f01D`2qexcVEIOU?y}MG)TAE6&VT5`rK8s(4PE;uQ92LTXUQ<>^ ztyQ@=@kRdh@ebUG^Z6NWWIL;_IGJ2ST>$t!$m$qvtj0Qmw8moN6GUV^!QKNK zHBXCtUH8)RY9++gH_TUV4^=-j$t}dD3qsN7GclJ^Zc&(j6&a_!$jCf}%c5ey`pm~1)@{yI3 zTdWyB+*X{JFw#z;PwRr5evb2!ueWF;v`B0HoUu4-(~aL=z;OXUUEtG`_$)Oxw6FKg zEzY`CyKaSBK3xt#8gA|r_|Kehn_HYVBMpEwbn9-fI*!u*eTA1ef8Mkl1=!jV4oYwWYM}i`A>_F4nhmlCIC6WLa zY%;4&@AlnaG11ejl61Jev21|r*m+?Kru3;1tFDl}#!OzUp6c>go4{C|^erwpG*&h6bspUPJag}oOkN2912Y3I?(eRc@U9>z#HPBHC?nps7H5!zP``90!Q1n80jo+B3TWXp!8Pe zwuKuLLI6l3Gv@+QH*Y}2wPLPQ1^EZhT#+Ed8q8Wo z1pTmIBxv14-{l&QVKxAyQF#8Q@NeJwWdKk>?cpiJLkJr+aZ!Me+Cfp!?FWSRf^j2k z73BRR{WSKaMkJ>1Nbx5dan5hg^_}O{Tj6u%iV%#QGz0Q@j{R^Ik)Z*+(YvY2ziBG)?AmJa|JV%4UT$k`hcOg5r9R?5>?o~JzK zJCrj&{i#hG>N7!B4kNX(%igb%kDj0fOQThC-8mtfap82PNRXr1D>lbgg)dYTQ(kbx z`Ee5kXG~Bh+BHQBf|kJEy6(ga%WfhvdQNDuOfQoe377l#ht&DrMGeIsI5C<&ai zWG$|hop2@@q5YDa)_-A?B02W;#fH!%k`daQLEItaJJ8Yf1L%8x;kg?)k)00P-lH+w z)5$QNV6r2$YtnV(4o=0^3{kmaXn*Dm0F*fU(@o)yVVjk|ln8ea6BMy%vZAhW9|wvA z8RoDkVoMEz1d>|5(k0Nw>22ZT){V<3$^C-cN+|~hKt2)){+l-?3m@-$c?-dlzQ)q- zZ)j%n^gerV{|+t}9m1_&&Ly!9$rtG4XX|WQ8`xYzGC~U@nYh~g(z9)bdAl#xH)xd5a=@|qql z|FzEil{P5(@gy!4ek05i$>`E^G~{;pnf6ftpLh$h#W?^#4UkPfa;;?bsIe&kz!+40 zI|6`F2n020)-r`pFaZ38F!S-lJM-o&inOw|66=GMeP@xQU5ghQH{~5Uh~TMTd;I9` z>YhVB`e^EVj*S7JF39ZgNf}A-0DwOcTT63ydN$I3b?yBQtUI*_fae~kPvzoD$zjX3 zoqBe#>12im4WzZ=f^4+u=!lA|#r%1`WB0-6*3BL#at`47#ebPpR|D1b)3BjT34nYY z%Ds%d?5$|{LgOIaRO{{oC&RK`O91$fqwM0(C_TALcozu*fWHb%%q&p-q{_8*2Zsi^ zh1ZCnr^UYa;4vQEtHk{~zi>wwMC5o{S=$P0X681y`SXwFH?Ewn{x-MOZynmc)JT5v zuHLwh;tLfxRrr%|k370}GofLl7thg>ACWWY&msqaVu&ry+`7+Ss>NL^%T1|z{IGMA zW-SKl=V-^{(f!Kf^#3(|T2W47d(%JVCI4JgRrT1pNz>+ietmFToNv^`gzC@&O-)+i zPQ~RwK8%C_vf%;%e>NyTp~dM5;!C|N0Q^6|CEb7Bw=Vz~$1#FA;Z*?mKSC)Hl-20s t8QyHj(g6VK0RYbl8UjE)0O0w=e*@m04r>stuEhWV002ovPDHLkV1hl;dM*F} literal 3942 zcmV-s51H_ZP)95ENDh(OT9xpYZC{M(=rqI* z+1erNEr&9zRjUI-4rN=4BBz>P@ys*xOjGRjzVE*Fx_qvyt9d@B@BO*&@8Mq!nM{Tc z_WoM84-~xLreSL9@vgZ{m2dF}`u=^ZF3syQ-s2tnBwCI3ZFvSfI20Wbj236~Urq*8Kfw@RKKfRQTgE>}uUHK^ptamY=o)LU(xy55zNQ(`qZ znZ&$O075mrrInIXQgw4%GCbMD8Vn`3n3$EaRwtP1D{A!Gs=e!L%3;ayv@I{rAw{xw z^x^>EIWQM8ob3m}$(BaupDMV;Ed8w5|i(*e`7rU$TOc&1o7`|!LyN5jHI z7uWAR!v4c2xMp?}QmRYyf>i}tYGU(g=>DW&==J@GbhR z5@BNVY3O$`^D%gk4khm9XpFhuwzxUhi9T=Du4rpVuYRSMPHeDqo+4htnZRU@G9`0& z9~p)CsFl1|t*wjfoTo&%davN^3RfJUhQ{ZZIAcD77X^XsF_iR&ZMQ;p>K5*+*48)x z+=<>nh+6Uq85jOkg>{z>a;+V`s(I;I%*5s+R@9a^wNoZ03(g9-EcH%uHvX&yp7`D#`9Kw>DU3s zjD-VuW_A-K)unlS4O3f>_B%pPONUmI#oyL};Lglp3=04>0eBBEw$D1k-$WTsoi#K* z$7h`NcyRZsZ#w~6I<%~u!^xDofYrzF>zVIj2N>Ijs`mVR(Oy&*9f}<{JtQj8jJT!oEc!NQXBq5y|6ET*N?7ox*E6#{i- z@_DLD^IYTtg|Pg?A~!7@OCd8p^)kxK%VBM84docx$Z{MvO)iiqep@or-N}TEU8$%; zJih?#yJ9)V1s_`}c3XbY9V}nEKwNz8ILmR|v)(w|D@oVG;=i`+$*)!(xH{9#$2Za;pyZ1wgU#)mHl|&8%iwu%yncO z`T32Ib0$D}j`c}}5M@M#7oR&G=QwU!!Ja*P7|NJt1@lo=d{_dY-q_lmDcH7{BHncF zR@^PmcLC6EsN?6N{fV3o8}>?h9X_@;=&-p7%tms7$_{3w(anwek_k&<&)~c$Ar?S> zy9gKavndTmxqAbE?SMgcWhXPENdKdz7ntt55Y3Hs3jjc~uR-#$tR(1a_abv9`-QzG z^J0Fsbd&yruq%xAsxf3rc=T}$Zx|AD%x{Fd=? z{qhl3kG5w-PqVK9-Gru%7UIEw)bt$ZMF|Z6HpmO)F%@GNT8yT|#FuWPxv@@Ic={;6 zU7)e!XG|1dx=kU|&|)+m+$&|Yw92Fa;*MnegXcCf8XsHfqg_F5t)3Jt8)EkXKuY21 zqt%4}@R8hK*(_JO0*H+Pa)6Pp&K49rKNeQEYb*x9WY`!`Vh3|80YF%I`lxv9_!$hD zOh$>zWaRIW!);6`vA$Zp;5lnGyX^^N%YEjCeJMHPolKCE1ttIqK<$0w&LcE8)`_c2 z^H^qf6ACV0t7FLLCsu#mL&Mb8gE@rZE#k+1Nrrxw+{N0^#bN*~!qt2>S4e#jC$a$` ze4@{)$aTEYq_!#2|t@Fj3e?w-XVuG$Z}kAR?_kgJAlZIJ)0{eHw#fybNooA zp02jyYVc&w!}m#BVP>ef2|U^J(A-#O1R#A&><*?Y! zOwml{CnE+aU3JfKE@uzge(qMY{^6siuXFt;+mMbapU;Ppejl=L#>s2#SMBbfP9AFT znEVA=TBtZ6d-GfF>kOxylg>Ek%qTp*h2ze!^^hOsmKOEE6b;maQ>~R>3#z`Zawbik z88OTykU3_!Atg^+vnM=1n}?%<$dHzn)?k&T#RWwb+*y;XNQbYNHKo3wr~&}Qa$id; z6^D*K9RTQZUuQVg)g~P%!BIiv+cXllt)KEP9IN)1udQKf>p|~lXj7K<-9}0Q%i9+K zXaF7qXclE>sf)7)J4_M%V{;(sFT7HN$o0#_qU#Ah1D{ zon=JihPcgG5xHuvQwOXBkt3(iUdx{6Gn|aa>@C9Cqg%rPK(+REZ4>6t3z7m@Aj;0l zSHh&%cKSJ*+WOJGwe?Y7d(9RAy)&NVS6uj}1m@U}jXH3oVQT9E0A)$ZDRdK>;_i;+ z7vbEoI7$1XK6vNxT(_sJ(GM4s92e;gB&Q zDO;(Ve^%gPG&lWW1fUf_=9-Q1%&`s%aD^o`Q2u`WI9V>Qm#D5?SW<)Njmt@aR5@6( zL4cdTo+Jg@>Brm1^_gf%0Z?}1AppR3NdFE5uzdpBZz;{Thd6SI-$gb2}pFAww$*j(2=s{mdz2E;lBvVcrN@}i2bC`Q5Y_;BID^f0J+ACVhyQsLg0@`okIk+i=LJ=3yvI*oASj62 za3C{Pu_fQ+atw!zN{$Shr*_UV=|jp4#CqWeGE?Jb`pq!|5bDES&-Ix=-N>DpydHqW z+-{QS+i)d;uGS)M%Suw9khR}3N82j|S{a#&Tctme0s%mTy<1S|;@M-+S4#o@!qr;r z+w(n=;@43Y_n#dI0Gb(T0{G7k-KY8k`MPM_Bss$?)SK){KJMrwv!vz42_U_Za zX7lDqiU8ZvCAfGpAtfVC5bQrYa4C)M9G$S4D&VqpJ8)lm$t5FAAR%ywf>*~VaivC70RVFXISv4Lx&tk^Cf1)qQ|rxp z*8H>)cgoM;(eKxH14u~~@JopNr9@A z#-yXVG?$es;EPqsn-j?45^L52U=nT#0A^T3JY$&B3EH&%2UHdv3P=_3$!n76!34ks zz^2ii@sXAu8LKYMmG=_^*qtiiOFNlG3?QYtG%wrCZh|)vlj8vq3sw~f1b8;_TMB>z zPSyDQy_9bbXD*#sNRGMzfSAwUD}ASX;ZGQcGdE=9q~ORU{v$}=z2Bc8EOe2S&);jS zCZB8P`hPoV1NBk)TQP2z{q$NL-GLUc7%>&fecE^E{I5gs?8!qTK7VgR7Z?}-`YG|z zVN-NvOlQ+B;~J*69_Xd1n-0MLKTY6&*%rTi*0^HXniz8{bCMsVpSXqs(GGO)*_#Kz z9YBCQ_VRhtwhMfppMh@OdxjCN0mH`5hKZr>UoxMx`W~u^kD&bskplglOiRxQvep*2 z0mk+kMP>J)K`8X3`6Zq|X~5IQ-_rrOn+_WvU{1Gs{ow1-Eb;K(Z?p$@ugXpr^?PM( z(5Hv;$*X=QZaqG_4q)N1v9sO(Dsei!;%IcIztt6YUs{yj z^77e`UYa^%<-Ts+d*b=ihKt?0_sj!ePNO@K*PGmGD*v^;rRAkduikx~UNk=@{XKeV zp_ir(dTaGVWBr{_02Kg2Xmlsn|IvIIRYivbo|L{yx}yX5Bte@P6C>1KyqvYnT{boB#j-07*qoM6N<$f^XQQ A+yDRo diff --git a/doc/html/dynsections.js b/doc/html/dynsections.js new file mode 100644 index 0000000..ed092c7 --- /dev/null +++ b/doc/html/dynsections.js @@ -0,0 +1,97 @@ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} +function toggleLevel(level) +{ + $('table.directory tr').each(function(){ + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (ldjv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka literal 0 HcmV?d00001 diff --git a/doc/html/ftv2cl.png b/doc/html/ftv2cl.png new file mode 100644 index 0000000000000000000000000000000000000000..132f6577bf7f085344904602815a260d29f55d9b GIT binary patch literal 453 zcmV;$0XqJPP)VBF;ev;toEj8_OB0EQg5eYilIj#JZG_m^33l3^k4mtzx!TVD?g)Y$ zrvwRDSqT!wLIM$dWCIa$vtxE|mzbTzu-y&$FvF6WA2a{Wr1g}`WdPT-0JzEZ0IxAv z-Z+ejZc&H;I5-pb_SUB}04j0^V)3t{`z<7asDl2Tw3w3sP%)0^8$bhEg)IOTBcRXv zFfq~3&gvJ$F-U7mpBW8z1GY~HK&7h4^YI~Orv~wLnC0PP_dAkv;nzX{9Q|8Gv=2ca z@v)c9T;D#h`TZ2X&&$ff2wedmot995de~-s3I)yauahg;7qn*?1n?F$e+PwP37}~; z1NKUk7reVK^7A;$QRW7qAx40HHUZ<|k3U%nz(Ec`#i+q9K!dgcROAlCS?`L= v>#=f?wF5ZND!1uAfQsk;KN^4&*8~0npJiJ%2dj9(00000NkvXXu0mjfWVFf_ literal 0 HcmV?d00001 diff --git a/doc/html/ftv2doc.png b/doc/html/ftv2doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/doc/html/ftv2folderclosed.png b/doc/html/ftv2folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/doc/html/ftv2lastnode.png b/doc/html/ftv2lastnode.png new file mode 100644 index 0000000000000000000000000000000000000000..63c605bb4c3d941c921a4b6cfa74951e946bcb48 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%QnH>djv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka literal 0 HcmV?d00001 diff --git a/doc/html/ftv2link.png b/doc/html/ftv2link.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/doc/html/ftv2mlastnode.png b/doc/html/ftv2mlastnode.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63f6d38c4b9ec907b820192ebe9724ed6eca22 GIT binary patch literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 literal 0 HcmV?d00001 diff --git a/doc/html/ftv2mnode.png b/doc/html/ftv2mnode.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63f6d38c4b9ec907b820192ebe9724ed6eca22 GIT binary patch literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 literal 0 HcmV?d00001 diff --git a/doc/html/ftv2mo.png b/doc/html/ftv2mo.png new file mode 100644 index 0000000000000000000000000000000000000000..4bfb80f76e65815989a9350ad79d8ce45380e2b1 GIT binary patch literal 403 zcmV;E0c`$>P)${!fXv7NWJ%@%u4(KapRY>T6_x;E zxE7kt!}Tiw8@d9Sd`rTGum>z#Q14vIm`wm1#-byD1muMi02@YNO5LRF0o!Y{`a!Ya z{^&p0Su|s705&2QxmqdexG+-zNKL3f@8gTQSJrKByfo+oNJ^-{|Mn||Q5SDwjQVsS zr1}7o5-QMs>gYIMD>GRw@$lT`z4r-_m{5U#cR{urD_)TOeY)(UD|qZ^&y`IVijqk~ xs(9-kWFr7E^!lgi8GsFK5kOY_{Xbgf0^etEU%fLevs?fG002ovPDHLkV1nB&vX1}& literal 0 HcmV?d00001 diff --git a/doc/html/ftv2node.png b/doc/html/ftv2node.png new file mode 100644 index 0000000000000000000000000000000000000000..63c605bb4c3d941c921a4b6cfa74951e946bcb48 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%QnH>djv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka literal 0 HcmV?d00001 diff --git a/doc/html/ftv2ns.png b/doc/html/ftv2ns.png new file mode 100644 index 0000000000000000000000000000000000000000..72e3d71c2892d6f00e259facebc88b45f6db2e35 GIT binary patch literal 388 zcmV-~0ek+5P)f+++#cT|!CkD&4pnIkeMEUEM*>`*9>+Juji$!h-mW%M^8s9957{3nvbrz^&=u<~TAUrFROkmt%^F~Ez+-c53Lv%iH3d38!Rv?K zrb&MYAhp;Gf<}wS;9ZZq2@;!uYG;=Z>~GKE^{HD4keu}lnyqhc>kWX^tQn|warJ~h zT+rtMkdz6aHoN%z(o|&wpu@@OpJnF_z{PA)6(FHw02iHslz^(N{4*+K9)QJHR87wT iTyp>aXaF{u2lxRou|^4tux6eB0000^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K literal 0 HcmV?d00001 diff --git a/doc/html/ftv2pnode.png b/doc/html/ftv2pnode.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ee22f937a07d1dbfc27c669d11f8ed13e2f152 GIT binary patch literal 229 zcmV^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K literal 0 HcmV?d00001 diff --git a/doc/html/ftv2splitbar.png b/doc/html/ftv2splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/doc/html/ftv2vertline.png b/doc/html/ftv2vertline.png new file mode 100644 index 0000000000000000000000000000000000000000..63c605bb4c3d941c921a4b6cfa74951e946bcb48 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!3HExu9B$%QnH>djv*C{Z|`mdau^P8_z}#X h?B8GEpdi4(BFDx$je&7RrDQEg&ePS;Wt~$(69Dh@6T1Ka literal 0 HcmV?d00001 diff --git a/doc/html/functions.html b/doc/html/functions.html index a3470a4..7af0d8e 100644 --- a/doc/html/functions.html +++ b/doc/html/functions.html @@ -2,35 +2,45 @@ + + TurboJPEG: Data Fields + + - + + - - - -
+ +
-
TurboJPEG 1.2.1
+
TurboJPEG +  1.2.1 +
+ + + +
+ + + + +
+
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
  • customFilter @@ -98,23 +122,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : tjregion
-
- - - - -
- -
- - +
+ + diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html index ea240cc..e6a6f72 100644 --- a/doc/html/functions_vars.html +++ b/doc/html/functions_vars.html @@ -2,35 +2,45 @@ + + TurboJPEG: Data Fields - Variables + + - + + - - - -
+ +
-
TurboJPEG 1.2.1
+
TurboJPEG +  1.2.1 +
+ + + +
+ + + + +
+
+
 
  • customFilter @@ -98,23 +122,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : tjregion
-
- - - - -
- -
- - +
+ + diff --git a/doc/html/group___turbo_j_p_e_g.html b/doc/html/group___turbo_j_p_e_g.html index cd14f44..b0ab027 100644 --- a/doc/html/group___turbo_j_p_e_g.html +++ b/doc/html/group___turbo_j_p_e_g.html @@ -2,35 +2,45 @@ + + TurboJPEG: TurboJPEG + + - + + - - - -
+ +
-
TurboJPEG 1.2.1
+
TurboJPEG +  1.2.1 +
+ + + +
+ + + + +
+
+ +

TurboJPEG API. More...

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + +

+

Data Structures

struct  tjscalingfactor
 Scaling factor. More...
struct  tjregion
 Cropping region. More...
struct  tjtransform
 Lossless transform. More...

-Defines

#define TJ_NUMSAMP
 The number of chrominance subsampling options.
#define TJ_NUMPF
 The number of pixel formats.
#define TJFLAG_BOTTOMUP
 The uncompressed source/destination image is stored in bottom-up (Windows, OpenGL) order, not top-down (X11) order.
#define TJFLAG_FORCEMMX
 Turn off CPU auto-detection and force TurboJPEG to use MMX code (if the underlying codec supports it.)
#define TJFLAG_FORCESSE
 Turn off CPU auto-detection and force TurboJPEG to use SSE code (if the underlying codec supports it.)
#define TJFLAG_FORCESSE2
 Turn off CPU auto-detection and force TurboJPEG to use SSE2 code (if the underlying codec supports it.)
#define TJFLAG_FORCESSE3
 Turn off CPU auto-detection and force TurboJPEG to use SSE3 code (if the underlying codec supports it.)
#define TJFLAG_FASTUPSAMPLE
 When decompressing, use the fastest chrominance upsampling algorithm available in the underlying codec.
#define TJFLAG_NOREALLOC
 Disable buffer (re)allocation.
#define TJFLAG_FASTDCT
 Use the fastest DCT/IDCT algorithm available in the underlying codec.
#define TJFLAG_ACCURATEDCT
 Use the most accurate DCT/IDCT algorithm available in the underlying codec.
#define TJ_NUMXOP
 Number of transform operations.
#define TJXOPT_PERFECT
 This option will cause tjTransform() to return an error if the transform is not perfect.
#define TJXOPT_TRIM
 This option will cause tjTransform() to discard any partial MCU blocks that cannot be transformed.
#define TJXOPT_CROP
 This option will enable lossless cropping.
#define TJXOPT_GRAY
 This option will discard the color data in the input image and produce a grayscale output image.
#define TJXOPT_NOOUTPUT
 This option will prevent tjTransform() from outputting a JPEG image for this particular transform (this can be used in conjunction with a custom filter to capture the transformed DCT coefficients without transcoding them.)
#define TJPAD(width)
 Pad the given width to the nearest 32-bit boundary.
#define TJSCALED(dimension, scalingFactor)
 Compute the scaled value of dimension using the given scaling factor.

+

struct  tjscalingfactor
 Scaling factor. More...
 
struct  tjregion
 Cropping region. More...
 
struct  tjtransform
 Lossless transform. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

#define TJ_NUMSAMP
 The number of chrominance subsampling options. More...
 
#define TJ_NUMPF
 The number of pixel formats. More...
 
#define TJFLAG_BOTTOMUP
 The uncompressed source/destination image is stored in bottom-up (Windows, OpenGL) order, not top-down (X11) order. More...
 
#define TJFLAG_FORCEMMX
 Turn off CPU auto-detection and force TurboJPEG to use MMX code (if the underlying codec supports it.) More...
 
#define TJFLAG_FORCESSE
 Turn off CPU auto-detection and force TurboJPEG to use SSE code (if the underlying codec supports it.) More...
 
#define TJFLAG_FORCESSE2
 Turn off CPU auto-detection and force TurboJPEG to use SSE2 code (if the underlying codec supports it.) More...
 
#define TJFLAG_FORCESSE3
 Turn off CPU auto-detection and force TurboJPEG to use SSE3 code (if the underlying codec supports it.) More...
 
#define TJFLAG_FASTUPSAMPLE
 When decompressing an image that was compressed using chrominance subsampling, use the fastest chrominance upsampling algorithm available in the underlying codec. More...
 
#define TJFLAG_NOREALLOC
 Disable buffer (re)allocation. More...
 
#define TJFLAG_FASTDCT
 Use the fastest DCT/IDCT algorithm available in the underlying codec. More...
 
#define TJFLAG_ACCURATEDCT
 Use the most accurate DCT/IDCT algorithm available in the underlying codec. More...
 
#define TJ_NUMXOP
 The number of transform operations. More...
 
#define TJXOPT_PERFECT
 This option will cause tjTransform() to return an error if the transform is not perfect. More...
 
#define TJXOPT_TRIM
 This option will cause tjTransform() to discard any partial MCU blocks that cannot be transformed. More...
 
#define TJXOPT_CROP
 This option will enable lossless cropping. More...
 
#define TJXOPT_GRAY
 This option will discard the color data in the input image and produce a grayscale output image. More...
 
#define TJXOPT_NOOUTPUT
 This option will prevent tjTransform() from outputting a JPEG image for this particular transform (this can be used in conjunction with a custom filter to capture the transformed DCT coefficients without transcoding them.) More...
 
#define TJPAD(width)
 Pad the given width to the nearest 32-bit boundary. More...
 
#define TJSCALED(dimension, scalingFactor)
 Compute the scaled value of dimension using the given scaling factor. More...
 
+ - - - - - + + + + + +

Typedefs

typedef struct tjtransform tjtransform
 Lossless transform.
typedef void * tjhandle
 TurboJPEG instance handle.

+

typedef struct tjtransform tjtransform
 Lossless transform. More...
 
typedef void * tjhandle
 TurboJPEG instance handle. More...
 
+ -   TJSAMP_440
} - - + +TJPF_ARGB
} - - + +TJXOP_ROT270
} - - + +

Enumerations

enum  TJSAMP {
+
enum  TJSAMP {
  TJSAMP_444, TJSAMP_422, TJSAMP_420, @@ -130,8 +181,9 @@ Enumerations
 Chrominance subsampling options. More...
enum  TJPF {
+
 Chrominance subsampling options. More...
 
enum  TJPF {
  TJPF_RGB, TJPF_BGR, TJPF_RGBX, @@ -147,8 +199,9 @@ Enumerations
 Pixel formats. More...
enum  TJXOP {
+
 Pixel formats. More...
 
enum  TJXOP {
  TJXOP_NONE, TJXOP_HFLIP, TJXOP_VFLIP, @@ -160,61 +213,86 @@ Enumerations
 Transform operations for tjTransform() More...

+

 Transform operations for tjTransform() More...
 
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Functions

DLLEXPORT tjhandle DLLCALL tjInitCompress (void)
 Create a TurboJPEG compressor instance.
DLLEXPORT int DLLCALL tjCompress2 (tjhandle handle, unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat, unsigned char **jpegBuf, unsigned long *jpegSize, int jpegSubsamp, int jpegQual, int flags)
 Compress an RGB or grayscale image into a JPEG image.
DLLEXPORT unsigned long DLLCALL tjBufSize (int width, int height, int jpegSubsamp)
 The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters.
DLLEXPORT unsigned long DLLCALL tjBufSizeYUV (int width, int height, int subsamp)
 The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters.
DLLEXPORT int DLLCALL tjEncodeYUV2 (tjhandle handle, unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat, unsigned char *dstBuf, int subsamp, int flags)
 Encode an RGB or grayscale image into a YUV planar image.
DLLEXPORT tjhandle DLLCALL tjInitDecompress (void)
 Create a TurboJPEG decompressor instance.
DLLEXPORT int DLLCALL tjDecompressHeader2 (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height, int *jpegSubsamp)
 Retrieve information about a JPEG image without decompressing it.
DLLEXPORT tjscalingfactor *DLLCALL tjGetScalingFactors (int *numscalingfactors)
 Returns a list of fractional scaling factors that the JPEG decompressor in this implementation of TurboJPEG supports.
DLLEXPORT int DLLCALL tjDecompress2 (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf, int width, int pitch, int height, int pixelFormat, int flags)
 Decompress a JPEG image to an RGB or grayscale image.
DLLEXPORT int DLLCALL tjDecompressToYUV (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf, int flags)
 Decompress a JPEG image to a YUV planar image.
DLLEXPORT tjhandle DLLCALL tjInitTransform (void)
 Create a new TurboJPEG transformer instance.
DLLEXPORT int DLLCALL tjTransform (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, int n, unsigned char **dstBufs, unsigned long *dstSizes, tjtransform *transforms, int flags)
 Losslessly transform a JPEG image into another JPEG image.
DLLEXPORT int DLLCALL tjDestroy (tjhandle handle)
 Destroy a TurboJPEG compressor, decompressor, or transformer instance.
DLLEXPORT unsigned char *DLLCALL tjAlloc (int bytes)
 Allocate an image buffer for use with TurboJPEG.
DLLEXPORT void DLLCALL tjFree (unsigned char *buffer)
 Free an image buffer previously allocated by TurboJPEG.
DLLEXPORT char *DLLCALL tjGetErrorStr (void)
 Returns a descriptive error message explaining why the last command failed.

+

DLLEXPORT tjhandle DLLCALL tjInitCompress (void)
 Create a TurboJPEG compressor instance. More...
 
DLLEXPORT int DLLCALL tjCompress2 (tjhandle handle, unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat, unsigned char **jpegBuf, unsigned long *jpegSize, int jpegSubsamp, int jpegQual, int flags)
 Compress an RGB or grayscale image into a JPEG image. More...
 
DLLEXPORT unsigned long DLLCALL tjBufSize (int width, int height, int jpegSubsamp)
 The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters. More...
 
DLLEXPORT unsigned long DLLCALL tjBufSizeYUV (int width, int height, int subsamp)
 The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters. More...
 
DLLEXPORT int DLLCALL tjEncodeYUV2 (tjhandle handle, unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat, unsigned char *dstBuf, int subsamp, int flags)
 Encode an RGB or grayscale image into a YUV planar image. More...
 
DLLEXPORT tjhandle DLLCALL tjInitDecompress (void)
 Create a TurboJPEG decompressor instance. More...
 
DLLEXPORT int DLLCALL tjDecompressHeader2 (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height, int *jpegSubsamp)
 Retrieve information about a JPEG image without decompressing it. More...
 
DLLEXPORT tjscalingfactor *DLLCALL tjGetScalingFactors (int *numscalingfactors)
 Returns a list of fractional scaling factors that the JPEG decompressor in this implementation of TurboJPEG supports. More...
 
DLLEXPORT int DLLCALL tjDecompress2 (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf, int width, int pitch, int height, int pixelFormat, int flags)
 Decompress a JPEG image to an RGB or grayscale image. More...
 
DLLEXPORT int DLLCALL tjDecompressToYUV (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf, int flags)
 Decompress a JPEG image to a YUV planar image. More...
 
DLLEXPORT tjhandle DLLCALL tjInitTransform (void)
 Create a new TurboJPEG transformer instance. More...
 
DLLEXPORT int DLLCALL tjTransform (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, int n, unsigned char **dstBufs, unsigned long *dstSizes, tjtransform *transforms, int flags)
 Losslessly transform a JPEG image into another JPEG image. More...
 
DLLEXPORT int DLLCALL tjDestroy (tjhandle handle)
 Destroy a TurboJPEG compressor, decompressor, or transformer instance. More...
 
DLLEXPORT unsigned char *DLLCALL tjAlloc (int bytes)
 Allocate an image buffer for use with TurboJPEG. More...
 
DLLEXPORT void DLLCALL tjFree (unsigned char *buffer)
 Free an image buffer previously allocated by TurboJPEG. More...
 
DLLEXPORT char *DLLCALL tjGetErrorStr (void)
 Returns a descriptive error message explaining why the last command failed. More...
 
+ - - - - - - - - - - - - + + + + + + + + + + + + + + + + + +

Variables

static const int tjMCUWidth [TJ_NUMSAMP]
 MCU block width (in pixels) for a given level of chrominance subsampling.
static const int tjMCUHeight [TJ_NUMSAMP]
 MCU block height (in pixels) for a given level of chrominance subsampling.
static const int tjRedOffset [TJ_NUMPF]
 Red offset (in bytes) for a given pixel format.
static const int tjGreenOffset [TJ_NUMPF]
 Green offset (in bytes) for a given pixel format.
static const int tjBlueOffset [TJ_NUMPF]
 Blue offset (in bytes) for a given pixel format.
static const int tjPixelSize [TJ_NUMPF]
 Pixel size (in bytes) for a given pixel format.
static const int tjMCUWidth [TJ_NUMSAMP]
 MCU block width (in pixels) for a given level of chrominance subsampling. More...
 
static const int tjMCUHeight [TJ_NUMSAMP]
 MCU block height (in pixels) for a given level of chrominance subsampling. More...
 
static const int tjRedOffset [TJ_NUMPF]
 Red offset (in bytes) for a given pixel format. More...
 
static const int tjGreenOffset [TJ_NUMPF]
 Green offset (in bytes) for a given pixel format. More...
 
static const int tjBlueOffset [TJ_NUMPF]
 Blue offset (in bytes) for a given pixel format. More...
 
static const int tjPixelSize [TJ_NUMPF]
 Pixel size (in bytes) for a given pixel format. More...
 
-

Detailed Description

+

Detailed Description

TurboJPEG API.

This API provides an interface for generating, decoding, and transforming planar YUV and JPEG images in memory.

-

Define Documentation

- +

Macro Definition Documentation

+
@@ -222,14 +300,13 @@ Variables
#define TJ_NUMPF
-
-
+

The number of pixel formats.

- +
@@ -237,14 +314,13 @@ Variables
#define TJ_NUMSAMP
-
-
+

The number of chrominance subsampling options.

- +
@@ -252,14 +328,13 @@ Variables
#define TJ_NUMXOP
-
-
+
-

Number of transform operations.

+

The number of transform operations.

- +
@@ -267,15 +342,14 @@ Variables
#define TJFLAG_ACCURATEDCT
-
-
+

Use the most accurate DCT/IDCT algorithm available in the underlying codec.

-

The default if this flag is not specified is implementation-specific. The libjpeg implementation, for example, uses the fast algorithm by default when compressing, because this has been shown to have only a very slight effect on accuracy, but it uses the accurate algorithm when decompressing, because this has been shown to have a larger effect.

+

The default if this flag is not specified is implementation-specific. For example, the implementation of TurboJPEG for libjpeg[-turbo] uses the fast algorithm by default when compressing, because this has been shown to have only a very slight effect on accuracy, but it uses the accurate algorithm when decompressing, because this has been shown to have a larger effect.

- +
@@ -283,14 +357,13 @@ Variables
#define TJFLAG_BOTTOMUP
-
-
+

The uncompressed source/destination image is stored in bottom-up (Windows, OpenGL) order, not top-down (X11) order.

- +
@@ -298,15 +371,14 @@ Variables
#define TJFLAG_FASTDCT
-
-
+

Use the fastest DCT/IDCT algorithm available in the underlying codec.

-

The default if this flag is not specified is implementation-specific. The libjpeg implementation, for example, uses the fast algorithm by default when compressing, because this has been shown to have only a very slight effect on accuracy, but it uses the accurate algorithm when decompressing, because this has been shown to have a larger effect.

+

The default if this flag is not specified is implementation-specific. For example, the implementation of TurboJPEG for libjpeg[-turbo] uses the fast algorithm by default when compressing, because this has been shown to have only a very slight effect on accuracy, but it uses the accurate algorithm when decompressing, because this has been shown to have a larger effect.

- +
@@ -314,15 +386,14 @@ Variables
#define TJFLAG_FASTUPSAMPLE
-
-
+
-

When decompressing, use the fastest chrominance upsampling algorithm available in the underlying codec.

+

When decompressing an image that was compressed using chrominance subsampling, use the fastest chrominance upsampling algorithm available in the underlying codec.

The default is to use smooth upsampling, which creates a smooth transition between neighboring chrominance components in order to reduce upsampling artifacts in the decompressed image.

- +
@@ -330,14 +401,13 @@ Variables
#define TJFLAG_FORCEMMX
-
-
+

Turn off CPU auto-detection and force TurboJPEG to use MMX code (if the underlying codec supports it.)

- +
@@ -345,14 +415,13 @@ Variables
#define TJFLAG_FORCESSE
-
-
+

Turn off CPU auto-detection and force TurboJPEG to use SSE code (if the underlying codec supports it.)

- +
@@ -360,14 +429,13 @@ Variables
#define TJFLAG_FORCESSE2
-
-
+

Turn off CPU auto-detection and force TurboJPEG to use SSE2 code (if the underlying codec supports it.)

- +
@@ -375,14 +443,13 @@ Variables
#define TJFLAG_FORCESSE3
-
-
+

Turn off CPU auto-detection and force TurboJPEG to use SSE3 code (if the underlying codec supports it.)

- +
@@ -390,15 +457,14 @@ Variables
#define TJFLAG_NOREALLOC
-
-
+

Disable buffer (re)allocation.

If passed to tjCompress2() or tjTransform(), this flag will cause those functions to generate an error if the JPEG image buffer is invalid or too small rather than attempting to allocate or reallocate that buffer. This reproduces the behavior of earlier versions of TurboJPEG.

- +
@@ -410,14 +476,13 @@ Variables
-
-
+

Pad the given width to the nearest 32-bit boundary.

- +
@@ -439,15 +504,14 @@ Variables
-
-
+

Compute the scaled value of dimension using the given scaling factor.

This macro performs the integer equivalent of ceil(dimension * scalingFactor).

- +
@@ -455,15 +519,14 @@ Variables
#define TJXOPT_CROP
-
-
+

This option will enable lossless cropping.

See tjTransform() for more information.

- +
@@ -471,14 +534,13 @@ Variables
#define TJXOPT_GRAY
-
-
+

This option will discard the color data in the input image and produce a grayscale output image.

- +
@@ -486,14 +548,13 @@ Variables
#define TJXOPT_NOOUTPUT
-
-
+

This option will prevent tjTransform() from outputting a JPEG image for this particular transform (this can be used in conjunction with a custom filter to capture the transformed DCT coefficients without transcoding them.)

- +
@@ -501,15 +562,14 @@ Variables
#define TJXOPT_PERFECT
-
-
+

This option will cause tjTransform() to return an error if the transform is not perfect.

Lossless transforms operate on MCU blocks, whose size depends on the level of chrominance subsampling used (see tjMCUWidth and tjMCUHeight.) If the image's width or height is not evenly divisible by the MCU block size, then there will be partial MCU blocks on the right and/or bottom edges. It is not possible to move these partial MCU blocks to the top or left of the image, so any transform that would require that is "imperfect." If this option is not specified, then any partial MCU blocks that cannot be transformed will be left in place, which will create odd-looking strips on the right or bottom edge of the image.

- +
@@ -517,15 +577,14 @@ Variables
#define TJXOPT_TRIM
-
-
+

This option will cause tjTransform() to discard any partial MCU blocks that cannot be transformed.

-

Typedef Documentation

- +

Typedef Documentation

+
@@ -533,14 +592,13 @@ Variables
typedef void* tjhandle
-
-
+

TurboJPEG instance handle.

- +
@@ -548,15 +606,14 @@ Variables
typedef struct tjtransform tjtransform
-
-
+

Lossless transform.

-

Enumeration Type Documentation

- +

Enumeration Type Documentation

+
@@ -564,62 +621,59 @@ Variables
enum TJPF
-
-
+

Pixel formats.

-
Enumerator:
-","
TJPF_RGB  + + - - - - - - - - - -
Enumerator
TJPF_RGB 

RGB pixel format.

The red, green, and blue components in the image are stored in 3-byte pixels in the order R, G, B from lowest to highest byte address within each pixel.

TJPF_BGR  +
TJPF_BGR 

BGR pixel format.

The red, green, and blue components in the image are stored in 3-byte pixels in the order B, G, R from lowest to highest byte address within each pixel.

TJPF_RGBX  +
TJPF_RGBX 

RGBX pixel format.

The red, green, and blue components in the image are stored in 4-byte pixels in the order R, G, B from lowest to highest byte address within each pixel. The X component is ignored when compressing and undefined when decompressing.

TJPF_BGRX  +
TJPF_BGRX 

BGRX pixel format.

The red, green, and blue components in the image are stored in 4-byte pixels in the order B, G, R from lowest to highest byte address within each pixel. The X component is ignored when compressing and undefined when decompressing.

TJPF_XBGR  +
TJPF_XBGR 

XBGR pixel format.

The red, green, and blue components in the image are stored in 4-byte pixels in the order R, G, B from highest to lowest byte address within each pixel. The X component is ignored when compressing and undefined when decompressing.

TJPF_XRGB  +
TJPF_XRGB 

XRGB pixel format.

The red, green, and blue components in the image are stored in 4-byte pixels in the order B, G, R from highest to lowest byte address within each pixel. The X component is ignored when compressing and undefined when decompressing.

TJPF_GRAY  +
TJPF_GRAY 

Grayscale pixel format.

Each 1-byte pixel represents a luminance (brightness) level from 0 to 255.

TJPF_RGBA  +
TJPF_RGBA 

RGBA pixel format.

This is the same as TJPF_RGBX, except that when decompressing, the X component is guaranteed to be 0xFF, which can be interpreted as an opaque alpha channel.

TJPF_BGRA  +
TJPF_BGRA 

BGRA pixel format.

This is the same as TJPF_BGRX, except that when decompressing, the X component is guaranteed to be 0xFF, which can be interpreted as an opaque alpha channel.

TJPF_ABGR  +
TJPF_ABGR 

ABGR pixel format.

This is the same as TJPF_XBGR, except that when decompressing, the X component is guaranteed to be 0xFF, which can be interpreted as an opaque alpha channel.

TJPF_ARGB  +
TJPF_ARGB 

ARGB pixel format.

This is the same as TJPF_XRGB, except that when decompressing, the X component is guaranteed to be 0xFF, which can be interpreted as an opaque alpha channel.

- - - +
@@ -627,39 +681,37 @@ Variables
enum TJSAMP
-
-
+

Chrominance subsampling options.

When an image is converted from the RGB to the YCbCr colorspace as part of the JPEG compression process, some of the Cb and Cr (chrominance) components can be discarded or averaged together to produce a smaller image with little perceptible loss of image clarity (the human eye is more sensitive to small changes in brightness than small changes in color.) This is called "chrominance subsampling".

-
Enumerator:
-","
TJSAMP_444  +

NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the convention of the digital video community, the TurboJPEG API uses "YUV" to refer to an image format consisting of Y, Cb, and Cr image planes.

+ + - - - -
Enumerator
TJSAMP_444 

4:4:4 chrominance subsampling (no chrominance subsampling).

The JPEG or YUV image will contain one chrominance component for every pixel in the source image.

TJSAMP_422  +
TJSAMP_422 

4:2:2 chrominance subsampling.

The JPEG or YUV image will contain one chrominance component for every 2x1 block of pixels in the source image.

TJSAMP_420  +
TJSAMP_420 

4:2:0 chrominance subsampling.

The JPEG or YUV image will contain one chrominance component for every 2x2 block of pixels in the source image.

TJSAMP_GRAY  +
TJSAMP_GRAY 

Grayscale.

The JPEG or YUV image will contain no chrominance components.

TJSAMP_440  +
TJSAMP_440 

4:4:0 chrominance subsampling.

-

The JPEG or YUV image will contain one chrominance component for every 1x2 block of pixels in the source image.

+

The JPEG or YUV image will contain one chrominance component for every 1x2 block of pixels in the source image. Note that 4:4:0 subsampling is not fully accelerated in libjpeg-turbo.

- - - +
@@ -667,48 +719,45 @@ Variables
enum TJXOP
-
-
+

Transform operations for tjTransform()

-
Enumerator:
-","
TJXOP_NONE  + + - - - - - - -
Enumerator
TJXOP_NONE 

Do not transform the position of the image pixels.

TJXOP_HFLIP  +
TJXOP_HFLIP 

Flip (mirror) image horizontally.

This transform is imperfect if there are any partial MCU blocks on the right edge (see TJXOPT_PERFECT.)

TJXOP_VFLIP  +
TJXOP_VFLIP 

Flip (mirror) image vertically.

This transform is imperfect if there are any partial MCU blocks on the bottom edge (see TJXOPT_PERFECT.)

TJXOP_TRANSPOSE  +
TJXOP_TRANSPOSE 

Transpose image (flip/mirror along upper left to lower right axis.) This transform is always perfect.

TJXOP_TRANSVERSE  +
TJXOP_TRANSVERSE 

Transverse transpose image (flip/mirror along upper right to lower left axis.) This transform is imperfect if there are any partial MCU blocks in the image (see TJXOPT_PERFECT.)

TJXOP_ROT90  +
TJXOP_ROT90 

Rotate image clockwise by 90 degrees.

This transform is imperfect if there are any partial MCU blocks on the bottom edge (see TJXOPT_PERFECT.)

TJXOP_ROT180  +
TJXOP_ROT180 

Rotate image 180 degrees.

This transform is imperfect if there are any partial MCU blocks in the image (see TJXOPT_PERFECT.)

TJXOP_ROT270  +
TJXOP_ROT270 

Rotate image counter-clockwise by 90 degrees.

This transform is imperfect if there are any partial MCU blocks on the right edge (see TJXOPT_PERFECT.)

- - -

Function Documentation

- +

Function Documentation

+
@@ -720,23 +769,22 @@ Variables
-
-
+

Allocate an image buffer for use with TurboJPEG.

You should always use this function to allocate the JPEG destination buffer(s) for tjCompress2() and tjTransform() unless you are disabling automatic buffer (re)allocation (by setting TJFLAG_NOREALLOC.)

-
Parameters:
+
Parameters
bytesthe number of bytes to allocate
-
Returns:
a pointer to a newly-allocated buffer with the specified number of bytes
-
See also:
tjFree()
+
Returns
a pointer to a newly-allocated buffer with the specified number of bytes
+
See Also
tjFree()
- +
@@ -764,12 +812,11 @@ Variables
-
-
+

The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters.

-

The number of bytes returned by this function is larger than the size of the uncompressed source image. The reason for this is that the JPEG format uses 16-bit coefficients, and it is thus possible for a very high-quality JPEG image with very high frequency content to expand rather than compress when converted to the JPEG format. Such images represent a very rare corner case, but since there is no way to predict the size of a JPEG image prior to compression, the corner case has to be handled.

-
Parameters:
+

The number of bytes returned by this function is larger than the size of the uncompressed source image. The reason for this is that the JPEG format uses 16-bit coefficients, and it is thus possible for a very high-quality JPEG image with very high-frequency content to expand rather than compress when converted to the JPEG format. Such images represent a very rare corner case, but since there is no way to predict the size of a JPEG image prior to compression, the corner case has to be handled.

+
Parameters
@@ -777,11 +824,11 @@ Variables
widthwidth of the image (in pixels)
heightheight of the image (in pixels)
-
Returns:
the maximum size of the buffer (in bytes) required to hold the image, or -1 if the arguments are out of bounds.
+
Returns
the maximum size of the buffer (in bytes) required to hold the image, or -1 if the arguments are out of bounds.
- +
@@ -809,11 +856,10 @@ Variables
-
-
+

The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters.

-
Parameters:
+
Parameters
@@ -821,11 +867,11 @@ Variables
widthwidth of the image (in pixels)
heightheight of the image (in pixels)
-
Returns:
the size of the buffer (in bytes) required to hold the image, or -1 if the arguments are out of bounds.
+
Returns
the size of the buffer (in bytes) required to hold the image, or -1 if the arguments are out of bounds.
- +
@@ -901,11 +947,10 @@ Variables
-
-
+

Compress an RGB or grayscale image into a JPEG image.

-
Parameters:
+
Parameters
@@ -926,11 +971,11 @@ If you choose option 1, *jpegSize should be set to the size of your
handlea handle to a TurboJPEG compressor or transformer instance
srcBufpointer to an image buffer containing RGB or grayscale pixels to be compressed
-
Returns:
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
+
Returns
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
- +
@@ -994,29 +1039,31 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Decompress a JPEG image to an RGB or grayscale image.

-
Parameters:
+
Parameters
- - - - - - + + + + + +
handlea handle to a TurboJPEG decompressor or transformer instance
jpegBufpointer to a buffer containing the JPEG image to decompress
jpegSizesize of the JPEG image (in bytes)
dstBufpointer to an image buffer that will receive the decompressed image. This buffer should normally be pitch * scaledHeight bytes in size, where scaledHeight can be determined by calling TJSCALED() with the JPEG image height and one of the scaling factors returned by tjGetScalingFactors(). The dstBuf pointer may also be used to decompress into a specific region of a larger buffer.
widthdesired width (in pixels) of the destination image. If this is smaller than the width of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired width. If width is set to 0, then only the height will be considered when determining the scaled image size.
pitchbytes per line of the destination image. Normally, this is scaledWidth * tjPixelSize[pixelFormat] if the decompressed image is unpadded, else TJPAD(scaledWidth * tjPixelSize[pixelFormat]) if each line of the decompressed image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. (NOTE: scaledWidth can be determined by calling TJSCALED() with the JPEG image width and one of the scaling factors returned by tjGetScalingFactors().) You can also be clever and use the pitch parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to scaledWidth * tjPixelSize[pixelFormat].
heightdesired height (in pixels) of the destination image. If this is smaller than the height of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired height. If height is set to 0, then only the width will be considered when determining the scaled image size.
pixelFormatpixel format of the destination image (see Pixel formats.)
flagsthe bitwise OR of one or more of the flags.
dstBufpointer to an image buffer that will receive the decompressed image. This buffer should normally be pitch * scaledHeight bytes in size, where scaledHeight can be determined by calling TJSCALED() with the JPEG image height and one of the scaling factors returned by tjGetScalingFactors(). The dstBuf pointer may also be used to decompress into a specific region of a larger buffer.
widthdesired width (in pixels) of the destination image. If this is different than the width of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired width. If width is set to 0, then only the height will be considered when determining the scaled image size.
pitchbytes per line of the destination image. Normally, this is scaledWidth * tjPixelSize[pixelFormat] if the decompressed image is unpadded, else TJPAD(scaledWidth * tjPixelSize[pixelFormat]) if each line of the decompressed image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. (NOTE: scaledWidth can be determined by calling TJSCALED() with the JPEG image width and one of the scaling factors returned by tjGetScalingFactors().) You can also be clever and use the pitch parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to scaledWidth +
heightdesired height (in pixels) of the destination image. If this is different than the height of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired height. If height is set to 0, then only the width will be considered when determining the scaled image size.
pixelFormatpixel format of the destination image (see Pixel formats.)
flagsthe bitwise OR of one or more of the flags.
-
Returns:
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
+
Returns
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
- +
@@ -1062,11 +1109,10 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Retrieve information about a JPEG image without decompressing it.

-
Parameters:
+
Parameters
@@ -1077,11 +1123,11 @@ If you choose option 1, *jpegSize should be set to the size of your
handlea handle to a TurboJPEG decompressor or transformer instance
jpegBufpointer to a buffer containing a JPEG image
-
Returns:
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
+
Returns
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
- +
@@ -1121,26 +1167,26 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Decompress a JPEG image to a YUV planar image.

-

This function performs JPEG decompression but leaves out the color conversion step, so a planar YUV image is generated instead of an RGB image. The padding of the planes in this image is the same as the images generated by tjEncodeYUV2(). Note that, if the width or height of the image is not an even multiple of the MCU block size (see tjMCUWidth and tjMCUHeight), then an intermediate buffer copy will be performed within TurboJPEG.

-
Parameters:
+

This function performs JPEG decompression but leaves out the color conversion step, so a planar YUV image is generated instead of an RGB image. The padding of the planes in this image is the same as in the images generated by tjEncodeYUV2(). Note that, if the width or height of the image is not an even multiple of the MCU block size (see tjMCUWidth and tjMCUHeight), then an intermediate buffer copy will be performed within TurboJPEG.

+

NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the convention of the digital video community, the TurboJPEG API uses "YUV" to refer to an image format consisting of Y, Cb, and Cr image planes.

+
Parameters
- +
handlea handle to a TurboJPEG decompressor or transformer instance
jpegBufpointer to a buffer containing the JPEG image to decompress
jpegSizesize of the JPEG image (in bytes)
dstBufpointer to an image buffer that will receive the YUV image. Use tjBufSizeYUV to determine the appropriate size for this buffer based on the image width, height, and level of subsampling.
dstBufpointer to an image buffer that will receive the YUV image. Use tjBufSizeYUV() to determine the appropriate size for this buffer based on the image width, height, and level of subsampling.
flagsthe bitwise OR of one or more of the flags.
-
Returns:
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
+
Returns
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
- +
@@ -1152,21 +1198,20 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Destroy a TurboJPEG compressor, decompressor, or transformer instance.

-
Parameters:
+
Parameters
handlea handle to a TurboJPEG compressor, decompressor or transformer instance
-
Returns:
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
+
Returns
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
- +
@@ -1230,12 +1275,12 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Encode an RGB or grayscale image into a YUV planar image.

-

This function uses the accelerated color conversion routines in TurboJPEG's underlying codec to produce a planar YUV image that is suitable for X Video. Specifically, if the chrominance components are subsampled along the horizontal dimension, then the width of the luminance plane is padded to 2 in the output image (same goes for the height of the luminance plane, if the chrominance components are subsampled along the vertical dimension.) Also, each line of each plane in the output image is padded to 4 bytes. Although this will work with any subsampling option, it is really only useful in combination with TJ_420, which produces an image compatible with the I420 (AKA "YUV420P") format.

-
Parameters:
+

This function uses the accelerated color conversion routines in TurboJPEG's underlying codec to produce a planar YUV image that is suitable for X Video. Specifically, if the chrominance components are subsampled along the horizontal dimension, then the width of the luminance plane is padded to the nearest multiple of 2 in the output image (same goes for the height of the luminance plane, if the chrominance components are subsampled along the vertical dimension.) Also, each line of each plane in the output image is padded to 4 bytes. Although this will work with any subsampling option, it is really only useful in combination with TJ_420, which produces an image compatible with the I420 (AKA "YUV420P") format.

+

NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the convention of the digital video community, the TurboJPEG API uses "YUV" to refer to an image format consisting of Y, Cb, and Cr image planes.

+
Parameters
@@ -1249,11 +1294,11 @@ If you choose option 1, *jpegSize should be set to the size of your
handlea handle to a TurboJPEG compressor or transformer instance
srcBufpointer to an image buffer containing RGB or grayscale pixels to be encoded
-
Returns:
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
+
Returns
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
- +
@@ -1265,22 +1310,21 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Free an image buffer previously allocated by TurboJPEG.

You should always use this function to free JPEG destination buffer(s) that were automatically (re)allocated by tjCompress2() or tjTransform() or that were manually allocated using tjAlloc().

-
Parameters:
+
Parameters
bufferaddress of the buffer to free
-
See also:
tjAlloc()
+
See Also
tjAlloc()
- +
@@ -1292,15 +1336,14 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Returns a descriptive error message explaining why the last command failed.

-
Returns:
a descriptive error message explaining why the last command failed.
+
Returns
a descriptive error message explaining why the last command failed.
- +
@@ -1312,21 +1355,20 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Returns a list of fractional scaling factors that the JPEG decompressor in this implementation of TurboJPEG supports.

-
Parameters:
+
Parameters
numscalingfactorspointer to an integer variable that will receive the number of elements in the list
-
Returns:
a pointer to a list of fractional scaling factors, or NULL if an error is encountered (see tjGetErrorStr().)
+
Returns
a pointer to a list of fractional scaling factors, or NULL if an error is encountered (see tjGetErrorStr().)
- +
@@ -1338,15 +1380,14 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Create a TurboJPEG compressor instance.

-
Returns:
a handle to the newly-created instance, or NULL if an error occurred (see tjGetErrorStr().)
+
Returns
a handle to the newly-created instance, or NULL if an error occurred (see tjGetErrorStr().)
- +
@@ -1358,15 +1399,14 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Create a TurboJPEG decompressor instance.

-
Returns:
a handle to the newly-created instance, or NULL if an error occurred (see tjGetErrorStr().)
+
Returns
a handle to the newly-created instance, or NULL if an error occurred (see tjGetErrorStr().)
- +
@@ -1378,15 +1418,14 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Create a new TurboJPEG transformer instance.

-
Returns:
a handle to the newly-created instance, or NULL if an error occurred (see tjGetErrorStr().)
+
Returns
a handle to the newly-created instance, or NULL if an error occurred (see tjGetErrorStr().)
- +
@@ -1444,12 +1483,11 @@ If you choose option 1, *jpegSize should be set to the size of your
-
-
+

Losslessly transform a JPEG image into another JPEG image.

-

Lossless transforms work by moving the raw coefficients from one JPEG image structure to another without altering the values of the coefficients. While this is typically faster than decompressing the image, transforming it, and re-compressing it, lossless transforms are not free. Each lossless transform requires reading and Huffman decoding all of the coefficients in the source image, regardless of the size of the destination image. Thus, this function provides a means of generating multiple transformed images from the same source or of applying multiple transformations simultaneously, in order to eliminate the need to read the source coefficients multiple times.

-
Parameters:
+

Lossless transforms work by moving the raw coefficients from one JPEG image structure to another without altering the values of the coefficients. While this is typically faster than decompressing the image, transforming it, and re-compressing it, lossless transforms are not free. Each lossless transform requires reading and performing Huffman decoding on all of the coefficients in the source image, regardless of the size of the destination image. Thus, this function provides a means of generating multiple transformed images from the same source or applying multiple transformations simultaneously, in order to eliminate the need to read the source coefficients multiple times.

+
Parameters
@@ -1458,62 +1496,83 @@ If you choose option 1, *jpegSize should be set to the size of your - +
handlea handle to a TurboJPEG transformer instance
jpegBufpointer to a buffer containing the JPEG image to transform
dstBufspointer to an array of n image buffers. dstBufs[i] will receive a JPEG image that has been transformed using the parameters in transforms[i]. TurboJPEG has the ability to reallocate the JPEG buffer to accommodate the size of the JPEG image. Thus, you can choose to:
  1. pre-allocate the JPEG buffer with an arbitrary size using tjAlloc() and let TurboJPEG grow the buffer as needed,
  2. set dstBufs[i] to NULL to tell TurboJPEG to allocate the buffer for you, or
  3. -
  4. pre-allocate the buffer to a "worst case" size determined by calling tjBufSize() with the cropped width and height. This should ensure that the buffer never has to be re-allocated (setting TJFLAG_NOREALLOC guarantees this.)
  5. +
  6. pre-allocate the buffer to a "worst case" size determined by calling tjBufSize() with the transformed or cropped width and height. This should ensure that the buffer never has to be re-allocated (setting TJFLAG_NOREALLOC guarantees this.)
If you choose option 1, dstSizes[i] should be set to the size of your pre-allocated buffer. In any case, unless you have set TJFLAG_NOREALLOC, you should always check dstBufs[i] upon return from this function, as it may have changed.
dstSizespointer to an array of n unsigned long variables that will receive the actual sizes (in bytes) of each transformed JPEG image. If dstBufs[i] points to a pre-allocated buffer, then dstSizes[i] should be set to the size of the buffer. Upon return, dstSizes[i] will contain the size of the JPEG image (in bytes.)
transformspointer to an array of n tjtransform structures, each of which specifies the transform parameters and/or cropping region for the corresponding transformed output image.
transformspointer to an array of n tjtransform structures, each of which specifies the transform parameters and/or cropping region for the corresponding transformed output image.
flagsthe bitwise OR of one or more of the flags.
-
Returns:
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
+
Returns
0 if successful, or -1 if an error occurred (see tjGetErrorStr().)
-

Variable Documentation

- +

Variable Documentation

+
+ + + + + +
- +
const int tjBlueOffset[TJ_NUMPF] [static]const int tjBlueOffset[TJ_NUMPF]
- -
+
+static
+

Blue offset (in bytes) for a given pixel format.

This specifies the number of bytes that the Blue component is offset from the start of the pixel. For instance, if a pixel of format TJ_BGRX is stored in char pixel[], then the blue component will be pixel[tjBlueOffset[TJ_BGRX]].

- +
+ + + + + +
- +
const int tjGreenOffset[TJ_NUMPF] [static]const int tjGreenOffset[TJ_NUMPF]
- -
+
+static
+

Green offset (in bytes) for a given pixel format.

This specifies the number of bytes that the green component is offset from the start of the pixel. For instance, if a pixel of format TJ_BGRX is stored in char pixel[], then the green component will be pixel[tjGreenOffset[TJ_BGRX]].

- +
+ + + + + +
- +
const int tjMCUHeight[TJ_NUMSAMP] [static]const int tjMCUHeight[TJ_NUMSAMP]
- -
+
+static
+

MCU block height (in pixels) for a given level of chrominance subsampling.

MCU block sizes:

@@ -1526,16 +1585,23 @@ If you choose option 1, dstSizes[i] should be set to the size of yo
- +
+ + + + + +
- +
const int tjMCUWidth[TJ_NUMSAMP] [static]const int tjMCUWidth[TJ_NUMSAMP]
- -
+
+static
+

MCU block width (in pixels) for a given level of chrominance subsampling.

MCU block sizes:

@@ -1548,54 +1614,57 @@ If you choose option 1, dstSizes[i] should be set to the size of yo
- +
+ + + + + +
- +
const int tjPixelSize[TJ_NUMPF] [static]const int tjPixelSize[TJ_NUMPF]
- -
+
+static
+

Pixel size (in bytes) for a given pixel format.

- +
+ + + + + +
- +
const int tjRedOffset[TJ_NUMPF] [static]const int tjRedOffset[TJ_NUMPF]
- -
+
+static
+

Red offset (in bytes) for a given pixel format.

This specifies the number of bytes that the red component is offset from the start of the pixel. For instance, if a pixel of format TJ_BGRX is stored in char pixel[], then the red component will be pixel[tjRedOffset[TJ_BGRX]].

- - - - - -
- -
- - + + + diff --git a/doc/html/index.html b/doc/html/index.html index 4c7b84c..72daeb8 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -2,35 +2,45 @@ + + TurboJPEG: Main Page + + - + + - - - -
+ +
-
TurboJPEG 1.2.1
+
TurboJPEG +  1.2.1 +
+ + + -
-
-
-
TurboJPEG Documentation
-
-
-
+
+ All Data Structures Functions Variables Typedefs Enumerations Enumerator Groups
@@ -69,8 +73,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
- +
+
+
TurboJPEG Documentation
+
+
+
+ + diff --git a/doc/html/installdox b/doc/html/installdox deleted file mode 100755 index edf5bbf..0000000 --- a/doc/html/installdox +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/perl - -%subst = ( ); -$quiet = 0; - -while ( @ARGV ) { - $_ = shift @ARGV; - if ( s/^-// ) { - if ( /^l(.*)/ ) { - $v = ($1 eq "") ? shift @ARGV : $1; - ($v =~ /\/$/) || ($v .= "/"); - $_ = $v; - if ( /(.+)\@(.+)/ ) { - if ( exists $subst{$1} ) { - $subst{$1} = $2; - } else { - print STDERR "Unknown tag file $1 given with option -l\n"; - &usage(); - } - } else { - print STDERR "Argument $_ is invalid for option -l\n"; - &usage(); - } - } - elsif ( /^q/ ) { - $quiet = 1; - } - elsif ( /^\?|^h/ ) { - &usage(); - } - else { - print STDERR "Illegal option -$_\n"; - &usage(); - } - } - else { - push (@files, $_ ); - } -} - -foreach $sub (keys %subst) -{ - if ( $subst{$sub} eq "" ) - { - print STDERR "No substitute given for tag file `$sub'\n"; - &usage(); - } - elsif ( ! $quiet && $sub ne "_doc" && $sub ne "_cgi" ) - { - print "Substituting $subst{$sub} for each occurrence of tag file $sub\n"; - } -} - -if ( ! @files ) { - if (opendir(D,".")) { - foreach $file ( readdir(D) ) { - $match = ".html"; - next if ( $file =~ /^\.\.?$/ ); - ($file =~ /$match/) && (push @files, $file); - ($file =~ /\.svg/) && (push @files, $file); - ($file =~ "navtree.js") && (push @files, $file); - } - closedir(D); - } -} - -if ( ! @files ) { - print STDERR "Warning: No input files given and none found!\n"; -} - -foreach $f (@files) -{ - if ( ! $quiet ) { - print "Editing: $f...\n"; - } - $oldf = $f; - $f .= ".bak"; - unless (rename $oldf,$f) { - print STDERR "Error: cannot rename file $oldf\n"; - exit 1; - } - if (open(F,"<$f")) { - unless (open(G,">$oldf")) { - print STDERR "Error: opening file $oldf for writing\n"; - exit 1; - } - if ($oldf ne "tree.js") { - while () { - s/doxygen\=\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\" (xlink:href|href|src)=\"\2/doxygen\=\"$1:$subst{$1}\" \3=\"$subst{$1}/g; - print G "$_"; - } - } - else { - while () { - s/\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\", \"\2/\"$1:$subst{$1}\" ,\"$subst{$1}/g; - print G "$_"; - } - } - } - else { - print STDERR "Warning file $f does not exist\n"; - } - unlink $f; -} - -sub usage { - print STDERR "Usage: installdox [options] [html-file [html-file ...]]\n"; - print STDERR "Options:\n"; - print STDERR " -l tagfile\@linkName tag file + URL or directory \n"; - print STDERR " -q Quiet mode\n\n"; - exit 1; -} diff --git a/doc/html/jquery.js b/doc/html/jquery.js index c052173..63939e7 100644 --- a/doc/html/jquery.js +++ b/doc/html/jquery.js @@ -1,54 +1,8 @@ -/* - * jQuery JavaScript Library v1.3.2 - * http://jquery.com/ - * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License - * - * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) - * Revision: 6246 - */ -(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("
"]||(!O.indexOf("
"]||!O.indexOf("
"]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); -/* - * Sizzle CSS Selector Engine - v0.9.3 - * Copyright 2009, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0) -{I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function() -{G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); -/* - * jQuery UI 1.7.2 - * - * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI - */ -jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* * jQuery UI Resizable 1.7.2 - * - * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Resizables - * - * Depends: - * ui.core.js - */ -(function(c){c.widget("ui.resizable",c.extend({},c.ui.mouse,{_init:function(){var e=this,j=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(j.aspectRatio),aspectRatio:j.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:j.helper||j.ghost||j.animate?j.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){if(/relative/.test(this.element.css("position"))&&c.browser.opera){this.element.css({position:"relative",top:"auto",left:"auto"})}this.element.wrap(c('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f
');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.parent().append(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).end().remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement)},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return this.options.disabled||!!f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidthk.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e
');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));c.extend(c.ui.resizable,{version:"1.7.2",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000}});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),g=d.options;_store=function(h){c(h).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(g.alsoResize)=="object"&&!g.alsoResize.parentNode){if(g.alsoResize.length){g.alsoResize=g.alsoResize[0];_store(g.alsoResize)}else{c.each(g.alsoResize,function(h,i){_store(h)})}}else{_store(g.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0)) -{s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);; -/** - * jQuery.ScrollTo - Easy element scrolling using jQuery. - * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com - * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php). - * Date: 2/8/2008 - * @author Ariel Flesler - * @version 1.3.2 - */ -;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery); - +/*! jQuery v1.7.1 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; +f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")), +f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() +{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c) +{if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); diff --git a/doc/html/modules.html b/doc/html/modules.html index e95f920..25b7ec6 100644 --- a/doc/html/modules.html +++ b/doc/html/modules.html @@ -2,35 +2,45 @@ + + TurboJPEG: Modules + + - + + - - - -
+ +
-
TurboJPEG 1.2.1
+
TurboJPEG +  1.2.1 +
+ + + -
-
-
-
Modules
-
-
-
Here is a list of all modules:
-
+ + All Data Structures Functions Variables Typedefs Enumerations Enumerator Groups
@@ -72,8 +73,22 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
- +
+
+
Modules
+
+
+
Here is a list of all modules:
+ + +
\TurboJPEGTurboJPEG API
+
+
+ + diff --git a/doc/html/nav_f.png b/doc/html/nav_f.png index 1b07a16207e67c95fe2ee17e7016e6d08ac7ac99..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 100644 GIT binary patch delta 124 zcmV-?0E7RZ0hs}iBz0g(L_t(|0qxyO4uBvGMbVbGTL*^tfkM%3YvRPhNE{fKaB|bU zE`pBpg6fW>8&Wn}AXZ5Qu@Xg)f;DQhglrV^nwx1!n5^FF=Snb)(Gk%vj{BRL9T9c- e@$=rlHgf|=7$DsN0QGqQ0000u1W`M6+rL23&uBa0+90uE%OD|+(2G{R zL&)v^AmWO}#(ZP3n7)~|7`7NQ=yTCV&_+h($07*qoM6N<$f|0vDeEFMGaQo;E4t|J$N1BX-KT4wgmvu@A6u&D20{R2$}&DVbwUM3!Wac4i{ Xv3!>HpqvZ$8Gyjk)z4*}Q$iB}sjeJQ delta 66 zcmYdFoS;pyTSQo;E4?nX`q10H6_y+#`jhHjhAEv}d?b4SFhXw`bg=6O+n|1%uR WXKDW<@M10l5O})!xvX_sd$oj(R;{eZG48+5s|MCC;002ovPDHLkV1lT^BSioJ diff --git a/doc/html/search/all_63.html b/doc/html/search/all_63.html index 8cfc38f..e7f34db 100644 --- a/doc/html/search/all_63.html +++ b/doc/html/search/all_63.html @@ -1,18 +1,18 @@ + +
Loading...
-
-
- customFilter - tjtransform -
-
+
+
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/enums_74.js b/doc/html/search/enums_74.js new file mode 100644 index 0000000..20bd4db --- /dev/null +++ b/doc/html/search/enums_74.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['tjpf',['TJPF',['../group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a',1,'turbojpeg.h']]], + ['tjsamp',['TJSAMP',['../group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074',1,'turbojpeg.h']]], + ['tjxop',['TJXOP',['../group___turbo_j_p_e_g.html#ga2de531af4e7e6c4f124908376b354866',1,'turbojpeg.h']]] +]; diff --git a/doc/html/search/enumvalues_74.html b/doc/html/search/enumvalues_74.html new file mode 100644 index 0000000..0d69a0a --- /dev/null +++ b/doc/html/search/enumvalues_74.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/enumvalues_74.js b/doc/html/search/enumvalues_74.js new file mode 100644 index 0000000..55664f1 --- /dev/null +++ b/doc/html/search/enumvalues_74.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['tjpf_5fabgr',['TJPF_ABGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa1ba1a7f1631dbeaa49a0a85fc4a40081',1,'turbojpeg.h']]], + ['tjpf_5fargb',['TJPF_ARGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aae8f846ed9d9de99b6e1dfe448848765c',1,'turbojpeg.h']]], + ['tjpf_5fbgr',['TJPF_BGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aab10624437fb8ef495a0b153e65749839',1,'turbojpeg.h']]], + ['tjpf_5fbgra',['TJPF_BGRA',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aac037ff1845cf9b74bb81a3659c2b9fb4',1,'turbojpeg.h']]], + ['tjpf_5fbgrx',['TJPF_BGRX',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa2a1fbf569ca79897eae886e3376ca4c8',1,'turbojpeg.h']]], + ['tjpf_5fgray',['TJPF_GRAY',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa5431b54b015337705f13118073711a1a',1,'turbojpeg.h']]], + ['tjpf_5frgb',['TJPF_RGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa7ce93230bff449518ce387c17e6ed37c',1,'turbojpeg.h']]], + ['tjpf_5frgba',['TJPF_RGBA',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa88d2e88fab67f6503cf972e14851cc12',1,'turbojpeg.h']]], + ['tjpf_5frgbx',['TJPF_RGBX',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa83973bebb7e2dc6fa8bae89ff3f42e01',1,'turbojpeg.h']]], + ['tjpf_5fxbgr',['TJPF_XBGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aaf6603b27147de47e212e75dac027b2af',1,'turbojpeg.h']]], + ['tjpf_5fxrgb',['TJPF_XRGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aadae996905efcfa3b42a0bb3bea7f9d84',1,'turbojpeg.h']]], + ['tjsamp_5f420',['TJSAMP_420',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a63085dbf683cfe39e513cdb6343e3737',1,'turbojpeg.h']]], + ['tjsamp_5f422',['TJSAMP_422',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a136130902cc578f11f32429b59368404',1,'turbojpeg.h']]], + ['tjsamp_5f440',['TJSAMP_440',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074accf740e6f3aa6ba20ba922cad13cb974',1,'turbojpeg.h']]], + ['tjsamp_5f444',['TJSAMP_444',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074afb8da4f44197837bdec0a4f593dacae3',1,'turbojpeg.h']]], + ['tjsamp_5fgray',['TJSAMP_GRAY',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a3f1c9504842ddc7a48d0f690754b6248',1,'turbojpeg.h']]], + ['tjxop_5fhflip',['TJXOP_HFLIP',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866aa0df69776caa30f0fa28e26332d311ce',1,'turbojpeg.h']]], + ['tjxop_5fnone',['TJXOP_NONE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866aad88c0366cd3f7d0eac9d7a3fa1c2c27',1,'turbojpeg.h']]], + ['tjxop_5frot180',['TJXOP_ROT180',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a140952eb8dd0300accfcc22726d69692',1,'turbojpeg.h']]], + ['tjxop_5frot270',['TJXOP_ROT270',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a3064ee5dfb7f032df332818587567a08',1,'turbojpeg.h']]], + ['tjxop_5frot90',['TJXOP_ROT90',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a43b2bbb23bc4bd548422d43fbe9af128',1,'turbojpeg.h']]], + ['tjxop_5ftranspose',['TJXOP_TRANSPOSE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a31060aed199f886afdd417f80499c32d',1,'turbojpeg.h']]], + ['tjxop_5ftransverse',['TJXOP_TRANSVERSE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866af3b14d488aea6ece9e5b3df73a74d6a4',1,'turbojpeg.h']]], + ['tjxop_5fvflip',['TJXOP_VFLIP',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a324eddfbec53b7e691f61e56929d0d5d',1,'turbojpeg.h']]] +]; diff --git a/doc/html/search/functions_74.html b/doc/html/search/functions_74.html new file mode 100644 index 0000000..1605901 --- /dev/null +++ b/doc/html/search/functions_74.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/functions_74.js b/doc/html/search/functions_74.js new file mode 100644 index 0000000..c746a91 --- /dev/null +++ b/doc/html/search/functions_74.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['tjalloc',['tjAlloc',['../group___turbo_j_p_e_g.html#ga5c9234bda6d993cdaffdd89bf81a00ff',1,'turbojpeg.h']]], + ['tjbufsize',['tjBufSize',['../group___turbo_j_p_e_g.html#gaccc5bca7f12fcdcc302e6e1c6d4b311b',1,'turbojpeg.h']]], + ['tjbufsizeyuv',['tjBufSizeYUV',['../group___turbo_j_p_e_g.html#ga9d0cb06fd5052d21b6f2b382db8b219c',1,'turbojpeg.h']]], + ['tjcompress2',['tjCompress2',['../group___turbo_j_p_e_g.html#gaba62b7a98f960839b588579898495cf2',1,'turbojpeg.h']]], + ['tjdecompress2',['tjDecompress2',['../group___turbo_j_p_e_g.html#gada69cc6443d1bb493b40f1626259e5e9',1,'turbojpeg.h']]], + ['tjdecompressheader2',['tjDecompressHeader2',['../group___turbo_j_p_e_g.html#gac5675fceb7997b385516cdffdb34e6aa',1,'turbojpeg.h']]], + ['tjdecompresstoyuv',['tjDecompressToYUV',['../group___turbo_j_p_e_g.html#gad7810af095624a4016e72957a50f77d8',1,'turbojpeg.h']]], + ['tjdestroy',['tjDestroy',['../group___turbo_j_p_e_g.html#ga674adee917b95ad4a896f1ba39e12540',1,'turbojpeg.h']]], + ['tjencodeyuv2',['tjEncodeYUV2',['../group___turbo_j_p_e_g.html#ga0fa4e7b1943687c6a0c0304529c55d35',1,'turbojpeg.h']]], + ['tjfree',['tjFree',['../group___turbo_j_p_e_g.html#ga8c4a1231dc06a450514c835f6471f137',1,'turbojpeg.h']]], + ['tjgeterrorstr',['tjGetErrorStr',['../group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf',1,'turbojpeg.h']]], + ['tjgetscalingfactors',['tjGetScalingFactors',['../group___turbo_j_p_e_g.html#ga6449044b9af402999ccf52f401333be8',1,'turbojpeg.h']]], + ['tjinitcompress',['tjInitCompress',['../group___turbo_j_p_e_g.html#ga3d10c47fbe4a2489a2b30c931551d01a',1,'turbojpeg.h']]], + ['tjinitdecompress',['tjInitDecompress',['../group___turbo_j_p_e_g.html#gae5408179d041e2a2f7199c8283cf649e',1,'turbojpeg.h']]], + ['tjinittransform',['tjInitTransform',['../group___turbo_j_p_e_g.html#ga3155b775bfbac9dbba869b95a0367902',1,'turbojpeg.h']]], + ['tjtransform',['tjTransform',['../group___turbo_j_p_e_g.html#gae403193ceb4aafb7e0f56ab587b48616',1,'turbojpeg.h']]] +]; diff --git a/doc/html/search/groups_74.html b/doc/html/search/groups_74.html new file mode 100644 index 0000000..a169560 --- /dev/null +++ b/doc/html/search/groups_74.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/groups_74.js b/doc/html/search/groups_74.js new file mode 100644 index 0000000..27d4ffb --- /dev/null +++ b/doc/html/search/groups_74.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['turbojpeg',['TurboJPEG',['../group___turbo_j_p_e_g.html',1,'']]] +]; diff --git a/doc/html/search/search.css b/doc/html/search/search.css index 50249e5..5b208ed 100644 --- a/doc/html/search/search.css +++ b/doc/html/search/search.css @@ -4,13 +4,6 @@ float: left; } -#searchli { - float: right; - display: block; - width: 170px; - height: 36px; -} - #MSearchBox { white-space : nowrap; position: absolute; @@ -20,6 +13,7 @@ right: 0px; width: 170px; z-index: 102; + background-color: white; } #MSearchBox .left @@ -224,6 +218,10 @@ a.SRScope:focus, a.SRScope:active { text-decoration: underline; } +span.SRScope { + padding-left: 4px; +} + .SRPage .SRStatus { padding: 2px 5px; font-size: 8pt; @@ -238,3 +236,36 @@ DIV.searchresults { margin-left: 10px; margin-right: 10px; } + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/html/search/search.js b/doc/html/search/search.js index 0a9c356..409672c 100644 --- a/doc/html/search/search.js +++ b/doc/html/search/search.js @@ -9,14 +9,24 @@ var indexSectionsWithContent = { 0: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100010000011001010011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100010000011001000011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100010000011001010011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 5: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 6: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + 7: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }; var indexSectionNames = { 0: "all", 1: "classes", - 2: "variables" + 2: "functions", + 3: "variables", + 4: "typedefs", + 5: "enums", + 6: "enumvalues", + 7: "groups" }; function convertToId(search) @@ -261,7 +271,7 @@ function SearchBox(name, resultsPath, inFrame, label) var node = child.firstChild; if (j==id) { - node.innerHTML='•'; + node.innerHTML='•'; } else { @@ -358,7 +368,7 @@ function SearchBox(name, resultsPath, inFrame, label) hasResultsPage = false; } - window.frames.MSearchResults.location.href = resultsPageWithSearch; + window.frames.MSearchResults.location = resultsPageWithSearch; var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); if (domPopupSearchResultsWindow.style.display!='block') @@ -728,3 +738,72 @@ function SearchResults(name) return false; } } + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/typedefs_74.js b/doc/html/search/typedefs_74.js new file mode 100644 index 0000000..85b00f5 --- /dev/null +++ b/doc/html/search/typedefs_74.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['tjhandle',['tjhandle',['../group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763',1,'turbojpeg.h']]], + ['tjtransform',['tjtransform',['../group___turbo_j_p_e_g.html#gaa29f3189c41be12ec5dee7caec318a31',1,'turbojpeg.h']]] +]; diff --git a/doc/html/search/variables_63.html b/doc/html/search/variables_63.html index 8cfc38f..422085c 100644 --- a/doc/html/search/variables_63.html +++ b/doc/html/search/variables_63.html @@ -1,18 +1,18 @@ + +
Loading...
-
-
- customFilter - tjtransform -
-
+
+
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
+
Searching...
+
No Matches
+ +
+ + diff --git a/doc/html/search/variables_74.js b/doc/html/search/variables_74.js new file mode 100644 index 0000000..13a056e --- /dev/null +++ b/doc/html/search/variables_74.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['tjblueoffset',['tjBlueOffset',['../group___turbo_j_p_e_g.html#ga84e2e35d3f08025f976ec1ec53693dea',1,'turbojpeg.h']]], + ['tjgreenoffset',['tjGreenOffset',['../group___turbo_j_p_e_g.html#ga82d6e35da441112a411da41923c0ba2f',1,'turbojpeg.h']]], + ['tjmcuheight',['tjMCUHeight',['../group___turbo_j_p_e_g.html#gabd247bb9fecb393eca57366feb8327bf',1,'turbojpeg.h']]], + ['tjmcuwidth',['tjMCUWidth',['../group___turbo_j_p_e_g.html#ga9e61e7cd47a15a173283ba94e781308c',1,'turbojpeg.h']]], + ['tjpixelsize',['tjPixelSize',['../group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c',1,'turbojpeg.h']]], + ['tjredoffset',['tjRedOffset',['../group___turbo_j_p_e_g.html#gadd9b446742ac8a3923f7992c7988fea8',1,'turbojpeg.h']]] +]; diff --git a/doc/html/search/variables_77.html b/doc/html/search/variables_77.html index b4c8d88..434c6df 100644 --- a/doc/html/search/variables_77.html +++ b/doc/html/search/variables_77.html @@ -1,18 +1,18 @@ + +
Loading...
-
-
- w - tjregion -
-
+
+
Searching...
No Matches
Searching...
No Matches
Searching...
No Matches
-
+ +
-
TurboJPEG 1.2.1
+
TurboJPEG +  1.2.1 +
+ + + + + + + +
+
+ +
tjregion Struct Reference
-
+
- +

Cropping region. More...

#include <turbojpeg.h>

- - - - - - - - - + + + + + + + + + + + +

+

Data Fields

int x
 The left boundary of the cropping region.
int y
 The upper boundary of the cropping region.
int w
 The width of the cropping region.
int h
 The height of the cropping region.
int x
 The left boundary of the cropping region. More...
 
int y
 The upper boundary of the cropping region. More...
 
int w
 The width of the cropping region. More...
 
int h
 The height of the cropping region. More...
 
-

Detailed Description

+

Detailed Description

Cropping region.

-

Field Documentation

- +

Field Documentation

+
- +
int tjregion::hint tjregion::h
-
-
+

The height of the cropping region.

Setting this to 0 is the equivalent of setting it to the height of the source JPEG image - y.

- +
- +
int tjregion::wint tjregion::w
-
-
+

The width of the cropping region.

Setting this to 0 is the equivalent of setting it to the width of the source JPEG image - x.

- +
- +
int tjregion::xint tjregion::x
-
-
+

The left boundary of the cropping region.

This must be evenly divisible by the MCU block width (see tjMCUWidth.)

- +
- +
int tjregion::yint tjregion::y
-
-
+

The upper boundary of the cropping region.

This must be evenly divisible by the MCU block height (see tjMCUHeight.)

@@ -150,23 +174,12 @@ Data Fields
The documentation for this struct was generated from the following file:
  • turbojpeg.h
-
- - - - -
- -
- - +
+ + diff --git a/doc/html/structtjscalingfactor.html b/doc/html/structtjscalingfactor.html index 153522a..33c7366 100644 --- a/doc/html/structtjscalingfactor.html +++ b/doc/html/structtjscalingfactor.html @@ -2,35 +2,45 @@ + + TurboJPEG: tjscalingfactor Struct Reference + + - + + - - - -
+ +
-
TurboJPEG 1.2.1
+
TurboJPEG +  1.2.1 +
+ + + + + + + +
+
+ +
tjscalingfactor Struct Reference
-
+
- +

Scaling factor. More...

#include <turbojpeg.h>

- - - - - + + + + + +

+

Data Fields

int num
 Numerator.
int denom
 Denominator.
int num
 Numerator. More...
 
int denom
 Denominator. More...
 
-

Detailed Description

+

Detailed Description

Scaling factor.

-

Field Documentation

- +

Field Documentation

+
- +
int tjscalingfactor::denomint tjscalingfactor::denom
-
-
+

Denominator.

- +
- +
int tjscalingfactor::numint tjscalingfactor::num
-
-
+

Numerator.

@@ -112,23 +136,12 @@ Data Fields
The documentation for this struct was generated from the following file:
  • turbojpeg.h
-
- - - - -
- -
- - +
+ + diff --git a/doc/html/structtjtransform.html b/doc/html/structtjtransform.html index 0a44092..f47ca59 100644 --- a/doc/html/structtjtransform.html +++ b/doc/html/structtjtransform.html @@ -2,35 +2,45 @@ + + TurboJPEG: tjtransform Struct Reference + + - + + - - - -
+ +
-
TurboJPEG 1.2.1
+
TurboJPEG +  1.2.1 +
+ + + + + + + +
+
+ +
tjtransform Struct Reference
-
+
- +

Lossless transform. More...

#include <turbojpeg.h>

- - - - - - - - - - - + + + + + + + + + + + + + + +

+

Data Fields

tjregion r
 Cropping region.
int op
 One of the transform operations.
int options
 The bitwise OR of one of more of the transform options.
void * data
 Arbitrary data that can be accessed within the body of the callback function.
int(* customFilter )(short *coeffs, tjregion arrayRegion, tjregion planeRegion, int componentIndex, int transformIndex, struct tjtransform *transform)
 A callback function that can be used to modify the DCT coefficients after they are losslessly transformed but before they are transcoded to a new JPEG file.
tjregion r
 Cropping region. More...
 
int op
 One of the transform operations. More...
 
int options
 The bitwise OR of one of more of the transform options. More...
 
void * data
 Arbitrary data that can be accessed within the body of the callback function. More...
 
int(* customFilter )(short *coeffs, tjregion arrayRegion, tjregion planeRegion, int componentIndex, int transformIndex, struct tjtransform *transform)
 A callback function that can be used to modify the DCT coefficients after they are losslessly transformed but before they are transcoded to a new JPEG image. More...
 
-

Detailed Description

+

Detailed Description

Lossless transform.

-

Field Documentation

- +

Field Documentation

+
- +
int(* tjtransform::customFilter)(short *coeffs, tjregion arrayRegion, tjregion planeRegion, int componentIndex, int transformIndex, struct tjtransform *transform)int(* tjtransform::customFilter)(short *coeffs, tjregion arrayRegion, tjregion planeRegion, int componentIndex, int transformIndex, struct tjtransform *transform)
-
-
+
-

A callback function that can be used to modify the DCT coefficients after they are losslessly transformed but before they are transcoded to a new JPEG file.

+

A callback function that can be used to modify the DCT coefficients after they are losslessly transformed but before they are transcoded to a new JPEG image.

This allows for custom filters or other transformations to be applied in the frequency domain.

-
Parameters:
+
Parameters
- +
coeffspointer to an array of transformed DCT coefficients. (NOTE: this pointer is not guaranteed to be valid once the callback returns, so applications wishing to hand off the DCT coefficients to another function or library should make a copy of them within the body of the callback.)
arrayRegiontjregion structure containing the width and height of the array pointed to by coeffs as well as its offset relative to the component plane. TurboJPEG implementations may choose to split each component plane into multiple DCT coefficient arrays and call the callback function once for each array.
planeRegiontjregion structure containing the width and height of the component plane to which coeffs belongs
componentIDID number of the component plane to which coeffs belongs (Y, Cb, and Cr have, respectively, ID's of 0, 1, and 2 in typical JPEG images.)
transformIDID number of the transformed image to which coeffs belongs. This is the same as the index of the transform in the transforms array that was passed to tjTransform().
transformIDID number of the transformed image to which coeffs belongs. This is the same as the index of the transform in the transforms array that was passed to tjTransform().
transforma pointer to a tjtransform structure that specifies the parameters and/or cropping region for this transform
-
Returns:
0 if the callback was successful, or -1 if an error occurred.
+
Returns
0 if the callback was successful, or -1 if an error occurred.
- +
- +
void* tjtransform::datavoid* tjtransform::data
-
-
+

Arbitrary data that can be accessed within the body of the callback function.

- +
- +
int tjtransform::opint tjtransform::op
-
-
+

One of the transform operations.

- +
- +
int tjtransform::optionsint tjtransform::options
-
-
+

The bitwise OR of one of more of the transform options.

- +
- +
tjregion tjtransform::rtjregion tjtransform::r
-
-
+

Cropping region.

@@ -176,23 +200,12 @@ Data Fields
The documentation for this struct was generated from the following file:
  • turbojpeg.h
-
- - - - -
- -
- - +
+ + diff --git a/doc/html/sync_off.png b/doc/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/doc/html/sync_on.png b/doc/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/doc/html/tab_a.png b/doc/html/tab_a.png index 2d99ef23fed78c7683f0b5aa803d937060d288c4..3b725c41c5a527a3a3e40097077d0e206a681247 100644 GIT binary patch delta 113 zcmV-%0FM8R0geHXBx+SjL_t(|0qvbj3V<*WLnm*fD2j+%#l7Gq+<5;Z*{QAP2nqR} z!S?f}A6KSjBMmcj2}v0s95XABy!b`qeq0Yk9=#tquiN10l6OtFzxMxqe_8ck>OlfD TS)Sv400000NkvXXu0mjf*h4XO delta 111 zcmV-#0FeKV0gM5VBxqAfL_t(|0qvc;34lNp1b64jp`3`AD&~SsnAm?w2Jg;BhW$(p zIRMd8Q0(A2oN4s~GSz_eB{&>x`2eL8dp zT|~jMkaNG}u7bAx%XOvre3E$i74E&jKK~gPF}n{Y8=!5(I0xKQ+0l61Ou$w991{_m v-m(zHX%0n}isespgrbrefo^!<(&``6OBznHeiUi|0000UdP_Df=vx!f>I?0(t zKHnd0dsF*K?I*b&z>% diff --git a/doc/html/tab_h.png b/doc/html/tab_h.png index c11f48f19bbe1f178d95397b98075bdd6d989328..fd5cb705488e60fcf30f56fcc951dee74f3b095b 100644 GIT binary patch delta 149 zcmV;G0BZlh0kHv)B!75GL_t(|0qxyQ62U+ahT)!m5vAP5&XPrTh`$;lA(gU`WGdHk z1V?cjJ&Jq0-&5VEkmu{I)5%E32^4itUiJ7}z+VH0qT^Twc6rPG(y=|aRzqfH=H?W8 zu=b6L2=la3=bR;9_2>VNqV~72jSdG9$8vRNwkSVmXck;)J`Q|y00000NkvXXu0mjf D6ck2n delta 164 zcmV;V09*gD0l)!}B!7oVL_t(|0qxz}34&l4fZ>n-rMielilPI8Xqs6b(hUF1GLI8B zKx4E>cg^waA@9$ZOEHk@UWo{)9!PXglJ~@UN0_xl*Nz}-Ii`&g5f0}XKWXsd8aI03 zgcWvBVV|Cu{^QT^N{oHU#wpmkcUHTC^{!xHX_nTFrKOphS{;dqnv77h>G%f#Ln7el SP(6SE0000B!7QNL_t(|0qxy^34%ZXK+&T=Q4$n|q#~N4C8kM{mx^YVHd`CC zNWLn{S^f~#UuRg?v)<^0000< KMNUMnLSTXuTSx)` delta 161 zcmV;S0AByN0lfi`B!7fSL_t(|0qx!E34%}nK;cVgA|)siNkx32C8kNCHx(ag+H7sm zA`R1z8sytUyxt%3+ml=_WaUp<%%sIaa-E4UkH3j1pNP&QVK(BQ27>gCn+!N{j~(~e z#}4bzVMZ JPEG compressor). -jcprepct.c Preprocessor buffer controller. -jccoefct.c Buffer controller for DCT coefficient buffer. -jccolor.c Color space conversion. -jcsample.c Downsampling. -jcdctmgr.c DCT manager (DCT implementation selection & control). -jfdctint.c Forward DCT using slow-but-accurate integer method. -jfdctfst.c Forward DCT using faster, less accurate integer method. -jfdctflt.c Forward DCT using floating-point arithmetic. -jchuff.c Huffman entropy coding for sequential JPEG. -jcphuff.c Huffman entropy coding for progressive JPEG. -jcarith.c Arithmetic entropy coding. -jcmarker.c JPEG marker writing. -jdatadst.c Data destination managers for memory and stdio output. - -Decompression side of the library: - -jdmaster.c Master control: determines which other modules to use. -jdinput.c Input controller: controls input processing modules. -jdmainct.c Main buffer controller (JPEG decompressor => postprocessor). -jdcoefct.c Buffer controller for DCT coefficient buffer. -jdpostct.c Postprocessor buffer controller. -jdmarker.c JPEG marker reading. -jdhuff.c Huffman entropy decoding for sequential JPEG. -jdphuff.c Huffman entropy decoding for progressive JPEG. -jdarith.c Arithmetic entropy decoding. -jddctmgr.c IDCT manager (IDCT implementation selection & control). -jidctint.c Inverse DCT using slow-but-accurate integer method. -jidctfst.c Inverse DCT using faster, less accurate integer method. -jidctflt.c Inverse DCT using floating-point arithmetic. -jidctred.c Inverse DCTs with reduced-size outputs. -jdsample.c Upsampling. -jdcolor.c Color space conversion. -jdmerge.c Merged upsampling/color conversion (faster, lower quality). -jquant1.c One-pass color quantization using a fixed-spacing colormap. -jquant2.c Two-pass color quantization using a custom-generated colormap. - Also handles one-pass quantization to an externally given map. -jdatasrc.c Data source managers for memory and stdio input. - -Support files for both compression and decompression: - -jaricom.c Tables for common use in arithmetic entropy encoding and - decoding routines. -jerror.c Standard error handling routines (application replaceable). -jmemmgr.c System-independent (more or less) memory management code. -jutils.c Miscellaneous utility routines. - -jmemmgr.c relies on a system-dependent memory management module. The IJG -distribution includes the following implementations of the system-dependent -module: - -jmemnobs.c "No backing store": assumes adequate virtual memory exists. -jmemansi.c Makes temporary files with ANSI-standard routine tmpfile(). -jmemname.c Makes temporary files with program-generated file names. -jmemdos.c Custom implementation for MS-DOS (16-bit environment only): - can use extended and expanded memory as well as temp files. -jmemmac.c Custom implementation for Apple Macintosh. - -Exactly one of the system-dependent modules should be configured into an -installed JPEG library (see install.txt for hints about which one to use). -On unusual systems you may find it worthwhile to make a special -system-dependent memory manager. - - -Non-C source code files: - -jmemdosa.asm 80x86 assembly code support for jmemdos.c; used only in - MS-DOS-specific configurations of the JPEG library. - - -CJPEG/DJPEG/JPEGTRAN -==================== - -Include files: - -cdjpeg.h Declarations shared by cjpeg/djpeg/jpegtran modules. -cderror.h Additional error and trace message codes for cjpeg et al. -transupp.h Declarations for jpegtran support routines in transupp.c. - -C source code files: - -cjpeg.c Main program for cjpeg. -djpeg.c Main program for djpeg. -jpegtran.c Main program for jpegtran. -cdjpeg.c Utility routines used by all three programs. -rdcolmap.c Code to read a colormap file for djpeg's "-map" switch. -rdswitch.c Code to process some of cjpeg's more complex switches. - Also used by jpegtran. -transupp.c Support code for jpegtran: lossless image manipulations. - -Image file reader modules for cjpeg: - -rdbmp.c BMP file input. -rdgif.c GIF file input (now just a stub). -rdppm.c PPM/PGM file input. -rdrle.c Utah RLE file input. -rdtarga.c Targa file input. - -Image file writer modules for djpeg: - -wrbmp.c BMP file output. -wrgif.c GIF file output (a mere shadow of its former self). -wrppm.c PPM/PGM file output. -wrrle.c Utah RLE file output. -wrtarga.c Targa file output. - - -RDJPGCOM/WRJPGCOM -================= - -C source code files: - -rdjpgcom.c Stand-alone rdjpgcom application. -wrjpgcom.c Stand-alone wrjpgcom application. - -These programs do not depend on the IJG library. They do use -jconfig.h and jinclude.h, only to improve portability. - - -ADDITIONAL FILES -================ - -Documentation (see README for a guide to the documentation files): - -README Master documentation file. -*.txt Other documentation files. -*.1 Documentation in Unix man page format. -change.log Version-to-version change highlights. -example.c Sample code for calling JPEG library. - -Configuration/installation files and programs (see install.txt for more info): - -configure Unix shell script to perform automatic configuration. -configure.ac Source file for use with Autoconf to generate configure. -ltmain.sh Support scripts for configure (from GNU libtool). -config.guess -config.sub -depcomp -missing -install-sh Install shell script for those Unix systems lacking one. -Makefile.in Makefile input for configure. -Makefile.am Source file for use with Automake to generate Makefile.in. -jconfig.txt Template for making jconfig.h by hand. -aclocal.m4 M4 macro definitions for use with Autoconf. - -Test files (see install.txt for test procedure): - -test*.* Source and comparison files for confidence test. - These are binary image files, NOT text files. diff --git a/install.txt b/install.txt deleted file mode 100644 index 1327dc4..0000000 --- a/install.txt +++ /dev/null @@ -1,1096 +0,0 @@ -INSTALLATION INSTRUCTIONS for the Independent JPEG Group's JPEG software - -Copyright (C) 1991-2010, Thomas G. Lane, Guido Vollbeding. -This file is part of the Independent JPEG Group's software. -For conditions of distribution and use, see the accompanying README file. - - -This file explains how to configure and install the IJG software. We have -tried to make this software extremely portable and flexible, so that it can be -adapted to almost any environment. The downside of this decision is that the -installation process is complicated. We have provided shortcuts to simplify -the task on common systems. But in any case, you will need at least a little -familiarity with C programming and program build procedures for your system. - -If you are only using this software as part of a larger program, the larger -program's installation procedure may take care of configuring the IJG code. -For example, Ghostscript's installation script will configure the IJG code. -You don't need to read this file if you just want to compile Ghostscript. - -If you are on a Unix machine, you may not need to read this file at all. -Try doing - ./configure - make - make test -If that doesn't complain, do - make install -(better do "make -n install" first to see if the makefile will put the files -where you want them). Read further if you run into snags or want to customize -the code for your system. - - -TABLE OF CONTENTS ------------------ - -Before you start -Configuring the software: - using the automatic "configure" script - using one of the supplied jconfig and makefile files - by hand -Building the software -Testing the software -Installing the software -Optional stuff -Optimization -Hints for specific systems - - -BEFORE YOU START -================ - -Before installing the software you must unpack the distributed source code. -Since you are reading this file, you have probably already succeeded in this -task. However, there is a potential for error if you needed to convert the -files to the local standard text file format (for example, if you are on -MS-DOS you may have converted LF end-of-line to CR/LF). You must apply -such conversion to all the files EXCEPT those whose names begin with "test". -The test files contain binary data; if you change them in any way then the -self-test will give bad results. - -Please check the last section of this file to see if there are hints for the -specific machine or compiler you are using. - - -CONFIGURING THE SOFTWARE -======================== - -To configure the IJG code for your system, you need to create two files: - * jconfig.h: contains values for system-dependent #define symbols. - * Makefile: controls the compilation process. -(On a non-Unix machine, you may create "project files" or some other -substitute for a Makefile. jconfig.h is needed in any environment.) - -We provide three different ways to generate these files: - * On a Unix system, you can just run the "configure" script. - * We provide sample jconfig files and makefiles for popular machines; - if your machine matches one of the samples, just copy the right sample - files to jconfig.h and Makefile. - * If all else fails, read the instructions below and make your own files. - - -Configuring the software using the automatic "configure" script ---------------------------------------------------------------- - -If you are on a Unix machine, you can just type - ./configure -and let the configure script construct appropriate configuration files. -If you're using "csh" on an old version of System V, you might need to type - sh configure -instead to prevent csh from trying to execute configure itself. -Expect configure to run for a few minutes, particularly on slower machines; -it works by compiling a series of test programs. - -Configure was created with GNU Autoconf and it follows the usual conventions -for GNU configure scripts. It makes a few assumptions that you may want to -override. You can do this by providing optional switches to configure: - -* Configure will build both static and shared libraries, if possible. -If you want to build libjpeg only as a static library, say - ./configure --disable-shared -If you want to build libjpeg only as a shared library, say - ./configure --disable-static -Configure uses GNU libtool to take care of system-dependent shared library -building methods. - -* Configure will use gcc (GNU C compiler) if it's available, otherwise cc. -To force a particular compiler to be selected, use the CC option, for example - ./configure CC='cc' -The same method can be used to include any unusual compiler switches. -For example, on HP-UX you probably want to say - ./configure CC='cc -Aa' -to get HP's compiler to run in ANSI mode. - -* The default CFLAGS setting is "-g" for non-gcc compilers, "-g -O2" for gcc. -You can override this by saying, for example, - ./configure CFLAGS='-O2' -if you want to compile without debugging support. - -* Configure will set up the makefile so that "make install" will install files -into /usr/local/bin, /usr/local/man, etc. You can specify an installation -prefix other than "/usr/local" by giving configure the option "--prefix=PATH". - -* If you don't have a lot of swap space, you may need to enable the IJG -software's internal virtual memory mechanism. To do this, give the option -"--enable-maxmem=N" where N is the default maxmemory limit in megabytes. -This is discussed in more detail under "Selecting a memory manager", below. -You probably don't need to worry about this on reasonably-sized Unix machines, -unless you plan to process very large images. - -Configure has some other features that are useful if you are cross-compiling -or working in a network of multiple machine types; but if you need those -features, you probably already know how to use them. - - -Configuring the software using one of the supplied jconfig and makefile files ------------------------------------------------------------------------------ - -If you have one of these systems, you can just use the provided configuration -files: - -Makefile jconfig file System and/or compiler - -makefile.manx jconfig.manx Amiga, Manx Aztec C -makefile.sas jconfig.sas Amiga, SAS C -makeproj.mac jconfig.mac Apple Macintosh, Metrowerks CodeWarrior -mak*jpeg.st jconfig.st Atari ST/STE/TT, Pure C or Turbo C -makefile.bcc jconfig.bcc MS-DOS or OS/2, Borland C -makefile.dj jconfig.dj MS-DOS, DJGPP (Delorie's port of GNU C) -makefile.mc6 jconfig.mc6 MS-DOS, Microsoft C (16-bit only) -makefile.wat jconfig.wat MS-DOS, OS/2, or Windows NT, Watcom C -makefile.vc jconfig.vc Windows NT/95, MS Visual C++ -make*.vc6 jconfig.vc Windows NT/95, MS Visual C++ 6 -make*.v10 jconfig.vc Windows NT/95, MS Visual C++ 2010 (v10) -makefile.mms jconfig.vms Digital VMS, with MMS software -makefile.vms jconfig.vms Digital VMS, without MMS software - -Copy the proper jconfig file to jconfig.h and the makefile to Makefile (or -whatever your system uses as the standard makefile name). For more info see -the appropriate system-specific hints section near the end of this file. - - -Configuring the software by hand --------------------------------- - -First, generate a jconfig.h file. If you are moderately familiar with C, -the comments in jconfig.txt should be enough information to do this; just -copy jconfig.txt to jconfig.h and edit it appropriately. Otherwise, you may -prefer to use the ckconfig.c program. You will need to compile and execute -ckconfig.c by hand --- we hope you know at least enough to do that. -ckconfig.c may not compile the first try (in fact, the whole idea is for it -to fail if anything is going to). If you get compile errors, fix them by -editing ckconfig.c according to the directions given in ckconfig.c. Once -you get it to run, it will write a suitable jconfig.h file, and will also -print out some advice about which makefile to use. - -You may also want to look at the canned jconfig files, if there is one for a -system similar to yours. - -Second, select a makefile and copy it to Makefile (or whatever your system -uses as the standard makefile name). The most generic makefiles we provide -are - makefile.ansi: if your C compiler supports function prototypes - makefile.unix: if not. -(You have function prototypes if ckconfig.c put "#define HAVE_PROTOTYPES" -in jconfig.h.) You may want to start from one of the other makefiles if -there is one for a system similar to yours. - -Look over the selected Makefile and adjust options as needed. In particular -you may want to change the CC and CFLAGS definitions. For instance, if you -are using GCC, set CC=gcc. If you had to use any compiler switches to get -ckconfig.c to work, make sure the same switches are in CFLAGS. - -If you are on a system that doesn't use makefiles, you'll need to set up -project files (or whatever you do use) to compile all the source files and -link them into executable files cjpeg, djpeg, jpegtran, rdjpgcom, and wrjpgcom. -See the file lists in any of the makefiles to find out which files go into -each program. Note that the provided makefiles all make a "library" file -libjpeg first, but you don't have to do that if you don't want to; the file -lists identify which source files are actually needed for compression, -decompression, or both. As a last resort, you can make a batch script that -just compiles everything and links it all together; makefile.vms is an example -of this (it's for VMS systems that have no make-like utility). - -Here are comments about some specific configuration decisions you'll -need to make: - -Command line style ------------------- - -These programs can use a Unix-like command line style which supports -redirection and piping, like this: - cjpeg inputfile >outputfile - cjpeg outputfile - source program | cjpeg >outputfile -The simpler "two file" command line style is just - cjpeg inputfile outputfile -You may prefer the two-file style, particularly if you don't have pipes. - -You MUST use two-file style on any system that doesn't cope well with binary -data fed through stdin/stdout; this is true for some MS-DOS compilers, for -example. If you're not on a Unix system, it's safest to assume you need -two-file style. (But if your compiler provides either the Posix-standard -fdopen() library routine or a Microsoft-compatible setmode() routine, you -can safely use the Unix command line style, by defining USE_FDOPEN or -USE_SETMODE respectively.) - -To use the two-file style, make jconfig.h say "#define TWO_FILE_COMMANDLINE". - -Selecting a memory manager --------------------------- - -The IJG code is capable of working on images that are too big to fit in main -memory; data is swapped out to temporary files as necessary. However, the -code to do this is rather system-dependent. We provide five different -memory managers: - -* jmemansi.c This version uses the ANSI-standard library routine tmpfile(), - which not all non-ANSI systems have. On some systems - tmpfile() may put the temporary file in a non-optimal - location; if you don't like what it does, use jmemname.c. - -* jmemname.c This version creates named temporary files. For anything - except a Unix machine, you'll need to configure the - select_file_name() routine appropriately; see the comments - near the head of jmemname.c. If you use this version, define - NEED_SIGNAL_CATCHER in jconfig.h to make sure the temp files - are removed if the program is aborted. - -* jmemnobs.c (That stands for No Backing Store :-).) This will compile on - almost any system, but it assumes you have enough main memory - or virtual memory to hold the biggest images you work with. - -* jmemdos.c This should be used with most 16-bit MS-DOS compilers. - See the system-specific notes about MS-DOS for more info. - IMPORTANT: if you use this, define USE_MSDOS_MEMMGR in - jconfig.h, and include the assembly file jmemdosa.asm in the - programs. The supplied makefiles and jconfig files for - 16-bit MS-DOS compilers already do both. - -* jmemmac.c Custom version for Apple Macintosh; see the system-specific - notes for Macintosh for more info. - -To use a particular memory manager, change the SYSDEPMEM variable in your -makefile to equal the corresponding object file name (for example, jmemansi.o -or jmemansi.obj for jmemansi.c). - -If you have plenty of (real or virtual) main memory, just use jmemnobs.c. -"Plenty" means about ten bytes for every pixel in the largest images -you plan to process, so a lot of systems don't meet this criterion. -If yours doesn't, try jmemansi.c first. If that doesn't compile, you'll have -to use jmemname.c; be sure to adjust select_file_name() for local conditions. -You may also need to change unlink() to remove() in close_backing_store(). - -Except with jmemnobs.c or jmemmac.c, you need to adjust the DEFAULT_MAX_MEM -setting to a reasonable value for your system (either by adding a #define for -DEFAULT_MAX_MEM to jconfig.h, or by adding a -D switch to the Makefile). -This value limits the amount of data space the program will attempt to -allocate. Code and static data space isn't counted, so the actual memory -needs for cjpeg or djpeg are typically 100 to 150Kb more than the max-memory -setting. Larger max-memory settings reduce the amount of I/O needed to -process a large image, but too large a value can result in "insufficient -memory" failures. On most Unix machines (and other systems with virtual -memory), just set DEFAULT_MAX_MEM to several million and forget it. At the -other end of the spectrum, for MS-DOS machines you probably can't go much -above 300K to 400K. (On MS-DOS the value refers to conventional memory only. -Extended/expanded memory is handled separately by jmemdos.c.) - - -BUILDING THE SOFTWARE -===================== - -Now you should be able to compile the software. Just say "make" (or -whatever's necessary to start the compilation). Have a cup of coffee. - -Here are some things that could go wrong: - -If your compiler complains about undefined structures, you should be able to -shut it up by putting "#define INCOMPLETE_TYPES_BROKEN" in jconfig.h. - -If you have trouble with missing system include files or inclusion of the -wrong ones, read jinclude.h. This shouldn't happen if you used configure -or ckconfig.c to set up jconfig.h. - -There are a fair number of routines that do not use all of their parameters; -some compilers will issue warnings about this, which you can ignore. There -are also a few configuration checks that may give "unreachable code" warnings. -Any other warning deserves investigation. - -If you don't have a getenv() library routine, define NO_GETENV. - -Also see the system-specific hints, below. - - -TESTING THE SOFTWARE -==================== - -As a quick test of functionality we've included a small sample image in -several forms: - testorig.jpg Starting point for the djpeg tests. - testimg.ppm The output of djpeg testorig.jpg - testimg.bmp The output of djpeg -bmp -colors 256 testorig.jpg - testimg.jpg The output of cjpeg testimg.ppm - testprog.jpg Progressive-mode equivalent of testorig.jpg. - testimgp.jpg The output of cjpeg -progressive -optimize testimg.ppm -(The first- and second-generation .jpg files aren't identical since JPEG is -lossy.) If you can generate duplicates of the testimg* files then you -probably have working programs. - -With most of the makefiles, "make test" will perform the necessary -comparisons. - -If you're using a makefile that doesn't provide the test option, run djpeg -and cjpeg by hand and compare the output files to testimg* with whatever -binary file comparison tool you have. The files should be bit-for-bit -identical. - -If the programs complain "MAX_ALLOC_CHUNK is wrong, please fix", then you -need to reduce MAX_ALLOC_CHUNK to a value that fits in type size_t. -Try adding "#define MAX_ALLOC_CHUNK 65520L" to jconfig.h. A less likely -configuration error is "ALIGN_TYPE is wrong, please fix": defining ALIGN_TYPE -as long should take care of that one. - -If the cjpeg test run fails with "Missing Huffman code table entry", it's a -good bet that you needed to define RIGHT_SHIFT_IS_UNSIGNED. Go back to the -configuration step and run ckconfig.c. (This is a good plan for any other -test failure, too.) - -If you are using Unix (one-file) command line style on a non-Unix system, -it's a good idea to check that binary I/O through stdin/stdout actually -works. You should get the same results from "djpeg out.ppm" -as from "djpeg -outfile out.ppm testorig.jpg". Note that the makefiles all -use the latter style and therefore do not exercise stdin/stdout! If this -check fails, try recompiling with USE_SETMODE or USE_FDOPEN defined. -If it still doesn't work, better use two-file style. - -If you chose a memory manager other than jmemnobs.c, you should test that -temporary-file usage works. Try "djpeg -bmp -colors 256 -max 0 testorig.jpg" -and make sure its output matches testimg.bmp. If you have any really large -images handy, try compressing them with -optimize and/or decompressing with --colors 256 to make sure your DEFAULT_MAX_MEM setting is not too large. - -NOTE: this is far from an exhaustive test of the JPEG software; some modules, -such as 1-pass color quantization, are not exercised at all. It's just a -quick test to give you some confidence that you haven't missed something -major. - - -INSTALLING THE SOFTWARE -======================= - -Once you're done with the above steps, you can install the software by -copying the executable files (cjpeg, djpeg, jpegtran, rdjpgcom, and wrjpgcom) -to wherever you normally install programs. On Unix systems, you'll also want -to put the man pages (cjpeg.1, djpeg.1, jpegtran.1, rdjpgcom.1, wrjpgcom.1) -in the man-page directory. The pre-fab makefiles don't support this step -since there's such a wide variety of installation procedures on different -systems. - -If you generated a Makefile with the "configure" script, you can just say - make install -to install the programs and their man pages into the standard places. -(You'll probably need to be root to do this.) We recommend first saying - make -n install -to see where configure thought the files should go. You may need to edit -the Makefile, particularly if your system's conventions for man page -filenames don't match what configure expects. - -If you want to install the IJG library itself, for use in compiling other -programs besides ours, then you need to put the four include files - jpeglib.h jerror.h jconfig.h jmorecfg.h -into your include-file directory, and put the library file libjpeg.a -(extension may vary depending on system) wherever library files go. -If you generated a Makefile with "configure", it will do what it thinks -is the right thing if you say - make install-lib - - -OPTIONAL STUFF -============== - -Progress monitor: - -If you like, you can #define PROGRESS_REPORT (in jconfig.h) to enable display -of percent-done progress reports. The routine provided in cdjpeg.c merely -prints percentages to stderr, but you can customize it to do something -fancier. - -Utah RLE file format support: - -We distribute the software with support for RLE image files (Utah Raster -Toolkit format) disabled, because the RLE support won't compile without the -Utah library. If you have URT version 3.1 or later, you can enable RLE -support as follows: - 1. #define RLE_SUPPORTED in jconfig.h. - 2. Add a -I option to CFLAGS in the Makefile for the directory - containing the URT .h files (typically the "include" - subdirectory of the URT distribution). - 3. Add -L... -lrle to LDLIBS in the Makefile, where ... specifies - the directory containing the URT "librle.a" file (typically the - "lib" subdirectory of the URT distribution). - -Support for 12-bit-deep pixel data: - -The JPEG standard allows either 8-bit or 12-bit data precision. (For color, -this means 8 or 12 bits per channel, of course.) If you need to work with -deeper than 8-bit data, you can compile the IJG code for 12-bit operation. -To do so: - 1. In jmorecfg.h, define BITS_IN_JSAMPLE as 12 rather than 8. - 2. In jconfig.h, undefine BMP_SUPPORTED, RLE_SUPPORTED, and TARGA_SUPPORTED, - because the code for those formats doesn't handle 12-bit data and won't - even compile. (The PPM code does work, as explained below. The GIF - code works too; it scales 8-bit GIF data to and from 12-bit depth - automatically.) - 3. Compile. Don't expect "make test" to pass, since the supplied test - files are for 8-bit data. - -Currently, 12-bit support does not work on 16-bit-int machines. - -Note that a 12-bit version will not read 8-bit JPEG files, nor vice versa; -so you'll want to keep around a regular 8-bit compilation as well. -(Run-time selection of data depth, to allow a single copy that does both, -is possible but would probably slow things down considerably; it's very low -on our to-do list.) - -The PPM reader (rdppm.c) can read 12-bit data from either text-format or -binary-format PPM and PGM files. Binary-format PPM/PGM files which have a -maxval greater than 255 are assumed to use 2 bytes per sample, MSB first -(big-endian order). As of early 1995, 2-byte binary format is not -officially supported by the PBMPLUS library, but it is expected that a -future release of PBMPLUS will support it. Note that the PPM reader will -read files of any maxval regardless of the BITS_IN_JSAMPLE setting; incoming -data is automatically rescaled to either maxval=255 or maxval=4095 as -appropriate for the cjpeg bit depth. - -The PPM writer (wrppm.c) will normally write 2-byte binary PPM or PGM -format, maxval 4095, when compiled with BITS_IN_JSAMPLE=12. Since this -format is not yet widely supported, you can disable it by compiling wrppm.c -with PPM_NORAWWORD defined; then the data is scaled down to 8 bits to make a -standard 1-byte/sample PPM or PGM file. (Yes, this means still another copy -of djpeg to keep around. But hopefully you won't need it for very long. -Poskanzer's supposed to get that new PBMPLUS release out Real Soon Now.) - -Of course, if you are working with 12-bit data, you probably have it stored -in some other, nonstandard format. In that case you'll probably want to -write your own I/O modules to read and write your format. - -Note that a 12-bit version of cjpeg always runs in "-optimize" mode, in -order to generate valid Huffman tables. This is necessary because our -default Huffman tables only cover 8-bit data. - -Removing code: - -If you need to make a smaller version of the JPEG software, some optional -functions can be removed at compile time. See the xxx_SUPPORTED #defines in -jconfig.h and jmorecfg.h. If at all possible, we recommend that you leave in -decoder support for all valid JPEG files, to ensure that you can read anyone's -output. Taking out support for image file formats that you don't use is the -most painless way to make the programs smaller. Another possibility is to -remove some of the DCT methods: in particular, the "IFAST" method may not be -enough faster than the others to be worth keeping on your machine. (If you -do remove ISLOW or IFAST, be sure to redefine JDCT_DEFAULT or JDCT_FASTEST -to a supported method, by adding a #define in jconfig.h.) - - -OPTIMIZATION -============ - -Unless you own a Cray, you'll probably be interested in making the JPEG -software go as fast as possible. This section covers some machine-dependent -optimizations you may want to try. We suggest that before trying any of -this, you first get the basic installation to pass the self-test step. -Repeat the self-test after any optimization to make sure that you haven't -broken anything. - -The integer DCT routines perform a lot of multiplications. These -multiplications must yield 32-bit results, but none of their input values -are more than 16 bits wide. On many machines, notably the 680x0 and 80x86 -CPUs, a 16x16=>32 bit multiply instruction is faster than a full 32x32=>32 -bit multiply. Unfortunately there is no portable way to specify such a -multiplication in C, but some compilers can generate one when you use the -right combination of casts. See the MULTIPLYxxx macro definitions in -jdct.h. If your compiler makes "int" be 32 bits and "short" be 16 bits, -defining SHORTxSHORT_32 is fairly likely to work. When experimenting with -alternate definitions, be sure to test not only whether the code still works -(use the self-test), but also whether it is actually faster --- on some -compilers, alternate definitions may compute the right answer, yet be slower -than the default. Timing cjpeg on a large PGM (grayscale) input file is the -best way to check this, as the DCT will be the largest fraction of the runtime -in that mode. (Note: some of the distributed compiler-specific jconfig files -already contain #define switches to select appropriate MULTIPLYxxx -definitions.) - -If your machine has sufficiently fast floating point hardware, you may find -that the float DCT method is faster than the integer DCT methods, even -after tweaking the integer multiply macros. In that case you may want to -make the float DCT be the default method. (The only objection to this is -that float DCT results may vary slightly across machines.) To do that, add -"#define JDCT_DEFAULT JDCT_FLOAT" to jconfig.h. Even if you don't change -the default, you should redefine JDCT_FASTEST, which is the method selected -by djpeg's -fast switch. Don't forget to update the documentation files -(usage.txt and/or cjpeg.1, djpeg.1) to agree with what you've done. - -If access to "short" arrays is slow on your machine, it may be a win to -define type JCOEF as int rather than short. This will cost a good deal of -memory though, particularly in some multi-pass modes, so don't do it unless -you have memory to burn and short is REALLY slow. - -If your compiler can compile function calls in-line, make sure the INLINE -macro in jmorecfg.h is defined as the keyword that marks a function -inline-able. Some compilers have a switch that tells the compiler to inline -any function it thinks is profitable (e.g., -finline-functions for gcc). -Enabling such a switch is likely to make the compiled code bigger but faster. - -In general, it's worth trying the maximum optimization level of your compiler, -and experimenting with any optional optimizations such as loop unrolling. -(Unfortunately, far too many compilers have optimizer bugs ... be prepared to -back off if the code fails self-test.) If you do any experimentation along -these lines, please report the optimal settings to jpeg-info@jpegclub.org so -we can mention them in future releases. Be sure to specify your machine and -compiler version. - - -HINTS FOR SPECIFIC SYSTEMS -========================== - -We welcome reports on changes needed for systems not mentioned here. Submit -'em to jpeg-info@jpegclub.org. Also, if configure or ckconfig.c is wrong -about how to configure the JPEG software for your system, please let us know. - - -Acorn RISC OS: - -(Thanks to Simon Middleton for these hints on compiling with Desktop C.) -After renaming the files according to Acorn conventions, take a copy of -makefile.ansi, change all occurrences of 'libjpeg.a' to 'libjpeg.o' and -change these definitions as indicated: - -CFLAGS= -throwback -IC: -Wn -LDLIBS=C:o.Stubs -SYSDEPMEM=jmemansi.o -LN=Link -AR=LibFile -c -o - -Also add a new line '.c.o:; $(cc) $< $(cflags) -c -o $@'. Remove the -lines '$(RM) libjpeg.o' and '$(AR2) libjpeg.o' and the 'jconfig.h' -dependency section. - -Copy jconfig.txt to jconfig.h. Edit jconfig.h to define TWO_FILE_COMMANDLINE -and CHAR_IS_UNSIGNED. - -Run the makefile using !AMU not !Make. If you want to use the 'clean' and -'test' makefile entries then you will have to fiddle with the syntax a bit -and rename the test files. - - -Amiga: - -SAS C 6.50 reportedly is too buggy to compile the IJG code properly. -A patch to update to 6.51 is available from SAS or AmiNet FTP sites. - -The supplied config files are set up to use jmemname.c as the memory -manager, with temporary files being created on the device named by -"JPEGTMP:". - - -Atari ST/STE/TT: - -Copy the project files makcjpeg.st, makdjpeg.st, maktjpeg.st, and makljpeg.st -to cjpeg.prj, djpeg.prj, jpegtran.prj, and libjpeg.prj respectively. The -project files should work as-is with Pure C. For Turbo C, change library -filenames "pc..." to "tc..." in each project file. Note that libjpeg.prj -selects jmemansi.c as the recommended memory manager. You'll probably want to -adjust the DEFAULT_MAX_MEM setting --- you want it to be a couple hundred K -less than your normal free memory. Put "#define DEFAULT_MAX_MEM nnnn" into -jconfig.h to do this. - -To use the 68881/68882 coprocessor for the floating point DCT, add the -compiler option "-8" to the project files and replace pcfltlib.lib with -pc881lib.lib in cjpeg.prj and djpeg.prj. Or if you don't have a -coprocessor, you may prefer to remove the float DCT code by undefining -DCT_FLOAT_SUPPORTED in jmorecfg.h (since without a coprocessor, the float -code will be too slow to be useful). In that case, you can delete -pcfltlib.lib from the project files. - -Note that you must make libjpeg.lib before making cjpeg.ttp, djpeg.ttp, -or jpegtran.ttp. You'll have to perform the self-test by hand. - -We haven't bothered to include project files for rdjpgcom and wrjpgcom. -Those source files should just be compiled by themselves; they don't -depend on the JPEG library. You can use the default.prj project file -of the Pure C distribution to make the programs. - -There is a bug in some older versions of the Turbo C library which causes the -space used by temporary files created with "tmpfile()" not to be freed after -an abnormal program exit. If you check your disk afterwards, you will find -cluster chains that are allocated but not used by a file. This should not -happen in cjpeg/djpeg/jpegtran, since we enable a signal catcher to explicitly -close temp files before exiting. But if you use the JPEG library with your -own code, be sure to supply a signal catcher, or else use a different -system-dependent memory manager. - - -Cray: - -Should you be so fortunate as to be running JPEG on a Cray YMP, there is a -compiler bug in old versions of Cray's Standard C (prior to 3.1). If you -still have an old compiler, you'll need to insert a line reading -"#pragma novector" just before the loop - for (i = 1; i <= (int) htbl->bits[l]; i++) - huffsize[p++] = (char) l; -in fix_huff_tbl (in V5beta1, line 204 of jchuff.c and line 176 of jdhuff.c). -[This bug may or may not still occur with the current IJG code, but it's -probably a dead issue anyway...] - - -HP-UX: - -If you have HP-UX 7.05 or later with the "software development" C compiler, -you should run the compiler in ANSI mode. If using the configure script, -say - ./configure CC='cc -Aa' -(or -Ae if you prefer). If configuring by hand, use makefile.ansi and add -"-Aa" to the CFLAGS line in the makefile. - -If you have a pre-7.05 system, or if you are using the non-ANSI C compiler -delivered with a minimum HP-UX system, then you must use makefile.unix -(and do NOT add -Aa); or just run configure without the CC option. - -On HP 9000 series 800 machines, the HP C compiler is buggy in revisions prior -to A.08.07. If you get complaints about "not a typedef name", you'll have to -use makefile.unix, or run configure without the CC option. - - -Macintosh, generic comments: - -The supplied user-interface files (cjpeg.c, djpeg.c, etc) are set up to -provide a Unix-style command line interface. You can use this interface on -the Mac by means of the ccommand() library routine provided by Metrowerks -CodeWarrior or Think C. This is only appropriate for testing the library, -however; to make a user-friendly equivalent of cjpeg/djpeg you'd really want -to develop a Mac-style user interface. There isn't a complete example -available at the moment, but there are some helpful starting points: -1. Sam Bushell's free "To JPEG" applet provides drag-and-drop conversion to -JPEG under System 7 and later. This only illustrates how to use the -compression half of the library, but it does a very nice job of that part. -The CodeWarrior source code is available from http://www.pobox.com/~jsam. -2. Jim Brunner prepared a Mac-style user interface for both compression and -decompression. Unfortunately, it hasn't been updated since IJG v4, and -the library's API has changed considerably since then. Still it may be of -some help, particularly as a guide to compiling the IJG code under Think C. -Jim's code is available from the Info-Mac archives, at sumex-aim.stanford.edu -or mirrors thereof; see file /info-mac/dev/src/jpeg-convert-c.hqx. - -jmemmac.c is the recommended memory manager back end for Macintosh. It uses -NewPtr/DisposePtr instead of malloc/free, and has a Mac-specific -implementation of jpeg_mem_available(). It also creates temporary files that -follow Mac conventions. (That part of the code relies on System-7-or-later OS -functions. See the comments in jmemmac.c if you need to run it on System 6.) -NOTE that USE_MAC_MEMMGR must be defined in jconfig.h to use jmemmac.c. - -You can also use jmemnobs.c, if you don't care about handling images larger -than available memory. If you use any memory manager back end other than -jmemmac.c, we recommend replacing "malloc" and "free" by "NewPtr" and -"DisposePtr", because Mac C libraries often have peculiar implementations of -malloc/free. (For instance, free() may not return the freed space to the -Mac Memory Manager. This is undesirable for the IJG code because jmemmgr.c -already clumps space requests.) - - -Macintosh, Metrowerks CodeWarrior: - -The Unix-command-line-style interface can be used by defining USE_CCOMMAND. -You'll also need to define TWO_FILE_COMMANDLINE to avoid stdin/stdout. -This means that when using the cjpeg/djpeg programs, you'll have to type the -input and output file names in the "Arguments" text-edit box, rather than -using the file radio buttons. (Perhaps USE_FDOPEN or USE_SETMODE would -eliminate the problem, but I haven't heard from anyone who's tried it.) - -On 680x0 Macs, Metrowerks defines type "double" as a 10-byte IEEE extended -float. jmemmgr.c won't like this: it wants sizeof(ALIGN_TYPE) to be a power -of 2. Add "#define ALIGN_TYPE long" to jconfig.h to eliminate the complaint. - -The supplied configuration file jconfig.mac can be used for your jconfig.h; -it includes all the recommended symbol definitions. If you have AppleScript -installed, you can run the supplied script makeproj.mac to create CodeWarrior -project files for the library and the testbed applications, then build the -library and applications. (Thanks to Dan Sears and Don Agro for this nifty -hack, which saves us from trying to maintain CodeWarrior project files as part -of the IJG distribution...) - - -Macintosh, Think C: - -The documentation in Jim Brunner's "JPEG Convert" source code (see above) -includes detailed build instructions for Think C; it's probably somewhat -out of date for the current release, but may be helpful. - -If you want to build the minimal command line version, proceed as follows. -You'll have to prepare project files for the programs; we don't include any -in the distribution since they are not text files. Use the file lists in -any of the supplied makefiles as a guide. Also add the ANSI and Unix C -libraries in a separate segment. You may need to divide the JPEG files into -more than one segment; we recommend dividing compression and decompression -modules. Define USE_CCOMMAND in jconfig.h so that the ccommand() routine is -called. You must also define TWO_FILE_COMMANDLINE because stdin/stdout -don't handle binary data correctly. - -On 680x0 Macs, Think C defines type "double" as a 12-byte IEEE extended float. -jmemmgr.c won't like this: it wants sizeof(ALIGN_TYPE) to be a power of 2. -Add "#define ALIGN_TYPE long" to jconfig.h to eliminate the complaint. - -jconfig.mac should work as a jconfig.h configuration file for Think C, -but the makeproj.mac AppleScript script is specific to CodeWarrior. Sorry. - - -MIPS R3000: - -MIPS's cc version 1.31 has a rather nasty optimization bug. Don't use -O -if you have that compiler version. (Use "cc -V" to check the version.) -Note that the R3000 chip is found in workstations from DEC and others. - - -MS-DOS, generic comments for 16-bit compilers: - -The IJG code is designed to work well in 80x86 "small" or "medium" memory -models (i.e., data pointers are 16 bits unless explicitly declared "far"; -code pointers can be either size). You may be able to use small model to -compile cjpeg or djpeg by itself, but you will probably have to use medium -model for any larger application. This won't make much difference in -performance. You *will* take a noticeable performance hit if you use a -large-data memory model, and you should avoid "huge" model if at all -possible. Be sure that NEED_FAR_POINTERS is defined in jconfig.h if you use -a small-data memory model; be sure it is NOT defined if you use a large-data -model. (The supplied makefiles and jconfig files for Borland and Microsoft C -compile in medium model and define NEED_FAR_POINTERS.) - -The DOS-specific memory manager, jmemdos.c, should be used if possible. -It needs some assembly-code routines which are in jmemdosa.asm; make sure -your makefile assembles that file and includes it in the library. If you -don't have a suitable assembler, you can get pre-assembled object files for -jmemdosa by FTP from ftp.uu.net:/graphics/jpeg/jdosaobj.zip. (DOS-oriented -distributions of the IJG source code often include these object files.) - -When using jmemdos.c, jconfig.h must define USE_MSDOS_MEMMGR and must set -MAX_ALLOC_CHUNK to less than 64K (65520L is a typical value). If your -C library's far-heap malloc() can't allocate blocks that large, reduce -MAX_ALLOC_CHUNK to whatever it can handle. - -If you can't use jmemdos.c for some reason --- for example, because you -don't have an assembler to assemble jmemdosa.asm --- you'll have to fall -back to jmemansi.c or jmemname.c. You'll probably still need to set -MAX_ALLOC_CHUNK in jconfig.h, because most DOS C libraries won't malloc() -more than 64K at a time. IMPORTANT: if you use jmemansi.c or jmemname.c, -you will have to compile in a large-data memory model in order to get the -right stdio library. Too bad. - -wrjpgcom needs to be compiled in large model, because it malloc()s a 64KB -work area to hold the comment text. If your C library's malloc can't -handle that, reduce MAX_COM_LENGTH as necessary in wrjpgcom.c. - -Most MS-DOS compilers treat stdin/stdout as text files, so you must use -two-file command line style. But if your compiler has either fdopen() or -setmode(), you can use one-file style if you like. To do this, define -USE_SETMODE or USE_FDOPEN so that stdin/stdout will be set to binary mode. -(USE_SETMODE seems to work with more DOS compilers than USE_FDOPEN.) You -should test that I/O through stdin/stdout produces the same results as I/O -to explicitly named files... the "make test" procedures in the supplied -makefiles do NOT use stdin/stdout. - - -MS-DOS, generic comments for 32-bit compilers: - -None of the above comments about memory models apply if you are using a -32-bit flat-memory-space environment, such as DJGPP or Watcom C. (And you -should use one if you have it, as performance will be much better than -8086-compatible code!) For flat-memory-space compilers, do NOT define -NEED_FAR_POINTERS, and do NOT use jmemdos.c. Use jmemnobs.c if the -environment supplies adequate virtual memory, otherwise use jmemansi.c or -jmemname.c. - -You'll still need to be careful about binary I/O through stdin/stdout. -See the last paragraph of the previous section. - - -MS-DOS, Borland C: - -Be sure to convert all the source files to DOS text format (CR/LF newlines). -Although Borland C will often work OK with unmodified Unix (LF newlines) -source files, sometimes it will give bogus compile errors. -"Illegal character '#'" is the most common such error. (This is true with -Borland C 3.1, but perhaps is fixed in newer releases.) - -If you want one-file command line style, just undefine TWO_FILE_COMMANDLINE. -jconfig.bcc already includes #define USE_SETMODE to make this work. -(fdopen does not work correctly.) - - -MS-DOS, Microsoft C: - -makefile.mc6 works with Microsoft C, DOS Visual C++, etc. It should only -be used if you want to build a 16-bit (small or medium memory model) program. - -If you want one-file command line style, just undefine TWO_FILE_COMMANDLINE. -jconfig.mc6 already includes #define USE_SETMODE to make this work. -(fdopen does not work correctly.) - -Note that this makefile assumes that the working copy of itself is called -"makefile". If you want to call it something else, say "makefile.mak", -be sure to adjust the dependency line that reads "$(RFILE) : makefile". -Otherwise the make will fail because it doesn't know how to create "makefile". -Worse, some releases of Microsoft's make utilities give an incorrect error -message in this situation. - -Old versions of MS C fail with an "out of macro expansion space" error -because they can't cope with the macro TRACEMS8 (defined in jerror.h). -If this happens to you, the easiest solution is to change TRACEMS8 to -expand to nothing. You'll lose the ability to dump out JPEG coefficient -tables with djpeg -debug -debug, but at least you can compile. - -Original MS C 6.0 is very buggy; it compiles incorrect code unless you turn -off optimization entirely (remove -O from CFLAGS). 6.00A is better, but it -still generates bad code if you enable loop optimizations (-Ol or -Ox). - -MS C 8.0 crashes when compiling jquant1.c with optimization switch /Oo ... -which is on by default. To work around this bug, compile that one file -with /Oo-. - - -Microsoft Windows (all versions), generic comments: - -Some Windows system include files define typedef boolean as "unsigned char". -The IJG code also defines typedef boolean, but we make it "int" by default. -This doesn't affect the IJG programs because we don't import those Windows -include files. But if you use the JPEG library in your own program, and some -of your program's files import one definition of boolean while some import the -other, you can get all sorts of mysterious problems. A good preventive step -is to make the IJG library use "unsigned char" for boolean. To do that, -add something like this to your jconfig.h file: - /* Define "boolean" as unsigned char, not int, per Windows custom */ - #ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ - typedef unsigned char boolean; - #endif - #define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ -(This is already in jconfig.vc, by the way.) - -windef.h contains the declarations - #define far - #define FAR far -Since jmorecfg.h tries to define FAR as empty, you may get a compiler -warning if you include both jpeglib.h and windef.h (which windows.h -includes). To suppress the warning, you can put "#ifndef FAR"/"#endif" -around the line "#define FAR" in jmorecfg.h. -(Something like this is already in jmorecfg.h, by the way.) - -When using the library in a Windows application, you will almost certainly -want to modify or replace the error handler module jerror.c, since our -default error handler does a couple of inappropriate things: - 1. it tries to write error and warning messages on stderr; - 2. in event of a fatal error, it exits by calling exit(). - -A simple stopgap solution for problem 1 is to replace the line - fprintf(stderr, "%s\n", buffer); -(in output_message in jerror.c) with - MessageBox(GetActiveWindow(),buffer,"JPEG Error",MB_OK|MB_ICONERROR); -It's highly recommended that you at least do that much, since otherwise -error messages will disappear into nowhere. (Beginning with IJG v6b, this -code is already present in jerror.c; just define USE_WINDOWS_MESSAGEBOX in -jconfig.h to enable it.) - -The proper solution for problem 2 is to return control to your calling -application after a library error. This can be done with the setjmp/longjmp -technique discussed in libjpeg.txt and illustrated in example.c. (NOTE: -some older Windows C compilers provide versions of setjmp/longjmp that -don't actually work under Windows. You may need to use the Windows system -functions Catch and Throw instead.) - -The recommended memory manager under Windows is jmemnobs.c; in other words, -let Windows do any virtual memory management needed. You should NOT use -jmemdos.c nor jmemdosa.asm under Windows. - -For Windows 3.1, we recommend compiling in medium or large memory model; -for newer Windows versions, use a 32-bit flat memory model. (See the MS-DOS -sections above for more info about memory models.) In the 16-bit memory -models only, you'll need to put - #define MAX_ALLOC_CHUNK 65520L /* Maximum request to malloc() */ -into jconfig.h to limit allocation chunks to 64Kb. (Without that, you'd -have to use huge memory model, which slows things down unnecessarily.) -jmemnobs.c works without modification in large or flat memory models, but to -use medium model, you need to modify its jpeg_get_large and jpeg_free_large -routines to allocate far memory. In any case, you might like to replace -its calls to malloc and free with direct calls on Windows memory allocation -functions. - -You may also want to modify jdatasrc.c and jdatadst.c to use Windows file -operations rather than fread/fwrite. This is only necessary if your C -compiler doesn't provide a competent implementation of C stdio functions. - -You might want to tweak the RGB_xxx macros in jmorecfg.h so that the library -will accept or deliver color pixels in BGR sample order, not RGB; BGR order -is usually more convenient under Windows. Note that this change will break -the sample applications cjpeg/djpeg, but the library itself works fine. - - -Many people want to convert the IJG library into a DLL. This is reasonably -straightforward, but watch out for the following: - - 1. Don't try to compile as a DLL in small or medium memory model; use -large model, or even better, 32-bit flat model. Many places in the IJG code -assume the address of a local variable is an ordinary (not FAR) pointer; -that isn't true in a medium-model DLL. - - 2. Microsoft C cannot pass file pointers between applications and DLLs. -(See Microsoft Knowledge Base, PSS ID Number Q50336.) So jdatasrc.c and -jdatadst.c don't work if you open a file in your application and then pass -the pointer to the DLL. One workaround is to make jdatasrc.c/jdatadst.c -part of your main application rather than part of the DLL. - - 3. You'll probably need to modify the macros GLOBAL() and EXTERN() to -attach suitable linkage keywords to the exported routine names. Similarly, -you'll want to modify METHODDEF() and JMETHOD() to ensure function pointers -are declared in a way that lets application routines be called back through -the function pointers. These macros are in jmorecfg.h. Typical definitions -for a 16-bit DLL are: - #define GLOBAL(type) type _far _pascal _loadds _export - #define EXTERN(type) extern type _far _pascal _loadds - #define METHODDEF(type) static type _far _pascal - #define JMETHOD(type,methodname,arglist) \ - type (_far _pascal *methodname) arglist -For a 32-bit DLL you may want something like - #define GLOBAL(type) __declspec(dllexport) type - #define EXTERN(type) extern __declspec(dllexport) type -Although not all the GLOBAL routines are actually intended to be called by -the application, the performance cost of making them all DLL entry points is -negligible. - -The unmodified IJG library presents a very C-specific application interface, -so the resulting DLL is only usable from C or C++ applications. There has -been some talk of writing wrapper code that would present a simpler interface -usable from other languages, such as Visual Basic. This is on our to-do list -but hasn't been very high priority --- any volunteers out there? - - -Microsoft Windows, Borland C: - -The provided jconfig.bcc should work OK in a 32-bit Windows environment, -but you'll need to tweak it in a 16-bit environment (you'd need to define -NEED_FAR_POINTERS and MAX_ALLOC_CHUNK). Beware that makefile.bcc will need -alteration if you want to use it for Windows --- in particular, you should -use jmemnobs.c not jmemdos.c under Windows. - -Borland C++ 4.5 fails with an internal compiler error when trying to compile -jdmerge.c in 32-bit mode. If enough people complain, perhaps Borland will fix -it. In the meantime, the simplest known workaround is to add a redundant -definition of the variable range_limit in h2v1_merged_upsample(), at the head -of the block that handles odd image width (about line 268 in v6 jdmerge.c): - /* If image width is odd, do the last output column separately */ - if (cinfo->output_width & 1) { - register JSAMPLE * range_limit = cinfo->sample_range_limit; /* ADD THIS */ - cb = GETJSAMPLE(*inptr1); -Pretty bizarre, especially since the very similar routine h2v2_merged_upsample -doesn't trigger the bug. -Recent reports suggest that this bug does not occur with "bcc32a" (the -Pentium-optimized version of the compiler). - -Another report from a user of Borland C 4.5 was that incorrect code (leading -to a color shift in processed images) was produced if any of the following -optimization switch combinations were used: - -Ot -Og - -Ot -Op - -Ot -Om -So try backing off on optimization if you see such a problem. (Are there -several different releases all numbered "4.5"??) - - -Microsoft Windows, Microsoft Visual C++: - -jconfig.vc should work OK with any Microsoft compiler for a 32-bit memory -model. makefile.vc is intended for command-line use. (If you are using -the Developer Studio environment, you may prefer the DevStudio project -files; see below.) - -IJG JPEG 7 adds extern "C" to jpeglib.h. This avoids the need to put -extern "C" { ... } around #include "jpeglib.h" in your C++ application. -You can also force VC++ to treat the library as C++ code by renaming -all the *.c files to *.cpp (and adjusting the makefile to match). -In this case you also need to define the symbol DONT_USE_EXTERN_C in -the configuration to prevent jpeglib.h from using extern "C". - - -Microsoft Windows, Microsoft Visual C++ 6 Developer Studio: - -We include makefiles that should work as project files in DevStudio 6.0 or -later. There is a library makefile that builds the IJG library as a static -Win32 library, and application makefiles that build the sample applications -as Win32 console applications. (Even if you only want the library, we -recommend building the applications so that you can run the self-test.) - -To use: -1. Open the command prompt, change to the main directory and execute the - command line - NMAKE /f makefile.vc setup-vc6 - This will move jconfig.vc to jconfig.h and makefiles to project files. - (Note that the renaming is critical!) -2. Open the workspace file jpeg.dsw, build the library project. - (If you are using DevStudio more recent than 6.0, you'll probably - get a message saying that the project files are being updated.) -3. Open the workspace file apps.dsw, build the application projects. -4. To perform the self-test, execute the command line - NMAKE /f makefile.vc test-build -5. Move the application .exe files from `app`\Release to an - appropriate location on your path. - - -Microsoft Windows, Microsoft Visual C++ 2010 Developer Studio (v10): - -We include makefiles that should work as project files in Visual Studio -2010 or later. There is a library makefile that builds the IJG library -as a static Win32 library, and application makefiles that build the sample -applications as Win32 console applications. (Even if you only want the -library, we recommend building the applications so that you can run the -self-test.) - -To use: -1. Open the command prompt, change to the main directory and execute the - command line - NMAKE /f makefile.vc setup-v10 - This will move jconfig.vc to jconfig.h and makefiles to project files. - (Note that the renaming is critical!) -2. Open the solution file jpeg.sln, build the library project. - (If you are using Visual Studio more recent than 2010 (v10), you'll - probably get a message saying that the project files are being updated.) -3. Open the solution file apps.sln, build the application projects. -4. To perform the self-test, execute the command line - NMAKE /f makefile.vc test-build -5. Move the application .exe files from `app`\Release to an - appropriate location on your path. - -Note: -There seems to be an optimization bug in the compiler which causes the -self-test to fail with the color quantization option. -We have disabled optimization for the file jquant2.c in the library -project file which causes the self-test to pass properly. - - -OS/2, Borland C++: - -Watch out for optimization bugs in older Borland compilers; you may need -to back off the optimization switch settings. See the comments in -makefile.bcc. - - -SGI: - -On some SGI systems, you may need to set "AR2= ar -ts" in the Makefile. -If you are using configure, you can do this by saying - ./configure RANLIB='ar -ts' -This change is not needed on all SGIs. Use it only if the make fails at the -stage of linking the completed programs. - -On the MIPS R4000 architecture (Indy, etc.), the compiler option "-mips2" -reportedly speeds up the float DCT method substantially, enough to make it -faster than the default int method (but still slower than the fast int -method). If you use -mips2, you may want to alter the default DCT method to -be float. To do this, put "#define JDCT_DEFAULT JDCT_FLOAT" in jconfig.h. - - -VMS: - -On an Alpha/VMS system with MMS, be sure to use the "/Marco=Alpha=1" -qualifier with MMS when building the JPEG package. - -VAX/VMS v5.5-1 may have problems with the test step of the build procedure -reporting differences when it compares the original and test images. If the -error points to the last block of the files, it is most likely bogus and may -be safely ignored. It seems to be because the files are Stream_LF and -Backup/Compare has difficulty with the (presumably) null padded files. -This problem was not observed on VAX/VMS v6.1 or AXP/VMS v6.1. diff --git a/java/CMakeLists.txt b/java/CMakeLists.txt index 87f8ec6..19127e3 100644 --- a/java/CMakeLists.txt +++ b/java/CMakeLists.txt @@ -9,10 +9,11 @@ set(JAVA_CLASSNAMES org/libjpegturbo/turbojpeg/TJ org/libjpegturbo/turbojpeg/TJTransform org/libjpegturbo/turbojpeg/TJTransformer TJUnitTest - TJExample) + TJExample + TJBench) if(MSVC_IDE) - set(OBJDIR "${CMAKE_CURRENT_BINARY_DIR}/$(OutDir)") + set(OBJDIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") else() set(OBJDIR ${CMAKE_CURRENT_BINARY_DIR}) endif() diff --git a/java/Makefile.am b/java/Makefile.am index 4a1b34e..1307d69 100644 --- a/java/Makefile.am +++ b/java/Makefile.am @@ -1,15 +1,21 @@ JAVAROOT = . +org/libjpegturbo/turbojpeg/TJLoader.java: $(srcdir)/org/libjpegturbo/turbojpeg/TJLoader.java.tmpl + mkdir -p org/libjpegturbo/turbojpeg; \ + cat $(srcdir)/org/libjpegturbo/turbojpeg/TJLoader.java.tmpl | \ + sed s@%{__libdir}@$(libdir)@g > org/libjpegturbo/turbojpeg/TJLoader.java + + JAVASOURCES = org/libjpegturbo/turbojpeg/TJ.java \ org/libjpegturbo/turbojpeg/TJCompressor.java \ org/libjpegturbo/turbojpeg/TJCustomFilter.java \ org/libjpegturbo/turbojpeg/TJDecompressor.java \ - org/libjpegturbo/turbojpeg/TJLoader.java \ org/libjpegturbo/turbojpeg/TJScalingFactor.java \ org/libjpegturbo/turbojpeg/TJTransform.java \ org/libjpegturbo/turbojpeg/TJTransformer.java \ TJExample.java \ - TJUnitTest.java + TJUnitTest.java \ + TJBench.java JNIHEADERS = org_libjpegturbo_turbojpeg_TJ.h \ org_libjpegturbo_turbojpeg_TJCompressor.h \ @@ -18,7 +24,7 @@ JNIHEADERS = org_libjpegturbo_turbojpeg_TJ.h \ if WITH_JAVA -dist_noinst_JAVA = ${JAVASOURCES} +nodist_noinst_JAVA = ${JAVASOURCES} org/libjpegturbo/turbojpeg/TJLoader.java JAVA_CLASSES = org/libjpegturbo/turbojpeg/TJ.class \ org/libjpegturbo/turbojpeg/TJCompressor.class \ @@ -29,7 +35,8 @@ JAVA_CLASSES = org/libjpegturbo/turbojpeg/TJ.class \ org/libjpegturbo/turbojpeg/TJTransform.class \ org/libjpegturbo/turbojpeg/TJTransformer.class \ TJExample.class \ - TJUnitTest.class + TJUnitTest.class \ + TJBench.class all: all-am turbojpeg.jar @@ -40,12 +47,12 @@ clean-local: rm -f turbojpeg.jar install-exec-local: turbojpeg.jar - mkdir -p $(DESTDIR)/$(prefix)/classes - $(INSTALL) -m 644 turbojpeg.jar $(DESTDIR)/$(prefix)/classes/ + mkdir -p $(DESTDIR)/$(datadir)/classes + $(INSTALL) -m 644 turbojpeg.jar $(DESTDIR)/$(datadir)/classes/ uninstall-local: - rm -f $(DESTDIR)/$(prefix)/classes/turbojpeg.jar - if [ -d $(DESTDIR)/$(prefix)/classes ]; then rmdir $(DESTDIR)/$(prefix)/classes; fi + rm -f $(DESTDIR)/$(datadir)/classes/turbojpeg.jar + if [ -d $(DESTDIR)/$(datadir)/classes ]; then rmdir $(DESTDIR)/$(datadir)/classes; fi headers: all javah -d ${srcdir} org.libjpegturbo.turbojpeg.TJ; \ @@ -55,9 +62,10 @@ headers: all docs: all mkdir -p ${srcdir}/doc; \ - javadoc -d ${srcdir}/doc -sourcepath ${srcdir} org.libjpegturbo.turbojpeg + javadoc -notimestamp -d ${srcdir}/doc -sourcepath ${srcdir} org.libjpegturbo.turbojpeg endif EXTRA_DIST = MANIFEST.MF ${JAVASOURCES} ${JNIHEADERS} doc CMakeLists.txt \ + org/libjpegturbo/turbojpeg/TJLoader.java.tmpl \ org/libjpegturbo/turbojpeg/TJLoader.java.in diff --git a/java/Makefile.in b/java/Makefile.in index 89826ad..2a032da 100644 --- a/java/Makefile.in +++ b/java/Makefile.in @@ -36,8 +36,7 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = java -DIST_COMMON = README $(am__dist_noinst_JAVA_DIST) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac @@ -48,15 +47,6 @@ CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/jconfig.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = -am__dist_noinst_JAVA_DIST = org/libjpegturbo/turbojpeg/TJ.java \ - org/libjpegturbo/turbojpeg/TJCompressor.java \ - org/libjpegturbo/turbojpeg/TJCustomFilter.java \ - org/libjpegturbo/turbojpeg/TJDecompressor.java \ - org/libjpegturbo/turbojpeg/TJLoader.java \ - org/libjpegturbo/turbojpeg/TJScalingFactor.java \ - org/libjpegturbo/turbojpeg/TJTransform.java \ - org/libjpegturbo/turbojpeg/TJTransformer.java TJExample.java \ - TJUnitTest.java CLASSPATH_ENV = CLASSPATH=$(JAVAROOT):$(srcdir)/$(JAVAROOT):$$CLASSPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ @@ -109,9 +99,11 @@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ +LIBTOOL_CURRENT = @LIBTOOL_CURRENT@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ +MEM_SRCDST_FUNCTIONS = @MEM_SRCDST_FUNCTIONS@ NAFLAGS = @NAFLAGS@ NASM = @NASM@ OBJEXT = @OBJEXT@ @@ -122,6 +114,7 @@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGNAME = @PKGNAME@ RANLIB = @RANLIB@ RPMARCH = @RPMARCH@ RPM_CONFIG_ARGS = @RPM_CONFIG_ARGS@ @@ -133,6 +126,7 @@ SIMD_I386_FALSE = @SIMD_I386_FALSE@ SIMD_I386_TRUE = @SIMD_I386_TRUE@ SIMD_X86_64_FALSE = @SIMD_X86_64_FALSE@ SIMD_X86_64_TRUE = @SIMD_X86_64_TRUE@ +SO_AGE = @SO_AGE@ SO_MAJOR_VERSION = @SO_MAJOR_VERSION@ SO_MINOR_VERSION = @SO_MINOR_VERSION@ STRIP = @STRIP@ @@ -153,6 +147,8 @@ WITH_SIMD_FALSE = @WITH_SIMD_FALSE@ WITH_SIMD_TRUE = @WITH_SIMD_TRUE@ WITH_SSE_FLOAT_DCT_FALSE = @WITH_SSE_FLOAT_DCT_FALSE@ WITH_SSE_FLOAT_DCT_TRUE = @WITH_SSE_FLOAT_DCT_TRUE@ +WITH_TURBOJPEG_FALSE = @WITH_TURBOJPEG_FALSE@ +WITH_TURBOJPEG_TRUE = @WITH_TURBOJPEG_TRUE@ X86_64_FALSE = @X86_64_FALSE@ X86_64_TRUE = @X86_64_TRUE@ ac_ct_AR = @ac_ct_AR@ @@ -203,19 +199,19 @@ JAVASOURCES = org/libjpegturbo/turbojpeg/TJ.java \ org/libjpegturbo/turbojpeg/TJCompressor.java \ org/libjpegturbo/turbojpeg/TJCustomFilter.java \ org/libjpegturbo/turbojpeg/TJDecompressor.java \ - org/libjpegturbo/turbojpeg/TJLoader.java \ org/libjpegturbo/turbojpeg/TJScalingFactor.java \ org/libjpegturbo/turbojpeg/TJTransform.java \ org/libjpegturbo/turbojpeg/TJTransformer.java \ TJExample.java \ - TJUnitTest.java + TJUnitTest.java \ + TJBench.java JNIHEADERS = org_libjpegturbo_turbojpeg_TJ.h \ org_libjpegturbo_turbojpeg_TJCompressor.h \ org_libjpegturbo_turbojpeg_TJDecompressor.h \ org_libjpegturbo_turbojpeg_TJTransformer.h -@WITH_JAVA_TRUE@dist_noinst_JAVA = ${JAVASOURCES} +@WITH_JAVA_TRUE@nodist_noinst_JAVA = ${JAVASOURCES} org/libjpegturbo/turbojpeg/TJLoader.java @WITH_JAVA_TRUE@JAVA_CLASSES = org/libjpegturbo/turbojpeg/TJ.class \ @WITH_JAVA_TRUE@ org/libjpegturbo/turbojpeg/TJCompressor.class \ @WITH_JAVA_TRUE@ org/libjpegturbo/turbojpeg/TJCustomFilter.class \ @@ -225,9 +221,11 @@ JNIHEADERS = org_libjpegturbo_turbojpeg_TJ.h \ @WITH_JAVA_TRUE@ org/libjpegturbo/turbojpeg/TJTransform.class \ @WITH_JAVA_TRUE@ org/libjpegturbo/turbojpeg/TJTransformer.class \ @WITH_JAVA_TRUE@ TJExample.class \ -@WITH_JAVA_TRUE@ TJUnitTest.class +@WITH_JAVA_TRUE@ TJUnitTest.class \ +@WITH_JAVA_TRUE@ TJBench.class EXTRA_DIST = MANIFEST.MF ${JAVASOURCES} ${JNIHEADERS} doc CMakeLists.txt \ + org/libjpegturbo/turbojpeg/TJLoader.java.tmpl \ org/libjpegturbo/turbojpeg/TJLoader.java.in all: all-am @@ -273,16 +271,16 @@ distclean-libtool: -rm -f libtool uninstall-info-am: -classdist_noinst.stamp: $(dist_noinst_JAVA) +classnodist_noinst.stamp: $(nodist_noinst_JAVA) @if test -n "$?"; then \ echo '$(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) $(AM_JAVACFLAGS) $(JAVACFLAGS) $?' ; \ $(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) \ $(AM_JAVACFLAGS) $(JAVACFLAGS) $?; \ else :; fi - echo timestamp > classdist_noinst.stamp + echo timestamp > classnodist_noinst.stamp -clean-dist_noinstJAVA: - -rm -f *.class classdist_noinst.stamp +clean-nodist_noinstJAVA: + -rm -f *.class classnodist_noinst.stamp tags: TAGS TAGS: @@ -320,7 +318,7 @@ distdir: $(DISTFILES) done check-am: all-am check: check-am -all-am: Makefile classdist_noinst.stamp +all-am: Makefile classnodist_noinst.stamp installdirs: install: install-am install-exec: install-exec-am @@ -351,8 +349,8 @@ maintainer-clean-generic: @WITH_JAVA_FALSE@clean-local: clean: clean-am -clean-am: clean-dist_noinstJAVA clean-generic clean-libtool \ - clean-local mostlyclean-am +clean-am: clean-generic clean-libtool clean-local \ + clean-nodist_noinstJAVA mostlyclean-am distclean: distclean-am -rm -f Makefile @@ -396,8 +394,8 @@ ps-am: uninstall-am: uninstall-info-am uninstall-local -.PHONY: all all-am check check-am clean clean-dist_noinstJAVA \ - clean-generic clean-libtool clean-local distclean \ +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + clean-local clean-nodist_noinstJAVA distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am \ @@ -408,6 +406,11 @@ uninstall-am: uninstall-info-am uninstall-local uninstall uninstall-am uninstall-info-am uninstall-local +org/libjpegturbo/turbojpeg/TJLoader.java: $(srcdir)/org/libjpegturbo/turbojpeg/TJLoader.java.tmpl + mkdir -p org/libjpegturbo/turbojpeg; \ + cat $(srcdir)/org/libjpegturbo/turbojpeg/TJLoader.java.tmpl | \ + sed s@%{__libdir}@$(libdir)@g > org/libjpegturbo/turbojpeg/TJLoader.java + @WITH_JAVA_TRUE@all: all-am turbojpeg.jar @WITH_JAVA_TRUE@turbojpeg.jar: $(JAVA_CLASSES) ${srcdir}/MANIFEST.MF @@ -417,12 +420,12 @@ uninstall-am: uninstall-info-am uninstall-local @WITH_JAVA_TRUE@ rm -f turbojpeg.jar @WITH_JAVA_TRUE@install-exec-local: turbojpeg.jar -@WITH_JAVA_TRUE@ mkdir -p $(DESTDIR)/$(prefix)/classes -@WITH_JAVA_TRUE@ $(INSTALL) -m 644 turbojpeg.jar $(DESTDIR)/$(prefix)/classes/ +@WITH_JAVA_TRUE@ mkdir -p $(DESTDIR)/$(datadir)/classes +@WITH_JAVA_TRUE@ $(INSTALL) -m 644 turbojpeg.jar $(DESTDIR)/$(datadir)/classes/ @WITH_JAVA_TRUE@uninstall-local: -@WITH_JAVA_TRUE@ rm -f $(DESTDIR)/$(prefix)/classes/turbojpeg.jar -@WITH_JAVA_TRUE@ if [ -d $(DESTDIR)/$(prefix)/classes ]; then rmdir $(DESTDIR)/$(prefix)/classes; fi +@WITH_JAVA_TRUE@ rm -f $(DESTDIR)/$(datadir)/classes/turbojpeg.jar +@WITH_JAVA_TRUE@ if [ -d $(DESTDIR)/$(datadir)/classes ]; then rmdir $(DESTDIR)/$(datadir)/classes; fi @WITH_JAVA_TRUE@headers: all @WITH_JAVA_TRUE@ javah -d ${srcdir} org.libjpegturbo.turbojpeg.TJ; \ @@ -432,7 +435,7 @@ uninstall-am: uninstall-info-am uninstall-local @WITH_JAVA_TRUE@docs: all @WITH_JAVA_TRUE@ mkdir -p ${srcdir}/doc; \ -@WITH_JAVA_TRUE@ javadoc -d ${srcdir}/doc -sourcepath ${srcdir} org.libjpegturbo.turbojpeg +@WITH_JAVA_TRUE@ javadoc -notimestamp -d ${srcdir}/doc -sourcepath ${srcdir} org.libjpegturbo.turbojpeg # 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: diff --git a/java/README b/java/README index 22e0f73..88ddc3b 100644 --- a/java/README +++ b/java/README @@ -1,25 +1,25 @@ -TurboJPEG/OSS Java Wrapper -========================== - -TurboJPEG/OSS can optionally be built with a Java Native Interface wrapper, -which allows the TurboJPEG/OSS dynamic library to be loaded and used directly -from Java applications. The Java front end for this is defined in several -classes located under org/libjpegturbo/turbojpeg. The source code for these -Java classes is licensed under a BSD-style license, so the files can be -incorporated directly into both open source and proprietary projects without -restriction. A Java archive (JAR) file containing these classes is also -shipped with the "official" distribution packages of libjpeg-turbo. +TurboJPEG Java Wrapper +====================== + +The TurboJPEG shared library can optionally be built with a Java Native +Interface wrapper, which allows the library to be loaded and used directly from +Java applications. The Java front end for this is defined in several classes +located under org/libjpegturbo/turbojpeg. The source code for these Java +classes is licensed under a BSD-style license, so the files can be incorporated +directly into both open source and proprietary projects without restriction. A +Java archive (JAR) file containing these classes is also shipped with the +"official" distribution packages of libjpeg-turbo. TJExample.java, which should also be located in the same directory as this -README file, demonstrates how to use the TurboJPEG/OSS Java front end to -compress and decompress JPEG images in memory. +README file, demonstrates how to use the TurboJPEG Java API to compress and +decompress JPEG images in memory. Performance Pitfalls -------------------- -The TurboJPEG Java front end defines several convenience methods that can -allocate image buffers or instantiate classes to hold the result of compress, +The TurboJPEG Java API defines several convenience methods that can allocate +image buffers or instantiate classes to hold the result of compress, decompress, or transform operations. However, if you use these methods, then be mindful of the amount of new data you are creating on the heap. It may be necessary to manually invoke the garbage collector to prevent heap exhaustion @@ -27,29 +27,26 @@ or to prevent performance degradation. Background garbage collection can kill performance, particularly in a multi-threaded environment (Java pauses all threads when the GC runs.) -The Java front end always gives you the option of pre-allocating your own -source and destination buffers, which allows you to re-use these buffers for +The TurboJPEG Java API always gives you the option of pre-allocating your own +source and destination buffers, which allows you to re-use those buffers for compressing/decompressing multiple images. If the image sequence you are compressing or decompressing consists of images of the same size, then pre-allocating the buffers is recommended. -Note for OS X users -------------------- - -/usr/lib, the directory under which libturbojpeg.dylib is installed on Mac -systems, is not part of the normal Java library path. Thus, when running a -Java application that uses TurboJPEG/OSS on Mac systems, you will need to pass -an argument of -Djava.library.path=/usr/lib to java. - - -Note for Solaris users +Installation Directory ---------------------- -/opt/libjpeg-turbo/lib, the directory under which libturbojpeg.so is installed -on Solaris systems, is not part of the normal Java library path. Thus, when -running a Java application that uses TurboJPEG/OSS on Solaris systems, you will -need to pass an argument of -Djava.library.path=/opt/libjpeg-turbo/lib to java. -If using a 64-bit data model, then instead pass an argument of --Djava.library.path=/opt/libjpeg-turbo/lib/amd64 to use the 64-bit version of -libturbojpeg.so. +The TurboJPEG Java Wrapper will look for the TurboJPEG JNI library +(libturbojpeg.so, libturbojpeg.jnilib, or turbojpeg.dll) in the system library +paths or in any paths specified in LD_LIBRARY_PATH (Un*x), DYLD_LIBRARY_PATH +(Mac), or PATH (Windows.) Failing this, on Un*x and Mac systems, the wrapper +will look for the JNI library under the library directory configured when +libjpeg-turbo was built. If that library directory is +/opt/libjpeg-turbo/lib32, then /opt/libjpeg-turbo/lib64 is also searched, and +vice versa. + +If you installed the JNI library into another directory, then you will need +to pass an argument of -Djava.library.path={path_to_JNI_library} to java, or +manipulate LD_LIBRARY_PATH, DYLD_LIBRARY_PATH, or PATH to include the directory +containing the JNI library. diff --git a/java/TJBench.java b/java/TJBench.java new file mode 100644 index 0000000..e9ed226 --- /dev/null +++ b/java/TJBench.java @@ -0,0 +1,874 @@ +/* + * Copyright (C)2009-2014 D. R. Commander. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of the libjpeg-turbo Project nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +import java.io.*; +import java.awt.image.*; +import javax.imageio.*; +import java.util.*; +import org.libjpegturbo.turbojpeg.*; + +class TJBench { + + static final int YUVENCODE = 1; + static final int YUVDECODE = 2; + + static int flags = 0, yuv = 0, quiet = 0, pf = TJ.PF_BGR; + static boolean decompOnly, doTile; + + static final String[] pixFormatStr = { + "RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "GRAY" + }; + + static final String[] subNameLong = { + "4:4:4", "4:2:2", "4:2:0", "GRAY", "4:4:0" + }; + + static final String[] subName = { + "444", "422", "420", "GRAY", "440" + }; + + static TJScalingFactor sf; + static int xformOp = TJTransform.OP_NONE, xformOpt = 0; + static double benchTime = 5.0; + + + static final double getTime() { + return (double)System.nanoTime() / 1.0e9; + } + + + static String sigFig(double val, int figs) { + String format; + int digitsAfterDecimal = figs - (int)Math.ceil(Math.log10(Math.abs(val))); + if (digitsAfterDecimal < 1) + format = new String("%.0f"); + else + format = new String("%." + digitsAfterDecimal + "f"); + return String.format(format, val); + } + + + static byte[] loadImage(String fileName, int[] w, int[] h, int pixelFormat) + throws Exception { + BufferedImage img = ImageIO.read(new File(fileName)); + if (img == null) + throw new Exception("Could not read " + fileName); + w[0] = img.getWidth(); + h[0] = img.getHeight(); + int[] rgb = img.getRGB(0, 0, w[0], h[0], null, 0, w[0]); + int ps = TJ.getPixelSize(pixelFormat); + int rindex = TJ.getRedOffset(pixelFormat); + int gindex = TJ.getGreenOffset(pixelFormat); + int bindex = TJ.getBlueOffset(pixelFormat); + byte[] dstBuf = new byte[w[0] * h[0] * ps]; + int pixels = w[0] * h[0], dstPtr = 0, rgbPtr = 0; + while (pixels-- > 0) { + dstBuf[dstPtr + rindex] = (byte)((rgb[rgbPtr] >> 16) & 0xff); + dstBuf[dstPtr + gindex] = (byte)((rgb[rgbPtr] >> 8) & 0xff); + dstBuf[dstPtr + bindex] = (byte)(rgb[rgbPtr] & 0xff); + dstPtr += ps; + rgbPtr++; + } + return dstBuf; + } + + + static void saveImage(String fileName, byte[] srcBuf, int w, int h, + int pixelFormat) throws Exception { + BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + int pixels = w * h, srcPtr = 0; + int ps = TJ.getPixelSize(pixelFormat); + int rindex = TJ.getRedOffset(pixelFormat); + int gindex = TJ.getGreenOffset(pixelFormat); + int bindex = TJ.getBlueOffset(pixelFormat); + for (int y = 0; y < h; y++) { + for (int x = 0; x < w; x++, srcPtr += ps) { + int pixel = (srcBuf[srcPtr + rindex] & 0xff) << 16 | + (srcBuf[srcPtr + gindex] & 0xff) << 8 | + (srcBuf[srcPtr + bindex] & 0xff); + img.setRGB(x, y, pixel); + } + } + ImageIO.write(img, "bmp", new File(fileName)); + } + + + /* Decompression test */ + static void decompTest(byte[] srcBuf, byte[][] jpegBuf, int[] jpegSize, + byte[] dstBuf, int w, int h, int subsamp, + int jpegQual, String fileName, int tilew, int tileh) + throws Exception { + String qualStr = new String(""), sizeStr, tempStr; + TJDecompressor tjd; + double start, elapsed; + int ps = TJ.getPixelSize(pf), i; + int yuvSize = TJ.bufSizeYUV(w, h, subsamp), bufsize; + int scaledw = (yuv == YUVDECODE) ? w : sf.getScaled(w); + int scaledh = (yuv == YUVDECODE) ? h : sf.getScaled(h); + int pitch = scaledw * ps; + + if (jpegQual > 0) + qualStr = new String("_Q" + jpegQual); + + tjd = new TJDecompressor(); + + int bufSize = (yuv == YUVDECODE ? yuvSize : pitch * scaledh); + if (dstBuf == null) + dstBuf = new byte[bufSize]; + + /* Set the destination buffer to gray so we know whether the decompressor + attempted to write to it */ + Arrays.fill(dstBuf, (byte)127); + + /* Execute once to preload cache */ + tjd.setJPEGImage(jpegBuf[0], jpegSize[0]); + if (yuv == YUVDECODE) + tjd.decompressToYUV(dstBuf, flags); + else + tjd.decompress(dstBuf, 0, 0, scaledw, pitch, scaledh, pf, flags); + + /* Benchmark */ + for (i = 0, start = getTime(); (elapsed = getTime() - start) < benchTime; + i++) { + int tile = 0; + if (yuv == YUVDECODE) + tjd.decompressToYUV(dstBuf, flags); + else { + for (int y = 0; y < h; y += tileh) { + for (int x = 0; x < w; x += tilew, tile++) { + int width = doTile ? Math.min(tilew, w - x) : scaledw; + int height = doTile ? Math.min(tileh, h - y) : scaledh; + tjd.setJPEGImage(jpegBuf[tile], jpegSize[tile]); + tjd.decompress(dstBuf, x, y, width, pitch, height, pf, flags); + } + } + } + } + + tjd = null; + for (i = 0; i < jpegBuf.length; i++) + jpegBuf[i] = null; + jpegBuf = null; jpegSize = null; + System.gc(); + + if (quiet != 0) + System.out.println( + sigFig((double)(w * h) / 1000000. * (double)i / elapsed, 4)); + else { + System.out.format("D--> Frame rate: %f fps\n", + (double)i / elapsed); + System.out.format(" Dest. throughput: %f Megapixels/sec\n", + (double)(w * h) / 1000000. * (double)i / elapsed); + } + + if (yuv == YUVDECODE) { + tempStr = fileName + "_" + subName[subsamp] + qualStr + ".yuv"; + FileOutputStream fos = new FileOutputStream(tempStr); + fos.write(dstBuf, 0, yuvSize); + fos.close(); + } else { + if (sf.getNum() != 1 || sf.getDenom() != 1) + sizeStr = new String(sf.getNum() + "_" + sf.getDenom()); + else if (tilew != w || tileh != h) + sizeStr = new String(tilew + "x" + tileh); + else + sizeStr = new String("full"); + if (decompOnly) + tempStr = new String(fileName + "_" + sizeStr + ".bmp"); + else + tempStr = new String(fileName + "_" + subName[subsamp] + qualStr + + "_" + sizeStr + ".bmp"); + saveImage(tempStr, dstBuf, scaledw, scaledh, pf); + int ndx = tempStr.indexOf('.'); + tempStr = new String(tempStr.substring(0, ndx) + "-err.bmp"); + if (srcBuf != null && sf.getNum() == 1 && sf.getDenom() == 1) { + if (quiet == 0) + System.out.println("Compression error written to " + tempStr + "."); + if (subsamp == TJ.SAMP_GRAY) { + for (int y = 0, index = 0; y < h; y++, index += pitch) { + for (int x = 0, index2 = index; x < w; x++, index2 += ps) { + int rindex = index2 + TJ.getRedOffset(pf); + int gindex = index2 + TJ.getGreenOffset(pf); + int bindex = index2 + TJ.getBlueOffset(pf); + int lum = (int)((double)(srcBuf[rindex] & 0xff) * 0.299 + + (double)(srcBuf[gindex] & 0xff) * 0.587 + + (double)(srcBuf[bindex] & 0xff) * 0.114 + 0.5); + if (lum > 255) lum = 255; + if (lum < 0) lum = 0; + dstBuf[rindex] = (byte)Math.abs((dstBuf[rindex] & 0xff) - lum); + dstBuf[gindex] = (byte)Math.abs((dstBuf[gindex] & 0xff) - lum); + dstBuf[bindex] = (byte)Math.abs((dstBuf[bindex] & 0xff) - lum); + } + } + } else { + for (int y = 0; y < h; y++) + for (int x = 0; x < w * ps; x++) + dstBuf[pitch * y + x] = + (byte)Math.abs((dstBuf[pitch * y + x] & 0xff) - + (srcBuf[pitch * y + x] & 0xff)); + } + saveImage(tempStr, dstBuf, w, h, pf); + } + } + } + + + static void doTestYUV(byte[] srcBuf, int w, int h, int subsamp, + String fileName) throws Exception { + TJCompressor tjc; + byte[] dstBuf; + double start, elapsed; + int ps = TJ.getPixelSize(pf), i; + int yuvSize = 0; + + yuvSize = TJ.bufSizeYUV(w, h, subsamp); + dstBuf = new byte[yuvSize]; + + if (quiet == 0) + System.out.format(">>>>> %s (%s) <--> YUV %s <<<<<\n", + pixFormatStr[pf], + (flags & TJ.FLAG_BOTTOMUP) != 0 ? "Bottom-up" : "Top-down", + subNameLong[subsamp]); + + if (quiet == 1) + System.out.format("%s\t%s\t%s\tN/A\t", pixFormatStr[pf], + (flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD", + subNameLong[subsamp]); + + tjc = new TJCompressor(srcBuf, 0, 0, w, 0, h, pf); + tjc.setSubsamp(subsamp); + + /* Execute once to preload cache */ + tjc.encodeYUV(dstBuf, flags); + + /* Benchmark */ + for (i = 0, start = getTime(); + (elapsed = getTime() - start) < benchTime; i++) + tjc.encodeYUV(dstBuf, flags); + + if (quiet == 1) + System.out.format("%-4d %-4d\t", w, h); + if (quiet != 0) { + System.out.format("%s%c%s%c", + sigFig((double)(w * h) / 1000000. * (double) i / elapsed, 4), + quiet == 2 ? '\n' : '\t', + sigFig((double)(w * h * ps) / (double)yuvSize, 4), + quiet == 2 ? '\n' : '\t'); + } else { + System.out.format("\n%s size: %d x %d\n", "Image", w, h); + System.out.format("C--> Frame rate: %f fps\n", + (double)i / elapsed); + System.out.format(" Output image size: %d bytes\n", yuvSize); + System.out.format(" Compression ratio: %f:1\n", + (double)(w * h * ps) / (double)yuvSize); + System.out.format(" Source throughput: %f Megapixels/sec\n", + (double)(w * h) / 1000000. * (double)i / elapsed); + System.out.format(" Output bit stream: %f Megabits/sec\n", + (double)yuvSize * 8. / 1000000. * (double)i / elapsed); + } + String tempStr = fileName + "_" + subName[subsamp] + ".yuv"; + FileOutputStream fos = new FileOutputStream(tempStr); + fos.write(dstBuf, 0, yuvSize); + fos.close(); + if (quiet == 0) + System.out.println("Reference image written to " + tempStr); + } + + + static void doTest(byte[] srcBuf, int w, int h, int subsamp, int jpegQual, + String fileName) throws Exception { + TJCompressor tjc; + byte[] tmpBuf; + byte[][] jpegBuf; + int[] jpegSize; + double start, elapsed; + int totalJpegSize = 0, tilew, tileh, i; + int ps = TJ.getPixelSize(pf), ntilesw = 1, ntilesh = 1, pitch = w * ps; + + if (yuv == YUVENCODE) { + doTestYUV(srcBuf, w, h, subsamp, fileName); + return; + } + + tmpBuf = new byte[pitch * h]; + + if (quiet == 0) + System.out.format(">>>>> %s (%s) <--> JPEG %s Q%d <<<<<\n", + pixFormatStr[pf], + (flags & TJ.FLAG_BOTTOMUP) != 0 ? "Bottom-up" : "Top-down", + subNameLong[subsamp], jpegQual); + + tjc = new TJCompressor(); + + for (tilew = doTile ? 8 : w, tileh = doTile ? 8 : h; ; + tilew *= 2, tileh *= 2) { + if (tilew > w) + tilew = w; + if (tileh > h) + tileh = h; + ntilesw = (w + tilew - 1) / tilew; + ntilesh = (h + tileh - 1) / tileh; + + jpegBuf = new byte[ntilesw * ntilesh][TJ.bufSize(tilew, tileh, subsamp)]; + jpegSize = new int[ntilesw * ntilesh]; + + /* Compression test */ + if (quiet == 1) + System.out.format("%s\t%s\t%s\t%d\t", pixFormatStr[pf], + (flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD", + subNameLong[subsamp], jpegQual); + for (i = 0; i < h; i++) + System.arraycopy(srcBuf, w * ps * i, tmpBuf, pitch * i, w * ps); + tjc.setSourceImage(srcBuf, 0, 0, tilew, pitch, tileh, pf); + tjc.setJPEGQuality(jpegQual); + tjc.setSubsamp(subsamp); + + /* Execute once to preload cache */ + tjc.compress(jpegBuf[0], flags); + + /* Benchmark */ + for (i = 0, start = getTime(); + (elapsed = getTime() - start) < benchTime; i++) { + int tile = 0; + totalJpegSize = 0; + for (int y = 0; y < h; y += tileh) { + for (int x = 0; x < w; x += tilew, tile++) { + int width = Math.min(tilew, w - x); + int height = Math.min(tileh, h - y); + tjc.setSourceImage(srcBuf, x, y, width, pitch, height, pf); + tjc.compress(jpegBuf[tile], flags); + jpegSize[tile] = tjc.getCompressedSize(); + totalJpegSize += jpegSize[tile]; + } + } + } + + if (quiet == 1) + System.out.format("%-4d %-4d\t", tilew, tileh); + if (quiet != 0) { + System.out.format("%s%c%s%c", + sigFig((double)(w * h) / 1000000. * (double) i / elapsed, 4), + quiet == 2 ? '\n' : '\t', + sigFig((double)(w * h * ps) / (double)totalJpegSize, 4), + quiet == 2 ? '\n' : '\t'); + } else { + System.out.format("\n%s size: %d x %d\n", doTile ? "Tile" : "Image", + tilew, tileh); + System.out.format("C--> Frame rate: %f fps\n", + (double)i / elapsed); + System.out.format(" Output image size: %d bytes\n", + totalJpegSize); + System.out.format(" Compression ratio: %f:1\n", + (double)(w * h * ps) / (double)totalJpegSize); + System.out.format(" Source throughput: %f Megapixels/sec\n", + (double)(w * h) / 1000000. * (double)i / elapsed); + System.out.format(" Output bit stream: %f Megabits/sec\n", + (double)totalJpegSize * 8. / 1000000. * (double)i / elapsed); + } + if (tilew == w && tileh == h) { + String tempStr = fileName + "_" + subName[subsamp] + "_" + "Q" + + jpegQual + ".jpg"; + FileOutputStream fos = new FileOutputStream(tempStr); + fos.write(jpegBuf[0], 0, jpegSize[0]); + fos.close(); + if (quiet == 0) + System.out.println("Reference image written to " + tempStr); + } + + /* Decompression test */ + decompTest(srcBuf, jpegBuf, jpegSize, tmpBuf, w, h, subsamp, jpegQual, + fileName, tilew, tileh); + + if (tilew == w && tileh == h) break; + } + } + + + static void doDecompTest(String fileName) throws Exception { + TJTransformer tjt; + byte[][] jpegBuf; + byte[] srcBuf; + int[] jpegSize; + int totalJpegSize; + int w = 0, h = 0, subsamp = -1, _w, _h, _tilew, _tileh, + _ntilesw, _ntilesh, _subsamp, x, y; + int ntilesw = 1, ntilesh = 1; + double start, elapsed; + int ps = TJ.getPixelSize(pf), tile; + + FileInputStream fis = new FileInputStream(fileName); + int srcSize = (int)fis.getChannel().size(); + srcBuf = new byte[srcSize]; + fis.read(srcBuf, 0, srcSize); + fis.close(); + + int index = fileName.indexOf('.'); + if (index >= 0) + fileName = new String(fileName.substring(0, index)); + + tjt = new TJTransformer(); + + tjt.setJPEGImage(srcBuf, srcSize); + w = tjt.getWidth(); + h = tjt.getHeight(); + subsamp = tjt.getSubsamp(); + + if (quiet == 1) { + System.out.println("All performance values in Mpixels/sec\n"); + System.out.format("Bitmap\tBitmap\tJPEG\t%s %s \tXform\tComp\tDecomp\n", + (doTile ? "Tile " : "Image"), + (doTile ? "Tile " : "Image")); + System.out.println("Format\tOrder\tSubsamp\tWidth Height\tPerf \tRatio\tPerf\n"); + } else if (quiet == 0) { + System.out.format(">>>>> JPEG %s --> %s (%s) <<<<<\n", + subNameLong[subsamp], pixFormatStr[pf], + (flags & TJ.FLAG_BOTTOMUP) != 0 ? "Bottom-up" : "Top-down"); + } + + for (int tilew = doTile ? 16 : w, tileh = doTile ? 16 : h; ; + tilew *= 2, tileh *= 2) { + if (tilew > w) + tilew = w; + if (tileh > h) + tileh = h; + ntilesw = (w + tilew - 1) / tilew; + ntilesh = (h + tileh - 1) / tileh; + + _w = w; _h = h; _tilew = tilew; _tileh = tileh; + if (quiet == 0) { + System.out.format("\n%s size: %d x %d", (doTile ? "Tile" : "Image"), + _tilew, _tileh); + if (sf.getNum() != 1 || sf.getDenom() != 1) + System.out.format(" --> %d x %d", sf.getScaled(_w), + sf.getScaled(_h)); + System.out.println(""); + } else if (quiet == 1) { + System.out.format("%s\t%s\t%s\t", pixFormatStr[pf], + (flags & TJ.FLAG_BOTTOMUP) != 0 ? "BU" : "TD", + subNameLong[subsamp]); + System.out.format("%-4d %-4d\t", tilew, tileh); + } + + _subsamp = subsamp; + if (doTile || xformOp != TJTransform.OP_NONE || xformOpt != 0) { + if (xformOp == TJTransform.OP_TRANSPOSE || + xformOp == TJTransform.OP_TRANSVERSE || + xformOp == TJTransform.OP_ROT90 || + xformOp == TJTransform.OP_ROT270) { + _w = h; _h = w; _tilew = tileh; _tileh = tilew; + } + + if ((xformOpt & TJTransform.OPT_GRAY) != 0) + _subsamp = TJ.SAMP_GRAY; + if (xformOp == TJTransform.OP_HFLIP || + xformOp == TJTransform.OP_ROT180) + _w = _w - (_w % TJ.getMCUWidth(_subsamp)); + if (xformOp == TJTransform.OP_VFLIP || + xformOp == TJTransform.OP_ROT180) + _h = _h - (_h % TJ.getMCUHeight(_subsamp)); + if (xformOp == TJTransform.OP_TRANSVERSE || + xformOp == TJTransform.OP_ROT90) + _w = _w - (_w % TJ.getMCUHeight(_subsamp)); + if (xformOp == TJTransform.OP_TRANSVERSE || + xformOp == TJTransform.OP_ROT270) + _h = _h - (_h % TJ.getMCUWidth(_subsamp)); + _ntilesw = (_w + _tilew - 1) / _tilew; + _ntilesh = (_h + _tileh - 1) / _tileh; + + TJTransform[] t = new TJTransform[_ntilesw * _ntilesh]; + jpegBuf = new byte[_ntilesw * _ntilesh][TJ.bufSize(_tilew, _tileh, subsamp)]; + + for (y = 0, tile = 0; y < _h; y += _tileh) { + for (x = 0; x < _w; x += _tilew, tile++) { + t[tile] = new TJTransform(); + t[tile].width = Math.min(_tilew, _w - x); + t[tile].height = Math.min(_tileh, _h - y); + t[tile].x = x; + t[tile].y = y; + t[tile].op = xformOp; + t[tile].options = xformOpt | TJTransform.OPT_TRIM; + if ((t[tile].options & TJTransform.OPT_NOOUTPUT) != 0 && + jpegBuf[tile] != null) + jpegBuf[tile] = null; + } + } + + start = getTime(); + tjt.transform(jpegBuf, t, flags); + jpegSize = tjt.getTransformedSizes(); + elapsed = getTime() - start; + + t = null; + + for (tile = 0, totalJpegSize = 0; tile < _ntilesw * _ntilesh; tile++) + totalJpegSize += jpegSize[tile]; + + if (quiet != 0) { + System.out.format("%s%c%s%c", + sigFig((double)(w * h) / 1000000. / elapsed, 4), + quiet == 2 ? '\n' : '\t', + sigFig((double)(w * h * ps) / (double)totalJpegSize, 4), + quiet == 2 ? '\n' : '\t'); + } else if (quiet == 0) { + System.out.format("X--> Frame rate: %f fps\n", + 1.0 / elapsed); + System.out.format(" Output image size: %d bytes\n", + totalJpegSize); + System.out.format(" Compression ratio: %f:1\n", + (double)(w * h * ps) / (double)totalJpegSize); + System.out.format(" Source throughput: %f Megapixels/sec\n", + (double)(w * h) / 1000000. / elapsed); + System.out.format(" Output bit stream: %f Megabits/sec\n", + (double)totalJpegSize * 8. / 1000000. / elapsed); + } + } else { + if (quiet == 1) + System.out.print("N/A\tN/A\t"); + jpegBuf = new byte[1][TJ.bufSize(_tilew, _tileh, subsamp)]; + jpegSize = new int[1]; + jpegSize[0] = srcSize; + System.arraycopy(srcBuf, 0, jpegBuf[0], 0, srcSize); + } + + if (w == tilew) + _tilew = _w; + if (h == tileh) + _tileh = _h; + if ((xformOpt & TJTransform.OPT_NOOUTPUT) == 0) + decompTest(null, jpegBuf, jpegSize, null, _w, _h, _subsamp, 0, + fileName, _tilew, _tileh); + else if (quiet == 1) + System.out.println("N/A"); + + jpegBuf = null; + jpegSize = null; + + if (tilew == w && tileh == h) break; + } + } + + + static void usage() throws Exception { + int i; + TJScalingFactor[] scalingFactors = TJ.getScalingFactors(); + int nsf = scalingFactors.length; + String className = new TJBench().getClass().getName(); + + System.out.println("\nUSAGE: java " + className); + System.out.println(" [options]\n"); + System.out.println(" java " + className); + System.out.println(" [options]\n"); + System.out.println("Options:\n"); + System.out.println("-alloc = Dynamically allocate JPEG image buffers"); + System.out.println("-bottomup = Test bottom-up compression/decompression"); + System.out.println("-tile = Test performance of the codec when the image is encoded as separate"); + System.out.println(" tiles of varying sizes."); + System.out.println("-forcemmx, -forcesse, -forcesse2, -forcesse3 ="); + System.out.println(" Force MMX, SSE, SSE2, or SSE3 code paths in the underlying codec"); + System.out.println("-rgb, -bgr, -rgbx, -bgrx, -xbgr, -xrgb ="); + System.out.println(" Test the specified color conversion path in the codec (default: BGR)"); + System.out.println("-fastupsample = Use the fastest chrominance upsampling algorithm available in"); + System.out.println(" the underlying codec"); + System.out.println("-fastdct = Use the fastest DCT/IDCT algorithms available in the underlying"); + System.out.println(" codec"); + System.out.println("-accuratedct = Use the most accurate DCT/IDCT algorithms available in the"); + System.out.println(" underlying codec"); + System.out.println("-subsamp = When testing JPEG compression, this option specifies the level"); + System.out.println(" of chrominance subsampling to use ( = 444, 422, 440, 420, or GRAY)."); + System.out.println(" The default is to test Grayscale, 4:2:0, 4:2:2, and 4:4:4 in sequence."); + System.out.println("-quiet = Output results in tabular rather than verbose format"); + System.out.println("-yuvencode = Encode RGB input as planar YUV rather than compressing as JPEG"); + System.out.println("-yuvdecode = Decode JPEG image to planar YUV rather than RGB"); + System.out.println("-scale M/N = scale down the width/height of the decompressed JPEG image by a"); + System.out.print (" factor of M/N (M/N = "); + for (i = 0; i < nsf; i++) { + System.out.format("%d/%d", scalingFactors[i].getNum(), + scalingFactors[i].getDenom()); + if (nsf == 2 && i != nsf - 1) + System.out.print(" or "); + else if (nsf > 2) { + if (i != nsf - 1) + System.out.print(", "); + if (i == nsf - 2) + System.out.print("or "); + } + if (i % 8 == 0 && i != 0) + System.out.print("\n "); + } + System.out.println(")"); + System.out.println("-hflip, -vflip, -transpose, -transverse, -rot90, -rot180, -rot270 ="); + System.out.println(" Perform the corresponding lossless transform prior to"); + System.out.println(" decompression (these options are mutually exclusive)"); + System.out.println("-grayscale = Perform lossless grayscale conversion prior to decompression"); + System.out.println(" test (can be combined with the other transforms above)"); + System.out.println("-benchtime = Run each benchmark for at least seconds (default = 5.0)\n"); + System.out.println("NOTE: If the quality is specified as a range (e.g. 90-100), a separate"); + System.out.println("test will be performed for all quality values in the range.\n"); + System.exit(1); + } + + + public static void main(String[] argv) { + byte[] srcBuf = null; int w = 0, h = 0; + int minQual = -1, maxQual = -1; + int minArg = 1; int retval = 0; + int subsamp = -1; + + try { + + if (argv.length < minArg) + usage(); + + String tempStr = argv[0].toLowerCase(); + if (tempStr.endsWith(".jpg") || tempStr.endsWith(".jpeg")) + decompOnly = true; + + System.out.println(""); + + if (argv.length > minArg) { + for (int i = minArg; i < argv.length; i++) { + if (argv[i].equalsIgnoreCase("-yuvencode")) { + System.out.println("Testing YUV planar encoding\n"); + yuv = YUVENCODE; maxQual = minQual = 100; + } + if (argv[i].equalsIgnoreCase("-yuvdecode")) { + System.out.println("Testing YUV planar decoding\n"); + yuv = YUVDECODE; + } + } + } + + if (!decompOnly && yuv != YUVENCODE) { + minArg = 2; + if (argv.length < minArg) + usage(); + try { + minQual = Integer.parseInt(argv[1]); + } catch (NumberFormatException e) {} + if (minQual < 1 || minQual > 100) + throw new Exception("Quality must be between 1 and 100."); + int dashIndex = argv[1].indexOf('-'); + if (dashIndex > 0 && argv[1].length() > dashIndex + 1) { + try { + maxQual = Integer.parseInt(argv[1].substring(dashIndex + 1)); + } catch (NumberFormatException e) {} + } + if (maxQual < 1 || maxQual > 100) + maxQual = minQual; + } + + if (argv.length > minArg) { + for (int i = minArg; i < argv.length; i++) { + if (argv[i].equalsIgnoreCase("-tile")) { + doTile = true; xformOpt |= TJTransform.OPT_CROP; + } + if (argv[i].equalsIgnoreCase("-forcesse3")) { + System.out.println("Forcing SSE3 code\n"); + flags |= TJ.FLAG_FORCESSE3; + } + if (argv[i].equalsIgnoreCase("-forcesse2")) { + System.out.println("Forcing SSE2 code\n"); + flags |= TJ.FLAG_FORCESSE2; + } + if (argv[i].equalsIgnoreCase("-forcesse")) { + System.out.println("Forcing SSE code\n"); + flags |= TJ.FLAG_FORCESSE; + } + if (argv[i].equalsIgnoreCase("-forcemmx")) { + System.out.println("Forcing MMX code\n"); + flags |= TJ.FLAG_FORCEMMX; + } + if (argv[i].equalsIgnoreCase("-fastupsample")) { + System.out.println("Using fast upsampling code\n"); + flags |= TJ.FLAG_FASTUPSAMPLE; + } + if (argv[i].equalsIgnoreCase("-fastdct")) { + System.out.println("Using fastest DCT/IDCT algorithm\n"); + flags |= TJ.FLAG_FASTDCT; + } + if (argv[i].equalsIgnoreCase("-accuratedct")) { + System.out.println("Using most accurate DCT/IDCT algorithm\n"); + flags |= TJ.FLAG_ACCURATEDCT; + } + if (argv[i].equalsIgnoreCase("-rgb")) + pf = TJ.PF_RGB; + if (argv[i].equalsIgnoreCase("-rgbx")) + pf = TJ.PF_RGBX; + if (argv[i].equalsIgnoreCase("-bgr")) + pf = TJ.PF_BGR; + if (argv[i].equalsIgnoreCase("-bgrx")) + pf = TJ.PF_BGRX; + if (argv[i].equalsIgnoreCase("-xbgr")) + pf = TJ.PF_XBGR; + if (argv[i].equalsIgnoreCase("-xrgb")) + pf = TJ.PF_XRGB; + if (argv[i].equalsIgnoreCase("-bottomup")) + flags |= TJ.FLAG_BOTTOMUP; + if (argv[i].equalsIgnoreCase("-quiet")) + quiet = 1; + if (argv[i].equalsIgnoreCase("-qq")) + quiet = 2; + if (argv[i].equalsIgnoreCase("-scale") && i < argv.length - 1) { + int temp1 = 0, temp2 = 0; + boolean match = false, scanned = true; + Scanner scanner = new Scanner(argv[++i]).useDelimiter("/"); + try { + temp1 = scanner.nextInt(); + temp2 = scanner.nextInt(); + } catch(Exception e) {} + if (temp2 <= 0) temp2 = 1; + if (temp1 > 0) { + TJScalingFactor[] scalingFactors = TJ.getScalingFactors(); + for (int j = 0; j < scalingFactors.length; j++) { + if ((double)temp1 / (double)temp2 == + (double)scalingFactors[j].getNum() / + (double)scalingFactors[j].getDenom()) { + sf = scalingFactors[j]; + match = true; break; + } + } + if (!match) usage(); + } else + usage(); + } + if (argv[i].equalsIgnoreCase("-hflip")) + xformOp = TJTransform.OP_HFLIP; + if (argv[i].equalsIgnoreCase("-vflip")) + xformOp = TJTransform.OP_VFLIP; + if (argv[i].equalsIgnoreCase("-transpose")) + xformOp = TJTransform.OP_TRANSPOSE; + if (argv[i].equalsIgnoreCase("-transverse")) + xformOp = TJTransform.OP_TRANSVERSE; + if (argv[i].equalsIgnoreCase("-rot90")) + xformOp = TJTransform.OP_ROT90; + if (argv[i].equalsIgnoreCase("-rot180")) + xformOp = TJTransform.OP_ROT180; + if (argv[i].equalsIgnoreCase("-rot270")) + xformOp = TJTransform.OP_ROT270; + if (argv[i].equalsIgnoreCase("-grayscale")) + xformOpt |= TJTransform.OPT_GRAY; + if (argv[i].equalsIgnoreCase("-nooutput")) + xformOpt |= TJTransform.OPT_NOOUTPUT; + if (argv[i].equalsIgnoreCase("-benchtime") && i < argv.length - 1) { + double temp = -1; + try { + temp = Double.parseDouble(argv[++i]); + } catch (NumberFormatException e) {} + if (temp > 0.0) + benchTime = temp; + else + usage(); + } + if (argv[i].equalsIgnoreCase("-subsamp") && i < argv.length - 1) { + i++; + if (argv[i].toUpperCase().startsWith("G")) + subsamp = TJ.SAMP_GRAY; + else if (argv[i].equals("444")) + subsamp = TJ.SAMP_444; + else if (argv[i].equals("422")) + subsamp = TJ.SAMP_422; + else if (argv[i].equals("440")) + subsamp = TJ.SAMP_440; + else if (argv[i].equals("420")) + subsamp = TJ.SAMP_420; + } + if (argv[i].equalsIgnoreCase("-?")) + usage(); + } + } + + if (sf == null) + sf = new TJScalingFactor(1, 1); + + if ((sf.getNum() != 1 || sf.getDenom() != 1) && doTile) { + System.out.println("Disabling tiled compression/decompression tests, because those tests do not"); + System.out.println("work when scaled decompression is enabled."); + doTile = false; + } + + if (yuv != 0 && doTile) { + System.out.println("Disabling tiled compression/decompression tests, because those tests do not"); + System.out.println("work when YUV encoding or decoding is enabled.\n"); + doTile = false; + } + + if (!decompOnly) { + int[] width = new int[1], height = new int[1]; + srcBuf = loadImage(argv[0], width, height, pf); + w = width[0]; h = height[0]; + int index = -1; + if ((index = argv[0].indexOf('.')) >= 0) + argv[0] = argv[0].substring(0, index); + } + + if (quiet == 1 && !decompOnly) { + System.out.println("All performance values in Mpixels/sec\n"); + System.out.format("Bitmap\tBitmap\tJPEG\tJPEG\t%s %s \tComp\tComp\tDecomp\n", + (doTile ? "Tile " : "Image"), (doTile ? "Tile " : "Image")); + System.out.println("Format\tOrder\tSubsamp\tQual\tWidth Height\tPerf \tRatio\tPerf\n"); + } + + if (decompOnly) { + doDecompTest(argv[0]); + System.out.println(""); + System.exit(retval); + } + + System.gc(); + if (subsamp >= 0 && subsamp < TJ.NUMSAMP) { + for (int i = maxQual; i >= minQual; i--) + doTest(srcBuf, w, h, subsamp, i, argv[0]); + System.out.println(""); + } else { + for (int i = maxQual; i >= minQual; i--) + doTest(srcBuf, w, h, TJ.SAMP_GRAY, i, argv[0]); + System.out.println(""); + System.gc(); + for (int i = maxQual; i >= minQual; i--) + doTest(srcBuf, w, h, TJ.SAMP_420, i, argv[0]); + System.out.println(""); + System.gc(); + for (int i = maxQual; i >= minQual; i--) + doTest(srcBuf, w, h, TJ.SAMP_422, i, argv[0]); + System.out.println(""); + System.gc(); + for (int i = maxQual; i >= minQual; i--) + doTest(srcBuf, w, h, TJ.SAMP_444, i, argv[0]); + System.out.println(""); + } + + } catch (Exception e) { + System.out.println("ERROR: " + e.getMessage()); + e.printStackTrace(); + retval = -1; + } + + System.exit(retval); + } + +} diff --git a/java/TJExample.java b/java/TJExample.java index e726892..1ae350a 100644 --- a/java/TJExample.java +++ b/java/TJExample.java @@ -1,5 +1,5 @@ /* - * Copyright (C)2011-2012 D. R. Commander. All Rights Reserved. + * Copyright (C)2011-2012, 2014 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -51,12 +51,15 @@ public class TJExample implements TJCustomFilter { System.out.println("Options:\n"); System.out.println("-scale M/N = if the input image is a JPEG file, scale the width/height of the"); System.out.print(" output image by a factor of M/N (M/N = "); - for(int i = 0; i < sf.length; i++) { + for (int i = 0; i < sf.length; i++) { System.out.print(sf[i].getNum() + "/" + sf[i].getDenom()); - if(sf.length == 2 && i != sf.length - 1) System.out.print(" or "); - else if(sf.length > 2) { - if(i != sf.length - 1) System.out.print(", "); - if(i == sf.length - 2) System.out.print("or "); + if (sf.length == 2 && i != sf.length - 1) + System.out.print(" or "); + else if (sf.length > 2) { + if (i != sf.length - 1) + System.out.print(", "); + if (i == sf.length - 2) + System.out.print("or "); } } System.out.println(")\n"); @@ -90,13 +93,14 @@ public class TJExample implements TJCustomFilter { System.exit(1); } - private final static String sampName[] = { + private static final String[] sampName = { "4:4:4", "4:2:2", "4:2:0", "Grayscale", "4:4:0" }; - public static void main(String argv[]) { + public static void main(String[] argv) { - BufferedImage img = null; byte[] bmpBuf = null; + BufferedImage img = null; + byte[] bmpBuf = null; TJTransform xform = new TJTransform(); int flags = 0; @@ -104,7 +108,7 @@ public class TJExample implements TJCustomFilter { sf = TJ.getScalingFactors(); - if(argv.length < 2) { + if (argv.length < 2) { usage(); } @@ -113,119 +117,134 @@ public class TJExample implements TJCustomFilter { int outSubsamp = -1, outQual = 95; boolean display = false; - if(argv.length > 1) { - for(int i = 1; i < argv.length; i++) { - if(argv[i].length() < 2) continue; - if(argv[i].length() > 2 - && argv[i].substring(0, 3).equalsIgnoreCase("-sc")) { + if (argv.length > 1) { + for (int i = 1; i < argv.length; i++) { + if (argv[i].length() < 2) + continue; + if (argv[i].length() > 2 && + argv[i].substring(0, 3).equalsIgnoreCase("-sc")) { int match = 0; - if(i < argv.length - 1) { + if (i < argv.length - 1) { String[] scaleArg = argv[++i].split("/"); - if(scaleArg.length == 2) { + if (scaleArg.length == 2) { TJScalingFactor tempsf = new TJScalingFactor(Integer.parseInt(scaleArg[0]), - Integer.parseInt(scaleArg[1])); - for(int j = 0; j < sf.length; j++) { - if(tempsf.equals(sf[j])) { + Integer.parseInt(scaleArg[1])); + for (int j = 0; j < sf.length; j++) { + if (tempsf.equals(sf[j])) { scaleFactor = sf[j]; - match = 1; break; + match = 1; + break; } } } } - if(match != 1) usage(); + if (match != 1) usage(); } - if(argv[i].equalsIgnoreCase("-h") || argv[i].equalsIgnoreCase("-?")) + if (argv[i].equalsIgnoreCase("-h") || argv[i].equalsIgnoreCase("-?")) usage(); - if(argv[i].length() > 2 - && argv[i].substring(0, 3).equalsIgnoreCase("-sa")) { - if(i < argv.length - 1) { + if (argv[i].length() > 2 && + argv[i].substring(0, 3).equalsIgnoreCase("-sa")) { + if (i < argv.length - 1) { i++; - if(argv[i].substring(0, 1).equalsIgnoreCase("g")) + if (argv[i].substring(0, 1).equalsIgnoreCase("g")) outSubsamp = TJ.SAMP_GRAY; - else if(argv[i].equals("444")) outSubsamp = TJ.SAMP_444; - else if(argv[i].equals("422")) outSubsamp = TJ.SAMP_422; - else if(argv[i].equals("420")) outSubsamp = TJ.SAMP_420; - else usage(); - } - else usage(); + else if (argv[i].equals("444")) + outSubsamp = TJ.SAMP_444; + else if (argv[i].equals("422")) + outSubsamp = TJ.SAMP_422; + else if (argv[i].equals("420")) + outSubsamp = TJ.SAMP_420; + else + usage(); + } else + usage(); } - if(argv[i].substring(0, 2).equalsIgnoreCase("-q")) { - if(i < argv.length - 1) { + if (argv[i].substring(0, 2).equalsIgnoreCase("-q")) { + if (i < argv.length - 1) { int qual = Integer.parseInt(argv[++i]); - if(qual >= 1 && qual <= 100) outQual = qual; - else usage(); - } - else usage(); + if (qual >= 1 && qual <= 100) + outQual = qual; + else + usage(); + } else + usage(); } - if(argv[i].substring(0, 2).equalsIgnoreCase("-g")) + if (argv[i].substring(0, 2).equalsIgnoreCase("-g")) xform.options |= TJTransform.OPT_GRAY; - if(argv[i].equalsIgnoreCase("-hflip")) + if (argv[i].equalsIgnoreCase("-hflip")) xform.op = TJTransform.OP_HFLIP; - if(argv[i].equalsIgnoreCase("-vflip")) + if (argv[i].equalsIgnoreCase("-vflip")) xform.op = TJTransform.OP_VFLIP; - if(argv[i].equalsIgnoreCase("-transpose")) + if (argv[i].equalsIgnoreCase("-transpose")) xform.op = TJTransform.OP_TRANSPOSE; - if(argv[i].equalsIgnoreCase("-transverse")) + if (argv[i].equalsIgnoreCase("-transverse")) xform.op = TJTransform.OP_TRANSVERSE; - if(argv[i].equalsIgnoreCase("-rot90")) + if (argv[i].equalsIgnoreCase("-rot90")) xform.op = TJTransform.OP_ROT90; - if(argv[i].equalsIgnoreCase("-rot180")) + if (argv[i].equalsIgnoreCase("-rot180")) xform.op = TJTransform.OP_ROT180; - if(argv[i].equalsIgnoreCase("-rot270")) + if (argv[i].equalsIgnoreCase("-rot270")) xform.op = TJTransform.OP_ROT270; - if(argv[i].equalsIgnoreCase("-custom")) + if (argv[i].equalsIgnoreCase("-custom")) xform.cf = new TJExample(); - else if(argv[i].length() > 2 - && argv[i].substring(0, 2).equalsIgnoreCase("-c")) { - if(i >= argv.length - 1) usage(); + else if (argv[i].length() > 2 && + argv[i].substring(0, 2).equalsIgnoreCase("-c")) { + if (i >= argv.length - 1) + usage(); String[] cropArg = argv[++i].split(","); - if(cropArg.length != 3) usage(); + if (cropArg.length != 3) + usage(); String[] dimArg = cropArg[2].split("[xX]"); - if(dimArg.length != 2) usage(); + if (dimArg.length != 2) + usage(); int tempx = Integer.parseInt(cropArg[0]); int tempy = Integer.parseInt(cropArg[1]); int tempw = Integer.parseInt(dimArg[0]); int temph = Integer.parseInt(dimArg[1]); - if(tempx < 0 || tempy < 0 || tempw < 0 || temph < 0) usage(); - xform.x = tempx; xform.y = tempy; - xform.width = tempw; xform.height = temph; + if (tempx < 0 || tempy < 0 || tempw < 0 || temph < 0) + usage(); + xform.x = tempx; + xform.y = tempy; + xform.width = tempw; + xform.height = temph; xform.options |= TJTransform.OPT_CROP; } - if(argv[i].substring(0, 2).equalsIgnoreCase("-d")) + if (argv[i].substring(0, 2).equalsIgnoreCase("-d")) display = true; - if(argv[i].equalsIgnoreCase("-fastupsample")) { + if (argv[i].equalsIgnoreCase("-fastupsample")) { System.out.println("Using fast upsampling code"); flags |= TJ.FLAG_FASTUPSAMPLE; } - if(argv[i].equalsIgnoreCase("-fastdct")) { + if (argv[i].equalsIgnoreCase("-fastdct")) { System.out.println("Using fastest DCT/IDCT algorithm"); flags |= TJ.FLAG_FASTDCT; } - if(argv[i].equalsIgnoreCase("-accuratedct")) { + if (argv[i].equalsIgnoreCase("-accuratedct")) { System.out.println("Using most accurate DCT/IDCT algorithm"); flags |= TJ.FLAG_ACCURATEDCT; } } } String[] inFileTokens = argv[0].split("\\."); - if(inFileTokens.length > 1) + if (inFileTokens.length > 1) inFormat = inFileTokens[inFileTokens.length - 1]; String[] outFileTokens; - if(display) outFormat = "bmp"; + if (display) + outFormat = "bmp"; else { outFileTokens = argv[1].split("\\."); - if(outFileTokens.length > 1) + if (outFileTokens.length > 1) outFormat = outFileTokens[outFileTokens.length - 1]; } File file = new File(argv[0]); int width, height; - if(inFormat.equalsIgnoreCase("jpg")) { + if (inFormat.equalsIgnoreCase("jpg")) { FileInputStream fis = new FileInputStream(file); int inputSize = fis.available(); - if(inputSize < 1) { + if (inputSize < 1) { System.out.println("Input file contains no data"); System.exit(1); } @@ -234,27 +253,28 @@ public class TJExample implements TJCustomFilter { fis.close(); TJDecompressor tjd; - if(xform.op != TJTransform.OP_NONE || xform.options != 0 - || xform.cf != null) { + if (xform.op != TJTransform.OP_NONE || xform.options != 0 || + xform.cf != null) { TJTransformer tjt = new TJTransformer(inputBuf); - TJTransform t[] = new TJTransform[1]; + TJTransform[] t = new TJTransform[1]; t[0] = xform; t[0].options |= TJTransform.OPT_TRIM; TJDecompressor[] tjdx = tjt.transform(t, 0); tjd = tjdx[0]; - } - else tjd = new TJDecompressor(inputBuf); + } else + tjd = new TJDecompressor(inputBuf); width = tjd.getWidth(); height = tjd.getHeight(); int inSubsamp = tjd.getSubsamp(); - System.out.println("Source Image: " + width + " x " + height - + " pixels, " + sampName[inSubsamp] + " subsampling"); - if(outSubsamp < 0) outSubsamp = inSubsamp; + System.out.println("Source Image: " + width + " x " + height + + " pixels, " + sampName[inSubsamp] + " subsampling"); + if (outSubsamp < 0) + outSubsamp = inSubsamp; - if(outFormat.equalsIgnoreCase("jpg") - && (xform.op != TJTransform.OP_NONE || xform.options != 0) - && scaleFactor.isOne()) { + if (outFormat.equalsIgnoreCase("jpg") && + (xform.op != TJTransform.OP_NONE || xform.options != 0) && + scaleFactor.isOne()) { file = new File(argv[1]); FileOutputStream fos = new FileOutputStream(file); fos.write(tjd.getJPEGBuf(), 0, tjd.getJPEGSize()); @@ -265,46 +285,48 @@ public class TJExample implements TJCustomFilter { width = scaleFactor.getScaled(width); height = scaleFactor.getScaled(height); - if(!outFormat.equalsIgnoreCase("jpg")) + if (!outFormat.equalsIgnoreCase("jpg")) img = tjd.decompress(width, height, BufferedImage.TYPE_INT_RGB, flags); - else bmpBuf = tjd.decompress(width, 0, height, TJ.PF_BGRX, flags); + else + bmpBuf = tjd.decompress(width, 0, height, TJ.PF_BGRX, flags); tjd.close(); - } - else { + } else { img = ImageIO.read(file); + if (img == null) + throw new Exception("Input image type not supported."); width = img.getWidth(); height = img.getHeight(); - if(outSubsamp < 0) { - if(img.getType() == BufferedImage.TYPE_BYTE_GRAY) + if (outSubsamp < 0) { + if (img.getType() == BufferedImage.TYPE_BYTE_GRAY) outSubsamp = TJ.SAMP_GRAY; - else outSubsamp = TJ.SAMP_444; + else + outSubsamp = TJ.SAMP_444; } } System.gc(); - if(!display) - System.out.print("Dest. Image (" + outFormat + "): " + width + " x " - + height + " pixels"); + if (!display) + System.out.print("Dest. Image (" + outFormat + "): " + width + " x " + + height + " pixels"); - if(display) { + if (display) { ImageIcon icon = new ImageIcon(img); JLabel label = new JLabel(icon, JLabel.CENTER); JOptionPane.showMessageDialog(null, label, "Output Image", - JOptionPane.PLAIN_MESSAGE); - } - else if(outFormat.equalsIgnoreCase("jpg")) { - System.out.println(", " + sampName[outSubsamp] - + " subsampling, quality = " + outQual); + JOptionPane.PLAIN_MESSAGE); + } else if (outFormat.equalsIgnoreCase("jpg")) { + System.out.println(", " + sampName[outSubsamp] + + " subsampling, quality = " + outQual); TJCompressor tjc = new TJCompressor(); int jpegSize; byte[] jpegBuf; tjc.setSubsamp(outSubsamp); tjc.setJPEGQuality(outQual); - if(img != null) + if (img != null) jpegBuf = tjc.compress(img, flags); else { - tjc.setSourceImage(bmpBuf, width, 0, height, TJ.PF_BGRX); + tjc.setSourceImage(bmpBuf, 0, 0, width, 0, height, TJ.PF_BGRX); jpegBuf = tjc.compress(flags); } jpegSize = tjc.getCompressedSize(); @@ -314,27 +336,26 @@ public class TJExample implements TJCustomFilter { FileOutputStream fos = new FileOutputStream(file); fos.write(jpegBuf, 0, jpegSize); fos.close(); - } - else { + } else { System.out.print("\n"); file = new File(argv[1]); ImageIO.write(img, outFormat, file); } - } - catch(Exception e) { + } catch(Exception e) { e.printStackTrace(); System.exit(-1); } } public void customFilter(ShortBuffer coeffBuffer, Rectangle bufferRegion, - Rectangle planeRegion, int componentIndex, int transformIndex, - TJTransform transform) throws Exception { - for(int i=0; i= halfway) buf[index + goffset] = (byte)255; + if (row >= halfway) + buf[index + goffset] = (byte)255; } - if (aoffset >= 0) buf[index + aoffset] = (byte)255; + if (aoffset >= 0) + buf[index + aoffset] = (byte)255; } } } private static void initIntBuf(int[] buf, int w, int pitch, int h, int pf, - int flags) throws Exception { + int flags) throws Exception { int rshift = TJ.getRedOffset(pf) * 8; int gshift = TJ.getGreenOffset(pf) * 8; int bshift = TJ.getBlueOffset(pf) * 8; @@ -207,43 +210,44 @@ public class TJUnitTest { int index, row, col, halfway = 16; Arrays.fill(buf, 0); - for(row = 0; row < h; row++) { - for(col = 0; col < w; col++) { - if((flags & TJ.FLAG_BOTTOMUP) != 0) + for (row = 0; row < h; row++) { + for (col = 0; col < w; col++) { + if ((flags & TJ.FLAG_BOTTOMUP) != 0) index = pitch * (h - row - 1) + col; - else index = pitch * row + col; - if(((row / 8) + (col / 8)) % 2 == 0) { - if(row < halfway) { + else + index = pitch * row + col; + if (((row / 8) + (col / 8)) % 2 == 0) { + if (row < halfway) { buf[index] |= (255 << rshift); buf[index] |= (255 << gshift); buf[index] |= (255 << bshift); } - } - else { + } else { buf[index] |= (255 << rshift); - if(row >= halfway) buf[index] |= (255 << gshift); + if (row >= halfway) + buf[index] |= (255 << gshift); } - if (ashift >= 0) buf[index] |= (255 << ashift); + if (ashift >= 0) + buf[index] |= (255 << ashift); } } } private static void initImg(BufferedImage img, int pf, int flags) - throws Exception { + throws Exception { WritableRaster wr = img.getRaster(); int imgType = img.getType(); - if(imgType == BufferedImage.TYPE_INT_RGB - || imgType == BufferedImage.TYPE_INT_BGR - || imgType == BufferedImage.TYPE_INT_ARGB - || imgType == BufferedImage.TYPE_INT_ARGB_PRE) { + if (imgType == BufferedImage.TYPE_INT_RGB || + imgType == BufferedImage.TYPE_INT_BGR || + imgType == BufferedImage.TYPE_INT_ARGB || + imgType == BufferedImage.TYPE_INT_ARGB_PRE) { SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)img.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); int[] buf = db.getData(); initIntBuf(buf, img.getWidth(), pitch, img.getHeight(), pf, flags); - } - else { + } else { ComponentSampleModel sm = (ComponentSampleModel)img.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); @@ -253,34 +257,35 @@ public class TJUnitTest { } private static void checkVal(int row, int col, int v, String vname, int cv) - throws Exception { + throws Exception { v = (v < 0) ? v + 256 : v; - if(v < cv - 1 || v > cv + 1) { - throw new Exception("\nComp. " + vname + " at " + row + "," + col - + " should be " + cv + ", not " + v + "\n"); + if (v < cv - 1 || v > cv + 1) { + throw new Exception("Comp. " + vname + " at " + row + "," + col + + " should be " + cv + ", not " + v); } } private static void checkVal0(int row, int col, int v, String vname) - throws Exception { + throws Exception { v = (v < 0) ? v + 256 : v; - if(v > 1) { - throw new Exception("\nComp. " + vname + " at " + row + "," + col - + " should be 0, not " + v + "\n"); + if (v > 1) { + throw new Exception("Comp. " + vname + " at " + row + "," + col + + " should be 0, not " + v); } } private static void checkVal255(int row, int col, int v, String vname) - throws Exception { + throws Exception { v = (v < 0) ? v + 256 : v; - if(v < 254) { - throw new Exception("\nComp. " + vname + " at " + row + "," + col - + " should be 255, not " + v + "\n"); + if (v < 254) { + throw new Exception("Comp. " + vname + " at " + row + "," + col + + " should be 255, not " + v); } } private static int checkBuf(byte[] buf, int w, int pitch, int h, int pf, - int subsamp, TJScalingFactor sf, int flags) throws Exception { + int subsamp, TJScalingFactor sf, int flags) + throws Exception { int roffset = TJ.getRedOffset(pf); int goffset = TJ.getGreenOffset(pf); int boffset = TJ.getBlueOffset(pf); @@ -291,68 +296,64 @@ public class TJUnitTest { int blockSize = 8 * sf.getNum() / sf.getDenom(); try { - for(row = 0; row < halfway; row++) { - for(col = 0; col < w; col++) { - if((flags & TJ.FLAG_BOTTOMUP) != 0) + for (row = 0; row < halfway; row++) { + for (col = 0; col < w; col++) { + if ((flags & TJ.FLAG_BOTTOMUP) != 0) index = pitch * (h - row - 1) + col * ps; - else index = pitch * row + col * ps; + else + index = pitch * row + col * ps; byte r = buf[index + roffset]; byte g = buf[index + goffset]; byte b = buf[index + boffset]; byte a = aoffset >= 0 ? buf[index + aoffset] : (byte)255; - if(((row / blockSize) + (col / blockSize)) % 2 == 0) { - if(row < halfway) { + if (((row / blockSize) + (col / blockSize)) % 2 == 0) { + if (row < halfway) { checkVal255(row, col, r, "R"); checkVal255(row, col, g, "G"); checkVal255(row, col, b, "B"); - } - else { + } else { checkVal0(row, col, r, "R"); checkVal0(row, col, g, "G"); checkVal0(row, col, b, "B"); } - } - else { - if(subsamp == TJ.SAMP_GRAY) { - if(row < halfway) { + } else { + if (subsamp == TJ.SAMP_GRAY) { + if (row < halfway) { checkVal(row, col, r, "R", 76); checkVal(row, col, g, "G", 76); checkVal(row, col, b, "B", 76); - } - else { + } else { checkVal(row, col, r, "R", 226); checkVal(row, col, g, "G", 226); checkVal(row, col, b, "B", 226); } - } - else { + } else { checkVal255(row, col, r, "R"); - if(row < halfway) { + if (row < halfway) { checkVal0(row, col, g, "G"); - } - else { + } else { checkVal255(row, col, g, "G"); } - checkVal0(row, col, b, "B"); + checkVal0(row, col, b, "B"); } } checkVal255(row, col, a, "A"); } } - } - catch(Exception e) { - System.out.println(e); + } catch(Exception e) { + System.out.println("\n" + e.getMessage()); retval = 0; } - if(retval == 0) { - System.out.print("\n"); - for(row = 0; row < h; row++) { - for(col = 0; col < w; col++) { + if (retval == 0) { + for (row = 0; row < h; row++) { + for (col = 0; col < w; col++) { int r = buf[pitch * row + col * ps + roffset]; int g = buf[pitch * row + col * ps + goffset]; int b = buf[pitch * row + col * ps + boffset]; - if(r < 0) r += 256; if(g < 0) g += 256; if(b < 0) b += 256; + if (r < 0) r += 256; + if (g < 0) g += 256; + if (b < 0) b += 256; System.out.format("%3d/%3d/%3d ", r, g, b); } System.out.print("\n"); @@ -362,7 +363,8 @@ public class TJUnitTest { } private static int checkIntBuf(int[] buf, int w, int pitch, int h, int pf, - int subsamp, TJScalingFactor sf, int flags) throws Exception { + int subsamp, TJScalingFactor sf, int flags) + throws Exception { int rshift = TJ.getRedOffset(pf) * 8; int gshift = TJ.getGreenOffset(pf) * 8; int bshift = TJ.getBlueOffset(pf) * 8; @@ -372,46 +374,42 @@ public class TJUnitTest { int blockSize = 8 * sf.getNum() / sf.getDenom(); try { - for(row = 0; row < halfway; row++) { - for(col = 0; col < w; col++) { - if((flags & TJ.FLAG_BOTTOMUP) != 0) + for (row = 0; row < halfway; row++) { + for (col = 0; col < w; col++) { + if ((flags & TJ.FLAG_BOTTOMUP) != 0) index = pitch * (h - row - 1) + col; - else index = pitch * row + col; + else + index = pitch * row + col; int r = (buf[index] >> rshift) & 0xFF; int g = (buf[index] >> gshift) & 0xFF; int b = (buf[index] >> bshift) & 0xFF; int a = ashift >= 0 ? (buf[index] >> ashift) & 0xFF : 255; - if(((row / blockSize) + (col / blockSize)) % 2 == 0) { - if(row < halfway) { + if (((row / blockSize) + (col / blockSize)) % 2 == 0) { + if (row < halfway) { checkVal255(row, col, r, "R"); checkVal255(row, col, g, "G"); checkVal255(row, col, b, "B"); - } - else { + } else { checkVal0(row, col, r, "R"); checkVal0(row, col, g, "G"); checkVal0(row, col, b, "B"); } - } - else { - if(subsamp == TJ.SAMP_GRAY) { - if(row < halfway) { + } else { + if (subsamp == TJ.SAMP_GRAY) { + if (row < halfway) { checkVal(row, col, r, "R", 76); checkVal(row, col, g, "G", 76); checkVal(row, col, b, "B", 76); - } - else { + } else { checkVal(row, col, r, "R", 226); checkVal(row, col, g, "G", 226); checkVal(row, col, b, "B", 226); } - } - else { + } else { checkVal255(row, col, r, "R"); - if(row < halfway) { + if (row < halfway) { checkVal0(row, col, g, "G"); - } - else { + } else { checkVal255(row, col, g, "G"); } checkVal0(row, col, b, "B"); @@ -420,20 +418,20 @@ public class TJUnitTest { checkVal255(row, col, a, "A"); } } - } - catch(Exception e) { - System.out.println(e); + } catch(Exception e) { + System.out.println("\n" + e.getMessage()); retval = 0; } - if(retval == 0) { - System.out.print("\n"); - for(row = 0; row < h; row++) { - for(col = 0; col < w; col++) { + if (retval == 0) { + for (row = 0; row < h; row++) { + for (col = 0; col < w; col++) { int r = (buf[pitch * row + col] >> rshift) & 0xFF; int g = (buf[pitch * row + col] >> gshift) & 0xFF; int b = (buf[pitch * row + col] >> bshift) & 0xFF; - if(r < 0) r += 256; if(g < 0) g += 256; if(b < 0) b += 256; + if (r < 0) r += 256; + if (g < 0) g += 256; + if (b < 0) b += 256; System.out.format("%3d/%3d/%3d ", r, g, b); } System.out.print("\n"); @@ -442,29 +440,28 @@ public class TJUnitTest { return retval; } - private static int checkImg(BufferedImage img, int pf, - int subsamp, TJScalingFactor sf, int flags) throws Exception { + private static int checkImg(BufferedImage img, int pf, int subsamp, + TJScalingFactor sf, int flags) throws Exception { WritableRaster wr = img.getRaster(); int imgType = img.getType(); - if(imgType == BufferedImage.TYPE_INT_RGB - || imgType == BufferedImage.TYPE_INT_BGR - || imgType == BufferedImage.TYPE_INT_ARGB - || imgType == BufferedImage.TYPE_INT_ARGB_PRE) { - SinglePixelPackedSampleModel sm = + if (imgType == BufferedImage.TYPE_INT_RGB || + imgType == BufferedImage.TYPE_INT_BGR || + imgType == BufferedImage.TYPE_INT_ARGB || + imgType == BufferedImage.TYPE_INT_ARGB_PRE) { + SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)img.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); int[] buf = db.getData(); return checkIntBuf(buf, img.getWidth(), pitch, img.getHeight(), pf, - subsamp, sf, flags); - } - else { + subsamp, sf, flags); + } else { ComponentSampleModel sm = (ComponentSampleModel)img.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); byte[] buf = db.getData(); return checkBuf(buf, img.getWidth(), pitch, img.getHeight(), pf, subsamp, - sf, flags); + sf, flags); } } @@ -473,51 +470,52 @@ public class TJUnitTest { } private static int checkBufYUV(byte[] buf, int size, int w, int h, - int subsamp) throws Exception { + int subsamp) throws Exception { int row, col; - int hsf = TJ.getMCUWidth(subsamp)/8, vsf = TJ.getMCUHeight(subsamp)/8; + int hsf = TJ.getMCUWidth(subsamp) / 8, vsf = TJ.getMCUHeight(subsamp) / 8; int pw = PAD(w, hsf), ph = PAD(h, vsf); int cw = pw / hsf, ch = ph / vsf; int ypitch = PAD(pw, 4), uvpitch = PAD(cw, 4); int retval = 1; - int correctsize = ypitch * ph - + (subsamp == TJ.SAMP_GRAY ? 0 : uvpitch * ch * 2); + int correctsize = ypitch * ph + + (subsamp == TJ.SAMP_GRAY ? 0 : uvpitch * ch * 2); int halfway = 16; try { - if(size != correctsize) - throw new Exception("\nIncorrect size " + size + ". Should be " - + correctsize); + if (size != correctsize) + throw new Exception("Incorrect size " + size + ". Should be " + + correctsize); - for(row = 0; row < ph; row++) { - for(col = 0; col < pw; col++) { + for (row = 0; row < ph; row++) { + for (col = 0; col < pw; col++) { byte y = buf[ypitch * row + col]; - if(((row / 8) + (col / 8)) % 2 == 0) { - if(row < halfway) checkVal255(row, col, y, "Y"); - else checkVal0(row, col, y, "Y"); - } - else { - if(row < halfway) checkVal(row, col, y, "Y", 76); - else checkVal(row, col, y, "Y", 226); + if (((row / 8) + (col / 8)) % 2 == 0) { + if (row < halfway) + checkVal255(row, col, y, "Y"); + else + checkVal0(row, col, y, "Y"); + } else { + if (row < halfway) + checkVal(row, col, y, "Y", 76); + else + checkVal(row, col, y, "Y", 226); } } } - if(subsamp != TJ.SAMP_GRAY) { + if (subsamp != TJ.SAMP_GRAY) { halfway = 16 / vsf; - for(row = 0; row < ch; row++) { - for(col = 0; col < cw; col++) { + for (row = 0; row < ch; row++) { + for (col = 0; col < cw; col++) { byte u = buf[ypitch * ph + (uvpitch * row + col)], - v = buf[ypitch * ph + uvpitch * ch + (uvpitch * row + col)]; - if(((row * vsf / 8) + (col * hsf / 8)) % 2 == 0) { + v = buf[ypitch * ph + uvpitch * ch + (uvpitch * row + col)]; + if (((row * vsf / 8) + (col * hsf / 8)) % 2 == 0) { checkVal(row, col, u, "U", 128); checkVal(row, col, v, "V", 128); - } - else { - if(row < halfway) { + } else { + if (row < halfway) { checkVal(row, col, u, "U", 85); checkVal255(row, col, v, "V"); - } - else { + } else { checkVal0(row, col, u, "U"); checkVal(row, col, v, "V", 149); } @@ -525,47 +523,45 @@ public class TJUnitTest { } } } - } - catch(Exception e) { - System.out.println(e); + } catch(Exception e) { + System.out.println("\n" + e.getMessage()); retval = 0; } - if(retval == 0) { - for(row = 0; row < ph; row++) { - for(col = 0; col < pw; col++) { + if (retval == 0) { + for (row = 0; row < ph; row++) { + for (col = 0; col < pw; col++) { int y = buf[ypitch * row + col]; - if(y < 0) y += 256; + if (y < 0) y += 256; System.out.format("%3d ", y); } System.out.print("\n"); } System.out.print("\n"); - for(row = 0; row < ch; row++) { - for(col = 0; col < cw; col++) { + for (row = 0; row < ch; row++) { + for (col = 0; col < cw; col++) { int u = buf[ypitch * ph + (uvpitch * row + col)]; - if(u < 0) u += 256; + if (u < 0) u += 256; System.out.format("%3d ", u); } System.out.print("\n"); } System.out.print("\n"); - for(row = 0; row < ch; row++) { - for(col = 0; col < cw; col++) { + for (row = 0; row < ch; row++) { + for (col = 0; col < cw; col++) { int v = buf[ypitch * ph + uvpitch * ch + (uvpitch * row + col)]; - if(v < 0) v += 256; + if (v < 0) v += 256; System.out.format("%3d ", v); } System.out.print("\n"); } - System.out.print("\n"); } return retval; } private static void writeJPEG(byte[] jpegBuf, int jpegBufSize, - String filename) throws Exception { + String filename) throws Exception { File file = new File(filename); FileOutputStream fos = new FileOutputStream(file); fos.write(jpegBuf, 0, jpegBufSize); @@ -573,8 +569,8 @@ public class TJUnitTest { } private static int compTest(TJCompressor tjc, byte[] dstBuf, int w, - int h, int pf, String baseName, int subsamp, int jpegQual, - int flags) throws Exception { + int h, int pf, String baseName, int subsamp, + int jpegQual, int flags) throws Exception { String tempstr; byte[] srcBuf = null; BufferedImage img = null; @@ -585,28 +581,32 @@ public class TJUnitTest { if (bi) { pf = biTypePF(imgType); pfStr = biTypeStr(imgType); - } - else pfStr = pixFormatStr[pf]; + } else + pfStr = pixFormatStr[pf]; ps = TJ.getPixelSize(pf); System.out.print(pfStr + " "); - if(bi) System.out.print("(" + pixFormatStr[pf] + ") "); - if((flags & TJ.FLAG_BOTTOMUP) != 0) System.out.print("Bottom-Up"); - else System.out.print("Top-Down "); + if (bi) + System.out.print("(" + pixFormatStr[pf] + ") "); + if ((flags & TJ.FLAG_BOTTOMUP) != 0) + System.out.print("Bottom-Up"); + else + System.out.print("Top-Down "); System.out.print(" -> " + subNameLong[subsamp] + " "); - if(yuv == YUVENCODE) System.out.print("YUV ... "); - else System.out.print("Q" + jpegQual + " ... "); + if (yuv == YUVENCODE) + System.out.print("YUV ... "); + else + System.out.print("Q" + jpegQual + " ... "); - if(bi) { + if (bi) { img = new BufferedImage(w, h, imgType); initImg(img, pf, flags); - tempstr = baseName + "_enc_" + pfStr + "_" - + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" - + subName[subsamp] + "_Q" + jpegQual + ".png"; + tempstr = baseName + "_enc_" + pfStr + "_" + + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + + subName[subsamp] + "_Q" + jpegQual + ".png"; File file = new File(tempstr); ImageIO.write(img, "png", file); - } - else { + } else { srcBuf = new byte[w * h * ps + 1]; initBuf(srcBuf, w, w * ps, h, pf, flags); } @@ -615,36 +615,40 @@ public class TJUnitTest { t = getTime(); tjc.setSubsamp(subsamp); tjc.setJPEGQuality(jpegQual); - if(bi) { - if(yuv == YUVENCODE) tjc.encodeYUV(img, dstBuf, flags); - else tjc.compress(img, dstBuf, flags); - } - else { - tjc.setSourceImage(srcBuf, w, 0, h, pf); - if(yuv == YUVENCODE) tjc.encodeYUV(dstBuf, flags); - else tjc.compress(dstBuf, flags); + if (bi) { + if (yuv == YUVENCODE) + tjc.encodeYUV(img, dstBuf, flags); + else + tjc.compress(img, dstBuf, flags); + } else { + tjc.setSourceImage(srcBuf, 0, 0, w, 0, h, pf); + if (yuv == YUVENCODE) + tjc.encodeYUV(dstBuf, flags); + else + tjc.compress(dstBuf, flags); } size = tjc.getCompressedSize(); t = getTime() - t; - if(yuv == YUVENCODE) - tempstr = baseName + "_enc_" + pfStr + "_" - + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" - + subName[subsamp] + ".yuv"; + if (yuv == YUVENCODE) + tempstr = baseName + "_enc_" + pfStr + "_" + + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + + subName[subsamp] + ".yuv"; else - tempstr = baseName + "_enc_" + pfStr + "_" - + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" - + subName[subsamp] + "_Q" + jpegQual + ".jpg"; + tempstr = baseName + "_enc_" + pfStr + "_" + + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + + subName[subsamp] + "_Q" + jpegQual + ".jpg"; writeJPEG(dstBuf, size, tempstr); - if(yuv == YUVENCODE) { - if(checkBufYUV(dstBuf, size, w, h, subsamp) == 1) + if (yuv == YUVENCODE) { + if (checkBufYUV(dstBuf, size, w, h, subsamp) == 1) System.out.print("Passed."); else { - System.out.print("FAILED!"); exitStatus = -1; + System.out.print("FAILED!"); + exitStatus = -1; } - } - else System.out.print("Done."); + } else + System.out.print("Done."); System.out.format(" %.6f ms\n", t * 1000.); System.out.println(" Result in " + tempstr); @@ -652,8 +656,9 @@ public class TJUnitTest { } private static void decompTest(TJDecompressor tjd, byte[] jpegBuf, - int jpegSize, int w, int h, int pf, String baseName, int subsamp, - int flags, TJScalingFactor sf) throws Exception { + int jpegSize, int w, int h, int pf, + String baseName, int subsamp, int flags, + TJScalingFactor sf) throws Exception { String pfStr, tempstr; double t; int scaledWidth = sf.getScaled(w); @@ -662,216 +667,243 @@ public class TJUnitTest { BufferedImage img = null; byte[] dstBuf = null; - if(yuv == YUVENCODE) return; + if (yuv == YUVENCODE) return; if (bi) { pf = biTypePF(imgType); pfStr = biTypeStr(imgType); - } - else pfStr = pixFormatStr[pf]; + } else + pfStr = pixFormatStr[pf]; System.out.print("JPEG -> "); - if(yuv == YUVDECODE) - System.out.print("YUV " + subName[subsamp] + " ... "); + if (yuv == YUVDECODE) + System.out.print("YUV " + subNameLong[subsamp] + " ... "); else { System.out.print(pfStr + " "); - if(bi) System.out.print("(" + pixFormatStr[pf] + ") "); - if((flags & TJ.FLAG_BOTTOMUP) != 0) System.out.print("Bottom-Up "); - else System.out.print("Top-Down "); - if(!sf.isOne()) + if (bi) + System.out.print("(" + pixFormatStr[pf] + ") "); + if ((flags & TJ.FLAG_BOTTOMUP) != 0) + System.out.print("Bottom-Up "); + else + System.out.print("Top-Down "); + if (!sf.isOne()) System.out.print(sf.getNum() + "/" + sf.getDenom() + " ... "); - else System.out.print("... "); + else + System.out.print("... "); } t = getTime(); tjd.setJPEGImage(jpegBuf, jpegSize); - if(tjd.getWidth() != w || tjd.getHeight() != h - || tjd.getSubsamp() != subsamp) + if (tjd.getWidth() != w || tjd.getHeight() != h || + tjd.getSubsamp() != subsamp) throw new Exception("Incorrect JPEG header"); temp1 = scaledWidth; temp2 = scaledHeight; temp1 = tjd.getScaledWidth(temp1, temp2); temp2 = tjd.getScaledHeight(temp1, temp2); - if(temp1 != scaledWidth || temp2 != scaledHeight) + if (temp1 != scaledWidth || temp2 != scaledHeight) throw new Exception("Scaled size mismatch"); - if(yuv == YUVDECODE) dstBuf = tjd.decompressToYUV(flags); + if (yuv == YUVDECODE) + dstBuf = tjd.decompressToYUV(flags); else { - if(bi) + if (bi) img = tjd.decompress(scaledWidth, scaledHeight, imgType, flags); - else dstBuf = tjd.decompress(scaledWidth, 0, scaledHeight, pf, flags); + else + dstBuf = tjd.decompress(scaledWidth, 0, scaledHeight, pf, flags); } t = getTime() - t; - if(bi) { - tempstr = baseName + "_dec_" + pfStr + "_" - + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" - + subName[subsamp] + "_" + (double)sf.getNum() / (double)sf.getDenom() - + "x" + ".png"; + if (bi) { + tempstr = baseName + "_dec_" + pfStr + "_" + + (((flags & TJ.FLAG_BOTTOMUP) != 0) ? "BU" : "TD") + "_" + + subName[subsamp] + "_" + + (double)sf.getNum() / (double)sf.getDenom() + "x" + ".png"; File file = new File(tempstr); ImageIO.write(img, "png", file); } - if(yuv == YUVDECODE) { - if(checkBufYUV(dstBuf, dstBuf.length, w, h, subsamp) == 1) + if (yuv == YUVDECODE) { + if (checkBufYUV(dstBuf, dstBuf.length, w, h, subsamp) == 1) System.out.print("Passed."); else { System.out.print("FAILED!"); exitStatus = -1; } - } - else { - if((bi && checkImg(img, pf, subsamp, sf, flags) == 1) - || (!bi && checkBuf(dstBuf, scaledWidth, scaledWidth - * TJ.getPixelSize(pf), scaledHeight, pf, subsamp, sf, flags) == 1)) + } else { + if ((bi && checkImg(img, pf, subsamp, sf, flags) == 1) || + (!bi && checkBuf(dstBuf, scaledWidth, + scaledWidth * TJ.getPixelSize(pf), scaledHeight, pf, + subsamp, sf, flags) == 1)) System.out.print("Passed."); else { - System.out.print("FAILED!"); exitStatus = -1; + System.out.print("FAILED!"); + exitStatus = -1; } } System.out.format(" %.6f ms\n", t * 1000.); } private static void decompTest(TJDecompressor tjd, byte[] jpegBuf, - int jpegSize, int w, int h, int pf, String baseName, int subsamp, - int flags) throws Exception { + int jpegSize, int w, int h, int pf, + String baseName, int subsamp, + int flags) throws Exception { int i; - if((subsamp == TJ.SAMP_444 || subsamp == TJ.SAMP_GRAY) && yuv == 0) { - TJScalingFactor sf[] = TJ.getScalingFactors(); - for(i = 0; i < sf.length; i++) + if ((subsamp == TJ.SAMP_444 || subsamp == TJ.SAMP_GRAY) && yuv == 0) { + TJScalingFactor[] sf = TJ.getScalingFactors(); + for (i = 0; i < sf.length; i++) decompTest(tjd, jpegBuf, jpegSize, w, h, pf, baseName, subsamp, - flags, sf[i]); - } - else + flags, sf[i]); + } else decompTest(tjd, jpegBuf, jpegSize, w, h, pf, baseName, subsamp, - flags, new TJScalingFactor(1, 1)); - System.out.print("\n"); + flags, new TJScalingFactor(1, 1)); } private static void doTest(int w, int h, int[] formats, int subsamp, - String baseName) throws Exception { + String baseName) throws Exception { TJCompressor tjc = null; TJDecompressor tjd = null; int size; byte[] dstBuf; - if(yuv == YUVENCODE) dstBuf = new byte[TJ.bufSizeYUV(w, h, subsamp)]; - else dstBuf = new byte[TJ.bufSize(w, h, subsamp)]; + if (yuv == YUVENCODE) + dstBuf = new byte[TJ.bufSizeYUV(w, h, subsamp)]; + else + dstBuf = new byte[TJ.bufSize(w, h, subsamp)]; try { tjc = new TJCompressor(); - tjd = new TJDecompressor(); + tjd = new TJDecompressor(); - for(int pf : formats) { - for(int i = 0; i < 2; i++) { + for (int pf : formats) { + for (int i = 0; i < 2; i++) { int flags = 0; - if (subsamp == TJ.SAMP_422 || subsamp == TJ.SAMP_420 - || subsamp == TJ.SAMP_440) + if (subsamp == TJ.SAMP_422 || subsamp == TJ.SAMP_420 || + subsamp == TJ.SAMP_440) flags |= TJ.FLAG_FASTUPSAMPLE; - if(i == 1) { - if(yuv == YUVDECODE) { - tjc.close(); tjd.close(); return; - } - else flags |= TJ.FLAG_BOTTOMUP; + if (i == 1) { + if (yuv == YUVDECODE) { + tjc.close(); + tjd.close(); + return; + } else + flags |= TJ.FLAG_BOTTOMUP; } size = compTest(tjc, dstBuf, w, h, pf, baseName, subsamp, 100, - flags); + flags); decompTest(tjd, dstBuf, size, w, h, pf, baseName, subsamp, flags); - if(pf >= TJ.PF_RGBX && pf <= TJ.PF_XRGB && !bi) + if (pf >= TJ.PF_RGBX && pf <= TJ.PF_XRGB && !bi) decompTest(tjd, dstBuf, size, w, h, pf + (TJ.PF_RGBA - TJ.PF_RGBX), - baseName, subsamp, flags); + baseName, subsamp, flags); + System.out.print("\n"); } } - } - catch(Exception e) { - if(tjc != null) tjc.close(); - if(tjd != null) tjd.close(); + System.out.print("--------------------\n\n"); + } catch(Exception e) { + if (tjc != null) tjc.close(); + if (tjd != null) tjd.close(); throw e; } - if(tjc != null) tjc.close(); - if(tjd != null) tjd.close(); + if (tjc != null) tjc.close(); + if (tjd != null) tjd.close(); } private static void bufSizeTest() throws Exception { int w, h, i, subsamp; - byte[] srcBuf, jpegBuf; + byte[] srcBuf, dstBuf; TJCompressor tjc = null; Random r = new Random(); try { tjc = new TJCompressor(); System.out.println("Buffer size regression test"); - for(subsamp = 0; subsamp < TJ.NUMSAMP; subsamp++) { - for(w = 1; w < 48; w++) { + for (subsamp = 0; subsamp < TJ.NUMSAMP; subsamp++) { + for (w = 1; w < 48; w++) { int maxh = (w == 1) ? 2048 : 48; - for(h = 1; h < maxh; h++) { - if(h % 100 == 0) + for (h = 1; h < maxh; h++) { + if (h % 100 == 0) System.out.format("%04d x %04d\b\b\b\b\b\b\b\b\b\b\b", w, h); srcBuf = new byte[w * h * 4]; - jpegBuf = new byte[TJ.bufSize(w, h, subsamp)]; - for(i = 0; i < w * h * 4; i++) { + if (yuv == YUVENCODE) + dstBuf = new byte[TJ.bufSizeYUV(w, h, subsamp)]; + else + dstBuf = new byte[TJ.bufSize(w, h, subsamp)]; + for (i = 0; i < w * h * 4; i++) { srcBuf[i] = (byte)(r.nextInt(2) * 255); } - tjc.setSourceImage(srcBuf, w, 0, h, TJ.PF_BGRX); + tjc.setSourceImage(srcBuf, 0, 0, w, 0, h, TJ.PF_BGRX); tjc.setSubsamp(subsamp); tjc.setJPEGQuality(100); - tjc.compress(jpegBuf, 0); + if (yuv == YUVENCODE) + tjc.encodeYUV(dstBuf, 0); + else + tjc.compress(dstBuf, 0); srcBuf = new byte[h * w * 4]; - jpegBuf = new byte[TJ.bufSize(h, w, subsamp)]; - for(i = 0; i < h * w * 4; i++) { + if (yuv == YUVENCODE) + dstBuf = new byte[TJ.bufSizeYUV(h, w, subsamp)]; + else + dstBuf = new byte[TJ.bufSize(h, w, subsamp)]; + for (i = 0; i < h * w * 4; i++) { srcBuf[i] = (byte)(r.nextInt(2) * 255); } - tjc.setSourceImage(srcBuf, h, 0, w, TJ.PF_BGRX); - tjc.compress(jpegBuf, 0); + tjc.setSourceImage(srcBuf, 0, 0, h, 0, w, TJ.PF_BGRX); + if (yuv == YUVENCODE) + tjc.encodeYUV(dstBuf, 0); + else + tjc.compress(dstBuf, 0); } } } System.out.println("Done. "); - } - catch(Exception e) { - if(tjc != null) tjc.close(); + } catch(Exception e) { + if (tjc != null) tjc.close(); throw e; } - if(tjc != null) tjc.close(); + if (tjc != null) tjc.close(); } - public static void main(String argv[]) { + public static void main(String[] argv) { try { String testName = "javatest"; boolean doyuv = false; - for(int i = 0; i < argv.length; i++) { - if(argv[i].equalsIgnoreCase("-yuv")) doyuv = true; - if(argv[i].substring(0, 1).equalsIgnoreCase("-h") - || argv[i].equalsIgnoreCase("-?")) + for (int i = 0; i < argv.length; i++) { + if (argv[i].equalsIgnoreCase("-yuv")) + doyuv = true; + if (argv[i].substring(0, 1).equalsIgnoreCase("-h") || + argv[i].equalsIgnoreCase("-?")) usage(); - if(argv[i].equalsIgnoreCase("-bi")) { + if (argv[i].equalsIgnoreCase("-bi")) { bi = true; testName = "javabitest"; } } - if(doyuv) yuv = YUVENCODE; - doTest(35, 39, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_444, testName); - doTest(39, 41, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_444, testName); + if (doyuv) yuv = YUVENCODE; + doTest(35, 39, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_444, + testName); + doTest(39, 41, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_444, + testName); doTest(41, 35, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_422, - testName); + testName); doTest(35, 39, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_422, - testName); + testName); doTest(39, 41, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_420, - testName); + testName); doTest(41, 35, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_420, - testName); + testName); doTest(35, 39, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_440, - testName); + testName); doTest(39, 41, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_440, - testName); + testName); doTest(35, 39, bi ? onlyGrayBI : onlyGray, TJ.SAMP_GRAY, testName); doTest(39, 41, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_GRAY, - testName); + testName); doTest(41, 35, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_GRAY, - testName); - if(!doyuv && !bi) bufSizeTest(); - if(doyuv && !bi) { + testName); + if (!bi) + bufSizeTest(); + if (doyuv && !bi) { + System.out.print("\n--------------------\n\n"); yuv = YUVDECODE; doTest(48, 48, onlyRGB, TJ.SAMP_444, "javatest_yuv0"); doTest(35, 39, onlyRGB, TJ.SAMP_444, "javatest_yuv1"); @@ -886,8 +918,7 @@ public class TJUnitTest { doTest(48, 48, onlyGray, TJ.SAMP_GRAY, "javatest_yuv0"); doTest(39, 41, onlyGray, TJ.SAMP_GRAY, "javatest_yuv1"); } - } - catch(Exception e) { + } catch(Exception e) { e.printStackTrace(); exitStatus = -1; } diff --git a/java/doc/allclasses-frame.html b/java/doc/allclasses-frame.html index 4860d29..b2810b5 100644 --- a/java/doc/allclasses-frame.html +++ b/java/doc/allclasses-frame.html @@ -2,12 +2,10 @@ - All Classes - diff --git a/java/doc/allclasses-noframe.html b/java/doc/allclasses-noframe.html index accfa3f..ddc3d63 100644 --- a/java/doc/allclasses-noframe.html +++ b/java/doc/allclasses-noframe.html @@ -2,12 +2,10 @@ - All Classes - diff --git a/java/doc/constant-values.html b/java/doc/constant-values.html index 26d6d95..e4adb67 100644 --- a/java/doc/constant-values.html +++ b/java/doc/constant-values.html @@ -2,12 +2,10 @@ - Constant Field Values - diff --git a/java/doc/deprecated-list.html b/java/doc/deprecated-list.html index 27f6caf..65951d2 100644 --- a/java/doc/deprecated-list.html +++ b/java/doc/deprecated-list.html @@ -2,12 +2,10 @@ - Deprecated List - @@ -83,8 +81,46 @@ function windowTitle()
Contents + + + + + + + + + + + +
+Deprecated Methods
org.libjpegturbo.turbojpeg.TJDecompressor.decompress(byte[], int, int, int, int, int) +
+          Use + TJDecompressor.decompress(byte[], int, int, int, int, int, int, int) instead. 
org.libjpegturbo.turbojpeg.TJCompressor.setSourceImage(byte[], int, int, int, int) +
+          Use + TJCompressor.setSourceImage(byte[], int, int, int, int, int, int) instead. 
+  +

+ + + + + + + + +
+Deprecated Constructors
org.libjpegturbo.turbojpeg.TJCompressor(byte[], int, int, int, int) +
+          Use + TJCompressor.TJCompressor(byte[], int, int, int, int, int, int) instead. 
+  +


diff --git a/java/doc/help-doc.html b/java/doc/help-doc.html index 8724af8..b919d0a 100644 --- a/java/doc/help-doc.html +++ b/java/doc/help-doc.html @@ -2,12 +2,10 @@ - API Help - diff --git a/java/doc/index-all.html b/java/doc/index-all.html index 5213541..6642769 100644 --- a/java/doc/index-all.html +++ b/java/doc/index-all.html @@ -2,12 +2,10 @@ - Index - @@ -83,8 +81,7 @@ function windowTitle()
bufSize(int, int, int) - Static method in class org.libjpegturbo.turbojpeg.TJ
Returns the maximum size of the buffer (in bytes) required to hold a JPEG - image with the given width and height, and level of chrominance - subsampling. + image with the given width, height, and level of chrominance subsampling.
bufSizeYUV(int, int, int) - Static method in class org.libjpegturbo.turbojpeg.TJ
Returns the size of the buffer (in bytes) required to hold a YUV planar @@ -123,20 +120,28 @@ Method in class org.libjpegturbo.turbojpeg.TJCustomFilter
A callback function that can be used to modify the DCT coefficients after they are losslessly transformed but before they are transcoded to a new - JPEG file. + JPEG image.

D

-
decompress(byte[], int, int, int, int, int) - +
decompress(byte[], int, int, int, int, int, int, int) - Method in class org.libjpegturbo.turbojpeg.TJDecompressor
Decompress the JPEG source image associated with this decompressor instance and output a decompressed image to the given destination buffer. +
decompress(byte[], int, int, int, int, int) - +Method in class org.libjpegturbo.turbojpeg.TJDecompressor +
Deprecated. Use + TJDecompressor.decompress(byte[], int, int, int, int, int, int, int) instead.
decompress(int, int, int, int, int) - Method in class org.libjpegturbo.turbojpeg.TJDecompressor
Decompress the JPEG source image associated with this decompressor instance and return a buffer containing the decompressed image. +
decompress(int[], int, int, int, int, int, int, int) - +Method in class org.libjpegturbo.turbojpeg.TJDecompressor +
Decompress the JPEG source image associated with this decompressor + instance and output a decompressed image to the given destination buffer.
decompress(BufferedImage, int) - Method in class org.libjpegturbo.turbojpeg.TJDecompressor
Decompress the JPEG source image associated with this decompressor @@ -204,8 +209,9 @@ Static variable in class org.libjpegturbo.turbojpeg.FLAG_FASTUPSAMPLE - Static variable in class org.libjpegturbo.turbojpeg.TJ -
When decompressing, use the fastest chrominance upsampling algorithm - available in the underlying codec. +
When decompressing an image that was compressed using chrominance + subsampling, use the fastest chrominance upsampling algorithm available in + the underlying codec.
FLAG_FORCEMMX - Static variable in class org.libjpegturbo.turbojpeg.TJ
Turn off CPU auto-detection and force TurboJPEG to use MMX code @@ -266,7 +272,7 @@ Method in class org.libjpegturbo.turbojpeg.getPixelSize(int) - Static method in class org.libjpegturbo.turbojpeg.TJ -
Returns the pixel size (in bytes) of the given pixel format. +
Returns the pixel size (in bytes) for the given pixel format.
getRedOffset(int) - Static method in class org.libjpegturbo.turbojpeg.TJ
For the given pixel format, returns the number of bytes that the red @@ -276,12 +282,12 @@ Method in class org.libjpegturbo.turbojpeg.getScaledHeight(int, int) - Method in class org.libjpegturbo.turbojpeg.TJDecompressor -
Returns the height of the largest scaled down image that the TurboJPEG +
Returns the height of the largest scaled-down image that the TurboJPEG decompressor can generate without exceeding the desired image width and height.
getScaledWidth(int, int) - Method in class org.libjpegturbo.turbojpeg.TJDecompressor -
Returns the width of the largest scaled down image that the TurboJPEG +
Returns the width of the largest scaled-down image that the TurboJPEG decompressor can generate without exceeding the desired image width and height.
getScalingFactors() - @@ -294,8 +300,8 @@ Method in class org.libjpegturbo.turbojpeg.getTransformedSizes() - Method in class org.libjpegturbo.turbojpeg.TJTransformer -
Returns an array containing the sizes of the transformed JPEG images from - the most recent call to transform(). +
Returns an array containing the sizes of the transformed JPEG images + generated by the most recent transform operation.
getWidth() - Method in class org.libjpegturbo.turbojpeg.TJDecompressor
Returns the width of the JPEG image associated with this decompressor @@ -471,9 +477,13 @@ Method in class org.libjpegturbo.turbojpeg.setJPEGQuality(int) - Method in class org.libjpegturbo.turbojpeg.TJCompressor
Set the JPEG image quality level for subsequent compress operations. -
setSourceImage(byte[], int, int, int, int) - +
setSourceImage(byte[], int, int, int, int, int, int) - Method in class org.libjpegturbo.turbojpeg.TJCompressor
Associate an uncompressed source image with this compressor instance. +
setSourceImage(byte[], int, int, int, int) - +Method in class org.libjpegturbo.turbojpeg.TJCompressor +
Deprecated. Use + TJCompressor.setSourceImage(byte[], int, int, int, int, int, int) instead.
setSubsamp(int) - Method in class org.libjpegturbo.turbojpeg.TJCompressor
Set the level of chrominance subsampling for subsequent compress/encode @@ -489,23 +499,27 @@ Constructor for class org.libjpegturbo.turbojpeg.TJCompressor - Class in org.libjpegturbo.turbojpeg
TurboJPEG compressor
TJCompressor() - Constructor for class org.libjpegturbo.turbojpeg.TJCompressor
Create a TurboJPEG compressor instance. -
TJCompressor(byte[], int, int, int, int) - +
TJCompressor(byte[], int, int, int, int, int, int) - Constructor for class org.libjpegturbo.turbojpeg.TJCompressor
Create a TurboJPEG compressor instance and associate the uncompressed - source image stored in srcImage with the newly-created + source image stored in srcImage with the newly created instance. +
TJCompressor(byte[], int, int, int, int) - +Constructor for class org.libjpegturbo.turbojpeg.TJCompressor +
Deprecated. Use + TJCompressor.TJCompressor(byte[], int, int, int, int, int, int) instead.
TJCustomFilter - Interface in org.libjpegturbo.turbojpeg
Custom filter callback interface
TJDecompressor - Class in org.libjpegturbo.turbojpeg
TurboJPEG decompressor
TJDecompressor() - Constructor for class org.libjpegturbo.turbojpeg.TJDecompressor
Create a TurboJPEG decompresssor instance.
TJDecompressor(byte[]) - Constructor for class org.libjpegturbo.turbojpeg.TJDecompressor
Create a TurboJPEG decompressor instance and associate the JPEG image - stored in jpegImage with the newly-created instance. + stored in jpegImage with the newly created instance.
TJDecompressor(byte[], int) - Constructor for class org.libjpegturbo.turbojpeg.TJDecompressor
Create a TurboJPEG decompressor instance and associate the JPEG image of length imageSize bytes stored in jpegImage - with the newly-created instance. + with the newly created instance.
TJScalingFactor - Class in org.libjpegturbo.turbojpeg
Fractional scaling factor
TJScalingFactor(int, int) - Constructor for class org.libjpegturbo.turbojpeg.TJScalingFactor
  @@ -524,12 +538,12 @@ Constructor for class org.libjpegturbo.turbojpeg.TJTransformer(byte[]) - Constructor for class org.libjpegturbo.turbojpeg.TJTransformer
Create a TurboJPEG lossless transformer instance and associate the JPEG - image stored in jpegImage with the newly-created instance. + image stored in jpegImage with the newly created instance.
TJTransformer(byte[], int) - Constructor for class org.libjpegturbo.turbojpeg.TJTransformer
Create a TurboJPEG lossless transformer instance and associate the JPEG image of length imageSize bytes stored in - jpegImage with the newly-created instance. + jpegImage with the newly created instance.
transform(byte[][], TJTransform[], int) - Method in class org.libjpegturbo.turbojpeg.TJTransformer
Losslessly transform the JPEG image associated with this transformer diff --git a/java/doc/index.html b/java/doc/index.html index 93c50af..356cd1d 100644 --- a/java/doc/index.html +++ b/java/doc/index.html @@ -2,7 +2,6 @@ - Generated Documentation (Untitled) @@ -10,8 +9,42 @@ Generated Documentation (Untitled) targetPage = "" + window.location.search; if (targetPage != "" && targetPage != "undefined") targetPage = targetPage.substring(1); - if (targetPage.indexOf(":") != -1) + if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage))) targetPage = "undefined"; + function validURL(url) { + var pos = url.indexOf(".html"); + if (pos == -1 || pos != url.length - 5) + return false; + var allowNumber = false; + var allowSep = false; + var seenDot = false; + for (var i = 0; i < url.length - 5; i++) { + var ch = url.charAt(i); + if ('a' <= ch && ch <= 'z' || + 'A' <= ch && ch <= 'Z' || + ch == '$' || + ch == '_') { + allowNumber = true; + allowSep = true; + } else if ('0' <= ch && ch <= '9' + || ch == '-') { + if (!allowNumber) + return false; + } else if (ch == '/' || ch == '.') { + if (!allowSep) + return false; + allowNumber = false; + allowSep = false; + if (ch == '.') + seenDot = true; + if (ch == '/' && seenDot) + return false; + } else { + return false; + } + } + return true; + } function loadFrames() { if (targetPage != "" && targetPage != "undefined") top.classFrame.location = top.targetPage; diff --git a/java/doc/org/libjpegturbo/turbojpeg/TJ.html b/java/doc/org/libjpegturbo/turbojpeg/TJ.html index 326b22f..f905406 100644 --- a/java/doc/org/libjpegturbo/turbojpeg/TJ.html +++ b/java/doc/org/libjpegturbo/turbojpeg/TJ.html @@ -2,12 +2,10 @@ - TJ - @@ -146,8 +144,9 @@ TurboJPEG utility class (cannot be instantiated) FLAG_FASTUPSAMPLE
-          When decompressing, use the fastest chrominance upsampling algorithm - available in the underlying codec. +          When decompressing an image that was compressed using chrominance + subsampling, use the fastest chrominance upsampling algorithm available in + the underlying codec. @@ -364,8 +363,7 @@ TurboJPEG utility class (cannot be instantiated)
          Returns the maximum size of the buffer (in bytes) required to hold a JPEG - image with the given width and height, and level of chrominance - subsampling. + image with the given width, height, and level of chrominance subsampling. @@ -420,7 +418,7 @@ TurboJPEG utility class (cannot be instantiated) getPixelSize(int pixelFormat)
-          Returns the pixel size (in bytes) of the given pixel format. +          Returns the pixel size (in bytes) for the given pixel format. @@ -534,6 +532,7 @@ public static final int SAMP_440
4:4:0 chrominance subsampling. The JPEG or YUV image will contain one chrominance component for every 1x2 block of pixels in the source image. + Note that 4:4:0 subsampling is not fully accelerated in libjpeg-turbo.

See Also:
Constant Field Values
@@ -779,11 +778,11 @@ FLAG_FASTUPSAMPLE
 public static final int FLAG_FASTUPSAMPLE
-
When decompressing, use the fastest chrominance upsampling algorithm - available in the underlying codec. The default is to use smooth - upsampling, which creates a smooth transition between neighboring - chrominance components in order to reduce upsampling artifacts in the - decompressed image. +
When decompressing an image that was compressed using chrominance + subsampling, use the fastest chrominance upsampling algorithm available in + the underlying codec. The default is to use smooth upsampling, which + creates a smooth transition between neighboring chrominance components in + order to reduce upsampling artifacts in the decompressed image.

See Also:
Constant Field Values
@@ -796,11 +795,11 @@ FLAG_FASTDCT public static final int FLAG_FASTDCT
Use the fastest DCT/IDCT algorithm available in the underlying codec. The - default if this flag is not specified is implementation-specific. The - libjpeg implementation, for example, uses the fast algorithm by default - when compressing, because this has been shown to have only a very slight - effect on accuracy, but it uses the accurate algorithm when decompressing, - because this has been shown to have a larger effect. + default if this flag is not specified is implementation-specific. For + example, the implementation of TurboJPEG for libjpeg[-turbo] uses the fast + algorithm by default when compressing, because this has been shown to have + only a very slight effect on accuracy, but it uses the accurate algorithm + when decompressing, because this has been shown to have a larger effect.

See Also:
Constant Field Values
@@ -814,11 +813,11 @@ public static final int FLAG_ACCURATEDCT
Use the most accurate DCT/IDCT algorithm available in the underlying codec. The default if this flag is not specified is - implementation-specific. The libjpeg implementation, for example, uses - the fast algorithm by default when compressing, because this has been - shown to have only a very slight effect on accuracy, but it uses the - accurate algorithm when decompressing, because this has been shown to have - a larger effect. + implementation-specific. For example, the implementation of TurboJPEG for + libjpeg[-turbo] uses the fast algorithm by default when compressing, + because this has been shown to have only a very slight effect on accuracy, + but it uses the accurate algorithm when decompressing, because this has + been shown to have a larger effect.

See Also:
Constant Field Values
@@ -896,11 +895,11 @@ getPixelSize public static int getPixelSize(int pixelFormat) throws java.lang.Exception
-
Returns the pixel size (in bytes) of the given pixel format. +
Returns the pixel size (in bytes) for the given pixel format.

Parameters:
pixelFormat - the pixel format (one of PF_*) -
Returns:
the pixel size (in bytes) of the given pixel format +
Returns:
the pixel size (in bytes) for the given pixel format
Throws:
java.lang.Exception
@@ -979,15 +978,13 @@ public static int bufSize(int width, throws java.lang.Exception
Returns the maximum size of the buffer (in bytes) required to hold a JPEG - image with the given width and height, and level of chrominance - subsampling. + image with the given width, height, and level of chrominance subsampling.

Parameters:
width - the width (in pixels) of the JPEG image
height - the height (in pixels) of the JPEG image
jpegSubsamp - the level of chrominance subsampling to be used when generating the JPEG image (one of TJ.SAMP_*)
Returns:
the maximum size of the buffer (in bytes) required to hold a JPEG - image with the given width and height, and level of chrominance - subsampling + image with the given width, height, and level of chrominance subsampling
Throws:
java.lang.Exception
diff --git a/java/doc/org/libjpegturbo/turbojpeg/TJCompressor.html b/java/doc/org/libjpegturbo/turbojpeg/TJCompressor.html index 1c7088a..935db0e 100644 --- a/java/doc/org/libjpegturbo/turbojpeg/TJCompressor.html +++ b/java/doc/org/libjpegturbo/turbojpeg/TJCompressor.html @@ -2,12 +2,10 @@ - TJCompressor - @@ -129,8 +127,21 @@ TurboJPEG compressor int pixelFormat)
+          Deprecated. Use + TJCompressor(byte[], int, int, int, int, int, int) instead. + + +TJCompressor(byte[] srcImage, + int x, + int y, + int width, + int pitch, + int height, + int pixelFormat) + +
          Create a TurboJPEG compressor instance and associate the uncompressed - source image stored in srcImage with the newly-created + source image stored in srcImage with the newly created instance. @@ -266,6 +277,21 @@ TurboJPEG compressor int pixelFormat)
+          Deprecated. Use + setSourceImage(byte[], int, int, int, int, int, int) instead. + + + + void +setSourceImage(byte[] srcImage, + int x, + int y, + int width, + int pitch, + int height, + int pixelFormat) + +
          Associate an uncompressed source image with this compressor instance. @@ -315,10 +341,12 @@ public TJCompressor()

-

+

TJCompressor

 public TJCompressor(byte[] srcImage,
+                    int x,
+                    int y,
                     int width,
                     int pitch,
                     int height,
@@ -326,11 +354,33 @@ public TJCompressor(byte[] srcImage,
              throws java.lang.Exception
Create a TurboJPEG compressor instance and associate the uncompressed - source image stored in srcImage with the newly-created + source image stored in srcImage with the newly created instance.

-
Parameters:
srcImage - see setSourceImage(byte[], int, int, int, int) for description
width - see setSourceImage(byte[], int, int, int, int) for description
pitch - see setSourceImage(byte[], int, int, int, int) for description
height - see setSourceImage(byte[], int, int, int, int) for description
pixelFormat - see setSourceImage(byte[], int, int, int, int) for description +
Parameters:
srcImage - see setSourceImage(byte[], int, int, int, int, int, int) for description
x - see setSourceImage(byte[], int, int, int, int, int, int) for description
y - see setSourceImage(byte[], int, int, int, int, int, int) for description
width - see setSourceImage(byte[], int, int, int, int, int, int) for description
pitch - see setSourceImage(byte[], int, int, int, int, int, int) for description
height - see setSourceImage(byte[], int, int, int, int, int, int) for description
pixelFormat - pixel format of the source image (one of + TJ.PF_*) +
Throws: +
java.lang.Exception
+
+
+ +

+TJCompressor

+
+@Deprecated
+public TJCompressor(byte[] srcImage,
+                               int width,
+                               int pitch,
+                               int height,
+                               int pixelFormat)
+             throws java.lang.Exception
+
+
Deprecated. Use + TJCompressor(byte[], int, int, int, int, int, int) instead. +

+

+
Throws:
java.lang.Exception
@@ -345,10 +395,12 @@ public TJCompressor(byte[] srcImage, -

+

setSourceImage

 public void setSourceImage(byte[] srcImage,
+                           int x,
+                           int y,
                            int width,
                            int pitch,
                            int height,
@@ -359,15 +411,41 @@ public void setSourceImage(byte[] srcImage,
 

Parameters:
srcImage - image buffer containing RGB or grayscale pixels to be - compressed
width - width (in pixels) of the source image
pitch - bytes per line of the source image. Normally, this should be + compressed or encoded
x - x offset (in pixels) of the region in the source image from which + the JPEG or YUV image should be compressed/encoded
y - y offset (in pixels) of the region in the source image from which + the JPEG or YUV image should be compressed/encoded
width - width (in pixels) of the region in the source image from + which the JPEG or YUV image should be compressed/encoded
pitch - bytes per line of the source image. Normally, this should be width * TJ.pixelSize(pixelFormat) if the source image is unpadded, but you can use this parameter to, for instance, specify that - the scanlines in the source image are padded to 4-byte boundaries, as is - the case for Windows bitmaps. You can also be clever and use this - parameter to skip lines, etc. Setting this parameter to 0 is the - equivalent of setting it to width * - TJ.pixelSize(pixelFormat).
height - height (in pixels) of the source image
pixelFormat - pixel format of the source image (one of - TJ.PF_*) + the scanlines in the source image are padded to a 4-byte boundary or to + compress/encode a JPEG or YUV image from a region of a larger source + image. You can also be clever and use this parameter to skip lines, etc. + Setting this parameter to 0 is the equivalent of setting it to + width * TJ.pixelSize(pixelFormat).
height - height (in pixels) of the region in the source image from + which the JPEG or YUV image should be compressed/encoded
pixelFormat - pixel format of the source image (one of + TJ.PF_*) +
Throws: +
java.lang.Exception
+
+
+
+ +

+setSourceImage

+
+@Deprecated
+public void setSourceImage(byte[] srcImage,
+                                      int width,
+                                      int pitch,
+                                      int height,
+                                      int pixelFormat)
+                    throws java.lang.Exception
+
+
Deprecated. Use + setSourceImage(byte[], int, int, int, int, int, int) instead. +

+

+
Throws:
java.lang.Exception
@@ -384,8 +462,9 @@ public void setSubsamp(int newSubsamp) operations.

-
Parameters:
newSubsamp - the new level of chrominance subsampling (one of - TJ.SAMP_*) +
Parameters:
newSubsamp - the level of chrominance subsampling to use in + subsequent compress/encode operations (one of + TJ.SAMP_*)
Throws:
java.lang.Exception
@@ -422,7 +501,9 @@ public void compress(byte[] dstBuf,
Parameters:
dstBuf - buffer that will receive the JPEG image. Use TJ.bufSize(int, int, int) to determine the maximum size for this buffer based on - the image width and height.
flags - the bitwise OR of one or more of TJ.FLAG_* + the source image's width and height and the desired level of chrominance + subsampling.
flags - the bitwise OR of one or more of + TJ.FLAG_*
Throws:
java.lang.Exception
@@ -439,7 +520,8 @@ public byte[] compress(int flags) instance and return a buffer containing a JPEG image.

-
Parameters:
flags - the bitwise OR of one or more of TJ.FLAG_* +
Parameters:
flags - the bitwise OR of one or more of + TJ.FLAG_*
Returns:
a buffer containing a JPEG image. The length of this buffer will not be equal to the size of the JPEG image. Use getCompressedSize() to obtain the size of the JPEG image.
Throws: @@ -463,7 +545,8 @@ public void compress(java.awt.image.BufferedImage srcImage,
Parameters:
srcImage - a BufferedImage instance containing RGB or grayscale pixels to be compressed
dstBuf - buffer that will receive the JPEG image. Use TJ.bufSize(int, int, int) to determine the maximum size for this buffer based on - the image width and height.
flags - the bitwise OR of one or more of TJ.FLAG_* + the image width, height, and level of chrominance subsampling.
flags - the bitwise OR of one or more of + TJ.FLAG_*
Throws:
java.lang.Exception
@@ -482,7 +565,8 @@ public byte[] compress(java.awt.image.BufferedImage srcImage,

Parameters:
srcImage - a BufferedImage instance containing RGB or - grayscale pixels to be compressed
flags - the bitwise OR of one or more of TJ.FLAG_* + grayscale pixels to be compressed
flags - the bitwise OR of one or more of + TJ.FLAG_*
Returns:
a buffer containing a JPEG image. The length of this buffer will not be equal to the size of the JPEG image. Use getCompressedSize() to obtain the size of the JPEG image.
Throws: @@ -504,18 +588,23 @@ public void encodeYUV(byte[] dstBuf, TurboJPEG's underlying codec to produce a planar YUV image that is suitable for direct video display. Specifically, if the chrominance components are subsampled along the horizontal dimension, then the width - of the luminance plane is padded to 2 in the output image (same goes for - the height of the luminance plane, if the chrominance components are - subsampled along the vertical dimension.) Also, each line of each plane - in the output image is padded to 4 bytes. Although this will work with - any subsampling option, it is really only useful in combination with - TJ.SAMP_420, which produces an image compatible with the I420 (AKA - "YUV420P") format. + of the luminance plane is padded to the nearest multiple of 2 in the + output image (same goes for the height of the luminance plane, if the + chrominance components are subsampled along the vertical dimension.) + Also, each line of each plane in the output image is padded to 4 bytes. + Although this will work with any subsampling option, it is really only + useful in combination with TJ.SAMP_420, which produces an image + compatible with the I420 (AKA "YUV420P") format. +

+ NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the + convention of the digital video community, the TurboJPEG API uses "YUV" to + refer to an image format consisting of Y, Cb, and Cr image planes.

Parameters:
dstBuf - buffer that will receive the YUV planar image. Use TJ.bufSizeYUV(int, int, int) to determine the appropriate size for this buffer - based on the image width, height, and level of chrominance subsampling.
flags - the bitwise OR of one or more of TJ.FLAG_* + based on the image width, height, and level of chrominance subsampling.
flags - the bitwise OR of one or more of + TJ.FLAG_*
Throws:
java.lang.Exception
@@ -533,7 +622,8 @@ public byte[] encodeYUV(int flags) encodeYUV(byte[], int) for more detail.

-
Parameters:
flags - the bitwise OR of one or more of TJ.FLAG_* +
Parameters:
flags - the bitwise OR of one or more of + TJ.FLAG_*
Returns:
a buffer containing a YUV planar image
Throws:
java.lang.Exception
@@ -557,7 +647,8 @@ public void encodeYUV(java.awt.image.BufferedImage srcImage,
Parameters:
srcImage - a BufferedImage instance containing RGB or grayscale pixels to be encoded
dstBuf - buffer that will receive the YUV planar image. Use TJ.bufSizeYUV(int, int, int) to determine the appropriate size for this buffer - based on the image width, height, and level of chrominance subsampling.
flags - the bitwise OR of one or more of TJ.FLAG_* + based on the image width, height, and level of chrominance subsampling.
flags - the bitwise OR of one or more of + TJ.FLAG_*
Throws:
java.lang.Exception
@@ -577,7 +668,8 @@ public byte[] encodeYUV(java.awt.image.BufferedImage srcImage,

Parameters:
srcImage - a BufferedImage instance containing RGB or - grayscale pixels to be encoded
flags - the bitwise OR of one or more of TJ.FLAG_* + grayscale pixels to be encoded
flags - the bitwise OR of one or more of + TJ.FLAG_*
Returns:
a buffer containing a YUV planar image
Throws:
java.lang.Exception
diff --git a/java/doc/org/libjpegturbo/turbojpeg/TJCustomFilter.html b/java/doc/org/libjpegturbo/turbojpeg/TJCustomFilter.html index 9a3b56e..3291c71 100644 --- a/java/doc/org/libjpegturbo/turbojpeg/TJCustomFilter.html +++ b/java/doc/org/libjpegturbo/turbojpeg/TJCustomFilter.html @@ -2,12 +2,10 @@ - TJCustomFilter - @@ -124,7 +122,7 @@ Custom filter callback interface
          A callback function that can be used to modify the DCT coefficients after they are losslessly transformed but before they are transcoded to a new - JPEG file. + JPEG image.   @@ -153,7 +151,7 @@ void customFilter(java.nio.ShortBuffer coeffBuffer,
A callback function that can be used to modify the DCT coefficients after they are losslessly transformed but before they are transcoded to a new - JPEG file. This allows for custom filters or other transformations to be + JPEG image. This allows for custom filters or other transformations to be applied in the frequency domain.

@@ -167,10 +165,10 @@ void customFilter(java.nio.ShortBuffer coeffBuffer, into multiple DCT coefficient buffers and call the callback function once for each buffer.
planeRegion - rectangle containing the width and height of the component plane to which coeffBuffer belongs
componentID - ID number of the component plane to which - coeffBufferbelongs (Y, Cb, and Cr have, respectively, ID's of - 0, 1, and 2 in typical JPEG images.)
transformID - ID number of the transformed image to which + coeffBuffer belongs (Y, Cb, and Cr have, respectively, ID's + of 0, 1, and 2 in typical JPEG images.)
transformID - ID number of the transformed image to which coeffBuffer belongs. This is the same as the index of the - transform in the transforms array that was passed to TJTransformer.transform().
transform - a TJTransform instance that specifies the + transform in the transforms array that was passed to TJTransformer.transform().
transform - a TJTransform instance that specifies the parameters and/or cropping region for this transform
Throws:
java.lang.Exception
diff --git a/java/doc/org/libjpegturbo/turbojpeg/TJDecompressor.html b/java/doc/org/libjpegturbo/turbojpeg/TJDecompressor.html index 2505470..d69f943 100644 --- a/java/doc/org/libjpegturbo/turbojpeg/TJDecompressor.html +++ b/java/doc/org/libjpegturbo/turbojpeg/TJDecompressor.html @@ -2,12 +2,10 @@ - TJDecompressor - @@ -186,7 +184,7 @@ TurboJPEG decompressor
          Create a TurboJPEG decompressor instance and associate the JPEG image - stored in jpegImage with the newly-created instance. + stored in jpegImage with the newly created instance. TJDecompressor(byte[] jpegImage, @@ -195,7 +193,7 @@ TurboJPEG decompressor
          Create a TurboJPEG decompressor instance and associate the JPEG image of length imageSize bytes stored in jpegImage - with the newly-created instance. + with the newly created instance.   @@ -237,6 +235,38 @@ TurboJPEG decompressor int flags)

+          Deprecated. Use + decompress(byte[], int, int, int, int, int, int, int) instead. + + + + void +decompress(byte[] dstBuf, + int x, + int y, + int desiredWidth, + int pitch, + int desiredHeight, + int pixelFormat, + int flags) + +
+          Decompress the JPEG source image associated with this decompressor + instance and output a decompressed image to the given destination buffer. + + + + void +decompress(int[] dstBuf, + int x, + int y, + int desiredWidth, + int stride, + int desiredHeight, + int pixelFormat, + int flags) + +
          Decompress the JPEG source image associated with this decompressor instance and output a decompressed image to the given destination buffer. @@ -326,7 +356,7 @@ TurboJPEG decompressor int desiredHeight)
-          Returns the height of the largest scaled down image that the TurboJPEG +          Returns the height of the largest scaled-down image that the TurboJPEG decompressor can generate without exceeding the desired image width and height. @@ -337,7 +367,7 @@ TurboJPEG decompressor int desiredHeight)
-          Returns the width of the largest scaled down image that the TurboJPEG +          Returns the width of the largest scaled-down image that the TurboJPEG decompressor can generate without exceeding the desired image width and height. @@ -483,7 +513,7 @@ public TJDecompressor(byte[] jpegImage) throws java.lang.Exception
Create a TurboJPEG decompressor instance and associate the JPEG image - stored in jpegImage with the newly-created instance. + stored in jpegImage with the newly created instance.

Parameters:
jpegImage - JPEG image buffer (size of the JPEG image is assumed to @@ -502,7 +532,7 @@ public TJDecompressor(byte[] jpegImage,
Create a TurboJPEG decompressor instance and associate the JPEG image of length imageSize bytes stored in jpegImage - with the newly-created instance. + with the newly created instance.

Parameters:
jpegImage - JPEG image buffer
imageSize - size of the JPEG image (in bytes) @@ -584,7 +614,7 @@ public int getSubsamp() throws java.lang.Exception
Returns the level of chrominance subsampling used in the JPEG image - associated with this decompressor instance. + associated with this decompressor instance. See TJ.SAMP_*.

@@ -639,7 +669,7 @@ public int getScaledWidth(int desiredWidth, int desiredHeight) throws java.lang.Exception
-
Returns the width of the largest scaled down image that the TurboJPEG +
Returns the width of the largest scaled-down image that the TurboJPEG decompressor can generate without exceeding the desired image width and height.

@@ -651,7 +681,7 @@ public int getScaledWidth(int desiredWidth, Setting this to 0 is the same as setting it to the height of the JPEG image (in other words, the height will not be considered when determining the scaled image size.) -

Returns:
the width of the largest scaled down image that the TurboJPEG +
Returns:
the width of the largest scaled-down image that the TurboJPEG decompressor can generate without exceeding the desired image width and height
Throws: @@ -667,7 +697,7 @@ public int getScaledHeight(int desiredWidth, int desiredHeight) throws java.lang.Exception
-
Returns the height of the largest scaled down image that the TurboJPEG +
Returns the height of the largest scaled-down image that the TurboJPEG decompressor can generate without exceeding the desired image width and height.

@@ -679,7 +709,7 @@ public int getScaledHeight(int desiredWidth, Setting this to 0 is the same as setting it to the height of the JPEG image (in other words, the height will not be considered when determining the scaled image size.) -

Returns:
the height of the largest scaled down image that the TurboJPEG +
Returns:
the height of the largest scaled-down image that the TurboJPEG decompressor can generate without exceeding the desired image width and height
Throws: @@ -688,10 +718,12 @@ public int getScaledHeight(int desiredWidth,

-

+

decompress

 public void decompress(byte[] dstBuf,
+                       int x,
+                       int y,
                        int desiredWidth,
                        int pitch,
                        int desiredHeight,
@@ -707,28 +739,59 @@ public void decompress(byte[] dstBuf,
  buffer should normally be pitch * scaledHeight bytes in size,
  where scaledHeight can be determined by calling 
  scalingFactor.getScaled(jpegHeight)
-  with one of the scaling factors returned from TJ.getScalingFactors() or by calling getScaledHeight(int, int).
desiredWidth - desired width (in pixels) of the decompressed image. - If the desired image dimensions are smaller than the dimensions of the - JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG - decompressor to generate the largest possible image that will fit within - the desired dimensions. Setting this to 0 is the same as setting it to - the width of the JPEG image (in other words, the width will not be - considered when determining the scaled image size.)
pitch - bytes per line of the destination image. Normally, this + with one of the scaling factors returned from TJ.getScalingFactors() or by calling getScaledHeight(int, int). However, + the buffer may also be larger than the dimensions of the JPEG image, in + which case the x, y, and pitch + parameters can be used to specify the region into which the JPEG image + should be decompressed.
x - x offset (in pixels) of the region into which the JPEG image + should be decompressed, relative to the start of dstBuf.
y - y offset (in pixels) of the region into which the JPEG image + should be decompressed, relative to the start of dstBuf.
desiredWidth - desired width (in pixels) of the decompressed image + (or image region.) If the desired image dimensions are different than the + dimensions of the JPEG image being decompressed, then TurboJPEG will use + scaling in the JPEG decompressor to generate the largest possible image + that will fit within the desired dimensions. Setting this to 0 is the + same as setting it to the width of the JPEG image (in other words, the + width will not be considered when determining the scaled image size.)
pitch - bytes per line of the destination image. Normally, this should be set to scaledWidth * TJ.pixelSize(pixelFormat) if the decompressed image is unpadded, but you can use this to, for instance, - pad each line of the decompressed image to a 4-byte boundary. NOTE: + pad each line of the decompressed image to a 4-byte boundary or to + decompress the JPEG image into a region of a larger image. NOTE: scaledWidth can be determined by calling scalingFactor.getScaled(jpegWidth) or by calling getScaledWidth(int, int). Setting this parameter to 0 is the equivalent of setting it to scaledWidth * - TJ.pixelSize(pixelFormat).
desiredHeight - desired height (in pixels) of the decompressed image. - If the desired image dimensions are smaller than the dimensions of the - JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG - decompressor to generate the largest possible image that will fit within - the desired dimensions. Setting this to 0 is the same as setting it to - the height of the JPEG image (in other words, the height will not be - considered when determining the scaled image size.)
pixelFormat - pixel format of the decompressed image (one of - TJ.PF_*)
flags - the bitwise OR of one or more of TJ.FLAG_* + TJ.pixelSize(pixelFormat).
desiredHeight - desired height (in pixels) of the decompressed image + (or image region.) If the desired image dimensions are different than the + dimensions of the JPEG image being decompressed, then TurboJPEG will use + scaling in the JPEG decompressor to generate the largest possible image + that will fit within the desired dimensions. Setting this to 0 is the + same as setting it to the height of the JPEG image (in other words, the + height will not be considered when determining the scaled image size.)
pixelFormat - pixel format of the decompressed/decoded image (one of + TJ.PF_*)
flags - the bitwise OR of one or more of + TJ.FLAG_* +
Throws: +
java.lang.Exception
+
+
+
+ +

+decompress

+
+@Deprecated
+public void decompress(byte[] dstBuf,
+                                  int desiredWidth,
+                                  int pitch,
+                                  int desiredHeight,
+                                  int pixelFormat,
+                                  int flags)
+                throws java.lang.Exception
+
+
Deprecated. Use + decompress(byte[], int, int, int, int, int, int, int) instead. +

+

+
Throws:
java.lang.Exception
@@ -750,10 +813,14 @@ public byte[] decompress(int desiredWidth,

Parameters:
desiredWidth - see - decompress(byte[], int, int, int, int, int) for description
pitch - see - decompress(byte[], int, int, int, int, int) for description
desiredHeight - see - decompress(byte[], int, int, int, int, int) for description
pixelFormat - pixel format of the decompressed image (one of - TJ.PF_*)
flags - the bitwise OR of one or more of TJ.FLAG_* + decompress(byte[], int, int, int, int, int, int, int) + for description
pitch - see + decompress(byte[], int, int, int, int, int, int, int) + for description
desiredHeight - see + decompress(byte[], int, int, int, int, int, int, int) + for description
pixelFormat - pixel format of the decompressed image (one of + TJ.PF_*)
flags - the bitwise OR of one or more of + TJ.FLAG_*
Returns:
a buffer containing the decompressed image
Throws:
java.lang.Exception
@@ -772,16 +839,18 @@ public void decompressToYUV(byte[] dstBuf, instance and output a YUV planar image to the given destination buffer. This method performs JPEG decompression but leaves out the color conversion step, so a planar YUV image is generated instead of an RGB - image. The padding of the planes in this image is the same as the images - generated by TJCompressor.encodeYUV(byte[], int). Note that, if - the width or height of the image is not an even multiple of the MCU block - size (see TJ.getMCUWidth(int) and TJ.getMCUHeight(int)), then an - intermediate buffer copy will be performed within TurboJPEG. + image. The padding of the planes in this image is the same as in the + images generated by TJCompressor.encodeYUV(byte[], int). +

+ NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the + convention of the digital video community, the TurboJPEG API uses "YUV" to + refer to an image format consisting of Y, Cb, and Cr image planes.

Parameters:
dstBuf - buffer that will receive the YUV planar image. Use TJ.bufSizeYUV(int, int, int) to determine the appropriate size for this buffer - based on the image width, height, and level of chrominance subsampling.
flags - the bitwise OR of one or more of TJ.FLAG_* + based on the image width, height, and level of chrominance subsampling.
flags - the bitwise OR of one or more of + TJ.FLAG_*
Throws:
java.lang.Exception
@@ -798,7 +867,8 @@ public byte[] decompressToYUV(int flags) instance and return a buffer containing a YUV planar image. See decompressToYUV(byte[], int) for more detail.

-
Parameters:
flags - the bitwise OR of one or more of TJ.FLAG_* +
Parameters:
flags - the bitwise OR of one or more of + TJ.FLAG_*
Returns:
a buffer containing a YUV planar image
Throws:
java.lang.Exception
@@ -806,6 +876,60 @@ public byte[] decompressToYUV(int flags)

+

+decompress

+
+public void decompress(int[] dstBuf,
+                       int x,
+                       int y,
+                       int desiredWidth,
+                       int stride,
+                       int desiredHeight,
+                       int pixelFormat,
+                       int flags)
+                throws java.lang.Exception
+
+
Decompress the JPEG source image associated with this decompressor + instance and output a decompressed image to the given destination buffer. +

+

+
Parameters:
dstBuf - buffer that will receive the decompressed image. This + buffer should normally be stride * scaledHeight pixels in + size, where scaledHeight can be determined by calling + scalingFactor.getScaled(jpegHeight) + with one of the scaling factors returned from TJ.getScalingFactors() or by calling getScaledHeight(int, int). However, + the buffer may also be larger than the dimensions of the JPEG image, in + which case the x, y, and stride + parameters can be used to specify the region into which the JPEG image + should be decompressed.
x - x offset (in pixels) of the region into which the JPEG image + should be decompressed, relative to the start of dstBuf.
y - y offset (in pixels) of the region into which the JPEG image + should be decompressed, relative to the start of dstBuf.
desiredWidth - desired width (in pixels) of the decompressed image + (or image region.) If the desired image dimensions are different than the + dimensions of the JPEG image being decompressed, then TurboJPEG will use + scaling in the JPEG decompressor to generate the largest possible image + that will fit within the desired dimensions. Setting this to 0 is the + same as setting it to the width of the JPEG image (in other words, the + width will not be considered when determining the scaled image size.)
stride - pixels per line of the destination image. Normally, this + should be set to scaledWidth, but you can use this to, for + instance, decompress the JPEG image into a region of a larger image. + NOTE: scaledWidth can be determined by calling + scalingFactor.getScaled(jpegWidth) + or by calling getScaledWidth(int, int). Setting this parameter to + 0 is the equivalent of setting it to scaledWidth.
desiredHeight - desired height (in pixels) of the decompressed image + (or image region.) If the desired image dimensions are different than the + dimensions of the JPEG image being decompressed, then TurboJPEG will use + scaling in the JPEG decompressor to generate the largest possible image + that will fit within the desired dimensions. Setting this to 0 is the + same as setting it to the height of the JPEG image (in other words, the + height will not be considered when determining the scaled image size.)
pixelFormat - pixel format of the decompressed image (one of + TJ.PF_*)
flags - the bitwise OR of one or more of + TJ.FLAG_* +
Throws: +
java.lang.Exception
+
+
+
+

decompress

@@ -819,7 +943,10 @@ public void decompress(java.awt.image.BufferedImage dstImage,
 

Parameters:
dstImage - a BufferedImage instance that will receive - the decompressed image
flags - the bitwise OR of one or more of TJ.FLAG_* + the decompressed image. The width and height of the + BufferedImage instance must match one of the scaled image + sizes that TurboJPEG is capable of generating from the JPEG image.
flags - the bitwise OR of one or more of + TJ.FLAG_*
Throws:
java.lang.Exception
@@ -841,10 +968,13 @@ public java.awt.image.BufferedImage decompress(int desiredWidth,

Parameters:
desiredWidth - see - decompress(byte[], int, int, int, int, int) for description
desiredHeight - see - decompress(byte[], int, int, int, int, int) for description
bufferedImageType - the image type of the newly-created - BufferedImage instance (for instance, - BufferedImage.TYPE_INT_RGB)
flags - the bitwise OR of one or more of TJ.FLAG_* + decompress(byte[], int, int, int, int, int, int, int) for + description
desiredHeight - see + decompress(byte[], int, int, int, int, int, int, int) for + description
bufferedImageType - the image type of the BufferedImage + instance that will be created (for instance, + BufferedImage.TYPE_INT_RGB)
flags - the bitwise OR of one or more of + TJ.FLAG_*
Returns:
a BufferedImage instance containing the decompressed image
Throws: diff --git a/java/doc/org/libjpegturbo/turbojpeg/TJScalingFactor.html b/java/doc/org/libjpegturbo/turbojpeg/TJScalingFactor.html index 4964a29..af29fc5 100644 --- a/java/doc/org/libjpegturbo/turbojpeg/TJScalingFactor.html +++ b/java/doc/org/libjpegturbo/turbojpeg/TJScalingFactor.html @@ -2,12 +2,10 @@ - TJScalingFactor - diff --git a/java/doc/org/libjpegturbo/turbojpeg/TJTransform.html b/java/doc/org/libjpegturbo/turbojpeg/TJTransform.html index ebb9644..3a68c9f 100644 --- a/java/doc/org/libjpegturbo/turbojpeg/TJTransform.html +++ b/java/doc/org/libjpegturbo/turbojpeg/TJTransform.html @@ -2,12 +2,10 @@ - TJTransform - @@ -676,8 +674,10 @@ public TJTransform(int x,
Parameters:
x - the left boundary of the cropping region. This must be evenly divisible by the MCU block width (see TJ.getMCUWidth(int))
y - the upper boundary of the cropping region. This must be evenly divisible by the MCU block height (see TJ.getMCUHeight(int))
w - the width of the cropping region. Setting this to 0 is the - equivalent of setting it to the width of the source JPEG image - x.
h - the height of the cropping region. Setting this to 0 is the - equivalent of setting it to the height of the source JPEG image - y.
op - one of the transform operations (OP_*)
options - the bitwise OR of one or more of the transform options + equivalent of setting it to (width of the source JPEG image - + x).
h - the height of the cropping region. Setting this to 0 is the + equivalent of setting it to (height of the source JPEG image - + y).
op - one of the transform operations (OP_*)
options - the bitwise OR of one or more of the transform options (OPT_*)
cf - an instance of an object that implements the TJCustomFilter interface, or null if no custom filter is needed
Throws:
java.lang.Exception
diff --git a/java/doc/org/libjpegturbo/turbojpeg/TJTransformer.html b/java/doc/org/libjpegturbo/turbojpeg/TJTransformer.html index df81c9c..c08f358 100644 --- a/java/doc/org/libjpegturbo/turbojpeg/TJTransformer.html +++ b/java/doc/org/libjpegturbo/turbojpeg/TJTransformer.html @@ -2,12 +2,10 @@ - TJTransformer - @@ -145,7 +143,7 @@ TurboJPEG lossless transformer
          Create a TurboJPEG lossless transformer instance and associate the JPEG - image stored in jpegImage with the newly-created instance. + image stored in jpegImage with the newly created instance. TJTransformer(byte[] jpegImage, @@ -154,7 +152,7 @@ TurboJPEG lossless transformer
          Create a TurboJPEG lossless transformer instance and associate the JPEG image of length imageSize bytes stored in - jpegImage with the newly-created instance. + jpegImage with the newly created instance.   @@ -172,8 +170,8 @@ TurboJPEG lossless transformer getTransformedSizes()
-          Returns an array containing the sizes of the transformed JPEG images from - the most recent call to transform(). +          Returns an array containing the sizes of the transformed JPEG images + generated by the most recent transform operation. @@ -205,7 +203,7 @@ TurboJPEG lossless transformer Methods inherited from class org.libjpegturbo.turbojpeg.TJDecompressor -close, decompress, decompress, decompress, decompress, decompressToYUV, decompressToYUV, finalize, getHeight, getJPEGBuf, getJPEGSize, getScaledHeight, getScaledWidth, getSubsamp, getWidth, setJPEGImage +close, decompress, decompress, decompress, decompress, decompress, decompress, decompressToYUV, decompressToYUV, finalize, getHeight, getJPEGBuf, getJPEGSize, getScaledHeight, getScaledWidth, getSubsamp, getWidth, setJPEGImage   @@ -252,7 +250,7 @@ public TJTransformer(byte[] jpegImage) throws java.lang.Exception
Create a TurboJPEG lossless transformer instance and associate the JPEG - image stored in jpegImage with the newly-created instance. + image stored in jpegImage with the newly created instance.

Parameters:
jpegImage - JPEG image buffer (size of the JPEG image is assumed to @@ -271,7 +269,7 @@ public TJTransformer(byte[] jpegImage,
Create a TurboJPEG lossless transformer instance and associate the JPEG image of length imageSize bytes stored in - jpegImage with the newly-created instance. + jpegImage with the newly created instance.

Parameters:
jpegImage - JPEG image buffer
imageSize - size of the JPEG image (in bytes) @@ -303,20 +301,22 @@ public void transform(byte[][] dstBufs, JPEG image structure to another without altering the values of the coefficients. While this is typically faster than decompressing the image, transforming it, and re-compressing it, lossless transforms are not - free. Each lossless transform requires reading and Huffman decoding all - of the coefficients in the source image, regardless of the size of the - destination image. Thus, this method provides a means of generating - multiple transformed images from the same source or of applying multiple - transformations simultaneously, in order to eliminate the need to read the - source coefficients multiple times. + free. Each lossless transform requires reading and performing Huffman + decoding on all of the coefficients in the source image, regardless of the + size of the destination image. Thus, this method provides a means of + generating multiple transformed images from the same source or of applying + multiple transformations simultaneously, in order to eliminate the need to + read the source coefficients multiple times.

Parameters:
dstBufs - an array of image buffers. dstbufs[i] will receive a JPEG image that has been transformed using the parameters in transforms[i]. Use TJ.bufSize(int, int, int) to determine the - maximum size for each buffer based on the cropped width and height.
transforms - an array of TJTransform instances, each of + maximum size for each buffer based on the transformed or cropped width and + height and the level of subsampling used in the source image.
transforms - an array of TJTransform instances, each of which specifies the transform parameters and/or cropping region for the - corresponding transformed output image
flags - the bitwise OR of one or more of TJ.FLAG_* + corresponding transformed output image
flags - the bitwise OR of one or more of + TJ.FLAG_*
Throws:
java.lang.Exception
@@ -337,7 +337,8 @@ public TJTransform instances, each of which specifies the transform parameters and/or cropping region for the - corresponding transformed output image
flags - the bitwise OR of one or more of TJ.FLAG_* + corresponding transformed output image
flags - the bitwise OR of one or more of + TJ.FLAG_*
Returns:
an array of TJDecompressor instances, each of which has a transformed JPEG image associated with it
Throws: @@ -352,13 +353,13 @@ getTransformedSizes public int[] getTransformedSizes() throws java.lang.Exception
-
Returns an array containing the sizes of the transformed JPEG images from - the most recent call to transform(). +
Returns an array containing the sizes of the transformed JPEG images + generated by the most recent transform operation.

-
Returns:
an array containing the sizes of the transformed JPEG images from - the most recent call to transform() +
Returns:
an array containing the sizes of the transformed JPEG images + generated by the most recent transform operation
Throws:
java.lang.Exception
diff --git a/java/doc/org/libjpegturbo/turbojpeg/package-frame.html b/java/doc/org/libjpegturbo/turbojpeg/package-frame.html index 562e570..f160418 100644 --- a/java/doc/org/libjpegturbo/turbojpeg/package-frame.html +++ b/java/doc/org/libjpegturbo/turbojpeg/package-frame.html @@ -2,12 +2,10 @@ - org.libjpegturbo.turbojpeg - diff --git a/java/doc/org/libjpegturbo/turbojpeg/package-summary.html b/java/doc/org/libjpegturbo/turbojpeg/package-summary.html index 600546c..505512c 100644 --- a/java/doc/org/libjpegturbo/turbojpeg/package-summary.html +++ b/java/doc/org/libjpegturbo/turbojpeg/package-summary.html @@ -2,12 +2,10 @@ - org.libjpegturbo.turbojpeg - diff --git a/java/doc/org/libjpegturbo/turbojpeg/package-tree.html b/java/doc/org/libjpegturbo/turbojpeg/package-tree.html index e33355b..e13143d 100644 --- a/java/doc/org/libjpegturbo/turbojpeg/package-tree.html +++ b/java/doc/org/libjpegturbo/turbojpeg/package-tree.html @@ -2,12 +2,10 @@ - org.libjpegturbo.turbojpeg Class Hierarchy - diff --git a/java/doc/overview-tree.html b/java/doc/overview-tree.html index fc5467a..1c12b10 100644 --- a/java/doc/overview-tree.html +++ b/java/doc/overview-tree.html @@ -2,12 +2,10 @@ - Class Hierarchy - diff --git a/java/doc/serialized-form.html b/java/doc/serialized-form.html index 8c7e089..8ba0661 100644 --- a/java/doc/serialized-form.html +++ b/java/doc/serialized-form.html @@ -2,12 +2,10 @@ - Serialized Form - diff --git a/java/org/libjpegturbo/turbojpeg/TJ.java b/java/org/libjpegturbo/turbojpeg/TJ.java index 78a72f6..6c6a95d 100644 --- a/java/org/libjpegturbo/turbojpeg/TJ.java +++ b/java/org/libjpegturbo/turbojpeg/TJ.java @@ -1,5 +1,5 @@ /* - * Copyright (C)2011-2012 D. R. Commander. All Rights Reserved. + * Copyright (C)2011-2013 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -31,38 +31,39 @@ package org.libjpegturbo.turbojpeg; /** * TurboJPEG utility class (cannot be instantiated) */ -final public class TJ { +public final class TJ { /** * The number of chrominance subsampling options */ - final public static int NUMSAMP = 5; + public static final int NUMSAMP = 5; /** * 4:4:4 chrominance subsampling (no chrominance subsampling). The JPEG * or YUV image will contain one chrominance component for every pixel in the * source image. */ - final public static int SAMP_444 = 0; + public static final int SAMP_444 = 0; /** * 4:2:2 chrominance subsampling. The JPEG or YUV image will contain one * chrominance component for every 2x1 block of pixels in the source image. */ - final public static int SAMP_422 = 1; + public static final int SAMP_422 = 1; /** * 4:2:0 chrominance subsampling. The JPEG or YUV image will contain one * chrominance component for every 2x2 block of pixels in the source image. */ - final public static int SAMP_420 = 2; + public static final int SAMP_420 = 2; /** * Grayscale. The JPEG or YUV image will contain no chrominance components. */ - final public static int SAMP_GRAY = 3; + public static final int SAMP_GRAY = 3; /** * 4:4:0 chrominance subsampling. The JPEG or YUV image will contain one * chrominance component for every 1x2 block of pixels in the source image. + * Note that 4:4:0 subsampling is not fully accelerated in libjpeg-turbo. */ - final public static int SAMP_440 = 4; + public static final int SAMP_440 = 4; /** @@ -75,12 +76,12 @@ final public class TJ { * @return the MCU block width for the given level of chrominance subsampling */ public static int getMCUWidth(int subsamp) throws Exception { - if(subsamp < 0 || subsamp >= NUMSAMP) + if (subsamp < 0 || subsamp >= NUMSAMP) throw new Exception("Invalid subsampling type"); return mcuWidth[subsamp]; } - final private static int mcuWidth[] = { + private static final int[] mcuWidth = { 8, 16, 16, 8, 8 }; @@ -96,12 +97,12 @@ final public class TJ { * subsampling */ public static int getMCUHeight(int subsamp) throws Exception { - if(subsamp < 0 || subsamp >= NUMSAMP) + if (subsamp < 0 || subsamp >= NUMSAMP) throw new Exception("Invalid subsampling type"); return mcuHeight[subsamp]; } - final private static int mcuHeight[] = { + private static final int[] mcuHeight = { 8, 8, 16, 8, 16 }; @@ -109,92 +110,92 @@ final public class TJ { /** * The number of pixel formats */ - final public static int NUMPF = 11; + public static final int NUMPF = 11; /** * RGB pixel format. The red, green, and blue components in the image are * stored in 3-byte pixels in the order R, G, B from lowest to highest byte * address within each pixel. */ - final public static int PF_RGB = 0; + public static final int PF_RGB = 0; /** * BGR pixel format. The red, green, and blue components in the image are * stored in 3-byte pixels in the order B, G, R from lowest to highest byte * address within each pixel. */ - final public static int PF_BGR = 1; + public static final int PF_BGR = 1; /** * RGBX pixel format. The red, green, and blue components in the image are * stored in 4-byte pixels in the order R, G, B from lowest to highest byte * address within each pixel. The X component is ignored when compressing * and undefined when decompressing. */ - final public static int PF_RGBX = 2; + public static final int PF_RGBX = 2; /** * BGRX pixel format. The red, green, and blue components in the image are * stored in 4-byte pixels in the order B, G, R from lowest to highest byte * address within each pixel. The X component is ignored when compressing * and undefined when decompressing. */ - final public static int PF_BGRX = 3; + public static final int PF_BGRX = 3; /** * XBGR pixel format. The red, green, and blue components in the image are * stored in 4-byte pixels in the order R, G, B from highest to lowest byte * address within each pixel. The X component is ignored when compressing * and undefined when decompressing. */ - final public static int PF_XBGR = 4; + public static final int PF_XBGR = 4; /** * XRGB pixel format. The red, green, and blue components in the image are * stored in 4-byte pixels in the order B, G, R from highest to lowest byte * address within each pixel. The X component is ignored when compressing * and undefined when decompressing. */ - final public static int PF_XRGB = 5; + public static final int PF_XRGB = 5; /** * Grayscale pixel format. Each 1-byte pixel represents a luminance * (brightness) level from 0 to 255. */ - final public static int PF_GRAY = 6; + public static final int PF_GRAY = 6; /** * RGBA pixel format. This is the same as {@link #PF_RGBX}, except that when * decompressing, the X byte is guaranteed to be 0xFF, which can be * interpreted as an opaque alpha channel. */ - final public static int PF_RGBA = 7; + public static final int PF_RGBA = 7; /** * BGRA pixel format. This is the same as {@link #PF_BGRX}, except that when * decompressing, the X byte is guaranteed to be 0xFF, which can be * interpreted as an opaque alpha channel. */ - final public static int PF_BGRA = 8; + public static final int PF_BGRA = 8; /** * ABGR pixel format. This is the same as {@link #PF_XBGR}, except that when * decompressing, the X byte is guaranteed to be 0xFF, which can be * interpreted as an opaque alpha channel. */ - final public static int PF_ABGR = 9; + public static final int PF_ABGR = 9; /** * ARGB pixel format. This is the same as {@link #PF_XRGB}, except that when * decompressing, the X byte is guaranteed to be 0xFF, which can be * interpreted as an opaque alpha channel. */ - final public static int PF_ARGB = 10; + public static final int PF_ARGB = 10; /** - * Returns the pixel size (in bytes) of the given pixel format. + * Returns the pixel size (in bytes) for the given pixel format. * * @param pixelFormat the pixel format (one of PF_*) * - * @return the pixel size (in bytes) of the given pixel format + * @return the pixel size (in bytes) for the given pixel format */ public static int getPixelSize(int pixelFormat) throws Exception { - if(pixelFormat < 0 || pixelFormat >= NUMPF) + if (pixelFormat < 0 || pixelFormat >= NUMPF) throw new Exception("Invalid pixel format"); return pixelSize[pixelFormat]; } - final private static int pixelSize[] = { + private static final int[] pixelSize = { 3, 3, 4, 4, 4, 4, 1, 4, 4, 4, 4 }; @@ -211,12 +212,12 @@ final public class TJ { * @return the red offset for the given pixel format */ public static int getRedOffset(int pixelFormat) throws Exception { - if(pixelFormat < 0 || pixelFormat >= NUMPF) + if (pixelFormat < 0 || pixelFormat >= NUMPF) throw new Exception("Invalid pixel format"); return redOffset[pixelFormat]; } - final private static int redOffset[] = { + private static final int[] redOffset = { 0, 2, 0, 2, 3, 1, 0, 0, 2, 3, 1 }; @@ -233,12 +234,12 @@ final public class TJ { * @return the green offset for the given pixel format */ public static int getGreenOffset(int pixelFormat) throws Exception { - if(pixelFormat < 0 || pixelFormat >= NUMPF) + if (pixelFormat < 0 || pixelFormat >= NUMPF) throw new Exception("Invalid pixel format"); return greenOffset[pixelFormat]; } - final private static int greenOffset[] = { + private static final int[] greenOffset = { 1, 1, 1, 1, 2, 2, 0, 1, 1, 2, 2 }; @@ -255,12 +256,12 @@ final public class TJ { * @return the blue offset for the given pixel format */ public static int getBlueOffset(int pixelFormat) throws Exception { - if(pixelFormat < 0 || pixelFormat >= NUMPF) + if (pixelFormat < 0 || pixelFormat >= NUMPF) throw new Exception("Invalid pixel format"); return blueOffset[pixelFormat]; } - final private static int blueOffset[] = { + private static final int[] blueOffset = { 2, 0, 2, 0, 1, 3, 0, 2, 0, 1, 3 }; @@ -269,60 +270,59 @@ final public class TJ { * The uncompressed source/destination image is stored in bottom-up (Windows, * OpenGL) order, not top-down (X11) order. */ - final public static int FLAG_BOTTOMUP = 2; + public static final int FLAG_BOTTOMUP = 2; /** * Turn off CPU auto-detection and force TurboJPEG to use MMX code * (if the underlying codec supports it.) */ - final public static int FLAG_FORCEMMX = 8; + public static final int FLAG_FORCEMMX = 8; /** * Turn off CPU auto-detection and force TurboJPEG to use SSE code * (if the underlying codec supports it.) */ - final public static int FLAG_FORCESSE = 16; + public static final int FLAG_FORCESSE = 16; /** * Turn off CPU auto-detection and force TurboJPEG to use SSE2 code * (if the underlying codec supports it.) */ - final public static int FLAG_FORCESSE2 = 32; + public static final int FLAG_FORCESSE2 = 32; /** * Turn off CPU auto-detection and force TurboJPEG to use SSE3 code * (if the underlying codec supports it.) */ - final public static int FLAG_FORCESSE3 = 128; + public static final int FLAG_FORCESSE3 = 128; /** - * When decompressing, use the fastest chrominance upsampling algorithm - * available in the underlying codec. The default is to use smooth - * upsampling, which creates a smooth transition between neighboring - * chrominance components in order to reduce upsampling artifacts in the - * decompressed image. + * When decompressing an image that was compressed using chrominance + * subsampling, use the fastest chrominance upsampling algorithm available in + * the underlying codec. The default is to use smooth upsampling, which + * creates a smooth transition between neighboring chrominance components in + * order to reduce upsampling artifacts in the decompressed image. */ - final public static int FLAG_FASTUPSAMPLE = 256; + public static final int FLAG_FASTUPSAMPLE = 256; /** * Use the fastest DCT/IDCT algorithm available in the underlying codec. The - * default if this flag is not specified is implementation-specific. The - * libjpeg implementation, for example, uses the fast algorithm by default - * when compressing, because this has been shown to have only a very slight - * effect on accuracy, but it uses the accurate algorithm when decompressing, - * because this has been shown to have a larger effect. + * default if this flag is not specified is implementation-specific. For + * example, the implementation of TurboJPEG for libjpeg[-turbo] uses the fast + * algorithm by default when compressing, because this has been shown to have + * only a very slight effect on accuracy, but it uses the accurate algorithm + * when decompressing, because this has been shown to have a larger effect. */ - final public static int FLAG_FASTDCT = 2048; + public static final int FLAG_FASTDCT = 2048; /** * Use the most accurate DCT/IDCT algorithm available in the underlying * codec. The default if this flag is not specified is - * implementation-specific. The libjpeg implementation, for example, uses - * the fast algorithm by default when compressing, because this has been - * shown to have only a very slight effect on accuracy, but it uses the - * accurate algorithm when decompressing, because this has been shown to have - * a larger effect. + * implementation-specific. For example, the implementation of TurboJPEG for + * libjpeg[-turbo] uses the fast algorithm by default when compressing, + * because this has been shown to have only a very slight effect on accuracy, + * but it uses the accurate algorithm when decompressing, because this has + * been shown to have a larger effect. */ - final public static int FLAG_ACCURATEDCT = 4096; + public static final int FLAG_ACCURATEDCT = 4096; /** * Returns the maximum size of the buffer (in bytes) required to hold a JPEG - * image with the given width and height, and level of chrominance - * subsampling. + * image with the given width, height, and level of chrominance subsampling. * * @param width the width (in pixels) of the JPEG image * @@ -332,10 +332,9 @@ final public class TJ { * generating the JPEG image (one of {@link TJ TJ.SAMP_*}) * * @return the maximum size of the buffer (in bytes) required to hold a JPEG - * image with the given width and height, and level of chrominance - * subsampling + * image with the given width, height, and level of chrominance subsampling */ - public native static int bufSize(int width, int height, int jpegSubsamp) + public static native int bufSize(int width, int height, int jpegSubsamp) throws Exception; /** @@ -352,8 +351,7 @@ final public class TJ { * @return the size of the buffer (in bytes) required to hold a YUV planar * image with the given width, height, and level of chrominance subsampling */ - public native static int bufSizeYUV(int width, int height, - int subsamp) + public static native int bufSizeYUV(int width, int height, int subsamp) throws Exception; /** @@ -363,7 +361,7 @@ final public class TJ { * @return a list of fractional scaling factors that the JPEG decompressor in * this implementation of TurboJPEG supports */ - public native static TJScalingFactor[] getScalingFactors() + public static native TJScalingFactor[] getScalingFactors() throws Exception; static { diff --git a/java/org/libjpegturbo/turbojpeg/TJCompressor.java b/java/org/libjpegturbo/turbojpeg/TJCompressor.java index b3c9b95..6fb653f 100644 --- a/java/org/libjpegturbo/turbojpeg/TJCompressor.java +++ b/java/org/libjpegturbo/turbojpeg/TJCompressor.java @@ -1,5 +1,5 @@ /* - * Copyright (C)2011 D. R. Commander. All Rights Reserved. + * Copyright (C)2011-2014 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -36,7 +36,7 @@ import java.nio.*; */ public class TJCompressor { - private final static String NO_ASSOC_ERROR = + private static final String NO_ASSOC_ERROR = "No source image is associated with this instance"; /** @@ -48,21 +48,36 @@ public class TJCompressor { /** * Create a TurboJPEG compressor instance and associate the uncompressed - * source image stored in srcImage with the newly-created + * source image stored in srcImage with the newly created * instance. * * @param srcImage see {@link #setSourceImage} for description * + * @param x see {@link #setSourceImage} for description + * + * @param y see {@link #setSourceImage} for description + * * @param width see {@link #setSourceImage} for description * * @param pitch see {@link #setSourceImage} for description * * @param height see {@link #setSourceImage} for description * - * @param pixelFormat see {@link #setSourceImage} for description + * @param pixelFormat pixel format of the source image (one of + * {@link TJ#PF_RGB TJ.PF_*}) + */ + public TJCompressor(byte[] srcImage, int x, int y, int width, int pitch, + int height, int pixelFormat) throws Exception { + setSourceImage(srcImage, x, y, width, pitch, height, pixelFormat); + } + + /** + * @deprecated Use + * {@link #TJCompressor(byte[], int, int, int, int, int, int)} instead. */ + @Deprecated public TJCompressor(byte[] srcImage, int width, int pitch, int height, - int pixelFormat) throws Exception { + int pixelFormat) throws Exception { setSourceImage(srcImage, width, pitch, height, pixelFormat); } @@ -70,47 +85,73 @@ public class TJCompressor { * Associate an uncompressed source image with this compressor instance. * * @param srcImage image buffer containing RGB or grayscale pixels to be - * compressed + * compressed or encoded + * + * @param x x offset (in pixels) of the region in the source image from which + * the JPEG or YUV image should be compressed/encoded * - * @param width width (in pixels) of the source image + * @param y y offset (in pixels) of the region in the source image from which + * the JPEG or YUV image should be compressed/encoded + * + * @param width width (in pixels) of the region in the source image from + * which the JPEG or YUV image should be compressed/encoded * * @param pitch bytes per line of the source image. Normally, this should be * width * TJ.pixelSize(pixelFormat) if the source image is * unpadded, but you can use this parameter to, for instance, specify that - * the scanlines in the source image are padded to 4-byte boundaries, as is - * the case for Windows bitmaps. You can also be clever and use this - * parameter to skip lines, etc. Setting this parameter to 0 is the - * equivalent of setting it to width * - * TJ.pixelSize(pixelFormat). + * the scanlines in the source image are padded to a 4-byte boundary or to + * compress/encode a JPEG or YUV image from a region of a larger source + * image. You can also be clever and use this parameter to skip lines, etc. + * Setting this parameter to 0 is the equivalent of setting it to + * width * TJ.pixelSize(pixelFormat). * - * @param height height (in pixels) of the source image + * @param height height (in pixels) of the region in the source image from + * which the JPEG or YUV image should be compressed/encoded * * @param pixelFormat pixel format of the source image (one of - * {@link TJ TJ.PF_*}) + * {@link TJ#PF_RGB TJ.PF_*}) */ - public void setSourceImage(byte[] srcImage, int width, int pitch, - int height, int pixelFormat) throws Exception { - if(handle == 0) init(); - if(srcImage == null || width < 1 || height < 1 || pitch < 0 - || pixelFormat < 0 || pixelFormat >= TJ.NUMPF) + public void setSourceImage(byte[] srcImage, int x, int y, int width, + int pitch, int height, int pixelFormat) + throws Exception { + if (handle == 0) init(); + if (srcImage == null || x < 0 || y < 0 || width < 1 || height < 1 || + pitch < 0 || pixelFormat < 0 || pixelFormat >= TJ.NUMPF) throw new Exception("Invalid argument in setSourceImage()"); srcBuf = srcImage; srcWidth = width; - if(pitch == 0) srcPitch = width * TJ.getPixelSize(pixelFormat); - else srcPitch = pitch; + if (pitch == 0) + srcPitch = width * TJ.getPixelSize(pixelFormat); + else + srcPitch = pitch; srcHeight = height; srcPixelFormat = pixelFormat; + srcX = x; + srcY = y; } /** + * @deprecated Use + * {@link #setSourceImage(byte[], int, int, int, int, int, int)} instead. + */ + @Deprecated + public void setSourceImage(byte[] srcImage, int width, int pitch, + int height, int pixelFormat) throws Exception { + setSourceImage(srcImage, 0, 0, width, pitch, height, pixelFormat); + srcX = srcY = -1; + } + + + /** * Set the level of chrominance subsampling for subsequent compress/encode * operations. * - * @param newSubsamp the new level of chrominance subsampling (one of - * {@link TJ TJ.SAMP_*}) + * @param newSubsamp the level of chrominance subsampling to use in + * subsequent compress/encode operations (one of + * {@link TJ#SAMP_444 TJ.SAMP_*}) */ public void setSubsamp(int newSubsamp) throws Exception { - if(newSubsamp < 0 || newSubsamp >= TJ.NUMSAMP) + if (newSubsamp < 0 || newSubsamp >= TJ.NUMSAMP) throw new Exception("Invalid argument in setSubsamp()"); subsamp = newSubsamp; } @@ -122,7 +163,7 @@ public class TJCompressor { * 100 = best) */ public void setJPEGQuality(int quality) throws Exception { - if(quality < 1 || quality > 100) + if (quality < 1 || quality > 100) throw new Exception("Invalid argument in setJPEGQuality()"); jpegQuality = quality; } @@ -133,32 +174,44 @@ public class TJCompressor { * * @param dstBuf buffer that will receive the JPEG image. Use * {@link TJ#bufSize} to determine the maximum size for this buffer based on - * the image width and height. + * the source image's width and height and the desired level of chrominance + * subsampling. * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} */ public void compress(byte[] dstBuf, int flags) throws Exception { - if(dstBuf == null || flags < 0) + if (dstBuf == null || flags < 0) throw new Exception("Invalid argument in compress()"); - if(srcBuf == null) throw new Exception(NO_ASSOC_ERROR); - if(jpegQuality < 0) throw new Exception("JPEG Quality not set"); - if(subsamp < 0) throw new Exception("Subsampling level not set"); - compressedSize = compress(srcBuf, srcWidth, srcPitch, - srcHeight, srcPixelFormat, dstBuf, subsamp, jpegQuality, flags); + if (srcBuf == null) + throw new Exception(NO_ASSOC_ERROR); + if (jpegQuality < 0) + throw new Exception("JPEG Quality not set"); + if (subsamp < 0) + throw new Exception("Subsampling level not set"); + if (srcX >= 0 && srcY >= 0) + compressedSize = compress(srcBuf, srcX, srcY, srcWidth, srcPitch, + srcHeight, srcPixelFormat, dstBuf, subsamp, + jpegQuality, flags); + else + compressedSize = compress(srcBuf, srcWidth, srcPitch, srcHeight, + srcPixelFormat, dstBuf, subsamp, jpegQuality, + flags); } /** * Compress the uncompressed source image associated with this compressor * instance and return a buffer containing a JPEG image. * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} * * @return a buffer containing a JPEG image. The length of this buffer will * not be equal to the size of the JPEG image. Use {@link * #getCompressedSize} to obtain the size of the JPEG image. */ public byte[] compress(int flags) throws Exception { - if(srcWidth < 1 || srcHeight < 1) + if (srcWidth < 1 || srcHeight < 1) throw new Exception(NO_ASSOC_ERROR); byte[] buf = new byte[TJ.bufSize(srcWidth, srcHeight, subsamp)]; compress(buf, flags); @@ -174,18 +227,20 @@ public class TJCompressor { * * @param dstBuf buffer that will receive the JPEG image. Use * {@link TJ#bufSize} to determine the maximum size for this buffer based on - * the image width and height. + * the image width, height, and level of chrominance subsampling. * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} */ public void compress(BufferedImage srcImage, byte[] dstBuf, int flags) - throws Exception { - if(srcImage == null || dstBuf == null || flags < 0) + throws Exception { + if (srcImage == null || dstBuf == null || flags < 0) throw new Exception("Invalid argument in compress()"); int width = srcImage.getWidth(); int height = srcImage.getHeight(); - int pixelFormat; boolean intPixels = false; - if(byteOrder == null) + int pixelFormat; + boolean intPixels = false; + if (byteOrder == null) byteOrder = ByteOrder.nativeOrder(); switch(srcImage.getType()) { case BufferedImage.TYPE_3BYTE_BGR: @@ -196,7 +251,7 @@ public class TJCompressor { case BufferedImage.TYPE_BYTE_GRAY: pixelFormat = TJ.PF_GRAY; break; case BufferedImage.TYPE_INT_BGR: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XBGR; else pixelFormat = TJ.PF_RGBX; @@ -204,7 +259,7 @@ public class TJCompressor { case BufferedImage.TYPE_INT_RGB: case BufferedImage.TYPE_INT_ARGB: case BufferedImage.TYPE_INT_ARGB_PRE: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XRGB; else pixelFormat = TJ.PF_BGRX; @@ -213,28 +268,39 @@ public class TJCompressor { throw new Exception("Unsupported BufferedImage format"); } WritableRaster wr = srcImage.getRaster(); - if(jpegQuality < 0) throw new Exception("JPEG Quality not set"); - if(subsamp < 0) throw new Exception("Subsampling level not set"); - if(intPixels) { + if (jpegQuality < 0) + throw new Exception("JPEG Quality not set"); + if (subsamp < 0) + throw new Exception("Subsampling level not set"); + if (intPixels) { SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)srcImage.getSampleModel(); - int pitch = sm.getScanlineStride(); + int stride = sm.getScanlineStride(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); int[] buf = db.getData(); - compressedSize = compress(buf, width, pitch, height, pixelFormat, dstBuf, - subsamp, jpegQuality, flags); - } - else { + if (srcX >= 0 && srcY >= 0) + compressedSize = compress(buf, srcX, srcY, width, stride, height, + pixelFormat, dstBuf, subsamp, jpegQuality, + flags); + else + compressedSize = compress(buf, width, stride, height, pixelFormat, + dstBuf, subsamp, jpegQuality, flags); + } else { ComponentSampleModel sm = (ComponentSampleModel)srcImage.getSampleModel(); int pixelSize = sm.getPixelStride(); - if(pixelSize != TJ.getPixelSize(pixelFormat)) + if (pixelSize != TJ.getPixelSize(pixelFormat)) throw new Exception("Inconsistency between pixel format and pixel size in BufferedImage"); int pitch = sm.getScanlineStride(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); byte[] buf = db.getData(); - compressedSize = compress(buf, width, pitch, height, pixelFormat, dstBuf, - subsamp, jpegQuality, flags); + if (srcX >= 0 && srcY >= 0) + compressedSize = compress(buf, srcX, srcY, width, pitch, height, + pixelFormat, dstBuf, subsamp, jpegQuality, + flags); + else + compressedSize = compress(buf, width, pitch, height, pixelFormat, + dstBuf, subsamp, jpegQuality, flags); } } @@ -245,7 +311,8 @@ public class TJCompressor { * @param srcImage a BufferedImage instance containing RGB or * grayscale pixels to be compressed * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} * * @return a buffer containing a JPEG image. The length of this buffer will * not be equal to the size of the JPEG image. Use {@link @@ -266,27 +333,34 @@ public class TJCompressor { * TurboJPEG's underlying codec to produce a planar YUV image that is * suitable for direct video display. Specifically, if the chrominance * components are subsampled along the horizontal dimension, then the width - * of the luminance plane is padded to 2 in the output image (same goes for - * the height of the luminance plane, if the chrominance components are - * subsampled along the vertical dimension.) Also, each line of each plane - * in the output image is padded to 4 bytes. Although this will work with - * any subsampling option, it is really only useful in combination with - * {@link TJ#SAMP_420}, which produces an image compatible with the I420 (AKA - * "YUV420P") format. + * of the luminance plane is padded to the nearest multiple of 2 in the + * output image (same goes for the height of the luminance plane, if the + * chrominance components are subsampled along the vertical dimension.) + * Also, each line of each plane in the output image is padded to 4 bytes. + * Although this will work with any subsampling option, it is really only + * useful in combination with {@link TJ#SAMP_420}, which produces an image + * compatible with the I420 (AKA "YUV420P") format. + *

+ * NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the + * convention of the digital video community, the TurboJPEG API uses "YUV" to + * refer to an image format consisting of Y, Cb, and Cr image planes. * * @param dstBuf buffer that will receive the YUV planar image. Use * {@link TJ#bufSizeYUV} to determine the appropriate size for this buffer * based on the image width, height, and level of chrominance subsampling. * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} */ public void encodeYUV(byte[] dstBuf, int flags) throws Exception { - if(dstBuf == null || flags < 0) + if (dstBuf == null || flags < 0) throw new Exception("Invalid argument in compress()"); - if(srcBuf == null) throw new Exception(NO_ASSOC_ERROR); - if(subsamp < 0) throw new Exception("Subsampling level not set"); + if (srcBuf == null) + throw new Exception(NO_ASSOC_ERROR); + if (subsamp < 0) + throw new Exception("Subsampling level not set"); encodeYUV(srcBuf, srcWidth, srcPitch, srcHeight, - srcPixelFormat, dstBuf, subsamp, flags); + srcPixelFormat, dstBuf, subsamp, flags); compressedSize = TJ.bufSizeYUV(srcWidth, srcHeight, subsamp); } @@ -295,14 +369,16 @@ public class TJCompressor { * instance and return a buffer containing a YUV planar image. See * {@link #encodeYUV(byte[], int)} for more detail. * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} * * @return a buffer containing a YUV planar image */ public byte[] encodeYUV(int flags) throws Exception { - if(srcWidth < 1 || srcHeight < 1) + if (srcWidth < 1 || srcHeight < 1) throw new Exception(NO_ASSOC_ERROR); - if(subsamp < 0) throw new Exception("Subsampling level not set"); + if (subsamp < 0) + throw new Exception("Subsampling level not set"); byte[] buf = new byte[TJ.bufSizeYUV(srcWidth, srcHeight, subsamp)]; encodeYUV(buf, flags); return buf; @@ -320,16 +396,17 @@ public class TJCompressor { * {@link TJ#bufSizeYUV} to determine the appropriate size for this buffer * based on the image width, height, and level of chrominance subsampling. * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} */ public void encodeYUV(BufferedImage srcImage, byte[] dstBuf, int flags) throws Exception { - if(srcImage == null || dstBuf == null || flags < 0) + if (srcImage == null || dstBuf == null || flags < 0) throw new Exception("Invalid argument in encodeYUV()"); int width = srcImage.getWidth(); int height = srcImage.getHeight(); int pixelFormat; boolean intPixels = false; - if(byteOrder == null) + if (byteOrder == null) byteOrder = ByteOrder.nativeOrder(); switch(srcImage.getType()) { case BufferedImage.TYPE_3BYTE_BGR: @@ -340,7 +417,7 @@ public class TJCompressor { case BufferedImage.TYPE_BYTE_GRAY: pixelFormat = TJ.PF_GRAY; break; case BufferedImage.TYPE_INT_BGR: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XBGR; else pixelFormat = TJ.PF_RGBX; @@ -348,7 +425,7 @@ public class TJCompressor { case BufferedImage.TYPE_INT_RGB: case BufferedImage.TYPE_INT_ARGB: case BufferedImage.TYPE_INT_ARGB_PRE: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XRGB; else pixelFormat = TJ.PF_BGRX; @@ -357,27 +434,26 @@ public class TJCompressor { throw new Exception("Unsupported BufferedImage format"); } WritableRaster wr = srcImage.getRaster(); - if(subsamp < 0) throw new Exception("Subsampling level not set"); - if(intPixels) { + if (subsamp < 0) throw new Exception("Subsampling level not set"); + if (intPixels) { SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)srcImage.getSampleModel(); - int pitch = sm.getScanlineStride(); + int stride = sm.getScanlineStride(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); int[] buf = db.getData(); - encodeYUV(buf, width, pitch, height, pixelFormat, dstBuf, subsamp, - flags); - } - else { + encodeYUV(buf, width, stride, height, pixelFormat, dstBuf, subsamp, + flags); + } else { ComponentSampleModel sm = (ComponentSampleModel)srcImage.getSampleModel(); int pixelSize = sm.getPixelStride(); - if(pixelSize != TJ.getPixelSize(pixelFormat)) + if (pixelSize != TJ.getPixelSize(pixelFormat)) throw new Exception("Inconsistency between pixel format and pixel size in BufferedImage"); int pitch = sm.getScanlineStride(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); byte[] buf = db.getData(); encodeYUV(buf, width, pitch, height, pixelFormat, dstBuf, subsamp, - flags); + flags); } compressedSize = TJ.bufSizeYUV(width, height, subsamp); } @@ -390,13 +466,14 @@ public class TJCompressor { * @param srcImage a BufferedImage instance containing RGB or * grayscale pixels to be encoded * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} * * @return a buffer containing a YUV planar image */ - public byte[] encodeYUV(BufferedImage srcImage, int flags) - throws Exception { - if(subsamp < 0) throw new Exception("Subsampling level not set"); + public byte[] encodeYUV(BufferedImage srcImage, int flags) throws Exception { + if (subsamp < 0) + throw new Exception("Subsampling level not set"); int width = srcImage.getWidth(); int height = srcImage.getHeight(); byte[] buf = new byte[TJ.bufSizeYUV(width, height, subsamp)]; @@ -425,9 +502,8 @@ public class TJCompressor { protected void finalize() throws Throwable { try { close(); - } - catch(Exception e) {} - finally { + } catch(Exception e) { + } finally { super.finalize(); } }; @@ -438,19 +514,27 @@ public class TJCompressor { // JPEG size in bytes is returned private native int compress(byte[] srcBuf, int width, int pitch, - int height, int pixelFormat, byte[] dstbuf, int jpegSubsamp, int jpegQual, - int flags) throws Exception; + int height, int pixelFormat, byte[] dstBuf, int jpegSubsamp, int jpegQual, + int flags) throws Exception; // deprecated + + private native int compress(byte[] srcBuf, int x, int y, int width, + int pitch, int height, int pixelFormat, byte[] dstBuf, int jpegSubsamp, + int jpegQual, int flags) throws Exception; + + private native int compress(int[] srcBuf, int width, int stride, + int height, int pixelFormat, byte[] dstBuf, int jpegSubsamp, int jpegQual, + int flags) throws Exception; // deprecated - private native int compress(int[] srcBuf, int width, int pitch, - int height, int pixelFormat, byte[] dstbuf, int jpegSubsamp, int jpegQual, - int flags) throws Exception; + private native int compress(int[] srcBuf, int x, int y, int width, + int stride, int height, int pixelFormat, byte[] dstBuf, int jpegSubsamp, + int jpegQual, int flags) throws Exception; private native void encodeYUV(byte[] srcBuf, int width, int pitch, - int height, int pixelFormat, byte[] dstbuf, int subsamp, int flags) + int height, int pixelFormat, byte[] dstBuf, int subsamp, int flags) throws Exception; - private native void encodeYUV(int[] srcBuf, int width, int pitch, - int height, int pixelFormat, byte[] dstbuf, int subsamp, int flags) + private native void encodeYUV(int[] srcBuf, int width, int stride, + int height, int pixelFormat, byte[] dstBuf, int subsamp, int flags) throws Exception; static { @@ -461,6 +545,8 @@ public class TJCompressor { private byte[] srcBuf = null; private int srcWidth = 0; private int srcHeight = 0; + private int srcX = -1; + private int srcY = -1; private int srcPitch = 0; private int srcPixelFormat = -1; private int subsamp = -1; diff --git a/java/org/libjpegturbo/turbojpeg/TJCustomFilter.java b/java/org/libjpegturbo/turbojpeg/TJCustomFilter.java index 711225b..bf78f2e 100644 --- a/java/org/libjpegturbo/turbojpeg/TJCustomFilter.java +++ b/java/org/libjpegturbo/turbojpeg/TJCustomFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (C)2011 D. R. Commander. All Rights Reserved. + * Copyright (C)2011, 2013 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -39,7 +39,7 @@ public interface TJCustomFilter { /** * A callback function that can be used to modify the DCT coefficients after * they are losslessly transformed but before they are transcoded to a new - * JPEG file. This allows for custom filters or other transformations to be + * JPEG image. This allows for custom filters or other transformations to be * applied in the frequency domain. * * @param coeffBuffer a buffer containing transformed DCT coefficients. @@ -58,19 +58,19 @@ public interface TJCustomFilter { * component plane to which coeffBuffer belongs * * @param componentID ID number of the component plane to which - * coeffBufferbelongs (Y, Cb, and Cr have, respectively, ID's of - * 0, 1, and 2 in typical JPEG images.) + * coeffBuffer belongs (Y, Cb, and Cr have, respectively, ID's + * of 0, 1, and 2 in typical JPEG images.) * * @param transformID ID number of the transformed image to which * coeffBuffer belongs. This is the same as the index of the - * transform in the transforms array that was passed to {@link + * transform in the transforms array that was passed to {@link * TJTransformer#transform TJTransformer.transform()}. * * @param transform a {@link TJTransform} instance that specifies the * parameters and/or cropping region for this transform */ - public void customFilter(ShortBuffer coeffBuffer, Rectangle bufferRegion, - Rectangle planeRegion, int componentID, int transformID, - TJTransform transform) + void customFilter(ShortBuffer coeffBuffer, Rectangle bufferRegion, + Rectangle planeRegion, int componentID, int transformID, + TJTransform transform) throws Exception; } diff --git a/java/org/libjpegturbo/turbojpeg/TJDecompressor.java b/java/org/libjpegturbo/turbojpeg/TJDecompressor.java index de6cacc..ec8ab77 100644 --- a/java/org/libjpegturbo/turbojpeg/TJDecompressor.java +++ b/java/org/libjpegturbo/turbojpeg/TJDecompressor.java @@ -1,5 +1,5 @@ /* - * Copyright (C)2011 D. R. Commander. All Rights Reserved. + * Copyright (C)2011-2014 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -36,7 +36,7 @@ import java.nio.*; */ public class TJDecompressor { - private final static String NO_ASSOC_ERROR = + private static final String NO_ASSOC_ERROR = "No JPEG image is associated with this instance"; /** @@ -48,7 +48,7 @@ public class TJDecompressor { /** * Create a TurboJPEG decompressor instance and associate the JPEG image - * stored in jpegImage with the newly-created instance. + * stored in jpegImage with the newly created instance. * * @param jpegImage JPEG image buffer (size of the JPEG image is assumed to * be the length of the array) @@ -61,7 +61,7 @@ public class TJDecompressor { /** * Create a TurboJPEG decompressor instance and associate the JPEG image * of length imageSize bytes stored in jpegImage - * with the newly-created instance. + * with the newly created instance. * * @param jpegImage JPEG image buffer * @@ -82,7 +82,7 @@ public class TJDecompressor { * @param imageSize size of the JPEG image (in bytes) */ public void setJPEGImage(byte[] jpegImage, int imageSize) throws Exception { - if(jpegImage == null || imageSize < 1) + if (jpegImage == null || imageSize < 1) throw new Exception("Invalid argument in setJPEGImage()"); jpegBuf = jpegImage; jpegBufSize = imageSize; @@ -97,7 +97,8 @@ public class TJDecompressor { * instance */ public int getWidth() throws Exception { - if(jpegWidth < 1) throw new Exception(NO_ASSOC_ERROR); + if (jpegWidth < 1) + throw new Exception(NO_ASSOC_ERROR); return jpegWidth; } @@ -109,20 +110,22 @@ public class TJDecompressor { * instance */ public int getHeight() throws Exception { - if(jpegHeight < 1) throw new Exception(NO_ASSOC_ERROR); + if (jpegHeight < 1) + throw new Exception(NO_ASSOC_ERROR); return jpegHeight; } /** * Returns the level of chrominance subsampling used in the JPEG image - * associated with this decompressor instance. + * associated with this decompressor instance. See {@link TJ TJ.SAMP_*}. * * @return the level of chrominance subsampling used in the JPEG image * associated with this decompressor instance */ public int getSubsamp() throws Exception { - if(jpegSubsamp < 0) throw new Exception(NO_ASSOC_ERROR); - if(jpegSubsamp >= TJ.NUMSAMP) + if (jpegSubsamp < 0) + throw new Exception(NO_ASSOC_ERROR); + if (jpegSubsamp >= TJ.NUMSAMP) throw new Exception("JPEG header information is invalid"); return jpegSubsamp; } @@ -133,7 +136,8 @@ public class TJDecompressor { * @return the JPEG image buffer associated with this decompressor instance */ public byte[] getJPEGBuf() throws Exception { - if(jpegBuf == null) throw new Exception(NO_ASSOC_ERROR); + if (jpegBuf == null) + throw new Exception(NO_ASSOC_ERROR); return jpegBuf; } @@ -145,13 +149,13 @@ public class TJDecompressor { * decompressor instance */ public int getJPEGSize() throws Exception { - if(jpegBufSize < 1) throw new Exception(NO_ASSOC_ERROR); + if (jpegBufSize < 1) + throw new Exception(NO_ASSOC_ERROR); return jpegBufSize; } - /** - * Returns the width of the largest scaled down image that the TurboJPEG + * Returns the width of the largest scaled-down image that the TurboJPEG * decompressor can generate without exceeding the desired image width and * height. * @@ -165,33 +169,35 @@ public class TJDecompressor { * image (in other words, the height will not be considered when determining * the scaled image size.) * - * @return the width of the largest scaled down image that the TurboJPEG + * @return the width of the largest scaled-down image that the TurboJPEG * decompressor can generate without exceeding the desired image width and * height */ public int getScaledWidth(int desiredWidth, int desiredHeight) - throws Exception { - if(jpegWidth < 1 || jpegHeight < 1) + throws Exception { + if (jpegWidth < 1 || jpegHeight < 1) throw new Exception(NO_ASSOC_ERROR); - if(desiredWidth < 0 || desiredHeight < 0) + if (desiredWidth < 0 || desiredHeight < 0) throw new Exception("Invalid argument in getScaledWidth()"); - TJScalingFactor sf[] = TJ.getScalingFactors(); - if(desiredWidth == 0) desiredWidth = jpegWidth; - if(desiredHeight == 0) desiredHeight = jpegHeight; + TJScalingFactor[] sf = TJ.getScalingFactors(); + if (desiredWidth == 0) + desiredWidth = jpegWidth; + if (desiredHeight == 0) + desiredHeight = jpegHeight; int scaledWidth = jpegWidth, scaledHeight = jpegHeight; - for(int i = 0; i < sf.length; i++) { + for (int i = 0; i < sf.length; i++) { scaledWidth = sf[i].getScaled(jpegWidth); scaledHeight = sf[i].getScaled(jpegHeight); - if(scaledWidth <= desiredWidth && scaledHeight <= desiredHeight) + if (scaledWidth <= desiredWidth && scaledHeight <= desiredHeight) break; } - if(scaledWidth > desiredWidth || scaledHeight > desiredHeight) + if (scaledWidth > desiredWidth || scaledHeight > desiredHeight) throw new Exception("Could not scale down to desired image dimensions"); return scaledWidth; } /** - * Returns the height of the largest scaled down image that the TurboJPEG + * Returns the height of the largest scaled-down image that the TurboJPEG * decompressor can generate without exceeding the desired image width and * height. * @@ -205,27 +211,29 @@ public class TJDecompressor { * image (in other words, the height will not be considered when determining * the scaled image size.) * - * @return the height of the largest scaled down image that the TurboJPEG + * @return the height of the largest scaled-down image that the TurboJPEG * decompressor can generate without exceeding the desired image width and * height */ public int getScaledHeight(int desiredWidth, int desiredHeight) - throws Exception { - if(jpegWidth < 1 || jpegHeight < 1) + throws Exception { + if (jpegWidth < 1 || jpegHeight < 1) throw new Exception(NO_ASSOC_ERROR); - if(desiredWidth < 0 || desiredHeight < 0) + if (desiredWidth < 0 || desiredHeight < 0) throw new Exception("Invalid argument in getScaledHeight()"); - TJScalingFactor sf[] = TJ.getScalingFactors(); - if(desiredWidth == 0) desiredWidth = jpegWidth; - if(desiredHeight == 0) desiredHeight = jpegHeight; + TJScalingFactor[] sf = TJ.getScalingFactors(); + if (desiredWidth == 0) + desiredWidth = jpegWidth; + if (desiredHeight == 0) + desiredHeight = jpegHeight; int scaledWidth = jpegWidth, scaledHeight = jpegHeight; - for(int i = 0; i < sf.length; i++) { + for (int i = 0; i < sf.length; i++) { scaledWidth = sf[i].getScaled(jpegWidth); scaledHeight = sf[i].getScaled(jpegHeight); - if(scaledWidth <= desiredWidth && scaledHeight <= desiredHeight) + if (scaledWidth <= desiredWidth && scaledHeight <= desiredHeight) break; } - if(scaledWidth > desiredWidth || scaledHeight > desiredHeight) + if (scaledWidth > desiredWidth || scaledHeight > desiredHeight) throw new Exception("Could not scale down to desired image dimensions"); return scaledHeight; } @@ -239,47 +247,78 @@ public class TJDecompressor { * where scaledHeight can be determined by calling * scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegHeight) * with one of the scaling factors returned from {@link - * TJ#getScalingFactors} or by calling {@link #getScaledHeight}. - * - * @param desiredWidth desired width (in pixels) of the decompressed image. - * If the desired image dimensions are smaller than the dimensions of the - * JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG - * decompressor to generate the largest possible image that will fit within - * the desired dimensions. Setting this to 0 is the same as setting it to - * the width of the JPEG image (in other words, the width will not be - * considered when determining the scaled image size.) + * TJ#getScalingFactors} or by calling {@link #getScaledHeight}. However, + * the buffer may also be larger than the dimensions of the JPEG image, in + * which case the x, y, and pitch + * parameters can be used to specify the region into which the JPEG image + * should be decompressed. + * + * @param x x offset (in pixels) of the region into which the JPEG image + * should be decompressed, relative to the start of dstBuf. + * + * @param y y offset (in pixels) of the region into which the JPEG image + * should be decompressed, relative to the start of dstBuf. + * + * @param desiredWidth desired width (in pixels) of the decompressed image + * (or image region.) If the desired image dimensions are different than the + * dimensions of the JPEG image being decompressed, then TurboJPEG will use + * scaling in the JPEG decompressor to generate the largest possible image + * that will fit within the desired dimensions. Setting this to 0 is the + * same as setting it to the width of the JPEG image (in other words, the + * width will not be considered when determining the scaled image size.) * * @param pitch bytes per line of the destination image. Normally, this * should be set to scaledWidth * TJ.pixelSize(pixelFormat) if * the decompressed image is unpadded, but you can use this to, for instance, - * pad each line of the decompressed image to a 4-byte boundary. NOTE: + * pad each line of the decompressed image to a 4-byte boundary or to + * decompress the JPEG image into a region of a larger image. NOTE: * scaledWidth can be determined by calling * scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegWidth) * or by calling {@link #getScaledWidth}. Setting this parameter to * 0 is the equivalent of setting it to scaledWidth * * TJ.pixelSize(pixelFormat). * - * @param desiredHeight desired height (in pixels) of the decompressed image. - * If the desired image dimensions are smaller than the dimensions of the - * JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG - * decompressor to generate the largest possible image that will fit within - * the desired dimensions. Setting this to 0 is the same as setting it to - * the height of the JPEG image (in other words, the height will not be - * considered when determining the scaled image size.) + * @param desiredHeight desired height (in pixels) of the decompressed image + * (or image region.) If the desired image dimensions are different than the + * dimensions of the JPEG image being decompressed, then TurboJPEG will use + * scaling in the JPEG decompressor to generate the largest possible image + * that will fit within the desired dimensions. Setting this to 0 is the + * same as setting it to the height of the JPEG image (in other words, the + * height will not be considered when determining the scaled image size.) * - * @param pixelFormat pixel format of the decompressed image (one of - * {@link TJ TJ.PF_*}) + * @param pixelFormat pixel format of the decompressed/decoded image (one of + * {@link TJ#PF_RGB TJ.PF_*}) * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} */ - public void decompress(byte[] dstBuf, int desiredWidth, int pitch, - int desiredHeight, int pixelFormat, int flags) throws Exception { - if(jpegBuf == null) throw new Exception(NO_ASSOC_ERROR); - if(dstBuf == null || desiredWidth < 0 || pitch < 0 || desiredHeight < 0 - || pixelFormat < 0 || pixelFormat >= TJ.NUMPF || flags < 0) + public void decompress(byte[] dstBuf, int x, int y, int desiredWidth, + int pitch, int desiredHeight, int pixelFormat, + int flags) throws Exception { + if (jpegBuf == null) + throw new Exception(NO_ASSOC_ERROR); + if (dstBuf == null || x < 0 || y < 0 || desiredWidth < 0 || pitch < 0 || + desiredHeight < 0 || pixelFormat < 0 || pixelFormat >= TJ.NUMPF || + flags < 0) throw new Exception("Invalid argument in decompress()"); - decompress(jpegBuf, jpegBufSize, dstBuf, desiredWidth, pitch, - desiredHeight, pixelFormat, flags); + if (x > 0 || y > 0) + decompress(jpegBuf, jpegBufSize, dstBuf, x, y, desiredWidth, pitch, + desiredHeight, pixelFormat, flags); + else + decompress(jpegBuf, jpegBufSize, dstBuf, desiredWidth, pitch, + desiredHeight, pixelFormat, flags); + } + + /** + * @deprecated Use + * {@link #decompress(byte[], int, int, int, int, int, int, int)} instead. + */ + @Deprecated + public void decompress(byte[] dstBuf, int desiredWidth, int pitch, + int desiredHeight, int pixelFormat, int flags) + throws Exception { + decompress(dstBuf, 0, 0, desiredWidth, pitch, desiredHeight, pixelFormat, + flags); } /** @@ -287,30 +326,35 @@ public class TJDecompressor { * instance and return a buffer containing the decompressed image. * * @param desiredWidth see - * {@link #decompress(byte[], int, int, int, int, int)} for description + * {@link #decompress(byte[], int, int, int, int, int, int, int)} + * for description * * @param pitch see - * {@link #decompress(byte[], int, int, int, int, int)} for description + * {@link #decompress(byte[], int, int, int, int, int, int, int)} + * for description * * @param desiredHeight see - * {@link #decompress(byte[], int, int, int, int, int)} for description + * {@link #decompress(byte[], int, int, int, int, int, int, int)} + * for description * * @param pixelFormat pixel format of the decompressed image (one of - * {@link TJ TJ.PF_*}) + * {@link TJ#PF_RGB TJ.PF_*}) * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} * * @return a buffer containing the decompressed image */ public byte[] decompress(int desiredWidth, int pitch, int desiredHeight, - int pixelFormat, int flags) throws Exception { - if(desiredWidth < 0 || pitch < 0 || desiredHeight < 0 - || pixelFormat < 0 || pixelFormat >= TJ.NUMPF || flags < 0) + int pixelFormat, int flags) throws Exception { + if (desiredWidth < 0 || pitch < 0 || desiredHeight < 0 || + pixelFormat < 0 || pixelFormat >= TJ.NUMPF || flags < 0) throw new Exception("Invalid argument in decompress()"); int pixelSize = TJ.getPixelSize(pixelFormat); int scaledWidth = getScaledWidth(desiredWidth, desiredHeight); int scaledHeight = getScaledHeight(desiredWidth, desiredHeight); - if(pitch == 0) pitch = scaledWidth * pixelSize; + if (pitch == 0) + pitch = scaledWidth * pixelSize; byte[] buf = new byte[pitch * scaledHeight]; decompress(buf, desiredWidth, pitch, desiredHeight, pixelFormat, flags); return buf; @@ -321,41 +365,45 @@ public class TJDecompressor { * instance and output a YUV planar image to the given destination buffer. * This method performs JPEG decompression but leaves out the color * conversion step, so a planar YUV image is generated instead of an RGB - * image. The padding of the planes in this image is the same as the images - * generated by {@link TJCompressor#encodeYUV(byte[], int)}. Note that, if - * the width or height of the image is not an even multiple of the MCU block - * size (see {@link TJ#getMCUWidth} and {@link TJ#getMCUHeight}), then an - * intermediate buffer copy will be performed within TurboJPEG. + * image. The padding of the planes in this image is the same as in the + * images generated by {@link TJCompressor#encodeYUV(byte[], int)}. + *

+ * NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the + * convention of the digital video community, the TurboJPEG API uses "YUV" to + * refer to an image format consisting of Y, Cb, and Cr image planes. * * @param dstBuf buffer that will receive the YUV planar image. Use * {@link TJ#bufSizeYUV} to determine the appropriate size for this buffer * based on the image width, height, and level of chrominance subsampling. * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} */ public void decompressToYUV(byte[] dstBuf, int flags) throws Exception { - if(jpegBuf == null) throw new Exception(NO_ASSOC_ERROR); - if(dstBuf == null || flags < 0) + if (jpegBuf == null) + throw new Exception(NO_ASSOC_ERROR); + if (dstBuf == null || flags < 0) throw new Exception("Invalid argument in decompressToYUV()"); decompressToYUV(jpegBuf, jpegBufSize, dstBuf, flags); } - + /** * Decompress the JPEG source image associated with this decompressor * instance and return a buffer containing a YUV planar image. See {@link * #decompressToYUV(byte[], int)} for more detail. * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} * * @return a buffer containing a YUV planar image */ public byte[] decompressToYUV(int flags) throws Exception { - if(flags < 0) + if (flags < 0) throw new Exception("Invalid argument in decompressToYUV()"); - if(jpegWidth < 1 || jpegHeight < 1 || jpegSubsamp < 0) + if (jpegWidth < 1 || jpegHeight < 1 || jpegSubsamp < 0) throw new Exception(NO_ASSOC_ERROR); - if(jpegSubsamp >= TJ.NUMSAMP) + if (jpegSubsamp >= TJ.NUMSAMP) throw new Exception("JPEG header information is invalid"); byte[] buf = new byte[TJ.bufSizeYUV(jpegWidth, jpegHeight, jpegSubsamp)]; decompressToYUV(buf, flags); @@ -364,25 +412,93 @@ public class TJDecompressor { /** * Decompress the JPEG source image associated with this decompressor + * instance and output a decompressed image to the given destination buffer. + * + * @param dstBuf buffer that will receive the decompressed image. This + * buffer should normally be stride * scaledHeight pixels in + * size, where scaledHeight can be determined by calling + * scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegHeight) + * with one of the scaling factors returned from {@link + * TJ#getScalingFactors} or by calling {@link #getScaledHeight}. However, + * the buffer may also be larger than the dimensions of the JPEG image, in + * which case the x, y, and stride + * parameters can be used to specify the region into which the JPEG image + * should be decompressed. + * + * @param x x offset (in pixels) of the region into which the JPEG image + * should be decompressed, relative to the start of dstBuf. + * + * @param y y offset (in pixels) of the region into which the JPEG image + * should be decompressed, relative to the start of dstBuf. + * + * @param desiredWidth desired width (in pixels) of the decompressed image + * (or image region.) If the desired image dimensions are different than the + * dimensions of the JPEG image being decompressed, then TurboJPEG will use + * scaling in the JPEG decompressor to generate the largest possible image + * that will fit within the desired dimensions. Setting this to 0 is the + * same as setting it to the width of the JPEG image (in other words, the + * width will not be considered when determining the scaled image size.) + * + * @param stride pixels per line of the destination image. Normally, this + * should be set to scaledWidth, but you can use this to, for + * instance, decompress the JPEG image into a region of a larger image. + * NOTE: scaledWidth can be determined by calling + * scalingFactor.{@link TJScalingFactor#getScaled getScaled}(jpegWidth) + * or by calling {@link #getScaledWidth}. Setting this parameter to + * 0 is the equivalent of setting it to scaledWidth. + * + * @param desiredHeight desired height (in pixels) of the decompressed image + * (or image region.) If the desired image dimensions are different than the + * dimensions of the JPEG image being decompressed, then TurboJPEG will use + * scaling in the JPEG decompressor to generate the largest possible image + * that will fit within the desired dimensions. Setting this to 0 is the + * same as setting it to the height of the JPEG image (in other words, the + * height will not be considered when determining the scaled image size.) + * + * @param pixelFormat pixel format of the decompressed image (one of + * {@link TJ#PF_RGB TJ.PF_*}) + * + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} + */ + public void decompress(int[] dstBuf, int x, int y, int desiredWidth, + int stride, int desiredHeight, int pixelFormat, + int flags) throws Exception { + if (jpegBuf == null) + throw new Exception(NO_ASSOC_ERROR); + if (dstBuf == null || x < 0 || y < 0 || desiredWidth < 0 || stride < 0 || + desiredHeight < 0 || pixelFormat < 0 || pixelFormat >= TJ.NUMPF || + flags < 0) + throw new Exception("Invalid argument in decompress()"); + decompress(jpegBuf, jpegBufSize, dstBuf, x, y, desiredWidth, stride, + desiredHeight, pixelFormat, flags); + } + + /** + * Decompress the JPEG source image associated with this decompressor * instance and output a decompressed image to the given * BufferedImage instance. * * @param dstImage a BufferedImage instance that will receive - * the decompressed image + * the decompressed image. The width and height of the + * BufferedImage instance must match one of the scaled image + * sizes that TurboJPEG is capable of generating from the JPEG image. + * * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} */ public void decompress(BufferedImage dstImage, int flags) throws Exception { - if(dstImage == null || flags < 0) + if (dstImage == null || flags < 0) throw new Exception("Invalid argument in decompress()"); int desiredWidth = dstImage.getWidth(); int desiredHeight = dstImage.getHeight(); int scaledWidth = getScaledWidth(desiredWidth, desiredHeight); int scaledHeight = getScaledHeight(desiredWidth, desiredHeight); - if(scaledWidth != desiredWidth || scaledHeight != desiredHeight) - throw new Exception("BufferedImage dimensions do not match a scaled image size that TurboJPEG is capable of generating."); + if (scaledWidth != desiredWidth || scaledHeight != desiredHeight) + throw new Exception("BufferedImage dimensions do not match one of the scaled image sizes that TurboJPEG is capable of generating."); int pixelFormat; boolean intPixels = false; - if(byteOrder == null) + if (byteOrder == null) byteOrder = ByteOrder.nativeOrder(); switch(dstImage.getType()) { case BufferedImage.TYPE_3BYTE_BGR: @@ -393,20 +509,20 @@ public class TJDecompressor { case BufferedImage.TYPE_BYTE_GRAY: pixelFormat = TJ.PF_GRAY; break; case BufferedImage.TYPE_INT_BGR: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XBGR; else pixelFormat = TJ.PF_RGBX; intPixels = true; break; case BufferedImage.TYPE_INT_RGB: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_XRGB; else pixelFormat = TJ.PF_BGRX; intPixels = true; break; case BufferedImage.TYPE_INT_ARGB: case BufferedImage.TYPE_INT_ARGB_PRE: - if(byteOrder == ByteOrder.BIG_ENDIAN) + if (byteOrder == ByteOrder.BIG_ENDIAN) pixelFormat = TJ.PF_ARGB; else pixelFormat = TJ.PF_BGRA; @@ -415,21 +531,21 @@ public class TJDecompressor { throw new Exception("Unsupported BufferedImage format"); } WritableRaster wr = dstImage.getRaster(); - if(intPixels) { + if (intPixels) { SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)dstImage.getSampleModel(); - int pitch = sm.getScanlineStride(); + int stride = sm.getScanlineStride(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); int[] buf = db.getData(); - if(jpegBuf == null) throw new Exception(NO_ASSOC_ERROR); - decompress(jpegBuf, jpegBufSize, buf, scaledWidth, pitch, scaledHeight, - pixelFormat, flags); - } - else { + if (jpegBuf == null) + throw new Exception(NO_ASSOC_ERROR); + decompress(jpegBuf, jpegBufSize, buf, scaledWidth, stride, scaledHeight, + pixelFormat, flags); + } else { ComponentSampleModel sm = (ComponentSampleModel)dstImage.getSampleModel(); int pixelSize = sm.getPixelStride(); - if(pixelSize != TJ.getPixelSize(pixelFormat)) + if (pixelSize != TJ.getPixelSize(pixelFormat)) throw new Exception("Inconsistency between pixel format and pixel size in BufferedImage"); int pitch = sm.getScanlineStride(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); @@ -444,28 +560,32 @@ public class TJDecompressor { * decompressed image. * * @param desiredWidth see - * {@link #decompress(byte[], int, int, int, int, int)} for description + * {@link #decompress(byte[], int, int, int, int, int, int, int)} for + * description * * @param desiredHeight see - * {@link #decompress(byte[], int, int, int, int, int)} for description + * {@link #decompress(byte[], int, int, int, int, int, int, int)} for + * description * - * @param bufferedImageType the image type of the newly-created - * BufferedImage instance (for instance, + * @param bufferedImageType the image type of the BufferedImage + * instance that will be created (for instance, * BufferedImage.TYPE_INT_RGB) * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} * * @return a BufferedImage instance containing the * decompressed image */ public BufferedImage decompress(int desiredWidth, int desiredHeight, - int bufferedImageType, int flags) throws Exception { - if(desiredWidth < 0 || desiredHeight < 0 || flags < 0) + int bufferedImageType, int flags) + throws Exception { + if (desiredWidth < 0 || desiredHeight < 0 || flags < 0) throw new Exception("Invalid argument in decompress()"); int scaledWidth = getScaledWidth(desiredWidth, desiredHeight); int scaledHeight = getScaledHeight(desiredWidth, desiredHeight); BufferedImage img = new BufferedImage(scaledWidth, scaledHeight, - bufferedImageType); + bufferedImageType); decompress(img, flags); return img; } @@ -480,9 +600,8 @@ public class TJDecompressor { protected void finalize() throws Throwable { try { close(); - } - catch(Exception e) {} - finally { + } catch(Exception e) { + } finally { super.finalize(); } }; @@ -496,15 +615,22 @@ public class TJDecompressor { private native void decompress(byte[] srcBuf, int size, byte[] dstBuf, int desiredWidth, int pitch, int desiredHeight, int pixelFormat, int flags) - throws Exception; + throws Exception; // deprecated + + private native void decompress(byte[] srcBuf, int size, byte[] dstBuf, int x, + int y, int desiredWidth, int pitch, int desiredHeight, int pixelFormat, + int flags) throws Exception; private native void decompress(byte[] srcBuf, int size, int[] dstBuf, - int desiredWidth, int pitch, int desiredHeight, int pixelFormat, int flags) - throws Exception; + int desiredWidth, int stride, int desiredHeight, int pixelFormat, + int flags) throws Exception; // deprecated + + private native void decompress(byte[] srcBuf, int size, int[] dstBuf, int x, + int y, int desiredWidth, int stride, int desiredHeight, int pixelFormat, + int flags) throws Exception; private native void decompressToYUV(byte[] srcBuf, int size, byte[] dstBuf, - int flags) - throws Exception; + int flags) throws Exception; static { TJLoader.load(); diff --git a/java/org/libjpegturbo/turbojpeg/TJLoader.java.tmpl b/java/org/libjpegturbo/turbojpeg/TJLoader.java.tmpl new file mode 100644 index 0000000..a4f1c87 --- /dev/null +++ b/java/org/libjpegturbo/turbojpeg/TJLoader.java.tmpl @@ -0,0 +1,59 @@ +/* + * Copyright (C)2011-2013 D. R. Commander. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of the libjpeg-turbo Project nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +package org.libjpegturbo.turbojpeg; + +final class TJLoader { + static void load() { + try { + System.loadLibrary("turbojpeg"); + } catch (java.lang.UnsatisfiedLinkError e) { + String os = System.getProperty("os.name").toLowerCase(); + if (os.indexOf("mac") >= 0) { + try { + System.load("%{__libdir}/libturbojpeg.jnilib"); + } catch (java.lang.UnsatisfiedLinkError e2) { + System.load("/usr/lib/libturbojpeg.jnilib"); + } + } else { + try { + System.load("%{__libdir}/libturbojpeg.so"); + } catch (java.lang.UnsatisfiedLinkError e3) { + String libdir = "%{__libdir}"; + if (libdir.equals("/opt/libjpeg-turbo/lib64")) { + System.load("/opt/libjpeg-turbo/lib32/libturbojpeg.so"); + } else if (libdir.equals("/opt/libjpeg-turbo/lib32")) { + System.load("/opt/libjpeg-turbo/lib64/libturbojpeg.so"); + } else { + throw e3; + } + } + } + } + } +}; diff --git a/java/org/libjpegturbo/turbojpeg/TJScalingFactor.java b/java/org/libjpegturbo/turbojpeg/TJScalingFactor.java index d71ceee..4e7363f 100644 --- a/java/org/libjpegturbo/turbojpeg/TJScalingFactor.java +++ b/java/org/libjpegturbo/turbojpeg/TJScalingFactor.java @@ -34,7 +34,7 @@ package org.libjpegturbo.turbojpeg; public class TJScalingFactor { public TJScalingFactor(int num, int denom) throws Exception { - if(num < 1 || denom < 1) + if (num < 1 || denom < 1) throw new Exception("Numerator and denominator must be >= 1"); this.num = num; this.denom = denom; diff --git a/java/org/libjpegturbo/turbojpeg/TJTransform.java b/java/org/libjpegturbo/turbojpeg/TJTransform.java index 399cf3a..b464ffd 100644 --- a/java/org/libjpegturbo/turbojpeg/TJTransform.java +++ b/java/org/libjpegturbo/turbojpeg/TJTransform.java @@ -1,5 +1,5 @@ /* - * Copyright (C)2011 D. R. Commander. All Rights Reserved. + * Copyright (C)2011, 2013 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -40,54 +40,54 @@ public class TJTransform extends Rectangle { /** * The number of lossless transform operations */ - final public static int NUMOP = 8; + public static final int NUMOP = 8; /** * Do not transform the position of the image pixels. */ - final public static int OP_NONE = 0; + public static final int OP_NONE = 0; /** * Flip (mirror) image horizontally. This transform is imperfect if there * are any partial MCU blocks on the right edge. * @see #OPT_PERFECT */ - final public static int OP_HFLIP = 1; + public static final int OP_HFLIP = 1; /** * Flip (mirror) image vertically. This transform is imperfect if there are * any partial MCU blocks on the bottom edge. * @see #OPT_PERFECT */ - final public static int OP_VFLIP = 2; + public static final int OP_VFLIP = 2; /** * Transpose image (flip/mirror along upper left to lower right axis). This * transform is always perfect. * @see #OPT_PERFECT */ - final public static int OP_TRANSPOSE = 3; + public static final int OP_TRANSPOSE = 3; /** * Transverse transpose image (flip/mirror along upper right to lower left * axis). This transform is imperfect if there are any partial MCU blocks in * the image. * @see #OPT_PERFECT */ - final public static int OP_TRANSVERSE = 4; + public static final int OP_TRANSVERSE = 4; /** * Rotate image clockwise by 90 degrees. This transform is imperfect if * there are any partial MCU blocks on the bottom edge. * @see #OPT_PERFECT */ - final public static int OP_ROT90 = 5; + public static final int OP_ROT90 = 5; /** * Rotate image 180 degrees. This transform is imperfect if there are any * partial MCU blocks in the image. * @see #OPT_PERFECT */ - final public static int OP_ROT180 = 6; + public static final int OP_ROT180 = 6; /** * Rotate image counter-clockwise by 90 degrees. This transform is imperfect * if there are any partial MCU blocks on the right edge. * @see #OPT_PERFECT */ - final public static int OP_ROT270 = 7; + public static final int OP_ROT270 = 7; /** @@ -103,21 +103,21 @@ public class TJTransform extends Rectangle { * partial MCU blocks that cannot be transformed will be left in place, which * will create odd-looking strips on the right or bottom edge of the image. */ - final public static int OPT_PERFECT = 1; + public static final int OPT_PERFECT = 1; /** * This option will discard any partial MCU blocks that cannot be * transformed. */ - final public static int OPT_TRIM = 2; + public static final int OPT_TRIM = 2; /** * This option will enable lossless cropping. */ - final public static int OPT_CROP = 4; + public static final int OPT_CROP = 4; /** * This option will discard the color data in the input image and produce * a grayscale output image. */ - final public static int OPT_GRAY = 8; + public static final int OPT_GRAY = 8; /** * This option will prevent {@link TJTransformer#transform * TJTransformer.transform()} from outputting a JPEG image for this @@ -125,9 +125,9 @@ public class TJTransform extends Rectangle { * filter to capture the transformed DCT coefficients without transcoding * them. */ - final public static int OPT_NOOUTPUT = 16; + public static final int OPT_NOOUTPUT = 16; + - /** * Create a new lossless transform instance. */ @@ -144,10 +144,12 @@ public class TJTransform extends Rectangle { * divisible by the MCU block height (see {@link TJ#getMCUHeight}) * * @param w the width of the cropping region. Setting this to 0 is the - * equivalent of setting it to the width of the source JPEG image - x. + * equivalent of setting it to (width of the source JPEG image - + * x). * * @param h the height of the cropping region. Setting this to 0 is the - * equivalent of setting it to the height of the source JPEG image - y. + * equivalent of setting it to (height of the source JPEG image - + * y). * * @param op one of the transform operations (OP_*) * @@ -158,9 +160,11 @@ public class TJTransform extends Rectangle { * TJCustomFilter} interface, or null if no custom filter is needed */ public TJTransform(int x, int y, int w, int h, int op, int options, - TJCustomFilter cf) throws Exception { + TJCustomFilter cf) throws Exception { super(x, y, w, h); - this.op = op; this.options = options; this.cf = cf; + this.op = op; + this.options = options; + this.cf = cf; } /** @@ -180,9 +184,11 @@ public class TJTransform extends Rectangle { * TJCustomFilter} interface, or null if no custom filter is needed */ public TJTransform(Rectangle r, int op, int options, - TJCustomFilter cf) throws Exception { + TJCustomFilter cf) throws Exception { super(r); - this.op = op; this.options = options; this.cf = cf; + this.op = op; + this.options = options; + this.cf = cf; } /** diff --git a/java/org/libjpegturbo/turbojpeg/TJTransformer.java b/java/org/libjpegturbo/turbojpeg/TJTransformer.java index 6c07483..3240b07 100644 --- a/java/org/libjpegturbo/turbojpeg/TJTransformer.java +++ b/java/org/libjpegturbo/turbojpeg/TJTransformer.java @@ -1,5 +1,5 @@ /* - * Copyright (C)2011 D. R. Commander. All Rights Reserved. + * Copyright (C)2011, 2013-2014 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -42,7 +42,7 @@ public class TJTransformer extends TJDecompressor { /** * Create a TurboJPEG lossless transformer instance and associate the JPEG - * image stored in jpegImage with the newly-created instance. + * image stored in jpegImage with the newly created instance. * * @param jpegImage JPEG image buffer (size of the JPEG image is assumed to * be the length of the array) @@ -55,7 +55,7 @@ public class TJTransformer extends TJDecompressor { /** * Create a TurboJPEG lossless transformer instance and associate the JPEG * image of length imageSize bytes stored in - * jpegImage with the newly-created instance. + * jpegImage with the newly created instance. * * @param jpegImage JPEG image buffer * @@ -73,31 +73,34 @@ public class TJTransformer extends TJDecompressor { * JPEG image structure to another without altering the values of the * coefficients. While this is typically faster than decompressing the * image, transforming it, and re-compressing it, lossless transforms are not - * free. Each lossless transform requires reading and Huffman decoding all - * of the coefficients in the source image, regardless of the size of the - * destination image. Thus, this method provides a means of generating - * multiple transformed images from the same source or of applying multiple - * transformations simultaneously, in order to eliminate the need to read the - * source coefficients multiple times. + * free. Each lossless transform requires reading and performing Huffman + * decoding on all of the coefficients in the source image, regardless of the + * size of the destination image. Thus, this method provides a means of + * generating multiple transformed images from the same source or of applying + * multiple transformations simultaneously, in order to eliminate the need to + * read the source coefficients multiple times. * * @param dstBufs an array of image buffers. dstbufs[i] will * receive a JPEG image that has been transformed using the parameters in * transforms[i]. Use {@link TJ#bufSize} to determine the - * maximum size for each buffer based on the cropped width and height. + * maximum size for each buffer based on the transformed or cropped width and + * height and the level of subsampling used in the source image. * * @param transforms an array of {@link TJTransform} instances, each of * which specifies the transform parameters and/or cropping region for the * corresponding transformed output image * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} */ public void transform(byte[][] dstBufs, TJTransform[] transforms, - int flags) throws Exception { - if(jpegBuf == null) throw new Exception("JPEG buffer not initialized"); + int flags) throws Exception { + if (jpegBuf == null) + throw new Exception("JPEG buffer not initialized"); transformedSizes = transform(jpegBuf, jpegBufSize, dstBufs, transforms, - flags); + flags); } - + /** * Losslessly transform the JPEG image associated with this transformer * instance and return an array of {@link TJDecompressor} instances, each of @@ -110,37 +113,38 @@ public class TJTransformer extends TJDecompressor { * @return an array of {@link TJDecompressor} instances, each of * which has a transformed JPEG image associated with it * - * @param flags the bitwise OR of one or more of {@link TJ TJ.FLAG_*} + * @param flags the bitwise OR of one or more of + * {@link TJ#FLAG_BOTTOMUP TJ.FLAG_*} */ public TJDecompressor[] transform(TJTransform[] transforms, int flags) throws Exception { byte[][] dstBufs = new byte[transforms.length][]; - if(jpegWidth < 1 || jpegHeight < 1) + if (jpegWidth < 1 || jpegHeight < 1) throw new Exception("JPEG buffer not initialized"); - for(int i = 0; i < transforms.length; i++) { + for (int i = 0; i < transforms.length; i++) { int w = jpegWidth, h = jpegHeight; - if((transforms[i].options & TJTransform.OPT_CROP) != 0) { - if(transforms[i].width != 0) w = transforms[i].width; - if(transforms[i].height != 0) h = transforms[i].height; + if ((transforms[i].options & TJTransform.OPT_CROP) != 0) { + if (transforms[i].width != 0) w = transforms[i].width; + if (transforms[i].height != 0) h = transforms[i].height; } dstBufs[i] = new byte[TJ.bufSize(w, h, jpegSubsamp)]; } TJDecompressor[] tjd = new TJDecompressor[transforms.length]; transform(dstBufs, transforms, flags); - for(int i = 0; i < transforms.length; i++) + for (int i = 0; i < transforms.length; i++) tjd[i] = new TJDecompressor(dstBufs[i], transformedSizes[i]); return tjd; } - + /** - * Returns an array containing the sizes of the transformed JPEG images from - * the most recent call to {@link #transform transform()}. + * Returns an array containing the sizes of the transformed JPEG images + * generated by the most recent transform operation. * - * @return an array containing the sizes of the transformed JPEG images from - * the most recent call to {@link #transform transform()} + * @return an array containing the sizes of the transformed JPEG images + * generated by the most recent transform operation */ public int[] getTransformedSizes() throws Exception { - if(transformedSizes == null) + if (transformedSizes == null) throw new Exception("No image has been transformed yet"); return transformedSizes; } diff --git a/java/org_libjpegturbo_turbojpeg_TJ.h b/java/org_libjpegturbo_turbojpeg_TJ.h index c892086..d7b032a 100644 --- a/java/org_libjpegturbo_turbojpeg_TJ.h +++ b/java/org_libjpegturbo_turbojpeg_TJ.h @@ -55,6 +55,10 @@ extern "C" { #define org_libjpegturbo_turbojpeg_TJ_FLAG_FORCESSE3 128L #undef org_libjpegturbo_turbojpeg_TJ_FLAG_FASTUPSAMPLE #define org_libjpegturbo_turbojpeg_TJ_FLAG_FASTUPSAMPLE 256L +#undef org_libjpegturbo_turbojpeg_TJ_FLAG_FASTDCT +#define org_libjpegturbo_turbojpeg_TJ_FLAG_FASTDCT 2048L +#undef org_libjpegturbo_turbojpeg_TJ_FLAG_ACCURATEDCT +#define org_libjpegturbo_turbojpeg_TJ_FLAG_ACCURATEDCT 4096L /* * Class: org_libjpegturbo_turbojpeg_TJ * Method: bufSize diff --git a/java/org_libjpegturbo_turbojpeg_TJCompressor.h b/java/org_libjpegturbo_turbojpeg_TJCompressor.h index 59f81e3..2fc9136 100644 --- a/java/org_libjpegturbo_turbojpeg_TJCompressor.h +++ b/java/org_libjpegturbo_turbojpeg_TJCompressor.h @@ -34,6 +34,14 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3 /* * Class: org_libjpegturbo_turbojpeg_TJCompressor * Method: compress + * Signature: ([BIIIIII[BIII)I + */ +JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIIIII_3BIII + (JNIEnv *, jobject, jbyteArray, jint, jint, jint, jint, jint, jint, jbyteArray, jint, jint, jint); + +/* + * Class: org_libjpegturbo_turbojpeg_TJCompressor + * Method: compress * Signature: ([IIIII[BIII)I */ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIII_3BIII @@ -41,6 +49,14 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3 /* * Class: org_libjpegturbo_turbojpeg_TJCompressor + * Method: compress + * Signature: ([IIIIIII[BIII)I + */ +JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIIIII_3BIII + (JNIEnv *, jobject, jintArray, jint, jint, jint, jint, jint, jint, jbyteArray, jint, jint, jint); + +/* + * Class: org_libjpegturbo_turbojpeg_TJCompressor * Method: encodeYUV * Signature: ([BIIII[BII)V */ diff --git a/java/org_libjpegturbo_turbojpeg_TJDecompressor.h b/java/org_libjpegturbo_turbojpeg_TJDecompressor.h index 6b67296..f798a77 100644 --- a/java/org_libjpegturbo_turbojpeg_TJDecompressor.h +++ b/java/org_libjpegturbo_turbojpeg_TJDecompressor.h @@ -42,6 +42,14 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress /* * Class: org_libjpegturbo_turbojpeg_TJDecompressor * Method: decompress + * Signature: ([BI[BIIIIIII)V + */ +JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIIIII + (JNIEnv *, jobject, jbyteArray, jint, jbyteArray, jint, jint, jint, jint, jint, jint, jint); + +/* + * Class: org_libjpegturbo_turbojpeg_TJDecompressor + * Method: decompress * Signature: ([BI[IIIIII)V */ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIII @@ -49,6 +57,14 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress /* * Class: org_libjpegturbo_turbojpeg_TJDecompressor + * Method: decompress + * Signature: ([BI[IIIIIIII)V + */ +JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIIIII + (JNIEnv *, jobject, jbyteArray, jint, jintArray, jint, jint, jint, jint, jint, jint, jint); + +/* + * Class: org_libjpegturbo_turbojpeg_TJDecompressor * Method: decompressToYUV * Signature: ([BI[BI)V */ diff --git a/jccolext.c b/jccolext.c index dbac84a..dda3beb 100644 --- a/jccolext.c +++ b/jccolext.c @@ -1,9 +1,10 @@ /* * jccolext.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1996, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2009-2012, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains input colorspace conversion routines. diff --git a/jccolor.c b/jccolor.c index 3a0772b..94b4184 100644 --- a/jccolor.c +++ b/jccolor.c @@ -1,10 +1,11 @@ /* * jccolor.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1996, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright 2009 Pierre Ossman for Cendio AB * Copyright (C) 2009-2012, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains input colorspace conversion routines. diff --git a/jcdctmgr.c b/jcdctmgr.c index 12f8872..3234a01 100644 --- a/jcdctmgr.c +++ b/jcdctmgr.c @@ -1,11 +1,12 @@ /* * jcdctmgr.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 1999-2006, MIYASAKA Masaru. * Copyright 2009 Pierre Ossman for Cendio AB * Copyright (C) 2011 D. R. Commander - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains the forward-DCT management logic. diff --git a/jchuff.c b/jchuff.c index fd4fa46..29bf389 100644 --- a/jchuff.c +++ b/jchuff.c @@ -1,9 +1,10 @@ /* * jchuff.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2009-2011, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains Huffman entropy encoding routines. @@ -298,8 +299,6 @@ dump_buffer (working_state * state) { struct jpeg_destination_mgr * dest = state->cinfo->dest; - dest->free_in_buffer = state->free_in_buffer; - if (! (*dest->empty_output_buffer) (state->cinfo)) return FALSE; /* After a successful buffer dump, must reset buffer pointers */ diff --git a/jcmainct.c b/jcmainct.c index bd0051a..5b7ff21 100644 --- a/jcmainct.c +++ b/jcmainct.c @@ -170,7 +170,7 @@ process_data_buffer_main (j_compress_ptr cinfo, JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail) { - my_main_ptr main = (my_main_ptr) cinfo->main; + my_main_ptr main_ptr = (my_main_ptr) cinfo->main; int ci; jpeg_component_info *compptr; boolean writing = (main_ptr->pass_mode != JBUF_CRANK_DEST); diff --git a/jcmarker.c b/jcmarker.c index b1c1e45..4fbece4 100644 --- a/jcmarker.c +++ b/jcmarker.c @@ -1,9 +1,11 @@ /* * jcmarker.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2003-2010 by Guido Vollbeding. + * libjpeg-turbo Modifications: * Copyright (C) 2010, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains routines to write JPEG datastream markers. @@ -20,24 +22,24 @@ typedef enum { /* JPEG marker codes */ M_SOF1 = 0xc1, M_SOF2 = 0xc2, M_SOF3 = 0xc3, - + M_SOF5 = 0xc5, M_SOF6 = 0xc6, M_SOF7 = 0xc7, - + M_JPG = 0xc8, M_SOF9 = 0xc9, M_SOF10 = 0xca, M_SOF11 = 0xcb, - + M_SOF13 = 0xcd, M_SOF14 = 0xce, M_SOF15 = 0xcf, - + M_DHT = 0xc4, - + M_DAC = 0xcc, - + M_RST0 = 0xd0, M_RST1 = 0xd1, M_RST2 = 0xd2, @@ -46,7 +48,7 @@ typedef enum { /* JPEG marker codes */ M_RST5 = 0xd5, M_RST6 = 0xd6, M_RST7 = 0xd7, - + M_SOI = 0xd8, M_EOI = 0xd9, M_SOS = 0xda, @@ -55,7 +57,7 @@ typedef enum { /* JPEG marker codes */ M_DRI = 0xdd, M_DHP = 0xde, M_EXP = 0xdf, - + M_APP0 = 0xe0, M_APP1 = 0xe1, M_APP2 = 0xe2, @@ -72,13 +74,13 @@ typedef enum { /* JPEG marker codes */ M_APP13 = 0xed, M_APP14 = 0xee, M_APP15 = 0xef, - + M_JPG0 = 0xf0, M_JPG13 = 0xfd, M_COM = 0xfe, - + M_TEM = 0x01, - + M_ERROR = 0x100 } JPEG_MARKER; @@ -231,32 +233,38 @@ emit_dac (j_compress_ptr cinfo) char ac_in_use[NUM_ARITH_TBLS]; int length, i; jpeg_component_info *compptr; - + for (i = 0; i < NUM_ARITH_TBLS; i++) dc_in_use[i] = ac_in_use[i] = 0; - + for (i = 0; i < cinfo->comps_in_scan; i++) { compptr = cinfo->cur_comp_info[i]; - dc_in_use[compptr->dc_tbl_no] = 1; - ac_in_use[compptr->ac_tbl_no] = 1; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) + dc_in_use[compptr->dc_tbl_no] = 1; + /* AC needs no table when not present */ + if (cinfo->Se) + ac_in_use[compptr->ac_tbl_no] = 1; } - + length = 0; for (i = 0; i < NUM_ARITH_TBLS; i++) length += dc_in_use[i] + ac_in_use[i]; - - emit_marker(cinfo, M_DAC); - - emit_2bytes(cinfo, length*2 + 2); - - for (i = 0; i < NUM_ARITH_TBLS; i++) { - if (dc_in_use[i]) { - emit_byte(cinfo, i); - emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); - } - if (ac_in_use[i]) { - emit_byte(cinfo, i + 0x10); - emit_byte(cinfo, cinfo->arith_ac_K[i]); + + if (length) { + emit_marker(cinfo, M_DAC); + + emit_2bytes(cinfo, length*2 + 2); + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + if (dc_in_use[i]) { + emit_byte(cinfo, i); + emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); + } + if (ac_in_use[i]) { + emit_byte(cinfo, i + 0x10); + emit_byte(cinfo, cinfo->arith_ac_K[i]); + } } } #endif /* C_ARITH_CODING_SUPPORTED */ @@ -322,22 +330,16 @@ emit_sos (j_compress_ptr cinfo) for (i = 0; i < cinfo->comps_in_scan; i++) { compptr = cinfo->cur_comp_info[i]; emit_byte(cinfo, compptr->component_id); - td = compptr->dc_tbl_no; - ta = compptr->ac_tbl_no; - if (cinfo->progressive_mode) { - /* Progressive mode: only DC or only AC tables are used in one scan; - * furthermore, Huffman coding of DC refinement uses no table at all. - * We emit 0 for unused field(s); this is recommended by the P&M text - * but does not seem to be specified in the standard. - */ - if (cinfo->Ss == 0) { - ta = 0; /* DC scan */ - if (cinfo->Ah != 0 && !cinfo->arith_code) - td = 0; /* no DC table either */ - } else { - td = 0; /* AC scan */ - } - } + + /* We emit 0 for unused field(s); this is recommended by the P&M text + * but does not seem to be specified in the standard. + */ + + /* DC needs no table for refinement scan */ + td = cinfo->Ss == 0 && cinfo->Ah == 0 ? compptr->dc_tbl_no : 0; + /* AC needs no table when not present */ + ta = cinfo->Se ? compptr->ac_tbl_no : 0; + emit_byte(cinfo, (td << 4) + ta); } @@ -531,7 +533,10 @@ write_frame_header (j_compress_ptr cinfo) /* Emit the proper SOF marker */ if (cinfo->arith_code) { - emit_sof(cinfo, M_SOF9); /* SOF code for arithmetic coding */ + if (cinfo->progressive_mode) + emit_sof(cinfo, M_SOF10); /* SOF code for progressive arithmetic */ + else + emit_sof(cinfo, M_SOF9); /* SOF code for sequential arithmetic */ } else { if (cinfo->progressive_mode) emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */ @@ -568,19 +573,12 @@ write_scan_header (j_compress_ptr cinfo) */ for (i = 0; i < cinfo->comps_in_scan; i++) { compptr = cinfo->cur_comp_info[i]; - if (cinfo->progressive_mode) { - /* Progressive mode: only DC or only AC tables are used in one scan */ - if (cinfo->Ss == 0) { - if (cinfo->Ah == 0) /* DC needs no table for refinement scan */ - emit_dht(cinfo, compptr->dc_tbl_no, FALSE); - } else { - emit_dht(cinfo, compptr->ac_tbl_no, TRUE); - } - } else { - /* Sequential mode: need both DC and AC tables */ + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) emit_dht(cinfo, compptr->dc_tbl_no, FALSE); + /* AC needs no table when not present */ + if (cinfo->Se) emit_dht(cinfo, compptr->ac_tbl_no, TRUE); - } } } diff --git a/jcmaster.c b/jcmaster.c index 3ca346c..dca0315 100644 --- a/jcmaster.c +++ b/jcmaster.c @@ -1,10 +1,11 @@ /* * jcmaster.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. * Modified 2003-2010 by Guido Vollbeding. + * libjpeg-turbo Modifications: * Copyright (C) 2010, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains master control logic for the JPEG compressor. @@ -601,7 +602,7 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only) cinfo->num_scans = 1; } - if (cinfo->progressive_mode) /* TEMPORARY HACK ??? */ + if (cinfo->progressive_mode && !cinfo->arith_code) /* TEMPORARY HACK ??? */ cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */ /* Initialize my private state */ diff --git a/jconfig.h.in b/jconfig.h.in index 27d4cc9..6b80ce2 100644 --- a/jconfig.h.in +++ b/jconfig.h.in @@ -12,6 +12,9 @@ /* Support arithmetic decoding */ #undef D_ARITH_CODING_SUPPORTED +/* Support in-memory source/destination managers */ +#undef MEM_SRCDST_SUPPORTED + /* Compiler supports function prototypes. */ #undef HAVE_PROTOTYPES diff --git a/jcparam.c b/jcparam.c index 557fdc9..2b9a740 100644 --- a/jcparam.c +++ b/jcparam.c @@ -1,10 +1,11 @@ /* * jcparam.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1998, Thomas G. Lane. * Modified 2003-2008 by Guido Vollbeding. + * libjpeg-turbo Modifications: * Copyright (C) 2009-2011, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains optional default-setting code for the JPEG compressor. diff --git a/jcstest.c b/jcstest.c index 98f16da..358ed25 100644 --- a/jcstest.c +++ b/jcstest.c @@ -78,7 +78,7 @@ int main(void) jerr.pub.output_message = my_output_message; if(setjmp(jerr.jb)) { - // this will execute if libjpeg has an error + /* this will execute if libjpeg has an error */ jcs_valid = 0; goto done; } @@ -105,7 +105,7 @@ int main(void) #endif if(setjmp(jerr.jb)) { - // this will execute if libjpeg has an error + /* this will execute if libjpeg has an error */ jcs_alpha_valid = 0; goto done2; } diff --git a/jdapistd.c b/jdapistd.c index 2343da5..a50fda5 100644 --- a/jdapistd.c +++ b/jdapistd.c @@ -1,9 +1,10 @@ /* * jdapistd.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2010, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains application interface code for the decompression half diff --git a/jdatadst-tj.c b/jdatadst-tj.c index cb674dc..a8bf240 100644 --- a/jdatadst-tj.c +++ b/jdatadst-tj.c @@ -1,9 +1,11 @@ /* - * jdatadst.c + * jdatadst-tj.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. - * Modified 2009 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. + * Modified 2009-2012 by Guido Vollbeding. + * libjpeg-turbo Modifications: + * Copyright (C) 2011, D. R. Commander. * For conditions of distribution and use, see the accompanying README file. * * This file contains compression data destination routines for the case of @@ -91,7 +93,7 @@ empty_mem_output_buffer (j_compress_ptr cinfo) /* Try to allocate new buffer with double size */ nextsize = dest->bufsize * 2; - nextbuffer = malloc(nextsize); + nextbuffer = (JOCTET *) malloc(nextsize); if (nextbuffer == NULL) ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); @@ -175,7 +177,7 @@ jpeg_mem_dest_tj (j_compress_ptr cinfo, if (*outbuffer == NULL || *outsize == 0) { if (alloc) { /* Allocate initial buffer */ - dest->newbuffer = *outbuffer = malloc(OUTPUT_BUF_SIZE); + dest->newbuffer = *outbuffer = (unsigned char *) malloc(OUTPUT_BUF_SIZE); if (dest->newbuffer == NULL) ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); *outsize = OUTPUT_BUF_SIZE; diff --git a/jdatadst.c b/jdatadst.c index 2f48869..1b89fab 100644 --- a/jdatadst.c +++ b/jdatadst.c @@ -1,9 +1,11 @@ /* * jdatadst.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. - * Modified 2009 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. + * Modified 2009-2012 by Guido Vollbeding. + * libjpeg-turbo Modifications: + * Copyright (C) 2013, D. R. Commander. * For conditions of distribution and use, see the accompanying README file. * * This file contains compression data destination routines for the case of @@ -40,7 +42,7 @@ typedef my_destination_mgr * my_dest_ptr; #define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */ -#if JPEG_LIB_VERSION >= 80 +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) /* Expanded data destination object for memory output */ typedef struct { @@ -76,7 +78,7 @@ init_destination (j_compress_ptr cinfo) dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; } -#if JPEG_LIB_VERSION >= 80 +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) METHODDEF(void) init_mem_destination (j_compress_ptr cinfo) { @@ -123,7 +125,7 @@ empty_output_buffer (j_compress_ptr cinfo) return TRUE; } -#if JPEG_LIB_VERSION >= 80 +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) METHODDEF(boolean) empty_mem_output_buffer (j_compress_ptr cinfo) { @@ -133,7 +135,7 @@ empty_mem_output_buffer (j_compress_ptr cinfo) /* Try to allocate new buffer with double size */ nextsize = dest->bufsize * 2; - nextbuffer = malloc(nextsize); + nextbuffer = (JOCTET *) malloc(nextsize); if (nextbuffer == NULL) ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); @@ -182,14 +184,14 @@ term_destination (j_compress_ptr cinfo) ERREXIT(cinfo, JERR_FILE_WRITE); } -#if JPEG_LIB_VERSION >= 80 +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) METHODDEF(void) term_mem_destination (j_compress_ptr cinfo) { my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest; *dest->outbuffer = dest->buffer; - *dest->outsize = dest->bufsize - dest->pub.free_in_buffer; + *dest->outsize = (unsigned long)(dest->bufsize - dest->pub.free_in_buffer); } #endif @@ -225,7 +227,7 @@ jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile) } -#if JPEG_LIB_VERSION >= 80 +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) /* * Prepare for output to a memory buffer. * The caller may supply an own initial buffer with appropriate size. @@ -265,7 +267,7 @@ jpeg_mem_dest (j_compress_ptr cinfo, if (*outbuffer == NULL || *outsize == 0) { /* Allocate initial buffer */ - dest->newbuffer = *outbuffer = malloc(OUTPUT_BUF_SIZE); + dest->newbuffer = *outbuffer = (unsigned char *) malloc(OUTPUT_BUF_SIZE); if (dest->newbuffer == NULL) ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); *outsize = OUTPUT_BUF_SIZE; diff --git a/jdatasrc-tj.c b/jdatasrc-tj.c index d860a02..259c6de 100644 --- a/jdatasrc-tj.c +++ b/jdatasrc-tj.c @@ -1,9 +1,11 @@ /* - * jdatasrc.c + * jdatasrc-tj.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. - * Modified 2009-2010 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. + * Modified 2009-2011 by Guido Vollbeding. + * libjpeg-turbo Modifications: + * Copyright (C) 2011, D. R. Commander. * For conditions of distribution and use, see the accompanying README file. * * This file contains decompression data source routines for the case of @@ -69,16 +71,17 @@ init_mem_source (j_decompress_ptr cinfo) METHODDEF(boolean) fill_mem_input_buffer (j_decompress_ptr cinfo) { - static JOCTET mybuffer[4]; + static const JOCTET mybuffer[4] = { + (JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0 + }; /* The whole JPEG data is expected to reside in the supplied memory * buffer, so any request for more data beyond the given buffer size * is treated as an error. */ WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ - mybuffer[0] = (JOCTET) 0xFF; - mybuffer[1] = (JOCTET) JPEG_EOI; cinfo->src->next_input_byte = mybuffer; cinfo->src->bytes_in_buffer = 2; diff --git a/jdatasrc.c b/jdatasrc.c index 7609f76..1e9c8ad 100644 --- a/jdatasrc.c +++ b/jdatasrc.c @@ -1,9 +1,11 @@ /* * jdatasrc.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. - * Modified 2009-2010 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. + * Modified 2009-2011 by Guido Vollbeding. + * libjpeg-turbo Modifications: + * Copyright (C) 2013, D. R. Commander. * For conditions of distribution and use, see the accompanying README file. * * This file contains decompression data source routines for the case of @@ -53,7 +55,7 @@ init_source (j_decompress_ptr cinfo) src->start_of_file = TRUE; } -#if JPEG_LIB_VERSION >= 80 +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) METHODDEF(void) init_mem_source (j_decompress_ptr cinfo) { @@ -120,20 +122,21 @@ fill_input_buffer (j_decompress_ptr cinfo) return TRUE; } -#if JPEG_LIB_VERSION >= 80 +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) METHODDEF(boolean) fill_mem_input_buffer (j_decompress_ptr cinfo) { - static JOCTET mybuffer[4]; + static const JOCTET mybuffer[4] = { + (JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0 + }; /* The whole JPEG data is expected to reside in the supplied memory * buffer, so any request for more data beyond the given buffer size * is treated as an error. */ WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ - mybuffer[0] = (JOCTET) 0xFF; - mybuffer[1] = (JOCTET) JPEG_EOI; cinfo->src->next_input_byte = mybuffer; cinfo->src->bytes_in_buffer = 2; @@ -243,7 +246,7 @@ jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile) } -#if JPEG_LIB_VERSION >= 80 +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) /* * Prepare for input from a supplied memory buffer. * The buffer must contain the whole JPEG data. diff --git a/jdcoefct.c b/jdcoefct.c index 48a9fc6..d38db6c 100644 --- a/jdcoefct.c +++ b/jdcoefct.c @@ -1,9 +1,10 @@ /* * jdcoefct.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1997, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2010, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains the coefficient buffer controller for decompression. diff --git a/jdcolext.c b/jdcolext.c index 3b8aeff..6e9e31a 100644 --- a/jdcolext.c +++ b/jdcolext.c @@ -1,9 +1,10 @@ /* * jdcolext.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2009, 2011, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains output colorspace conversion routines. diff --git a/jdcolor.c b/jdcolor.c index 694de9b..ccf9047 100644 --- a/jdcolor.c +++ b/jdcolor.c @@ -1,10 +1,12 @@ /* * jdcolor.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2011 by Guido Vollbeding. + * libjpeg-turbo Modifications: * Copyright 2009 Pierre Ossman for Cendio AB * Copyright (C) 2009, 2011-2012, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains output colorspace conversion routines. @@ -27,20 +29,28 @@ typedef struct { int * Cb_b_tab; /* => table for Cb to B conversion */ INT32 * Cr_g_tab; /* => table for Cr to G conversion */ INT32 * Cb_g_tab; /* => table for Cb to G conversion */ + + /* Private state for RGB->Y conversion */ + INT32 * rgb_y_tab; /* => table for RGB to Y conversion */ } my_color_deconverter; typedef my_color_deconverter * my_cconvert_ptr; /**************** YCbCr -> RGB conversion: most common case **************/ +/**************** RGB -> Y conversion: less common case **************/ /* * YCbCr is defined per CCIR 601-1, except that Cb and Cr are * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. * The conversion equations to be implemented are therefore + * * R = Y + 1.40200 * Cr * G = Y - 0.34414 * Cb - 0.71414 * Cr * B = Y + 1.77200 * Cb + * + * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B + * * where Cb and Cr represent the incoming values less CENTERJSAMPLE. * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) * @@ -65,6 +75,18 @@ typedef my_color_deconverter * my_cconvert_ptr; #define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) #define FIX(x) ((INT32) ((x) * (1L<Y conversion and divide it up into + * three parts, instead of doing three alloc_small requests. This lets us + * use a single table base address, which can be held in a register in the + * inner loops on many machines (more than can hold all three addresses, + * anyway). + */ + +#define R_Y_OFF 0 /* offset to R => Y section */ +#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */ +#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */ +#define TABLE_SIZE (3*(MAXJSAMPLE+1)) + /* Include inline routines for colorspace extensions */ @@ -272,6 +294,66 @@ ycc_rgb_convert (j_decompress_ptr cinfo, /* + * Initialize for RGB->grayscale colorspace conversion. + */ + +LOCAL(void) +build_rgb_y_table (j_decompress_ptr cinfo) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + INT32 * rgb_y_tab; + INT32 i; + + /* Allocate and fill in the conversion tables. */ + cconvert->rgb_y_tab = rgb_y_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (TABLE_SIZE * SIZEOF(INT32))); + + for (i = 0; i <= MAXJSAMPLE; i++) { + rgb_y_tab[i+R_Y_OFF] = FIX(0.29900) * i; + rgb_y_tab[i+G_Y_OFF] = FIX(0.58700) * i; + rgb_y_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF; + } +} + + +/* + * Convert RGB to grayscale. + */ + +METHODDEF(void) +rgb_gray_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_y_tab; + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + r = GETJSAMPLE(inptr0[col]); + g = GETJSAMPLE(inptr1[col]); + b = GETJSAMPLE(inptr2[col]); + /* Y */ + outptr[col] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + } + } +} + + +/* * Color conversion for no colorspace change: just copy the data, * converting from separate-planes to interleaved representation. */ @@ -409,6 +491,7 @@ rgb_rgb_convert (j_decompress_ptr cinfo, } } + /* * Adobe-style YCCK->CMYK conversion. * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same @@ -526,6 +609,9 @@ jinit_color_deconverter (j_decompress_ptr cinfo) /* For color->grayscale conversion, only the Y (0) component is needed */ for (ci = 1; ci < cinfo->num_components; ci++) cinfo->comp_info[ci].component_needed = FALSE; + } else if (cinfo->jpeg_color_space == JCS_RGB) { + cconvert->pub.color_convert = rgb_gray_convert; + build_rgb_y_table(cinfo); } else ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); break; diff --git a/jdct.h b/jdct.h index 7b49a97..3637448 100644 --- a/jdct.h +++ b/jdct.h @@ -95,9 +95,21 @@ typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */ #define jpeg_idct_islow jRDislow #define jpeg_idct_ifast jRDifast #define jpeg_idct_float jRDfloat +#define jpeg_idct_7x7 jRD7x7 +#define jpeg_idct_6x6 jRD6x6 +#define jpeg_idct_5x5 jRD5x5 #define jpeg_idct_4x4 jRD4x4 +#define jpeg_idct_3x3 jRD3x3 #define jpeg_idct_2x2 jRD2x2 #define jpeg_idct_1x1 jRD1x1 +#define jpeg_idct_9x9 jRD9x9 +#define jpeg_idct_10x10 jRD10x10 +#define jpeg_idct_11x11 jRD11x11 +#define jpeg_idct_12x12 jRD12x12 +#define jpeg_idct_13x13 jRD13x13 +#define jpeg_idct_14x14 jRD14x14 +#define jpeg_idct_15x15 jRD15x15 +#define jpeg_idct_16x16 jRD16x16 #endif /* NEED_SHORT_EXTERNAL_NAMES */ /* Extern declarations for the forward and inverse DCT routines. */ @@ -115,15 +127,51 @@ EXTERN(void) jpeg_idct_ifast EXTERN(void) jpeg_idct_float JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_7x7 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_5x5 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); EXTERN(void) jpeg_idct_4x4 JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_3x3 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); EXTERN(void) jpeg_idct_2x2 JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); EXTERN(void) jpeg_idct_1x1 JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_9x9 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_10x10 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_11x11 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_12x12 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_13x13 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_14x14 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_15x15 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_16x16 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); /* diff --git a/jddctmgr.c b/jddctmgr.c index 044e469..0a5decb 100644 --- a/jddctmgr.c +++ b/jddctmgr.c @@ -1,10 +1,12 @@ /* * jddctmgr.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2002-2010 by Guido Vollbeding. + * libjpeg-turbo Modifications: * Copyright 2009 Pierre Ossman for Cendio AB * Copyright (C) 2010, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains the inverse-DCT management logic. @@ -115,6 +117,10 @@ start_pass (j_decompress_ptr cinfo) method_ptr = jpeg_idct_2x2; method = JDCT_ISLOW; /* jidctred uses islow-style table */ break; + case 3: + method_ptr = jpeg_idct_3x3; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; case 4: if (jsimd_can_idct_4x4()) method_ptr = jsimd_idct_4x4; @@ -122,6 +128,18 @@ start_pass (j_decompress_ptr cinfo) method_ptr = jpeg_idct_4x4; method = JDCT_ISLOW; /* jidctred uses islow-style table */ break; + case 5: + method_ptr = jpeg_idct_5x5; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case 6: + method_ptr = jpeg_idct_6x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case 7: + method_ptr = jpeg_idct_7x7; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; #endif case DCTSIZE: switch (cinfo->dct_method) { @@ -157,6 +175,38 @@ start_pass (j_decompress_ptr cinfo) break; } break; + case 9: + method_ptr = jpeg_idct_9x9; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case 10: + method_ptr = jpeg_idct_10x10; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case 11: + method_ptr = jpeg_idct_11x11; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case 12: + method_ptr = jpeg_idct_12x12; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case 13: + method_ptr = jpeg_idct_13x13; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case 14: + method_ptr = jpeg_idct_14x14; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case 15: + method_ptr = jpeg_idct_15x15; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case 16: + method_ptr = jpeg_idct_16x16; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; default: ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->_DCT_scaled_size); break; diff --git a/jdhuff.c b/jdhuff.c index f822dba..dba5f18 100644 --- a/jdhuff.c +++ b/jdhuff.c @@ -1,9 +1,10 @@ /* * jdhuff.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2009-2011, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains Huffman entropy decoding routines. diff --git a/jdhuff.h b/jdhuff.h index 96f2dab..2201436 100644 --- a/jdhuff.h +++ b/jdhuff.h @@ -1,9 +1,10 @@ /* * jdhuff.h * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. + * Modifications: * Copyright (C) 2010-2011, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains declarations for Huffman entropy decoding routines diff --git a/jdinput.c b/jdinput.c index 9fcd089..e7ba33f 100644 --- a/jdinput.c +++ b/jdinput.c @@ -1,10 +1,10 @@ /* * jdinput.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 2002-2009 by Guido Vollbeding. + * libjpeg-turbo Modifications: * Copyright (C) 2010, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains input control logic for the JPEG decompressor. @@ -38,79 +38,6 @@ METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo)); * Routines to calculate various quantities related to the size of the image. */ - -#if JPEG_LIB_VERSION >= 80 -/* - * Compute output image dimensions and related values. - * NOTE: this is exported for possible use by application. - * Hence it mustn't do anything that can't be done twice. - */ - -GLOBAL(void) -jpeg_core_output_dimensions (j_decompress_ptr cinfo) -/* Do computations that are needed before master selection phase. - * This function is used for transcoding and full decompression. - */ -{ -#ifdef IDCT_SCALING_SUPPORTED - int ci; - jpeg_component_info *compptr; - - /* Compute actual output image dimensions and DCT scaling choices. */ - if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom) { - /* Provide 1/block_size scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, (long) cinfo->block_size); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, (long) cinfo->block_size); - cinfo->min_DCT_h_scaled_size = 1; - cinfo->min_DCT_v_scaled_size = 1; - } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 2) { - /* Provide 2/block_size scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 2L, (long) cinfo->block_size); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 2L, (long) cinfo->block_size); - cinfo->min_DCT_h_scaled_size = 2; - cinfo->min_DCT_v_scaled_size = 2; - } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 4) { - /* Provide 4/block_size scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 4L, (long) cinfo->block_size); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 4L, (long) cinfo->block_size); - cinfo->min_DCT_h_scaled_size = 4; - cinfo->min_DCT_v_scaled_size = 4; - } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 8) { - /* Provide 8/block_size scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * 8L, (long) cinfo->block_size); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * 8L, (long) cinfo->block_size); - cinfo->min_DCT_h_scaled_size = 8; - cinfo->min_DCT_v_scaled_size = 8; - } - /* Recompute dimensions of components */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size; - compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size; - } - -#else /* !IDCT_SCALING_SUPPORTED */ - - /* Hardwire it to "no scaling" */ - cinfo->output_width = cinfo->image_width; - cinfo->output_height = cinfo->image_height; - /* jdinput.c has already initialized DCT_scaled_size, - * and has computed unscaled downsampled_width and downsampled_height. - */ - -#endif /* IDCT_SCALING_SUPPORTED */ -} -#endif - - LOCAL(void) initial_setup (j_decompress_ptr cinfo) /* Called once, when first SOS marker is reached */ diff --git a/jdmainct.c b/jdmainct.c index eb32cae..26b816c 100644 --- a/jdmainct.c +++ b/jdmainct.c @@ -1,9 +1,10 @@ /* * jdmainct.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2010, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains the main buffer controller for decompression. diff --git a/jdmarker.c b/jdmarker.c index 6fc0f7d..c8771bc 100644 --- a/jdmarker.c +++ b/jdmarker.c @@ -1,9 +1,10 @@ /* * jdmarker.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1998, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2012, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains routines to decode JPEG datastream markers. @@ -303,7 +304,7 @@ get_sos (j_decompress_ptr cinfo) /* Process a SOS marker */ { INT32 length; - int i, ci, n, c, cc; + int i, ci, n, c, cc, pi; jpeg_component_info * compptr; INPUT_VARS(cinfo); @@ -347,6 +348,13 @@ get_sos (j_decompress_ptr cinfo) TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc, compptr->dc_tbl_no, compptr->ac_tbl_no); + + /* This CSi (cc) should differ from the previous CSi */ + for (pi = 0; pi < i; pi++) { + if (cinfo->cur_comp_info[pi] == compptr) { + ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); + } + } } /* Collect the additional scan parameters Ss, Se, Ah/Al. */ @@ -464,18 +472,21 @@ get_dht (j_decompress_ptr cinfo) for (i = 0; i < count; i++) INPUT_BYTE(cinfo, huffval[i], return FALSE); + MEMZERO(&huffval[count], (256 - count) * SIZEOF(UINT8)); + length -= count; if (index & 0x10) { /* AC table definition */ index -= 0x10; + if (index < 0 || index >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_DHT_INDEX, index); htblptr = &cinfo->ac_huff_tbl_ptrs[index]; } else { /* DC table definition */ + if (index < 0 || index >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_DHT_INDEX, index); htblptr = &cinfo->dc_huff_tbl_ptrs[index]; } - if (index < 0 || index >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_DHT_INDEX, index); - if (*htblptr == NULL) *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); diff --git a/jdmaster.c b/jdmaster.c index c73ec02..e1f9f9e 100644 --- a/jdmaster.c +++ b/jdmaster.c @@ -1,9 +1,11 @@ /* * jdmaster.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2002-2009 by Guido Vollbeding. + * libjpeg-turbo Modifications: * Copyright (C) 2009-2011, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains master control logic for the JPEG decompressor. @@ -89,6 +91,177 @@ use_merged_upsample (j_decompress_ptr cinfo) * Compute output image dimensions and related values. * NOTE: this is exported for possible use by application. * Hence it mustn't do anything that can't be done twice. + */ + +#if JPEG_LIB_VERSION >= 80 +GLOBAL(void) +#else +LOCAL(void) +#endif +jpeg_core_output_dimensions (j_decompress_ptr cinfo) +/* Do computations that are needed before master selection phase. + * This function is used for transcoding and full decompression. + */ +{ +#ifdef IDCT_SCALING_SUPPORTED + int ci; + jpeg_component_info *compptr; + + /* Compute actual output image dimensions and DCT scaling choices. */ + if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom) { + /* Provide 1/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 1; + cinfo->_min_DCT_v_scaled_size = 1; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 2) { + /* Provide 2/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 2L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 2L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 2; + cinfo->_min_DCT_v_scaled_size = 2; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 3) { + /* Provide 3/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 3L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 3L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 3; + cinfo->_min_DCT_v_scaled_size = 3; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 4) { + /* Provide 4/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 4L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 4L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 4; + cinfo->_min_DCT_v_scaled_size = 4; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 5) { + /* Provide 5/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 5L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 5L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 5; + cinfo->_min_DCT_v_scaled_size = 5; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 6) { + /* Provide 6/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 6L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 6L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 6; + cinfo->_min_DCT_v_scaled_size = 6; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 7) { + /* Provide 7/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 7L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 7L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 7; + cinfo->_min_DCT_v_scaled_size = 7; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 8) { + /* Provide 8/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 8L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 8L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 8; + cinfo->_min_DCT_v_scaled_size = 8; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 9) { + /* Provide 9/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 9L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 9L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 9; + cinfo->_min_DCT_v_scaled_size = 9; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 10) { + /* Provide 10/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 10L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 10L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 10; + cinfo->_min_DCT_v_scaled_size = 10; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 11) { + /* Provide 11/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 11L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 11L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 11; + cinfo->_min_DCT_v_scaled_size = 11; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 12) { + /* Provide 12/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 12L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 12L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 12; + cinfo->_min_DCT_v_scaled_size = 12; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 13) { + /* Provide 13/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 13L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 13L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 13; + cinfo->_min_DCT_v_scaled_size = 13; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 14) { + /* Provide 14/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 14L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 14L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 14; + cinfo->_min_DCT_v_scaled_size = 14; + } else if (cinfo->scale_num * DCTSIZE <= cinfo->scale_denom * 15) { + /* Provide 15/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 15L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 15L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 15; + cinfo->_min_DCT_v_scaled_size = 15; + } else { + /* Provide 16/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 16L, (long) DCTSIZE); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 16L, (long) DCTSIZE); + cinfo->_min_DCT_h_scaled_size = 16; + cinfo->_min_DCT_v_scaled_size = 16; + } + + /* Recompute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->_DCT_h_scaled_size = cinfo->_min_DCT_h_scaled_size; + compptr->_DCT_v_scaled_size = cinfo->_min_DCT_v_scaled_size; + } + +#else /* !IDCT_SCALING_SUPPORTED */ + + /* Hardwire it to "no scaling" */ + cinfo->output_width = cinfo->image_width; + cinfo->output_height = cinfo->image_height; + /* jdinput.c has already initialized DCT_scaled_size, + * and has computed unscaled downsampled_width and downsampled_height. + */ + +#endif /* IDCT_SCALING_SUPPORTED */ +} + + +/* + * Compute output image dimensions and related values. + * NOTE: this is exported for possible use by application. + * Hence it mustn't do anything that can't be done twice. * Also note that it may be called before the master module is initialized! */ @@ -105,65 +278,24 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo) if (cinfo->global_state != DSTATE_READY) ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Compute core output image dimensions and DCT scaling choices. */ + jpeg_core_output_dimensions(cinfo); + #ifdef IDCT_SCALING_SUPPORTED - /* Compute actual output image dimensions and DCT scaling choices. */ - if (cinfo->scale_num * 8 <= cinfo->scale_denom) { - /* Provide 1/8 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 8L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 8L); -#if JPEG_LIB_VERSION >= 70 - cinfo->min_DCT_h_scaled_size = cinfo->min_DCT_v_scaled_size = 1; -#else - cinfo->min_DCT_scaled_size = 1; -#endif - } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) { - /* Provide 1/4 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 4L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 4L); -#if JPEG_LIB_VERSION >= 70 - cinfo->min_DCT_h_scaled_size = cinfo->min_DCT_v_scaled_size = 2; -#else - cinfo->min_DCT_scaled_size = 2; -#endif - } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) { - /* Provide 1/2 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 2L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 2L); -#if JPEG_LIB_VERSION >= 70 - cinfo->min_DCT_h_scaled_size = cinfo->min_DCT_v_scaled_size = 4; -#else - cinfo->min_DCT_scaled_size = 4; -#endif - } else { - /* Provide 1/1 scaling */ - cinfo->output_width = cinfo->image_width; - cinfo->output_height = cinfo->image_height; -#if JPEG_LIB_VERSION >= 70 - cinfo->min_DCT_h_scaled_size = cinfo->min_DCT_v_scaled_size = DCTSIZE; -#else - cinfo->min_DCT_scaled_size = DCTSIZE; -#endif - } /* In selecting the actual DCT scaling for each component, we try to * scale up the chroma components via IDCT scaling rather than upsampling. * This saves time if the upsampler gets to use 1:1 scaling. - * Note this code assumes that the supported DCT scalings are powers of 2. + * Note this code adapts subsampling ratios which are powers of 2. */ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { int ssize = cinfo->_min_DCT_scaled_size; while (ssize < DCTSIZE && - (compptr->h_samp_factor * ssize * 2 <= - cinfo->max_h_samp_factor * cinfo->_min_DCT_scaled_size) && - (compptr->v_samp_factor * ssize * 2 <= - cinfo->max_v_samp_factor * cinfo->_min_DCT_scaled_size)) { + ((cinfo->max_h_samp_factor * cinfo->_min_DCT_scaled_size) % + (compptr->h_samp_factor * ssize * 2) == 0) && + ((cinfo->max_v_samp_factor * cinfo->_min_DCT_scaled_size) % + (compptr->v_samp_factor * ssize * 2) == 0)) { ssize = ssize * 2; } #if JPEG_LIB_VERSION >= 70 diff --git a/jdmerge.c b/jdmerge.c index 5336125..9830be2 100644 --- a/jdmerge.c +++ b/jdmerge.c @@ -1,10 +1,11 @@ /* * jdmerge.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. * Copyright 2009 Pierre Ossman for Cendio AB + * libjpeg-turbo Modifications: * Copyright (C) 2009, 2011, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains code for merged upsampling/color conversion. diff --git a/jdmrgext.c b/jdmrgext.c index 2b93265..1f0a550 100644 --- a/jdmrgext.c +++ b/jdmrgext.c @@ -1,9 +1,10 @@ /* * jdmrgext.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2011, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains code for merged upsampling/color conversion. diff --git a/jdphuff.c b/jdphuff.c index 2267809..fa97aab 100644 --- a/jdphuff.c +++ b/jdphuff.c @@ -198,6 +198,7 @@ start_pass_phuff_decoder (j_decompress_ptr cinfo) * On some machines, a shift and add will be faster than a table lookup. */ +#define AVOID_TABLES #ifdef AVOID_TABLES #define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x)) diff --git a/jdsample.c b/jdsample.c index 1864dd6..361b589 100644 --- a/jdsample.c +++ b/jdsample.c @@ -1,10 +1,11 @@ /* * jdsample.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1996, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright 2009 Pierre Ossman for Cendio AB * Copyright (C) 2010, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains upsampling routines. diff --git a/jidctint.c b/jidctint.c index a72b320..77d8121 100644 --- a/jidctint.c +++ b/jidctint.c @@ -2,6 +2,7 @@ * jidctint.c * * Copyright (C) 1991-1998, Thomas G. Lane. + * Modification developed 2002-2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -23,6 +24,27 @@ * The advantage of this method is that no data path contains more than one * multiplication; this allows a very simple and accurate implementation in * scaled fixed-point arithmetic, with a minimal number of shifts. + * + * We also provide IDCT routines with various output sample block sizes for + * direct resolution reduction or enlargement without additional resampling: + * NxN (N=1...16) pixels for one 8x8 input DCT block. + * + * For N<8 we simply take the corresponding low-frequency coefficients of + * the 8x8 input DCT block and apply an NxN point IDCT on the sub-block + * to yield the downscaled outputs. + * This can be seen as direct low-pass downsampling from the DCT domain + * point of view rather than the usual spatial domain point of view, + * yielding significant computational savings and results at least + * as good as common bilinear (averaging) spatial downsampling. + * + * For N>8 we apply a partial NxN IDCT on the 8 input coefficients as + * lower frequencies and higher frequencies assumed to be zero. + * It turns out that the computational effort is similar to the 8x8 IDCT + * regarding the output size. + * Furthermore, the scaling and descaling is the same for all IDCT sizes. + * + * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases + * since there would be too many additional constants to pre-calculate. */ #define JPEG_INTERNALS @@ -38,7 +60,7 @@ */ #if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ + Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */ #endif @@ -386,4 +408,2216 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, } } +#ifdef IDCT_SCALING_SUPPORTED + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 7x7 output block. + * + * Optimized algorithm with 12 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/14). + */ + +GLOBAL(void) +jpeg_idct_7x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[7*7]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp13 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp13 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp13 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp0 = z1 + z3; + z2 -= tmp0; + tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */ + tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + + tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp0 += z2; + tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + wsptr[7*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[7*6] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[7*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[7*5] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[7*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[7*4] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[7*3] = (int) RIGHT_SHIFT(tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 7 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp13 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp13 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp0 = z1 + z3; + z2 -= tmp0; + tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */ + tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + + tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp0 += z2; + tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 7; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 6x6 output block. + * + * Optimized algorithm with 3 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/12). + */ + +GLOBAL(void) +jpeg_idct_6x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS); + tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) (tmp11 + tmp1); + wsptr[6*4] = (int) (tmp11 - tmp1); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[6*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[4]; + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = tmp0 - tmp10 - tmp10; + tmp10 = (INT32) wsptr[2]; + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 5x5 output block. + * + * Optimized algorithm with 5 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/10). + */ + +GLOBAL(void) +jpeg_idct_5x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[5*5]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp12 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp12 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + wsptr[5*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[5*4] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[5*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[5*3] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[5*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 5 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp12 <<= CONST_BITS; + tmp0 = (INT32) wsptr[2]; + tmp1 = (INT32) wsptr[4]; + z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 5; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 3x3 output block. + * + * Optimized algorithm with 2 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/6). + */ + +GLOBAL(void) +jpeg_idct_3x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[3*3]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 3 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[2]; + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = (INT32) wsptr[1]; + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 3; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 9x9 output block. + * + * Optimized algorithm with 10 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/18). + */ + +GLOBAL(void) +jpeg_idct_9x9 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*9]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */ + tmp1 = tmp0 + tmp3; + tmp2 = tmp0 - tmp3 - tmp3; + + tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */ + tmp11 = tmp2 + tmp0; + tmp14 = tmp2 - tmp0 - tmp0; + + tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */ + tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */ + tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */ + + tmp10 = tmp1 + tmp0 - tmp3; + tmp12 = tmp1 - tmp0 + tmp2; + tmp13 = tmp1 - tmp2 + tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */ + + tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */ + tmp0 = tmp2 + tmp3 - z2; + tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */ + tmp2 += z2 - tmp1; + tmp3 += z2 + tmp1; + tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp13 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp13 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 9 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 9; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */ + tmp1 = tmp0 + tmp3; + tmp2 = tmp0 - tmp3 - tmp3; + + tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */ + tmp11 = tmp2 + tmp0; + tmp14 = tmp2 - tmp0 - tmp0; + + tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */ + tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */ + tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */ + + tmp10 = tmp1 + tmp0 - tmp3; + tmp12 = tmp1 - tmp0 + tmp2; + tmp13 = tmp1 - tmp2 + tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */ + + tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */ + tmp0 = tmp2 + tmp3 - z2; + tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */ + tmp2 += z2 - tmp1; + tmp3 += z2 + tmp1; + tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 10x10 output block. + * + * Optimized algorithm with 12 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/20). + */ + +GLOBAL(void) +jpeg_idct_10x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + INT32 z1, z2, z3, z4, z5; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*10]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + z5 = z3 << CONST_BITS; + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z5 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = (z1 - tmp13 - z3) << PASS1_BITS; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) (tmp22 + tmp12); + wsptr[8*7] = (int) (tmp22 - tmp12); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 10 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 10; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[7]; + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z3 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = ((z1 - tmp13) << CONST_BITS) - z3; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 11x11 output block. + * + * Optimized algorithm with 24 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/22). + */ + +GLOBAL(void) +jpeg_idct_11x11 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*11]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp10 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp10 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */ + tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */ + z4 = z1 + z3; + tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */ + z4 -= z2; + tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */ + tmp21 = tmp20 + tmp23 + tmp25 - + MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */ + tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */ + tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */ + tmp24 += tmp25; + tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */ + tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */ + MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */ + tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z2; + tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */ + tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */ + tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */ + z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */ + tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */ + tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */ + z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */ + tmp11 += z1; + tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */ + tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */ + MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */ + MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 11 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 11; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp10 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */ + tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */ + z4 = z1 + z3; + tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */ + z4 -= z2; + tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */ + tmp21 = tmp20 + tmp23 + tmp25 - + MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */ + tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */ + tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */ + tmp24 += tmp25; + tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */ + tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */ + MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */ + tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z2; + tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */ + tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */ + tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */ + z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */ + tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */ + tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */ + z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */ + tmp11 += z1; + tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */ + tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */ + MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */ + MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 12x12 output block. + * + * Optimized algorithm with 15 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/24). + */ + +GLOBAL(void) +jpeg_idct_12x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*12]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 12 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 12; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + + z4 = (INT32) wsptr[4]; + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = (INT32) wsptr[2]; + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = (INT32) wsptr[6]; + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 13x13 output block. + * + * Optimized algorithm with 29 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/26). + */ + +GLOBAL(void) +jpeg_idct_13x13 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*13]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */ + + tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */ + tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */ + + tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */ + tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */ + + tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */ + tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */ + + tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */ + tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */ + tmp15 = z1 + z4; + tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */ + tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */ + tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */ + tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */ + tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */ + tmp11 += tmp14; + tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */ + tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */ + tmp12 += tmp14; + tmp13 += tmp14; + tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */ + tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */ + MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */ + z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */ + tmp14 += z1; + tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */ + MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 13 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 13; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[4]; + z4 = (INT32) wsptr[6]; + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */ + + tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */ + tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */ + + tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */ + tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */ + + tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */ + tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */ + + tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */ + tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */ + tmp15 = z1 + z4; + tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */ + tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */ + tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */ + tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */ + tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */ + tmp11 += tmp14; + tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */ + tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */ + tmp12 += tmp14; + tmp13 += tmp14; + tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */ + tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */ + MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */ + z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */ + tmp14 += z1; + tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */ + MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 14x14 output block. + * + * Optimized algorithm with 20 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/28). + */ + +GLOBAL(void) +jpeg_idct_14x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*14]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp13 = z4 << CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */ + tmp16 += tmp15; + z1 += z4; + z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */ + tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = (z1 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) (tmp23 + tmp13); + wsptr[8*10] = (int) (tmp23 - tmp13); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 14 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 14; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */ + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + z4 <<= CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */ + tmp16 += tmp15; + tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */ + tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = ((z1 - z3) << CONST_BITS) + z4; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 15x15 output block. + * + * Optimized algorithm with 22 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/30). + */ + +GLOBAL(void) +jpeg_idct_15x15 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*15]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */ + tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */ + + tmp12 = z1 - tmp10; + tmp13 = z1 + tmp11; + z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */ + + z4 = z2 - z3; + z3 += z2; + tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */ + z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */ + + tmp20 = tmp13 + tmp10 + tmp11; + tmp23 = tmp12 - tmp10 + tmp11 + z2; + + tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */ + + tmp25 = tmp13 - tmp10 - tmp11; + tmp26 = tmp12 + tmp10 - tmp11 - z2; + + tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */ + + tmp21 = tmp12 + tmp10 + tmp11; + tmp24 = tmp13 - tmp10 + tmp11; + tmp11 += tmp11; + tmp22 = z1 + tmp11; /* c10 = c6-c12 */ + tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z4 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */ + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp13 = z2 - z4; + tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */ + tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */ + tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */ + + tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */ + tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */ + z2 = z1 - z4; + tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */ + + tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */ + tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */ + tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */ + z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */ + tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */ + tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 15 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 15; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[4]; + z4 = (INT32) wsptr[6]; + + tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */ + tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */ + + tmp12 = z1 - tmp10; + tmp13 = z1 + tmp11; + z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */ + + z4 = z2 - z3; + z3 += z2; + tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */ + z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */ + + tmp20 = tmp13 + tmp10 + tmp11; + tmp23 = tmp12 - tmp10 + tmp11 + z2; + + tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */ + + tmp25 = tmp13 - tmp10 - tmp11; + tmp26 = tmp12 + tmp10 - tmp11 - z2; + + tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */ + + tmp21 = tmp12 + tmp10 + tmp11; + tmp24 = tmp13 - tmp10 + tmp11; + tmp11 += tmp11; + tmp22 = z1 + tmp11; /* c10 = c6-c12 */ + tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z4 = (INT32) wsptr[5]; + z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */ + z4 = (INT32) wsptr[7]; + + tmp13 = z2 - z4; + tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */ + tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */ + tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */ + + tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */ + tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */ + z2 = z1 - z4; + tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */ + + tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */ + tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */ + tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */ + z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */ + tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */ + tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 16x16 output block. + * + * Optimized algorithm with 28 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/32). + */ + +GLOBAL(void) +jpeg_idct_16x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*16]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += 1 << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 16 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 16; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[4]; + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + +#endif /* IDCT_SCALING_SUPPORTED */ #endif /* DCT_ISLOW_SUPPORTED */ diff --git a/jmorecfg.h b/jmorecfg.h index f22c4f3..55af056 100644 --- a/jmorecfg.h +++ b/jmorecfg.h @@ -1,9 +1,10 @@ /* * jmorecfg.h * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1997, Thomas G. Lane. + * Modifications: * Copyright (C) 2009, 2011, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains additional configuration options that customize the @@ -211,8 +212,11 @@ typedef unsigned int JDIMENSION; */ #ifdef NEED_FAR_POINTERS +#ifndef FAR #define FAR far +#endif #else +#undef FAR #define FAR #endif diff --git a/jpegcomp.h b/jpegcomp.h index 1b9e0a4..ed9eeab 100644 --- a/jpegcomp.h +++ b/jpegcomp.h @@ -11,6 +11,8 @@ #if JPEG_LIB_VERSION >= 70 #define _DCT_scaled_size DCT_h_scaled_size +#define _DCT_h_scaled_size DCT_h_scaled_size +#define _DCT_v_scaled_size DCT_v_scaled_size #define _min_DCT_scaled_size min_DCT_h_scaled_size #define _min_DCT_h_scaled_size min_DCT_h_scaled_size #define _min_DCT_v_scaled_size min_DCT_v_scaled_size @@ -18,6 +20,8 @@ #define _jpeg_height jpeg_height #else #define _DCT_scaled_size DCT_scaled_size +#define _DCT_h_scaled_size DCT_scaled_size +#define _DCT_v_scaled_size DCT_scaled_size #define _min_DCT_scaled_size min_DCT_scaled_size #define _min_DCT_h_scaled_size min_DCT_scaled_size #define _min_DCT_v_scaled_size min_DCT_scaled_size diff --git a/jpeglib.h b/jpeglib.h index d19a3ef..91668ed 100644 --- a/jpeglib.h +++ b/jpeglib.h @@ -1,10 +1,11 @@ /* * jpeglib.h * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1998, Thomas G. Lane. * Modified 2002-2009 by Guido Vollbeding. - * Copyright (C) 2009-2011, D. R. Commander. - * This file is part of the Independent JPEG Group's software. + * Modifications: + * Copyright (C) 2009-2011, 2013, D. R. Commander. * For conditions of distribution and use, see the accompanying README file. * * This file defines the application interface for the JPEG library. @@ -912,7 +913,7 @@ typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); #define jpeg_destroy_decompress jDestDecompress #define jpeg_stdio_dest jStdDest #define jpeg_stdio_src jStdSrc -#if JPEG_LIB_VERSION >= 80 +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) #define jpeg_mem_dest jMemDest #define jpeg_mem_src jMemSrc #endif @@ -999,7 +1000,7 @@ EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); -#if JPEG_LIB_VERSION >= 80 +#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED) /* Data source and destination managers: memory buffers. */ EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, unsigned char ** outbuffer, diff --git a/jpegtran.1 b/jpegtran.1 index 160b47d..b6a3e56 100644 --- a/jpegtran.1 +++ b/jpegtran.1 @@ -1,4 +1,4 @@ -.TH JPEGTRAN 1 "31 January 2012" +.TH JPEGTRAN 1 "1 January 2013" .SH NAME jpegtran \- lossless transformation of JPEG files .SH SYNOPSIS @@ -251,6 +251,9 @@ Wallace, Gregory K. "The JPEG Still Picture Compression Standard", Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44. .SH AUTHOR Independent JPEG Group +.PP +This file was modified by The libjpeg-turbo Project to include only information +relevant to libjpeg-turbo and to wordsmith certain sections. .SH BUGS The transform options can't transform odd-size images perfectly. Use .B \-trim diff --git a/jpegtran.c b/jpegtran.c index 6a22ed2..54c8ece 100644 --- a/jpegtran.c +++ b/jpegtran.c @@ -1,9 +1,10 @@ /* * jpegtran.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1995-2010, Thomas G. Lane, Guido Vollbeding. + * libjpeg-turbo Modifications: * Copyright (C) 2010, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains a command-line user interface for JPEG transcoding. @@ -205,7 +206,7 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv, fprintf(stderr, "%s version %s (build %s)\n", PACKAGE_NAME, VERSION, BUILD); fprintf(stderr, "%s\n\n", JCOPYRIGHT); - fprintf(stderr, "Emulating The Independent JPEG Group's libjpeg, version %s\n\n", + fprintf(stderr, "Emulating The Independent JPEG Group's software, version %s\n\n", JVERSION); printed_version = TRUE; } diff --git a/jquant1.c b/jquant1.c index 362bb1e..aa2c59a 100644 --- a/jquant1.c +++ b/jquant1.c @@ -1,9 +1,10 @@ /* * jquant1.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1996, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2009, D. R. Commander - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains 1-pass color quantization (color mapping) routines. diff --git a/jquant2.c b/jquant2.c index da964f7..9b060e5 100644 --- a/jquant2.c +++ b/jquant2.c @@ -1,9 +1,10 @@ /* * jquant2.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1996, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2009, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains 2-pass color quantization (color mapping) routines. diff --git a/jversion.h b/jversion.h index 71d7b91..c37651b 100644 --- a/jversion.h +++ b/jversion.h @@ -1,9 +1,10 @@ /* * jversion.h * - * Copyright (C) 1991-2010, Thomas G. Lane, Guido Vollbeding. - * Copyright (C) 2010, 2012, D. R. Commander. - * This file is part of the Independent JPEG Group's software. + * This file was part of the Independent JPEG Group's software: + * Copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding. + * Modifications: + * Copyright (C) 2010, 2012-2014, D. R. Commander. * For conditions of distribution and use, see the accompanying README file. * * This file contains software version identification. @@ -12,11 +13,11 @@ #if JPEG_LIB_VERSION >= 80 -#define JVERSION "8b 16-May-2010" +#define JVERSION "8d 15-Jan-2012" #elif JPEG_LIB_VERSION >= 70 -#define JVERSION "7 27-Jun-2009" +#define JVERSION "7 27-Jun-2009" #else @@ -24,8 +25,8 @@ #endif -#define JCOPYRIGHT "Copyright (C) 1991-2010 Thomas G. Lane, Guido Vollbeding\n" \ +#define JCOPYRIGHT "Copyright (C) 1991-2012 Thomas G. Lane, Guido Vollbeding\n" \ "Copyright (C) 1999-2006 MIYASAKA Masaru\n" \ "Copyright (C) 2009 Pierre Ossman for Cendio AB\n" \ - "Copyright (C) 2009-2012 D. R. Commander\n" \ + "Copyright (C) 2009-2014 D. R. Commander\n" \ "Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies)" diff --git a/libjpeg.map.in b/libjpeg.map.in index 5443943..b4480d8 100644 --- a/libjpeg.map.in +++ b/libjpeg.map.in @@ -1,4 +1,5 @@ LIBJPEGTURBO_@JPEG_LIB_VERSION_DECIMAL@ { + @MEM_SRCDST_FUNCTIONS@ local: jsimd_*; jconst_*; diff --git a/libjpeg.txt b/libjpeg.txt index d350fc7..88d3a5d 100644 --- a/libjpeg.txt +++ b/libjpeg.txt @@ -1,7 +1,9 @@ USING THE IJG JPEG LIBRARY -Copyright (C) 1994-2010, Thomas G. Lane, Guido Vollbeding, D. R. Commander. -This file is part of the Independent JPEG Group's software. +This file was part of the Independent JPEG Group's software: +Copyright (C) 1994-2011, Thomas G. Lane, Guido Vollbeding. +Modifications: +Copyright (C) 2010, D. R. Commander. For conditions of distribution and use, see the accompanying README file. @@ -1019,7 +1021,8 @@ The actual dimensions of the JPEG image that will be written to the file are given by the following fields. These are computed from the input image dimensions and the compression parameters by jpeg_start_compress(). You can also call jpeg_calc_jpeg_dimensions() to obtain the values that will result -from the current parameter settings. +from the current parameter settings. This can be useful if you are trying +to pick a scaling ratio that will get close to a desired target size. JDIMENSION jpeg_width Actual dimensions of output image. JDIMENSION jpeg_height @@ -1113,7 +1116,8 @@ J_COLOR_SPACE out_color_space unsigned int scale_num, scale_denom Scale the image by the fraction scale_num/scale_denom. Default is 1/1, or no scaling. Currently, the only supported scaling ratios - are 1/1, 1/2, 1/4, and 1/8. (The library design allows for arbitrary + are M/8 with all M from 1 to 16, or any reduced fraction thereof (such + as 1/2, 3/4, etc.) (The library design allows for arbitrary scaling ratios but this is not likely to be implemented any time soon.) Smaller scaling ratios permit significantly faster decoding since fewer pixels need be processed and a simpler IDCT method can be used. @@ -1275,8 +1279,9 @@ jpeg_read_header's guess by setting jpeg_color_space. jpeg_read_header also selects a default output color space based on (its guess of) jpeg_color_space; set out_color_space to override this. Again, you must select a supported transformation. jdcolor.c currently supports - YCbCr => GRAYSCALE YCbCr => RGB + YCbCr => GRAYSCALE + RGB => GRAYSCALE GRAYSCALE => RGB YCCK => CMYK as well as the null transforms. (Since GRAYSCALE=>RGB is provided, an diff --git a/md5/Makefile.am b/md5/Makefile.am new file mode 100644 index 0000000..b36f019 --- /dev/null +++ b/md5/Makefile.am @@ -0,0 +1,4 @@ +noinst_PROGRAMS = md5cmp + +md5cmp_SOURCES = md5cmp.c md5.c md5hl.c md5.h +md5cmp_CFLAGS = -I$(srcdir) diff --git a/md5/Makefile.in b/md5/Makefile.in new file mode 100644 index 0000000..0dd0a78 --- /dev/null +++ b/md5/Makefile.in @@ -0,0 +1,515 @@ +# Makefile.in generated by automake 1.9.2 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 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@ + +SOURCES = $(md5cmp_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +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@ +noinst_PROGRAMS = md5cmp$(EXEEXT) +subdir = md5 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/jconfig.h +CONFIG_CLEAN_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_md5cmp_OBJECTS = md5cmp-md5cmp.$(OBJEXT) md5cmp-md5.$(OBJEXT) \ + md5cmp-md5hl.$(OBJEXT) +md5cmp_OBJECTS = $(am_md5cmp_OBJECTS) +md5cmp_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(md5cmp_SOURCES) +DIST_SOURCES = $(md5cmp_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD = @BUILD@ +CC = @CC@ +CCAS = @CCAS@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBARCH = @DEBARCH@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JAR = @JAR@ +JAVA = @JAVA@ +JAVAC = @JAVAC@ +JAVACFLAGS = @JAVACFLAGS@ +JAVA_RPM_CONTENTS_1 = @JAVA_RPM_CONTENTS_1@ +JAVA_RPM_CONTENTS_2 = @JAVA_RPM_CONTENTS_2@ +JNI_CFLAGS = @JNI_CFLAGS@ +JPEG_LIB_VERSION = @JPEG_LIB_VERSION@ +JPEG_LIB_VERSION_DECIMAL = @JPEG_LIB_VERSION_DECIMAL@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_CURRENT = @LIBTOOL_CURRENT@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MEM_SRCDST_FUNCTIONS = @MEM_SRCDST_FUNCTIONS@ +NAFLAGS = @NAFLAGS@ +NASM = @NASM@ +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@ +PKGNAME = @PKGNAME@ +RANLIB = @RANLIB@ +RPMARCH = @RPMARCH@ +RPM_CONFIG_ARGS = @RPM_CONFIG_ARGS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIMD_ARM_FALSE = @SIMD_ARM_FALSE@ +SIMD_ARM_TRUE = @SIMD_ARM_TRUE@ +SIMD_I386_FALSE = @SIMD_I386_FALSE@ +SIMD_I386_TRUE = @SIMD_I386_TRUE@ +SIMD_X86_64_FALSE = @SIMD_X86_64_FALSE@ +SIMD_X86_64_TRUE = @SIMD_X86_64_TRUE@ +SO_AGE = @SO_AGE@ +SO_MAJOR_VERSION = @SO_MAJOR_VERSION@ +SO_MINOR_VERSION = @SO_MINOR_VERSION@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSION_SCRIPT_FALSE = @VERSION_SCRIPT_FALSE@ +VERSION_SCRIPT_FLAG = @VERSION_SCRIPT_FLAG@ +VERSION_SCRIPT_TRUE = @VERSION_SCRIPT_TRUE@ +WITH_ARITH_DEC_FALSE = @WITH_ARITH_DEC_FALSE@ +WITH_ARITH_DEC_TRUE = @WITH_ARITH_DEC_TRUE@ +WITH_ARITH_ENC_FALSE = @WITH_ARITH_ENC_FALSE@ +WITH_ARITH_ENC_TRUE = @WITH_ARITH_ENC_TRUE@ +WITH_ARITH_FALSE = @WITH_ARITH_FALSE@ +WITH_ARITH_TRUE = @WITH_ARITH_TRUE@ +WITH_JAVA = @WITH_JAVA@ +WITH_JAVA_FALSE = @WITH_JAVA_FALSE@ +WITH_JAVA_TRUE = @WITH_JAVA_TRUE@ +WITH_SIMD_FALSE = @WITH_SIMD_FALSE@ +WITH_SIMD_TRUE = @WITH_SIMD_TRUE@ +WITH_SSE_FLOAT_DCT_FALSE = @WITH_SSE_FLOAT_DCT_FALSE@ +WITH_SSE_FLOAT_DCT_TRUE = @WITH_SSE_FLOAT_DCT_TRUE@ +WITH_TURBOJPEG_FALSE = @WITH_TURBOJPEG_FALSE@ +WITH_TURBOJPEG_TRUE = @WITH_TURBOJPEG_TRUE@ +X86_64_FALSE = @X86_64_FALSE@ +X86_64_TRUE = @X86_64_TRUE@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +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@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +md5cmp_SOURCES = md5cmp.c md5.c md5hl.c md5.h +md5cmp_CFLAGS = -I$(srcdir) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(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 md5/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign md5/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: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +md5cmp$(EXEEXT): $(md5cmp_OBJECTS) $(md5cmp_DEPENDENCIES) + @rm -f md5cmp$(EXEEXT) + $(LINK) $(md5cmp_LDFLAGS) $(md5cmp_OBJECTS) $(md5cmp_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5cmp-md5.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5cmp-md5cmp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5cmp-md5hl.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@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@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@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@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@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 $@ $< + +md5cmp-md5cmp.o: md5cmp.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(md5cmp_CFLAGS) $(CFLAGS) -MT md5cmp-md5cmp.o -MD -MP -MF "$(DEPDIR)/md5cmp-md5cmp.Tpo" -c -o md5cmp-md5cmp.o `test -f 'md5cmp.c' || echo '$(srcdir)/'`md5cmp.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/md5cmp-md5cmp.Tpo" "$(DEPDIR)/md5cmp-md5cmp.Po"; else rm -f "$(DEPDIR)/md5cmp-md5cmp.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='md5cmp.c' object='md5cmp-md5cmp.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) $(md5cmp_CFLAGS) $(CFLAGS) -c -o md5cmp-md5cmp.o `test -f 'md5cmp.c' || echo '$(srcdir)/'`md5cmp.c + +md5cmp-md5cmp.obj: md5cmp.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(md5cmp_CFLAGS) $(CFLAGS) -MT md5cmp-md5cmp.obj -MD -MP -MF "$(DEPDIR)/md5cmp-md5cmp.Tpo" -c -o md5cmp-md5cmp.obj `if test -f 'md5cmp.c'; then $(CYGPATH_W) 'md5cmp.c'; else $(CYGPATH_W) '$(srcdir)/md5cmp.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/md5cmp-md5cmp.Tpo" "$(DEPDIR)/md5cmp-md5cmp.Po"; else rm -f "$(DEPDIR)/md5cmp-md5cmp.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='md5cmp.c' object='md5cmp-md5cmp.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) $(md5cmp_CFLAGS) $(CFLAGS) -c -o md5cmp-md5cmp.obj `if test -f 'md5cmp.c'; then $(CYGPATH_W) 'md5cmp.c'; else $(CYGPATH_W) '$(srcdir)/md5cmp.c'; fi` + +md5cmp-md5.o: md5.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(md5cmp_CFLAGS) $(CFLAGS) -MT md5cmp-md5.o -MD -MP -MF "$(DEPDIR)/md5cmp-md5.Tpo" -c -o md5cmp-md5.o `test -f 'md5.c' || echo '$(srcdir)/'`md5.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/md5cmp-md5.Tpo" "$(DEPDIR)/md5cmp-md5.Po"; else rm -f "$(DEPDIR)/md5cmp-md5.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='md5.c' object='md5cmp-md5.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) $(md5cmp_CFLAGS) $(CFLAGS) -c -o md5cmp-md5.o `test -f 'md5.c' || echo '$(srcdir)/'`md5.c + +md5cmp-md5.obj: md5.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(md5cmp_CFLAGS) $(CFLAGS) -MT md5cmp-md5.obj -MD -MP -MF "$(DEPDIR)/md5cmp-md5.Tpo" -c -o md5cmp-md5.obj `if test -f 'md5.c'; then $(CYGPATH_W) 'md5.c'; else $(CYGPATH_W) '$(srcdir)/md5.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/md5cmp-md5.Tpo" "$(DEPDIR)/md5cmp-md5.Po"; else rm -f "$(DEPDIR)/md5cmp-md5.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='md5.c' object='md5cmp-md5.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) $(md5cmp_CFLAGS) $(CFLAGS) -c -o md5cmp-md5.obj `if test -f 'md5.c'; then $(CYGPATH_W) 'md5.c'; else $(CYGPATH_W) '$(srcdir)/md5.c'; fi` + +md5cmp-md5hl.o: md5hl.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(md5cmp_CFLAGS) $(CFLAGS) -MT md5cmp-md5hl.o -MD -MP -MF "$(DEPDIR)/md5cmp-md5hl.Tpo" -c -o md5cmp-md5hl.o `test -f 'md5hl.c' || echo '$(srcdir)/'`md5hl.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/md5cmp-md5hl.Tpo" "$(DEPDIR)/md5cmp-md5hl.Po"; else rm -f "$(DEPDIR)/md5cmp-md5hl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='md5hl.c' object='md5cmp-md5hl.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) $(md5cmp_CFLAGS) $(CFLAGS) -c -o md5cmp-md5hl.o `test -f 'md5hl.c' || echo '$(srcdir)/'`md5hl.c + +md5cmp-md5hl.obj: md5hl.c +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(md5cmp_CFLAGS) $(CFLAGS) -MT md5cmp-md5hl.obj -MD -MP -MF "$(DEPDIR)/md5cmp-md5hl.Tpo" -c -o md5cmp-md5hl.obj `if test -f 'md5hl.c'; then $(CYGPATH_W) 'md5hl.c'; else $(CYGPATH_W) '$(srcdir)/md5hl.c'; fi`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/md5cmp-md5hl.Tpo" "$(DEPDIR)/md5cmp-md5hl.Po"; else rm -f "$(DEPDIR)/md5cmp-md5hl.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='md5hl.c' object='md5cmp-md5hl.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) $(md5cmp_CFLAGS) $(CFLAGS) -c -o md5cmp-md5hl.obj `if test -f 'md5hl.c'; then $(CYGPATH_W) 'md5hl.c'; else $(CYGPATH_W) '$(srcdir)/md5hl.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +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)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + 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) +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: + $(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-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +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-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS 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-exec \ + install-exec-am install-info install-info-am install-man \ + 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-info-am + +# 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: diff --git a/md5/md5.c b/md5/md5.c new file mode 100644 index 0000000..7193e95 --- /dev/null +++ b/md5/md5.c @@ -0,0 +1,322 @@ +/* + * MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + * + * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + * rights reserved. + * + * License to copy and use this software is granted provided that it + * is identified as the "RSA Data Security, Inc. MD5 Message-Digest + * Algorithm" in all material mentioning or referencing this software + * or this function. + * + * License is also granted to make and use derivative works provided + * that such works are identified as "derived from the RSA Data + * Security, Inc. MD5 Message-Digest Algorithm" in all material + * mentioning or referencing the derived work. + * + * RSA Data Security, Inc. makes no representations concerning either + * the merchantability of this software or the suitability of this + * software for any particular purpose. It is provided "as is" + * without express or implied warranty of any kind. + * + * These notices must be retained in any copies of any part of this + * documentation and/or software. + * + * This code is the same as the code published by RSA Inc. It has been + * edited for clarity and style only. + */ + +#include +#include + +#include "./md5.h" + +static void MD5Transform(unsigned int [4], const unsigned char [64]); + +#if (BYTE_ORDER == LITTLE_ENDIAN) +#define Encode memcpy +#define Decode memcpy +#else + +/* + * Encodes input (unsigned int) into output (unsigned char). Assumes len is + * a multiple of 4. + */ + +static void +Encode (unsigned char *output, unsigned int *input, unsigned int len) +{ + unsigned int i; + unsigned int *op = (unsigned int *)output; + + for (i = 0; i < len / 4; i++) + op[i] = htole32(input[i]); +} + +/* + * Decodes input (unsigned char) into output (unsigned int). Assumes len is + * a multiple of 4. + */ + +static void +Decode (unsigned int *output, const unsigned char *input, unsigned int len) +{ + unsigned int i; + const unsigned int *ip = (const unsigned int *)input; + + for (i = 0; i < len / 4; i++) + output[i] = le32toh(ip[i]); +} +#endif + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* + * FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. + * Rotation is separate from addition to prevent recomputation. + */ +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (unsigned int)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (unsigned int)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (unsigned int)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (unsigned int)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. */ + +void +MD5Init (context) + MD5_CTX *context; +{ + + context->count[0] = context->count[1] = 0; + + /* Load magic initialization constants. */ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* + * MD5 block update operation. Continues an MD5 message-digest + * operation, processing another message block, and updating the + * context. + */ + +void +MD5Update (context, in, inputLen) + MD5_CTX *context; + const void *in; + unsigned int inputLen; +{ + unsigned int i, idx, partLen; + const unsigned char *input = in; + + /* Compute number of bytes mod 64 */ + idx = (unsigned int)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((unsigned int)inputLen << 3)) + < ((unsigned int)inputLen << 3)) + context->count[1]++; + context->count[1] += ((unsigned int)inputLen >> 29); + + partLen = 64 - idx; + + /* Transform as many times as possible. */ + if (inputLen >= partLen) { + memcpy((void *)&context->buffer[idx], (const void *)input, + partLen); + MD5Transform (context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) + MD5Transform (context->state, &input[i]); + + idx = 0; + } + else + i = 0; + + /* Buffer remaining input */ + memcpy ((void *)&context->buffer[idx], (const void *)&input[i], + inputLen-i); +} + +/* + * MD5 padding. Adds padding followed by original length. + */ + +void +MD5Pad (context) + MD5_CTX *context; +{ + unsigned char bits[8]; + unsigned int idx, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64. */ + idx = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (idx < 56) ? (56 - idx) : (120 - idx); + MD5Update (context, PADDING, padLen); + + /* Append length (before padding) */ + MD5Update (context, bits, 8); +} + +/* + * MD5 finalization. Ends an MD5 message-digest operation, writing the + * the message digest and zeroizing the context. + */ + +void +MD5Final (digest, context) + unsigned char digest[16]; + MD5_CTX *context; +{ + /* Do padding. */ + MD5Pad (context); + + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information. */ + memset ((void *)context, 0, sizeof (*context)); +} + +/* MD5 basic transformation. Transforms state based on block. */ + +static void +MD5Transform (state, block) + unsigned int state[4]; + const unsigned char block[64]; +{ + unsigned int a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + + /* Round 1 */ +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. */ + memset ((void *)x, 0, sizeof (x)); +} diff --git a/md5/md5.h b/md5/md5.h new file mode 100644 index 0000000..551e252 --- /dev/null +++ b/md5/md5.h @@ -0,0 +1,49 @@ +/* MD5.H - header file for MD5C.C + * $FreeBSD$ + */ + +/*- + Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + */ + +#ifndef _SYS_MD5_H_ +#define _SYS_MD5_H_ + +#define MD5_BLOCK_LENGTH 64 +#define MD5_DIGEST_LENGTH 16 +#define MD5_DIGEST_STRING_LENGTH (MD5_DIGEST_LENGTH * 2 + 1) + +/* MD5 context. */ +typedef struct MD5Context { + unsigned int state[4]; /* state (ABCD) */ + unsigned int count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +} MD5_CTX; + +void MD5Init (MD5_CTX *); +void MD5Update (MD5_CTX *, const void *, unsigned int); +void MD5Final (unsigned char [16], MD5_CTX *); +char * MD5End(MD5_CTX *, char *); +char * MD5File(const char *, char *); +char * MD5FileChunk(const char *, char *, off_t, off_t); +char * MD5Data(const void *, unsigned int, char *); +#endif /* _SYS_MD5_H_ */ diff --git a/java/org/libjpegturbo/turbojpeg/TJLoader.java b/md5/md5cmp.c similarity index 68% rename from java/org/libjpegturbo/turbojpeg/TJLoader.java rename to md5/md5cmp.c index db77bba..07acda4 100644 --- a/java/org/libjpegturbo/turbojpeg/TJLoader.java +++ b/md5/md5cmp.c @@ -1,5 +1,5 @@ /* - * Copyright (C)2011 D. R. Commander. All Rights Reserved. + * Copyright (C)2013 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -26,10 +26,34 @@ * POSSIBILITY OF SUCH DAMAGE. */ -package org.libjpegturbo.turbojpeg; +#include +#include +#include +#include "./md5.h" -final class TJLoader { - static void load() { - System.loadLibrary("turbojpeg"); - } -}; +int main(int argc, char *argv[]) +{ + char *md5sum = NULL, buf[65]; + + if (argc < 3) { + fprintf(stderr, "USAGE: %s \n", argv[0]); + return -1; + } + + if (strlen(argv[1]) != 32) + fprintf(stderr, "WARNING: MD5 hash size is wrong.\n"); + + md5sum = MD5File(argv[2], buf); + if (!md5sum) { + perror("Could not obtain MD5 sum"); + return -1; + } + + if (!strcasecmp(md5sum, argv[1])) { + fprintf(stderr, "%s: OK\n", argv[2]); + return 0; + } else { + fprintf(stderr, "%s: FAILED. Checksum is %s\n", argv[2], md5sum); + return -1; + } +} diff --git a/md5/md5hl.c b/md5/md5hl.c new file mode 100644 index 0000000..eaa41e2 --- /dev/null +++ b/md5/md5hl.c @@ -0,0 +1,97 @@ +/* mdXhl.c * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + */ + +#include +#include +#include +#include + +#include +#include +#include + +#define LENGTH 16 + +#include "./md5.h" + +char * +MD5End(MD5_CTX *ctx, char *buf) +{ + int i; + unsigned char digest[LENGTH]; + static const char hex[]="0123456789abcdef"; + + if (!buf) + buf = malloc(2*LENGTH + 1); + if (!buf) + return 0; + MD5Final(digest, ctx); + for (i = 0; i < LENGTH; i++) { + buf[i+i] = hex[digest[i] >> 4]; + buf[i+i+1] = hex[digest[i] & 0x0f]; + } + buf[i+i] = '\0'; + return buf; +} + +char * +MD5File(const char *filename, char *buf) +{ + return (MD5FileChunk(filename, buf, 0, 0)); +} + +char * +MD5FileChunk(const char *filename, char *buf, off_t ofs, off_t len) +{ + unsigned char buffer[BUFSIZ]; + MD5_CTX ctx; + struct stat stbuf; + int f, i, e; + off_t n; + + MD5Init(&ctx); + f = open(filename, O_RDONLY); + if (f < 0) + return 0; + if (fstat(f, &stbuf) < 0) + return 0; + if (ofs > stbuf.st_size) + ofs = stbuf.st_size; + if ((len == 0) || (len > stbuf.st_size - ofs)) + len = stbuf.st_size - ofs; + if (lseek(f, ofs, SEEK_SET) < 0) + return 0; + n = len; + i = 0; + while (n > 0) { + if (n > sizeof(buffer)) + i = read(f, buffer, sizeof(buffer)); + else + i = read(f, buffer, n); + if (i < 0) + break; + MD5Update(&ctx, buffer, i); + n -= i; + } + e = errno; + close(f); + errno = e; + if (i < 0) + return 0; + return (MD5End(&ctx, buf)); +} + +char * +MD5Data (const void *data, unsigned int len, char *buf) +{ + MD5_CTX ctx; + + MD5Init(&ctx); + MD5Update(&ctx,data,len); + return (MD5End(&ctx, buf)); +} diff --git a/rdbmp.c b/rdbmp.c index be32e43..ba9f728 100644 --- a/rdbmp.c +++ b/rdbmp.c @@ -1,10 +1,11 @@ /* * rdbmp.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1994-1996, Thomas G. Lane. * Modified 2009-2010 by Guido Vollbeding. + * libjpeg-turbo Modifications: * Modified 2011 by Siarhei Siamashka. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains routines to read input images in Microsoft "BMP" diff --git a/rdswitch.c b/rdswitch.c index d406755..fc0727a 100644 --- a/rdswitch.c +++ b/rdswitch.c @@ -1,9 +1,10 @@ /* * rdswitch.c * + * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1996, Thomas G. Lane. + * libjpeg-turbo Modifications: * Copyright (C) 2010, D. R. Commander. - * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains routines to process some of cjpeg's more complicated diff --git a/release/ReadMe.rtf b/release/ReadMe.rtf index 06c94ab..2ae4878 100644 --- a/release/ReadMe.rtf +++ b/release/ReadMe.rtf @@ -1,13 +1,13 @@ {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 {\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} -\margl1440\margr1440\vieww15200\viewh9600\viewkind0 +\margl1440\margr1440\vieww26380\viewh15840\viewkind0 \deftab720 \pard\pardeftab720\ql\qnatural -\f0\fs24 \cf0 libjpeg-turbo is a derivative of libjpeg that uses SIMD instructions (MMX, SSE2, NEON) to accelerate baseline JPEG compression and decompression on x86, x86-64, and ARM systems. On such systems, libjpeg-turbo is generally 2-4x as fast as the unmodified version of libjpeg, all else being equal.\ +\f0\fs24 \cf0 libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, SSE2, NEON) to accelerate baseline JPEG compression and decompression on x86, x86-64, and ARM systems. On such systems, libjpeg-turbo is generally 2-4x as fast as libjpeg, all else being equal. On other types of systems, libjpeg-turbo can still outperform libjpeg by a significant amount, by virtue of its highly-optimized Huffman coding routines. In many cases, the performance of libjpeg-turbo rivals that of proprietary high-speed JPEG codecs.\ \ -libjpeg-turbo was originally based on libjpeg/SIMD by Miyasaka Masaru, but the TigerVNC and VirtualGL projects made numerous enhancements to the codec in 2009, including improved support for Mac OS X, 64-bit support, support for 32-bit and big-endian pixel formats (RGBX, XBGR, etc.), accelerated Huffman encoding/decoding, and various bug fixes. The goal was to produce a fully open-source codec that could replace the partially closed-source TurboJPEG/IPP codec used by VirtualGL and TurboVNC. libjpeg-turbo generally achieves 80-120% of the performance of TurboJPEG/IPP. It is faster in some areas but slower in others.\ +libjpeg-turbo implements both the traditional libjpeg API as well as the less powerful but more straightforward TurboJPEG API. libjpeg-turbo also features colorspace extensions that allow it to compress from/decompress to 32-bit and big-endian pixel buffers (RGBX, XBGR, etc.), as well as a full-featured Java interface.\ \ -In early 2010, libjpeg-turbo spun off into its own independent project, with the goal of making high-speed JPEG compression/decompression technology available to a broader range of users and developers.\ +libjpeg-turbo was originally based on libjpeg/SIMD, an MMX-accelerated derivative of libjpeg v6b developed by Miyasaka Masaru. The TigerVNC and VirtualGL projects made numerous enhancements to the codec in 2009, and in early 2010, libjpeg-turbo spun off into an independent project, with the goal of making high-speed JPEG compression/decompression technology available to a broader range of users and developers.\ } \ No newline at end of file diff --git a/release/Welcome.rtf b/release/Welcome.rtf index 9082f65..a570c5b 100755 --- a/release/Welcome.rtf +++ b/release/Welcome.rtf @@ -1,4 +1,4 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf350 +{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360 {\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fmodern\fcharset0 CourierNewPSMT;} {\colortbl;\red255\green255\blue255;} \margl1440\margr1440\vieww9000\viewh8400\viewkind0 @@ -14,6 +14,4 @@ \f0 \cf0 \ from the command line.\ -\ -If TurboJPEG/IPP is currently installed, then it must be removed prior to installing libjpeg-turbo.\ } \ No newline at end of file diff --git a/release/copyright b/release/copyright deleted file mode 100755 index 125388d..0000000 --- a/release/copyright +++ /dev/null @@ -1 +0,0 @@ -libjpeg-turbo is released under a BSD-style license (see README and README-turbo.txt) diff --git a/release/deb-control.tmpl b/release/deb-control.tmpl index 9cf7c46..5ae4ce9 100644 --- a/release/deb-control.tmpl +++ b/release/deb-control.tmpl @@ -4,23 +4,27 @@ Section: misc Priority: optional Architecture: {__ARCH} Essential: no -Maintainer: The libjpeg-turbo Project [http://www.libjpeg-turbo.org] +Maintainer: The libjpeg-turbo Project +Homepage: http://www.libjpeg-turbo.org Description: A SIMD-accelerated JPEG codec that provides both the libjpeg and TurboJPEG APIs - libjpeg-turbo is a derivative of libjpeg that uses SIMD instructions (MMX, - SSE2, NEON) to accelerate baseline JPEG compression and decompression on x86, + libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, SSE2, + NEON) to accelerate baseline JPEG compression and decompression on x86, x86-64, and ARM systems. On such systems, libjpeg-turbo is generally 2-4x as - fast as the unmodified version of libjpeg, all else being equal. + fast as libjpeg, all else being equal. On other types of systems, + libjpeg-turbo can still outperform libjpeg by a significant amount, by virtue + of its highly-optimized Huffman coding routines. In many cases, the + performance of libjpeg-turbo rivals that of proprietary high-speed JPEG + codecs. . - libjpeg-turbo was originally based on libjpeg/SIMD by Miyasaka Masaru, but - the TigerVNC and VirtualGL projects made numerous enhancements to the codec - in 2009, including improved support for Mac OS X, 64-bit support, support - for 32-bit and big-endian pixel formats (RGBX, XBGR, etc.), accelerated - Huffman encoding/decoding, and various bug fixes. The goal was to produce a - fully open-source codec that could replace the partially closed-source - TurboJPEG/IPP codec used by VirtualGL and TurboVNC. libjpeg-turbo generally - achieves 80-120% of the performance of TurboJPEG/IPP. It is faster in some - areas but slower in others. + libjpeg-turbo implements both the traditional libjpeg API as well as the less + powerful but more straightforward TurboJPEG API. libjpeg-turbo also features + colorspace extensions that allow it to compress from/decompress to 32-bit and + big-endian pixel buffers (RGBX, XBGR, etc.), as well as a full-featured Java + interface. . - In early 2010, libjpeg-turbo spun off into its own independent project, with - the goal of making high-speed JPEG compression/decompression technology - available to a broader range of users and developers. + libjpeg-turbo was originally based on libjpeg/SIMD, an MMX-accelerated + derivative of libjpeg v6b developed by Miyasaka Masaru. The TigerVNC and + VirtualGL projects made numerous enhancements to the codec in 2009, and in + early 2010, libjpeg-turbo spun off into an independent project, with the goal + of making high-speed JPEG compression/decompression technology available to a + broader range of users and developers. diff --git a/release/libjpeg-turbo.nsi.in b/release/libjpeg-turbo.nsi.in index f4643fd..4f65303 100755 --- a/release/libjpeg-turbo.nsi.in +++ b/release/libjpeg-turbo.nsi.in @@ -1,7 +1,7 @@ !include x64.nsh Name "@CMAKE_PROJECT_NAME@ SDK for @INST_PLATFORM@" OutFile "@CMAKE_BINARY_DIR@\${BUILDDIR}@INST_NAME@.exe" -InstallDir c:\@INST_DIR@ +InstallDir "@INST_DIR@" SetCompressor bzip2 @@ -41,6 +41,11 @@ Section "@CMAKE_PROJECT_NAME@ SDK for @INST_PLATFORM@ (required)" !endif SetOutPath $INSTDIR\bin !ifdef GCC + File "@CMAKE_BINARY_DIR@\libturbojpeg.dll" +!else + File "@CMAKE_BINARY_DIR@\${BUILDDIR}turbojpeg.dll" +!endif +!ifdef GCC File "/oname=libjpeg-@DLL_VERSION@.dll" "@CMAKE_BINARY_DIR@\sharedlib\libjpeg-*.dll" !else File "@CMAKE_BINARY_DIR@\sharedlib\${BUILDDIR}jpeg@DLL_VERSION@.dll" @@ -82,12 +87,12 @@ Section "@CMAKE_PROJECT_NAME@ SDK for @INST_PLATFORM@ (required)" File "@CMAKE_SOURCE_DIR@\usage.txt" File "@CMAKE_SOURCE_DIR@\wizard.txt" - WriteRegStr HKLM "SOFTWARE\@INST_DIR@ @VERSION@" "Install_Dir" "$INSTDIR" + WriteRegStr HKLM "SOFTWARE\@INST_REG_NAME@ @VERSION@" "Install_Dir" "$INSTDIR" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@INST_DIR@ @VERSION@" "DisplayName" "@CMAKE_PROJECT_NAME@ SDK v@VERSION@ for @INST_PLATFORM@" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@INST_DIR@ @VERSION@" "UninstallString" '"$INSTDIR\uninstall_@VERSION@.exe"' - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@INST_DIR@ @VERSION@" "NoModify" 1 - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@INST_DIR@ @VERSION@" "NoRepair" 1 + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@INST_REG_NAME@ @VERSION@" "DisplayName" "@CMAKE_PROJECT_NAME@ SDK v@VERSION@ for @INST_PLATFORM@" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@INST_REG_NAME@ @VERSION@" "UninstallString" '"$INSTDIR\uninstall_@VERSION@.exe"' + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@INST_REG_NAME@ @VERSION@" "NoModify" 1 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@INST_REG_NAME@ @VERSION@" "NoRepair" 1 WriteUninstaller "uninstall_@VERSION@.exe" SectionEnd @@ -100,19 +105,21 @@ Section "Uninstall" SetShellVarContext all - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@INST_DIR@ @VERSION@" - DeleteRegKey HKLM "SOFTWARE\@INST_DIR@ @VERSION@" + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@INST_REG_NAME@ @VERSION@" + DeleteRegKey HKLM "SOFTWARE\@INST_REG_NAME@ @VERSION@" !ifdef GCC Delete $INSTDIR\bin\libjpeg-@DLL_VERSION@.dll Delete $SYSDIR\libturbojpeg.dll - Delete $INSTDIR\lib\libturbojpeg.dll.a" - Delete $INSTDIR\lib\libturbojpeg.a" - Delete $INSTDIR\lib\libjpeg.dll.a" - Delete $INSTDIR\lib\libjpeg.a" + Delete $INSTDIR\bin\libturbojpeg.dll + Delete $INSTDIR\lib\libturbojpeg.dll.a + Delete $INSTDIR\lib\libturbojpeg.a + Delete $INSTDIR\lib\libjpeg.dll.a + Delete $INSTDIR\lib\libjpeg.a !else Delete $INSTDIR\bin\jpeg@DLL_VERSION@.dll Delete $SYSDIR\turbojpeg.dll + Delete $INSTDIR\bin\turbojpeg.dll Delete $INSTDIR\lib\jpeg.lib Delete $INSTDIR\lib\jpeg-static.lib Delete $INSTDIR\lib\turbojpeg.lib @@ -127,11 +134,11 @@ Section "Uninstall" Delete $INSTDIR\bin\tjbench.exe Delete $INSTDIR\bin\rdjpgcom.exe Delete $INSTDIR\bin\wrjpgcom.exe - Delete $INSTDIR\include\jconfig.h" - Delete $INSTDIR\include\jerror.h" - Delete $INSTDIR\include\jmorecfg.h" - Delete $INSTDIR\include\jpeglib.h" - Delete $INSTDIR\include\turbojpeg.h" + Delete $INSTDIR\include\jconfig.h + Delete $INSTDIR\include\jerror.h + Delete $INSTDIR\include\jmorecfg.h + Delete $INSTDIR\include\jpeglib.h + Delete $INSTDIR\include\turbojpeg.h Delete $INSTDIR\uninstall_@VERSION@.exe Delete $INSTDIR\doc\README Delete $INSTDIR\doc\README-turbo.txt diff --git a/release/libjpeg-turbo.spec.in b/release/libjpeg-turbo.spec.in index 9e0ff88..207d638 100644 --- a/release/libjpeg-turbo.spec.in +++ b/release/libjpeg-turbo.spec.in @@ -1,11 +1,32 @@ +# Path under which libjpeg-turbo should be installed +%define _prefix %{__prefix} + +# Path under which executables should be installed +%define _bindir %{__bindir} + +# Path under which Java classes and man pages should be installed +%define _datadir %{__datadir} + +# Path under which docs should be installed +%define _docdir /usr/share/doc/%{name}-%{version} + +# Path under which headers should be installed +%define _includedir %{__includedir} + +# _libdir is set to %{_prefix}/%{_lib} by default %ifarch x86_64 -%define __lib lib64 +%define _lib lib64 %else -%define __lib lib +%if "%{_prefix}" == "/opt/libjpeg-turbo" +%define _lib lib32 %endif +%endif + +# Path under which man pages should be installed +%define _mandir %{__mandir} Summary: A SIMD-accelerated JPEG codec that provides both the libjpeg and TurboJPEG APIs -Name: @PACKAGE_NAME@ +Name: @PKGNAME@ Version: @VERSION@ Vendor: The libjpeg-turbo Project URL: http://www.libjpeg-turbo.org @@ -15,51 +36,66 @@ Release: @BUILD@ License: BSD-style BuildRoot: %{_blddir}/%{name}-buildroot-%{version}-%{release} Prereq: /sbin/ldconfig -Provides: %{name} = %{version}-%{release}, turbojpeg = 2.00 -Obsoletes: turbojpeg +%ifarch x86_64 +Provides: %{name} = %{version}-%{release}, @PACKAGE_NAME@ = %{version}-%{release}, libturbojpeg.so()(64bit) +%else +Provides: %{name} = %{version}-%{release}, @PACKAGE_NAME@ = %{version}-%{release}, libturbojpeg.so +%endif %description -libjpeg-turbo is a derivative of libjpeg that uses SIMD instructions (MMX, -SSE2, NEON) to accelerate baseline JPEG compression and decompression on x86, -x86-64, and ARM systems. On such systems, libjpeg-turbo is generally 2-4x as -fast as the unmodified version of libjpeg, all else being equal. - -libjpeg-turbo was originally based on libjpeg/SIMD by Miyasaka Masaru, but -the TigerVNC and VirtualGL projects made numerous enhancements to the codec in -2009, including improved support for Mac OS X, 64-bit support, support for -32-bit and big-endian pixel formats (RGBX, XBGR, etc.), accelerated Huffman -encoding/decoding, and various bug fixes. The goal was to produce a fully -open-source codec that could replace the partially closed-source TurboJPEG/IPP -codec used by VirtualGL and TurboVNC. libjpeg-turbo generally achieves 80-120% -of the performance of TurboJPEG/IPP. It is faster in some areas but slower in -others. - -In early 2010, libjpeg-turbo spun off into its own independent project, with -the goal of making high-speed JPEG compression/decompression technology -available to a broader range of users and developers. +libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, SSE2, +NEON) to accelerate baseline JPEG compression and decompression on x86, x86-64, +and ARM systems. On such systems, libjpeg-turbo is generally 2-4x as fast as +libjpeg, all else being equal. On other types of systems, libjpeg-turbo can +still outperform libjpeg by a significant amount, by virtue of its +highly-optimized Huffman coding routines. In many cases, the performance of +libjpeg-turbo rivals that of proprietary high-speed JPEG codecs. + +libjpeg-turbo implements both the traditional libjpeg API as well as the less +powerful but more straightforward TurboJPEG API. libjpeg-turbo also features +colorspace extensions that allow it to compress from/decompress to 32-bit and +big-endian pixel buffers (RGBX, XBGR, etc.), as well as a full-featured Java +interface. + +libjpeg-turbo was originally based on libjpeg/SIMD, an MMX-accelerated +derivative of libjpeg v6b developed by Miyasaka Masaru. The TigerVNC and +VirtualGL projects made numerous enhancements to the codec in 2009, and in +early 2010, libjpeg-turbo spun off into an independent project, with the goal +of making high-speed JPEG compression/decompression technology available to a +broader range of users and developers. #-->%prep -#-->%setup -q +#-->%setup -q -n libjpeg-turbo-%{version} #-->%build -#-->./configure libdir=/opt/%{name}/%{__lib} mandir=/opt/%{name}/man JPEG_LIB_VERSION=@JPEG_LIB_VERSION@ SO_MAJOR_VERSION=@SO_MAJOR_VERSION@ SO_MINOR_VERSION=@SO_MINOR_VERSION@ --with-pic @RPM_CONFIG_ARGS@ -#-->make DESTDIR=$RPM_BUILD_ROOT libdir=/opt/%{name}/%{__lib} mandir=/opt/%{name}/man +#-->./configure prefix=%{_prefix} bindir=%{_bindir} datadir=%{_datadir} \ +#--> docdir=%{_docdir} includedir=%{_includedir} libdir=%{_libdir} \ +#--> mandir=%{_mandir} JPEG_LIB_VERSION=@JPEG_LIB_VERSION@ \ +#--> SO_MAJOR_VERSION=@SO_MAJOR_VERSION@ SO_MINOR_VERSION=@SO_MINOR_VERSION@ \ +#--> --with-pic @RPM_CONFIG_ARGS@ +#-->make DESTDIR=$RPM_BUILD_ROOT %install rm -rf $RPM_BUILD_ROOT -make install DESTDIR=$RPM_BUILD_ROOT libdir=/opt/%{name}/%{__lib} mandir=/opt/%{name}/man docdir=/opt/%{name}/doc exampledir=/opt/%{name}/doc -rm -f $RPM_BUILD_ROOT/opt/%{name}/%{__lib}/*.la -mkdir -p $RPM_BUILD_ROOT/usr/%{__lib} -mv $RPM_BUILD_ROOT/opt/%{name}/%{__lib}/libturbojpeg.* $RPM_BUILD_ROOT/usr/%{__lib} -/sbin/ldconfig -n $RPM_BUILD_ROOT/opt/%{name}/%{__lib} -/sbin/ldconfig -n $RPM_BUILD_ROOT/usr/%{__lib} -mkdir -p $RPM_BUILD_ROOT/usr/include -mv $RPM_BUILD_ROOT/opt/%{name}/include/turbojpeg.h $RPM_BUILD_ROOT/usr/include -ln -fs /usr/include/turbojpeg.h $RPM_BUILD_ROOT/opt/%{name}/include/ -ln -fs /usr/%{__lib}/libturbojpeg.a $RPM_BUILD_ROOT/opt/%{name}/%{__lib}/ -mkdir -p $RPM_BUILD_ROOT%{_defaultdocdir} -mv $RPM_BUILD_ROOT/opt/%{name}/doc $RPM_BUILD_ROOT%{_defaultdocdir}/%{name}-%{version} +make install DESTDIR=$RPM_BUILD_ROOT docdir=%{_docdir} exampledir=%{_docdir} +rm -f $RPM_BUILD_ROOT%{_libdir}/*.la +/sbin/ldconfig -n $RPM_BUILD_ROOT%{_libdir} + +#-->%if 0 + +LJT_LIBDIR=%{__libdir} +if [ ! "$LJT_LIBDIR" = "%{_libdir}" ]; then + echo ERROR: libjpeg-turbo must be configured with libdir=%{_prefix}/%{_lib} when generating an in-tree RPM for this architecture. + exit 1 +fi + +#-->%endif + +LJT_DOCDIR=%{__docdir} +if [ "%{_prefix}" = "/opt/libjpeg-turbo" -a "$LJT_DOCDIR" = "/opt/libjpeg-turbo/doc" ]; then + ln -fs %{_docdir} $RPM_BUILD_ROOT/$LJT_DOCDIR +fi %post -p /sbin/ldconfig @@ -70,42 +106,44 @@ rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) -%dir %{_defaultdocdir}/%{name}-%{version} -%doc %{_defaultdocdir}/%{name}-%{version}/* -%dir /opt/%{name} -%dir /opt/%{name}/bin -/opt/%{name}/bin/cjpeg -/opt/%{name}/bin/djpeg -/opt/%{name}/bin/jpegtran -/opt/%{name}/bin/tjbench -/opt/%{name}/bin/rdjpgcom -/opt/%{name}/bin/wrjpgcom -%dir /opt/%{name}/%{__lib} -%ifarch x86_64 -%else -/opt/%{name}/lib32 +%dir %{_docdir} +%doc %{_docdir}/* +%dir %{_prefix} +%if "%{_prefix}" == "/opt/libjpeg-turbo" && "%{_docdir}" != "%{_prefix}/doc" + %{_prefix}/doc +%endif +%dir %{_bindir} +%{_bindir}/cjpeg +%{_bindir}/djpeg +%{_bindir}/jpegtran +%{_bindir}/tjbench +%{_bindir}/rdjpgcom +%{_bindir}/wrjpgcom +%dir %{_libdir} +%{_libdir}/libjpeg.so.@SO_MAJOR_VERSION@.@SO_AGE@.@SO_MINOR_VERSION@ +%{_libdir}/libjpeg.so.@SO_MAJOR_VERSION@ +%{_libdir}/libjpeg.so +%{_libdir}/libjpeg.a +%{_libdir}/libturbojpeg.so.0.0.0 +%{_libdir}/libturbojpeg.so.0 +%{_libdir}/libturbojpeg.so +%{_libdir}/libturbojpeg.a +%dir %{_includedir} +%{_includedir}/jconfig.h +%{_includedir}/jerror.h +%{_includedir}/jmorecfg.h +%{_includedir}/jpeglib.h +%{_includedir}/turbojpeg.h +%dir %{_mandir} +%dir %{_mandir}/man1 +%{_mandir}/man1/cjpeg.1* +%{_mandir}/man1/djpeg.1* +%{_mandir}/man1/jpegtran.1* +%{_mandir}/man1/rdjpgcom.1* +%{_mandir}/man1/wrjpgcom.1* +%if "%{_prefix}" != "%{_datadir}" + %dir %{_datadir} %endif -/opt/%{name}/%{__lib}/libjpeg.so.@SO_MAJOR_VERSION@.0.@SO_MINOR_VERSION@ -/opt/%{name}/%{__lib}/libjpeg.so.@SO_MAJOR_VERSION@ -/opt/%{name}/%{__lib}/libjpeg.so -/opt/%{name}/%{__lib}/libjpeg.a -/opt/%{name}/%{__lib}/libturbojpeg.a -/usr/%{__lib}/libturbojpeg.so -/usr/%{__lib}/libturbojpeg.a -/usr/include/turbojpeg.h -%dir /opt/%{name}/include -/opt/%{name}/include/jconfig.h -/opt/%{name}/include/jerror.h -/opt/%{name}/include/jmorecfg.h -/opt/%{name}/include/jpeglib.h -/opt/%{name}/include/turbojpeg.h -%dir /opt/%{name}/man -%dir /opt/%{name}/man/man1 -/opt/%{name}/man/man1/cjpeg.1* -/opt/%{name}/man/man1/djpeg.1* -/opt/%{name}/man/man1/jpegtran.1* -/opt/%{name}/man/man1/rdjpgcom.1* -/opt/%{name}/man/man1/wrjpgcom.1* @JAVA_RPM_CONTENTS_1@ @JAVA_RPM_CONTENTS_2@ diff --git a/release/makecygwinpkg.in b/release/makecygwinpkg.in index 32cecdd..f303546 100755 --- a/release/makecygwinpkg.in +++ b/release/makecygwinpkg.in @@ -15,21 +15,27 @@ onexit() fi } -PACKAGE_NAME=@PACKAGE_NAME@ +PACKAGE_NAME=@PKGNAME@ VERSION=@VERSION@ +BUILD=@BUILD@ SRCDIR=@abs_top_srcdir@ +PREFIX=%{__prefix} +DOCDIR=%{__docdir} +LIBDIR=%{__libdir} + umask 022 -rm -f $PACKAGE_NAME-$VERSION-cygwin.tar.bz2 +rm -f $PACKAGE_NAME-$VERSION-$BUILD.tar.bz2 TMPDIR=`mktemp -d /tmp/ljtbuild.XXXXXX` __PWD=`pwd` -make install DESTDIR=$TMPDIR/pkg mandir=/opt/$PACKAGE_NAME/man \ - docdir=/usr/share/doc/$PACKAGE_NAME-$VERSION \ +make install DESTDIR=$TMPDIR/pkg docdir=/usr/share/doc/$PACKAGE_NAME-$VERSION \ exampledir=/usr/share/doc/$PACKAGE_NAME-$VERSION -rm $TMPDIR/pkg/opt/$PACKAGE_NAME/lib/*.la -ln -fs lib $TMPDIR/pkg/opt/$PACKAGE_NAME/lib32 +rm $TMPDIR/pkg$LIBDIR/*.la +if [ "$PREFIX" = "/opt/libjpeg-turbo" -a "$DOCDIR" = "/opt/libjpeg-turbo/doc" ]; then + ln -fs /usr/share/doc/$PACKAGE_NAME-$VERSION $TMPDIR/pkg$DOCDIR +fi cd $TMPDIR/pkg -tar cfj ../$PACKAGE_NAME-$VERSION-cygwin.tar.bz2 * +tar cfj ../$PACKAGE_NAME-$VERSION-$BUILD.tar.bz2 * cd $__PWD mv $TMPDIR/*.tar.bz2 . diff --git a/release/makedpkg.in b/release/makedpkg.in index 6d081bb..fa6bc19 100644 --- a/release/makedpkg.in +++ b/release/makedpkg.in @@ -23,9 +23,6 @@ makedeb() if [ $SUPPLEMENT = 1 ]; then PACKAGE_NAME=$PACKAGE_NAME\32 DEBARCH=amd64 - __LIB=lib32 - else - __LIB=lib fi umask 022 @@ -36,48 +33,34 @@ makedeb() | sed s/{__VERSION}/$VERSION/g | sed s/{__BUILD}/$BUILD/g \ | sed s/{__ARCH}/$DEBARCH/g > $TMPDIR/DEBIAN/control) - make install prefix=$TMPDIR/opt/$DIRNAME libdir=$TMPDIR/opt/$DIRNAME/$__LIB \ - mandir=$TMPDIR/opt/$DIRNAME/man \ - docdir=$TMPDIR/usr/share/doc/$DIRNAME-$VERSION \ - exampledir=$TMPDIR/usr/share/doc/$DIRNAME-$VERSION - rm -f $TMPDIR/opt/$DIRNAME/$__LIB/*.la - if [ $SUPPLEMENT = 1 ]; then - rm -rf $TMPDIR/opt/$DIRNAME/include - rm -rf $TMPDIR/opt/$DIRNAME/man - rm -rf $TMPDIR/opt/$DIRNAME/bin - rm -rf $TMPDIR/opt/$DIRNAME/classes - rm -rf $TMPDIR/usr - fi - - mkdir -p $TMPDIR/usr/$__LIB - mv $TMPDIR/opt/$DIRNAME/$__LIB/libturbojpeg.* $TMPDIR/usr/$__LIB - ln -fs /usr/$__LIB/libturbojpeg.a $TMPDIR/opt/$DIRNAME/$__LIB/ - /sbin/ldconfig -n $TMPDIR/opt/$DIRNAME/$__LIB - /sbin/ldconfig -n $TMPDIR/usr/$__LIB - - if [ ! $SUPPLEMENT = 1 ]; then - if [ "$DEBARCH" = "amd64" ]; then - ln -fs lib $TMPDIR/opt/$DIRNAME/lib64 - else - if [ ! "$__LIB" = "lib32" ]; then - ln -fs lib $TMPDIR/opt/$DIRNAME/lib32 - fi + make install DESTDIR=$TMPDIR bindir=/dummy/bin datadir=/dummy/data \ + docdir=/dummy/doc includedir=/dummy/include mandir=/dummy/man + rm -f $TMPDIR$LIBDIR/*.la + rm -rf $TMPDIR/dummy + else + make install DESTDIR=$TMPDIR docdir=/usr/share/doc/$DIRNAME-$VERSION \ + exampledir=/usr/share/doc/$DIRNAME-$VERSION + rm -f $TMPDIR$LIBDIR/*.la + if [ "$PREFIX" = "/opt/libjpeg-turbo" -a "$DOCDIR" = "/opt/libjpeg-turbo/doc" ]; then + ln -fs /usr/share/doc/$DIRNAME-$VERSION $TMPDIR$DOCDIR fi - mkdir -p $TMPDIR/usr/include - mv $TMPDIR/opt/$DIRNAME/include/turbojpeg.h $TMPDIR/usr/include - ln -fs /usr/include/turbojpeg.h $TMPDIR/opt/$DIRNAME/include/ fi + /sbin/ldconfig -n $TMPDIR$LIBDIR + sudo chown -Rh root:root $TMPDIR/* dpkg -b $TMPDIR $PACKAGE_NAME\_$VERSION\_$DEBARCH.deb } -PACKAGE_NAME=@PACKAGE_NAME@ +PACKAGE_NAME=@PKGNAME@ VERSION=@VERSION@ BUILD=@BUILD@ DEBARCH=@DEBARCH@ SRCDIR=@abs_top_srcdir@ +PREFIX=%{__prefix} +DOCDIR=%{__docdir} +LIBDIR=%{__libdir} makedeb 0 if [ "$DEBARCH" = "i386" ]; then makedeb 1; fi diff --git a/release/makemacpkg.in b/release/makemacpkg.in index 7b43aa3..65abdef 100644 --- a/release/makemacpkg.in +++ b/release/makemacpkg.in @@ -17,11 +17,11 @@ onexit() usage() { - echo "$0 [-build32 [32-bit build dir]] [-buildarmv6 [ARM v6 build dir]] [-buildarmv7 [ARM v7 build dir]]" + echo "$0 [-build32 [32-bit build dir]] [-buildarmv6 [ARM v6 build dir]] [-buildarmv7 [ARM v7 build dir]] [-buildarmv7s [ARM v7s build dir]]" exit 1 } -PACKAGE_NAME=@PACKAGE_NAME@ +PACKAGE_NAME=@PKGNAME@ VERSION=@VERSION@ BUILD=@BUILD@ SRCDIR=@abs_top_srcdir@ @@ -31,7 +31,15 @@ BUILDDIRARMV6=@abs_top_srcdir@/iosarmv6 BUILDARMV6=0 BUILDDIRARMV7=@abs_top_srcdir@/iosarmv7 BUILDARMV7=0 +BUILDDIRARMV7S=@abs_top_srcdir@/iosarmv7s +BUILDARMV7S=0 WITH_JAVA=@WITH_JAVA@ + +PREFIX=%{__prefix} +BINDIR=%{__bindir} +DOCDIR=%{__docdir} +LIBDIR=%{__libdir} + while [ $# -gt 0 ]; do case $1 in -h*) usage 0 ;; @@ -59,6 +67,14 @@ while [ $# -gt 0 ]; do fi fi ;; + -buildarmv7s) + BUILDARMV7S=1 + if [ $# -gt 1 ]; then + if [[ ! "$2" =~ -.* ]]; then + BUILDDIRARMV7S=$2; shift + fi + fi + ;; esac shift done @@ -72,15 +88,13 @@ umask 022 TMPDIR=`mktemp -d /tmp/$PACKAGE_NAME-build.XXXXXX` PKGROOT=$TMPDIR/pkg/Package_Root mkdir -p $PKGROOT -mkdir -p $PKGROOT/opt/$PACKAGE_NAME/bin -make install DESTDIR=$PKGROOT mandir=/opt/$PACKAGE_NAME/man \ - docdir=/Library/Documentation/$PACKAGE_NAME \ +make install DESTDIR=$PKGROOT docdir=/Library/Documentation/$PACKAGE_NAME \ exampledir=/Library/Documentation/$PACKAGE_NAME -rm -f $PKGROOT/opt/$PACKAGE_NAME/lib/*.la -mkdir -p $PKGROOT/usr/lib -mv $PKGROOT/opt/$PACKAGE_NAME/lib/libturbojpeg.* $PKGROOT/usr/lib -mkdir -p $PKGROOT/usr/include -mv $PKGROOT/opt/$PACKAGE_NAME/include/turbojpeg.h $PKGROOT/usr/include +rm -f $PKGROOT$LIBDIR/*.la + +if [ "$PREFIX" = "/opt/libjpeg-turbo" -a "$DOCDIR" = "/opt/libjpeg-turbo/doc" ]; then + ln -fs /Library/Documentation/$PACKAGE_NAME $PKGROOT$DOCDIR +fi if [ $BUILD32 = 1 ]; then if [ ! -d $BUILDDIR32 ]; then @@ -95,55 +109,55 @@ if [ $BUILD32 = 1 ]; then pushd $BUILDDIR32 make install DESTDIR=$TMPDIR/dist.x86 popd - if [ ! -h $TMPDIR/dist.x86/opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.dylib -a \ - ! -h $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.dylib ]; then + if [ ! -h $TMPDIR/dist.x86/$LIBDIR/libjpeg.@SO_MAJOR_VERSION@.dylib -a \ + ! -h $PKGROOT/$LIBDIR/libjpeg.@SO_MAJOR_VERSION@.dylib ]; then lipo -create \ - -arch i386 $TMPDIR/dist.x86/opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.dylib \ - -arch x86_64 $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.dylib \ - -output $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.dylib - elif [ ! -h $TMPDIR/dist.x86/opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.0.@SO_MINOR_VERSION@.dylib -a \ - ! -h $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.0.@SO_MINOR_VERSION@.dylib ]; then + -arch i386 $TMPDIR/dist.x86/$LIBDIR/libjpeg.@SO_MAJOR_VERSION@.dylib \ + -arch x86_64 $PKGROOT/$LIBDIR/libjpeg.@SO_MAJOR_VERSION@.dylib \ + -output $PKGROOT/$LIBDIR/libjpeg.@SO_MAJOR_VERSION@.dylib + elif [ ! -h $TMPDIR/dist.x86/$LIBDIR/libjpeg.@SO_MAJOR_VERSION@.0.@SO_MINOR_VERSION@.dylib -a \ + ! -h $PKGROOT/$LIBDIR/libjpeg.@SO_MAJOR_VERSION@.0.@SO_MINOR_VERSION@.dylib ]; then lipo -create \ - -arch i386 $TMPDIR/dist.x86/opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.0.@SO_MINOR_VERSION@.dylib \ - -arch x86_64 $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.0.@SO_MINOR_VERSION@.dylib \ - -output $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.0.@SO_MINOR_VERSION@.dylib + -arch i386 $TMPDIR/dist.x86/$LIBDIR/libjpeg.@SO_MAJOR_VERSION@.0.@SO_MINOR_VERSION@.dylib \ + -arch x86_64 $PKGROOT/$LIBDIR/libjpeg.@SO_MAJOR_VERSION@.0.@SO_MINOR_VERSION@.dylib \ + -output $PKGROOT/$LIBDIR/libjpeg.@SO_MAJOR_VERSION@.0.@SO_MINOR_VERSION@.dylib fi lipo -create \ - -arch i386 $TMPDIR/dist.x86/opt/$PACKAGE_NAME/lib/libjpeg.a \ - -arch x86_64 $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.a \ - -output $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.a + -arch i386 $TMPDIR/dist.x86/$LIBDIR/libjpeg.a \ + -arch x86_64 $PKGROOT/$LIBDIR/libjpeg.a \ + -output $PKGROOT/$LIBDIR/libjpeg.a lipo -create \ - -arch i386 $TMPDIR/dist.x86/opt/$PACKAGE_NAME/lib/libturbojpeg.dylib \ - -arch x86_64 $PKGROOT/usr/lib/libturbojpeg.dylib \ - -output $PKGROOT/usr/lib/libturbojpeg.dylib + -arch i386 $TMPDIR/dist.x86/$LIBDIR/libturbojpeg.0.dylib \ + -arch x86_64 $PKGROOT/$LIBDIR/libturbojpeg.0.dylib \ + -output $PKGROOT/$LIBDIR/libturbojpeg.0.dylib lipo -create \ - -arch i386 $TMPDIR/dist.x86/opt/$PACKAGE_NAME/lib/libturbojpeg.a \ - -arch x86_64 $PKGROOT/usr/lib/libturbojpeg.a \ - -output $PKGROOT/usr/lib/libturbojpeg.a + -arch i386 $TMPDIR/dist.x86/$LIBDIR/libturbojpeg.a \ + -arch x86_64 $PKGROOT/$LIBDIR/libturbojpeg.a \ + -output $PKGROOT/$LIBDIR/libturbojpeg.a lipo -create \ - -arch i386 $TMPDIR/dist.x86/opt/$PACKAGE_NAME/bin/cjpeg \ - -arch x86_64 $PKGROOT/opt/$PACKAGE_NAME/bin/cjpeg \ - -output $PKGROOT/opt/$PACKAGE_NAME/bin/cjpeg + -arch i386 $TMPDIR/dist.x86/$BINDIR/cjpeg \ + -arch x86_64 $PKGROOT/$BINDIR/cjpeg \ + -output $PKGROOT/$BINDIR/cjpeg lipo -create \ - -arch i386 $TMPDIR/dist.x86/opt/$PACKAGE_NAME/bin/djpeg \ - -arch x86_64 $PKGROOT/opt/$PACKAGE_NAME/bin/djpeg \ - -output $PKGROOT/opt/$PACKAGE_NAME/bin/djpeg + -arch i386 $TMPDIR/dist.x86/$BINDIR/djpeg \ + -arch x86_64 $PKGROOT/$BINDIR/djpeg \ + -output $PKGROOT/$BINDIR/djpeg lipo -create \ - -arch i386 $TMPDIR/dist.x86/opt/$PACKAGE_NAME/bin/jpegtran \ - -arch x86_64 $PKGROOT/opt/$PACKAGE_NAME/bin/jpegtran \ - -output $PKGROOT/opt/$PACKAGE_NAME/bin/jpegtran + -arch i386 $TMPDIR/dist.x86/$BINDIR/jpegtran \ + -arch x86_64 $PKGROOT/$BINDIR/jpegtran \ + -output $PKGROOT/$BINDIR/jpegtran lipo -create \ - -arch i386 $TMPDIR/dist.x86/opt/$PACKAGE_NAME/bin/tjbench \ - -arch x86_64 $PKGROOT/opt/$PACKAGE_NAME/bin/tjbench \ - -output $PKGROOT/opt/$PACKAGE_NAME/bin/tjbench + -arch i386 $TMPDIR/dist.x86/$BINDIR/tjbench \ + -arch x86_64 $PKGROOT/$BINDIR/tjbench \ + -output $PKGROOT/$BINDIR/tjbench lipo -create \ - -arch i386 $TMPDIR/dist.x86/opt/$PACKAGE_NAME/bin/rdjpgcom \ - -arch x86_64 $PKGROOT/opt/$PACKAGE_NAME/bin/rdjpgcom \ - -output $PKGROOT/opt/$PACKAGE_NAME/bin/rdjpgcom + -arch i386 $TMPDIR/dist.x86/$BINDIR/rdjpgcom \ + -arch x86_64 $PKGROOT/$BINDIR/rdjpgcom \ + -output $PKGROOT/$BINDIR/rdjpgcom lipo -create \ - -arch i386 $TMPDIR/dist.x86/opt/$PACKAGE_NAME/bin/wrjpgcom \ - -arch x86_64 $PKGROOT/opt/$PACKAGE_NAME/bin/wrjpgcom \ - -output $PKGROOT/opt/$PACKAGE_NAME/bin/wrjpgcom + -arch i386 $TMPDIR/dist.x86/$BINDIR/wrjpgcom \ + -arch x86_64 $PKGROOT/$BINDIR/wrjpgcom \ + -output $PKGROOT/$BINDIR/wrjpgcom fi @@ -161,13 +175,13 @@ if [ $BUILDARMV6 = 1 ]; then make install DESTDIR=$TMPDIR/dist.armv6 popd lipo -create \ - $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.a \ - -arch arm $TMPDIR/dist.armv6/opt/$PACKAGE_NAME/lib/libjpeg.a \ - -output $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.a + $PKGROOT/$LIBDIR/libjpeg.a \ + -arch arm $TMPDIR/dist.armv6/$LIBDIR/libjpeg.a \ + -output $PKGROOT/$LIBDIR/libjpeg.a lipo -create \ - $PKGROOT/usr/lib/libturbojpeg.a \ - -arch arm $TMPDIR/dist.armv6/opt/$PACKAGE_NAME/lib/libturbojpeg.a \ - -output $PKGROOT/usr/lib/libturbojpeg.a + $PKGROOT/$LIBDIR/libturbojpeg.a \ + -arch arm $TMPDIR/dist.armv6/$LIBDIR/libturbojpeg.a \ + -output $PKGROOT/$LIBDIR/libturbojpeg.a fi if [ $BUILDARMV7 = 1 ]; then @@ -184,28 +198,51 @@ if [ $BUILDARMV7 = 1 ]; then make install DESTDIR=$TMPDIR/dist.armv7 popd lipo -create \ - $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.a \ - -arch arm $TMPDIR/dist.armv7/opt/$PACKAGE_NAME/lib/libjpeg.a \ - -output $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.a + $PKGROOT/$LIBDIR/libjpeg.a \ + -arch arm $TMPDIR/dist.armv7/$LIBDIR/libjpeg.a \ + -output $PKGROOT/$LIBDIR/libjpeg.a lipo -create \ - $PKGROOT/usr/lib/libturbojpeg.a \ - -arch arm $TMPDIR/dist.armv7/opt/$PACKAGE_NAME/lib/libturbojpeg.a \ - -output $PKGROOT/usr/lib/libturbojpeg.a + $PKGROOT/$LIBDIR/libturbojpeg.a \ + -arch arm $TMPDIR/dist.armv7/$LIBDIR/libturbojpeg.a \ + -output $PKGROOT/$LIBDIR/libturbojpeg.a fi -install_name_tool -id /opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.dylib $PKGROOT/opt/$PACKAGE_NAME/lib/libjpeg.@SO_MAJOR_VERSION@.dylib -install_name_tool -id libturbojpeg.dylib $PKGROOT/usr/lib/libturbojpeg.dylib +if [ $BUILDARMV7S = 1 ]; then + if [ ! -d $BUILDDIRARMV7S ]; then + echo ERROR: ARM v7s build directory $BUILDDIRARMV7S does not exist + exit 1 + fi + if [ ! -f $BUILDDIRARMV7S/Makefile ]; then + echo ERROR: ARM v7s build directory $BUILDDIRARMV7S is not configured + exit 1 + fi + mkdir -p $TMPDIR/dist.armv7s + pushd $BUILDDIRARMV7S + make install DESTDIR=$TMPDIR/dist.armv7s + popd + lipo -create \ + $PKGROOT/$LIBDIR/libjpeg.a \ + -arch arm $TMPDIR/dist.armv7s/$LIBDIR/libjpeg.a \ + -output $PKGROOT/$LIBDIR/libjpeg.a + lipo -create \ + $PKGROOT/$LIBDIR/libturbojpeg.a \ + -arch arm $TMPDIR/dist.armv7s/$LIBDIR/libturbojpeg.a \ + -output $PKGROOT/$LIBDIR/libturbojpeg.a +fi + +install_name_tool -id $LIBDIR/libjpeg.@SO_MAJOR_VERSION@.dylib $PKGROOT/$LIBDIR/libjpeg.@SO_MAJOR_VERSION@.dylib +install_name_tool -id $LIBDIR/libturbojpeg.0.dylib $PKGROOT/$LIBDIR/libturbojpeg.0.dylib -ln -fs /usr/include/turbojpeg.h $PKGROOT/opt/$PACKAGE_NAME/include/ -ln -fs /usr/lib/libturbojpeg.a $PKGROOT/opt/$PACKAGE_NAME/lib/ if [ $WITH_JAVA = 1 ]; then - ln -fs libturbojpeg.dylib $PKGROOT/usr/lib/libturbojpeg.jnilib -fi -if [ ! -h $PKGROOT/opt/$PACKAGE_NAME/lib32 ]; then - ln -fs lib $PKGROOT/opt/$PACKAGE_NAME/lib32 + ln -fs libturbojpeg.0.dylib $PKGROOT/$LIBDIR/libturbojpeg.jnilib fi -if [ ! -h $PKGROOT/opt/$PACKAGE_NAME/lib64 ]; then - ln -fs lib $PKGROOT/opt/$PACKAGE_NAME/lib64 +if [ "$PREFIX" = "/opt/libjpeg-turbo" -a "$LIBDIR" = "/opt/libjpeg-turbo/lib" ]; then + if [ ! -h $PKGROOT/$PREFIX/lib32 ]; then + ln -fs lib $PKGROOT/$PREFIX/lib32 + fi + if [ ! -h $PKGROOT/$PREFIX/lib64 ]; then + ln -fs lib $PKGROOT/$PREFIX/lib64 + fi fi chmod 1775 $PKGROOT/Library @@ -214,10 +251,9 @@ mkdir -p $TMPDIR/pkg/Resources cp pkgscripts/Description.plist $TMPDIR/pkg/ cp pkgscripts/Info.plist $TMPDIR/pkg/ -install -m 755 pkgscripts/uninstall $PKGROOT/opt/$PACKAGE_NAME/bin/ +install -m 755 pkgscripts/uninstall $PKGROOT/$BINDIR/ -sudo chown -R root:admin $PKGROOT -sudo chown -R root:0 $PKGROOT/usr +sudo chown -R root:admin $PKGROOT cp $SRCDIR/release/License.rtf $SRCDIR/release/Welcome.rtf $SRCDIR/release/ReadMe.rtf $TMPDIR/pkg/Resources/ mkdir $TMPDIR/dmg diff --git a/release/makesunpkg.in b/release/makesunpkg.in deleted file mode 100644 index 7cf36a8..0000000 --- a/release/makesunpkg.in +++ /dev/null @@ -1,143 +0,0 @@ -#!/bin/sh - -set -u -set -e -trap onexit INT -trap onexit TERM -trap onexit EXIT - -TMPDIR= - -onexit() -{ - if [ ! "$TMPDIR" = "" ]; then - rm -rf $TMPDIR - fi -} - -usage() -{ - echo "$0 [combined [32-bit build dir.]]" - exit 1 -} - -COMBINED=0 - -PACKAGE_NAME=@PACKAGE_NAME@ -VERSION=@VERSION@ -BUILD=@BUILD@ -PKGARCH=@DEBARCH@ -SRCDIR=@abs_top_srcdir@ -BUILDDIR32=@abs_top_srcdir@/solx86 -WITH_JAVA=@WITH_JAVA@ -if [ $# -gt 0 ]; then - if [ "$1" = "combined" ]; then - COMBINED=1 - if [ $# -gt 1 ]; then BUILDDIR32=$2; fi - fi -fi - -umask 022 -TMPDIR=`mktemp -d /tmp/$PACKAGE_NAME-build.XXXXXX` -rm -f $PACKAGE_NAME.pkg.bz2 -cp $SRCDIR/release/copyright $TMPDIR -touch $TMPDIR/depend -cp pkgscripts/pkginfo $TMPDIR/pkginfo - -if [ "$PKGARCH" = "i386" ]; then - __LIB=lib -else - __LIB=lib/$PKGARCH -fi - -if [ $COMBINED = 1 ]; then - if [ ! -d $BUILDDIR32 ]; then - echo ERROR: 32-bit build directory $BUILDDIR32 does not exist - exit 1 - fi - if [ ! -f $BUILDDIR32/Makefile ]; then - echo ERROR: 32-bit build directory $BUILDDIR32 is not configured - exit 1 - fi - PWD=`pwd` - cd $BUILDDIR32 - make install DESTDIR=$TMPDIR mandir=/opt/$PACKAGE_NAME/man AM_MAKEFLAGS="mandir=/opt/$PACKAGE_NAME/man" - cd $PWD -fi -# This mess is to work around a bug in /usr/ccs/bin/make -make install DESTDIR=$TMPDIR libdir=/opt/$PACKAGE_NAME/$__LIB \ - mandir=/opt/$PACKAGE_NAME/man docdir=/opt/$PACKAGE_NAME/doc \ - exampledir=/opt/$PACKAGE_NAME/doc \ - AM_MAKEFLAGS="libdir=/opt/$PACKAGE_NAME/$__LIB mandir=/opt/$PACKAGE_NAME/man docdir=/opt/$PACKAGE_NAME/doc exampledir=/opt/$PACKAGE_NAME/doc" -rm -f $TMPDIR/opt/$PACKAGE_NAME/$__LIB/*.la - -cat >$TMPDIR/proto <>$TMPDIR/proto <>$TMPDIR/proto -echo s none $PACKAGE_NAME/lib64=${__LIB} >>$TMPDIR/proto -echo s none $PACKAGE_NAME/lib/64=$PKGARCH >>$TMPDIR/proto -fi -cat >>$TMPDIR/proto <>$TMPDIR/proto -echo f none $PACKAGE_NAME/classes/turbojpeg.jar 0644 root bin >>$TMPDIR/proto -fi - -pkgmk -o -r $TMPDIR/opt -d $TMPDIR -a i386 -f $TMPDIR/proto -pkgtrans -s $TMPDIR $TMPDIR/$PACKAGE_NAME-$VERSION.pkg $PACKAGE_NAME -bzip2 $TMPDIR/$PACKAGE_NAME-$VERSION.pkg -cp $TMPDIR/$PACKAGE_NAME-$VERSION.pkg.bz2 . - -exit diff --git a/release/pkginfo.in b/release/pkginfo.in deleted file mode 100644 index 772ad0f..0000000 --- a/release/pkginfo.in +++ /dev/null @@ -1,16 +0,0 @@ -ARCH=i386 -PKG=@PACKAGE_NAME@ -NAME=@PACKAGE_NAME@ SDK and run time libraries -VERSION=@VERSION@,REV=@BUILD@ -SUNW_PKGVERS=1.0 -DESC=A SIMD-accelerated JPEG codec that provides both the libjpeg and TurboJPEG APIs -VENDOR=The libjpeg-turbo Project -HOTLINE=http://www.libjpeg-turbo.org -EMAIL=information@libjpeg-turbo.org -MAXINST=1 -CATEGORY=application -BASEDIR=/opt -CLASSES=none -SUNW_PKG_ALLZONES=true -SUNW_PKG_HOLLOW=false -SUNW_PKG_THISZONE=false diff --git a/release/uninstall.in b/release/uninstall.in index 2e4598c..f167bbd 100644 --- a/release/uninstall.in +++ b/release/uninstall.in @@ -1,4 +1,4 @@ -# Copyright (C)2009-2011 D. R. Commander. All Rights Reserved. +# Copyright (C)2009-2011, 2013 D. R. Commander. All Rights Reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -31,7 +31,7 @@ if [ ! "`id -u`" = "0" ]; then exit -1 fi -PACKAGE=@PACKAGE_NAME@ +PACKAGE=@PKGNAME@ MACPACKAGE=com.$PACKAGE.$PACKAGE RECEIPT=/Library/Receipts/$PACKAGE.pkg @@ -56,27 +56,46 @@ done popd echo Removing package directories ... -if [ -d /opt/$PACKAGE/bin ]; then - rmdir /opt/$PACKAGE/bin 2>&1 || EXITSTATUS=-1 +PREFIX=%{__prefix} +BINDIR=%{__bindir} +DATADIR=%{__datadir} +INCLUDEDIR=%{__includedir} +LIBDIR=%{__libdir} +MANDIR=%{__mandir} + +if [ -d $BINDIR ]; then + rmdir $BINDIR 2>&1 || EXITSTATUS=-1 +fi +if [ -d $LIBDIR ]; then + rmdir $LIBDIR 2>&1 || EXITSTATUS=-1 +fi +if [ -d $INCLUDEDIR ]; then + rmdir $INCLUDEDIR 2>&1 || EXITSTATUS=-1 +fi +if [ "$PREFIX" = "/opt/libjpeg-turbo" -a "$LIBDIR" = "/opt/libjpeg-turbo/lib" ]; then + if [ -h $LIBDIR\32 ]; then + rm $LIBDIR\32 2>&1 || EXITSTATUS=-1 + fi + if [ -h $LIBDIR\64 ]; then + rm $LIBDIR\64 2>&1 || EXITSTATUS=-1 + fi fi -if [ -d /opt/$PACKAGE/lib ]; then - rmdir /opt/$PACKAGE/lib 2>&1 || EXITSTATUS=-1 +if [ -d $MANDIR/man1 ]; then + rmdir $MANDIR/man1 2>&1 || EXITSTATUS=-1 fi -if [ -d /opt/$PACKAGE/include ]; then - rmdir /opt/$PACKAGE/include 2>&1 || EXITSTATUS=-1 +if [ -d $MANDIR ]; then + rmdir $MANDIR 2>&1 || EXITSTATUS=-1 fi -rm /opt/$PACKAGE/lib32 2>&1 || EXITSTATUS=-1 -rm /opt/$PACKAGE/lib64 2>&1 || EXITSTATUS=-1 -if [ -d /opt/$PACKAGE/man/man1 ]; then - rmdir /opt/$PACKAGE/man/man1 2>&1 || EXITSTATUS=-1 +if [ -d $DATADIR/classes ]; then + rmdir $DATADIR/classes 2>&1 || EXITSTATUS=-1 fi -if [ -d /opt/$PACKAGE/man ]; then - rmdir /opt/$PACKAGE/man 2>&1 || EXITSTATUS=-1 +if [ -d $DATADIR -a "$DATADIR" != "$PREFIX" ]; then + rmdir $DATADIR 2>&1 || EXITSTATUS=-1 fi -if [ -d /opt/$PACKAGE/classes ]; then - rmdir /opt/$PACKAGE/classes 2>&1 || EXITSTATUS=-1 +if [ "$PREFIX" = "/opt/libjpeg-turbo" -a -h "$PREFIX/doc" ]; then + rm $PREFIX/doc 2>&1 || EXITSTATUS=-1 fi -rmdir /opt/$PACKAGE 2>&1 || EXITSTATUS=-1 +rmdir $PREFIX 2>&1 || EXITSTATUS=-1 rmdir /Library/Documentation/$PACKAGE 2>&1 || EXITSTATUS=-1 if [ -d $RECEIPT ]; then diff --git a/sharedlib/CMakeLists.txt b/sharedlib/CMakeLists.txt index 25ddbdf..cd3f268 100755 --- a/sharedlib/CMakeLists.txt +++ b/sharedlib/CMakeLists.txt @@ -24,8 +24,13 @@ if(WITH_SIMD) set_source_files_properties(${SIMD_OBJS} PROPERTIES GENERATED 1) endif() -add_library(jpeg SHARED ${JPEG_SRCS} ${SIMD_OBJS} - ${CMAKE_SOURCE_DIR}/win/jpeg${DLL_VERSION}.def) +if(WITH_MEM_SRCDST AND NOT WITH_JPEG8) + add_library(jpeg SHARED ${JPEG_SRCS} ${SIMD_OBJS} + ${CMAKE_SOURCE_DIR}/win/jpeg${DLL_VERSION}-memsrcdst.def) +else() + add_library(jpeg SHARED ${JPEG_SRCS} ${SIMD_OBJS} + ${CMAKE_SOURCE_DIR}/win/jpeg${DLL_VERSION}.def) +endif() set_target_properties(jpeg PROPERTIES SOVERSION ${DLL_VERSION} VERSION ${FULLVERSION}) if(MSVC) diff --git a/simd/CMakeLists.txt b/simd/CMakeLists.txt index 06bbae4..fc2ce99 100755 --- a/simd/CMakeLists.txt +++ b/simd/CMakeLists.txt @@ -43,16 +43,19 @@ foreach(file ${SIMD_BASENAMES}) set(DEPFILE "") set(SIMD_SRC ${CMAKE_CURRENT_SOURCE_DIR}/${file}.asm) if(${file} MATCHES col) - set(DEPFILE ${SIMD_SRC}) + set(DEPFILE ${file}) string(REGEX REPLACE "col" "clr" DEPFILE ${DEPFILE}) + set(DEPFILE ${CMAKE_CURRENT_SOURCE_DIR}/${DEPFILE}.asm) endif() if(${file} MATCHES mer) - set(DEPFILE ${SIMD_SRC}) + set(DEPFILE ${file}) string(REGEX REPLACE "mer" "mrg" DEPFILE ${DEPFILE}) + set(DEPFILE ${CMAKE_CURRENT_SOURCE_DIR}/${DEPFILE}.asm) endif() if(${file} MATCHES gra) - set(DEPFILE ${SIMD_SRC}) + set(DEPFILE ${file}) string(REGEX REPLACE "gra" "gry" DEPFILE ${DEPFILE}) + set(DEPFILE ${CMAKE_CURRENT_SOURCE_DIR}/${DEPFILE}.asm) endif() set(SIMD_OBJ ${OBJDIR}/${file}.obj) add_custom_command(OUTPUT ${SIMD_OBJ} diff --git a/simd/Makefile.in b/simd/Makefile.in index c1dcba2..d40e96c 100644 --- a/simd/Makefile.in +++ b/simd/Makefile.in @@ -171,9 +171,11 @@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ +LIBTOOL_CURRENT = @LIBTOOL_CURRENT@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ +MEM_SRCDST_FUNCTIONS = @MEM_SRCDST_FUNCTIONS@ NAFLAGS = @NAFLAGS@ NASM = @NASM@ OBJEXT = @OBJEXT@ @@ -184,6 +186,7 @@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGNAME = @PKGNAME@ RANLIB = @RANLIB@ RPMARCH = @RPMARCH@ RPM_CONFIG_ARGS = @RPM_CONFIG_ARGS@ @@ -195,6 +198,7 @@ SIMD_I386_FALSE = @SIMD_I386_FALSE@ SIMD_I386_TRUE = @SIMD_I386_TRUE@ SIMD_X86_64_FALSE = @SIMD_X86_64_FALSE@ SIMD_X86_64_TRUE = @SIMD_X86_64_TRUE@ +SO_AGE = @SO_AGE@ SO_MAJOR_VERSION = @SO_MAJOR_VERSION@ SO_MINOR_VERSION = @SO_MINOR_VERSION@ STRIP = @STRIP@ @@ -215,6 +219,8 @@ WITH_SIMD_FALSE = @WITH_SIMD_FALSE@ WITH_SIMD_TRUE = @WITH_SIMD_TRUE@ WITH_SSE_FLOAT_DCT_FALSE = @WITH_SSE_FLOAT_DCT_FALSE@ WITH_SSE_FLOAT_DCT_TRUE = @WITH_SSE_FLOAT_DCT_TRUE@ +WITH_TURBOJPEG_FALSE = @WITH_TURBOJPEG_FALSE@ +WITH_TURBOJPEG_TRUE = @WITH_TURBOJPEG_TRUE@ X86_64_FALSE = @X86_64_FALSE@ X86_64_TRUE = @X86_64_TRUE@ ac_ct_AR = @ac_ct_AR@ diff --git a/simd/jdclrss2-64.asm b/simd/jdclrss2-64.asm index 9b2e930..7d17c52 100644 --- a/simd/jdclrss2-64.asm +++ b/simd/jdclrss2-64.asm @@ -2,7 +2,7 @@ ; jdclrss2-64.asm - colorspace conversion (64-bit SSE2) ; ; Copyright 2009, 2012 Pierre Ossman for Cendio AB -; Copyright 2009 D. R. Commander +; Copyright 2009, 2012 D. R. Commander ; ; Based on ; x86 SIMD extension for IJG JPEG library @@ -288,7 +288,7 @@ EXTN(jsimd_ycc_rgb_convert_sse2): ; space. cmp rcx, byte SIZEOF_MMWORD jb short .column_st7 - movq MMWORD [rdi], xmmA + movq XMM_MMWORD [rdi], xmmA add rdi, byte SIZEOF_MMWORD sub rcx, byte SIZEOF_MMWORD psrldq xmmA, SIZEOF_MMWORD @@ -297,7 +297,7 @@ EXTN(jsimd_ycc_rgb_convert_sse2): ; space. cmp rcx, byte SIZEOF_DWORD jb short .column_st3 - movd DWORD [rdi], xmmA + movd XMM_DWORD [rdi], xmmA add rdi, byte SIZEOF_DWORD sub rcx, byte SIZEOF_DWORD psrldq xmmA, SIZEOF_DWORD @@ -407,7 +407,7 @@ EXTN(jsimd_ycc_rgb_convert_sse2): ; space. test rcx, rcx jz short .nextrow - movd DWORD [rdi], xmmA + movd XMM_DWORD [rdi], xmmA %endif ; RGB_PIXELSIZE ; --------------- diff --git a/simd/jdclrss2.asm b/simd/jdclrss2.asm index d26a5bb..97754cb 100644 --- a/simd/jdclrss2.asm +++ b/simd/jdclrss2.asm @@ -2,6 +2,7 @@ ; jdclrss2.asm - colorspace conversion (SSE2) ; ; Copyright 2009, 2012 Pierre Ossman for Cendio AB +; Copyright 2012 D. R. Commander ; ; Based on ; x86 SIMD extension for IJG JPEG library @@ -300,7 +301,7 @@ EXTN(jsimd_ycc_rgb_convert_sse2): ; space. cmp ecx, byte SIZEOF_MMWORD jb short .column_st7 - movq MMWORD [edi], xmmA + movq XMM_MMWORD [edi], xmmA add edi, byte SIZEOF_MMWORD sub ecx, byte SIZEOF_MMWORD psrldq xmmA, SIZEOF_MMWORD @@ -309,7 +310,7 @@ EXTN(jsimd_ycc_rgb_convert_sse2): ; space. cmp ecx, byte SIZEOF_DWORD jb short .column_st3 - movd DWORD [edi], xmmA + movd XMM_DWORD [edi], xmmA add edi, byte SIZEOF_DWORD sub ecx, byte SIZEOF_DWORD psrldq xmmA, SIZEOF_DWORD @@ -411,7 +412,7 @@ EXTN(jsimd_ycc_rgb_convert_sse2): ; space. cmp ecx, byte SIZEOF_XMMWORD/8 jb short .column_st7 - movq MMWORD [edi], xmmA + movq XMM_MMWORD [edi], xmmA add edi, byte SIZEOF_XMMWORD/8*4 sub ecx, byte SIZEOF_XMMWORD/8 psrldq xmmA, SIZEOF_XMMWORD/8*4 @@ -420,7 +421,7 @@ EXTN(jsimd_ycc_rgb_convert_sse2): ; space. test ecx, ecx jz short .nextrow - movd DWORD [edi], xmmA + movd XMM_DWORD [edi], xmmA %endif ; RGB_PIXELSIZE ; --------------- diff --git a/simd/jdmrgss2-64.asm b/simd/jdmrgss2-64.asm index 5d8fc46..ffbf6b2 100644 --- a/simd/jdmrgss2-64.asm +++ b/simd/jdmrgss2-64.asm @@ -2,7 +2,7 @@ ; jdmrgss2-64.asm - merged upsampling/color conversion (64-bit SSE2) ; ; Copyright 2009, 2012 Pierre Ossman for Cendio AB -; Copyright 2009 D. R. Commander +; Copyright 2009, 2012 D. R. Commander ; ; Based on ; x86 SIMD extension for IJG JPEG library @@ -292,7 +292,7 @@ EXTN(jsimd_h2v1_merged_upsample_sse2): ; space. cmp rcx, byte SIZEOF_MMWORD jb short .column_st7 - movq MMWORD [rdi], xmmA + movq XMM_MMWORD [rdi], xmmA add rdi, byte SIZEOF_MMWORD sub rcx, byte SIZEOF_MMWORD psrldq xmmA, SIZEOF_MMWORD @@ -301,7 +301,7 @@ EXTN(jsimd_h2v1_merged_upsample_sse2): ; space. cmp rcx, byte SIZEOF_DWORD jb short .column_st3 - movd DWORD [rdi], xmmA + movd XMM_DWORD [rdi], xmmA add rdi, byte SIZEOF_DWORD sub rcx, byte SIZEOF_DWORD psrldq xmmA, SIZEOF_DWORD @@ -405,7 +405,7 @@ EXTN(jsimd_h2v1_merged_upsample_sse2): ; space. cmp rcx, byte SIZEOF_XMMWORD/8 jb short .column_st7 - movq MMWORD [rdi], xmmA + movq XMM_MMWORD [rdi], xmmA add rdi, byte SIZEOF_XMMWORD/8*4 sub rcx, byte SIZEOF_XMMWORD/8 psrldq xmmA, SIZEOF_XMMWORD/8*4 @@ -414,7 +414,7 @@ EXTN(jsimd_h2v1_merged_upsample_sse2): ; space. test rcx, rcx jz short .endcolumn - movd DWORD [rdi], xmmA + movd XMM_DWORD [rdi], xmmA %endif ; RGB_PIXELSIZE ; --------------- diff --git a/simd/jdmrgss2.asm b/simd/jdmrgss2.asm index f190468..6494340 100644 --- a/simd/jdmrgss2.asm +++ b/simd/jdmrgss2.asm @@ -2,6 +2,7 @@ ; jdmrgss2.asm - merged upsampling/color conversion (SSE2) ; ; Copyright 2009, 2012 Pierre Ossman for Cendio AB +; Copyright 2012 D. R. Commander ; ; Based on ; x86 SIMD extension for IJG JPEG library @@ -305,7 +306,7 @@ EXTN(jsimd_h2v1_merged_upsample_sse2): ; space. cmp ecx, byte SIZEOF_MMWORD jb short .column_st7 - movq MMWORD [edi], xmmA + movq XMM_MMWORD [edi], xmmA add edi, byte SIZEOF_MMWORD sub ecx, byte SIZEOF_MMWORD psrldq xmmA, SIZEOF_MMWORD @@ -314,7 +315,7 @@ EXTN(jsimd_h2v1_merged_upsample_sse2): ; space. cmp ecx, byte SIZEOF_DWORD jb short .column_st3 - movd DWORD [edi], xmmA + movd XMM_DWORD [edi], xmmA add edi, byte SIZEOF_DWORD sub ecx, byte SIZEOF_DWORD psrldq xmmA, SIZEOF_DWORD @@ -419,7 +420,7 @@ EXTN(jsimd_h2v1_merged_upsample_sse2): ; space. cmp ecx, byte SIZEOF_XMMWORD/8 jb short .column_st7 - movq MMWORD [edi], xmmA + movq XMM_MMWORD [edi], xmmA add edi, byte SIZEOF_XMMWORD/8*4 sub ecx, byte SIZEOF_XMMWORD/8 psrldq xmmA, SIZEOF_XMMWORD/8*4 @@ -428,7 +429,7 @@ EXTN(jsimd_h2v1_merged_upsample_sse2): ; space. test ecx, ecx jz short .endcolumn - movd DWORD [edi], xmmA + movd XMM_DWORD [edi], xmmA %endif ; RGB_PIXELSIZE ; --------------- diff --git a/simd/jsimd_arm.c b/simd/jsimd_arm.c index cae84df..bd717a4 100644 --- a/simd/jsimd_arm.c +++ b/simd/jsimd_arm.c @@ -3,7 +3,7 @@ * * Copyright 2009 Pierre Ossman for Cendio AB * Copyright 2009-2011 D. R. Commander - * + * * Based on the x86 SIMD extension for IJG JPEG library, * Copyright (C) 1999-2006, MIYASAKA Masaru. * For conditions of distribution and use, see copyright notice in jsimdext.inc diff --git a/simd/jsimd_arm_neon.S b/simd/jsimd_arm_neon.S index 9962b8a..ac6c860 100644 --- a/simd/jsimd_arm_neon.S +++ b/simd/jsimd_arm_neon.S @@ -1,5 +1,5 @@ /* - * ARM NEON optimizations for libjpeg-turbo + * ARMv7 NEON optimizations for libjpeg-turbo * * Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. @@ -35,6 +35,7 @@ #define RESPECT_STRICT_ALIGNMENT 1 + /*****************************************************************************/ /* Supplementary macro for setting function attributes */ @@ -62,6 +63,7 @@ _\fname: vtrn.32 \x1, \x3 .endm + #define CENTERJSAMPLE 128 /*****************************************************************************/ @@ -670,6 +672,7 @@ asm_function jsimd_idct_islow_neon .unreq ROW7R .endfunc + /*****************************************************************************/ /* @@ -894,6 +897,7 @@ asm_function jsimd_idct_ifast_neon .unreq TMP4 .endfunc + /*****************************************************************************/ /* @@ -1108,6 +1112,7 @@ asm_function jsimd_idct_4x4_neon .purgem idct_helper + /*****************************************************************************/ /* @@ -1262,6 +1267,7 @@ asm_function jsimd_idct_2x2_neon .purgem idct_helper + /*****************************************************************************/ /* @@ -1561,6 +1567,7 @@ generate_jsimd_ycc_rgb_convert_neon extxrgb, 32, 1, 2, 3 .purgem do_load .purgem do_store + /*****************************************************************************/ /* @@ -1871,6 +1878,7 @@ generate_jsimd_rgb_ycc_convert_neon extxrgb, 32, 1, 2, 3 .purgem do_load .purgem do_store + /*****************************************************************************/ /* @@ -1934,6 +1942,7 @@ asm_function jsimd_convsamp_neon .unreq TMP4 .endfunc + /*****************************************************************************/ /* @@ -2057,6 +2066,7 @@ asm_function jsimd_fdct_ifast_neon .unreq TMP .endfunc + /*****************************************************************************/ /* @@ -2158,6 +2168,7 @@ asm_function jsimd_quantize_neon .unreq LOOP_COUNT .endfunc + /*****************************************************************************/ /* diff --git a/structure.txt b/structure.txt index 6a9266b..12549e0 100644 --- a/structure.txt +++ b/structure.txt @@ -1,7 +1,9 @@ IJG JPEG LIBRARY: SYSTEM ARCHITECTURE Copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding. -This file is part of the Independent JPEG Group's software. +This file was part of the Independent JPEG Group's software. +It was modified by The libjpeg-turbo Project to include only information +relevant to libjpeg-turbo. For conditions of distribution and use, see the accompanying README file. @@ -455,8 +457,8 @@ shown are: buffered by the coefficient controller have NOT been dequantized; we merge dequantization and inverse DCT into a single step for speed reasons. When scaled-down output is asked for, simplified DCT algorithms may be used - that emit only 1x1, 2x2, or 4x4 samples per DCT block, not the full 8x8. - Works on one DCT block at a time. + that emit fewer samples per DCT block, not the full 8x8. Works on one DCT + block at a time. * Postprocessing controller: buffer controller for the color quantization input buffer, when quantization is in use. (Without quantization, this diff --git a/testimages/nightshot_iso_100.txt b/testimages/nightshot_iso_100.txt new file mode 100644 index 0000000..9320886 --- /dev/null +++ b/testimages/nightshot_iso_100.txt @@ -0,0 +1,25 @@ +libjpeg-turbo note: This image was extracted from the 8-bit nightshot_iso_100 +image. The original can be downloaded at the link below. + +The New Image Compression Test Set - Jan 2008 +http://www.imagecompression.info/test_images + +The images historically used for compression research (lena, barbra, pepper etc...) have outlived their useful life and its about time they become a part of history only. They are too small, come from data sources too old and are available in only 8-bit precision. + +These images have been carefully selected to aid in image compression algorithm research and evaluation. These are photographic images chosen to come from a wide variety of sources and each one picked to stress different aspects of algorithms. Images are available in 8-bit, 16-bit and 16-bit linear variations, RGB and gray. + +Images are available without any prohibitive copyright restrictions. + +These images are (c) there respective owners. You are granted full redistribution and publication rights on these images provided: + +1. The origin of the pictures must not be misrepresented; you must not claim that you took the original pictures. If you use, publish or redistribute them, an acknowledgment would be appreciated but is not required. +2. Altered versions must be plainly marked as such, and must not be misinterpreted as being the originals. +3. No payment is required for distribution this material, it must be available freely under the conditions stated here. That is, it is prohibited to sell the material. +4. This notice may not be removed or altered from any distribution. + +Acknowledgments: A lot of people contributed a lot of time and effort in making this test set possible. Thanks to everyone who voiced their opinion in any of the discussions online. Thanks to Axel Becker, Thomas Richter and Niels Fröhling for their extensive help in picking images, running all the various tests etc... Thanks to Pete Fraser, Tony Story, Wayne J. Cosshall, David Coffin, Bruce Lindbloom and raw.fotosite.pl for the images which make up this set. + +Sachin Garg [India] +sachingarg@c10n.info + +www.sachingarg.com | www.c10n.info | www.imagecompression.info diff --git a/testimages/testimg.bmp b/testimages/testimg.bmp deleted file mode 100644 index 8603d15484d47f0b90eb4246a2309c566f8adaa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35050 zcma)_3tX1<-TyC>J>f74nTlu{hZGOkAIYFla+;t5CY2?gP!NJV4nbH*Qq9cO(pDM; z!M&9_Ivv~Qt&darbb%w{>;N(93 zxHBv7XHI7B(@w~}KJe$ADSu}5{^WsOJ zI*aaj&q=#&u9K8K$JtiC&KVZ*ptI}npPaa{e{tsJr8}`x=Q!~HsR(Vsi< z6VE!Oi}IYG&-{b)>)&p5?#y26JhZRG$({Pp-* zCw1O_CwWqxb9CK0XX?y{oy_bsXH@hjPSN_U&Mi~dI4|D+3nw(>O(%BzBqu+k&AETU zpPdmABb=wQ?{OwQFwa@{>=RD&H|L!P?{9O~{_2Et>+PR7lZUrCQMc@K?!9N3^Ug2U zIFoPR=1iHL>OA~zgh97 zQ}*1a&dy)`!O57K?Cjou%vo0awDVT&Kb+b>z3seK^OCdexy{b8O`DvjH`h6TI(F8{ zfBl!v@!ve@{BGyF&KqxTaT@mTck=Fk!`c17Q%?8|Y0g7g`tAhI9RdZO+J1QG8yYZ8p|f+xHfQhdKRENIzv;|R|J2ENuE=>{#eV08am$>Wr!IAVwQrmA zhpKO!@bFKa`!cpU^X{MTjJ)Z7Cw|gC=jFd_cLqni;N&d-)LF3nMdzOBpE(o9e(J1P z@R{?=+)tcU3miq2f7o6*&mpTt`_=9u%{Kd|&TcVv=GydTmdh$0;>X>hx2O zPFmI*PP|&Ef4qNaUZ|(VpHB--3yn`pjJamg)oWjUX56@?7b5!{e`U&)n+FZL@4f?b z<}6)0?muafk&!?A#mI5vc5aDE>byi*>mC)=J*s1(tTC@{_a%^7cLZIT6|)f zf11A$0-81!U0lyT^FGWRF2@wVl9#1`lg;o8l3{!6i z3&y^ys;XN3QmR%BT(zouYpb7Mr;Z&W>M?CXJdpm0yLVmv#H-i2id~4@+2{Cyt59-~ zC_njM4*rMIE}b*@F?9Q3yJbsMpb&NN*5Cm%C53yV+~V&c4CiCeZv_Pz6Cxs{V034c zu8F{gRaYJ3)6#&#K#kDuc$JvA8&kdDp@|$9*{9EOlpHkZ z(0%_A@kV!}wm7<%gC>D!)7%sOW(FU2NO2{f1E7uMk^@xtr zm*yuSSM^1`s;U$i_pj=nlH##d%o42l^XJcpVx(#~WN2c%f8M^UfBEWl_@lMR$ekDZ z95?{v$^Ve?hYGr{<&OY%5fTpgQd*^EcsRELD8s`Gpu`n}bo|!3*s4*wD*A!F&~Kri zA5I9RT@122to&f1QxJbX91KJcVN?hV5vxDv{p$PBuF15jS4a={61BeSAMjvd^{H-kUS{#=%>zk!C{&PDmh)m zcmgdBx$A0+tDT2>!BWV77IHfO$o-HaAG_u8`~UHi^FBU-8-oIa0%=KHO-Yk7bS1GS zD5bU4OxK_Ekrm~}Q$hJ*lHYF<(66-%p*@w1LNvxIe(p!^kdP4C&8*giBx5Ef#_am_ z6R&pB@fnQul>-M3Y?|{giLaB$^Q7ai+`zi?;m7a)iBApf$dSM!HAiY{#OSu7z@jKc z+Vdk|6k=;DI{Nbp5nVEHp!B>jU=y(Lhk!UG>Y<;So|wpvOcnL8R+{UQ6ULla{X zCtdyOtK>(w5m_(vx#jpP$BzT44B5fa@eBXvF*5Sue?m8;CZp!aMs7!HHg4Q_BruTc z#tzV+q@eK70_;>mwqmOO{{986eu|@FvU~R_f=aS_budx|Jj#xW)?g-B^ z&K)_jk&BB8X;M&NcvNXnP-{vMGRB7%0GT32S3$#)c(jGa_dUXeik}M?dJxGXtsnwv z?@C8kNpng?SDp}b{6o_y0(xA%R&`Eii@dON=gvNT1|J_h7<2s(bc~GrpAY7b_44w{ zh#it4xFJXCTvqp9oPp;|&7>nirKNtP4=k0ufszF&3(-+{U7Ga!zJ#VGG{7Sxm5rQn z|NgZ7MIJ_JXby>-1RVM01hj-P(ceEth0Z0$$Y(BG7Kzj6F8Oq@<#44qmng>tfm_ULvHhW3- z#83-~rGBkZ-S-#7#}70{$K#KRr;=0212a|fK*+S1CHHp8j~61Z>w}PeBKyoae&E1h zx#a(?WaQ5O`2fKD{NQctyRh?4Xpg%AZu@)U7E+`}b3Xuc}(;;EoPdQcq$^LrF@GR3m$gU-Iis9c7MsAAL4m z=tJRpVJAA0B(M8-(e)Xsc-q4sWaJ0u*4I~5Y}+N1M*h)WrjRO1s~ zlLTZaLi*v4lF=pPLDKz8bITmy&|R*W(w#ysJ`o*BEex-SOJ$CS5KaMGo#P*~`;jNQ zgq)=puIsa@k8G8?l~Q2sflb%_A4*34N+Raw*5^(=yA8-8IAlkY#VY6oo;!D1*Ns5p znhLc?lrm{BZrRO2nuenETz*JszA1L$$rT|KVtisE-3}p=A3G#WLqk2sAFa^A9k+bX z9hEvTRD$bHw>Cey_SM1H{X28rdH+~EG1nTV3L|DJ9Xr~&K&fZ83ZtY%NhOmb6bDI3 zHRnUOY}x;>gf43*spxpC)el3(5$SJ0xQcq5DlL9L-A5QLabU1AQf{u@nyq53;~zP> z_PWlXIu1w$9Ug9(^5Px6dM$bJS%@D~MaK`sd>??;9qm|^Ct1Q%2 z6j;-dV#K^XmxgPB8u?b#?#y&mAEQ}0+W1vVBC_`DWvo>b9Em(Xfai41NAG5=n!M4 ztLRd#;vxP-VqdBNL3Wy|M@Wh3G1kz~yxltv(o612Da3J+$6p!LE3qJc_x7t#{x8-V z`Da9|_pV1pZow55u_Q+$1QJXSpjhRKfF>AIE{Z-PKoC-XyW!k-m zm>*)Lt*!WA_p0tyAku-P8;OpIeY>Zat$OssFXftPQb;_13`lci&w0*;I3A>1fE zjWVz%@ci@%3oA`cG(;a4n5xdIQ@@mW4c{OjEqv9g_`c|fkfx&*<=jCh zyXBdhThir)rsc(CUcL7Bm+AmRjC|~>LA^#442+N2eeh-y<+v{4HS*yny@)mS_2T1_ zN?7gJZ(F}hI(A42qNEfg7HaOOJJ(!Ma-+{!pQOS{qon-4WU8VQtWd49tREF6CcbA1 z3Q{_r=zHSCs_t|<+qZrkuPe_Z|g}GjE6P^t98A|iWTkd;&fj=V=@oC!+ z9hmb;mpr-iH{X%-kuj{EOKw6KT83=f)~~J($Rl+_&bhW)r^q8h52Tr@BCAp2k_4fR z>YxNwf*}D-LGc1+8O5H-P^oMx7y5NiT=^c5o@Rva_3hieQ2y8T2DiQ$u}+Q3zi`sxcwGZF6^Fo%{A{am}4V4 z+@0vV_yn(UXyr#FG`l5k7x=_$&Z%|10*r9qO)6|&Ofpt4l!2vh7~$(5}sC#KDw-A&`G zp0>E}dt68#mLJ_(M^Q(n%GLUj(viw1X33#0bvcYX``q%!J9@>3rvx!5m=#py6Z6%e z1Dhh3M!xV}ZhcOpH&D%C%?V*mJiyruV=g)>tRkdqr!rS5O0w*%bOfiMO7qAF=8+7a z`94WOL71yXJJdJs=!d92RWBG7k&(E%^5W>Di(Nn-7-;3%ch&yZOFDw)amG#^C1+aR zmPbx@Ngj+kU3K#vTX4o8T4_*a|Dw3OuO5H+;s5#h+=<>T5T&++B_uSbCp3vQtU28` zw;o%Sjz*@t$*#p>yrOiujLm%tEB=UzJ$oL>$k?3Wlf>ASjFR9|C?WAk$~XE_E@GuV zf$lIK9^FllA_P!3qEHnzxgx3n?atM*Q%7~RVzwVTiA#x0%m*h7!svBi8bg+6Ui zVOC{n&C`GTf6rYxH`u$mCAp;~A)%?I8A=ht$bCqMj&e#5p-YL364DZ-@tr1Pnx(?o z6Uw>_uM8ib%>{S`6}K?4OEFTL+PICW$os7+@ry5xzG#ddM30auPJDszXkB!?^oCV+ zQgZF9%yDSo`{9QMEr?-kDJ!Kl3n42D3rkBkW_)+o+_~P~IW5Ue&CM+dEeXxE4o2TF z3f9Rc2{)6aC|&f=;E(nWOdJ-O1XRTgVjdz#`$AqS_#V25PHdd;6d z-^b^CcoBnk($Czlu#hPYlr>(-n-bpF7$u|`s*A|0?v6*sG|!`Y$ZCdY4=P{twrq!T z?R_Ut4*F_KC?d9|5VQ;VWV0%R0*Bevm85zMj(e2{s!=n{iT?xC{1CiA^U%57TaC#n)o^k|Zg@=)AqQI(37}rc5v=goG{g!E~48Yq`4wOm~2uaX;?zYHc9|@7+}a` zt6Mwu(-RZ4!-Qefm1bg|JC^~X2?^v_pQ7;YE9o#{vE5a!`n6_RWv6ifLe53yj?q_K zG1~Nl@sf@n0fpiTIFgW;ddC2D=To4GQO4?n0_UHpXh@wpH6(Xvb&j{8g@vg!H3w{R zO|_}HxH-KT(6CcyLn`_Wq0H$w`Fq~zi86|{lR=zJ>NI19dNP;Orsa_%LY$AmqNEQ= ziw2H}jIVYwOa}1K$ilLg2Jn7q4F^48gbpg4z9*8-ihZ)9#f&ylj zP%))7@JN3B*;7-erdCHsSLbw63fAL?InB*E#mU9V&FSfQYRK8MjOTbl>ZL5{0Rpa$ zN{{BMD_ny_&(mlOVhz5COL~o+?xTt3_!B4mQIhbQrI`XumZ#lUE$(*FY*k^$Ak80@ zF0EcQOrav%1bfuDx!ZV@%@&x9#B1hUNQm{9h2(mJ*cOqKV{l4`Il8oPrxrer*m zuv)>0l?JU;%DHHlP$#>9m^077G+7POZ1zY7krg40ajZ{40YSApohG^jN+N!K^ezE~ z97dB7W5p#+Nj$O}{bV=hxMB*bj6C7OUDEJ;C@LlusUy{@%oucT?4Gli!B`z2AhXjj z0ot`K2W`1|G)<+-K}L66j*f@hhDg3TQPJyau!~W8eq1-%&6cOnO@@$Wj9&AnPah!( zG0c^$XK1BR_e7jlWk=~~p;eHwRyB;(>YPhDx|D#bNkaW7lo^NutRyRi^#_!xDI06X z?uqrTZfgrjZua#J;X-p!B`QO4VHB@9$;MePTaArnT+Y&mN*&Wny7lXK_H0AQSzQ_$ z`dub1O=u9Uk|p+JXiU$;ICkvxHNASRj893~eC$9Xv z%xu@(1!8hKo!}p~kX$P8%YbZvvKgUU!a_ozJd06Uxx+)O0O4~1=|x*Pgx*k+X8P3; zg{>sOFYEew#VW9xLwe00tJOOsjw&WJ!lPP);G@XF9~UonQ%4t{G;^i2GaVuEP<6sl zuv*QEv5HZaiZ^DZ6ylaCNr4&PRTEu=Snfimcd!BkBLpF5OMHEs=}%f@ZP>=!Knkv3 zzlzujjFgWd#5cXUnX6%jG++VSzMo+xpB~~BJD#*+`c;*M7s05R z4#gbTAKl2RB#Dx)M|%8Ggmx98OVugi`2rtH{#j5~RYg@r6|t=5h!_3gbhtv!cCd9k zdKl04!~A%!xwyEgB|#P(aw;UG!9Xi2q~Y0+a(Ve$`Ep46-N~0R~dvu%2pZa@DO&y9r}{00%WVEl+^OrrezJ2 zQDKMo>A7hci3;JWqN1cEpZQ+-jV(%Xsdq6Q=ccBT zQwa&Yg}fF05K*xP6QE8=@7)BZqOfmR!c_H9tXW{9JUEAtQE!0H{(8%i4trvS-tY7xDgf+U|k-v#G{HGy_E z_iTs=)9qrg1P|Hj*<6AN5b3>p7pE6DHSvjXODIQ4Fby#zEWIhcsknD>@7~S5ky7^R zo50_lZ7{d=P@b#H$d@zD#~EoOR;~de= zRq8NIm(^+kjJ2;52Vz`75_d^FN>c>&DJvknmYKrJ{!vMos0a(_JHxoA9@oL21#&4^Ula=NQqMhsaj>k#dO3UAq3C8ssm!R0Ci4y61E7VA%N;4p7$wJmMkks ziqjB7QBo00^uR~q(DU>61XnQa7IIcW14JCN)(}N0#s&~_6>+J4^fNRPN-d_@45a;> z5R>j2GAind${=#1tJVRDkdzEeE(BNPix7YGpEmNHcSc=|rw6GnWMv@*c~BubE~d=! zTnyEME5tA|^RD%W?ixgZeYnChA@rlrya^M^$_n-u6mgL~hf8C^kh=a%D#{u`GaX$q zC8gY{LEfl{VkI3321}G$I9@v0GNb|hbA9pXbTd@s6dn)49W$bnTR^m)oF{otWw3Sc(WK zZzz|Mhc#iLy7UIHxK?g!FPj*A4#{n>_=;N&nS5FB`yWmWuFv<%7b9K8Zlm70bKT*^ zRs~SBB4tW^UqYw|yV3pV=z$pI=x$C{5H%WOiLeq_WU=98WqAX}kH0=MbNp?K@)j*x zl$Vzm3LTK56sY<-6(GXKk?HV6hhW&M#S;{6ZX@MU>{!iil=?L2Ql>Wt1o)QU4J6ho zKWsu{U0h<`@l|O=qmr=h$YtKkavCS5zMVgI`gHPRQ22?%cdi3+#I%(K*ejlyLY3}8 zgm9YFw1!7sG1{>?3!<>4zapj-37vVjjn7=MVg-!W#t(2QJxYRl9-qu7u8{vMW(v_N z^K|lKgJPzyZ*p66E>>x=M|MlLPsU>9dC3tG5n(C;q_0`25{yCCg4opLi_U^PD@clh z;144LT3S-ioS8m7rAnjoeY>suX5__by+*ENY6(PoB5qY1-FYX8gw-7Jo&7}vq%Uc~ zM{#E~>&ckDTL@-hR#s8b>eU0w-nwo43K-|jTQO|KFxl*m9UJh?@p++0i6s+W8PN5q znV&zmEjhWw4pMPdt=715feL9Ob#SCKWswpt{AMy7z0;T1rZ=@kL`Tqb(Z{1EB}Gc< zm)@IBsXiST4YYxeEh1oMds9o}#4|O4%m=oX`jtk7_8K*6-8w?-N_x#5I;uc*DLrBW zX^f)8T&q?W4IFrR*`h^~QMS5b*vl`k=pj8TxZN}q~5=LxU*-Z=pQ3L0tv z$~ApUM5WZBUWwwX2?=Gogv95_AY!R)%9%kQ8#XoSJP<{wpYpHqSDr?>c(%MeAYx|w z@Z^~-6YF3stgI{@6XY}Pn>+8klRR?x1fw|}I*PHwTHVMaMqyThh^Y=N8(4PvTQI&X z$Q3VhaodI!8^&kilvD*~s|5KHIt>ZIt!>iRj{Ex#0-Q4a>lkJOnR0w)#8`Z_u`%J{PCSpqYkfx(Hu|)Dq0UG&pH^1Iv{2h4NQA$ z;9Hkpe)$)&QOW4JnyqeFk-24j-UK|6)vxhBHDiP4dN<}oL`O%5HJ6uTmlWW#NE9T}FOIvAULRpFQ++u=!(i@Pyq-f6R@BZQjTFDjy@dF%4BmtF!= zl=C_))qND?ZFxQ!ap&X1<0;I8a~i87-d`3S%@~~IGRa({_Baow*J{Ds) z=8*}gl2k$pRdbTqDt`bWA(_m$DDAD6XfoHAO-lw9-eEp|GK3!vC6u*-Y*ZX#F#M$oMt z?lPMH$_dm|EBPj4t;5@w4GkkcWgtK&*o(X(4Ohl$xj z5IM)9D6WipX3<+Fq?9zWc`J4ZQB4^{jH=Up813*zM%uDv%c7xD(*e1MWl!z+Ov`d= zI#*HRPVZUEX}aSkO!`(3Dpi^Rn~rjEUEF_>$L5HL8N(HKW=`BTX3W=Gy5iRw7`~Ej z$Vka3^_2ESg^nwEM>k3y$787KcNCPRP~Unaz5(bCJMOg9Cn^2}=Wwq4OeLZU}4jI(ClG;2B6<;!p4ioMD@(UA-( zN@YzKvBQXYRgxTyM*`X2I1wSW=pl&H2!Oof@X8Y&@9Q9xJ3_cpT6S}&l&J~<5(S4V(cN}Q3#+bZ!KGt?}WHlt&~1iDnW4OsMrbd*P;;-j}d`mwIx-umsg zJFd;7+9@bQ#tbh8JgyYt^Gxitm6wnoJjN>Xvg6aE#AW3iuv5dlng4+}Jze%GJ9QZq zf6Q1dMb1J=k(rR7p(~9iCBALhGiJ^tgS5{~ts8?wijdLXcqS#gKw8X^tnit&E>^!I z3PhP|LDGcKnA@ns2Ym6C7>B{Q{?SK2yZ6!09{r4V>$lftX6EIUkv^yZ@`LAMs?Tfg zs=1B9MTUmzty_L#SR z{k`|zdxP4&pZ)H$M>bp^b3U!iXM)ezjQqJ*Mq{RJZFHiVa~MF)4I_?{9uz`Ve%G3g zIaUyy3TbJ{$!ToN38QQ!ee|v^Ca@~5k{_uE#K^3(x{_wE2q{zG7uD?NC1E8I$7Tcw za`?=tv16=r9~4EuDxB4SvP}@J@q(9R%oB_K7qc`FM%Nc>G^RtfP2X|+fPDjoeL+LW z_3J;o_l75)cw+6^Cr%zZ^t;ctlRiT8KAJvu>~|niR<|WHfYDryWW-LAqVl4vLUOt! zY$y-&4kkdBBCud!PmD*6&xP{MGc5z0J@fc zpLq4a;K7`3ru&`>i_XR+VI;I>97$rL zi8-ed{kP_z2Q%AX+(OkQ9ukvX5nF6Ls2$w=|wP zlEf@b6zg(KM$-?-qaE2pj9OLBN>=s>@iYy{>1iAzRs+WG+c#{O#hrQcKEL6K1AT7c ze7T*sTs3778x*Yh$=E$tJ|ErIlFV!djA0B6Hw0H#d&>b!0_YVI`9Z|sd>K#;VKTWT z0O{JYquZKD9J78rtGKN=IT`9?V2YVmcgu3gh)?QOiR@j!YckG4X!22c1dN28_Tf#9 zZzH7U?(xQz-86usHrgHI(9^|zPk5GHuhQ5fW2-d;)o|025!JXngWQL?s@l2r-a~7T zyNrTdu;w2hc+Gu3nobqRR!g59jEdaq>gq7&H`HNj<^d10G2`a)l9o2S7Ncf>Bf1S2 zRIxgICWMUY1PGEqBllC*XCQ>0q->Xui6@;hGLp`CUiC5<6ghDDnxujnIVE*#-hcu7ULJZt(jA*CegqmG_OR`-GvE2mw&c$88c5id<8Q@VCre1Zve zF6da}@`$aXNPW{f;X!D>d8GAw-N(6bv1jXZ+5(!3n?SKbCbxdBi%7(g*=dGG zmTDp-x3xvLv^33#ZaNknkWi99fGHkc+s?oofP&6x;m;VnV)1|~IN7owRl`|WwJsQl zjMbhcAs@^B5FvqVJkv8O3vXOJ?Hbk}k3LGYp&xZv(;T`SzT)uV!xyK$cOpLiUl>)? zC56Woqzynw)ja$5z1)Ms_10@Y`yJ=LkB!x7Vgbq6X%n+)N*QMx>OlL(b+lG_c?bL@T#BN>t=%b$FO0zKFCUEGcPg zYC3iI-ONQQtCZy6o?KJ)?-8Za>1pGVwO0GgDh}w-(UnpD$Sg|q^Dd;-0TU}W2C^(i zraJquOL=%S;vLrDIEb{7dv{&4QjE3_L8rZXUKPc~O<>kz^CCr`eJajx-SGE!e|y)J z(b0;A)*E7i2}YK~c@Om#qD2ip@nntsbBxFsK$JnXWa3X#t#5WyNy*&_%tC5f**7%@ ze~g$~Uu^@*6oBfo$ih|qz(|b74|%Q&1GnWN_4EL6NYw%D!)LbKej3J=w$|bBY^i97 zSgG5-`R4G*i`OKk4g6npB=96L-N-~vnNQgSNC%j)UVH7EfBHF@p9q;e(}vR$$o;uY zHRgKPQ<8IlGB4n$a|j{HjK3A5c<&!`h^YGG+S=mewgAnW^Luh+P901QX(;z@LCH1- zM{M%P#vjv@1C%|4s0)8j>S#FY4dXIJ9oHcn>&_*u(prbn=qNro4wp}!ckea31mAZnDoq2X>@q~+03QsR!LV{|8@#;=<084}3)z>B!u;crYr-R%`5 zGJdme)R*tPbMop*yXkirRA3U1rlJ;$Z-1=jJJEfpn6hlE9=g?-0|~k?NI(SArP#*7)(Szy9XW-#C^%vweASdvQ|&okT6h zC9b;0$~qK2_HmtW|R8=v{pbOXWhvWW`QEJwpH|rcLWL4amcXzuEf@dVaH2Ix6Cf zx|yARo;diigKX-07@;KfAc{~8Q-zVr?)5+X?XQ3Ru(5r4dvY=nFszw8o!rcF8rFoN zq%Ss1xM_>dks1V9LJ%Ln@`r{|Z8Vi4Zg@NCgab@&YA1!*{7-ofYhaljk*UfZWft!A zGld;dM~GCjj5Fj^OGE;zJTic&6ATpcts_SbVso)4 z4nBg8*r*l*n9&-p!MS&YRuZKcH@x{bAR7~Awg+h07kv&fx{(8`lXK zX9YwA6c_W787wNEbOufXuuMQuUt^WXZ#?B==T)WeJAIA+>&i%t+yED#}>N;Rq=|l~1_=7D!dxjOJ*JRS}bcob>2q zW`e+^<6)C>^2}3DUeN2}#c3CNjb!n|Q5ptIP+hl=8i)t3D<(_|z z9C;DMJ6Y6_CrDI6L=^)!Q=RjZPSA2Lx+{X#(1 zxRwn&-`$(xaQ(0xf22gD0cRdB89k8M*+_|w!&~0Jf63m%(?-7d&Xk|t@(L4?Uw*lD z-BuWX^v)mu^2+hY<~%IO$1l~Z2p6a=!nheOJ&&{r4AEs~vL;|fj~**t9x!at7jJF$ zI+NNoe0h5@HCsz^aXUelRq+%lIyRQe>$ud=5)ZZ5Z}~&EO={KTDtXkJMpWG#Yr;1t zqdUfGZb?m3D$QI7Cn%cm&6%=<0xbh(v(&{_Rk-$Re!5FdT1jSOca?Ke+ zEsQ{TT}zs4q2!aY$iu(n;!zT?G_S&&L9yy;SHcK6WE(>P%f6a+bY-_*H{as!i}K9x zH~sW4fBDg0{_>Yse&1(jWaOMV$LBou*l|a-43tt3k7OAq4aelE23mXU5aD`;%h#`; zx1&domszRv?mZJ*hBq~_P#nZ!qE0G7k50S`=~}9U6eGGQu=d6S`GJaU%XaFCDTUHV z{k+m|6MAfbjtmq)=8#2Hgs>`4tPDOdpBpX8W7*Xa*~^Yax6N#Cd}9HpU-@qt)W>tS z^fS-={`Wtn_36`RC%aKR_Sj={*qYE|tEdN}=IEH>k&Z;zvb6D;Jw6uTywBHv{`uAG z*MEE~t35Vsc;KFishq9K`C|khDol2YAF} zo~PvldX23|DC@UT_A{!J2{~7g|hY7%gW&7s!xo5U1f-%|mWnw6DjG_497M^>f;%+}3~o=&iS| zU;phd{_yO?saihGjkRrBIULf)7#3wqf^TX_xm-y}MD<)TmS>P|axcHTS&`FvQN&kk zns%d==b&VA8yb4-SA-QNqGV)3m*Ls!=$y9f4qPe=f3{$_ zw7E?uqbnx&*lJWDv#dJTzpyl@RO@umk++J9^7egfjGwwqVjAN5kH7uu&3A8{nA##O z35`k_tg7ZTIfg+kxGGtyVzotoJSy#>Af0EW6pex~WPRd_Kzw652HO``)qO&Aw~vrvXSqN zW$&Y9_J_~E@XrOI?0@;@L!WdpRu81>i+bTeDCvagS6W!gY9x@k1QrdHjw19lx#gn- z)|ZD37?AhY=FJ&r-e!XiSuDG(Fo!Bbg_eet>MLjshue6fQuJ=s*Fse3BQRo;B~N_- z0nsg-#L|W{;)}9&*{JR~2andsn6ns#NmOOR_QPX8`}qey@sEld@zp~Qf8rtQd|=ZJ zSIDIo91?~Hu~b5q_Qxp$v*>)RM#mju{BJHdn35t~G3>Ut-nxAC>eqDI{F&P)HqufV zxFBC*s0ucyC`ju@V4@yM^FvS=R!p{zFS$@1E0uF}fi;AnWrXyW-Eae)ePCfA=A?SJ zkQB4C17^&0DR~a$``_*P$>yknHTOUCulxG4C#9=of8$9>kwYPx_|%vrJ@}B?o$su`_w(Rr%nYjpT zdIAhXSuP@8SX+xV*MhAsM{_!k*sMjALR3c^6ZLj&g7qLRscmf=v-_|sEw*H5I}@nmdCiQiGF!G@hOE<&QD6fe<`h^Is+timls zn&NJ{Z$O*+Q#4gRVPOo_<<>WQH&gX6%-kjg4N@k{gcnmK+0{eGX8h!zf9`6kM$6Xd zgAcemE`?Eq+OS27A1g~i2C*m*9VZN!XNaQ2R3Ckms$3$Ly@ZU4OmP*o{#R+)_or!&K2q0|#iYduL5LaI8Jw)i#}BX_uA z4m;E_US|_5Ohb1zbISmYM$ed$Gk5Hh4?aBSlMWe0sBO|7d+dOR@tI9xEOZH79SN&a zkrKe;j(8*O-bX*)k;yu<)rk0-LQ^4UCKnd=uNs*4MdARK(QWp+(JNo$r7EDgXnmFR zp)BBzs*Wp51#Hw+Nl`-pL>+#|Z3JMt#SDSDkQ5d$hS2wJPG+n!06*+7R3a<5*+|La zi5cI$``rI@$&MbzPv#6hFxcJm=YklKkoDvyBc91l6)*-Cy;hc&`SI1lQ#if#%oV+?&xc~G%sEH$(%Wx z9y3T73k}Z*<&MgZ6y#vW|Rl|HS85Vd|- z>0ARdRO%&nt4!Abh$|-918njK_tdE*SE~YrNmS({N^Qb-y6)9ioXUk?bK$@_e$JUxnWL^%U{qY%fJ}OiJ2Hu-WpS^) zrq%dr!t8)F#-LLDZ6W(1ontFmAxcJLRCsiC;jrm-VZF5qL{Mr_u9k30j>Mv=8C2Tm zXuOtYPN^K596-UqM3+J0kmi$Sv#i^C;Wsa2oPPJYhpooxl00l{#-)*)4y>KB_La3$ ze(kW>)!ea=qc04q0#T4rMOj5Hqc)J~#9L zo$%oc&uy&v$FFclSGh}dx$V3)cr9PVaq#5L2OWvXc1Z$cC97mKMlc!c$Xk?$gjxNA z`j^^f1InY^_}xmCe?o+jQl7Wj&ada`x>%jz$(gJ|v=cq0s9J7AZoO7^(iCS+NOTmi zI+Rk;>{2JqS(?pd%0pxE?M!z9h_Q-}CxjZJ&deDtsn0$cIO4w^SB-;dav^J|>E+T- zt~+q@;3JPLIk@Bz$5j#g>y)voLrMnbRNH}o}DR7M}`g6Dwu9oXWk}bMG2(!H}sU(8kY8^0KpROO zz_#3eSJIk09zW3Mlj}ZlTL)yMLeAQQk8IzyYkRL=_#?;6g=8mZ3rh(TGEK>7s*epgS}Vb%>Wxh12coSeMPo(od_4z1Tvg0#sR zMOEf&=vq`)Q|4(%lL6bQXT8ac8p#9DL)T%iGiNl;oROW~KI6mNf4+Img8TXE8#SXe zNtb>?<`}&8&?DP-?~a+q_i8QF#$HBgmI|4S)$Enwoh+T*q=s}RBPTi$fjxA5dqdDh z@k2};l4owLn>$g%z6}i(aACRq&Jt^L*6@lfj7 z31#IWEgGq8PcELR2d4C_nZYvC0U}+i_y4qKzR#Mk2AyQ(sT%u-euAWtAbv7HtRI6(by|{gMVq#y;w{esg z$&7Bmk+Hg%>Qs6VIdJe`;8MxCBM8}K)G%2ayDaJU_ATXckDctk$)vh+DM-_^XWolE|0NXnuS*PiNa1} z#9!};J%cZc zE@B6v4&4Y!{ai>k9T2RrJVLt0T1Y9NQG}q4lg~6ZHYME6o)rCZa}#`(N!a@;*iD)t zAydf>2~CXjr+U-D=KL%M^H^{#sY(FYbk|OBZEU>f z?IAsTQjrBkY5VIXONcJqwlBG3(9I{OoMejpphw32`wJY`6$?3qiECC+f5Q|nv?dXd zlE_phQwCXhb83Vmlas5>yc+0rk>)G`u5wL z72mIZBE1p@m&1bhc=?1*_n$ufgDV4=OlePs3`8J{WvbY!`0UlxXY--h@D}RYyu=S_lh(+c#{kh zm8q%|rgNQ2O-nOWqqJW&YYi+tz3t4z+lOw8^@a8F1ZwjpXoY+c>y z$&)XeNuCr*6o%xP5Q z$O@yPe6;EQG}=mTyRO-_cM0vwNlSL^VyRr;RYe6!)Z~R+E0NI;9jRA?TuB-92Bt}Of0@qwfDfg#C;O+dA30kz#d_rriH)sb>l}7{W}lLZiuyD4 z_T2$>M`|)SD_)QZxkK}ZWSr+q5NKn+8=BK1#^uW?a&j6OI=<3vf4cI@yPldmcW&?* z_8U4qrso)CEJoMDeL_!cVUqRew4>LsbnfUi*Ua9vchcUyyN<5JANMo1>WEN{B+r4W zq*3pK<1RF9h?x9aWJWVn-RTn%bVu8mB`_{x=aQ9Gnzd2;B(i@hU(LZ@OU!@tf-~mV=+xNr)2DO3K~6Jg?z9IqM!)gK8$WxJ z_FoGYELgK<&GfMue5(SRd5#$~#_EnSUymsb3}?#%W|QArc@)6eqpz7g`{?Z1vvp-&lf}m^(-yr9G$Pf=D@y&bxcrr0bd*E4`sKbqpxAb zoDlcUzJ@mKJ!T3R9CyeYE@2_cDKOg6(#_Jl#^s^2=iHe~%66rlwNky{&vesM%v?Xi zlmJCckhIafwyENwrsJu*J@RE|hrY1~yRP9Ig*X9d`UxOE`0lQ|o?P(Nk|kSr?G+!< zQNHyB%W&iaV;tVUlP9^jyR>hEJQihdcHdXD2-N`eA>nA$7JnnHbqO z#*mM&M<70n`|5k4GPJ3qKagvBebsBp-mQCSySD67$i(jAQPIx`^_?909stMT&?7o2uzsQFnNIbC;zw;4qMax>OSE&y=r z)~$PI?>&0-8ZPfi#VWaun&EZcea+?;X`DQFao0sGmF17D z-aQ`~Zmw`<_xuM7?N?1W-RUOjcpzlS^fA|->?JH3xY$^ZT_1U3d*m6UM@aT3=ev>= zcC5vEjs0lNmXUjfIEfr^lq5%GO}LTw0A>w7J?E8<#E)}XS)em=>)v&D{^-tiG6CFq z@2+VI#VJ7?xdwCu>9NF)f2I?y>l1znNWG)~1FyAK>JkD8B7s4H+BH-P9^0~0Z2CGD z+XGSND!>k>L`}W}qSGbW?r6;#B@RW^-S52zVNptyLYF>hZj|~^112bmvCG? zAFo_TjFnOGD|anfGHKG*tAF%M+K+y;_3Cw7zudZY*ENZJZLKld@xu6j1L~)q|3}uU zD?Uk}v5Sj|rIPnOh{y;_tXqsT0zg06gcKjm0xZ8_#eig#S%a9N(ss`Wy}nv9atV=2iI?6Eg54#_T`+sncZK}DT+^c@;kWmM2p{7DxwRwjHcS3sfG_ULkJqC%8u@(6h zK>lOF$nATPaeq-!RTf`hQHf|As^Wq1nO|`LiV0EiyL-UcqsOGHxlGzSY1iyYFiygq z2XdAi+UV+D%*{F=yIQUN^P%EkcD{cqvKH}o%>u8s(C6M z0*w{vP`c#}G7@TxP)p;aBj4u*C6BJTVzSz8RfJ-MQaa`a=YRLXnl)?;Oy7up0*v-m zBnpn!TxRaYSQ!)-llkqA^*uOa^NY)0VlSt(#NGQS<#+G)k7rYg4o0&8)ikc=wfB%|3WfQ*~6`n&=e*_qVcZp`D8_JtSP+glM= zjP>kXUynTQx*z^pV)dA~n_Y z$W7(B`x#hwgHKN)n(YWtBI?TG9^wtr#+HRpr6LN)TM-N*8+6);B1>Mi{>`JMJW`PE zMM5Gayc7#K@YLLj{EQm9r|Qxc+J9spZxf4*A-CzGmzFzR?aY6Wd##oY^d*ekc#!WGE|KkYuHrh z^~hFPF~GQTKh8vQD;{BbSXD7Fb)XUT{2@mIOJTInkpEupVdCk|jz@?+gD7`vHh*;6 zcvnV2GO@k7EG;dqU|{$_wyMO>#T-u*@UWqG1*5MCO;vXH~K zSJR0gZ(x=zbmPlQIN!xJR_&Ic^#an8$q;zNrmN|wr@Xh#j5WBzYe*oUT%qZxBk>3+ zSF}Tr9M}$DM4U19qw#EMu*hU&#lq^cn3$N|G5+xb(J@Z(6sE4tm^`E&J`>lT%XInu z4onJgnP*4S3Q;C{K;+;VAE&iosLc#|Bcp^gMC{e{RNU==v`1)TSy7Ca)V{J?Lz2FaP|zF{o$*F`2v zuIxngn5&r4(S)qPSh0T#s_p?v3lF6TX{DuF(&lyJ2iLRB=*t7dSo9i`!zYWgk76_)4V~y38X6_^CLi7Obwz}OhJY#3Nft3ox5-yk`wN1-K|Th zG62(bja78^l6xVB@a>-&($QLnrC~vy1F&PlR54U9uXlg@+YOm3dJK4LH7c%N%~x_g Sa`hccw(kxNXLrXq=l=ug74q5u diff --git a/testimages/testimgari.ppm b/testimages/testimgari.ppm deleted file mode 100644 index d7b38f2..0000000 --- a/testimages/testimgari.ppm +++ /dev/null @@ -1,4 +0,0 @@ -P6 -227 149 -255 -0/+0/+0/+10,21-32.52-63.83/83/83-83-:3-:3-:3+:3+72.72.61-61-61-61-72.72.50,50,50,50,50,50,50,50,4/+3.*3.*3.*2-)2-)2-)2-)1,(1,(1,(1,(1,(1,(1,(1,(.+$.+$/,%0-&1.'2/(2/(30)52+63,63,74-85.96/96/:70@:,A;-C=/F@2GA3IC5JC3JC3LE3LE3LC2LC2LD1ME2PE3PE3Q>/S@1c?/iE5C4†H9œE4žG6´F7µG8¿E8ÁG:ÇG<ÈH=ÊG?ËH@êCKëDLëDKëDKíCFìBEò>Añ=@÷:>ö9=ò9>ò9>ä@?â>=Ó?;Ð<8µ@,´?+´?+´?+²?,²?,°@,°@,«@,ª?+¤A,£@+œB*›A)—A(–@'‘@-?,‘>,‘>,=+=+>)>)“>*“>*“>*“>*”=)•>*–?+–?+“@8’?7™=0›?2«@.°E3¼C0½D1·?/¸@0¥H9£F7K=s?1N;*E2!95495484373262/51.40-3/,63.52-52-52-41,41,41,30++0*+0*-/*-/*./*./*1-*1-*2-*1,)3)(2('5)):..D66J<TPaTPaTPa/.*/.*0/+10,21-21-52-52-72.72.72,72,92,92,92*92*72.61-61-50,50,61-61-72.61-61-61-61-61-61-61-61-3.*3.*3.*3.*2-)2-)2-)1,(2-)2-)2-)2-)2-)2-)2-)2-)/,%/,%0-&1.'2/(2/(30)30)52+63,63,74-85.96/96/96/@:,A;-C=/E?1F@2HB4IB2IB2JC1JC1KB1JA0KC0LD1OD2OD2Q>/S@1b>.gC3~@1ƒE6˜A0šC2­?0®@1¹?2»A4ÂB7ÄD9ÈE=ÈE=ç@HèAIéBIêCJíCFíCFô@Có?Bø;?÷:>ó:?ó:?ä@?â>=Ó?;Ð<8´?+´?+´?+³>*²?,²?,¯?+¯?+ª?+ª?+¤A,£@+œB*š@(—A(–@'?,?,‘>,‘>,=+=+>)=(“>*“>*’=)’=)”=)•>*•>*–?+“@8’?7™=0œ@3¬A/°E3½D1½D1¹A1¹A1¦I:¢E6}I;q=/N;*E2!:65:6595484373051.51.40-63.52-52-52-41,41,41,30+,1+,1+.0+.0+/0+/0+2.+2.+3.+2-*4*)3)(5))9--C55H::h<;rFE‰IGMKšRU§_b l‚£o…ˆ}§‰~¨{†¼y„ºpt¤Y]VGpQBkLG^MH_MJ[PM^ZZbmmuƒˆ„“˜”˜ž’™Ÿ“˜œ‹‘€}~lijX]\JUTBUQbUQbUQb..,..,0/+0/+10,21-41,52-52-52-61+61+61+61+81)81)61-61-50,4/+4/+50,61-61-61-61-61-61-61-61-61-61-3.*3.*3.*2-)2-)2-)1,(1,(3.*3.*3.*3.*3.*3.*3.*3.*1.'1.'1.'2/(30)30)41*41*52+52+63,74-74-85.96/96/?9-@:.B<0D>2E?1F@2G?2H@3HA1HA1H?.H?.I@/JA0MA1MA1JA0LC2YB0\E3pC0tG4‰B0ŠC1—<*™>,¦<,ª@0²B4µE7¹H:ºI;Ü@CÝADáCDãEFëCCìDD÷@B÷@Bù:?ø9>ó<>ò;=âC?ß@<ËB8È?5±A-±A-°@,°@,°@,¯?+®?,®?,©@+¨?*¡A+ @*™A)˜@(•A)•A)?,?,?,>+>+>+<*<*>)>)>)>)>)‘?*”?+•@,“A5’@4›>/žA2±@0µD4ÁB3ÁB3¾D7¾D7¥K@ F;vJ=j>1I=-B6&=85<74;63:5294183062/51.63.52-32-32-21,21,21,10+,1+,1+,1+,1+.0+.0+0/+0/+3/,3/,5-+3+)4*)7-,=32A76\:0eC9{G:M@PM˜[X“hy˜m~‚y¤…|§x‚½s}¸il£SVQCtM?pLAaPEeOJaMH_LKYZYgquv„ˆ‰…Œ„‰ˆŠ‚ƒ‰{wykfhZZ[KSTDYS]YS]YS]--+--+/.*0/+0/+10,41,41,41,41,50*50*50*50*70(70(50,4/+4/+3.*3.*4/+4/+50,50,50,50,50,50,50,50,50,3.*3.*2-)2-)2-)1,(1,(1,(4/+4/+4/+4/+4/+4/+4/+4/+2/(2/(30)30)41*41*52+52+52+52+63,63,74-85.85.96/=7+>8,@:.B<0C=/D>0E=0E=0E>.E>.F=,F=,G>-H?.K?/L@0LC2MD3YB0[D2nA.qD1…>,†?-’7%“8& 6&¥;+®>0³C5¸G9ºI;Û?BÜ@CàBCáCDêBBëCCõ>@õ>@ù:?ø9>ó<>ó<>âC?Þ?;ÊA7Å<2°@,°@,¯?+¯?+¯?+®>*­>+­>+¨?*§>)¡A+Ÿ?)˜@(—?'”@(”@(?,?,>+>+>+Ž=*<*<*>)=(=(=(=(>)“>*”?+“A5“A5œ?0ŸB3²A1¶E5ÂC4ÂC4ÀF9ÀF9§MB F;uI96=85<74;63:5294173062/63.52-32-32-21,21,21,10+,1+,1+,1+,1+.0+.0+0/+0/+40-40-6.,4,*4*)6,+:0/=32W5+_=3t@3yE8„GDPMŠ_p‘fw|sž€w¢t~¹mw²beœPSŠQCtM?pLAaODdMH_ID[EDRLKY[_`imnszrw~vyqtzlln`_aSWXHSTD[U_[U_[U_,,*,,*--+..,0/+0/+10,10,30+30+30+30+4/)4/)4/)4/)4/,3.+3.+2-*2-*3.+3.+4/,4/,4/,4/,4/,4/,4/,4/,4/,2-*2-*2-*2-*1,)1,)0+(0+(4/,4/,4/,4/,4/,4/,4/,4/,30)30)30)41*41*41*52+52+41*52+52+63,74-85.85.85.<5+=6,>8,@:.A;/A;/C;.C;.C;.C;.D;,D;,E<-G>/J>0K?1FI6FI6PH5QI6aE0cG2tA,uB-‚;'ƒ<(;'•@,ŸB0¥H6­L;°O>ÎDAÏEBÖE@×FAäB?äB?ò<;ò<;ú9<ú9<ð><ï=;ÙF>ÕB:½D3¹@/­@+­@+­@,¬?+¬?+¬?+©>,©>,¤?+¤?+Ÿ@,ž?+—A*•?(’@*‘?)>+>+>+>+Ž=*Ž=*<)<)Ž=*Ž=*<+<+Ž=,Ž=,>-Ž?.”C2“B1¢>/¦B3º@3½C6Å@7Å@7¹D;ºE<OE–H>jJ?]=2<=/78*@85?74?74=52:5194074/74/43.32-23-23-03,03,03,/2+,3,,3,,3,,3,-2,-2,/1,/1,12-23.40-2.+1-*1-*50-72/M7)R<.b>.gC3oD;wLCz[j†gvwqŸ|v¤qz½js¶ab¥ST—QEƒK?}PAjPAjKAcI?aEBWGDYILUMPY]ca`fdah`_f^Y_STZNSYKSYK_WT_WT_WT++),,*,,*--+/.*0/+0/+0/+2/*2/*2/*2/*3.(3.(3.(3.(3.+2-*1,)1,)1,)1,)2-*3.+2-*2-*2-*2-*2-*2-*2-*2-*2-*2-*2-*1,)1,)0+(0+(0+(3.+3.+3.+3.+3.+3.+3.+3.+30)30)41*41*41*41*41*41*41*41*52+63,63,74-85.85.;4*;4*=7+>8,?9-?9-@8+@8+B:-B:-C:+C:+D;,F=.I=/J>0FI6FI6OG4PH5_C.aE0r?*r?*:&‚;'Ž9%’=)@.¢E3«J9®M<ÍC@ÎDAÔC>ÕD?ãA>ãA>ñ;:ñ;:ù8;ù8;ï=;î<:×D<Ò?7ºA0µ<+¬?*¬?*¬?+¬?+«>*«>*¨=+¨=+£>*£>*ž?+>*–@)•?(‘?)>(>+>+>+Ž=*Ž=*<)<)<)<)<)Œ;*Œ;*<+Ž=,>->-”C2”C2£?0§C4»A4¾D7ÆA8Å@7·B9¹D;žPF—I?jJ?\<1;<.78*@85?74>63=52:5194074/74/43.32-23-23-03,03,03,/2+,3,,3,,3,,3,-2,-2,/1,/1,01,12-51.3/,1-*1-*3.+50-J4&L6([7'`<,h=4pEgH>`H>`FCXFCX?BK7->5,>5,A9.A9.B8,C9-D:.F<0J>2K?3DE5EF6LE3MF4XC2YD3f?.f?.v=,v=,‚9(…<+“=,˜B1ŸF4¢I7»F<¼G=ÆH<ÈJ>ÙD=ÚE>ì?;ì?;ò::ñ99ç>9ç>9ÍG;ÇA5­D.§>(¦A-¦A-¦?,¦?,¦?,¥>+¤?-¤?- ?,Ÿ>+›@-™>+”?+“>*>)>)>->-Œ=,Œ=,Š=+Š=+Š=+Š=+Š=-‰<,ˆ<,ˆ<,ˆ<.‰=/Š>0‹?1’D0’D0¥?1©C5½A9ÀD<ÃB<ÂA;±JCµNG˜^S’XMgWJXH;;F87B4?80>7/>71<5/94.83-63,63,34.23-14-14-.3,.3,-4,,3+,3,,3,,3,,3,,3,,3,-2,-2,.0+02-23.12-/0+./*0/+10,<1+=2,G5'M;-V=6aHAo^p…t†ƒ€µ†ƒ¸|‚ÎtzÆno¿cd´XRšHBŠL?jI`DBXDBX2K?3BC3CD4JC1KD2VA0WB1d=,d=,t;*t;*€7&‚9(9(”>-›B0žE3¸C9¹D:ÃE9ÇI=ÙD=ÛF?îA=îA=ñ99ð88ç>9æ=8ÌF:Æ@4«B,¥<&¥@,¥@,¦?,¦?,¥>+¥>+¤?-£>, ?,Ÿ>+š?,™>+”?+“>*>)Ž=(>-Œ=,Œ=,Œ=,Š=+Š=+Š=+‰<*‰<,‰<,ˆ<,‡;+ˆ<.‰=/Š>0Š>0’D0“E1¥?1ªD6¾B:ÀD<ÃB<ÂA;·PI½VO¡g\›aVqaTbREDOA@K=>7/>7/=60<5/94.83-63,52+34.23-14-14-.3,.3,-4,,3+-4--4--4--4--4--4-.3-.3--/*/1,23.12-/0+./*/.*0/+8-'8-'C1#I7)T;4aHAsbt‹zŒŒ‰¾Ž‹À‚ˆÔyËtuÅijº[UHBŠIEO>EOGQPLVUR]UT_WS_SR^RT^SV`U`YI`YI`YI+-,+-,+-,+-,+-,+-,,,*,,*/.*.-).-).-)/,'/,'/,'/,',+),+),+)-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*,+),+)-,*-,*.-+.-+/.,/.,/.,/.,/.,/.,.-+.-+.-+.-+/+(0,)1-*2.+3/,3/,2.+2.+2.+2.+2.+3/,3/,51.62/73070*81+92,;4.<5-<5-=4-=4->5,>5,?5,@6-A7-C9/G:1H;2G?4G?4K?3L@4T>3T>3]9-]9-m9,n:-}7+€:.Œ:,>0—>0˜?1¦B3¨D5²D5·I:ÉG:ÌJ=ÝD>ßF@æA=çB>ßF@ÜC=ÀH8¹A1 D-žB+ A- A-Ÿ@,ž?+Ÿ>+Ÿ>+ž?-ž?-š=,™<+•>+”=*>+Ž=*Œ>*Œ>*Š=+‰<*‰<*‰<*‡;+‡;+…<+…<+†=.†=.…=/…=/„>2†@4‡A5ˆB6E2‘F3¦D7­K>¼E?ºC=¶G@»LE©_T°f[”wg‘tdsugik]P`SCSFOK@IE:A?3;9-85,74+44*33)34,34,14-03,-2,,1+,1+,1+-2,-2,-2,-2,-2,-2,-2,-2,02-02-02-02-12-12-12-12-2+3708=52>63D=7XQKrn}Š†•‘”–ÇŽ•ÝƒŠÒvzÃim¶_c¢W[šNKjFCb=?V=?V5,>5,?5,@6-A7-C9/F90G:1F>3G?4K?3K?3S=2S=2\8,\8,k7*l8+{5)~8,‹9+Ž<.–=/—>0¤@1¥A2¯A2²D5ÄB5ÈF9ÚA;ÜC=å@<æA=ßF@ÛB<¿G7¸@0 D-žB+ A-Ÿ@,ž?+>*ž=*ž=*ž?-ž?-™<+™<+”=*”=*>+Ž=*Œ>*‹=)‰<*‰<*‰<*ˆ;)‡;+‡;+„;*„;*…<-…<-„<.…=/„>2…?3‡A5ˆB6“H5“H5§E8­K>½F@¼E?¹JC¾OH¯eZ¶la›~n˜{kz|nprdWgZJZMOK@KG2=:196-44*11'23+12*03,/2+,1+,1+,1+,1+,1+,1+,1+,1+,1+,1+,1+,1+/1,/1,/1,/1,01,01,01,01,3,46/7;30=52G@:]VPvrŒˆ—‘”–ÇŽ•Ý„‹Ó{ÈswÀmq°hl«a^}[XwSUlTVmU]j\dqftur€u†~ˆƒ•‰|Ž‚v†yp€sfteXfW^X@_YAa[C*./*./*./*./,.-,.-,.-,.-,,*,,*-,(-,(,+',+',+'+*&+*(+*(+*(+*(+*(+*(+*(+*(,+),+),+),+),+),+),+),+),+),+),+)-,*-,*-,*-,*.-+.-+.-+.-+.-+.-+.-+.-+.-+/+(0,)1-*1-*2.+2.+1-*1-*0,)0,)0,)0,)1-*3/,40-51.80-91.:2/;30<41<41=4/=4/=4-=4->3-?4.@6-B8/E80F91H;5H;5J;4K<5O:5O:5V72V72c60d71t5,w8/†8,Š<0“;/•=1šA3šA3ŸB3¡D5®B5²F9ÃE9ÅG;ÑG=ÓI?ÏJAÌG>µJ:®C3›D0˜A-šB.™A-™A-˜@,™>,™>,š?-š?-–=-•<,‘>,=+Œ=,Œ=,‰>+‰>+ˆ=*ˆ=*‡<)‡<)…<+„;*ƒ;,ƒ;,;/;/=2=2‚?6„A8ƒC9„D:“K<’J;¡G>¦LC±KF±KF¨XO®^Užyf¦n’|y{ŒypncqbVdUMQ@JN=GI;CE7>@39;.35*/1&01)/0(/0*./)./*./*./*/0+/0+/0+/0+/0+/0+/0+/0+/0+01,01,01,01,01,01,01,01,4+<4+<320875DH:\`Ru{{‰”±‘˜µ•Ã†Ž¼}‹²|Š±|§{Œ¦|‹v…Šn€€l~~jym„|u€›Œˆ¤Ž©“§‘†žˆ€–xŽyj{hXiVYU8[W:^Z=*./*./*./*./,.-,.-,.-,.-,,*,,*-,(,+',+',+'+*&+*&+*(+*(+*(+*(*)'*)'*)'*)',+),+),+),+),+),+),+),+),+),+),+),+),+),+),+),+)-,*-,*-,*.-+.-+.-+.-+.-+/+(/+(0,)1-*1-*0,)0,)/+(/+(/+(/+(/+(0,)1-*3/,3/,80-91.:2/;30<41<41<3.<3.=4-<3,=2,>3-?5,@6-C6.D7/F93F93H92I:3N94M83T50T50a4.c60r3*v7.…7+‰;/“;/”<0™@2™@2›>/@1©=0­A4¾@4ÁC7ÎD:ÏE;ÌG>ÉD;³H8¬A1™B.—@,™A-˜@,—?+–>*˜=+˜=+™>,™>,•<,•<,=+<*Œ=,‹<+ˆ=*ˆ=*‡<)‡<)†;(†;(„;*ƒ:)‚:+‚:+€:.€:.€<1=2‚?6„A8„D:…E;“K<’J; F=¥KB°JE´NI¬\Sµe\¦n­ˆu˜š„•—„•‚yŠwlzk`n_UYHPTCKM?EG9@B5;=057,13(/0(./'-.(,-',-(-.)./*/0+./*./*./*./*./*./*./*./*/0+/0+/0+/0+/0+/0+/0+/0+5,=3*;0/-764GK=aeWyŠ‹’¯Ž•²Š’À…»¶ˆ–½ º“¤¾—¦«’¡¦Œžž‰››‚™‘–Žœˆ£””°š–²œ”¬–‹£…›†|’}j{hUfSVR5YU8\X;+/0+/0+/0+/0+/0+/0-/.-/.--+,,*,,*,,*,+',+',+',+'+++*********))))))((((((************************************************++++++,,,,,,---------.../+*/+*0,+0,+0,+/+*/+*.*)/+*/+*/+*/+*0,+1-,2.-3/.91/91/:20;31;30;30<20;1/<3.<3.=2.=2.=2,?4.B5/C60A83A83B94C:5E:6D95I81I81V80W91g7-k;1|:.€>2‹=0?2–?6–?6“@2”A3™B1œE4©E5«G7¶F:¸H<ºJ>¸H<«F:¥@4—A2•?0”B-“A,”?+“>*”=,”=,”=,•>-’<-’<-Ž=,Ž=,Š=-‰<,…<+…<+†;(†;(„;*ƒ:)‚:+‚:+:+:+~<0~<0}=3?5€A8ƒD;ƒG?„H@K@ŽJ?šGAŸLF¤QKªWQl]¦uf““w™™}‰¨ˆ‡¦†„x”{u€ojudZfPS_IJVBBN:=F58A07;-48*01)/0(.-(,+&.*'/+(1++2,,0,)0,)0,)0,)0,)0,)0,)0,)/.*/.*/.*/.*/.*/.*/.*/.*7,:4)7..$66,BO1]jLv„j†”zŒ—‘›•Œš‰—š‡ž–’©¡™»¢ Â©—¸£–·¢–º –º ´•ˆ­Žˆ­‹²‘µ‘‘µ‘¬†£„ƒœz“vg{bPdKRS4TU6VW8+/0+/0+/0+/0+/0+/0-/.-/...,--+--+--+-,(-,(-,(-,(,,,,,,+++******)))((((((*********************************))))))))))))(((******+++,,,,,,---.......*)/+*/+*/+*/+*.*)-)(-)(/+*/+*/+*/+*0,+1-,3/.3/.:20:20;31;31;30;30;1/;1/;2-;2-<1-<1-<1+=2,@3-A4.?61?61@72A83C84C84G6/G6/S5-T6.d4*h8.z8,~<0‰;.‹=0•>5”=4’?1“@2—@/™B1¥A1¦B2°@4²B6´D8³C7¨C7£>2–@1•?0“A,’@+“>*’=)“<+“<+“<+”=,‘;,‘;,Ž=,<+‰<,ˆ;+…<+„;*…:'…:'ƒ:)ƒ:)9*9*~9*~9*~<0=1~>4€@6‚C:…F=…IA‡KCŽJ?ŒH=šGA¡NH¨UO¯\V£rc®}n——{‹ªŠ‡¦†‚ž…{—~z…tp{jcoY\hRQ]IGS?BK:-;4;4?3Ž@4ŽB2C3”C0”C0ž>.¡A1¨B6©C7¢B6ž>2•?2”>1‘@+?*=+<*‘;*‘;*‘;,’<-<,<,‹<-Š;,‡;+‡;+„;*„;*ƒ:'ƒ:'‚9(‚9(9*€8)}9,}9,}=1~>2~?6€A8E=…IA†KEˆMGŒIAŒIA—IE¡SO¤]W­f`€n¨‹yŠ¢€§…€°Š|¬† ƒyš}ˆvxmfx^`rXXgPN]FHT@AM9>D6:@257,35*2/*/,'0(&1)'3)*4*+2*(2*(2*(2*(0+(0+(0+(0+(0,)0,)0,)0,)0,)0,)0,)0,)6)25(1.046!;MTf6n‚Q€”cŒ›z‘ ¢† „‹«|—·ˆžËˆ¥Ò¥Ó¬¤Ò«£Ò¨Ì¢¾°‚­~ƒ±‚…¯ˆ²„ˆ«ƒ} xz”qpŠg_sWJ^BLO2KN1JM0,03,03,01,01,01,01.0/.0//10/10//-//-//-..,/.*/.*......---,,,+++******)))))))))))))))))))))))))))******))))))((((((''''''))))))***+++,,,---.......*).*)/+*/+*.*)-)(,('+'&0,+0,+0,+0,+1-,3/.40/510:12;23;31;31;31;31;1/:0.;1/:0.;0,;0,;0,;0,>1+?2,96/96/872983983983<71<71C0)E2+U1%Z6*l4%q9*|9(~;*Ž92Ž92Œ>2?3A1A1‘@-?,›;+ž>.¥?3¦@4 @4ž>2•?2”>1?*?*=+<*:)‘;*‘;,‘;,<,Ž;+‹<-Š;,‡;+†:*„;*ƒ:)‚9&‚9&‚9(‚9(€8)€8)}9,|8+~>2~>2@7B9‚F>†JBˆMGŠOIŒIAŒIA™KG¤VR¨a[±jd¢…s­~¥ƒ¨†±‹|¬† ƒz›~ƒŠx{‚pj|bew]_nWVeNO[GFR>AG9;A379.46+30+/,'0(&0(&3)*4*+1)'1)'1)'1)'/*'/*'/*'/*'/+(/+(/+(/+(/+(/+(/+(/+(5(15(1/135 8JPb2kN~’aˆ—vœ{ŒŸƒ‹ž‚‡§x“³„˜Å‚žËˆ™Ç ™Ç ˜Ç“˜ˆ·‰~­¯€ˆ¶‡‚¬~…¯†©zuvmk…bZnRFZ>JM0IL/FI,-0'.1(.1(.1(01)01)01)01)33+33+63,52+52+41*30)2/(7/,6.+6.+5-*2-*1,)0,+/+*.,-.,---/--/+,0*+/()-()-/(//(//(//(/.)-.)-.*+.*+,+)-,*,-(,-(-.(-.(-.(-.(+-,+-,------/.,/.,2.+2.+1,&2-'5.&6/'8/&90';1(;1(;4*<5+<5+<5+=4-<3,<3,;2+;2-;2-;0,;0,;0.;0.<1/<1/F-&F-&;5);5)/:,/:,55-55-D*)C)(Q%&T()W.(^5/]@2aD6vB,xD.…@0‡B2”>1“=0“9.’8-<,‘>.ŽC0E2D/ŽC.?+Œ>*›82š71=1Ž<0‚A/@.|B.{A-ƒB0ƒB0‡>/†=.‡;-†:,„;,ƒ:+s;.zB5r?.m:)qA-qA-t<+yA0};-?1ˆD9ŒH=‡K@ˆLAPB‚QC’JK˜PQ…i[qcq‰ixpuŸ{{¥‡¦‡ˆ§ˆŽ§Š¦‰¦‡{ hžzdšvbdZ‡\X|VSwQZnRSgKQUDHL;D=5?80:..5))3'+3'+2%,2%,******,(),()0%+1&,2%,3&-4'04'03'13'1/*1/*1,+1,+1.*+0,-.-(/.);>+VYFnyW~‰gŠp‹žq‰¤oŒ§r‡¨qˆ©rŽ´{˜¾…¡¿‹Ÿ½‰—¹†‘³€‰®{…ªwƒ©z„ª{ƒ¦|‚¥{€~v“tqˆnf}c[jWL[HJR=AI4;C..1(.1(.1(/2)01)12*12*12*44,44,63,63,63,52+41*30)7/,6.+6.+5-*2-*2-*0,+0,+.,-.,---/--/+,0*+/)*.()-.'..'..'..'.-(,-(,-)*-)*-,*-,*,-(-.)-.(-.(./)./),.-,.----.../.,/.,1-*1-*2-'3.(6/'70(90':1(<2)<2)<5+<5+=6,=6,>5.=4-<3,;2+;2-;2-;0,;0,;0.;0.<1/<1/F-&G.';5);5)/:,/:,55-44,D*)D*)Q%&T()V-'[2,Z=/]@2s?)uA+ƒ>.†A1“=0“=0”:/“9.:*:*Š?,‹@-ŒA,B-A-A-š71š71=1Ž<0‚A/@.|B.{A-‚A/‚A/†=.…<-†:,†:,ƒ:+ƒ:+r:-v>1o<+m:)p@,o?+q9(s;*~<.‚@2‰E:ŒH=‡K@‡K@PB‚QCHI˜PQ‡k]tfum|”tx¢~~¨„ˆ§ˆ‰¨‰¨‹Ž§Šƒ¨‰}¢ƒj |fœxe’g^‹`\€ZX|V_sWZnRY]LPTCKD6?338,,5)-4(,3&-2%,******,(),()1&,1&,3&-4'.4'04'03'13'1/*1/*1,+1,+12./2./-,',+&8;(TWDmxVŠh„—j…˜k„Ÿj‡¢mƒ¤mƒ¤m‡­t¶}š¸„˜¶‚‘³€Œ®{…ªwƒ¨u‚¨y‚¨y‚¥{¤zœ}u’sp‡mf}c[jWL[HFN9=E07?*/2)/2)03*03*12*23+23+23+55-55-74-85.74-63,63,52+81+70*50,4/+3.*2-)1-*0,)/.,/.,......--/,,.)*,)*,/)-/)-/)-/)-.*+.*+.*).*).-).-).-)/.*./)./)/0*/0*//////..,..,/.*/.*1.)1.)4/)4/)70(81);2)<3*>4*>4*>7->7-?6-?6-?6->5,=4-<3,;2-;2-;0,:/+:/-;0.<1/<1/B1)C2*Q*+Q*+X%.W$-N',M&+@.*?-)=0'>1(P.%T2)k.-m0/h:+j<-w;0z>3‰<6‰<6‹;4Š:3†=4†=4‚@2‚@2…A4†B5ŠB6‹C7‹?/‹?/ˆ?.‡>-‡>-†=,ˆ;+ˆ;+Œ:,‹9+ˆ;+‡:*<)<)x>(x>(|>1z5F6,=-)5+&2(%/'$.&9"(9"(6#'6#'4%*5&+2),3*-,,.,,.(..(..%/0%/0"00"004.04.0.+&,)$58'QTCkvX}ˆj}’i~“j~šj‚žn~ m}Ÿl¦q†­xŠ¯y‰®x…¬w‚©t§s~¦r~¥v¦w¤{~£z}›yt’pp‡ke|`XjRJ\DFI8=@/7:)14+14+14+25,34,34,45-45-66.66.96/96/96/96/85.74-92,92,61-61-50,4/+2.+2.+0/-10.000/////1--/+,.*+-0*.0*.0*.0*./+,/+,/+*/+*/.*/.*/.*0/+/0*01+01+01+00000000.00.0/+0/+2/*2/*61+72,:3+;4,=4+>5,@6,@6,@9/@9/A8/A8/@7.?6->5.=4-<3.;2-;0,;0,;0.;0.<1/=20D3+D3+R+,R+,Y&/X%.O(-N',A/+A/+>1(>1(O-$R0'g*)i,+g9*i;,v:/z>3ˆ;5‰<6Š:3Š:3ˆ?6ˆ?6„B4„B4†B5†B5‰A5‰A5‹?/Š>.ˆ?.‡>-†=,†=,ˆ;+ˆ;+Š8*Š8*†9)†9)~;(~;(w='w='~@3v8+s;,u=.q<,s>.z@2z@2A5„D8ŠF=‹G>‰I?ŠJ@ˆNCŠPE›KL¡QR’f[˜la~f„‡ly˜vž|‚¦‚„¨„Ž§‰Ž§‰’¢‡‚‰•}…‘yf›ma–h`f_ebŒf_‰c]~aWx[NgQF_I?P@4E5/;1)5+&0($.&9"(8!'6#'6#'3$)4%*1(+2),**,**,&,,&,,#-.#-. .. ../)+1+-.+&.+&7:)QTChsUw‚dyŽezfz–f€œl|žkzœiy k~¥p¦p¤n}¤o|£n|¤p}¥q}¤u}¤u{ w{ wz˜vrnn…ie|`XjRJ\DDG65,@6,A7-B8.C9/C;0C;0C;0C;0B90@7.?6->5,=4-<3,<3.;2-;2-<3.<3.=4/?61?61P-1P-1\&3[%2Q*/P).<5-<5-29)3:*D4'E5(Y.'Z/(b:2e=5r;6v?:ƒ;<ƒ;<…;:„:9;8€<9}A9C;‚C<B;…@9„?8~D.~D.„A.ƒ@-‰<,ˆ;+Œ9+‹8*Š7)Š7)…9)„8(z=(z=(t@(s?'„6,|.$€8,†>2t4(t4(zB5|D7{E9}G;€J>K?„K@†MBŠPESHqhKulOoV„t[‡y_gŽŽr••y‡Ÿ{Š¢~ƒ©‚…«„ƒ©‚~¤}~œz{™w†nƒŠkˆiˆiz‰jx‡hr‚gn~ccoW[gOVWEJK9G=1?5)=,$:)!9%&9%&4&%4&%.)%.)%*,'*,'&,(&,()+()+(+)*+)*.(*.(*,$!2*'51&95*?D0TYEbqRm|]qŠbqŠbp‘bv—hu›js™hqœgu kw¢lu jsŸju¡lx¤sz¦uz¤vy£uxtxtw–toŽll…gc|^UlOG^AFB6>:.84(47.47.47.58/67/67/780780991991<92=:3=:3=:3=:3<92?82>71<73;62:5194084173084184165365354243121/21/5,-5,-3--3--3--3--2.+2.+3/,3/,21,21,21,32-23+23+33133134/45054/65094.94.=6.=6.?6-@7.C9/D:0E;1E;1E=2E=2E=2D<1C:1B90@7.?6-?6/>5.=4/=4/=4/=4/>50?61?61@72R/3R/3^(5^(5T-2T-2?80>7/5<,5<,F6)G7*Y.'Z/([3+]5-k4/p94~67787676|85}96y=5{?7~?8@9„?8„?8~D.~D.ƒ@-‚?,‰<,ˆ;+‹8*‹8*Š7)Š7)…9)…9)z=(z=(t@(t@(ƒ5+ƒ5+˜PD¢ZNƒC7y9-€H;I<|F:}G;I=€J>„K@‡NCŒRGVKtkNxoR‚rY†v]‰{a‘ƒit˜˜|…y‡Ÿ{‚¨„ªƒƒ©‚¥~{|šx‡Žo†nƒŒmƒŒmŽo~ny‰nv†knzbgs[cdRWXFSI=I?3E4,?.&>*+=)*7)(6('/*&/*&*,'*,'(.*(.*+-*+-*-+,-+,0*,0*,0(%:2/B>3IE:NS?]bNcrSixYk„\jƒ[iŠ[oao•dn”cl—bošetŸirgpœgržiw£ry¥ty£uv rušqušqt“qmŒjk„fb{]UlOG^AFB6=9-73'58/58/58/690780891891891::2;;3>;4>;4?<5?<5?<5>;4?:4?:4>93>93=82<71<73;62:72;83;83:72:7285074/63.7/,7/,7/,7/,50,50,50,50,41,41,52+52+33+44,44,44,43/540650761:70;81=90=90?8.?8.A9.B:/D:.F<0H<.I=/G=3G=3G=3G=3E;1D:0A8/@7.@70@70?6/?6/>71>71?82?82=82>93>;4?<5@=6@=6C<2C<2F8/F8/H8+H8+F9(G:)D<'E=(a-"d0%q0*w60…73ˆ:6‹<8‹<8‹B;‰@9>5~;2‚90ƒ:1Š;4Œ=6„@5ƒ?4†=4…<3„;2ƒ:1€<1€<1{=0{=0{=0{=0;0;0ƒ90ƒ90˜-'¥:4Íjeß|w©[QB8ƒOA€L>mN:nO;iS;4?<5@=6@=6@=6?<5A<6A<6@;5?:4>93>93=84=84<94<94<94<94;83:7296185091.91.91.91.72.72.72.72.52-52-52+52+44,44,44,55-540540761872<92=:3?;2@<3@9/@9/B:/C;0E;/F<0I=/J>0H>4H>4H>4G=3F<2D:0A8/@7.B92A81@70@70?82?82@93A:4=82>93>;4@=6A>7B?8E>4E>4G90G90I9,J:-H;*H;*F>)F>)i5*l8-{:4ƒB<’D@—IEšKG›LH›RK•LEˆE<€=4€7.8/‰:3Œ=6„@5ƒ?4†=4…<3„;2ƒ:1€<1;0{=0{=0{=0|>1€<1€<1„:1„:1”)#«@:ã€{ú—’»mc–H>M?zF8lM9mN:iS5,;2)33)22(02'/1&52+52+=.+=.+G(-G(-N%-N%-ME2YQ>c^HhcMfmNmtUj|Vk}Wj…XhƒVe‡UlŽ\n•`p—bq™dtœgqjnšgl˜go›južrw tvœuq—pr”qs•rr‘okŠhi„ca|[TnKGa>TKBKB9E<38;27:17:17:19:2:;3;<4<=5<<4<<4?<5@=6A>7B?8B?8C@9E@:E@:D?9D?9C>8C>8B=7B=7@<3@<3B;3A:2A:2A:2A:2A:2A81@70@70@70>7/>7/=6.=6.<71;60:7096/85.74-74-63,66.66.85.96/;7.=90@9/A:0B:/C;0F<0H>2K?1L@2L@0L@0MA5L@4K?3J>2G=3F<2E;1D:0B90A8/?8.?8.<8/=90=90>:1;4,LE=P?8J92Z;6T50U,&b93a0)d3,e1&a-"e,!l3(s9.u;0G8ŽF7šG9ŸL>£E;›=3=1¢B6¥M?§OA«UD­WF©M>›?09*¡=.˜58˜5845Œ01…73‰;7zA6u<1nD4kA1r<0r<0Œ22Œ22Ÿ%0#.ÏDAìa^ÄDAÔTQÝ|u´SL~I9‰TDcW=g[AbeFcfGhaDhaD}cJ‡mT¤YF·lYêbfßW[ú.Iò&Aÿ!Fÿ%Jÿ:Vÿt+2m/2k-0S&#O"M.)Q2-J3-H1+E1*F2+F.*C+'H/+O62VK+aV6da>gdAhpIu}Vr„ZoWi…UlˆXnŽ\r’`t—au˜bwšdx›eq–ms˜ot–qr”ot“sy˜x{˜|y–zy“xsrl†iiƒfg‚a`{ZSnKHc@RL@RL@QK?7:17:17:17:19:2;<4<=5=>6>>6>>6@=6A>7A>7B?8B?8C@9E@:E@:E@:D?9D?9C>8C>8C>8C?6B>5D=5D=5C<4B;3B;3B;3B92A81A81A81@91@91@91@91<71;60:7096/85.85.74-74-66.66.96/96/;7.=90A:0B;1C;0C;0F<0H>2K?1L@2L@0L@0L@4L@4K?3J>2G=3F<2E;1D:0B90B90@9/?8.=90>:1>:1?;2B;3B;3C2+F5.[<7`AÀ@=Åd]¸WPzE5‡RBocIfZ@[^?fiJslOpiL~dK„jQ³hU¹n[ßW[ÓKOö*Eõ)Dÿ$Iÿ%Jù1Mù1MàESçLZÕZ]ÔY\Í\^Ð_aÅmkÆnlÀsmÂuo¸|r¹}s²‚t²‚t´†y³…xµ~w²{t´so±pl´hh³gg²ip¤[b“UXOR|OLyLI]>9? L5/H1+F2+J6/N62O73T;7ZA=[P0dY9eb?ifCltMz‚[xŠ`t†\nŠZnŠZm[o]r•_t—at—at—ao”ks˜ow™tv˜s{šz€Ÿ‚Ÿƒ€€šx’wpŠmj„gg‚a_zYSnKIdAVPDVPDUOC6906907:18;2:;3<=5>?7?@8@@8@@8B?8B?8C@9C@9C@9C@9EB;DA:DA:DA:EA8D@7D@7D@7HA7HA7H?6G>5F>3E=2D<1D<1C;0C;0C;0C;0C:1C:1B;1B;1<8/<8/<8/;7.96/85.85.74-96-96-96-:7.<8-=9.A;/B<0C;.D.L?.M@/M@/M@/M?2M?2L>3K=2I=1G;/E;1D:0C;0C;0?;0?;0?;0?;0?<3?<3YC8M7,{*0?EÄ?PÑL]ÙWa×U_›B:D<•L;˜O>¸KFÀSNßEOÛAKŸD1B/¤>/¤>/©9+¥5'¥7(©;,¬E2¢;(›7 9"©<(­@,¶A0¹D3«.4´7=¿BHÄGM½LN·FH–A:ˆ3,{9+x6(~0&3)©.3¸=Bá@RëJ\äG@Ò5.Î:6Ä0,ÂOHÑ^WŒO=”WEugJl^AeeCqqO†mOhJ—cM£oYþT]ùOXú@Nò8Fü3Fÿ6Iÿ4Jû0Fû6J÷2Fò2Gô4Iø2Iõ/Fü-Iÿ1Mÿ7Xÿ8Yÿ;\ÿ=^ÿDcÿFeüIgýJhøIh÷Hg÷EiöDhüClÿFoÿIsÿKuÿb‚ÿZzíWråOjÓXlÙ^r¬R['0Z'$_,)Q>0Q>0:?+6;'4F.AS;YO,aW4d`=ieBouS…c}Œkw†ewiu‹grŠfrŠfvŒfxŽhzhzh€’x†˜~‹‡Ÿ‰“¡™§–š¨›—¥˜’ ‘‰—ˆyŒxpƒofa^wYSnKKfCUVFUVFUVF58/58/6907:1:;3<=5>?7@A9AA9AA9C@9C@9DA:DA:DA:DA:EB;EB;EB;EB;FB9FB9FB9FB9JC9IB8I@7H?6G?4E=2D<1D<1C;0C;0C;0C;0D;2D;2C<2C<2=90=90<8/<8/:7096/85.85.96-96-96-:7.<8->:/A;/B<0D1K=2J<1H<0G;/D:0D:0D<1C;0@<1@<1@<1A=2@=4A>5P:/I3(Š9?­\bÙTeÝXiÚXbÊHR’91“:2ŠA0ŽE4±D?»NIÙ?IÔ:D¤I6¢G4¨B3¨B3®>0¯?1°B3³E6¯H5¨A.¢>'¡=&¨;'¨;'«6%ª5$µ8>·:@¶9?µ8>³BD½LN±\U²]V‰G9|:,~0&Œ>4ÂGLÐUZâASÕ4FÙ<5Ì/(Í95Ê62»HAÌYRš]K“VDj\?tfIttRuuShJƒjL¥q[¶‚l÷MVñGPöQÿ8Nü1Gÿ?Sþ9Mö6Kõ5Jø2I÷1Hÿ1Mÿ6Rþ2Sÿ3Tû5Vü6Wö;Z÷<[ò?]ó@^óDcòCbò@dò@dø?hûBkÿEoÿGqùTtøSsñ[vìVq×\pàeyÈnwµ[dl96d1.K8*L9+=B.okHx~\ˆŽlƒ’q|‹jxŽjzly‘mwkwgxŽh”m„™r’¤Š˜ªŸ±›¢´ž¨¶¥¬º©¬º­¨¶©ž¬“¡’€“q„pd}_\uWRmJLgDVWGVWGVWG47.58/58/7:19:2<=5>?7?@8AA9AA9C@9DA:DA:DA:DA:EB;FC2G=1F=.E<-D;,D;,D:.D:.C;.D8,@:.C;.D/J?-K@.M@/M@/M@-M@-N>1N>1K=0J2??3@@4i0)p70¼DM×_hóFYê=P×6<Á &£5&¢4%Ž="?$¯>.ºI9Ú<;Õ76§C3§C3­?2¬>1´>4¹C9»G:¼H;ª?-©>,§<*¥:(¬7&°;*º:-»;.ÊG=ÊG=Õ;9Ð64Þ47ç=@èHHëKKÊA9ÐG?ÓPFÖSIàHEÙA>æ39ã06Ö6(Ù9+Í3)Ò8.º:1½=4®_PžO@uP6…`FŒgL…`E SA±dRÞgaämgô?Fï:AÞ>@à@BÖKFØMHÖOK×PLêPRãIKï;Gî:F÷2D÷2Dÿ4Hÿ:Nú]ü@aýAbþDkþDkúDmúDmøEoøEoöEqöEqÿDjÿ>dÿGjÿJmòIfóJgæ]qç^r»Zc™8A]("Z%SB2\K;IM6?C,UH5dWDrkY€ygŠŒ~˜šŒ‘›‡‘†Ž„ˆ•‹Žš‹—‰…Š†™›¥§œ³³§ºº®¿¿·ÁÁ¹ÅÁÀÇÃÂÃÁľ¼¿±³°¤¦£‹—‹y…yh|c^rYRmLNiHRZBRZBS[C47.47.47.58/891:;3;<4<=5??7@@8B?8C@9DA:EB;FC2G>/G>/F=.F=.F<0E;/D:1=90<8/<8/;60;60:8,:8,;7,<8-?9-A;/C;.D/H?0K@.LA/M@/M@/M@-M@-N>1N>1K=0J2@@4@@4p70†MFÌT]ÒZcé-ÄD7ÈH;»8.ÆC9ÞDBàFDê@Cç=@Ú::Ò22É@8ÕLDÛXN×TJ×?<Í52â/5é6<Ó3%Ü<.Ç-#Ñ7-¶6-´4+»l]ºk\\B‚]C}X=}X=©\J¿r`ÞgaÓ\V÷BIñ@Ü<>ÎC>ÑFAØQMáZVêPRãIKï;Gí9E÷2Dõ0Bü1Eÿ6Jø:Tø:Tø:Tù;Uû<[þ?^ÿCdÿEfø>eù?f÷Aj÷AjõBló@jï>jî=iÿFlý9_û?bÿJm÷NköMjä[oâYmÙxÁ`i†QKp;5M<,K:*DH1MQ:]P=reR„}k”{›¥§™§œ“’’Ÿ•›¨ž¤°¦£¯¥¡§£©Ÿ´¶«ÁøÉɽÎÎÂÒÒÊÑÑÉÓÏÎÓÏÎÎÌÏÈÆɼ¾»¯±®” ”‹kf`t[UpORmLV^FV^FV^F47.47.47.47.67/7809:2:;3==5>>6A>7B?8DA:EB;FC/E=0D1M=0L:.?;/?=1@>2??3@@4‚('¥KJÂRQ²BA¹11º22¸4(·3'¢6¥9˜?•<“?–B šA!–=œ5,ž7.¤5,£4+­81¶A:µC9²@6®B6­A5§;.£7*¯9/¹C9ÄC=Á@:À@#ÃC&Þ4%Ø.õû#$ÿ'+ÿ)-î)#ï*$ß3%à4&ß5&ß5&æ1&æ1&Ò7!Ò7!Í4&Ï6(¿90Â<3ÀbVØzn£fS’UB‘J8 YGÙ\Xßb^ùISï?IøEIñ>BÙA<Ö>9ÄA7Ã@6ÕD?ßNIùDMô?Hÿ3Gÿ3Gþ3Fü1Dó7Eøeÿ?lÿ@mÿCqÿCqûEvúDuõEvôDuõKfïE`óId÷Mh÷MhÿUpý_x÷Yrñj{ñj{Ónv»V^†B?s/,n=6NGte`‹|wŸ•“¬¢ ®®°µµ·°µ»©®´°·Áµ¼Æ¾ÀÌ¿ÁÍÄÁÌÈÅÐÖÌ×ÞÔßãØÔçÜØèÜÞæÚÜæÖàæÖàßÓÝÙÍ×ÉÄʼ·½ § Š‘Šr„nfxb[tVXqS[jMZiLZiL47.36-36-36-56.67/780891;;3<<4@=6A>7C@9EB;GD=GD=GD=GD=HE1M=0L:.>:.><0?=1??3@@465¹_^ÉYX©98±))µ--±-!³/#¨<"­A'£J( G%šF$™E#šA!–=Ÿ8/¢;2§8/¦7.¯:3¸C<¶D:±?5¨<0¨<0§;.©=0ºD:ÃMCÄC=¸71¹9ÁA$â8)á7(ý%&ý%&ÿ"&ÿ $ó.(ô/)ã7)ã7)á7(ß5&å0%å0%Ù>(Í2Ø?1Ï6(À:1Ä>5¤F:Ìnb­p]–YF›TBµn\åhdÖYUí=GòBLî;?é6:Ô<7Ô<7À=3¹6,Â1,Ç61ô?Hð;Dÿ1Eÿ4Hÿ6Iÿ4Gö:Hú>LüBWûAVú3>@5@B5BD7CE8DF9GI;FH:GH6GH6HJ5IK6LK6ML7MK3B:/D=5B;3@93?82>95=84;63:52C84C84@85@85;:8<;9<<<<<A:6920=+8E3>A&69I9XH.ÒaQºI9£8&¢7% ;'8$:#£@)ž:#¡=&¬=)­>*³:)°7&²3"²3"Ÿ8'Ÿ8'Ÿ:(¢=+¦A-©D0ªC0¨A.¨=)©>*°;)³>,ÀB3ÄF7Á=0¶2%Ì5*Í6+Ê;+Ì=-Ð<.Ñ=/á6.á6.ñ.,ñ.,ô.+õ/,å8*ä7)Ó>(Ó>(Ü:%Õ3Ì4Ï7"Ä8'À4#Ä@3ÕQDÓHAÙNGñSR÷YXýHMð;@ù4=ÿ:CàDEÞBCÏD?É>9´>2±;/¨?,©@-ÀO?ÄSCÖI@ÒE<é<>ðCEÿXÿD^ÿGkÿBfö=fó:cò>k÷CpùIxüL{ÿNzÿLxðUuíRrÜRiÜRiøWvÿf…ÿXþ?hýQwþRx¿^oÐo€c_tp«Á¥—ÎĺßÕËÚÜÛÛÝÜàÚèâÜêíÕïîÖðöÖîúÚòôâî÷åñðîïñïð÷ôïöóîôðíòîëîèèéããåßáâÜÞÕÑÒÍÉʺº¸¤¤¢‹‰{€yr|qpzo~…sy€nv}k//-00.11/3315616727827829:2:;3;=2=?4?A4AC6BD7CE8FH:FH:GH6HI7HJ5JL7LK6ML7KI:KI:KJFQPLWV^YX`UTdQP`RI:MD5H?0G>/G?2H@3F>3C;0C<4A:2?82>71=84>95<74;63=2.>3/=52>63:97<;9<<<===?@;?@;D@5EA6LA/K@.O?(O?(=?1=?1H94H94N38L16F37E26ÕJCëMLðRQùDIð;@û6?ÿ=FàDEÞBCÎC>Ç<7³=1¯9-¦=*§>+µD4¿N>ÙLCÖI@é<>ì?AÿQû=WÿB\ÿFjÿCgù@iø?h÷CpûGtûKzüL{ÿKwÿGsëPpîSsê`wícz÷VuðOnÿBkÿAjðDjì@fÂarÅduiMI–zv±•‡Í±£ÞÔÊìâØçéèçéèëåóéãñùáûúâüÿâúÿåýÿíùÿðüúøùüúûüùôûøóúöó÷óðõïïñëëîèêìæèãßàÚÖ×ÇÇŲ²°› ™Ž“Œ†…†…Ž•ƒ‰~†{--+..,/0+12-23.4505606718919:2:<1<>3>@3@B5BD7BD7IG8IG8JI7JI7LI6MJ7NK:NK:KHANKDSRX_^dgh}lm‚il‹fiˆ`XmXPeNGWG@PD>JD>JB=C?:@@<=>:;;83:72=90>:1>:.=9-74+85,:7.<90=;/><0>.K?/O?/N>.P=,P=,5?&6@';<,<=-@91>7/:51940@72C:5U31R0.m!%v*.¡/9°>H¨:) 2!2 £8&¢<&ž8"œ8!¡=&¥;%¨>(²?,´A.¼=,»<+¿:+¿:+¯>.¬;+ª9)ª9)«:*­<,­<*­<*´<+¯7&»=.ÉK<ÌG8»6'½1$Ç;.Ô4(Õ5)Ô8+Õ9,Ù9+Ú:,æ3,æ3,ô.+ô.+ò/)ñ.(á6%ß4#Ï:"Î9!à7$Ý4!Ú9'Þ=+Ò<.Ë5'Å8.Í@6Æ;4Ê?8ØD@àLHèJGäFCçB@éDBÖF>ÔD<ÉC8Ã=2³;-¯7)©:)ª;*®6(¾F8×LE×LEã?@ä@AöAHýHOòAGòAG÷CLüHQþEUù@Pú>WþB[ÿEfÿDeýDmþEnþIvÿKxþM{ýLzÿ?rÿAtýIpÿKrûZyÿ`úVqéE`øOlÿVsÐEZÑF[́…Ãw{[H:‘~p¶ŠÛ¯¤òÚÐÿéß÷ññûõõöóþðíøûêýüëþÿêþÿíÿÿóüÿöÿüüúýýûÿýøÿü÷ÿúöýøôüóôúñòúïóùîòïæçæÝÞÓÏÌÀ¼¹¬¯¦¢¥œ£—£—¢ª›œ¤•™¡’--+--+./*/0+01,23.34.45/7808919;0;=2=?2?A4@B5AC6HF7IG8JI7KJ8MJ7NK8OL;OL;KHASPI]\bnmsyz‚—‚¡}€Ÿ}uŠsk€f_o[TdSMYMGSFAGB=CC?@?;<;83961;7.<8/<8,<8,:7.;8/<90>;2><0><0=;.=;.E?1E?1J>.K?/O?/N>.P=,P=,7A(7A(<=-<=-@91?80=84=84@72C:5S1/P.,q%)37§5?­;E¦8'¤6%¥:(©>,¥?)Ÿ9#9"¡=&¤:$¨>(²?,´A.½>-½>-Â=.Ã>/´C3°?/¬;+«:*«:*¬;+¬;)¬;)³;*µ=,ÀB3ÆH9Ä?0¹4%¿3&È0Ð:,Ë>4ÑD:Á6/Á6/Í95ØD@èJGçIFå@>Ý86Ð@8Ï?7Å?4À:/²:,°8*«<+­>-«3%¹A3ÑF?ÔIBâ>?ä@AøCJÿKRï>Dï>DöBKüHQÿGWüCSû?XýAZþBcÿCdþEnÿIrÿMzÿN{þM{üKyÿ;*?<+B<$B<$I?&I?&J?+K@,JA2I@1I?5I?5S<6Q:4H92E6/<92;813=43=47=36<2J1*N5.~45CD¬:B¨6>§<*¨=+©@+«B-¨?*¤;&¥;%¨>(ª7$­:'¸;)º=+Ã9,Ä:-Ê:/Ì<1Ä@4À<0¼8,º6*º6*»7+»7*º6)½5)È@4ÏA5Æ8,Ã/%Æ2(Í6+Í6+á0(â1)á3(â4)è3*è3*ï0(ï0(õ.)õ.)ð/&ï.%Þ4#Ü2!Ì7Ê5×0Ö/Õ2!Ù6%Ö8,×9-Ó?5ØD:ÔE=Î?7Å<2ÊA7ÑMAÕQEËI<¿=0Á=.Á=.¼=,º;*´9)´9)¶<-¸>/¸8-¼<1É>9ÎC>ØBCÜFGéJNðQUì?Cì?CòCJùJQýKYùGUøBXùCYøA_úCaûFiÿLoÿNwÿOxÿMwýJtÿErÿO|ÿRyüHoõJjþSsûWoòNfäK]áHZÛ\eÿ“œÿµ¶ø˜™HBs,&«h`ՒŠóÆÁÿÝØÿðîÿù÷ÿýÿøöûú÷ÿú÷ÿþ÷ÿþ÷ÿþúûÿûüüýøýþùÿûõÿúôÿùöÿøõÿö÷ÿõöÿóõþòôüòñòèçäÜÙ×ÏÌÍÊÁÊǾÉ˽Ê̾ÅÏǼƾ¶À¸54/43.21,10+10+10+33+44,66.66.88.::0<<2>>4??3@@4IC3KE5OH6QJ8SL:SL:RL@QK?OKL[WXij~~“‹Ž·–™Â—žÒ˜ŸÓ™˜Ô“’ÎŽ‹Â‡„»€«wv¢mlŒfe…]\nUTfLKPCBG>=8:94:8,97+27127157,68-<9(?<+D>&E?'I?&I?&J?+K@,JA2I@1I?5I?5Q:4O82G81D5.96/85./90/906<217-F-&S:3ˆ>?‘GH©7?¢08§<*¨=+¨?*©@+¨?*¨?*ª@*¬B,ª7$­:'¸;)º=+Ã9,Ä:-Ê:/Ì<1ÅA5Â>2¿;/½9-¾:.¾:.½9,¼8+Á9-ÍE9ÏA5À2&Á-#Í9/Ó<1Ì5*â1)ã2*â4)ã5*è3*è3*ï0(ï0(õ.)õ.)ð/&ï.%Þ4#Ü2!Ì7Ë6Û4"Ú3!Ö3"Ö3"Ó5)Õ7+Ñ=3Ó?5èYQáRJÒI?ËB8ÊF:ÍI=ÇE8¿=0½9*½9*º;*¸9(´9)¶;+¹?0¼B3ÁA6¾>3Æ;6ÌA<ÙCDÝGHçHLëLPí@Dì?CñBIùJQþLZüJXûE[üF\÷@^ùB`úEhÿJmÿMvÿOxÿNxþKuÿKxÿKxÿLsÿLsÿVvÿ\|ùUmèD\ñXjêQcèirÿ’›ñ‘’憇°icšSM®kcЍ…꽸ÿÚÕÿðîÿöôýûÿûùþüùÿüùÿÿøÿÿøÿþúûþúûûü÷ûü÷ÿûõÿûõÿûøÿú÷ÿøùÿõöýñóüðò÷íìðæååÝÚÞÖÓÙÖÍÜÙÐÜÞÐÞàÒÙãÛÎØÐÄÎÆ::288055-33+22*22*33)33)55+66,77-99/;;1==3>>4??5KB1MD3RG5UJ8VJ:WK;TJATJAPJT]Wakk£”Ë™ ×œ¦íŸ©ðž£ôšŸð—›å“—á‘•ÕŒÐ†‰¾€ƒ¸xz¡np—ccVVrNM_HGYECPB@M<>M:<90=:1C>*D?+CA*CA*AB0BC1?E;>D:;DA;DAA;IC=KCANECP@GM@GM>HG=GFEH?;>5L9*]J;‚O>‚O>‰A2…=.§<(¨=)©>*©>*¬?*®A,±>+°=*³6$¶9'Á7*Â8+Ê6*Ë7+Ò8.Ô:0Ï:3Í81Ì70Ì70Ï81Ï81Î7.Ì5,Ô<1Õ=2Ô7.Í0'Ñ3(Ù;0Û:0Õ4*è0&è0&ì0'í1(ó.(ó.(ö,(õ+'÷.'÷.'í3'ì2&Ü7$Ú5"Ï9!Î8 Ò:%Ñ9$Ï6$Î5#Ñ5(Ó7*Ñ7-Ñ7-ãNGêUNäZPÛQGÉI>ÃC8»C5·?1µ=$µ=$¶<%µ;$¸9&¹:'À>4??5KB1MD3RG5UJ8WK;WK;TJATJAPJT]WallŽƒƒ¥–͝¤Û¢¬ó¦°÷ª¯ÿ¥ªû¢¦ðŸ£íŸ£ãœ à˜›Ð”—Ì‘“º‡‰°zz–jj†`_qWVhSQ^PN[KM\GIXDCI?>D>;2=:1A<(B=)CA*CA*AB0BC1?E;>D:;DA;DAGAOLFTSQ^\Zg\ci]dj[edZdc[^UORI_L=o\MZI„Q@‰A2ŠB3«@,«@,«@,«@,¯B-°C.°=*¬9&µ8&·:(Â8+Ã9,Ë7+Ì8,Ó9/Õ;1Î92Í81Í81Î92Ò;4Ò;4Ð90Î7.ÛC8Ñ9.Ï2)Ô7.Û=2Û=2Ú9/Ø7-è0&é1'í1(í1(ó.(ó.(ö,(õ+'÷.'÷.'í3'ì2&Ý8%Û6#Ð:"Ï9!Ï7"Ï7"Ï6$Î5#Ò6)Ô8+Ñ7-Î4*É4-âMFðf\ëaWÐPEÁA6µ=/²:,¶>%¶>%·=&¶<%¸9&¹:'À2@>2><0<:.:8,86*74+63*52)52)52)74+96-=:1@=4B?6I@/LC2RG5TI7VI8WJ9YLD[NFPHSXP[ddˆ}}¡‰“Ñ– Þšªø¡±ÿ¨´þ¨´þª´ü©³û©²÷¦¯ô§¬î¥ªìŸ¡Þ—™ÖŒÅ~·sp¥gd™\ZŒUS…YPYPVOqMFhC?N=9H<<:??=F;9B?:C@=FKAJO=XuMh…aq‹euzr‰wŽh{ƒ\o™S]™S]ªPO«QP­I:¢>/ž8"Ÿ9#©<(ª=)­>*¯@,´?-´?-¹<*¸;)½5'¾6(Ç5(É7*Ò5,Õ8/Ú7.Û8/Ø61Ú83Ú83Ù72Ù6/Ø5.Û81Ý:3çC:à<3Ù6-â?6ý[Pÿmbÿ]RãA6è0&ê2(ó0*ò/)ö)&ô'$ø(&ú*(ô/)ô/)è3(å0%Õ2#Ó0!Ñ6$Ô9'Å=%Æ>&Ê<&Ë='Ð:)Ð:)Ñ7+Ñ7+Ú@6Ð6,ÜGA÷b\äWPÍ@9Æ?9¹2,µ;#¶<$º<%º<%½:(¾;)Ã;-Å=/Æ=3ÌC9ÕPIÝXQÐQJ¿@9½@:ÈKEáGEàFDåKKëQQîRVëOSìLVîNX÷RcõPaôLeóKdúMkÿRpÿStÿQrïZwíXuõXsù\wÿ\tÿZrýXiüWhÿeqùYeý`kü_jëIVêHUüTeùQb´oh­haɏ‹ì²®õÓÑÿçåøðíýõòóþú÷ÿþõÿÿòÿü÷ýùùÿûþú÷ùõòýúóþûôÿ÷ôüôñþôòþôòõçæçÙØäÖÓßÑÎá×ÍðæÜûôâþ÷åþüçÿÿìõþûçðíÚãàB@4A?3?=1><0<:.:8,85,74+52)52)52)74+96-<90?<3A>5H?.KB1QF4SH6UH7VI8XKCYLDRJUXP[bb†zzž†Î“Û˜¨öŸ¯ý©µÿª¶ÿ­·ÿ®¸ÿ®·ü­¶û¯´ö®³õ¨ªç¡£à—˜Ð‹ŒÄ~³ur§ig™b`’`W†`W†]VxVOqNJYFBQBB@AA?;>3@C8AI>?G<9B?(¦@*¥8$¦9%¨9%©:&®9'®9'´7%´7%»3%¾6(É7*Î4í5+ì)#ì)#ù,)ý0-ü,*ø(&ö1+÷2,ì7,é4)Ù6'Õ2#Ð5#Ñ6$Ä<$Å=%É;%É;%Î8'Í7&Î4(Î4(Ó9/Ï5+Ò=7åPJãVOÚMFÉB<¶/)·=%·=%»=&º<%½:(½:(Á9+Â:,Æ=3ËB8ÓNGÜWPÑRKÂC<¾A;ÆICâHFáGEåKKìRRîRVëOSìLVíMWùTeùTeúRkúRkþQoÿSqÿRsÿRsæQnìWtú]xþa|ÿ\tüVnùTeøSdøXdôT`ú]hú]hñO\öTaÿWhòJ[«f_žYR¸~zߥ¡ëÉÇÿÞÜóëèýõòòýùöÿýôÿþòÿü÷ýùùÿûÿûøû÷ôüùòüùòþöóüôñÿõóþôò÷éèêÜÛå×ÔÞÐÍßÕËïåÛüõãÿøæþüçÿÿìõþûçðíÛäáEA5D@4C?3A=1?;/=9-;7,;7,73(73(73*84+:6-<8/?:4@;5E?1HB4NE4PG6SF5UH7WI>YK@UKSYOW_^~vu•ŠÅ™Ô”¤ïœ¬÷ª´ù«µú®¸ý°ºÿ²»ÿ²»ÿ³ºÿ²¹ÿ®²û¨¬õ ¢ì–˜âŒØ€ÌwtÁol¹j_£g\ bZ“]UŽSSwKKoCDV=>P86;?=BO?@O?@W:>`CGwRY‡bi§i˜±s¢¾w¡¼uŸÉm’ÇkÓZyÈOnÒ@UØF[ÚEKÍ8>º6)º6)±?%¯=#®;(®;(²:)³;*¸;)º=+À;,Á<-Å6(È9+Ô:0Ù?5á>5á>5â;3à91Û81Ø5.Ø3-Þ93èA9ìE=éB:ã<4â;2Û4+×5(Ù7*Ò2$Ë+Ò6'åI:õK<íC4î3,ê/(ø**ú,,û*-ù(+ë+(í-*ã5.â4-Ù5+Ö2(Ô2'Ô2'Ê9&Ê9&Ì9'Î;)Ñ:)Ñ:)Ô8+Ô8+Ð4(Ø<0Ó:4Ô;5æNMïWVÙEEÄ00À;(À;(¿:'¿:'Á9)À8(À8*¿7)Ä>2Æ@4ÎL?×UHÏSGÃG;¾D7ÂH;ØKB×JAÛNGáTMãUSßQOßNQàORðXdó[gú[mú[müVnøRjúPküRmÿBhÿKqÿWvÿWvÿWnüSjúWhþ[l÷[höZgñdlïbjÜegãlnÕrmÃ`[eYxPD–nfÀ˜Û¹·óÑÏðààÿòòôúöøþúóÿýòÿüøþüúÿþÿûýý÷ùùúòøùñú÷ðú÷ðÿ÷ôÿ÷ô÷îéíäßæÜÓÜÒÉÜÕÅìåÕü÷áÿûåÿýäÿÿæõüõéðéÞåÞHD8GC7FB6D@4B>2@<0?;0>:/:6+95*84+95,:6-<8/>93?:4D>0GA3LC2NE4RE4SF5UGVLTXNV[Zzpo|…ÀŒ•Ð‘¡ì™©ô¦°õ¨²÷«µú­·ü°¹þ°¹þ±¸ÿ±¸ÿ®²ûª®÷¤¦ðŸé–•áŒ‹×‚Ì|yÆwl°pe©g_˜aY’XX|PPtFGY>?Q:8=?=BO?@TDEdGKqTXˆcj•pw®pŸ³u¤¼uŸ¶o™¿cˆ¸\ÃJi¸?^Å3HÓAVÛFLÐ;A¿;.Ã?2¶D*­;!ª7$ª7$­5$®6%µ8&¸;)À;,Â=.ÐA3ÑB4Ù?5Ú@6ß<3Ü90Ü5-Ú3+Ò/(Ð-&Ó.(Ø3-à91â;3ß80Û4,Ü5,Ñ*!Ì*Ø6)áA3Ý=/Ð4%É-íC4óI:ÿE>ø=6÷))ñ##ö%(ý,/î.+î.+á3,ß1*Ö2(Ô0&Ò0%Ò0%Ì;(Í<)Ð=+Ò?-×@/ØA0Û?2Û?2Ñ5)èL@ãJDÎ5/ßGFòZYÞJJÕAAÂ=*Á<)À;(¿:'Â:*Á9)À8*¿7)Á;/Â<0ÈF9ÐNAËOCÃG;½C6½C6ÓF=ÒE<ÖIBÝPIÞPNÛMKÚILÜKNíUaó[gþ_qÿ`rýWoôNfõKfùOjÿIoÿNtÿRqÿNmûRiÿXoÿbsÿgxÿfsýanñdlðckÞgiÝfhËhcÃ`[ˆ`TlD8ƒ[S®†~̪¨èÆÄêÚÚÿððòøôöüøòÿüñÿûøþüûÿÿÿüþÿùûúûóùúòûøñüùòÿú÷ÿú÷ýôïöíèëáØßÕÌÜÕÅíæÖýøâÿýçÿýäÿþåóúóèïèàçàKH7JG6IF7GD5EB3C@1B>2A=1<8-<8-;7.:6-;60<71>93?:4A?2DB5JE2LG4PE1QF2VF6WG7XLLXLLXVlnl‚z‚³‹“ĐŸà˜§è§­÷¨®øª°ú¬²ü®´þ®´þ¯³ý¯³ýª®ø¨¬ö£§ñŸ£í™ç‘•ß‰×ƒ‡Ñ€Æxw½imª`d¡[a‘TZŠTQpLIh^CV^CVz-Ä?0ÇB3ÑC5ÓE7ÚC8ÙB7Û=2Ù;0Ú6-Ø4+Ù2)Ù2)Ó2(Õ4*Ù6-Û8/Ü8.Û7-Ü5,Ü5,Ò0#Ø6)Õ8)Ï2#Ê3 Ñ:'Ñ>*Ï<(Ô=,ßH7÷I@öH?ü46ó+-ô),ø-0ñ86î53Þ50Ú1,Õ0,Õ0,Ú.,Û/-è50è50å9/æ:0â<.â<.Û>/Û>/Ï7*ïWJöaZÐ;4Ï;9äPNÛFHäOQÏ<2Ë8.Ç7,Æ6+Ä:-Å;.À<-¾:+º;*»<+¿B0ÅH6ÆI7ÂE3½@.¼?-ÇG:ÆF9ÊJ?ÑQFÓRLÐOIÑMKÓOMæ[`ë`eüfrÿiuü]oïPbòLbøRhÿQrÿPqôUkñRhêakôkuøluógpüdqõ]jè`jïgqÐxvÁig—m]˜n^rmYRM9kWL‘}r½žœßÀ¾ëÕ×ÿëí÷öôûúøöÿþõþýûüþþÿÿÿûÿÿ÷ÿùÿõ÷ýóùüóûþõÿÿøÿþ÷ÿùñþ÷ïñéÞäÜÑàÛÈïê×üúáÿþåþÿàþÿàõùëìðâæêÜNK:NK:LI:JG8HE6FC4EA5D@4@<1?;0=90<8/<71=82>93?:4B@3DB5JE2LG4PE1PE1UE5WG7WKKVJJVTjkiy²Š’Ïžß–¥æ¦¬ö§­÷©¯ù«±û¬²ü«±û­±û¬°ú¨¬ö¦ªô£§ñ¡¥ïž¢ìšžè•™ã‘•ß’‘׉ˆÎ{¼sw´nt¤ioŸkh‡da€z_rv[nŽP[“U`·S[¾ZbÎRZËOWå=^æ>_ÝC[ÜBZÓBQÎ=LÌ6?È2;çFKèGLßA>Õ74Å=/ËC5¼J2¶D,ÀE5ÀE5ÄE4ÅF5ËF7ÍH9ÕG9ÖH:Õ>3Ó<1Õ7,Ó5*Ö2)×3*Û4+Ü5,Ù8.Ü;1ß<3ß<3Ü8.Ù5+Û4+Ü5,Ñ/"Ü:-Ú=.Î1"Å.Î7$Ð=)Ì9%Ï8'Ñ:)å7.î@7ÿ=?ÿ<>þ36ö+.æ-+ã*(Ô+&Ô+&Õ0,Ú51ä86æ:8ì94ì94ç;1å9/Þ8*Ü6(Ó6'Ò5&Í5(çOBÿkdÛF?È42ÖB@Ó>@êUWÖC9Ð=3È8-Æ6+Ä:-Æ,º=+ÃC6ÃC6ÈH=ÏODÒQKÐOIÑMKÓOMé^cíbgýgsÿnzÿcuôUgöPfüVlÿRsÿPqõVl÷Xnôkuüs}ôhqâV_ö^kö^kêblönx㋉Õ}{¡wgŸuermYRM9fRG„pe²“‘ݾ¼ëÕ×ýçé÷öôûúøöÿþõþýûüþþÿÿÿúÿÿ÷ÿûÿ÷øþôùüóýÿ÷ÿÿøÿþ÷ÿüôÿüôúòçíåÚéäÑôïÜþüãÿýäýþßÿÿáöúìðôæìðâQN=PM3@<3>:1>93>93?:4@;5?A6BD9IF5JG6PE/PE/UF3WH5UJDSHBTQbkhyz«‹’¼ž×•¤Ý¥¦ù¦§ú¨©üª«þ¬­ý¬­ý«®ûª­ú§«ô¥©ò¡¨ì §ë ¨éŸ§èœ¥æš£ä•žß™Ú‰•Ñ„Ì½}‰¹…£{Ÿ–i€’e|·Q_¸R`âENãFOø9@õ6=áA1áA1ÑK2ÑK2¿Q0»M,»H+¹F)áVCØM:Ü92Ø5.Û64Ý86Ø64Ó1/»<+»<+¾:+¾:+Ã7*Â6)Å3&Ä2%Î4(Î4(Ó2(Ó2(×3)Ø4*Ú6,Û7-Ü>3Û=2Û;/Ú:.Ú8-Ø6+×5(Õ3&Ô4&Ó3%Í4"Ï6$Î=(Ð?*Æ:!¾2Å:'Ã8%Ö/&ß8/ü:;ÿ?@ÿ8=ø16æ/1â+-Ô/-Õ0.Ü44á99é9<ê:=þ-2þ-2õ/.ô.-ä2(á/%Ó3#Ñ1!Å4#Ï>-økaâUKÆ84ÏA=Ê;=áRTæIDÞA<Ð92Ë4-Å8.Ç:0À>.¾<,·<*º?-»A,¹?*º;(º;(½<'¾=(¹?0¹?0¾D7ÆL?ÊPEÉODÊMGÌOIæabçbc÷gpÿpyÿhxö[köUgü[mñ`qñ`qÙknÜnq݂}拆éwwÓaaûcrÿkzöatùdw÷Ÿ¹™Š¨ˆy^pVBT:ZTFpj\§‹ŠÛ¿¾ðÖÙûáäýô÷ÿøûúþÿøüÿüûÿÿþÿÿùÿÿõÿøÿ÷ôþóöüòûÿ÷ÿÿøüýõÿüóÿÿöÿûïôðäðîÙøöáþþâýýáüýÝÿÿáýþî÷øèõöæRO>QN=PM)·8%·8%½<'¿>)²8)²8)¸>1ÁG:ÅK@ÄJ?ÅHBÈKEä_`ä_`óclþnwÿgwö[köUgü[móbsôctÚloÝor߄풍ö„„ärrÿkzÿw†õ`sçRe鏑ÿ¯±Ï¯ ±‘‚ZlRAS9WQCicU¡…„Û¿¾ñ×ÚøÞáþõøÿùüúþÿøüÿüûÿþýÿÿøÿÿôþøÿ÷òüñõûñùÿõýþöúûóþûòÿÿöÿÿóùõéöôßüúåÿÿãüüàüýÝÿÿáÿÿñüýíúûëXO@WN?VM>UL=TK/G>/H?0CC9DD:IF5KH7QI2RJ3SK4SK4UNFTMEVUgji{y}­ŠŽ¾˜Û–Ÿâª ÷©Ÿö¥ þ¥ þŸ¤ÿ¡¦ÿŸ«ÿ ¬ÿž­òœ«ðŸ©ç ªè©©ï««ñ¯¨ø®§÷ž©û™¤ö•¡Û“ŸÙ®¡½®¡½Ê~ŠµiuÕBLÕBLï7Cï7Cæ;Cæ;CÓDFÓDFâ;Cá:BÙEEÌ88ÊC?ÊC?¾/+ÚKGìFJéCGî;Aì9?ä;>ã:=Ö>;Ô<9ÌA:È=6ÈC:ÑLCÉK=»=/³8)¶;,º8*»9+Å5,Å5,Ð.)Ò0+Ü0.ß31èA1à9)Ý0 ß2"è7'ë:*à7$Ù0Î4Í3Ç5Ç5É3$Ê4%Ñ3(Ò4)Í/&Ï1(Í7)Î8*Ê9&Ê9&Ò7#Ó8$à2'ã5*ï31î20í,1ë*/é,3ë.5ö.1ó+.ë.*ì/+å7,ä6+Õ8%Ñ4!À/Ã2æYHè[JÊ<2ÝOEÄ3.ÙHCÝQP×KJÑC?Ê<8Ç7.Æ6-È9)Ê;+Ç<)Å:'¾:%½9$¹<(º=)µ>*´=)±9+´<.¸>/¹?0½?0½?0Â@2ÃA3ïk_ôpdèc\óng÷qnèb_ðjiútsÿjzÿeuéhlådhìddòjjølkølküxvÿñ]kùesÏjrÿ¤¬¡³›}w]sLF\5MQ6lpU¥•ˆÈ¸«êÕÒÿîëÿôôÿôôù÷øûùúúþÿüÿÿûÿÿúþÿçÿîáþèãúæéÿì÷ÿòøÿóýþðüýïÿüìÿûëÿúèÿøæýøâýøâûùàüúáúýöýÿùþÿúXO@XO@WN?VM>TKÇ<5Â=4ÌG>ËM?ÁC5¶;,´9*¹7)º8*Å5,Æ6-Ó1,Õ3.à42ä86å>.á:*á4$á4$å4$å4$Ý4!Ú1Ò8 Ñ7É7 Ê8!Ï9*Ï9*Ò4)Ð2'Ò4+Ó5,Ï9+Í7)Ç6#Æ5"Í2Ï4 Ý/$Þ0%é-+é-+ë*/ë*/é,3ê-4ð(+ò*-ì/+ì/+á3(à2'Ô7$Ô7$Ñ@+º)ÒE4Í@/ÕG=çYOÔC>ÔC>âVUÞRQÙKGÑC?Í=4É90Ç8(Ç8(Ç<)Å:'¿;&¿;&»>*¼?+·@,¶?+±9+³;-·=.¸>/»=.¼>/Â@2ÄB4ìh\ònbæaZðkdõolça^ðjiûutÿm}ÿk{îmqãbfä\\ëccúnmÿvuúvtÿ{yìXfó_mÍhpÿŸ§š¬”t†n]sLKa:SWUL=TKCß>CâÇC>À<7Ã83åZUâ?Bâ?Bç:>ä7;Ø88Õ55Ê;3Ë<4ÒH>Å;1»7*ÅA4ÊL=ÅG8»>,µ8&¹5&»7(È6)Ê8+×4-Ú70æ95é<8Õ5)Ö6*Û4+Ü5,Ý5*Ý5*×<*Ø=+Á6!¿4µ7!¶8"»9+»9+º4)·1&è<8ç;7Ü>2×9-É;'Æ8$Æ8 Ç9!Ð7%Î5#Ô0$Ô0$×0*Ø1+Õ2-Ô1,Ö/'Ú3+Ù9-Ø8,Î7$Ì5"Ë:%Ï>)ÑC/À2çSEÏ;-Ü?:ßB=ëHIõRSêVTçSQãPIÜIBÖC9Ï<2È9)Å6&Á8&À7%º9&º9&¶=*·>+²?-°=+¬;-®=/±=.±=.µ=-·?/½B3ÀE6Ú\Pæh\âa[îmgôpnåa_êehñloæO^ò[jëmpèjmíbeñfiÿooÿuuúrtùqséN^ñVfÏdnÿ”ž—¡‰nx`VoEMfVM>UL=SJ;RI:QH9PG8OF7OF7PG8PG8IG;JHÓCBÅA<º61Ç<7æ[Vâ?Bâ?Bé<@æ9=Ù99×77Ì=5Î?7ÎD:Â8.¸4'¿;.ÄF7ÃE6»>,¶9'»7(¾:+Ë9,Í;.Ú70Ý:3ç:6ê=9Ô4(Õ5)Ú3*Ü5,Þ6+Þ6+×<*×<*Å:%Å:%¼>(¼>(½;-¾<.Â<1Ä>3îB>ì@<ßA5Ù;/Ê<(Ç9%Ç9!É;#Ó:(Ï6$Ò."Ò."×0*Ø1+Ó0+Ñ.)×0(Ø1)Õ5)Ô4(Ì5"Ì5"Ë:%Î=(Ê<(Ì>*ñ]OÜH:Ð3.Î1,ã@AùVWÿvtÿrpÿleó`YäQGÔA7Ä5%½.Â9'À7%º9&º9&µ<)¶=*±>,¯<*¬;-­<.°<-¯;,³;+¶>.¼A2ÀE6ËMAÞ`Tâa[ñpj÷sqä`^â]`ã^aÜETìUdêloêloògj÷loÿqqÿssùqsñikäIYêO_Îcm÷Œ–‘›ƒis[RkAPi?_fEv}\²§•æÛÉÿóëÿ÷ïÿùóÿùóùþ÷ûÿùùÿû÷ÿùòüôîøð×úÜÎñÓÍêÎÎëÏÛêÓßî×ëðÜñöâöóàùöãûôâóìÚéâÏåÞËêãÐðéÖøõîú÷ðüùò\P@[O?[O?ZN>YM=YM=XLÏHD»A6¯5*ÇB;ÜWPÝCAÝCAâ?@à=>Õ@:Õ@:ÉG:ÊH;Æ+¿>+½<'¼;&Ã:(Å<*Ñ;,Ò<-Þ7.ß8/æ81è:3é77æ44ç//è00ë20ê1/Þ1+Ù,&Í0)Ð3,É91Æ6.Ä00Æ22Ñ8;Ù@Cõ47ó25â7/Ý2*È7$Æ5"À:!Â<#È=&Å:#È5#Ê7%Ñ9+Ó;-Ñ;-Ï9+ÈA.Ä=*¿:'¾9&À<'Â>)Å='Ä<&Ï>-Ë:)Ú<1àB7Ù-+å97ã/2æ25Ó61Ø;6ÞD<åKCéQFëSHåVFäUEÈ@0Å=-»>,¹<*³@.³@.¯@/®?.¨=-©>.«=,ª<+«<+®?.µA2¹E6ÅLAÛbWàc]ípjóqsâ`bå_få_fúhuÿmzìpráegìadùnqÿuyÿvzýlsñ`gêDXíG[Ö^j÷‹™™ww_XvDZxFhwN|‹b´°•æâÇÿúçÿüéûþíûþíõÿñöÿòðÿïêýéáòßÛìÙÂëÁ»äº»Þ¶½à¸Æà½ÊäÁØçÊßîÑëïØïóÜ÷òßñìÙéàÑäÛÌéÝÑîâÖñçÞñçÞòèß[O?[O?ZN>ZN>YM=YM=YM=XLRK9TM;XM7XM7XM7XM7TLAUMBVS\c`ijkŠst“y}¬‚†µƒŠ¶„‹·†‹Ã‰ŽÆ‰ŽÒ‹Ô‹ÔŒ‘ÕŽ”ЉË‚‰½{‚¶u|³ov­io­ek©ƒjŠ‚i‰µT}·Vê>få9aò6Nô8PáFDáFDÒNBÒNBßGFßGFõ:Kõ:KÞEGÙ@BÉB>ÏHD·=2®4)ÌG@ÑLEÚ@>Ø><Ý:;Ý:;ÖA;×B<ËI<ÊH;À6)Á7*¾9(½8'º9&º9&¼;&¾=(Ä;)Æ=+Ò<-Ó=.Ý6-Ý6-ã5.å70å33ã11æ..é11ð75ñ86æ93á4.Ï2+Ò5.Ë;3È80Æ22È44Ó:=ÛBEð/2ð/2à5-Ý2*É8%È7$Â<#Ä>%Ã8!Ä9"Ë8&Ï<*Ö>0ÙA3ÙC5ØB4ÏH5ÉB/À;(¾9&À<'Â>)Ä<&Â:$Ì;*Ê9(Í/$ãE:Ü0.ì@>ã/2Ü(+Ð3.Ò50Ò80Ó91Ñ9.Í5*Â3#¿0 ÌD4È@0º=+¶9'­:(­:(ª;*©:)¨=-©>.«=,«=,«<+¬=,²>/µA2ËRGßf[àc]èkeïmoåceïipônuÿmzÿp}îrtähjògjÿuxÿvzÿosúipí\cìFZêDXÓ[gïwƒ…††nlŠXm‹Yz‰`Š™p¸´™àÜÁùòßþ÷äÿÿñþÿðóÿïïþëæùåÛîÚÑâÏÉÚÇ®×­ªÓ©¬Ï§°Ó«ºÔ±½×´ÊÙ¼ÑàÃáåÎæêÓñìÙðëØìãÔæÝÎçÛÏèÜÐåÛÒäÚÑâØÏZN>ZN>YM=YM=YM=XLÌG8½?1¶8*¬6(¬6(©8*©8*«;-¬<.­>-­>-«<+ª;*¬=,­>-ÀKAØcYÝc^ælgîpsçilôqyúwòdpûmyðuxêorûntÿyÿq|ÿdoüblðV`öF]ï?V×Uaîlxª ‡ž”{z›dx™b‚•g r­±ŽÈÌ©ÝàÃçêÍçö×âñÒÓîÍËæÅÁß»¸Ö²³Íª­Ç¤˜Ä–šÅŸÊ•©Ê›«Ì¶Ï¥¼Õ«ÎÙ¹Ôß¿äãÎèçÒíáÕèÜÐåÔÍâÑÊÝÎÇÙÊÃÕÆ¿YM=YM=YM=XLUL;VMÔEAÁB9ÅF=®:-¯;.ÒTH¿A5Ë62Ä/+Ä)%È-)É<3ÎA8¾E4¹@/Â;(Ã<)À;(¿:'¾<&À>(À<'½9$Ä6"Æ8$Ó8&Õ:(ß5(ß5(å3)æ4*û04ÿ59ÿ6<ÿ4:ÿ+3ÿ&.û(.ý*0÷.4ó*0í(1ð+4û.?û.?ø":ð2ò#+ô%-ç/-æ.,Ó5*Ñ3(Ê7'Ë8(Ï7)Õ=/ã?5ä@6å=4â:1ã80ã80ÓN=ÑL;ÏG7Ç?/À7%¾5#Ä7&É<+Í5(Ð8+çB<Ý82à00Ïî79é24Ó2(Ó2(Ñ3(Ñ3(Í5(Í5(Æ7)Å6(ßZK×RCÇI;½?1³=/²<.¯>0°?1«;-¬<.®?.­>-«<+ª;*ª;*ª;*°;1ÏZPÛa\êpkôvyëmpôqyõrzÿv‚ÿ|ˆø}€énqôgmÿsyÿq|ÿitø^hîT^÷G^î>UÔR^égs®¤‹©Ÿ† iz›d‚•gŠo¢¦ƒ´¸•ÈË®ÕØ»È׸Áб¯Ê©¥ÀŸœº–—µ‘–°”®‹‰µ€‰µ€º…–ÁŒ Á’¡Â“«Äš±Ê Á̬ÈÓ³ÚÙÄáàËêÞÒäØÌßÎÇÙÈÁÑ»̽¶Æ·°ZMYM?ZMÝ?>ó=<üFEö=;õ<:í==î>>èBFéCGäCIãBHÈC<Ä?8·A5´>2­>-­>-ÁC7ÍOCÊ5/Ñ<6Î1,Î1,ÑD:Ê=3°7&¸?.¼5!À9%Ã<(Á:&À9%À9%Å:%Æ;&Î9%Ï:&×5&Ô2#Ú-Þ1#ì6+ô>3ô90ó8/ø1*õ.'ü(%û'$ý%&ý%&ü%*ø!&ü ,ÿ'3ÿ%;ÿ!7ÿ4ÿ1ù)6ð -ã$+ç(/Ü./×)*Õ,)Ü30è21ê43õ34õ34÷/1ô,.ò*,ð(*Ø;2Ô7.Ô70îQJ¼"Ä*"áD=Ê-&Ì-'Ü=7çD=ß<5Ö/)Ö/)á6/æ;4Ø@2Ô<.Ì6(É3%É7*Í;.È-°:.¹C7Ö\Wêpkðswôw{úx‚óq{ÿz„þuîwyîwyÿs{ÿs{ÿhwÿdsÿ^míL[øB[÷AZÐJUã]h©›€¥—|} fx›a~”c‚˜g”Ÿuœ§}©ƒ›§¦~‰¢z}¡sxœnvœkxžm¡o‚¤r¯q…³u‹¹{½”½ƒ–¿…œ¿‰ÀŠ¦»’ª¿–¾Â©Ë϶ÝÓÇÝÓÇÛÈÄÒ¿»Ç¹¸¾°¯·©¨YL;YL;YL;YL;YL;YL;YL;YL;WJ9XK:XK:XK:YL;YL;YL;ZMYM?ZM=ð:9õ?>õ<:ô;9í==î>>èBFèBFá@Fß>DÂ=6¿:3²<0°:.©:)«<+¿A5ÊL@ÚE?ØC=Ô72Ò50ÐC9ÎA7µ<+®5$¾7#Á:&Ä=)Ã<(Ã<(Ã<(Æ;&Æ;&Î9%Ì7#Ô2#Ö4%â5'ç:,ï9.ï9.ê/&ê/&ò+$ò+$ü(%þ*'ÿ*+ÿ,-þ',ú#(ý!-ÿ&2ÿ#9ÿ3ÿ0ÿ.ð -û+8ò3:è)0×)*Ü./Û2/×.+ð:9ï98ö45ô23÷/1÷/1ù13û35Ò5,Ù<3Õ81âE>àF>Ë1)Ï2+À#Ó4.Þ?9çD=à=6Ù2,Ø1+à5.â70Ò:,Ï7)Ë5'Ê4&Ê8+Í;.Èõ;>û7Aü8BëBGè?DÏECËA?»=1¸:.¬;+«:*¨9(©:)¾>1ÉI<ÜA<Õ:5Ú64Ý97ÙE;áMCÊK:³4#À9&À9&Â;(Å>+É>+È=*Ë:)Ê9(Ò6'Î2#Ö.!Ý5(î<2ò@6ñ91ê2*Ö9&Ö9&Þ4#Ý3"ç/%ç/%ë.(ì/)ì/-è+)í(1ð+4ù&9ô!4ú3ù2í*8ò/=î6@ï7Aë:DíÅJ;ÅJ;ÙB9ÚC:õ;>ö<½?3¸:.¬;+«:*©:)ª;*½=0ÆF9Ö;6Ð50ß;9åA?ÛG=èTJØYH»<+Á:'¾7$¾7$Ã<)É>+È=*Ë:)Ë:)Ï3$Î2#Ù1$á9,ñ?5ñ?5í5-å-%×:'Ö9&ß5$Þ4#ç/%æ.$é,&é,&è+)æ)'ë&/ð+4ù&9ö#6ÿ9ÿ <ü9Gé&4å-7ÿLVÿ^hÿOYó>Gò=Fì(4î*6õ,6ø/9ö/4ò+0è('ã#"Õ0,Ú51Õ0.æA?ÿqpøTSÞ<:èFDÛ<8Ú;7Ö92Ô70Ñ7+Ð6*Í4&É0"¼5!¼5!¾6&Á9)À;,¿:+Â9/Ä;1ãYOØNDÈ80Â2*Ò=6ØC<Ö=5×>6â?8ã@9ßB9Ý@7ÑB4Í>0Á=.¾:+¶:.¸<0ÊOHßd]ëoqø|~ÿƒŠü}„üvûu~ò{ó|€ÿs}ÿoyÿ`qþ[l÷TeëHYô_O?_O@`PAdLZgO]bTngYsjdwqx¤~w£š|ž¦ˆªÌ‡œÊ…šçr…álèTjÙE[û?MþBPéMPâFIËH@ÈE=ÑC?ÔFBí@FîAGö>Hø@JæGKáBFÅF@¿@:ºB4µ=/«<+ª;*©:'©:'¾8-Æ@5æB@à<:î@?í?>Ü:5éGBåYLÖJ=ÆA0½8'º2"¿7'È;*È;*Í7)Î8*Ð0$Ô4(â5.è;4ð93í60ë.*ç*&ß0-à1.è00ê22ò16ô38ó4;ô5<ç-8ç-8æ0?é3Bï.Ií,Gø,Oÿ3Vî@Jã5?ëALÿ^iÿjwÿXeõDTóBRë5Dê4Cæ7>æ7>Ø=8Ô94Â9)½4$Ç4*Â/%Ì91î[Só^ZîYUØC?ÞIEÙD@Ñ<8Ë7-Ë7-Ì:+Ì:+È7$Å4!®<$­;#°;'´?+µ;,²8)»8.Â?5ÜMEÖG?Ñ4/Î1,ä;4è?8ç60ç60ó-.ô./í4/í4/á90ß7.Î:,Ì8*¼6*¼6*ÈIBÞ_Xênlù}{ÿ†ˆûùs|út}ð|ñ}€ÿrþmzÿ`sþ[nôQdìI\ó=T÷AXØW\ÎMRlgAe`:Vr?ZvCfzIkNtVw„YwŠ]yŒ_t–dw™gv¡i{¦n«n€¬o„ªm„ªmˆ¬oŠ®qŠ²s‹³t†µo‡¶p†¸sˆºuŽ¶zˆ°tŽ£x’§|ª¬”¹»£ÍÁµÑŹ¶ºÅ§«¶™¨ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8YJ7ZK8ZK8ZK8[L9[L9[L9\M:]J;^K<]L:]L:]N;]N;]N9^O:ZM:[N;[N;\O<_O?`P@`PA`PAcKYdLZ^PjbTnf`Œsm™zsŸyrž‘s•£…§Î‰žÌ‡œæq„Ýh{äPf×CYó7Eû?MêNQâFIÉF>ÆC;ÑC?ÔFBì?Eí@Fõ=Gö>HäEIß@DÃD>¾?9¸@2²:,¨9(¨9(¨9&©:'½7,Ã=2ëGEåA?ê<;ä65Ö4/á?:é]Pôh[×RAÆA0½5%¿7'Ç:)Æ9(Ì6(Ï9+Ñ1%×7+æ92è;4ê3-æ/)é,(ë.*è96è96ï77ð88ö5:õ49ó4;ò3:í3>î4?í7Fî8Gò1Lð/Jþ2Uÿ;^å7AüNXÿ_jÿ]hÿUbúP]õDTê9Iõ?Ní7Fß07Ú+2Ì1,Í2-Â9)Á8(É6,Ã0&ÜIAüiaßJFäOKÏ:6Ð;7àKGÕ@<Ë7-Ë7-Í;,Í;,Ë:'É8%°>&­;#¯:&²=)²8)®4%»8.ÈE;ÕF>ÔE=Ó61Ò50å<5æ=6å4.å4.ñ+,ò,-ë2-ì3.â:1á90Ò>0Ñ=/½7+º4(ÂC<×XQåigø|zÿ†ˆü€‚ùs|ûu~ñ}€ñ}€ÿp}ûjwÿ^qýZmòObïL_õ?VøBYÛZ_ÊINc^8b]7YuB`|In‚Qs‡Vz‡\~‹`’eƒ–i{k}Ÿmz¥m|§o~ªm«nƒ©lƒ©l‡«n‰­pˆ°qˆ°q„³m„³m„¶q†¸s‹³w†®rŽ£x•ª±³›ÂĬØÌÀÝÑÅ¿Ãέ±¼¡¬ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8YJ7ZK8ZK8ZK8[L9[L9[L9\M:]J9^K:^K:^K:^M;^M;]N9^O:^O:^O:_P9`Q:aQ:aQ:aQ:`P9iKMjLNaO_eScfc€tqŽ{w’yu”u„¤…”Õƒ‡Õƒ‡ûlnôegÿMQò?Cÿ(Cÿ1Lú?Põ:KÚ?EÙ>DÔBEÓADÞBFÞBFá@FâAG×EFÓABÂA<¾=8´>0®8*¦9%¨;'¬;)®=+Ä:/Ê@5ä::â88æ/1ä-/Ý52ß74ãOCÿk_îiZ×RCÆoçJSþajÿitôXcëJZíL\éDUØ3DäBOÙ7D¿10·)(£6"§:&™F&šG'¸?,µ<)Ù[MÜ^PÊG=ÈE;¾71Ã<6àUNÑF?È:.Æ8,È;)Ç:(Ç9#É;%§A(£=$¥<'§>)©8(¦5%¼<3ÎNEÖE@×FAÜ73Ø3/í62ì51î-&ò1*ÿ(,ÿ(,û--û--ì5-ì5-Ý=1Ý=1Ç;.¿3&½=2ÏODßb^öyuÿ‡‡ÿƒƒþxÿy‚ó‚ð|þm|÷fuýZoùVkîK^îK^ñ>Tó@VÖX[ÁCFZX/_]4ZuBdLv‡Z}Ža„e†‘g†™lŠp„¦t„¦t}¨p|§o}©j}©j‚©jƒªkˆ§l‰¨m†­n†­n±j€²kµk„¸n‡´sƒ°o§x•¯€²¸œÂȬÕξÙÒ¶ÂÒ£¯¿‘­YJ7YJ7YJ7YJ7YJ7YJ7YJ7YJ7YJ7ZK8ZK8ZK8[L9[L9[L9\M:]J9^K:^K:^K:^M;^M;]N9^O:`Q<`QDÔBCÑ?@Á@;½<7´>0®8*§:&ª=)±@.´C1Ê@5ÐF;Ý33à66ã,.æ/1ã;8Ö.+Ê6*éUIÿzkã^OÍC6Ç=0Ê;-Ç8*Í5*Ó;0Ú7.Û8/ä50ã4/é0-ê1.ò53õ86ÿ";ÿ";ÿ!<ÿ!<ÿ:ÿ8ù9ø8é:ë<é&Hì)Kì%Pï(Sÿ1bÿ@qÿený`iôXcîR]ñP`íL\ã>OÕ0AÝ;HÓ1>½/.¸*)¤7#§:&–C#•B"¯6#²9&ÓUG¹;-Â?5¹6,¹2,ÊC=ãXQÓHAÇ9-Ä6*Ä7%Â5#Ã5Ç9#§A(¡;"£:%¥<'§6&¦5%À@7ÕULÙHCÚIDß:6Ø3/ê3/é2.î-&õ4-ÿ(,ÿ'+ø**÷))ç0(æ/'×7+×7+Ì@3¿3&¹9.ÈH=Ù\Xóvrÿˆˆÿ††ÿ{„ÿ|…õ„ð|ükzôcrùVköShèEXëH[î;QïIäBMíCNé?Jé;Dé;Dä;@â9>Ú<;Ù;:Ï?6Ì<3Ã;/¿7+ :$ªD.¬;)©8&Ã?3ÊF:Ò;4Î70Ú70Ú70Û7+Ú6*Û:&Ü;'Ù;"Õ7ß82öOIòZOÛC8Å8'Ë>-ÓB1Î=,Õ0*íHBå,1ï6;÷5@ð.9ÿARí(9û%'ÿ*,ÿ*,ö "ù%$þ*)ü*)ñî"%ú.1ê",î&0î.=ã#2ÿXlç*>ÿ]hþ\gÿW`ýS\÷NQïFIÜA<Ó83ÄB2ÄB2°C.¥8#—4™6!9)ž:*¨71ª93ÄDA¼<9À00Å55Ç31ÖB@ÛLFÙJDÑD:Æ9/Å2(Ç4*Ì4)Ë3(¸<0³7+²,!­'¸* Å7-ÔA7ÙF<æODÜE:Û7.Ö2)é-+î20ÿ.1ÿ.1ò12ñ01ó/0ó/0ð0+ð0+ã7+â6*Ñ?0Â0!º@1·=.Ò_XæslÿŽ÷…„û†Œú…‹ÿr„ÿfxÿ[tÿZsùWnñOfôEbê;Xë>Zé^S?]R>]P?\O>`N@aOAcPBcPBnJLnJLdR`n\jlpz~›ˆ¯„´¡•¹›³µ{‘³yâtwê|ÿpe÷g\ø\gìP[èFQëITõKVñGRí?Hê(¦@*©8&¬;)Ã?3Â>2Ì5.Ô=6Ö3,Ö3,Ø4(Ø4(Ø7#Ú9%Ú<#Ù;"Ü5/èA;æNCáI>Í@/Å8'Ê9(Ï>-Þ93ñLFè/4ð7<ø6Añ/:ÿ>Oë&7ø"$ù#%ý')ÿ)+þ*)û'&ú('ü*)ð$'ñ%(í%/ÿ9CÙ(ñ1@û>RÝ 4ÿhsÿ`kÿW`þT]÷NQêADØ=8×<7»9)ÃA1·J5«>)•2Ž+)Ž*,&­<6ÒROÉIFÄ44Å55Ð<:êVTÖGAÕF@ÎA7Å8.Å2(È5+Ï7,Ï7,¼@4¹=1¼6+¼6+Ä6,É;1ÔA7ÚG=áJ?ÙB7Ú6-×3*ê.,î20þ-0þ-0ò12ñ01ó/0ó/0ð0+ð0+ã7+â6*Ò@1Â0!¸>/¶<-Ñ^Wévoÿ÷…„ù„Šøƒ‰ÿoþewÿZsÿYrùWnòPgòC`ì=ZîA]ïB^·W[“37HK.UX;Vx;e‡Jr–Yw›^vžby¡e|¥i}¦j|¥i{¤hz¤ey£d{¢c{¢c}¡a}¡ax£kz¥m|¨i}©j|¬b|¬b~¯`€±b‚°g„²i‡¯s…­qŠ©Ž­ƒ¨ˆ‹¤„uƒ„`noP^_\K7\K7\K7\K7\K7\K7\K7\K7]L8]L8]L8]L8]L8]L8]L8]L8]L8_N:`Q>`Q>[P>ZO=YPAZQBZRGZRGZOKZOK]OO_QQcSVeUXeTZgV\c]wmgov­{‚¹‚ˆÒ†ŒÖšŽÖ˜ŒÔ¯€®¯€®Õ~ŽÜ…•í~uæwnþcgñVZìHOëGNöHQõGPòAIî=Eä7;ã6:Ø:7Ø:7Ê@5È>3½@.º=+ª?-¨=+ª9)µD4ÅI=¹=1º1'Ä;1Ë7-Ì8.Ó7*Ô8+Ø7%Ø7%Û9$Ý;&Ý4/Ü3.ÞB6êNBÛH8Ç4$É2!×@/å=4òJAê01ð67ù5?ö2<ÿBNô0<ë)*æ$%æ$$ô22ñ//ë))è('ó32ç+,õ9:â-2Þ).å5?ÿR\ê>JÿZfø_bïVYîMRîMRëEGß9;Ô95Ø=9À6,Å;1½A5·;/®5,ª1(¥*%Ÿ$š%¦1*ÈD@À<8½++Å33×A@ô^]Ð@8ÒB:ÐB8Ê<2Í9/Ò>4Ü?6Ý@7á=<Þ:9ä:;è>?è<<ä88æ>;ïGDâA9Ü;3Ù5,×3*æ0,ê40õ20ô1/ó12ò01õ/0õ/0ñ0+ñ0+ä6+ã5*ÓA2Ä2#´:+µ;,Í\Tëzrÿ’‘ù‡†ý€ˆú}…ÿn~øeuÿZrþXpÿOkúIeô?^ñ<[ãKbèPg’HE~41JM0Y\?[z?h‡Lp”Wt˜[s›_wŸcy¢fz£gy£dx¢cw¡bw¡bxŸ`y a{Ÿa{Ÿay¢fz£gz§d{¨ey©]zª^|­\~¯^„²g‡µj‹±t†¬o…¥v€ qx’onˆeRa\@OJ2A<]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8\K7^M9_P=`Q>[P>ZO=XO@YPAXPE[SH_TPbWSgYYi[[l\_n^ap_esbhpj„ysw~µˆ¿…‹Õ‰Ù’†Î˜ŒÔ¶‡µ°¯ÊsƒÎw‡ë|sðxÿmqþcgøT[ñMTõGPòDMð?Gí,§<*ª?-¯>.¹H8ÍQEÅI=½4*¹0&Ë7-Í9/Ö:-Ù=0Û:(Ø7%Ù7"Ü:%Ý4/Ú1,Ü@4êNBàM=Ï<,Ï8'ÛD3ß7.êB9é/0í34õ1;ù5?ÿJVÿFRÿ=>ó12ä""ï--í++ó11ê*)î.-ô89Õç27à+0ç7AòBLÿVböJVÕ4ÖB8ßB9ßB9ä@?à<;æ<=ëABê>>ä88ç?<õMJÛ:2Ø7/Ø4+Ø4+ç1-ê40ô1/ó0.ó12ò01õ/0õ/0ñ0+ñ0+ä6+ã5*ÔB3Æ4%°6'³9*ÇVNî}uÿ’‘úˆ‡ü‡ø{ƒþk{öcsýWoùSkûJföEañ<[ó>]åMdéQh52z0-OR5_bE_~CiˆMp”Ws—Zq™]vžbx¡ex¡ev av auŸ`uŸ`wž_xŸ`{Ÿa{Ÿax¡ez£gz§dz§dx¨\y©]z«Z|­\„²g‡µjŒ²uˆ®q…¥v}nsjg^Q`[BQL7FA]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]L0^M1_O6_O6ZN>YM=VOGWPHUPT\W[f_omfvog~og~pfqg‚im†mqŠov¤u|ªx€É‡Ð…‰äˆŒç˜ŒÞ˜ŒÞ¢„¶”v¨ lx¤p|ºxh¿}möoi÷pjþhg÷a`úQTñHKï<@é6:æ68å57Ù:6Ù:6ËA4Ê@3»B/¸?,­7+µ?3¯;.°×45Ö34ÿehÛ?BÆ-0È/2¾('Ñ;:áACØ8:Ú14à7:Û89Ï,-É32Ð:9ÒFEÞRQî_c÷hløbmðZeÁB;ÅF?ç\YõjgÿonÿkjäJH×=;Ç4,Ð=5ÕE:ÓC8Õ>3Ô=2Ú91×6.û/;ö*6÷)6ø*7ó*4ò)3ó9:ÿHIÞ3,Ý2+Ø4*Ù5+â4+ä6-î3.î3.ö/2õ.1ø-0ø-0ô.+ô.+æ5+å4*Ô@2Ê6(¯4%³8)¿NFí|tÿ‘û‰ˆÿzŠÿsƒ÷jzðcsøTlñMeÿ<`ý9]ñ:Y÷@_ÊXbÆT^_8)c<-VY>ehMbIl‰Sq’Yt•\s™^xžcy¡cx btž^tž^u^u^wž_xŸ`{Ÿa| bx¢bz¤dz¨`z¨`y¨Zy¨Z{ªY|«Z«^ƒ¯b‡®m„«j‡¥sƒ¡oz•lp‹bdueZk[QbR^O:^O:^O:^O:^O:^O:^O:^O:]N9]N9]N9]N9]N9]N9]N9]N9^M1_N2_O6^N5ZN>ZN>YRJ[TL^Y]gbftm}{t„}uŒ{sŠzp‹yoŠpttx‘u|ªy€®yÊ}…΃‡â‡‹æ˜ŒÞ•‰Û ‚´ž€²³‹®z†¨fV•SCÌE?ÕNHèRQìVU÷NQòILð=Aç48è8:ç79Û<8Û<8ÍC6ËA4¼C0¹@-°:.·A5ª6)¢.!¼J?Øf[ÙcWÊTH»;.µ5(Â3%Ë<.Û;-×7)Þ4'á7*Þ/*å61ß=2Ü:/Û?0áE6ãC3Ú:*á0(ç6.ò21î.-ì)-ó04ÿAIÿOWÿ]_ÿY[ã68ä79×++öJJä88Û//Û32Î&%Ê'(ùVWÚ>AÖ:=Ñ8;¹ #Á+*Õ?>ãCE×79Õ,/Ú14Ô12Ë()Ë54áKJðdcöjiôeiñbfö`k÷alÏPIÏPIç\YãXUæNMàHGÍ31Í31ÕB:ÞKCáQFÛK@ØA6Ó<1Ö5-Ó2*ú.:ù-9ø*7õ'4ò)3ø/9ù?@ÿHIÝ2+Ý2+Ù5+Ù5+â4+ä6-î3.ï4/ö/2õ.1ø-0ø-0ô.+ô.+æ5+å4*Ó?1Í9+®3$²7(¶E=êyqÿŽüŠ‰ÿw‡üoôgwîaqöRjíIaü8\û7[ò;ZùBaÆT^²@J^7(d=.X[@ehMbIkˆRq’Yt•\u›`xžcx bu_rœ\rœ\s›\s›\uœ]wž_zž`{Ÿax¢bz¤dy§_y§_x§Yx§Yy¨W{ªY}©\­`…¬k„«j‰§uˆ¦tƒžu{–mu†vnogxh^O<^O<^O<^O<^O<^O<^O<^O<]N;]N;]N;]N;]N;]N;]N;]N;`O1aP2_P;^O:XOFZQH[V]_Zahf|qo…yyŸ~~¤}{¬yw¨wt©wt©ox³s|·w½z‚À€„Á„ˆÅŽÀ•“ŝ“µ –¸®£¸§­É°œÀ§“§‹fŠnIŸD/¡F1±C4¶H9ÖIBàSLîHHçAAê<=é;<ã;:ã;:Ø?7Ö=5É=0Æ:-º:1¾>5®5,©0'·K>ÎbUÐiZÎgXÁP@²A1¹3'À:.Ö8-Ô6+à2+ä6/à2+ã5.Þ8,Þ8,à>/åC4å>.Û4$é3(è2'ô20ñ/-î.-ò21ð67ù?@îOS÷X\åFJñRVÕ49èGLÚ:<ãCEÕ78Ì./Ì24âHJÏ9:Î89¶$%Ð>?à88ä<<ë=?æ8:à-3Ü)/ß28è;AêNRú^bÿmsÿjp÷_kòZf÷YhøZiòe^è[TìTQ×?<Ï0-Ó41Ò3/áB>âKBèQHèTJßKAÛ>5×:1Û60Û60ú*7ÿ0=ÿ/<ü*7û-7ÿ8BÿDEýABÞ3,Þ3,Ü5,Ü5,á3*ã5,î3,ð5.÷/2ö.1ù-0ù-0õ.+õ.+ç5+æ4*Ó=/Ò<.±3%´6(±<5étmý‰‰ý‰‰ÿpƒþgzïbrì_oøPjïGaÿ5\ÿ6]ìB_òHe¥[Z76ME.ME.WW=aaG`zJiƒSrŽ[w“`wš`{ždwŸ`rš[o™Wo™Wp™WqšXr›Yt[wž_xŸ`w \y¢^y¤\y¤\v¥Uu¤Tw¦Ux§V}©\­`†ªj„¨h†¤p…£o€šmx’ep„hkcey]_P=_P=_P=_P=_P=_P=_P=_P=^O<^O<^O<^O<^O<^O<^O<^O?ê<=å=<ä<;Ù@8Ö=5Ê>1Æ:-»;2¾>5´;2·>5½QDÅYLÅ^OÍfWÔcS¿N>¾8,À:.Õ7,Ó5*ß1*ä6/ä6/á3,Ý7+ã=1åC4äB3á:*Û4$ê4)ä.#ñ/-ò0.ó32õ54è./ê01áBFõVZôUYÿosåDIéHMß?Aü\^ÿopÜ>?ÿ}ÿnpèRSÔ>?Ä23Ð>?óKKç??ê<>ðBDì9?â/5îAGÿ]cÿptÿlpúekô_eö^júbnü^möXgí`YÞQJáIFÐ85Ð1.Õ63Ð1-Ø95ÜE<áJAßKAÕA7Ò5,Ò5,Ü71ß:4ñ!.ý-:ÿ0=û)6ü.8ÿ:Dü@Aï34ß4-à5.Ý6-Ü5,á3*â4+î3,ñ6/÷/2ö.1ù-0ù-0õ.+õ.+ç5+æ4*Ò<.Ó=/±3%³5'¬70æqjû‡‡þŠŠÿk~ùbuì_oê]møPjïGaÿ6]ÿ8_îDaôJg¢XWr('PH1KC,TT:[[A]wGgQpŒYv’_wš`zcu^p˜Yl–Tl–Tn—Uo˜Vp™Wr›Yuœ]v^vŸ[w \w¢Zw¢Zt£Ss¢Ru¤Sv¥Tx¤W|¨[€¤d}¡a}›gy—crŒ_h‚U_sW\pTVjNYL;[N=^Q@^Q@]P?\O>]P?^Q@_RA\O>ZM<[N=^Q@`SB_RA^Q@cT?_P;\PD^RFWQUZTXb`vrp†tw x{¤}€·‚¹{¿uy¹or·lo´tuÑxyՂƒÄŠ‹Ì›˜³¦£¾·±£¿¹«ÎǛÔÍ¡ÚњÚњÜљÜљØ͗ÑƐͪŒ©†hœ`H¼€hÔtf®N@ÖQLìgbéIIà@@â89ã9:ã99Þ44Ú51Ü73É83Ä3.ÅB:½:2»K?ÇWKµO@ËeVÏdTÅZJÆF9½=0Î4*Ò8.â5/á4.Þ1-Þ1-Þ7.ã<3à<0Ú6*Þ4%â8)æ.$ç/%ì/)î1+ë4.ë4.ã6/ã6/Ñ8:äKMóX\êOS×8=Õ6;øW_ÿ~†ÿyÿksÿdkÿgnÿfiõ\_ðZ\ö`bÿRWÿCHû8@ú7?ö2>ï+7ç1=ñ;G÷V^ÿ`hÿipýfmúclûdmþalú]híRMßD?Ù53Ö20Ù0-×.+×2.Ý84ÞD:ÜB8×?4Ô<1Ù80Ù80â62ã73î7;î7;ð69ñ7:ñ78ï56æ40ã1-Û4+Ü5,Ý7+Ý7+æ1(ç2)ò1,ô3.÷03ö/2ù.1ù.1ö/,ö/,ê5,é4+ÛC6Ð8+»9,±/"·<7ÒWRÿ–˜ù}ÿh€ÿc{õ]rëShõFcôEbÿ=bû9^ãUkÛMcqI=R*7@%@I.MK4^\EWlAbwLo‰Yx’bw–]u”[p—Vp—Vl•Ql•Qm–Ro˜TqšXr›Yt›\uœ]rœTsUt Uu¡Vv¢Uu¡Tt SsŸRz¤Zy£Yy]s—WmŠTbIWqBQk<]P?`SBaTC`SB^Q@fWBaR=\PDaUI`Z^f`dmkxvŒvy¢z}¦}€·z}´quµlp°lo´nq¶uvÒ{|؉ŠË•–ש¦Á·´ÏÊĶÒ̾ÜÕ©àÙ­æݦåÜ¥åÚ¢ãØ ÜћÔɓڷ™¾›}³w_Njs×wiµUGßZUöqlöVVéIIæ<=ç=>é??å;;Ý84Û62Ï>9È72ÅB:¹6.°@4¼L@°J;Ã]NÚo_ÎcSÇG:¶6)È.$Ð6,à3-Û.(á40å84ä=4â;2Û7+Ù5)ß5&à6'í5+ì4*í0*ì/)ç0*ç0*à3,à3,Ñ8:×>@äIMòW[û\aû\aý\dÿ`hïOWëKSíPWû^eÿjmÿgjò\^éSUð16ì-2ð-5ò/7ì(4ä ,ß)5ì6BôS[ü[cüelýfmýfoüenù\gðS^áFAÙ>9Ù53Ú64ß63Û2/Ø3/Ú51Ú@6Ø>4Õ=2Ó;0Ù80Û:2ä84æ:6í6:ì59ï58ï58ð67î45å3/á/+Û4+Ü5,Ý7+Ý7+æ1(ç2)ñ0+ô3.÷03ö/2ù.1ù.1ö/,ö/,ê5,é4+ÙA4Õ=0½;.µ3&³83Ö[Vÿ‘òvxÿbzý]uñYnìTiöGdòC`ý;`þdÿ9`ü4[ÖNbßWk“aZvD=WQ;_YCQO:KI4QI6JB/CQ0M[:ZlBgyOk†OmˆQiŒHh‹GeEfFg‘Ih’Jj“Ol•Qm•Vm•VršTp˜Rm•Oj’LeŽHb‹E`‰E_ˆDZBV}>St=No8Pj:Qk;WnBYpDSp:Sp:Tq;PD4SG7WK;YM=YM=ZN>]QA^RB^RB_SC`TD_SC^RB^RBaUEcWG]Vfleuxt~z“zy¡yx sx¯sx¯iq²bj«[c«\d¬go¸u}ƀˆÐ…Õš›Û¢£ã±²à¼½ëÉÈØÎÍÝÖÓÊÙÖÍÝ׿ÜÖ¾ØйÒʳÏóƺª¶© §š‘ˆ‹‚wzq{tjtmc†iaŒog—^UšaXÈmhÔyt÷|wø}xÿnmúdcöRQìHGïD=é>7Ü>5àB9Ë=3ÑC9ÙWJÀ>1´6'¹;,Â=.Ä?0ÐA1ÔE5×>0Ð7)Ð21êLKú_[òWSáD;×:1Ü8.Ý9/æ8/æ8/å81ä70Ø:/Õ7,Ç9+Å7)°(¹1!É?4ÒH=ÔC@Ì;8Ì5:Ð9>Ó9CãISðV`óYcõ^eö_féTXÖAEí;9ï=;÷?AþFHÿKRÿOVÿT]ÿU^Þ39Ù.4Ú03ã9<ò>Aò>Aõ47ñ03è71ë:4ð95ì51é2.ê3/ã4/â3.à=4ß<3Û=2Ú<1á81á81è51è51ã;8â:7ç:6ç:6é:5ç83ß7.Û3*Ú8+Û9,Ý:+Û8)æ1&æ1&ñ.(ó0*î53í42ó11ó11ó0,ó0,ê5,é4+Ý<2Ü;1Ê:2À0(ÎBCûopújsóclìRjèNfþ:`ü8^ÿ8_ÿ;bÚRfÛSgMFr@9VP:]WAUS>NL7OG4KC0?M,GU4Rd:_qGe€Ij…NgŠFgŠFdŽDdŽDeGg‘Ii’Nj“Ok“Tl”Uo—Qm•Oj’LgIb‹E`‰C^‡C^‡C[‚CX@Vw@RsNB2QE5TH8WK;XL6êC;Ö<2ÞD:ê\PÇ9-Ã;-¾6(¾6&Æ>.ÐC1ÐC1ÓB/ÔC0Ð79Ö=?ÚEAØC?Õ<6Ñ82Ø5.Û81å:2å:2â;3á:2×@5×@5ËF5ÌG6«/¸<"ÌK6ÎM8Ä>5·1(¿02É:<ÕDKßNUêW_î[cï^eëZaÝNRÏ@DÐ3*Ô7.à;7æA=ñCEóEGòAGî=Cä39á06é05ï6;þ37ú/3ÿ*/ÿ-2ë4.ï82ò72ë0+ç+)ê.,ä3-ã2,á=3á=3Þ=3Þ=3ä92ä92ë52ë52í57ì46ï34ð45ï64í42â4-Þ0)Û7+Ü8,Ý:+Ü9*ã3&ã3&ì0%î2'ì63ë52ð31ð31ò1,ò1,ê5,é4+à=4Õ2)Ð;5Ç2,çUXÿps÷alïYdâJaäLcÿ6`ÿ1[ÿ4aÿ;hÉVc¼IVV?/]F6SN8TO9\O>UH7LA/MB0;H*AN0J\4WiA^yBfJeˆDf‰EbŠAc‹BcEeGfKh‘Mi‘Rj’Sl“Pj‘NgŽKd‹HaŠH_ˆF^†G^†G_…J\‚G^|H\zF]wH^xIbwLdyNXu?Xu?Yv@L@0OC3SG7UI9WK;XL<[O?]QAcWGcWGcWGaUE`TDcWGi]MocSuryv“vvœss™qs¦su¨jo¯af¦Ya©]e­em¶lt½u}Ňϋ”Ù“œá›¤Å ©Ê¦®Ò«³×°´Ù°´Ù³³Ù´´Úµ¯Ó³­Ñ°§Æª¡À«ž¸¦™³™‹¢‹}”}x~e`fkbcbYZlZVvd`zUMŠe]ŒLB˜XNÀ^UÐneöuoÿ€zÿwsÿmiÿZTÿOIìE=óLDÜB8ßE;æXL¹+»3%½5'Æ>.ÎF6Ë>,À3!È7$ØG4ÝDFÒ9;È3/Ë62Ó:4Õ<6Ý:3à=6æ;3ã80Ý6.Ù2*Í6+Í6+Â=,Ã>-ÑU;ÄH.½<'½<'Â<3Á;2Ã46Â35ÝLSÞMTâOWçT\éX_çV]ÜMQÓDHÏ2)Ò5,Ú51Ú51à24á35â17á06ç6<æ5;ð7<ô;@þ37ø-1ÿ).ÿ/4ê3-ð93ó83ì1,è,*ë/-æ5/å4.à<2à<2ß>4ß>4æ;4æ;4í74í74ë35ë35î23ï34í42ë20à2+Ý/(Ü8,Ü8,Ý:+Ü9*ã3&ã3&ì0%î2'ì63ë52ð31ð31ò1,ò1,ê5,é4+á>5Ð-$Ô?9Ê5/ödgÿqtò\gçQ\àH_æNeÿ9cÿ1[ÿ4aÿ;hÁN[ª7DH1!]F6RM7NI3\O>VI8I>,NC18E'=J,EW/Rdc~Gc†BeˆD`ˆ?a‰@a‹CcEdIfKgPgPj‘NhLeŒIcŠG`‰G_ˆF_‡H_‡H\‚G[F_}I^|H`zKa{Lf{Pg|Q[xB[xB\yC?C5BF8IF=KH?RH?TJA\L<_O?`R8`R8\T?^VA^ZWfb_jiwqp~uo›zt {w©zv¨op©gh¡`a¤]^¡_a®eg´qoÃ{yͅØŽŠá—‘뜖ð ŸÙ ŸÙ¤ Û¥¡Ü¥¡Ü¥¡Ü¤ŸÙ¤ŸÙ¤œÕ¢šÓ ™ÍŸ˜Ì•Æ–Ž¿‹ƒ²‚z©mqtdhkc_\a]ZoXRnWQ„RG‰WLœND¨ZP¸WN¼[RÔmdã|sî†}ø‡ðxwòzyça`ØRQØDBîZXÌ8.Æ2(Ä7&Ã6%À7$À7$Å8&É<*Ð=-Ò?/Ó7(×;,×@/Ó<+Í6%Ì5$Ù9+áA3à:.ß9-Ú8+Ø6)Ë:'Ë:'ÁA(ÃC*Ã:2Ç>6ÌC;ÏF>ÌC;Ä;3¹3*³-$Ã=4ÍG>×QHÝWNá[RßYPÕOFÊD;Í#Þ7'Þ7'ï+-í)+ø$3ù%4ÿ(?ÿ(?ÿ(@ÿ(@ÿ$Aÿ$Aÿ"Aÿ"Aÿ7ÿ :ÿ&;ÿ%:ï+5ï+5ã77ç;;Û94Û94Ü;3Ý<4å:3ä92è62è62ì23ì23é62é62ã80á6.Ù7*×5(Ú;(Ú;(Û:&Û:&ß9#ß9#â7#â7#ì3.í4/ï4+ð5,í5)í5)ä9(ã8'Ú<0Õ7+Ò:7Ö>;ÿkyÿbpúRkñIbúKlé:[ü7bÿ=hçFgìKlšVWe!"83 ?:'HE2PM:LK6DC.0I+3L.EHHK JR-U]8ZjEdtOcNePa†Cb‡DaŠeDgFl‘Nm’Oi’FgDeFc‹DeŠGd‰Fc…HaƒFdƒJbHbEbEd€Fd€FcDa}BX}8[€;^ƒ>;?1>B4FC:HEZJ:]M=_Q7_Q7\T?_WB_[Xgc`lkyqp~sm™uo›tp¢plžfg `aš\] \] ce²ik¸trÆ}{υØŒˆß“ç—‘똗љ˜Òœ˜Ó™Ô™Ôœ˜Óœ—Ñ›–Н•Î›“Ìš“Ç™’ƘÁ‘‰º†~­~v¥lpscgjb^[`\YnWQmVPƒQF‡UJ¡SI¬^TºYP¼[RÎg^Ùrißwnè€wý…„ÿ‡†útsìfeæRPíYWÇ3)Â.$Ä7&Ä7&À7$À7$Å8&Ç:(Î;+Ð=-Ô8)Ô8)Ò;*Ñ:)Ñ:)Ð9(×7)×7)à:.ß9-Û9,Ù7*Ì;(Ê9&½=$¼<#¾5-Á80Å<4È?7É@8Ç>6Â<3À:1»5,Ä>5ÏI@ÕOFØRIÕOFÉC:¾8/Ê9Íÿ=ÿ<ÿ5ÿ7ÿ$9ÿ%:ò.8ò.8å99ç;;Û94Û94Ü;3Ý<4å:3ä92è62è62ì23ì23é62é62ã80á6.Ù7*×5(Ù:'Ù:'Ú9%Ú9%Þ8"Þ8"á6"á6"ê1,ë2-í2)î3*ì4(ë3'â7&â7&Û=1Ò4(Î63íURÿesû]kðHaöNgôEfðAbø3^ý8cïNoâAb‚>?g#$<7$<7$=:'C@-CB-@?*/H*3L.@CMP%Zb=goJfvQhxScNeP`…Ba†C`‰;b‹=eDgFkMl‘Nj“Gh‘EeFdŒEf‹HeŠGd†Ib„GdƒJc‚IbEbEd€FeGcDb~C\<_„?b‡B4:,7=/??7BB:JA:MD=TH:WK=[P<[P.Ñ>.Î6(Ç/!Ù9-Ø8,Õ7+Õ7+Î;+Ì9)À9%¾7#¾4)¿5*Á7,Ä:/Ç=2É?4ËA6ÌB7Å;0Ê@5ÎD9ÐF;ÑG<ÑG<Ê@5Á7,Ð5!Ó8$â4+ä6-ô-2ô-2ü)8ý*9û(;ú':ù%;ø$:ù!8ø 7û4ú3ÿ4ÿ5ù%4ý)8ñ4;ó6=å;;ä::Û94Û94Ý:3Þ;4å:3ä92é62é62í34í34é54é54ã81á6/Ø6)×5(Ù9)Ù9)Ù:%Ù:%Û9$Û9$Þ7$Þ7$Ý5(Þ6)à6'á7(Þ9&Þ9&Ù:'Ø9&×?2Ê2%Ò8:ÿlnÿ[møQcî<\þLlý6]ÿ>eé;^ì>aÑ`t®=QQ+*R,+59*26'47"9<'@?#?>"<@?C">HWa/pT}Œat‰^i~S`~JaK_„?`…@`‰;cŒ>eDgFkOkOk“Ji‘HhGgŒFgŒIf‹HfˆKd†Ie„Ic‚Gc€Fc€Fd‚FeƒGd€CcB`ˆBbŠDeG06(39+;;3>>6G>7KB;RF8UI;XM9YN:XQA^WGa_bigjlmop„ol—jg’`^XV‡STWX‘[^¡ad§ko¹qu¿z{ˁ‚Ò‡…؉‡ÚŒˆÜ‰ÝŽŽÊŽŽÊŽŒËŽŒËŠÍ‹ˆËŒ‡ÊŒ‡ÊŒ†Æ‹…ō†¼Ž‡½Ž‡³ˆ­yŸwq—aiwYad[Vd[V_^L]\JvRByUEªOJ¸]XÔXXÖZZàfcåkhØsißzpë|uë|uÿ‚|ÿ‡ÿ€yõjcÉ=0Ä8+Â;(Á:'½;%½;%Á8%Â9&Ç8'È9(Ø:.Ô6*Í5'Ï7)Ð=-Ð=-Í5'Ç/!Ô4(Ô4(Ò4(Ó5)Í:*Í:*Ä=)Ã<(Ã9.Ã9.Ã9.Ã9.Ä:/Æ<1Ç=2È>3ÐF;ÐF;ÌB7Ç=2È>3ÌB7ËA6È>3Ð5!Ó8$ã5,å7.ô-2ô-2û(7ü)8ù&9ù&9ù%;ù%;ü$;ý%<ÿ#:ÿ#:ÿ6ÿ6ú&5þ*9ó6=ô7>ä::à66Û94Û94Ý:3Þ;4å:3ä92é62é62î45î45ê65ê65ã81á6/Ø6)×5(Ø8(Ø8(Ø9$Ø9$Ú8#Ú8#Ý6#Ý6#Ü4'Ü4'ß5&à6'Ý8%Ý8%Ù:'Ø9&Ó;.Ì4'äJLÿrtýVhïHZð>^øFfü5\ÿ9`ïAdôFiÂQe–%9F Q+*/3$15&8;&>A,A@$>=!=A CG&S]+r|Jžs˜§|‚—llV^|H_}I^ƒ>a†Ab‹=fAhGj’IlPlPl”Kj’IhGgŒFgŒIgŒIg‰LfˆKe„IdƒHdGdGf„Hf„Hf‚Ed€CdŒFfŽHj’L,4'/7*692:=6A>9DA,È<-È<-É;-É;-Ç9+Æ8*Æ7)Å6(Ï@2ÐA3Ï=0Ê8+Ë7+Ï;/Í9-É5)Ô-%Ø1)è00ë33ö-7ö-7ú+;ú+;ù/?ù/?ö0=÷1>ü0<ý1=ÿ/<ÿ/<û+9ù)7ò-7õ0:í9<ì8;Þ97Ù42Û94Û94Þ93ß:4æ95å84é54é54ñ35ò46í76ì65ã81á6/Ø6+×5*Ô8)Ô8)Ô9'Ô9'×8%×8%Ø7#Ø7#Ñ:%Ñ:%Ï=$Ð>%Ð@(Ð@(Í?+Í?+Î70Ô=6ÿ[eÿ`jÿLjò;Yÿ@jù6`ÿ5_þ-WØVnÛYq|KQX'-9/.<21-0)36/7A)9C+9=:>RIbY.t‰N¤i¦¾Š¦¾ŠŠ¦uo‹Z_€G^F]…>`ˆAeŽ@i’Dl”Km•Lo“Sn’Ro•Ll’IhGgŒFgŒIhJi‹NhŠMd†Jc…IdƒGdƒGf†Gg‡Hg…EeƒCfŽGi‘Jl”M*2%-5(4707:3=:5@=8G@6JC9NH:NH:NKBVSJ]]geeoef‚ef‚a`Œ[Z†PR…MO‚PT“[_žei²lp¹sxÉw|Í‚Óƒ†×…†Ö…†Öˆ‡Ó‰ˆÔ†‡Ç…†Æ„„ʃƒÉƒ€Ïƒ€Ï…€Ò…€Ò…΋ƒÌŒ„½Œ„½‹…©„~¢yv‹qnƒ‹R[…LUfYPh[RTfLRdJiYBk[D E@²WRÜOWÞQYä\`éaeÛkgãsoç{oßsgö{sîskþxmã]RÃ;+½5%¿='¿='¾>%¿?&Ä;(Ä;(Ê9(Ê9(Ø4*Ú6,Ó;-Ð8*Å:'Ä9&Æ;(É>+Ï<,Ó@0ÚA3Ö=/Î8)Ê4%Æ9'Ê=+Æ:+Ç;,É;-É;-È:,Ç9+Æ7)Å6(Æ7)Ë<.Ñ?2Ñ?2Ó?3Ò>2Ë7+Ã/#Ò+#Ö/'è00ì44ù0:ù0:ý.>þ/?ú0@ú0@ö0=õ/<ù-9ù-9ü*7ü*7ÿ/=þ.<ö1;ö1;ê69é58Û64Ù42Û94Û94Þ93ß:4æ95å84é54é54ò46ó57î87í76ä92á6/Ø6+×5*Ó7(Ó7(Ó8&Ó8&Ö7$Ö7$×6"×6"Ï8#Ð9$Î<#Ï=$Ï?'Ï?'Í?+Í?+Î70ãLEÿfpøR\ÿHfñ:XÿBlõ2\ÿ6`ý,VÖTlÍKcf5;S"(C98<2125.5814>&1;#37?Ci`5ˆT›°uª¿„µÍ™®Æ’’®}w“bd…L`H]…>a‰BgBl•Go—Np˜Oq•Uo“So•Lk‘HgŒFf‹Ef‹HhJi‹Ni‹Ne‡Kc…IdƒGe„Hg‡HhˆIh†Fg…EhIj’Km•N%0"(3%/4-16/664997?<7B?:HE0Ø?1Ü@3Ü@3×9-Ï1%ß--ä22ð39ó6<ú2?ù1>ö0?ö0?í/9í/9ê17é06ë.2ë.2ï+/ï+/ó6<ô7=ï8<í6:ã77á55Ú72Ú72Ü94Ü94à85á96ç77æ66é56é56ó49ó49ï77î66ä84á51Õ7,Ó5*Ï9*Ï9*Í:(Í:(Ï9(Ï9(Ð9&Ð9&Æ:!Ç;"Ä>#Æ@%ÃA)ÄB*Ê>/Ê>/×79÷WYÿ[qþH^ÿ;6FC:FC:FGBOPKWYf^`m\`}Z^{]^ŽZ[‹WX‘\]–df°qs½x}Ñ|Õ„߁†áƒ‡à‚†ßƒÖÔ€‚ρƒÐ„ˆÈƒ‡Ç‚„΁ƒÍ„€Ô†‚Öˆ‚؉ƒÙŒ„ÏŠ‚͉‚µ‡€³„€—{wŽpnsgejSP{OLeYIi]M[hLYfJg`DhaE‰J;›\MÅQQÆRRÜTXàX\â[_ëdhîujépeõpgÊE<ÐB6Á3'Ä5$ÒC2Ã;%Ã;%Å='Æ>(Î;)Î;)Õ7+Õ7+Ï,#Ñ.%Ë7)Î:,Ä?,Â=*½:&º7#¿3"ÏC2äN@äN@×A3Í7)Ê8)Ï=.È;)Ç:(Ç8'Å6%È7&É8'Ë8(Í:*Ò:,Ó;-Ò9+Ï6(Ô8+Ù=0Û=1×9-é77í;;÷:@÷:@û3@÷/<ò,;ð*9ì.8í/9ê17ë28ï26ð37ö26ö26ò5;ô7=ð9=í6:á55ß33Û83Þ;6Ü94Ü94à85á96ç77æ66é56é56ó49ô5:ï77î66ä84á51Õ7,Ó5*Î8)Î8)Ì9'Ì9'Î8'Î8'Ï8%Ï8%Ä8Å9 Â#Â@(Â@(È<-È<-Ü<>ÿ`bÿPfÿKaú6\ÿ>d÷.\ÿ9gè;WûNj™PWm$+=<7CB=>8<=7;E24D139=&?C,DX'_sB‘™]²º~­Ë‹ªÈˆ¤ÃŠ›º‹¬wx™de‰LY}@Z‚;_‡@fAl•Gp˜Op˜On•Tl“Rm“JjGf‹Ed‰CeŠGgŒIhŒNhŒNe‡Jd†Ic†Fd‡GgŠFh‹Gg‹EfŠDi”Lk–Nn™Q(0!'/ (-&).'.0-1306729:5<>3?A6CF?ILEOR[UXaY[r\^uYX„[Z†]^—dežkmºvxÅ~܃„ቋ酅傂ØՂÏƒ‚Ѐ„À„ÃɃƒÉ…‚φƒÐŠ„Ί„Ή½ˆ€¼ˆ£„}Ÿz‚vowkg^c_Ve`Ld_Ke_Ie_If^Gg_Hj^Dk_EoO6zZA¦]N±hYÖVSÔTQôOVþY`øiaçXPÚA9Ï6.Ö5+Ú9/Ù<-×:+Ï8%Ð9&Ï:&Ï:&×7)×7)Þ3+ß4,Ê0$Ì2&È;*Ê=,ÃB-Á@+¾=(»:%Ã7&½1 êVHßK=Á/ Ï=.Ë>-Å8'È;)È;)Ç8'Æ7&È5%È5%Ë3%Ì4&Ò6)×;.Ý=1Ü<0Ú6,Ú6,ä=4ëD;ù@Eñ8=ñ2:ó4<õ3>ð.9è.9ì2=æ9=ã6:ß76à87è;7ê=9ð95î73ë=<ê<;ç;9å97à85ß74Ü73Ü73Ý84Þ95ä88æ::é9;é9;ì8;ì8;ô5:ô5:î87î87ä=7á:4Ò:/Ï7,Æ9(Æ9(Ã:(Ä;)Ã<)Ã<)Ä;)Ä;)¿9 Ä>%º<#³5¹;%ÅG1Î>6Ã3+ÿZgÿVcÿGdü;Xò2Wñ1Vñ8aø?hÌgm«FLX=2M2'8D8:F:H46A-/T+/U,0?; IE*Qs7zœ`”¼s È©ÈŒ¼€—µ“±{žnfƒSVw>Xy@];b†@hŽAm“Fl”Kk“Ji’Pi’PhGeŠDa†Aa†Ad‰Ff‹HfŠJdˆHg‹Kg‹KgŒIeŠGc‹DdŒEhGk“Jm›PnœQpžS(0!(0!(-&).'-/,02/450783;=2=?4AD=GJCLOXSV_VXoY[rZY…]\ˆab›jk¤rtÁ}̅†ãŠ‹èŠŒð‰‹ïˆˆè„„䀀Ö}}Ӏ́€Î‚†Åƒ‡Æ††ÌˆˆÎ‰†Ó‰†Ó‹…ÏŠ„Έ€¼†~º„}Ÿ~w™{t|rkshd[b^Ud_Kd_Kd^Hd^Hf^Gf^Gj^Dk_E{[B{[BœSD¥\MÑQNÕURöQXýX_çXPÝNF×>6Ñ80Ø7-Ú9/Ø;,Ö9*Ï8%Ð9&Ï:&Ï:&×7)×7)Þ3+ß4,Ë1%Ì2&Æ9(É<+ÂA,Á@+¾=(»:%Ã7&È<+äPBÜH:Ç5&Ë9*Ç:)Â5$Ê=+É<*Ê;*É:)Ì9)Ë8(Î6(Î6(Ò6)Ô8+Ø8,Õ5)Ô0&Ö2(Þ7.ã<3úAFñ8=î/7î/7ñ/:ð.9ê0;í3>ã6:Þ15Ú21á98ñD@÷JFûD@õ>:ç98æ87ä86ã75à85à85Þ95Þ95Ý84Þ95å99æ::é9;é9;ì8;ì8;ó49ò38í76í76â;5à93Ñ9.Í5*Æ9(Æ9(Ã:(Ã:(Â;(Â;(Ã:(Ã:(¿9 Ä>%¸:!³5¹;%¼>(É91ÑA9ÿZgÿQ^ÿ?\ø7Tõ5Z÷7\õ/?C4EI:KMJQSPUUaWWc\Zr`^vedŒpo—yy¹„„Ä‹‹áæŽìŽëŠŠä„„ށ~Í~{Ê~€҆ˆÃŠŠÆ‹‹ÇŠÃ‹ˆÁ‹„·Šƒ¶Š€£…{žv†zoujfod`j^PfZLUeJUeJc^Hc^HqWFrXGsZDt[Ez`EtZ?ŠP8•[CÏSIÖZPÿJOÿLQâ?:ß<7ß6/Þ5.â6,â6,Ý7)Û5'Ò7#Ó8$Ñ8&Ñ8&Ù5)Ù5)à2+á3,Ã7(Ã7(½:(À=+¿@-¿@-À;*¾9(Å3&ÛI<ÚF:Ô@4Ë=/Ä6(¿<*»8&Å:'Å:'Ç:(Ç:(Ê9(É8'Ì4&Ì4&Ö8,Ô6*×3)Ö2(Û3*Þ6-å:2ç<4ñ:>ì59é06ë28ì4<ì4<ä9?ç/>B3CG8HJGMOLQQ]SS_WUm[Yqa`ˆml”vv¶‚‚‰‰ßŽŽä’‘파慅߂Î~{Ê~}Á~ƒ¾„†ÁˆˆÄ‰‰Å‹ˆÁ‡„½…~±‚{®„z~t—xm}peumb^i^Zh\NeYKUeJUeJc^Hc^HrXGsYHt[Eu\FrX=oU:‹Q9š`HÔXNÕYOöAFò=BÖ3.Ø50Þ5.ß6/á5+á5+Ü6(Ü6(Ò7#Ó8$Ñ8&Ñ8&Ù5)Ù5)à2+á3,Ä8)Â6'»8&¼9'½>+¾?,Á<+¿:)Æ4'çUHÑ=1Ì8,ÏA3À2$¿<*¿<*Ã8%Ä9&Æ9'Ç:(Ê9(É8'Ì4&Ì4&Ó5)Ñ3'Õ1'Ù5+â:1ç?6ê?7é>6ê37ë48î5;î5;ê2:è08á6<å:@ñVTýb`ÿmhÿhcõSNãA<á6/ß4-Þ71Ý60Þ71Þ71ß82à93ã:7ä;8ã77ä88æ89ç9:é9<é9<ê7;ê7;ï58î47ç77ç77Ý;6Û94Ê:/Æ6+¼8)¼8)¶;)¶;)´;(´;(´;(´;(µ8$º=)¯8$®7#´9*¨-Æ22÷ccÿQcøGYñ;Tð:SçG_êJbÒM`ËFYlKW/Jd4WqA^}:c‚?fŒ?jCh’HfFbJaŽIb†@c‡Ad‡Cf‰EhJkMm‘Qm‘QiMiMh‘KgJg‘Gi“Im˜Ip›Lu¦Wv§Xv§X78&67%57,57,56056057*68+;?(<@)?C*DH/HJ3Ë3(ÊB2º2"°<%¶B+Á9)Â:*Ä;+Ä;+É:,É:,Î7,Î7,Ð2)Ð2)Õ0*Û60ç;7ê>:è;7ä73ç85ë<9î<<é77à35ã68ãEDëMLÿ{uÿrlïb[ÙLEÐ71Í4.Ü73å@<Þ:1Ý90ß80Þ7/â62â62ä65å76æ68æ68ç7:è8;è8;è8;è7=ç6<î79í68æ:8æ:8Ù?7Ö<4Æ>2Â:.´;*´;*­=)­=)ª=(ª=(©<'©<'§<(©>*¡:)¡:)©9.£3(Í>BúkoôM^ðIZåHYåHYÆY^ÄW\Ÿ_UšZPUU=NN6QE-OC+JC&F?"8G;JC[)Tl:sƒRˆ˜g¢n“¥qŽ²u–º}¢´Ž“¥u†fRcC?N1BQ4Oa7Xj@_{>d€CgŒ?kCf’Ee‘D`G_ŽFb…Ad‡Cf‰Eh‹GiŽKkMk’Qm”Si’Nj“Oj”Li“Kh”Ej–Gn›JqžMt§Xt§Xs¦W<=+<=+;=2;=2;<6;<6;=0;=0>B+@D-BF-FJ1IK=MOAPOKRQMWWMZZP]]effnmm“yyŸÀ†„ÅŽ‹ØŽ‹ØŒ‹Ñ‡†Ìƒº|x³zv¨yu§xx®zz°}®€~¯} }yœ|t‹xp‡tjroemm`Zi\VjZKk[Ll[Il[I_aK_aKf^Kg_Lq\Ks^M|[J}\K”`K[F§N<¨O=É?4Å;0Û.(Ý0*Þ5.ß6/ã5.á3,à2'ß1&Ú7&Û8'Ï9!Ð:"Í;$Í;$Ô9'Ô9'Û5)Ü6*º@+´:%¯5 °6!»:'À?,É:,Ç8*Ø>4õ[QâJ?Ð8-ÉA1»3#©5²>'¿7'¿7'À7'À7'Å6(Ç8*Í6+Î7,Ú<3Ù;2Þ93á<6é=9é=9å84á40è96ê;8ì::é77ê=?úMOÿdcÿnmøicãTNÉ<5¾1*Ì3-Õ<6á<8à;7à<3ß;2à91ß80â62â62ä65ä65ç79ç79è8;è8;è8;è8;ç6<ç6<î79í68æ:8æ:8Ù?7×=5Æ>2Â:.²9(²9(¬<(«;'¨;&¨;&§:%§:%¦;'£8$ 9( 9(¤4)±A6àQUögkñJ[ðIZèK\åHYÂUZ¾QVœ\R™YOKK3LL4RF.J>&<5;4>M"Sb7pˆVz’`‡—f‰™h‰›g¡mŒ°s´wƒ•omYO`@;L,8G*AP3N`6Wi?`|?eDgŒ?kCf’Ee‘D`G_ŽFd‡Cf‰EjIkŽJjLkMj‘Pl“Rk”Pl•Ql–Nk•Mj–Gm™JqžMt¡Py¬]y¬]x«\CB0CB0BB6BB6BB:BB:AD3@C2CG,DH-GJ+JM.MO7OQ9SQDUSF[]8[]8\]MbcShgwsr‚zy¥€«„ƒ½…„¾‡„»„¸~|¤wuspqnomŸqo¡tršus›vsˆsp…rlnoikmcYj`Vl\LjZJn\Ho]Iq\Iq\IqYMqYMj^Nj^NlaOmbP\L‚]M­YO¤PF¼;5º93Ë3(Ë3(Ó3#×7'à8/ß7.á5+à4*ß5&ß5&Õ9#Ô8"É$Æ>$Í<'Í<'Ô8)Õ9*µE/­='©4 ©4 º6'À<-Ï8/Í6-Ú72ðMHïUMÚ@8ÇC4À<-¡4¬?(À;,¿:+¿7)¿7)Ä6*Ç9-Ñ:1Ó<3âC=áB<ä?;ã>:è<:è<:è88æ66å:3å:3ä84è<8ñLJÿ\Zûfb÷b^Æ?9¾71º4+À:1ÔA:ÚG@Þ<9Ö41à<3ß;2â92á81ä73å84è66é77ê69ê69ê7;ê7;è7=è7=æ7<æ7<ë78ê67â96ã:7Ö?8Ó<5Â>1¾:-­:'­:'¦;'¦;'¢<&¡;%Ÿ;$Ÿ;$š?,’7$–=+”;)™2)ºSJïhnæ_eìP^éM[ÕOXÑKT¤^R¢\P}nO|mNFN6CK3U<&N5D6QC Iw6f”Ss·lu¹n„£gu”X‡Š]‘”g‹”i€‰^WdHGT8;E-8B*:D,?I1JX4XfBd|BiGhŒBlFg“Fe‘D^‘F]Ef‰EiŒHmLmLkMjLiMj‘No˜Rp™So›PnšOmœLožNs£Ow§S{®_z­^y¬]FE3FE3EE9FF:FF>FF>EH7DG6EI.FJ/IL-LO0NP8QS;USFVTGZ\7Z\7XYI\]Mbaqlk{sržyx¤{z´}|¶~µ|³ywŸqo—mj‰if…ec•fd–igjhkh}hezicef`bg]Se[QiYIk[Ko]Iq_Ks^Kr]JrZNrZNj^Nk_OmbPncQ‚]Mƒ^N¦RHœH>µ4.·60Î6+Ð8-×7'Ù9)Þ6-Ý5,ß3)à4*à6'à6'Õ9#Ò6 É$Æ>$Í<'Í<'Ô8)Õ9*µE/­='¨3¨3º6'À<-Ï8/Í6-Ò/*ã@;õ[SáG?ÊF7ÉE6£6¯B+ÊE6ÉD5È@2Ç?1Í?3ÑC7ÛD;ÞG>ß@:Þ?9ß:6Ý84á53â64ç77é99è=6å:3â62ç;7ïJHñLJÓ>:»&"´-'¼5/Å?6ÉC:Ò?8Ò?8ß=:â@=ß;2ß;2á81â92å84æ95ê88ë99ê69ë7:ê7;ê7;è7=è7=æ7<å6;é56è45á85á85Õ>7Ò;4À,“:(–/&Æ_Vüu{ßX^ðTbèLZÏIRÊDM ZN£]Q€qR€qRMU=@H0L3O6 \N+{mJx¦e“Á€}Ávy½r}œ`f…Iy|O„‡Zt}RZc88E)0=!4>&UN>VO?WP@YRBZSC[TD\UEb[IaZH`XMbZOf\Zlb`rgmvkqznx|pzs}€t~|qyujrmbhh]cbbZaaY__U]]S^ZO^ZO`ZLa[Me]Je]Jg\Fg\Fi]Ei]Ek]Cl^DedOjiTyUEsO?™OD£YN­UG¯WI¦N8ŸG1¥<'¦=(Ä6,É;1â/2á.1Û7-Û7-Ü8.Ü8.Ú8-Ù7,×7+Ö6*Õ7+Õ7+Ô8+Ô8+Ò9+Ò9+Ò9+Ò9+¶=,¶=,®9'¦1¨3!±<*¿=-½;+È5+É6,Ó;0ÛC8ÜJ=ØF9Å<*¹0ÝOEØJ@ÒE;ÒE;×G>ÙI@àA;Ý>8â43æ87ì:8ë97â94à72Ù<3Û>5ÐJ?ÊD9¿=0·5(°5%³8(»=.¿A2À;,Ä?0Ö=5Ù@8æ:6æ:6î66ï77å6;å6;ä79ä79â96â96â92â92Þ5.ß6/à70â92å95å95å97å97é;=ç9;Ý;9Ý;9ÐC<ÎA:»C5·?1¢=+¡<*š>)˜<'”<(’:&‘9%‘9%‡F2@,‰,$0(ÀJJännámpÊVY­RO¬QN™YO˜XN’\P”^R™_Tš`ULa 9N 2IMdv’H–²h »t »t˜°rƒ›]k~QZm@WcKQ]EHNB0:B3:B3>O/RcCZv)§>)Ä6,È:0â/2á.1Û7-Û7-Û7-Û7-Ú8-Ù7,×7+Ö6*Õ7+Õ7+Ô8+Ô8+Ò9+Ò9+Ò9+Ò9+·>-¶=,­8&¦1§2 ¯:(¾<,½;+É6,Ç4*Ì4)Ò:/ÙG:àNAÛR@ÙP>×I?ÑC9Ë>4Ë>4Ï?6ÑA8Ù:4Ö71æ87ç98ê86é75â94â94Ü?6ÞA8ÇA6Ã=2º8+µ3&¯4$²7'º<-¾@1Å@1ÇB3×>6Ø?7å95å95î66ï77æ7<æ7<å8:å8:ã:7ã:7ã:3ã:3á81â92ã:3ã:3æ:6å95å97ä86æ8:æ8:Þ<:Þ<:ÏB;Ê=6¶>0±9+¡<* ;)™=(˜<'“;'’:&‘9%8${:&|;'2*š=5ÄNNÙccÑ]`¾JM©NKªOL™YOšZP”^R•_S˜^S˜^SRg&Rg&\s-yJ–²h£¿u—²k†¡ZiC_w9Sf9H[.CO7=I18>239-:;+@A1<@2:>0:B39A2>O/QbB[w=gƒIn’Ho“Ij“Gj“Gi“Kh’Jk‘Tl’Um”Ql“Pj”Jj”Jj—Fl™HmGmGn Iq£Lu§Rw©TvªXvªXi•Z`ŒQX„I[TD[TD[TD[TD[TD[TD[TD[TDZSCZSC[TD\UE]VF_XH_XH`YId^Fc]Ec\Ic\Id\Oe]Pf]Vg^Wh_Zi`[ja\ja\h_Xd[T`WN^ULXVJVTHSQDQOBQN?RO@TQ@VSB\WD]XE_XEaZGd^Hf`Jh`IiaJc`MjgT[O[OªWQ«XR¸GA¶E?½>5»<3»9+º8*½8)À;,Æ=-Ç>.Ù7*Ù7*Ú8+Ú8+Ù9+Ø8*Õ8)Ô7(Ô8)Ô8)Ô8)Ô8)Ò9)Ò9)Ò9)Ò9)¸@0¶>.©:&¡2ž4¥;%³>*µ@,Ã>/¿:+Ä2%Æ4'Î8Ü=7º:-·7*±6'®3$­5$°8'µ<+¸?.ÈD5ÉE6×@5×@5á:4à93ê65ì87ê69ê69é77é77æ93æ93å:2å:2â;2â;2á<6á<6ß<7Þ;6Ý98Ý98Ø:9Û=<ÔC>ÒA<ÂB7º:/¨:+¤6'œ=)›<(”=)“<(;&:%8$8$u8#t7"ˆ9,˜I<¶SN»XS±RN©JF›QHSJ’]O•`R“bT“bT•_U”^TfwC{ŒX“¥q¤¶‚ª¾‰ž²}y^Xn=?Q)@R*AP3=L/:C24=,58/58/:;+@A1;?19=/9A29A2=N.QbB\x>i…Kp”Jq•Kl•Il•Il–Nj”Lm”Qn•Ro—Pm•Nk•Ij”Hk˜GmšImImIpŸNt£Rx©Xx©Xt¤Xp T_ˆNU~DNw=`YI`YI`YI`YI`YI`YI`YI`YI^WG^WG_XH`YIaZJb[Kb[Kc\Ld^Fd^Fe^Ke^Ke]Pe]Pd[Td[Tg^Yg^Yf]Xf]Xe\Ud[TcZQbYP[YMXVJTREPNAOL=OL=QN=RO>WR?XS@[TA^WDa[Ec]Gg_Hh`IdaNheR}YM‚^R±^X°]W·F@±@:½>5½>5¿=/½;-½8)¾9*Ä;+Ç>.Ø6)Ù7*Ù7*Ú8+Ø8*Ø8*Õ8)Õ8)Ô8)Ô8)Ô8)Ô8)Ò9)Ò9)Ò9)Ò9)¹A1¶>.©:&¢33¢8"°;'´?+À;,¿:+Æ4'Ç5(É7*Ì:-Ë>-Ë>-Û64Ù42Õ30×52Ü:7à>;ç==ç==í6:ê37é13é13ã75ã75Ö71Ó4.´4'³3&°5&¯4%®6%¯7&²9(³:)Ä@1ÆB3Ö?4ØA6â;5á:4ê65ë76ê69ê69é77é77æ93æ93å:2å:2à90à90ß:4ß:4Þ;6Ý:5Ü87Û76Ø:9Û=<ÓB=Î=8»;0³3(£5&¢4%š;'š;'“<(‘:&:%8#Œ7#‹6"|?*s6!ƒ4'•F9¯LG®KF©JF¬MI›QHœRI‘\N“^P’aS“bT–`V–`V|Y˜©u¬¾Š¦¸„£nr†QLb1,B,>1C8G*9H+9B16?.9<3:=49:*?@0:>08<.9A28@1%§E,±<(²=)Â8+Ä:-Ì8,Í9-Ò;0Ô=2ñ4;ï29æ37å26ß56ß56à35à35æ69å58ä68å79Þ<:Ú86É4.Ã.(­:(­:(«:(«:(©:&©:&¬9&¬9&·:(¼?-Í?3ÑC7ß>6ß>6æ:6æ:6î64î64í74í74ê93ê93æ;3æ;3Ý:1Þ;2Ú=6Û>7×?:Ö>9Ô>=Ó=<ÇD<ÇD<¿E:¸>3¦:-¡5(˜9'š;)’=)‘<(‹='Š<&‡:&…8$…7#…7#}C/o5!x3#ŽI9¡SGOC˜PDŸWK‘YJ‘YJ‹[MŒ\N]R‘_T™`WšaX‚Žf˜¤|›©…€Žj\kNDS62?+$1,8*.:,4<17?45;;199/89)>?/:>07;-8@17?0,¿<*­E(¬D'Ó6%Ô7&Õ8'Ö9(Ö9(Ö9(Ô9'Ô9'Ò9'Ò9'Ò9'Ò9'Ñ:'Ñ:'Ñ:'Ñ:'º@1¶<-§<(£8$–8”6œ:!¥C*µ@,µ@,Ã9,À6)Æ2&É5)Ò;0ØA6ï29ð3:ê7;ë8<å;<ä:;æ9;å8:ã36ä47æ8:ç9;Þ<:×53Æ1+¿*$®;)®;)¬;)¬;)«<(©:&«8%ª7$±4"¶9'È:.Ì>2Ü;3Ý<4æ:6ç;7î64î64í74í74ê93ê93æ;3æ;3á>5á>5Ý@9Ý@9Ø@;×?:Ô>=Ó=<Ã@8À=5¶<1°6+¡5(Ÿ3&˜9'š;);';'Š<&ˆ:$…8$„7#„6"ƒ5!v<(n4 }8(”O?¦XLŸQE—OCœTH“[L’ZK‹[M‹[M[P^S˜_VšaXq}Ux„\n|XSa=8G*.= /<(0=)1=/1=/5=28@5>A8>A8;;177-78(=>.9=/7;-7?06>/;L,N_?^z@k‡Mr–Lt˜Np™MqšNpšRo™Qq›Qq›Qq›Oo™Mn™JošKržOu¡Rw¦Vx§Wz©[w¦XqŸVf”K[ŠBU„<_ˆNW€FPy?e^Ne^Ne^Ne^Ne^Ne^Ne^Ne^Ne^Ne^Nf_Of_Of_Og`Pg`Pg`PibOibOhaNhaNhaNhaNhaNhaNgaKgaKgaIf`HfaDgbEgbEgbEf`Jd^H`[E\WAUS>PN9KJ6IH4EH5FI6EI8GK:FM=GN>FO>GP?RNCUQFXO@_VGZI…^M²QJÂaZàHGÛCBá77Þ44Ì=/Ê;-°B'­?$Ð7%Ð7%Ð9&Ñ:'Ò;(Ò;(Ñ:'Ñ:'Ñ:'Ñ:'Ñ:'Ñ:'Ð;'Ð;'Ð;'Ð;'º>2¶:.¨=)¦;'’; 6‘:šC'¯B-±D/¿;,¼8)Å.%Æ/&Ò5.Ù<5ê2:í5=ç>Aé@CÞDBÜB@ÔC@ÓB?Æ52É85É>9Ê?:¿@9¹:3«9.¨6+£>*£>*£@+£@+£@)¢?(£='¢<&ª7$¬9&º8*½;-Ë8.Ï<2Ú=6ÞA:ê93ê93è:3è:3æ;1æ;1à>3à>3ÝC9ÜB8ÓE;ÑC9ÉB<Æ?9À?:¿>9§?2¤*4>55?64=86?:=B;AF?EG9BD6?>*;:&78(=>.8<.6:,6>/6>/:K+N_?^z@j†Lr–Lt˜Np™MqšNq›SpšRpLpLpLn›Jn›JpLt Sx¤W~ª_~ª_x¦^oUd‘N\‰F[ˆE\‰Fb‰RY€IRyBg`Pg`Pg`Pg`Pg`Pg`Pg`Pg`Pf_Of_Of_Of_Og`Pg`Pg`Pg`PkdQjcPibOg`Mf_Lf_Lf_Lf_LgaKgaKgaIgaIgbEgbEgbEfaDgaKf`Jc^H`[EZXCUS>ON:LK7DG4DG4CG6DH7BI9BI9BK:BK:MI>SODWN?VM>mF5mF5£B;¼[TäLKÝEDâ88ß55Î?1Ì=/°B'ª*§<(“)Á=.Â>/Í6-Î7.Ø;4ÞA:ò:Bô<Ð64Ã2/¿.+¾-*Â1.Â72Â72¶70²3,¨6+¨6+¡<(¢=)¢?*¢?*¢?(¢?(¤>(¤>(¬9&­:'·5'·5'Å2(Ë8.Ù<5ßB;ë:4ë:4é;4é;4ç<2ç<2á?4á?4ÜB8ÛA7ÑC9Î@6Ä=7À93¹83·61 8+œ4'•4$–5%’9'’9'‰;'†8$†=*…<)ƒ<(:&~:'|8%}6$|5#v3"}:)‹H8•RB’PBŒJ<RDš_QYKŽZL‘]P’^Q–]T•\S–YT•XSV^7EM&5>8A";G3:F23=4-7./835>9@E>EJCGI;AC5>=);:&67'<=-8<.6:,6>/6>/:K+M^>]y?j†Lq•Kt˜Np™MqšNq›SpšRpLpLoœKn›Jn›JqžMv¢Uz¦Y‚®c«`v¤\h–NZ‡DVƒ@\‰FcMcŠSY€IRyBhaQhaQhaQhaQhaQhaQhaQhaQg`Pg`Pg`Pg`Pg`Pg`Pg`Pg`Ph_Zh_Zh_Xh_Xh_Vh_Vh`Sh`ShaOhaOhaOhaOhaNhaNhaNhaNg_Hf^Ge_Id^Ha\H\WCRQ=ML8GJ7DG4>E5=D4=F5>G6*¼4(½5)Í4,Õ<4âC=çHBäDFæFHÔFBÈ:6°:.°:.¦<.¡7)¡=. <-œ<.š:,=-=-ˆ?,ˆ?,•>+•>+•@+–A,—@,˜A-œA,œA, ;) ;)¨7'©8(µ7+¹;/Á=1Ã?3Ú=4Û>5ÝA5ßC7ÜD7ÚB5ÔB5ÓA4ÓI<ÐF9ÁC7º<0ª8.¦4* 3,Ÿ2+=-<,‹<+‰:)†;(†;(=*=*|;'{:&x9'x9'x9'x9'u6%t5$z, ?3—OA•M?ŒM>‘RC‘VHRD™ZQ™ZQ’SL’SL™ZU–WR“VQža\QZ-HQ$AK&AK&-1<,EP@X_MU\JLP7CG.@A"<=9:*=>.9=/9=/8@14<-8I)PaA`|Bk‡Mq•Kr–Ln—Kp™MpšRpšRnžHoŸIoŸKoŸKpŸOs¢Rz¦[~ª_‚­fw¢[i“Q_‰G\†F`ŠJdŽNg‘QcŠUZLSzEhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQi`[i`[i`Yi`Yi`Wi`WiaTiaTibPibPibPibPibOibOibOibOh`Ig_Hf`Je_Ic^J^YETS?ON:HK8EH5?F6>E5=F5>G6F/DL5NI,ID'„M8¯xcÔ^TØbXñROæGDâ?:â?:ÕA7Í9/Í:*Î;+Ï<,Ï<,Î;+Í:*Í:*Í:*Î;+Î;+Î;+Í:*Ï9*Ï9*Ï9*Ï9*Å@7Å@7¶E5®=-˜9#’3’4”6¥5!ª:&Ã;/ÌD8ÞE=ãJBéJDéJDà@BáACÏA=Ä62¯9-°:.§=/¤:,¢>/ <-œ<.š:,=-<,‡>+‡>+‘:'’;(‘<'’=(”=)•>*™>)™>)£>,¢=+©8(¨7'²4(µ7+»7+½9-Ó6-Õ8/Ø<0Û?3ÙA4ÚB5ÕC6ÔB5Ê@3Ç=0»=1µ7+¨6,¥3) 3, 3,<,Ž;+Š;*‰:)†;(…:'=*=*|;'{:&y:(x9'x9'w8&u6%t5$€2&‘C7—OA“K=ŠK<PATFRD‘RI–WN”UN–WP›\W•VQRM—ZUT]0Zc6^hC[e@GT:6C)4?.KL:HI7CF5AD3?F6?F6>E5=D4=F17@+AF/FK4G>!MD'‰YB¨xa¶UEËjZñc_äVRéEFêFGëADà69Ç9+Ç9+È:,È:,È9+Ç8*Æ7)Å6(Ê8+Ê8+Ê8+Ê8+Ë7+Ë7+Ë7+Ë7+Á2.Â3/¶6-±1(¡0 Ÿ.£/ ¦2#Á=1ÇC7ÙD=àKDéLGçJEåFBáB>ÒD@ÐB>ºD:±;1œ?.žA0”G3“F2F3D1‰E2†B/€C0~A.xD.wC-†:*†:*…<+…<+ˆ=*‰>+Š=+‹>,“@.’?-—;,—;,9*Ÿ;,¥;.¦2¼@4ÀB4ÀB4¾C4¾C4°<-®:+¥;-¢8*—9-–8,’:.’:.‡>-†=,„=+‚;)€;+:*}<*~=+z;*z;*x:+w9*s8(r7'p7&p7&‰;1”F<’NAI<‡I<ŒNA’RH‘QG“LF™RL˜SNšUP—^W“ZS‡\S“h_v„S}‹Z|Œ_iyLIY25E;J)L[:crUapS[fHLW9CJ+>E&=@!:=78(;<,7;-9=/9A25=.9J*O`@`|BlˆNs—Mt˜Np™Mp™MpšRpšRq£Ln IlKnŸMt£Uy¨Zz¨`z¨`o™WdŽL[„B[„BcŒJh‘OdK^‡Eb‡SY~JRwChaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQi_^i_^i_]i_]i`Yi`YiaViaViaTiaTiaTiaTiaTiaTiaViaVkcNjbMjbMjbMgbNd_K]ZGYVCNO=KL:FI8CF5?F6?F6=D4G29B-DI2DI2H?"^U8•eN–fO¡@0ºYIî`\î`\óOPíIJíCFç=@È:,Æ8*Å7)Å7)Ç8*É:,Ê;-Ê;-Ð>1Ð>1Ñ?2Ñ?2Ò>2Ò>2Ó?3Ó?3ÐA=ÑB>ÇG>ÅE<ºI9¼K;ÃO@ÇSD×SG×SGáLEàKDãFAáD?àA=Þ?;ÓEAÎ@<·A7¯9/œ?.@/”G3”G3ŽE2D1ˆD1…A.~A.}@-vB,vB,„8(„8(ƒ:)ƒ:)†;(†;(‡:(ˆ;)Œ9'Œ9'’6'“7(›7(9*£9,¥;.°6+±7,³7+´8,¶8*µ7)²7(±6'©5&¨4% 6(ž4&”6*”6*‘9-‘9-…<+„;*‚;):(~9)~9)|;)|;)z;*z;*x:+v8)r7'q6&p7&q8'A7•G=K>‹G:†H;OB”TJ•UK–OI›TN—RM—RM•\U•\U‘f]¢wn‹™h…“br‚UYiN'O^=crQdsVZiLNY;AL.>E&=D%=@!;>78(:;+6:,8<.:B36>/9J*N_?_{Ak‡Mr–Lt˜Np™MqšNq›SpšRp¢KmŸHmžLr£Qy¨Z{ª\w¥]r Xa‹I\†D[„B^‡EeŽLh‘OdK_ˆFa†RX}IQvBhaQhaQhaQhaQhaQhaQhaQhaQibRibRibRibRibRibRibRibRja\ja\jaXjaXjbUjbUjcQjcQjcPjcPjcQjcQjbUjbUjbWjbWldQkcPkbQkbQjcQhaOb]J_ZGURARO>LK9IH6EF4CD2AB2?@03Í@6ÑD:ÔF<ÕG=ÚJAÚJAÚJAÛKBÝJBÞKCÞKCÞKCìRRëQQãTPàQMÚQKÚQKßRKáTMäIEãHDçCBåA@ãA>äB?àE@áFA×IGÏA?¶?7°91œ@1œ@1F3G4‹C4ŠB3ˆ@2†>0=0€i…Kq•Kt˜Np™MqšNq›SpšRmžLmžLp¡Pv§V|ªay§^pZg”QYƒC[…E`‰GcŒJgŽKgŽKeGdŒF`…RW|IPuBhaQhaQhaQhaQhaQhaQhaQhaQibRibRibRibRibRibRibRibRja\ja\jaXjaXjbUjbUjcQjcQjcPjcPjcQjcQjbUjbUjbWjbWldQkcPkbQkbQkdRibPe`Mc^KZWFVSBPO=LK9GH6EF4BC3@A1:I,;J-QA*SC,F8›`R®QI2*®=5²A9ÒSMðqkÿssôddòU\öY`àVKÙODÑG<ÍC8ÑD:ÔG=ÖH>ÖH>ÙI@ÙI@ÚJAÚJAÝJBÞKCÞKCßLDáGGàFFÙJF×HDÓJDÒICÕHAÕHAÝB>ÞC?æBAçCBåC@äB?ÝB=Û@;ØJHÎ@>µ>6±:2žB3›?0ŒC0D1‰A2ˆ@1†>0…=/€1|>1~<.~<.~<.~<.=/=/=-=-<-<-ƒ:+ƒ:+…7*…7*‡5'‡5'7+8,”8+•9,›:*œ;+ <, <,™8'™8'’9)‘8(‰:)ˆ9(ƒ:+ƒ:+:+~9*}8)|7(z7'z7'y7)y7)u6'w8)u:,s8*o5'n4&q9,u=0K=‹I;„K:„K:…P@‹VF”UL•VM”MIšSO–UQšYUŒf[[PdWDgZGBQ(?N%>O#K\0^qDk~QcyKVl>M_7@R*6E&5D%/6:+89):;+59+8<.;C47?06G'HY9Ws9eGn’Hr–Lp™Mr›OrœTq›SlKnŸMs¤Sx©Xz¨_s¡Xg”Q]ŠGX‚B\†FcŒJfMfJeŒIeGfŽH_„QV{HOtAhaQhaQhaQhaQhaQhaQhaQhaQibRibRibRibRibRibRibRibRjcSjcSjcPjcPjdLjdLjdJjdJjdJjdJjdLjdLjcQjcQjbUjbUlcTkbSjaRkbSlcTkbShaQf_OaZH]VDVQ>QL9NI6KF3HC0FA.9H):I*c9)rH8³GG´HH¿2:½08ÉACÅ=?ÆLIÝc`íspêpmæadà[^ÚQIÔKCÎE=ÌC;ÏD=ÐE>ÐC<Í@9ÑB<ÒC=ÓB=ÔC>×C?ØD@ØD@ÙEAß>Cà?DÝCCßEEáIHáIHæFFåEEê@Cê@Cî@Bî@BåA@â>=Ø?9Õ<6ÛEFÏ9:¸93·82¥@4 ;/‘>0‘>0;/Œ:.Œ70‹6/Š71Š71‡83ˆ94{<3{<3{=2{=2y=2y=2y>0y>0{=0{=0|=.{<-|:,{9+z8(y7'};/~<0‚:,ƒ;-Š;,Œ=.’<+“=,9(9(Š;*Š;*‚>+=*~=+}<*€8*7)~6(}5'z4(z4(y5*y5*s3'u5)t8-r6+m5(m5(q<.vA3‡R@ƒN<|O<R?„VF†XHŽTIŽTI“NI—RMVO“ZSjYoZIFP5AK0?N/JY:VhB_qKd{MbyKUm=E]-AV-5J!/?"3C&;F89D67;:598:;+;<,59+8<.;C46>/5F&EV6So5a}CkEq•Ko˜Lr›OrœTq›Sl No£Qr¥Xt§Zq Xi˜P_ŒKY†E]‡G_‰Ib‹IdKfŽHeGdŒCc‹B^ƒPUzGNs@haQhaQhaQhaQhaQhaQhaQhaQjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdQkdQkeMkeMkeKkeKkeKkeKkeMkeMkdRkdRkcVkcVlcTkbSjaRkbSlcTlcTibRg`Pd]K_XFXS@SN;OJ7LG4ID1FA.:I*:I*f<,WGÀTTª>>¶)1ÒEMÆ>@Á9;¶<9ÁGDÖ\YàfcÝX[ËFIÒIAÎE=ËB:ÍD<ÑF?ÒG@ÐC<Ë>7ÑB<ÒC=ÓB=ÔC>×C?ØD@ÙEAÙEAß>Cß>CÝCCßEEßGFÞFEà@@Þ>>ê@Cé?Bê<>é;=â>=ã?>ÞE?ßF@×ABÌ67µ60¶71¥@4Ÿ:.=/=/‹9-‹9-‹6/‹6/Š71Š71ˆ94ˆ94{<3{<3{=2{=2y=2x<1x=/x=/w9,w9,y:+z;,|:,|:,|:*|:*};/|:.€8*7)„5&…6'‹5$‹5$7&7&ˆ9(‰:)=*=*~=+}<*7)~6(}5'|4&y3'y3'x4)x4)q1%t4(s7,r6+m5(n6)r=/xC5‰TB…P>~Q>TA†XH†XHŒRGŠPE—RM—RMŠQJTMzeTlWFCM2>H-HW8ZiJgySewQXoAQh:Ld4H`08M$-B*:1A$:E79D68<;7;:;<,;<,59+8<.;C46>/3D$CT4Pl2_{AjŽDp”Jo˜Lr›OrœTrœTn¢Pq¥Ss¦Yp£VkšRb‘I[ˆGW„CbŒL_‰I_ˆFaŠHfŽHgIc‹B^†=^ƒPTyFMr?h_Pi`Qi`Qi`QjaRjaRjaRkbSjaRjaRjaRjaRjaRjaRjaRjaRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdTn]Mq`PqdTqdTlcTi`QgaShbTebQebQa_JYWBVR9TP7OI/HB(NE(I@#dH2ˆlV²zm¬tg³[W­UQ´DCµEDÃCDÆFGÎFFÑIIÔJHÕKIËEDËEDÐFCÑGDÓF?ÐC<ËE9ÌF:ÄE6ÅF7ÊE<ËF=ÖBBÖBBààA=ã?=ã?=ä?=ä?=ÌF=Å?6±;1¬6,™=0˜3„:1„:1Š71Š71…<-„;,ƒ;,ƒ;,‚:+‚:+€;,€;,:+:+~:-~:-~:-~:-};/};/|8-|8-|8-|8-|:.|:.|:.|:.y9-y9-y9-y9-w9,w9,w9,v8+u9.t8-t8-s7,r6+q5*p6*p6*j2%o7*m5(k3&m8*j5'n9+~I;€TI€TI‡PI‡PI‘MJ’NK”OJ•PKTLRJ~_KbNdcEVU7GY3M_9gT_yLWpFQj@Qf?Mb;HW8BQ28B)4>%38$5:&=>.@A1A?2?=00;-0;-39+5;-9=,;?.=B+>C,S_9coIn‡PuŽWp•Ps˜SqPržQv^~¥f~¥fq˜YcŠK^…F^…F]„E_†GaˆId‹LeŒMeŒMb‰J_†G]„E_OTvDKm;h_Pi`Qi`Qi`QjaRjaRjaRkbSjaRjaRjaRjaRjaRjaRjaRjaRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdTraQraQobRqdTpgXpgXlfXicUgdSkhWmkVjhShdKc_F[U;RL2SJ-H?"X<&lP:‹SF†NA–>:™A=ÀPOÀPOÊJKÊJKÎFFÎFFÐFDÐFDÖPOËEDÅ;8Æ<9ÐC<ÓF?ÉC7Ä>2ÅF7ÆG8ÊE<ÌG>×CCØDDâ>Gâ>GÞBCÞBCßDBßDBàECàECàEAáFBáC@áC@áB>àA=â><â><ä?=ä?=ÍG>ÈB9¶@6¯9/™=0–:-„?0‚=.|A3|A3}?4|>3„:1„:1Š71Š71„;,„;,ƒ;,ƒ;,‚:+‚:+€;,:+:+:+~:-~:-~:-~:-};/};/|8-|8-|8-|8-{9-{9-|:.|:.z:.z:.y9-y9-x:-w9,w9,w9,t8-t8-s7,s7,r6+q5*p6*o5)j2%o7*m5(k3&l7)j5'n9+~I;€TI€TI‡PIˆQJ’NK“OL•PK–QL‰NFŠOG|]I€aMmlNkjLasMfxR[uHUoBMf1>2qA5xH<„NBWK–^QšbU´aY¬YQ±JE¯HCÅCAÉGEÓB?Ï>;Ó@9ÔA:ÓC;ÕE=ØD@ÙEAÜDCÜDCÜDCÜDCÝEDÝEDÛFBÜGCÜGCÜGCÛF@ÚE?ÛD=ÚC<ÚC<ÚC<ÜC=ÜC=ÓF=ÑD;¿C9·;1;.—5(„;,„;,~@1~@1~?0}>/ƒ;/ƒ;/ˆ8/ˆ8/ƒ;,ƒ;,ƒ;,‚:+‚:+‚:+:+:+~:-~:-~:-~:-};/};/};/};/{8/{8/{8/{8/{8/{8/y9/y9/y;0y;0y;0x:/v:/v:/u9.u9.t8.s7-r8-q7,p6+p6+n5*n5*j1&o6+j4(i3'l6*i3'm7+}G;‡QG‡QG‹PHŒQI‘RK’SLUM‘VN…YN‡[PxaOv_MkkQqqWhwXfuVPdAJ^;DX5BV3DU5FW7ES9DR8?I1:D,6>)5=(9=,:>-;=/9;-3=42<36<26<29=.:>/1˜6)…<-…<-~@1~@1~?0}>/ƒ;/ƒ;/ˆ8/ˆ8/ƒ;,ƒ;,‚:+‚:+‚:+9*:+:+~:-~:-~:-~:-};/};/};/};/{8/{8/{8/{8/{8/z7.x8.x8.y;0y;0y;0x:/v:/u9.u9.u9.s7-s7-q7,p6+p6+o5*m4)m4)j1&o6+j4(h2&k5)h2&k5){E9†PF‡QGŒQIRJ’SL“TM‘VN‘VN‰]RŠ^Sv_MnWE``FggMYhIN]>CW4>R/:N+9M*>O/AR2ES9FT:BL4>H0:B-7?*9=,9=,9;-79+3=43=46<26<29=.:>/;@);@)HT0Wc?azCk„Ml‘Lt™Tu¡Rv¢Sz¡bq˜Yd‹L[‚CY€A[‚C\ƒDZB^…F_†GaˆIaˆIaˆI_†G]„E\ƒDW|ILq>Ch5g`PhaQhaQhaQibRibRibRjcSibRibRibRibRibRibRibRibRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdTrfXsgYph]ldYfbYie\qngzwp~}xŒ‡Ÿœ•§¤ª¦›¨¤™¢œš”ˆx{hcfSMR>EJ6>J6;G3:G3=J6BQ/4<-7;-7;-M7)`J<ŠQJVO±GI´JLÏBHÏBHØ?AØ?AÚB?ÛC@ÚE?ÚE?ÚE?ÚE?ÛEDÛEDÚDCÚDCÚDCÚDCÙEAÙEA×G?ÖF>ÕF>ÔE=ÒE;ÒE;ÓF<ÓF<Ö?8ØA:ÊF:ÅA5ª@3¢8+Ž=,<+‚?.‚?.~?.}>-<,<,†:,†:,‚:+‚:+‚:+‚:+:+:+~9*~9*~:-~:-};/};/};/};/};/};/z:0y9/y9/y9/w9.w9.v8-v8-v:/v:/v:/u9.t:.t:.s9-s9-q7,q7,p6+p6+n5*m4)l3(l3(g1%l6*h4'f2%i5(f2%i5(yE8LDMEPI‘RK‹WLŒXMƒ[Oƒ[Os\Lt]Mc\I\UBUZDY^HLXB?K5:F28D05A-5A-8D0*0<(3<72;65:35:38;09<1:?);@*FR.T`<^vBj‚Nn“NwœWw£Tw£Txžak‘T]ƒFW}@YB\‚E\‚E[D^„G^„G_…H_…H_…H^„G]ƒF\‚EVzJKo?Bf6g`PhaQhaQhaQibRibRibRjcSibRibRibRibRibRibRibRibRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdTmaSpdVnf[kcXhd[qmdƒ€y’ˆ¤£ž²±¬ÃÀ¹ÈžÈĹÄÀµ¿¹­¸²¦œŸŒ„qafRMR>?K7:F27D08E17F16E07D27D2;C4=E6BF8CG9F0"O9+r92~E>²HJÁWYØKQÎAGÛBDÜCEÜDAÝEBÛF@ÛF@ÚE?ÙD>ÛEDÛEDÚDCÚDCÚDCÙCBØD@ØD@×G?ÖF>ÔE=ÓD<ÒE;ÒE;ÒE;ÓF<Õ>7×@9ÊF:ÇC7®D7§=0?.<+‚?.‚?.~?.}>-<,<,†:,†:,‚:+‚:+‚:+9*:+~9*~9*~9*~:-~:-};/};/};/};/};/};/z:0y9/y9/x8.w9.v8-u7,u7,u9.u9.t8-t8-s9-r8,r8,r8,p6+p6+p6+o5*m4)l3(l3(k2'g1%l6*h4'f2%h4'e1$h4'xD7LD‘NFQJ‘RK‹WL‹WLYM€XLs\LpYI_XEYR?OT>LQ;>J44@*1=)/;'.:&.:&0<(3?+7C/9E1=I5*0<(0940943814927:/8;09>(:?)BN*Q]9\t@j‚No”OxXw£Tv¢Sp–Yc‰LW}@V|?YB[D[D[D]ƒF]ƒF^„G^„G]ƒF\‚E\‚E[DUyIJn>Ae5f`PgaQgaQgaQhbRhbRhbRicShbRhbRhbRhbRhbRhbRhbRhbRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdThbVicWhd[kg^qpk…„›¯¯­ÀÂÁÐÒÑààÞååãæâßáÝÚÛÖÒÔÏËÔ¸­½¡–˜…v}j[_ZFPK7>F/3ÛEFÛEFÜCEÜCEÛCBÛCBÛCBÚBAÚEAÙD@ÕE=ÔD<ÒE<ÒE<ÐF<ÐF<Û>7Û>7ÐC9ÎA7·F8°?1•>-8'…>,…>,€?->,€=*€=*ƒ<*ƒ<*€;,€;,:+:+~9*~9*}9,}9,};/};/};/};/{;1{;1{;1{;1w;1w;1v:0u9/t8.s7-r8-q7,q8-q8-q8-p7,n8,n8,m7+m7+o6-o6-l6,k5+j4*j4*h4)h4)f2'k7,f4)c1&e3(b0%e3(uC8”KE•LFŽRJSKYM€XLp]No\MdaP[XGNRAJN=AJ99B12:+08)25.25.06,/5+.6)/7*2:-4)-63-6316027158/7:19=,:>->I)MX8Zr@iOo”QxZu¡VržSiŒT]€HUx@WzB[~F[~F[~F]€H_‚J_‚J_‚J^I^I]€H]€H]€HSwKGk?>b6f`PgaQgaQgaQhbRhbRhbRicShbRhbRhbRhbRhbRhbRhbRhbRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdToi]mg[lh_tpg„ƒ~ Ÿš¼¼ºÎÎÌÍÏÎÞàßññïøøöúöóöòïðëçéäàêÎÃÜÀµ¿¬¢€{vb`[GGO8AI2=J6=J6?G8>F7@A9>?7?;8>:79<1=@5L3.H/*r01’PQÃ`cÍjmÌVVÌVVÖRNÕQMßKGÝIEãFAâE@ÛEFÛEFÜCEÜCEÛCBÛCBÚBAÚBAÙD@ÙD@ÕE=ÔD<ÑD;ÒE<ÐF<ÐF<ÞA:Ü?8ÐC9ÏB8¹H:±@2”=,Œ5$…>,…>,€?->,€=*€=*ƒ<*ƒ<*€;,:+:+:+~9*~9*}9,|8+};/};/};/};/{;1{;1{;1{;1w;1w;1v:0u9/t8.s7-q7,q7,p7,p7,p7,o6+m7+m7+l6*l6*o6-n5,l6,k5+j4*i3)h4)g3(f2'k7,e3(c1&e3(a/$e3(tB7”KE•LFŽRJSKYMWKo\MmZKWTCKH7?C2?C29B109(/7(5=.47047039/17-/7*/7*08+19,6A19D4K9:I46E02A,0?*+41,52/4.16047.7:19=,:>-;F&KV6Xp>h€No”QwœYsŸTnšOb…MX{CRu=VyAZ}EY|DY|D[~F^I^I^I^I]€H]€H]€H\GPtHEi=<`4icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUkdTkdTkdTkdTee]ee]stn‘’Œ­¯¬ÃÅÂ×ÛÜéíîñõöôøùûýüþÿÿÿÿýýüúúöó÷óðûàÍóØÅÜʲƴœ§ ƒŠƒfbcDGH)EH-CF+ID1ID1I:3D5.H32M87?><@?=D97D97bFC‰mj¾•Ú±«Ê…·}r¼bY·]TÖRPÔPNåEGäDFØHHÛKK×EEÏ==×>@áHJáGGØ>>Ù??Ú@@ÙA>ÙA>ÕA=Ô@<ÑA9Ð@8àA;Ý>8ÏA7Í?5¹C7³=1™=.’6'‡>-‡>->-€=,~=)~=)<)<):+~9*}9,}9,|8+|8+{9-z8,{9-{9-y9/y9/y9/z:0z:1z:1v=2v=2u<1s:/r9.q8-n8,m7+m7+m7+l8+l8+l8+l8+j9+j9+g3(k7,o;0n:/j6+g3(d2'e3(c1&h6+b2&]-!_/#^."a3&oA4‹NIPKƒRK‚QJu[Nw]P`ZJSM=>G4-5@"FQ3Vm?i€Rq•Xxœ_qœWi”OZ}GVyCSv@Sv@VyCY|FY|FX{E]€J`ƒM`ƒM\I[~H]€J_‚L]€JRpNEcA;Y7icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUleUleUleUkdTee]oog…†€¤¥ŸÀ¿×ÙÖéíîöúûöúû÷ûüûýüýÿþÿþüÿþüÿüùÿûøÿíÚÿæÓîÜÄÜʲÁº¨¡„‚ƒdijKMP5FI.FA.GB/K<5H92L76O:9<;9CB@RGE]RP‚fc¨Œ‰Ö­§ë¼ÿÑÆê°¥×}t¾d[ÖRP×SQæFHß?AÕEEÕEEÙGGÜJJÝDFÖ=?×==ÜBBØ>>Ù??Ø@=Ø@=ÕA=Ô@<ÑA9ÑA9ß@:Ý>8ÐB8Î@6ºD8´>2š>/“7(‡>-‡>->-€=,~=)~=)<)<):+~9*}9,}9,|8+|8+{9-z8,|:.|:.z:0z:0z:0z:0z:1z:1u<1t;0t;0r9.q8-p7,m7+l6*l6*l6*k7*k7*k7*k7*i8*i8*j6+l8-n:/n:/k7,h4)e3(d2'b0%d2'^."]-!b2&^."_1$n@3„GB‹NI‡VO„SLpVIjPCOI9C=-8A.7@-3@/2?.2=/1<.4:04:077577557246116/16//7,/7,,8*/;-3B/7F37I36H23E/1C--61,50-2,-2,03*36-6:)8<+5@"FQ3Ul>jSr–Yxœ_ošUeKX{EUxBRu?Ru?UxBWzDX{EWzDZ}G]€J^K[~HZ}G\I]€JZ}GPnLCa?7U3gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUleUleUleUleUaedw{z•™˜²¶µÉÑÓáéëñùû÷ÿÿùÿÿùÿÿûÿüúÿûþÿùÿÿúÿÿøÿÿøøÿÞôûÚéóÐÜæÃÍÙ±ºÆž›ª„“h^hCNX3CG,AE*HE4IF5I@7H?6E99UIIj`_€vu™”¹´°ÓÑÅáßÓòæØÿõçÿâ×Û¯¤¾ea¤KGÄGKÔW[Ô[SÊQIÆGAÆGAÑGDÒHEÖDDÕCCÖ>=Ö>=×?>Ø@?ÖA=ÖA=Ô@<Ô@<Ù@:Ø?9ÎD:ÍC9»F=´?6œ>2–8,‰=/‰=/>.€=-~=+~=+~=+~=+~:-}9,}9,}9,{9-{9-{9-z8,{;1{;1{;1{;1z;2z;2y:1y:1q;1q;1o;0n:/m9.l8-i7,h6+i7,i7,h8,h8,h8,h8,h8,h8,k90k90j8/j8/j8/i7.d4*b2(b3)`1'[,"_0&a5*Y-"\0%pD9yRK~WPwZRoRJYMAOC7;=/46(/:*0;+0<.1=/4<14<17:169068368349338227027008-08--8*/:,2?.5B17F38G46G46G43=20://5+,2(-0%03(37(6:+5?&FP7WmGmƒ]u—dy›hk”Z^‡MVvDTtBRr@Rr@TtBVvDVvDVvDWwE[{I\|JZzHZzH]}K[{IXxFOePAWB5K6gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUleUmfVmfVmfVgkjƒ‡†£§¦º¾½ÍÕ×åíïòúüôüþùÿÿùÿÿûÿüúÿûýþøýþøÿÿ÷ÿÿø÷þÝõüÛîøÕæðÍÝéÁÎÚ²³Â—ž­‚}‡bdnIMQ6DH-KH7LI8KB9G>5QEEk__‹€£™˜µ°¬ËÆÂÝÛÏèæÚøìÞÿúìÿñæÿÙÎÿ¬¨æ‰Ù\`º=AÈOGÌSKÍNHÆGAÎDAÕKHÙGGÐ>>Ô<;Õ=<Ö>=×?>ÖA=ÖA=ÕA=Ô@<×>8Ø?9ÏE;ÎD:»F=´?6?3—9-‰=/‰=/>.€=-~=+~=+~=+~=+~:-}9,}9,}9,{9-{9-{9-z8,|<2|<2{;1{;1z;2y:1y:1y:1o9/o9/m9.l8-k7,j6+h6+g5*i7,i7,h8,h8,h8,h8,h8,h8,l:1i7.g5,h6-j8/i7.d4*`0&c4*`1'].$`1'`4)V*^2'yMBZS|UNjME]@8H<0D8,9;-8:,-8(.9)/;-1=/4<14<169058/68368349338238127019.19.-8*.9+/<+2?.4C07F37H58I69C84>317-,2(,/$-0%15&37(3=$GQ8\rLs‰czœixšgdSS|BRr@Qq?Pp>Pp>Qq?SsASsATtBUuCYyG[{IZzH[{I]}KYyGTtBH^I:P;-C.gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSibRjcSjcSjcSkdTkdTkdTleUkdTleUleUleUmfVmfVngWngWksu…¢ª­·¿ÂËÕ×ãíïðüüòþþ÷ÿþ÷ÿþúÿùùÿøûÿñøüîøùé÷øèñÿçñÿçðýáëøÜéóÑÞèÆËÑ­·½™œ¢€|‚`X^DGM3CL9CL9=H::E7a^W‚xª£À¹³Ê¿×ÏÌâáÜîíèõöîóôì÷íãüòèÿõìÿçÞߨ£¥ni M;¨UC¹\K¾aPÂSH·H=¾B:ÂF>Ê@=ËA>ÏA=ÐB>ÑB>ÒC?ÐC<ÐC<Ò?8ÔA:ËF?ÊE>·F>°?7›>6—:2‰<2‰<2=0€7-77+88,8<.9=/19,2:-4Oo>Oo>Oo>Pp?Qq@TtCXxGZzI[{J]}L]}LWwFOo>DQG6C9*7-gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSibRjcSjcSjcSkdTkdTkdTleUkdTleUleUmfVmfVngWohXohXgoqz‚„“›ž¬´·ÃÍÏÛåçë÷÷òþþóþúõÿüùÿøùÿøúþð÷ûíõöæòóãïÿåïÿåðýáîûßîøÖåïÍÓÙµÀÆ¢¬²ŠnbhNLR8CL9EN;EPBGRD}zsš“Ľ·ÖÏÉÜÔÑäÜÙíìçø÷òîïçùúòÿýóÿûñÿïæÿëâÿÛÖÿÏÊ݊xµbP¥H7²UDÄUJµF;º>6ÇKCÊ@=ËA>ÏA=ÐB>ÑB>ÑB>ÏB;ÏB;Ó@9ÔA:ËF?ÈC<³B:­<4š=5˜;3‰<2‰<2=0€cxYv‹lr’ig‡^QxIAh9Jj9Ll;MmÉD=ÉD=ÈC<ÇB;ÐC<ÑD=ÇF@ÂA;¯@9¨92–<4–<4‰<4‰<4=4€<3~<0~<0~<0~<0};/|:.|:.|:.{9-{9-y9/x8.z:1z:1x90x90w81v70s7/s7/j8-j8-i9-h8,h8,h8,g9,f8+f8+f8+d8+d8+d8+d8+d8+d8+f5.g6/h70h70g80g80i:2k<4d8/i=4b6-`4+nC:vKBsH?tI@7>6180/7,4<16<228.14)25*58-47,46)46)35(35(46)46)-8(-8(-8(-8(-8(-8(-8(-8(.9).9)-8(-8(.9)/:*0;+1<,7C-7C-:A/9@.9=.59*15&.2#09&KTAbv[oƒhd„_YyTGmD=c:If6Li9Nk;Nk;Li9Kh8Mj:OlEb24=:)2/!*'feSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSibRjcSjcSjcSkdTkdTkdTleUkdTkdTleUmfVngWohXpiYpiYgpuluz€‹£®²ÁÌÐÓÞâàîîîüüòý÷óþø÷ÿôøÿõüÿïûÿîýÿêüþéû÷îýùðÿ÷ëÿøìÿ÷çÿñáòÝÈáÌ·Á°œ¥”€{tbd]KVYN_bWkvn{†~£®·Â±ÙÖÍéæÝûëëÿññÿòõÿðóûõõûõõ÷üõûÿùøþðòøêöøêûýïÿêÏÿíÒÿÄ­Â~g§P=¬UB¾RF±E9ÂG?ÂG?ÉF>ÉF>ÉD=ÈC<ÇB;ÆA:ÑD=ÒE>ÇF@À?9¬=6¦70•;3•;3‰<4‰<4=4€<3~<0~<0~<0~<0};/|:.|:.|:.{9-{9-y9/x8.z:1y90x90w8/v70u6/r6.r6.j8-j8-i9-i9-i9-h8,g9,g9,e7*e7*c7*c7*c7*c7*c7*c7*f5.i81k:3k:3h91i:2l=5pA9l@7pD;g;2g;2~SJ‹`W~SJpE<5<42912:/5=24:0.4*25*8;025*25*13&13&13&24'46)57*,7',7',7',7',7'-8(-8(-8(.9).9)-8(-8(,7'-8(-8(-8(4@*6B,ÉK?ÇI=ÅH2ÅH2¹J6µF2 H4›C/ŠE5‰D4D4~C3}B4{@2€45A77C97C56B43@/2?.2?+DQ=WeN\jSSaGGU;DR8FT:Hd>Ie?Jf>Ie=Hd;IeSoFWsJZvN\xP\wVVqPFaB7R3&.1$,/"*-heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVfeSgfThdYhdYkd\kd\ldWmeXidNlgQlkWlkWfgaklf{~…’™¦°±·ÁÂÍÕ×Þæèîòó÷ûüÿÿÿÿÿÿýüøþýùþÿùýþøúýôøûòöüðöüðöùðöùð÷ùë÷ùëøúâñóÛßãÂÌЯ³¹—‘—uhsUXcE^lUt‚k‰šŠ˜©™¿À»ÒÓÎçèãòóî÷øóúûöûü÷úûöþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúèÿÿäþÿùøöýüúÿåß쿹Òzp§OE¿F;ÀG<ËG;ËG;ÅC6¿=0¾@4ÄF:ÄG1ÅH2»L8·H4 H4šB.‹F6‹F6€E5D4}B4{@2€weQ}vc‹„q„ƒqLK92:-2:-2:-19,19,08+08+08+08+/7*/7*/7*.6).6).6)-5(-4,-4,-4,-4,-4,-4,-4,-4,.5-.5--4,,3+,3+-4,.5-.5-,8..:01=34@65A36B45B14A05B.BO;P^GQ_HHVIe=Gc:Fb9Gd8He9QmDVrIZvN[wOZuTRmLA\=2M.&.1$,/"*-heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVfeSgfThdYhdYkd\kd\keWlfXkiRkiRikVikVileuxqŽ‘˜¨«²¼ÆÈÑÛÝéñóôüþûÿÿüÿÿÿÿýýýûýüøÿþúÿÿøýþöøûðõøíñ÷ëñ÷ëó÷éôøêõøåô÷äô÷ÜìïÔÛܽÈɪ®±’“–wuyblpYt{k‰€§œ¬¶«ÍÎÉÞßÚïðë÷øóûü÷ýþùþÿúüýøþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúõúýúÿÿþýûüûùÿûóÿøðôϿɤ”ŒO<”WD¤M:œE2¶H9Ê\MÎTG»A4ÇA5ÊD8ÄJ?¿E:ªB9¤<3•@9–A:†A:…@9}A9|@8z?7y>6y>6y>6w=2v<1u<1t;0t;0s:/p:.p:.o9-o9-n:-n:-m9,l8+k7*j6)l7/l7/j8/i7.i7.h6-h6-h6-e5+e5+e5+f6,f7-h9/i:0j;1i=4g;2f<0g=1g@/iB1fE2fE2bL5kU>fZDvjT‚€k‘z}€mCF319,19,19,08+08+/7*/7*/7*08+/7*/7*/7*.6).6).6)-5(-4,-4,-4,-4,-4,-4,-4,-4,.5--4,,3+,3+,3+,3+-4,.5-)5+*6,,8./;12>24@46C27D37D2?L:ES2ÉC7ÄJ?¿E:©A8£;2”?8–A:†A:…@9~B:|@8z?7y>6y>6y>6w=2v<1u<1u<1t;0t;0q;/q;/p:.p:.n:-n:-m9,l8+k7*k7*l7/l7/j8/j8/i7.i7.h6-h6-k;1j:0h8.g7-e6,f7-g8.h9/k?6i=4f<0h>2iB1kD3fE2eD1aK4kU>i]GuiS…ƒnŽyor_:=*08+08+08+08+/7*/7*/7*.6)08+/7*/7*/7*.6).6).6)-5(-4,-4,-4,-4,-4,-4,-4,-4,-4,,3+,3++2*+2*,3+,3+-4,)5+)5+)5++7--9-0<03@/5B15B09F4;I27E.2@'1?&7E,>L3BZ8E];H`³P=²O<Á>6ÅB:ÃF@¿B<°?;©8499ž::>=Ž=<@>>5p>5p>5p>5o?5n>4n>4n>4l=3l=3i=2h<1g;0f:/f:/f:/q60q60o6/o6/m6/l5.i7.i7.j;1i:0f:/d8-a9-b:.c;/d<0_C5_C5_D3aF5aH2bI3^J2]I1ZN4bVJ]?J]=K^>SfH[nPbtZasYYkUJ\F5F3$5"$-,"+* )(heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVgdSheThdYhdYkd\kd\keWlfXigPkiRlnYoq\pun†œ£©·¾ÄÔÞàìöøùÿÿùÿÿ÷ûüûÿÿÿÿýüüúÿÿúÿþùúüñóõêéíßâæØÜãÓÛâÒãèÒæëÕéíÖèìÕëëÑççÍÜÚÁÐεÒ͹ÌdzÇĵÍÊ»ÕÒËÞÛÔçæäïîìòóîøùôýþùüýøüýøþÿúþÿúûü÷þÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúÿúýÿóöúù÷ÿÿý÷ÿúöÿùíþìîÿíðïÚÿÿìÿçÑɦ­dQ¢YFµR?®K8Â?7ÄA9ÁD>¿B<²A=­<8Ÿ;;99>=Ž=<‚A?€?=uC5p>5p>5p>5o?5o?5o?5o?5n?5m>4j>3i=2h<1h<1h<1h<1q60q60p70o6/m6/m6/i7.i7.f7-f7-e9.e9.d<0e=1f>2g?3^B4aE7eJ9gL;dK5cJ4_K3_K3]Q7cW=lhOvrY„mv{dEN94=(19,19,19,08+08+/7*/7*/7*08+/7*/7*/7*.6).6).6)-5(,3+,3+,3+,3+,3+,3+,3+,3++2*+2**1)*1)*1)*1)+2*+2*+7-*6,)5+(4*)5)*6*+7)-9+,9(/<+2?-3@.3@,2?+2@)3A*4F,8J0>Q5BU9EX:GZ7p>7p>7p>7o>7o>7p?8p?8pA9o@8k?6j>5i=4i=4j>5j>5q60q60p70p70l7/l7/h9/g8.a9-a9-a=/b>0aA2aA2_B2_B2RG3ZO;bWAcXB_U:ZP5XQ5ZS7YX:ZY;jnSrv[x‚icmT0?(4C,2:-2:-2:-19,19,08+08+08+08+/7*/7*/7*.6).6).6)-5(,3+,3+,3+,3+,3+,3+,3+,3++2**1))0()0()0()0(*1)+2*+5-*4,*4+*4+*4++5,,6+,6+,7).9+2=-5@07B26A15@/4?.0?*4C.9H1=L5@P6DT:HX>K[ARbH[kQap[^mXSaPDRA1?0!/ &/,$-*"+(heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVgdSheTjcYjcYkd\kd\keWlfXmmUmmUhmWglVeldszr–›§°µÉÓÕáëíôüþóûýöúûüÿÿÿÿý÷÷õÿÿ÷ýýõ÷ùìïñäèìÝåéÚãêØåìÚæíÎèïÐèìÑåéÎçåÎåãÌáÚÈØÑ¿×ÍÁÜÒÆéÞÚøíéþôõÿõöþõøÿ÷úýþùÿÿûÿÿûþÿúýþùÿÿûÿÿûýþùþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúÿ÷õÿ÷õúúøúúøîÿýïÿþèÿüåÿùìþòóÿùÿûéúóáÿìÖÿáË⪑ªrY³R?°O<°L<±M=³LC°I@¤A;:4•<8”;7†?9„=7xB8wA7pD7pD7p>7p>7p>7p>7p?8p?8p?8p?8qB:pA9l@7k?6j>5j>5k?6k?6r71q60p70p70l7/l7/h9/h9/d<0e=1d@2d@2aA2`@1\?/[>.RG3]R>h]Gi^HbX=[Q6YR6]V:XW9XW9imRrv[t~eWaH$35D-3;.3;.2:-2:-19,19,19,19,08+/7*/7*/7*.6).6).6)-5(+2*+2*+2*+2*+2*+2*+2*+2**1)*1))0()0()0()0(*1)*1)(2*)3+)3**4++5,,6-,6+,6+,7).9+2=-6A18C39D47B15@/-<'0?*4C,7F/;K1?O5DT:HX>QaGYiO_nY[jUP^MAO>.<- .(1.&/,$-*heVheVheVheVgdUgdUgdUgdUifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYnpXkmUgoXjr[gsinzpƒ‘”œª­»ÄÉÏØÝçïòóûþúþÿûÿÿþÿúýþùÿÿøýýõøúìõ÷éò÷ãïôàêòÛçïØïöÔëòÐëîÑéìÏçåÐÞÜÇÜÔÉÜÔÉàÒÏæØÕðââùëëýñõÿõùÿøüÿúþþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúýÿ÷ýÿ÷ýÿüþÿýýþÿüýÿûüÿûüÿÿþÿþüÿÿøðÿùñÿüéÿûèÿõÙúïÓ²„c–hG‹T6“\>¢^G›W@šM;œO=ŽA1@0‡?0„<-z=+y<*u@.wB0r=7r=7s>8s>8u@:u@:r@9q?8r@9r@9q@9p?8p?8o>7n?7m>6j8/k90j:0k;1g=1g=1b>0b>0]@0\?/_H6_H6Q?+L:&I8$A0QS;MO7HK0JM2Z[H=5B04A/1>,/<*1?(7E.AO8HV?N\EUcL[hVXeSKWI:F8.:0(4*'0+&/*&/*heVheVheVheVgdUgdUgdUgdUifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYlnVjlThpYks\htjp|r†”— ®±¾ÇÌÒÛàéñôôüÿúþÿûÿÿþÿúüýøÿÿøýýõùûíöøêóøäðõáéñÚæî×éðÎäëÉäçÊäçÊãáÌÜÚÅÜÔÉÞÖËæØÕìÞÛôææüîîÿó÷ÿöúÿøüÿúþþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúûþõüÿöüþûüþûüýÿûüÿúûÿùúÿÿþÿýûþÿùñÿúòÿýêÿüéÿ÷ÛýòÖÿäÃݯŽ©rT’[=›W@žZC¡TBŸR@C3B2ŠB3‰A2€C1~A/vA/u@.t?9s>8t?9u@:t?9q<6p>7sA:q?8q?8o>7o>7n=6n=6m>6l=5m;2m;2m=3n>4j@4i?3eA3d@2dG7]@0]F4_H6O=)G5!G6"D3IK3HJ2DG,BE*LM.Z[9F48E35B02?-1?(4B+:H1?M6JXAQ_HWdRUbPJVH;G90<2*6,)2-)2-(1,gdUgdUgdUgdUheVheVheVheVifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYkmUikSgqYku]hukq~tˆ—š¤³¶ÀÉÎÔÝâêòõõýÿúþÿûÿÿþÿúüýøÿÿõüüòùüëöùèò÷áîóÝçï×ãëÓáçÅÜâÀÝÝÃÞÞÄàÚÌÝ×ÉßÖÑãÚÕíáãòæèøíñýòöÿö÷ÿ÷øÿúúÿûûþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúôÿúôÿúùýüùýüÿùþÿøýÿóüÿòûÿøþÿöüÿøöÿù÷þÿóþÿóôÿìïûçûïÕÿ÷ÝÿíÔ×꤄k}]D‚V=aH’^HˆT>}F1u>)s?*vB-yF1zG2o?5l<2n>4sC9rB8n>4pA7wH>k?4k?4j>3j>3i?3h>2h>2h>2cB3cB3cC4cC4`E4`E4[F3ZE2^M9SB.VK5^S=OI1B<$B>%EA(=G,?I.=F)8A$=B"KP0\_@fiJ^aBmpQuy^gkPHP84<$4=(=F17?27?27?26>16>15=05=05=06>16>16>16>15=05=05=05=03:23:23:2291291180180180/6..5-.5-,3++2**1)*1))0((/('.''.''.'(/()0)*1**1*/6/-4-+2++2+.5.4;44+8.,6.+5-*4,gdUgdUgdUgdUheVheVheVheVifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYkmUjlTgqYjt\fsio|r‡–™¤³¶¿ÈÍÓÜáéñôóûþùýþúþÿþÿúýþùþþôüüòùüë÷úéò÷áíòÜåíÕàèÐÛá¿ÕÛ¹ÖÖ¼××½ÜÖÈÞØÊäÛÖëâÝ÷ëíûïñÿôøÿ÷ûÿøùÿøùÿúúÿûûþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúôÿúôÿúúþýúþýÿùþÿùþÿôýÿóüÿöüÿõûÿøöÿúøÿÿôÿÿôöÿîóÿëÿþäÿ÷ÝÿíÔÿïÖÿíÔñѸ¹t|P7|H2{G1~G2J5M8|H3q>)g4{KAsC9qA7tD:qA7i9/f7-j;1i=2i=2i=2i=2h>2h>2h>2h>2bA2bA2bB3bB3_D3^C2YD1XC0XG3Q@,^S=qfPc]EOI1KG.NJ1:D)=G,>G*9B%;@ DI)UX9adEjmNuxYsw\Z^C=E-4<$7@+;D/8@37?27?27?26>16>16>16>17?27?27?27?27?27?27?27?26=56=55<45<44;34;34;34;329118007//6.-4,,3++2**1)*1*)0))0))0))0)*1*+2+,3,.5.,3,*1*)0),3,1817>7;B;>L;?M';J3AP9GVCHWDBPA9G81>4,9/-7/,6.+5-fcTfcTgdUgdUheVheVifWifWifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYjnUimTfrZgs[aqfiyn•–Ÿ³´¾ÇÌÑÚßèðóòúýøüýúþÿÿÿûþÿúÿÿôÿÿóüÿìúýêöûäïôÝåîÑàéÌÙܽÒÕ¶ÑѹÓÓ»ÚÓÉßØÎéàáòéêüóøÿöûÿúþÿüÿýþùüýøûþõüÿöþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúùþÿúÿÿýÿþýÿþÿþúþýùÿûõÿúôÿúôÿúôÿü÷ÿþùÿÿýÿÿýúþýùýüôîîÿùùÿþøÿüöÿùíÿõéñäÓÝпʸ¢¯‡w`oYBdI6dI6iL:lO=hG4dC0cB/gF3iJ6kL8kL8lM9_C._C._C._C.^C._D/_D/_D/XG3XG3XI4XI4TI3SH2OI1OI1KI0KI0beJ|dntXSY=FO2DM09F*:G+>G*>G*@E%BG'LM.ST5wvXzy[nnTTT:@B,?A+>A.:=*7?27?27?27?26>16>16>15=06>16>16>17?27?27?27?27?28?78?77>67>66=56=56=56=54;34;33:229107//6..5--4,+2++2+*1**1**1**1*+1-,2.+1-+1-*0,+1--3//511733958I6;L9>P:=O9:L45G/1C)0B(3E-8J2=O9?Q;1*:-,6-,6-+5,fcTfcTfcTgdUheVifWifWifWifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYjnUimTfrZfrZ_odgwl•–Ÿ³´ÁÊÏÓÜáéñôòúýøüýûÿÿÿÿûÿÿûÿÿôÿÿôÿÿïþÿîùþçò÷àæïÒàéÌÖÙºÏÒ³ÌÌ´Í͵ÕÎÄÞ×Íëâãöíîÿöûÿøýÿüÿÿýÿþÿúüýøüÿöüÿöþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúúÿÿúÿÿþÿÿþÿÿÿþúþýùÿüöÿûõþùóÿúôÿýøÿþùÿÿýþþüúþýùýüüööÿùùÿùóúóíþôèÿýñÿýìÿýìÿõßÿí×öàÉåϸҷ¤¸ŠŸ‚pr`{ZG}\ItS@dC0Y:&Z;']>*[<(`D/`D/aE0aE0`E0aF1aF1aF1\K7\K7[L7[L7WL6VK5RL4QK3MK2RP7ilQ}€elrVSY=DM0>G*9F*9F*?H+BK.DI)BG'GH)LM.xwYsrTddJSS9IK5HJ4CF3:=*8@38@38@37?27?26>16>16>16>16>16>16>17?27?27?27?29@89@89@88?78?77>67>67>67>66=56=55<44;33:2291180-4--4-+2+*1*)0))0))/+)/+)/+*0,,2.-3/.40.40-3/-3/0A.5F3;M7=O9=O79K37I/5G-2D,5G/9K5;M7:K94E3.>1*:-,6-+5,*4+ebSfcTfcTgdUheVifWifWjgXifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYimTimTfrZgs[_qehznƒ—˜¤¸¹ÇÐ×Úãêíõøõýÿùýþûÿÿÿÿúþÿùÿÿóÿÿóýÿíüÿì÷ýãîôÚâëÎÛäÇÕÕ¹ÌÌ°ÇıÇıÏÈÂÚÓÍéàåöíòýöþÿøÿÿýÿÿýÿúÿøùþ÷÷ÿòøÿóþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúÿúÿÿúÿýþÿýþÿöÿööÿöñÿððÿïïÿíñÿï÷ÿöøÿ÷þüÿýûþÿ÷ÿÿ÷ÿüðÿÿôÿÿùÿÿùÿüûÿúùþõøïñôëþÿóþÿóÿÿïÿÿïÿýìú÷æ÷ðàóìÜöåËùèÎÝ̲¡vq`FbQ7^N4YI/ZJ0ZJ0ZL1ZL1[M2[M2YN2ZO3UQ8UQ8UQ8UQ8QQ7OO5LO4KN3JP4NT8]hJdoQQ^@BO1>K-9F(=J.16>17?27?28@38@38@39A49@89@89@89@88?78?78?77>68?78?78?77>67>66=56=56=538227105/.3-,1-+0,+0,+0,+0,,1--10-10.21-10,0/,0/':$-@*5I0:N5;O4:N39M18L04H-5I.8K5:M79L95H5.@0*<,,6+,6++5*ebSebSfcTgdUheVifWjgXjgXifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYgkRhlSfrZht\`rfj|p‡›œ¨¼½Î×Þßèïòúýøÿÿûÿÿûÿÿþÿùýþøùùíùùíøûè÷úçñ÷ÝéïÕÜåÈÔÝÀÒÒ¶Éɭ¿¬Â¿¬ÊýÕÎÈæÝâóêïýöþÿøÿþüÿÿýÿúÿøùþ÷÷ÿòùÿôþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúÿùÿÿùÿûüþûüþõÿõôÿôïÿîïÿîïÿíñÿï÷ÿöøÿ÷ýûþüúýÿöÿÿöÿÿøÿÿõÿÿöÿÿ÷ÿüûÿúùþúýôýÿ÷ôøéõùê÷øæö÷åùöåú÷æÿùéÿüìÿïÕÿúàìÛÁŸŽt`O5RA'XH.XH.[K1\L2[M2\N3\N3]O4[P4[P4SO6SO6SO6SO6OO5MM3JM2IL1IO3KQ5Q\>OZ<K-=J,AN2AN2HQ4IR5IN.IN.ZY;jiKgcFa]@]Y@_[B][FXVAPM69@89@89@89@89@89@89@88?78=77<65:4271051/40.3/-2..3/-2.-10,0/,0/,0/,0/,0/#6 )<&1E,8L3:N3:N39M19M16J/7K09L6;N8:M:6I60B2+=--7,-7,,6+YgMYgM[hN]jP`jRblTfkUfkUehUdgTgfTfeSjdVjdVkeWlfXjgVjgVjfZjfZjf]ie\geVgeVdiSfkUdp\co[`qkq‚|”§®µÈÏÒÛâàéðï÷ùôüþ÷ýùøþúüÿôûþóöùèøûêø÷ãñðÜñìØíèÔâÝÉÕмÛξ̿¯¾±¨¾±¨Ã¸¶ÍÂÀÛÒ×èßäùôûü÷þýüÿþýÿýþÿûüþùþúùþúýÿþýÿþýÿþýÿþþþüþþüþþüþþüÿÿûÿþúÿýúÿýúÿýøÿýøÿýøÿýøÿÿûÿþúüüúýýûýÿþþÿÿýÿþûýüþþüûûùÿúôÿý÷ÿüóÿùðÿøìÿúîÿúÿÿúÿÿþüÿþüþÿùþÿùüþýüþýýþÿýþÿþþþþþþþÿïýþîþýßþýßööÞüüääâɌŠqUP3UP3SM-QK+UO/TN.SN.SN.PO0PO0PQ2QR3NM1ON2OO3OO3LP7JN5FO4DM2FP5DN3AJ+=F'@G%CJ(GM'FL&JY.HW,DP(AM%LV4ZdB_dFV[=ZZ@[[A^ZA]Y@]W=[U;YR6WP4JE/HC-DB-A?*?=.@>/>@3?A4:=2:=28@38@37B47B47D37D37B47B46A36A36A36A37B47B47B47B47B47B48C59D6;F8;F86B86B85B14A05>-2;*08+/7*.5./6/,8,,8,*=-@"0J4N8[#8[#9X/8W.:R::R:=P==P=9K1?Q7BW8CX9@X8>V63K1)A',6+)3('1&YgMYgM[hN]jP`jRblTfkUglVfiVehUhgUgfTkeWkeWlfXlfXjgVjgVjfZjfZjf]ie\geVgeVejTglVdp\fr^fwqyŠ„˜«²¶ÉÐÐÙàßèïï÷ùõýÿøþúøþúûþóøûð÷úéöùèôóßìë×êåÑæáÍÛÖÂÏʶ̿¯Á´¤¸«¢»®¥Â·µÍÂÀÙÐÕæÝâùôûü÷þýüÿþýÿüýÿûüþùþúúÿûýÿþýÿþýÿþýÿþþþüþþüþþüþþüÿþúÿþúÿýúÿýúÿýøÿýøÿýøÿü÷ÿÿûþýùüüúýýûýÿþþÿÿýÿþûýüÿÿýþþüÿüöü÷ñôëâíäÛôèÜüðäÿúÿÿúÿÿþüÿþüþÿùþÿùüþýüþýýþÿýþÿþþþþþþþÿïýþîþýßþýßööÞüüäâàNJˆoSN1SN1RL,QK+UO/UO/SN.SN.PO0PO0PQ2PQ2NM1ON2OO3OO3LP7JN5FO4EN3FP5DN3AJ+>G(AH&EL*IO)JP*HW,IX-Q]5Xd@3?A4:=2:=28@38@37B47B47D37D37B47B46A36A36A36A37B47B47B47B47B47B48C5:E7;F821=11D&8K-?Y*F`1Nq9Mp8Ji@Ed;AYA;S;;N;9L9=O5CU;H]>J_@IaAE]=:R80H.+5*(2'%/$YgMYgM[hN]jPakSblTglVglVhkXgjWjiWihVlfXlfXmgYmgYjgVjgVjfZjfZie\ie\hfWgeVejTejTbnZgs_l}wŠ™¬³²ÅÌÍÖÝÝæíï÷ùöþÿøþúøþúøûðô÷ìòõäïòáêéÕáàÌÝØÄØÓ¿ÎɵÅÀ¬Á´¤¼¯Ÿ»®¥Âµ¬ËÀ¾×ÌÊâÙÞìãèúõüü÷þüûÿþýÿüýÿûüþùþúúÿûýÿþýÿþýÿþýÿþþþüþþüþþüþþüÿþúÿþúÿýúÿüùÿýøÿýøÿü÷ÿü÷ÿþúþýùüüúüüúýÿþþÿÿýÿþûýüÿÿýÿÿýÿý÷÷òìçÞÕÝÔËéÝÑøìàÿúÿÿúÿÿþüÿþüþÿùþÿùüþýüþýýþÿýþÿþþþþþþþÿïýþîþýßþýß÷÷ßüüäáßƈ†mPK.RM0RL,RL,UO/UO/TO/SN.PO0PO0OP1OP1NM1ON2NN2OO3KO6JN5FO4FO4FP5DN3CL-BK,EL*IP.NT.RX2M]0Sc6frJuYnxUV`=KP2MR4QQ7QQ7QO6QO6VP6XR8[T8\U9WR3;>38@38@37B47B46C26C28C57B47B46A36A37B47B48C58C57B47B48C58C5:E7;F8J@>J@>K:>K:@I8?H7>F9=E8=D=;B;5A54@46I+BU7Mg8WqB]€H[~FVuLLkBC[C9Q96I63F34L2/9.,6+)3(XfLYgM\iO]jPakScmUhmWhmWjmZilYkjXkjXmgYnhZnhZnhZkhWkhWjfZieYie\ie\hfWhfWdiSafP]iUeq]l}w~‰“¦­§ºÁÇÐ×Ùâéíõ÷õýÿ÷ýùõû÷óöëîñæèëÚâåÔÛÚÆÒѽÏʶÉݽ©»¶¢Ä·§Æ¹©Ë¾µÕÈ¿ßÔÒëàÞóêïùðõúõüýøÿüûÿýüÿûüþûüþúÿûûÿüýÿþýÿþýÿþýÿþþþüþþüþþüþþüÿþúÿþúÿüùÿüùÿýøÿü÷ÿü÷ÿü÷þýùýüøûûùüüúýÿþþÿÿýÿþûýüüüúþþüÿý÷øóíêáØáØÏîâÖþòæÿúÿÿúÿÿþüÿþüþÿùþÿùüþýüþýýþÿýþÿþþþþþþþÿïýþîþýßþýßùùáýýåáßƇ…lOJ-RM0TN.UO/UO/UO/TO/TO/QP1PO0OP1NO0NM1ON2NN2NN2KO6KO6GP5GP5HR7FP5FO0HQ2KR0NU3U[5[a;csFqT†’j›s…llvSZ_ARW9OO5MM3MK2LJ1QK1TN4YR6[T8YT>WR3;>38@38@37B47B46C26C28C58C57B47B47B47B48C58C58C58C58C58C59D6:E7;F8F9=E8G6=F573?34@47J,BU7Mg8VpAQt++>+0B(;M3G\=OdEPhHLdD>V<1I/+5*(2'%/$ \ No newline at end of file diff --git a/testimages/testimgcrop.jpg b/testimages/testimgcrop.jpg deleted file mode 100644 index 18fa0b1e5b5916ed67b363335908c5ad53e7ce3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2662 zcmbW!c|6qX9tZH>m>I?ph8YRjMz%rLN=RcHTE<|EU0Jd#1_@E9Xihn{Ng`w{GdT9K zR66MxWFL`jlFGgvWGN|E=iJx5uh;$S-uro8&-2goeZH^n`}ORN>`ekfXUr|l0T2iP zK>G{W8wX4P7&kYRn`b{TemIPmm!FT1{{T|_Fj7!N_>jDeq@?&^DQQWxs+^3Xx`wLq zaV1G<9UUFb6NY+<>IPam+FC!GfOvmCtK)^z=Z&T z5um+RKze^pDCn;M{|tx=4A~zS#tY}$FJKA*Tp%!*3j&5hA&~v*nEiVIf`AIkYGS!X ztlfF!LXcW3l}{oc1Zk)f})bLijMBF<0te^nwXlI<18%C z*b?nX_709to?e%{eSH1=L&L(aMqG=GO1O3VPGZtsN?Ljb^+D#ttVad3!lL35I-|6v zwvJif(Af0!)gP^_w)T$Koda(Mhu#j4jE;Ty_-Sf-W_E6VVQu~M#^%=cm#;fNT_6Db zH*5d=8}=VA#J-CQ0s%vKe!4(h5&IjAfIww6xrMRTJnkVPa$0dPq;cw#>K0zKw#_Qa zgUp7D%IkbMvi6hqm+ZfT#s6Qjf5HCk8Uy&jp#9GSBLE}dv)CQHO7NX*xLtle$tJbn zEwCHfuNyx*LsIS3~-@8-%^lt_)DWJLH_mvgY; z3ap?JF?rHC%oMk=7N1YE$KY@S!GAOv(+(0P_5j( zW$ucr8ltsfVavR zHUiDp@ACqqGL%+4Ur|z<;a*r4?dVsWr`g)eZ5ouoSv7K^zYcbWAks-wo^p-7hVyK6 zmxx&MI!`wbfrlAfAA@8t&h(lJIYqXXT7WC%5rfghevAH2LP~kgR8Gj3!4oofY)rr@ zW|pcw1P(U30602{%m>qlAFeuJmh$)AZbN!fz(_Tgf(VJdCa;SbvBEzhvxSMivF8fINX-PtUp!GKpm!)ee)#dTA5{edt(kcHZmd4otf8R{sh$YS4d4_lu1fD}D!t~bz;%eu7*;hzf<|LUi zVM9UxFs-xT@>ETdREDa9OX}NPv|U?d==eZUGyWkVos;sguq$XJw6EmDnHtu#K`h~Y zD)Sp96pO*l+=L&6+za_?cb$5rG$$76pT$-pw@-MAC1ZDSMdqDWoIqmd;xpA}iN?xZ zp-3MonbtNy>t<_Bim%(D?8T*bgiyJ(l z->bjMyV*b0SP&ejw5NPQxAx_~j}$o;csYlcXImow%Gy??KjaupuhN|A7Cv*Gbd-ON z7&71g6`OB)7*_^=F4R#X3A|gV?o8<#l%zB;-}MS0cR5?!jWZj#=0wWORjep+xew)c z(^$fQDt+5H8w)ZLH5w>tGPiWK>=giQ9!}aB*2!8XxKs@iTLRN__W&0{iNwgxjgu6i z2$2zR`aJ8baOAUBTpW)anQ{U3r0~aqp+Bt5m6*5xW7(yZjsL-<}%}EHX3*D%N*xyDrnH zMgs-vAQo)N)#8&M{|)$*Q|(-OF|DhSEjuP6$^SMvcdOdeJM>$BFlf&32Q!y)s5eR= z#B{wzc_g@1u(K|qcCd3rBU77wP`v`$(;8UT)M&T4t6ZRb#Bw@ZHW+Ue`Y1MTy4$Pq z;_`Ra?~pi!>vhgGrjs5eG*5S9wlY*(yQ~*<9BPc7i_j4F!mM&vFk!4q6 zZChMPW{}z}WReB^I*l2pN>D))FfT37Y45vuj$*<5mGL>p{C^2Z*2s}IIg&7dWQ3_Ii;9PFUg~Zeg1li zr|K@+RzW2m3uhGnDT8_(OABc)_WyeEW**j2yVJ{~y_qP|+;?2snoO=?oS=`^_$^(d o-w&tFDzLbVYY&DQ%!pK8UktM^9#0enEot^fc4 diff --git a/testimages/testimgflt-nosimd.jpg b/testimages/testimgflt-nosimd.jpg deleted file mode 100644 index 462f39b20d6a507dff237e620fae9e0b029f5c28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5755 zcmbW(cTf{dn*i`Y=pZ1yx6o0P5-Cz%K)Qk<5KJg4ozO#%s3=WBXhJBVmjIzeL+C|8 zI#Q%}r6X0Ph$6n6@Auu@&D>vi_w4M>?CdkU`K$*Jj?*}3_Z)wT7F&8^SdJKqkEj!(Xy{`h(J zkBbTb{5R`Q`)}C)a9#f6qNbq%($N3oqM{D{Q-POhXvLN2IP@U&4+A(Ql%Fwh>8BQv zI~hSLR$sZDP-9FylBz3G-~OTfOZLBmJ^z2n{tNcsu6Y0pkm}Fj0WSk|0f!sNkTW+q z235R(^XZY%H;52M#V{^lef%5bphsP3>_O940Fi4_@U`5ah37ryctu*XS`K94G8Fd} zDP(R`%JK8@B~Qc>kGdNv!o0_!K1<|e6jlJ8=vWncypX4F+Jv4AY`Qm4{lnKxq|LgK zm)fLP0oSv5W|(M^=3tUwZ8151KIuITvrF=fu7%oSGD@Zu;BttjSVMG0>`V< zp&oaXiqvbaW|!4Hd7k9O?UkJmFQ=&@C{0@5t_!pm5WmbhPB8K8*QjE;F7GPd!>$^} zEz*Ur-OK_=NB16s4hMvw#g_zKZ1uccJ^egt?aQ-O5(lGG0Q8cQ^^QNwOWpQDLdja8bhGQ-8Zy-A;JMo(` z%^edT*smCRfZDsV_`Zqr4Rp{1T>zL~j?9^JO5m(@l}?YjA$a7Lhzy%mo{a^*{e6qy zf&M{iOklLhlrT9H~j2 zZfd`8{3!HF3Fd%f$9wthrko`6wX@l=z9NX7zGcx!6S7Vu4fZqN-q}?PbEA=fzCC|6 zW^?10e93inxlWPQ=Bi=po!$t(^Zuj5{t~g@j}>gJ*LyZ_{%7xP){R$oO;_6NV(k?* zZ6Eoe7cb{V*#zmbIkdmRe@n$JJ2m>8D@E)T*#b_!R}&aV?L@TiHSA%AL&jg;JFa#> z-ub?NOxo9ybiVz@v?t&Ri0lPNTvu0}QsWN1<}SN4s+lsdsYYMJ-Td8PNw%^@(~lD` zn6f;Tl~2g{SXIe|Y+VddWp{CFabW%{0n&J7O>#zwlbtr?BU^6dpeE36d5zz?E(U6{ z#6KSwr3kw6Kr-3Det0u8)KeTT0X{I7P(Gxpc7U2=j)laA(ctUXpR&dxOLoGRVbE9_ zQFK-iiDLD2XiEnHOp2w{sNPrn%l968dmQ>miR*FNX?`3`1ZQ@*QA!%prHrh}3BEp| zu7=N(10^f;i#{7e9fBI!d;DtoxB`-pxFNeH-FF%tYv2Jyy=o18;7pe*IK8>j&LSrr z4xepRx?*7pmh|BNOCpy{`|HcIW3YTWB%1#eyw&ii&SPmQCEU<-VZ3x!e-F5nd`yhu zqW8CYk|)QpY3*dwKYCYF)am9pO3hka_!i`u!Ap8>MGi=d4qLG9cySPFR^C>4)~R?n zZ`creicYjrqYe|>k|4DXumFd|Gb^uuMi$vX24uEj&xs9*%sff1{kluu%TrzC0kCZA z-XKSFb|13cyN`J@WVrxQ`YmgbxQxl%7j3o%rJ&@~4g$+o6n)D|AGEkPfwjy8uO{Ow z3{V0(47-R;ty`p~0d?@08BBA{!CWs(p3u4$^+{(+xLa(S@;d!D1)a4fw%;L^TYzp9 zy4}CXQK1|#IbL5{+Xphr!7IIFTnB!vLxq0W=rPMB4&2$E?koObSlBiuA!QrJr+z|; z7c;p4L_e|FD7aJ~?$VS$l_PFn&;{NF;?5OFIS~yy5)}KH*r8aDHH8cy_aHJ~B*CWn zCl|YR6)7zG#h|65d_DFORf^ha6EVFSd+f2i@fB;TAg7n&L0a{)4TqB_$1InWDLPIM zF6lp{nQShEscCvEaZ$pc+GjgDRo%qy6?altA{6#zW;B{ zsatMp0Bo*6ORAwlRs!ID33^hCcf+tzP+xp?Eb4!I737t*OT zr!8-QS zsUZ|k6D&p++iEo1m}mHQm{`8+z!qD|aqB~VRlfZ4go{P`_Dz!yNzxoq;seYt1F(N{ zQ`?(Lo(2^C%$KM-dm3ZkPRXwtEM?S2RBW4ybk z?=wQD&IzFc8IoexnAs?1?d&r7I8ogp6x?Nl)A)7kL~8^tmi0D8Fw_d$BtaoS>o)5T zPWT9Ie?H67hXA4c^zFJIq_J|!gZ}V^McV|c+>+++>RJ&>cQ?=~tm8nnEKEof;5k|p zNv9{@5lc@afH#qfi8mmpa|BK#c~Z<8uhdrVp{{pnaqiz692Vx9B#z?t)C-iQ7A>G} z8wol*Mk$OsHXxd$MW-D3o(;o|=1<9a0Usu1Pz5VGb3GQsyw~Z@;XG25u*I17MZXf0 z+b5Ez@fFi!*{;tmObxA=w#Zw@=V#CwzmFeP6-&?s>8VH8e!v>%O>0xLvzqy7lT5(X zPK~#;Zk0BwC@PW^sjG~S)V@}H**54pV&Ckn1bwi{1pvzxluW(3p;<))>SSx2)XURWmO?+F~Q=knpr(!1eG0q=s`RERCf*h%RnE+&fci6DvHYHK}2b zGtTJ0_b_>cg`IVSGM~j)7n2ON2s{+=jCwBbG7?=}+H4aiF!8nZS=Al>gXrX=AJd*y zEwXY%bANT~7tbG$imusMt}6BRWh)4r;rfOGMv)s}&u4gM?=_i67XZs$yHJ&QA+q|P z=X|_rcaFAa!l5cRt#6_}R5I*mkDqg_b;jX&(tJ-tN0Sy6jHWdi(J}t2ZQ*Y7IxHRa zYeuy$M2FREXacU3gft~NswWs;%b4B84`i&rVuq{5u5LGE^Ianon2+osh!lI~)20y3 zqV=sBZotHZ&~p#cXtj!6){PklWv@^RoH>tnRgRr4G!+rzx>mEgTAHJ&xbIwOi$8dJ zRc}_IkYY&@+w&4NY)ZV(O6TQtunO*?TWvq%_H2n5$W}eDQ+pXiGiA3>#(rb7a=${K zynY$q*VgX!+~&zXYBhj8+PhIT+D`r^Ps-~PQk+@37z|pMqA9S2GXnhM;!q^wylj*py;lAtYdXqOYa)(1V|~y9wdpL$he!@KmHWvC zHhGW96wIC4l{Kjo1=S!sbcUTuer()a*q(h_farZ~5FC-3+&XmuSQ7R^tll0R3is_A zZzy5DNl{;YIJjet1_^fa_A1<`7(ETYc5UzNZ*;zy*8W2pifD&*8FQl91>k** zBRu!0_o?Roxvn#7WZb^AQUI26#~nDHD}^MlYS+!bMY~jSDwC@>W^o~Y*ygwN2NoTFv~m=MRU26{do)R7AYKSn1ngb zN0+bG?h8Q>j)){>T}^pkW2Nrj*^lMk1Gu#n6~?udDw%|$qAbH*g6Hj5u@FqC*R77C zo2G*9k{D3i{naW|w=hF>_^J|_@MgWWCUMu)Dbt^o#~`x#i^;dF+_WFlz8P3)UV15K z4dAcgSzAj1sr`biy#)EMYq~Y4Xqj|P{rvvV21%#vO10+11R zNOFWdia1qqXs`#)euJ%~L^V?3S}&(s=@hU;bAp!90QsOKb>sfFv-~@DMqI>U(@#z+ z&8U$@Q79&U%jQl;)Mt6Y#-VZfm_!?3Em&D`XV!%e+XFZb?;Yk*PwHXXpIZ8)`& z@b-Iu>#d)6w<-7}u#v6Xv|P15s|mNB-vVF%Ig-)cll9&vLGKf^woHeo&D@svL1M*| zvWfvIqwzpUT2tiB=}P)EJ5IS)ik&%b6=MXA5?{z)x0%#=n`adhvVxY!+C-`PmuJh} z)Z_0%Ov`Q%p-WSr;}*kW-y7F?1SJG~&lGLTZWY)h`H{YG4QN$&pJ?nNC<_ZqxD>tb zVZ8Yk@Lk2j6)7o+yX0~JQzcTtm3Xu>Bi`V5{NnH8*4-ewB^}(>_bpCw?JV2E`Rk8@ zK;x9|V+o>c@)ZD4Ivr7_*^g#|N_6t4wtVN#cPMpB9UXdVwqbTgDL~~?Zo7K-qsJhB zZe6=y4foi?*=UHlVX#QzyNqWRKvfp9>qG7HRX%pI&XNLAl+{;;%qBtI9nAgq>wyA< zL0tLwfbi~EJXM%|ve{Ip6tO^i?ud?9j(j4Tz3eP;%T6l@Y#5wSk$jWy5lI*Km~GXM zZGI<1IXo5EM+jrBDsCqcrK-*D({EIB+?gv0bCRFnrXp)?cf3cEO=`9u9(0|)~*)u#+BH8(JE0d zOB+T^9{*~W->&&0=0Oln*4NfMkWUKRY({9$!mv}TgP~*J+5&drTQx|>%Nxrl;EW|N z6UV+xtf_U2z#S>^!W4yDNjJJ>xME_IvhcphYL`s~u%u5sbVpX~b%&^#cw_1&z2|%> zkIwVFc$8Wuz-7uj(TESlRJB&9bp)S5=a{A^$mgjnPKQUFXn>330;4Y9FIY!n$6)&uq{%wK#}{W$^bXj64PyD`uo)+l<58LqAW?njUC2C`aV=exB1H=o z z6QH)0dy^8EU9b>`0=Die)P5%!ePFTn z!`585Z=R%8=6mv%hM5Uap9^{#p6Tji1fRcJ)6z??2lFVdmmHa@^AbjWSoox0EAzEr z6}rQQJiO2GL;9C~2>#M3%(yf%V&LzuqN9XIknQP|$icvmwN<8;lRI5bJ9nS#PLPkl z{ZdqY7WKJn_|rVUm5-UkxQv+_wwFfkx-y>L|Jvh^NPd?X!Ye(s?`zvIGyfFyH+Y0N zD4>c4E7k4nQnZe-6a1ED)6+p$jsMCMpY%D;3}`kw@lNiTcH^7!aM~fQOWx%@JSCbf zhm>2=NDl~?{$6oDWHWP9={EFcW@Hi+62Vo}63XHO#espOp0j)fiMb8(cbyzp9w~pxrT<5sukF+Dsd)=+pgqg{& z!};7bv>;F%|F&UJAWsOHWnwVWqqup@UjV(@pryVLEEz#<{mqcOR7X-iM`XoaNdSFA zqsIw}#(q-9QjKF|tD2S-lgmqMe~yB9v}W$M1Bx+C5mH0J;;Ik>DS*bXZS$v1&w}j8!4l ze^pl+FL6s@A?+VnB9qNzi3RVvzh6aGzurF_v(-tDRM_6YU{^5;>gTe<-hq1^N^2*@ L7==LS#oT`Y8kEhF diff --git a/testimages/testimgflt.jpg b/testimages/testimgflt.jpg deleted file mode 100644 index 832f4ccb08fae0be4c04d1eebcfa5fe3897b35dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5753 zcmbW(XHXMdmk00=K&02uI{|?JN|Pc*K&li&@6taP*PITP}8u}(z444a0|%%pL5j%V7v}M0*Is}f&d^R2`MAV zRUd%w?>)&${uRJ~h6G4TMt+UrIwckL-vK-W07ybg3M3;XCnqEOJ01PE4vAYg z*UM9#V<<|5oBP zyxcdMLl!z&JKKa}E}MfvMNAES? z&ASbx@gR*@Av(+g*r{C1_Q0b+$WeczHKad(;i(Q_b53F1w8q?FrPHcPG9@zp1$U)i zf53B$L7q$@PvnHtJ1#Vr2jc^+ZI!YluAri0-d=8p&NHb6A^Y~LcJ z*6(GrU(z);#5=5>{;u6V*WWsUgEuNfXQsTY~I41sIv9tMt5wlrU7c#N7q@8RWu2yzfy> z+xY;I_<=K_lVNVNa#}7oD-9oa?*OkR`CeG4#~L9r9G|O-sl6^3on?$=2%!lCJboYomjV3x__{!Wr7h zeqGy3==J-2_G1C|;U2Q!D*#p2#KL`ML8Q65^yL`{ih}L%-k>)vwlGG$9_Tc32B>#uj)CD=zsm&JvggLyp2}%)6A27msV3 zT}GywDgeXzcLZ@=!!)F00(o_}c41`}(BT`OEuW!VQ>j_g+=tXxeAi~)HxA2-c6}LP z>L?h5z4jfX-VR+WwXHnPUq-JX@(%bq%!M-G;@O8m)$3CJ)s;@2p6&7~23(Tqs9G&J zr`q*>+ijJ5xb|U1`6&ZSWun7a!ElWuoB)E79HPN z7*sL1@c5(=6Gw4;3N1;7!eu);r#|J(Yi;W&MIR!jk>Q2g@Ue=pX(UXUtjIL0xj4~k zI+GDPURo+B`${tdJ8#lE3O6$hlA+$QoC_Q4g0P%#CZhUA*eq2=c#KSx#;thdw6w zT#qB?NK!dnEERg5k`eK$@Rego&A8CvqkP+NTl-`i?5`nxV0iDQ|L_kwFK<@ON57S4 z?s+HxQi?b`GqoZ4F8~jpt^iaq#ZBlDQ&X?HX;w>9#T!D4#Z0xmDpTN_WLTCL31)~W zSJ)0m(8tAQKh%TgTY;g{WF>#PJ<1tcBlzidgb+C?@Co%|O18pyIyKkDItITlVag21 z4qVbEb!LN8w6_IMLQw3I{L3FvP&>B#%o`6VoWFjxIhm;Km!YQj7k%VoMlsB~HSQ*K zsI&O#PbW$V2zK?iD$ObB-bpw4gBMTY9F!?tm5nMi;SW|XJ*%x2=JN#90FhWUBFq0I zOr!&~8rT6P2Gj-|)xk0Mwye2-i!qK4v0v^LW3i>OR>RfoEiGenvuA0Oq@}svRUPUkfvh30Zk%UN`FB1n>l45 zID2IvaXTFG>hm8Ee7#jie+{+cf0GvXoshcF^UEisqN7Aa+}bwv!qehtZ~6|8v1f-n zc?X~ESz$43V8+-}bM@(5^1^7CxWCoF;l?X1|DhlW-1s4kXwlC{E}p6_^wH@UY$7ml zJKL&~Kq@|za{KbtZG_)TfRD+2RD{FE>8+A8%^KNeD&{$4@vDpTrXv%fRm3T#!0mnk z+XOeC0i(E=&#zzQ|X1snvVize~T-A9k zkL>4cZW($}!++IrITo6l4ZV^b^-z&B@N(dJM(MDNBvsJ-LX4*G^;LRi)%p2-RN2l zG7ONNn*rv{pUWytH}F7z(paf_Tzt7{1k*V5p618|?+TF%HZ!eJvufCg8p;b)GXArg z^Ua3yF8I573e%lHgfE5-$(FklqZTr#^`Lma>VIQ&Cr>Rybg?%3OP+fUviBRU=~n{KR1{IiXS z6^3J`tmU!x&h~aHEZ^9tcNK4|ZeEa}Zp|^t1*8Gb`E1=Zgfks&20p;y#zuAy##;U( zRE($GJC{`R+!uAgDtoP zubqH%g1X|ZyLWOYVNNd7tg1#zlS2{Jbl1_@%1nr?ElX}6lXr*LuyUTAOzM+Fn`+$d z%jzo0o^?|}%1f0esTS%cysEfxsz!N9sO!Q zJvIML2_kFcHlTzS=?LGDWO-xfit`b%%j%YNTjhFDz3ArjW+3P0c%U{+G*}G zaKb$sR~w6KtdC~hkdIR2z`p28nxo-DT<%&_e?Ap)``F>Ts{eu6BEUcY?h*>qT1GXP zq2t4Qa*m_4_=z7)?$cy!TApU~t^H!F`F^&ONBlvojq&u|U7r#Q@XV-BX*2L`MC=;f zvo|p!r9aH_UJUx#t}bup-->&wUc)`1Ik!q9BQ_C6KYQF zHKF=TX$9Lasm20Zc0QYxgOpr{c1dbN&G{<@1?H(~qP_JdkNJAckNbC&Bn1W2Y>L*X zY=m1m?pt{BY{gswG|XFUc}6;Gyvk{OxlbNHP=*exoEmde*=36o1NmC=`v+tucOi8_2Dj}>LHR^S5lrFtn*#nScX(5)`?L}Yzm01F z-4#4)_Z`9M&^KvZ9wH!>#y>((aTRlo`(9C{RO=zu$~g$7*UCPbS~+gthe+{lzo z`mYMk4k})Gtud}m5}5ZXfAFI=4!hB}A1qaUg@k%|z{SM1uFVRC_Z*U|+^zXz%Qw;y zVRLZ0JRZ96h~Bl|E9M;2^t9qSpWx|UguEZSX^s4i=%k6Q z(L0Z#jm2*iTPOhOU)K76k|`>R?T3a9Z(ubyEe9XpCbH+=Z;amDoEdVr0?^S{xlyu* z)kyZ5m2PQOPrwvsI2;PCs~fK?@mr9;^>r0Gt`#n>RB}ZjDWZ)>^1s<0OWHd;yIuAJ zRRKnF>5uCeZvej9*76$p8de{U`$<_L#5jy;68#@%T0QvjC&U1>^nABY+LC7KU5Q)e z0huR{k99?El}VUYIbYxgmn830*|g-~qJ7MX#}^+|$D6KhGw?|>Ghqh{n+ymDwbY^d{(z_~S7`uNqM)$+eSuvu!xv;8I{WjM5uuqVU3KZ-5F})8B6Le30o!#$TQ$IcfI&48~PPDYcjMsU%S|5-hI(@7uBW z_~S<}!C|j-z~t+2RfrW?Zgte9=NM;oG5TAKXKYF`qwn#D8PKd$xyl#k!}dQGXX?q_ z>OOVW!`t`hd68?%IK)L~Wp1Nb6kl$GzJf>UdJ@KDEnBb6IkGbj1Z_2RtA2uXWJGc! z4!UXAybf3)!x?gwa1+=r{t7^{1QYdWfcOQacm1M^{;f`h$WiXQXozUCObzHhN!dV| z$orUmJUqixw{^#s=Y*WvyO_ebOB`9>jW<;L+i_d2xhUyAZ6v zV_rvTVbfi2xtxS&cd<;0OAJM(tSkdA-W_#~+4=Q^%vNEO+LzDX1ENI}R(11vYG4`G zKd3^5hgR)LvMr?K*`0^PU!^@g9rtwD^Aj> zCbB+sUfvn~0+Ly5#6sr{o9F?d%Qa{gbHo%@CJn|w=!zh8k8}~|63^l3)!Mqx&O>ffjv!>;v7D+8!Dt0UQw^2A zdy;HYtBM(py1!O<=Iwsg9|aRX?0(eT~XfCtaRj~K1CLU9nhoC*o*eB@y2R4e6|tA zWV$&QZ60eIn|oG)rp9a*`(#bTNy-sB+CAR;i1{O;A0hLI(yX7wGUHoDo$ur4MSb48 z^E;qq^qy?g$Sn#3(Q+K|X{TCA*65B(iuI|3<{1znzJ8P^O^Bb;rpW>9$UE*lDd3$G zmmT8SEzfD?4wJa3^v{9b`@^$uD8pxhSs zlr|LDgysu2&z07>yek7#6)mrRLd`snuWNeWHmYs^!xZqUCRbb*AzDv7s*rD-Yz7Rb N&mu&z<0e-N{{eC$y66A^ diff --git a/testimages/testimgflt.ppm b/testimages/testimgflt.ppm deleted file mode 100644 index 78945b6..0000000 --- a/testimages/testimgflt.ppm +++ /dev/null @@ -1,4 +0,0 @@ -P6 -227 149 -255 -0/-0/-10.21/40-51.62/62/83/83/:3-:3-:3-:3-:3-:3-:2/91.91.80-80-91.91.:2/80-80-80-80-80-80-80-80-6.+6.+6.+5-*5-*4,)4,)4,)4,)4,)4,)4,)4,)4,)4,)2-)/*$/,%/,%0-&1.'2/(30)30)63,63,74-85.85.96/:70:7.A:0B<0D>2F@4IA4JB5KC6KC6MD5MD5OC3NB2OC3OC3PD4RE5R?1Y?2b@4nB5}E6‹H8™G9£F7¯G:¸G9¾E:ÅG;ÇG>ÊG?ËH@ÐE@çFLíCLëDKëEIîCIïBDñ>Bô=Aø;A÷:@ô:?ð×?<ËA7»=/µ@.µ@.´?-´?-²?,²?-¯@-­@,ªA,¦A-¢B,Ÿ@*›A)˜@*–A,”>-’?/’?/‘>.‘>,=+’<+’<+”?+”?+”=*”=*”=*•>+–?,–@/–?6•>5—=2Ÿ?1©B3³D3¼D4¿D4¹?0µA2¬F8žH;‡H9oA2T8*C3&=5295495473271160050-50-72/72/72/61.61-50,50,41,//-.0-//-//-0/-0/-2.-2.-4+,4+,4*+3)*7(+=.1E69P:0U?1^A3jC4xD6„E4’E5œC3§C4¯A4µA4¼B7ÀD:ÄE<ÅF=ÍC@áEIçBIèCIêDHíDGïBDó@Cö?Cø;A÷:@ô:?ðÕ@<Ê@6¹>/µ@.´?-´?-´?-²?,°?-¯@-­@,©@+¦A-¡A+Ÿ@*›A)˜@*–A,”>-’?/‘>.‘>.‘>,=+’<+’<+”?+“>*”=*”=*”=*•>+–?,–@/”@5•>5˜>3 >1«A3µD4½C4¿D5»A2·C6¬F8œI;…G:l@3S9*B4)>63:6595484382271161.61.72/72/72/61.61-50,50,41,//-.0-//-//-0/-0/-2.-2.-3--5,-5+,3)*5)+<-0C47N8:d>=vEA†JINLšTV¤aj¥l}rŽ‘{¢†€®…¹{„»ou©[[QHuOCiOFeOG_PH_RN_[Yfnotƒ‡ˆ”™•™ž—š ”™‘ƒ~ojkY][LVSJXSZVRaXQa/.,/.,0/-10.40-40-51.51.72.72.72.72.92,92,92,92,91.80.7/-7/-7/-7/-80.91/80.80.80.80.80.80.80.80.6.,5-+5-+5-+4,*4,*4,*4,*5-+5-+5-+5-+5-+5-+5-+3.*2-'1.'2/(30)30)41*41*52+63,63,63,74-85.96/96/:7.?8.@:.B<0D>2G?4H@5H@3H@3I@1I@1K?1K?1K?/L@0MA1NB2MA1QA1YB2dC2qC3|C2‡B2’A0˜<- :+§;.¯=2µ@6ºD:¿F=ÅD>ÙCEá@FãBGçBFêDFðCEôADø?Dú;@ù:?õ;@ð=@è@@ÜA=Ñ@;Æ@5·=.³@-³@-²?,²?-°?-¯>,­@,ª?-§@-¥@,¡A+A,š?*˜@*•@+”>-‘>.‘>.‘>.=+=+=+=+‘>,‘>,’<+’<+“=,“=,”?+•?.•A6–?5š>3£>2¯A4¹C5¿D5ÁC5ÀD8¸F;®I=™J=G;h@4Q:,B5,?74=77<66;5594183072/72/62/62/62/51.52-41,41,21,.0-,1-.0-.0-//-//-0/-2.-5//4..5,-4*+4*+9-/>24I56[97l?9|E@†IDOM˜[`›fv”mˆŒwžƒ}­}‚¹u~·fm¤TV‰MEvLAkMAeOFcQHcMH^NK\[[eqty…‰ˆ‡Œ†Šˆ…†Š|xzlfiXZ[MVSLZU[ZT`[S`.-+/.,/.,0/-3/,40-40-40-61-61-61-61-81+81+81+81+7/-7/-6.,6.,6.,6.,7/-7/-80.80.80.80.80.80.80.80.5-+5-+5-+4,*4,*4,*3+)3+)6.,6.,6.,6.,6.,6.,6.,4/,30+30)30)41*41*52+52+52+52+52+63,74-85.85.96/96->7-?9-@:.B<0E=2E=2F>1F>1G=1G>/H<.I=/I=/J>.L@0JA0LE3NE4UD4^D3iD2sB1~A/†?-Œ9)”9'9*£<-¬@3³E8¸H<ÁF>ÒDCÚACÞBCâDCçCDìBCó@C÷?Aú;@ù:?õ;@î>@åA@ÚB=Í@9Â@3µ=-°@,°@,°@,¯>,®?,®?,¬?+©@-¦?,£@+ @*œ@+˜@*–@)”?*‘>,‘>.‘>.=-=+=+<*<*=+=+<*<*’<+‘>,”>-’?-•A6–?5œ>2¦@4²B6¼C8ÁC7ÂB7ÂF<¹I>¬L@—K>|F:b@4L:.A7-@85>96=77<74:5294183083062/62/62/32.52-21,21,12--2.-2./1./1.00.00.10.10.5106005//5,-4+,6,-:01D22T71c;3qA7{E;‚HD‰RU_l‹i‚ƒs˜}y«x}µowµ`f¢QR‹LEyL@pL@hPEgQFfLC^GBVMLZ^^fjnquyxy~xz€vwzokoa`bTWYLTTL]WY]V]]V^------.-+/.,0/-10.3/,40-3/,3/,4/+4/+4/+4/+6/)6/)4/,4/,3.+3.+3.+3.+4/,4/,50-50-50-50-50-50-50-50-3.+3.+2-*2-*2-*1,)1,)1,)4/,4/,4/,4/,4/,4/,4/,4/,41,41,41,41,52-52-52-52-52-52-63.63.74/85096196/<5-=6,?8.@9/B:/C;0C;0C;.D:.D:.F:.G;-H<.I=/J>0I@1JG6MH5RG5YF5bE3jD1uB/|?,‚;)‹:)“:*š=,£B2¬F8²J=»I?ÌGBÔDCØDBÜDAâBBéAAð=@ô<>ù:?ø:<ô<>í?>áB>ÓC:ÅA5¹?0²?-®?,®?,®?,­>-¬>-¬>-ª?-¨>.¤?- ?,ž?+š?,—?+•>*“>*‘>,?.>->->-Ž=,Ž=,Ž=,Ž=,Ž=,Ž=,Ž=,<,>-‘>.?.”B4—A4@1¨@3¶A7¿C9ÅB8ÄA7¾C;·H?¦LCJ@tE;Z>2E9-<5+@93@85?75>63=52<4194083/62/43/43/23.32.12-12-02--2.,2.-2.-2./1./1.00.10.3205105104..2,,4+,7./=/.N5.Y9.e=1n@3sB;yKK€Zeƒg€p—zxªu{·ks´_d¦TT”OGƒLBwNAmNBhMAeJA`GBYGFXKKWMPU]cc`fbbia`f\Z`TW[MUXMXXP^YV`WX`WZ,,,,,,.-+.-+/.,0/-3/,3/,2.+2.+3.*3.*3.*3.*5.(5-*3.+3.+2-*1,)1,)2-*3.+3.+3.+3.+3.+3.+3.+3.+3.+3.+2-*2-*2-*2-*1,)1,)1,)0+(3.+3.+3.+3.+3.+3.+3.+3.+41,41,41,41,41,41,41,41,41,52-52-63.74/85085085.;4,<5+=6,>7-@7.A9.A9.A9.C9/C9-E9-F:.G;/H<.J>0HA1JG6IH6NG5VF6\E3dC2lA0t?-{<+‚;)Œ;*”=,œ@1£F5ªJ:´J=ÄH@ÌEAÑFAÖE@ÞCAä@>ì>?ñ:<÷;<ô:;ð<=é@=ÜC=ÍC8¾@2±>,®?,«@,ª?+ª?+ª?-©>,©>,¨?,¥>-¢?, ?,›>,—?+•>*“>)‘?*>+>->->-Ž=,Ž=,Ž=,<+Ž=,‹<+<+‹<+‹<-Œ=,>/Ž?0”B4—A2 @2¬B5¹C9ÂC:ÅB:ÂA;ºA9±I@£NGNEoG=S?4A;/96-@93A75?74>63<4194083/74/43/43/34/23.23.02-02-.3--3/-3/.3/.3/02/02/11/11/21/32032040/2.-1-,4..8.,G4-O4)X8+`<0e?6mGFyYd‚k…€uŸ||²w|¼nu»dh¯[[¡RMLB~OArL@hI=cH>`HB^ECX@BO;@FBGJDMJJQJJQIIQFKQEOUIVWO^YS`YS`XU++++++,,,---/.,/.,0/-0/-1-*1-*1-*1-*2-)2-)2-)2-)2-*2,,1++1++1++1++2,,2,,1++1++1++1++1++1++1++1++2,,2,,2,,1++1++1++0**0**3--3--3--3--3--3--3--3.+41,41,41,30+30+30+30+30+41,41,52-63.74/74/85085.:3+;4,<5-=6.?6/?6-?6-?7,B8.B8.E8/E9-G;/H<0J>2H@3HE6GE6KE5QD4XC2_B2f?.n=,v=,|:*…9)Œ;*“=.›B2¢F7¬F8¼G=ÂF>ÉF>ÐE>ÙD@âC?é??ð>>ò::ñ;:ì<<äA<ÖC;ÆD6µ@/ª=)ª?-©@-©@-¨?,¨>.¨>.§=-¥>-£=. ?.ž?-š?-–?,“>*‘?*>)>+>->-Œ=,Œ=.Œ=.‹<-‹<-‹<-Š=-Š;,‰<,ŠCC793@72>71=60:5/94.83/63.43.43.34/13.13..3-.3-.3--3/-3/-3/-3/.3/.3/02/02/00.11/22021/0/-/.,2.-4/,?0+D0)K3)T8-Z<4dFFu]jƒs‰€«…„¾~ƒÇtzÆmp½ce¯VSšLC‚K?qI_FB]DBW?AN;?H:BE>HGDMHGQIGQHJRGNVKUXM^ZOaYNaXO++++++,,,---.,-/.,0/-0/-1-*1-*1-*1-*2-)2-)2-)2-*2,,1++1++0**0**1++1++2,,0**0**0**0**0**0**0**0**2,,2,,2,,1++1++0**0**0**2,,2,,2,,2,,2,,2,,2,,2,,3/,30+30+30+30+30+30+2/*41,41,52-63.63.74/85085092,:3+;4,<5->5.>5.>5.>5,B8/B8.E8/E8/G:1I=1J>2I?3FB6FB6JB5OA4TA2\@2b>0j<-q<.w9*}8)…8(Œ:,•=/›B4¤B5²F:ºE;ÁF>ÊG?ÔG@ÞFAçCAîB@í;;ë;;ç>;ßB;ÑD:¿D4¯@-¤>(¦A-¦A-¦A-¥@.¥@.¤?-¤?-¤>/¢>.Ÿ@.œ?.˜?-•>+‘?*>)>+>->->-Œ=,Œ=.‹<-‹<-Š=-Š=-ˆ<.ˆ<.ˆ<.ˆ/ˆ>1‹?1‘D4–C3¢B4­C6ºC;ÁD>ÁD>»EA¹PL²[T¥e\‘f]u_T[UIGMACI?<92?82>71;6094.74-63.43.43.34.24/13./4..3-.3-.3--3/-3/-3/-3/.3/.3/02/02///-00.22022010./.,0/-3/,8,,;,)C0*K70S<6^IHtbn‡z”Š¶ŒÆ„ˆÏz€ÌrxÆik¶WWŸID„E=nG^CAY@CV@DP>EKGQRKWUQ^WU`XS_UR^TT^SY_S^[LaZJaZJ,-/,-/,-/,.-------.-+.-+/.,/.,1-*0,)0,)0,)/+(/+(/+*/+*/+*/+*/+*/+*/+*0,+/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*0,+0,+1-,1-,2.-1-,1-,1-,1-,1-,1-,1-,1-,0,)1-*2.+3/,3/,3/,3/,3/,3/,3/,3/,3/,40-51.62/74/80-92,:3-;4.=4/>5.>5.>5.?4.?5,B5-C6.D7/F90G:1F<2G>5H@5J@6P?5T>3X<1^90b6+m9.t8-|8+ƒ9,;/“=0˜?1ž>0§A3­A4µC8¾E:ÊG=ÔG>ÞE?åC@è@?êBAæDAÚE>ÈD8·B1ªA.¢B,¢A.¡@-¢?,¢>.¡=-¡=-¢>. ?/œ<,š=,˜<-”=,“=,=+Ž=*Œ>*‹<+‹<+Š=-‰<,‰<,ˆ;+ˆ:-‡;-‰=/†3ˆ@2‰A5‹A4‘E5—D4£E9±I>ºG@»D>»EA¸MG´ZR¯f_£qf‘sh~rdjj^V^SIQFLLBJF=B>5<8/95,74+63,33+43.34.14-14-02-/1,,1+,1+-2.-2.-2.-2./1./1./1./1.02/02/11/11/11/11/11/40/4+0;/3A32C4/J;6]OOymy‹…Ÿ“»”–ϐ•Ùƒ‰ÓtzÆjn·_b§Z[”LItHBdA>]>>X?BUAIVLU\U`bbqnn}xv†|rulyoguh_k_W_P]\Hb\Fc]G,-/,-/,-/,-/------.,-.-+/.,.-+0,)0,)/+(/+(/+(/+(.*).*).*).*)/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*0,+0,+0,+1-,1-,1-,1-,1-,1-,1-,1-,1-,1-,0,+0,)1-*2.+3/,3/,2.+2.+2.+2.+2.+2.+3/,40-51.62/80.91.:2/;4.=4/>50>50=4-?4.?4.A4.B5-C6.E80G:2H;3H>5H>5L=6O>6Q=4V;2Z90_7/h70p7.w7-9-‰9.<1–<1›=1¢@3§A3­C6´D8¾E:ÉF<ÔE=ÛD=ßD@àE@ÞFAÔG>ÄF8²C2¥B-žB-ŸC.žB-Ÿ@.ž?-ž?-ž?-ž>.ž>.š=,™>,–=-”=,=+>+Œ>*Œ=,‹<+Š=+‰<,‰<,‰<,‡;+‡;-…<-†2†@6‡A7ˆB6“G9˜F8£G<¯J@¸IB¸GA·LF³TN±d\ªqfŸ~oo|mmseZfZNXMLNAKI=EC7@=4=:188.44,11)23-23-03,/2+/1,.0+.0+.0+/1.-2./1./1./1./1./1./1.02/02/11/11/11/11/11/2015+49-7<23?53H?:^VTxr|Šˆž““¹”—ʐ–Ô„‹ÏyÂqy¸kt­hnž\_€XZqSUjRWjT^hZgmfvvr‚tˆ~’‡ƒ•‰~Žw‡zr€qfteZeT[ZE`Z@b\D,-/,-/,-/,-/,-/,.-------.-+.-+.-+-,*/+(.*'.*'.*',+),*+,*+,*++)*+)*+)*+)*-+,-+,-+,-+,-+,-+,-+,-+,,*+,*+-+,-+,-+,.,-.,-.,-.,-.,-.,-/-./-./-./-./.,0,+0,+1-,2.-2.-2.-2.-1-,1-,1-,1-,1-,2.-3/.40/51.80.91.:2/;30=31=4/=4/=4/?40?4.A4.A4.C60D71F93F93H;5J;6K<7N=6P;6S:5V72[6.c60k6.t5,}7/‡9/;0”<0–<1?3 @4¢@3¨@3±C6ºD8ÅE:ÍD:ÕF@ÖG?ÔIBÌI?¾E:®C3¡B.œA.B/œA.œ?.›>-›>-›>-›>/›?0˜<-–=-”<.“=.>-Œ=,‹<+Š=+‰<*‰<*‰<,‡;+‡;-…<-„:-ƒ;-„<0‚<0‚<2‚>3ƒ?4…A8‡C:ˆD9”J=—H; H>«JC²KF³LG²SM®`V­sg¦qŒz‘Ž{‚‰ws€ocqbXcUNRDMN@HI;DD8@@49;.46+/1&01)01)/0*/0*./*./*//-//-//-.0-//-//-//-//-//-//-00.00.00.00.00.00.00.1/26+97+98/4;63HE>_^Yzz|‹š”±’—¿•Ç„ŽÃ}‰»{‰¶|‹²}Œ«}ˆšwƒq~‡n}‚n~~pƒyŽ…ƒ™‹¡”‘¨˜¥”ˆŠƒ–ƒ|{j{i\hTXX@]Y<_[@-.0-.0-.0-.0-.0-.0.......,-.-+-,*-,*.*'.*'.*'.*),*++)*+)*+)*+)**()*()*(),*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+-+,-+,-+,-+,.,-.,-.,-.,-/-./-./-./+*0,+1-,1-,1-,1-,0,+0,+0,+0,+0,+0,+1-,2.-3/.40/91/:20;31<41=31=31=31=4/>3/>3/@2/@3-A4.C60D71E82F93H94I:5J;6L:6N94Q83T50^72e60o6/x8/‚90Š:/<1”>1™?4›?4›?2Ÿ?1¥A2®B5¸D7¿E:ÇG>ËH@ÊJAÃI>¶F:ªB5žA0™@.™A-™A-˜?-—>,—>,™>,™=.—>.•<,”=,“=.=-Ž=,Š=+Š=-‰<,ˆ;)ˆ;)‡;+‡;+„;,„;,ƒ;-€;,;/€<1€<1>5ƒ@7ƒC:‡D<ˆE<”L@–H<žG>§JC®LI®QL­]Vªj^§€o¡yšš‚›ƒ†•€z‹xm{jbm]SZJQUFKO@EI:@D6;=057,13(01)/0(./).-(.-).-)/.,0/-/.,/.,/.,/.,/.,..,/.,..,0/-//-0/-//-//-//-//-2-17,:6*83-1961HJ?bfX{€z‹““£–°Œ•¶ƒ²¯…™²¤¶’¨³“¨«¤£Œ ž‡ž˜‚™}˜‰œ‹ˆ£”°š˜±›”­—‹£…›„~‘{k|iXfOSV;ZV9^Z=+/2+/2+/2+/2-.0-.0-.0-/.------.-+-,*-,*,+),+),+),*+,*+,*++)*+)**()*()*(),*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*++)*+)*+)*,*+-+,-+,.,-.,-/-./-./-./+*/+*0,+0,+0,+0,+/+*.*)/+*/+*/+*/+*0,+1-,3/.40/901:20;31<42=32=31<20<20=20=2.?1.?1.@2/A30B5/C60D63C84D95E:6G96H94K84N50X72_60i70r7/}:1†<1Œ>2>2—@6—?5—?5—?3œ@3£C5«C6³E8ºE;½G=¾H>¹G=°D8¥@4›?0—@/—@-—@-–?.•>-”=,•<,–=/–=/•<.“;-’0->0-?1.@2/A4.?4.@51@72@93A:4B94C84F74H5/Q51X5/a6/l8-u9.€0‹=1“?5•>5“?5“?4•B4šB4 C4¥D4¬B5°D8´E:±E;ªB7¡?4š>1–>0•?.”?+“=,“=,“<+“<+”<.”<.“;-’<-<.;-Š;,‰<,‡;+‡;+†:*†:*…9)ƒ:)ƒ:+9*9-9-€<1<3~>5€A8‚C<…F?ˆIBŠICŽJAG>—HCŸNJ§VR§`Z©pe¤ƒrœ”}–¡ƒ¨Šˆ§ˆƒ „~–~yˆup{jdp\]iSR^JJS@BK:>E5:@29<134,22*1.)/,'/))0**1++2,,1++1++1++1++1++0,+0,+0,+1-,1-,1-,1-,/.,/.,/.,2,.8*75(13+(56&EK1\gGu‚d†“yŽ›Š‘ž”Ÿš‹ž˜¥——´ž¢Å¥©Î­¥É­¦Ê°§Ë±¤È¬—¾Ÿ‹³‘ˆ°²Ž²Ž²¬Š„¡‚€™{wŽrdx]Q_ENR7QQ5SR6,03,03,03,03./1./1./1./1/////////////.,/.,.-+.-+/-..,-.,--+,,*++)*+)**()+)*+)*+)*+)*+)*+)*+)*+)*+)*+)*+)**()*()*())'()'(+)*+)*,*+-+,.,-.,-/-./-./+*/+*/+*/+*/+*.*)-)(,('0,+0,+0,+0,+1-,2.-40/40/:12;23;23<34=32<21<21;10<1/<1/>0/=/.>0-?1.?1.>3/=60;60;83<94=:5>93@72C60G4.O4+Y4+d5+n8,x:-;.…;.<4‘<5>3@3A2“B1—A2™@0 >1¦@4ªB7ªB9¥@6Ÿ>5—=2•?2’?-’?-‘>,=+‘;*‘;*’<-’<-‘;.‘;.Ž;-;-Š;.ˆ:-†:,„;,…9)…9)ƒ:)‚9(‚9*9*~8,~8,€<1€=4€@7B9„E>…IAˆKFŒMFŒIAŽH@˜JF¡SO¨]X©hb©{n¤Žy™œ’§†‰¬‹‚ªˆ€¡„™€~‹wxnjxadr[ZhQQ]IITCCL;>D60-?1.=2.=4-=6.;819919:29:2;81?6/C2+J1,T2)^3*g7+o9-u=.z2¢B6¡C7žB7™?4–>2”>1”>/“=.=-<,Ž=,Œ=,Œ=.>/Ž<.Ž<.‹2>5€@6‚C:ƒG=…JB‡NE‹OGŒICŽID“PJ˜\Th`uiž‡už˜€”¡…ª‰‰¬‹ƒ¨‡€¡„~›zytˆoj~cby]\pUUgOO\HGRAAH8=A388.85.7/,3+)2()2()3)*4*+0*,/+*0*,0**0*,0*,2),2),3*-1+-1+-1+-0,-0,-0,-1+/4)/4*+4-%46!?F%T`8m|Qg‰™tžz¡~ˆ¡zŠ§{‘¶‚›ÄˆŸËŸÉ™žÇÆš˜Á•Œ·Š‚­€…®‚Œµ‰„«‰®…‰©‚~œxvolƒfZnSJZ?GM3FJ1DF./0+.0+/0+01,01,01,12-21-32.43/43/62/51.41,3/,4/,50-50-4/,3.+2,,1-,0,+0,+.,-.,---/--/,,.++-*).))+.)/.)-/(/.)-/)-.)-.*+.*+/+*/+*-,*.-)--+-.)./*./*------.,-/-./.,0/-2.+2.+2-*4,)5-*6.+8/*:1,:1*;2+=4-=4->50>50>50=4/<3.;2-=2.<1-<1/;0.=/.>0/>0/@1.A0)@2);4*77-39-19.47.83-?-)F*'L)'S*&Z/(`5,d<0k@0yA2@/†A2‹B3@3“=0“;/’8-“;/“=.”A1•B2”C2’A0‘>.‘;,—;0—:2’;1Œ=0ˆ?0„?/‚?.ƒ>.ˆ@1ˆ?0Š>1Š<0‰;/ˆ:.†:-ƒ;-{9+~@3w<.q7)w>-w>-v;-}?2{;/‚@4‡E9‰I?ˆLA†MB„PC‡NE‘KI—SP”bY‘paŠ}j‡‰q‰–zŠŸ€¤‡¦‰Ž§Š§Œ‡¤ˆ~Ÿ‚uš{o—uiib„_[zXZsUZnSWeNPWEJK=C?6@93;0.6**3')3'+3'+0'*++-)+***,*(),'+.(,1(-2'-3(.3(.3(02(00)00)0/*1/*0/)-1++0-(//#5,>5,>5.>5.>5.=4-<3.<3.=2.<1-;0.;0.=/.=/.>0/@1.C0*C0)A2+>4+:6-95,:3-<1-?-+D*)I*(N+'T/)Z5-_:1e=1pA1x@/€A0ˆ@2?4‘=3“:2“;19.‹.Œ@0A1A1ŽA/‘?1•;2•;2<2‹=0†>0ƒ@/?/‚?.…@1†>/‰=0ˆ<.‡;.„;,‚:,€;,x8,x<1s9-n9+s>.s>.r8*u:,}=1ƒA5‰E:‹I=‰K@†NA„PC‡NE‘JH—SR’f]Œwfƒ‡p“w€Ÿ„¦…ˆ§ˆ§Š§‹§Š¤‰Ÿƒwœ}o˜ve’i`‹`Y‚ZY{X\wXZnSSaJNUCFH;C@7<737/-3*+2)*1(+.(*+++)*,+),+),-(,/)-2(02(03(02(02(10)1/*1-*1-*3-*12-12.-0,)--%8:,SXBox]€‹i‡–o†™l†žnˆ£p†¤p„¥pŠ­w“¶€™¹‡–¶„“³¯|†«x‚¨w‚¨yƒ¨|ƒ¦|‚¤{x’uqˆnh{eYjWMZHEL<@D5;=/12,12,12,12,23-23-43.43.54/54/85085085074/72.61-80-80-7/,6.+4/,3.+1-,1-,1-./-.0.1/-0--/,,.+*/+)./(/1'//)-/)-/)-/)-.*+.*+0,+0,+/.*/.*/.)0/*/0*/0+//-///0./0.//.,/.,1-*2-*6.+70*90+:1*<1+=3*>4+?5,?6-?6-@7.@7.?6/>5.=4-=4-=2.<1-;0.;0.;0.;0.<1/?1.C2+E0+H/+K--L,/K+.I*/E+.A-,@.*A.(E.(M.)X1*b3-g5.j:,o;-w;0=4‡<6Œ<5:4:4Š<2‡=2†>2…?3†A2‰A3ŒB5C5Ž?2=/Œ>1Š>.‡>/…>,†=.ˆ<,‰;.‰<,ˆ:-†:*ƒ;,<)~=+{<+}=1z<1v:/u;/x@1x@1v<.v;-?5‚B8‰F=‹H?‰JA‡KA‡NCŠNF‘JH˜TQ–f\ve‡…n‘t{¥…¨‡ˆª‰ª‹©ŒŽ¥‰ˆŸƒš}y˜xi–ma’e\‹a\†`]‚`[|]UrVPhPFYEBP?:D93:2.3,*/)*,)**(.((1&*1&*1&*0'*1(+2).1+//*.-+.,+0+,0)-0(-0(-1)-01/23/./+(**"57*PUAmu]|Ši€k~“j™jƒŸn€ n~ m€¥q‡¬x¯|‹­zˆªw„©u§t§u¦w¦y¤y€¢}}›yw‘tp‡mh|cYkUMZHDH9=?299-23-23-34.34.34.45/54/54/650761961:72:72961940940:2/91.91.80-50-4/,3/.3/.3/03/01/01/20.1..0--/-+.0)02).0*.0*.0*.0*,/+,/+*1-,1-,0/+0/+10+10+01+01,11/1111/010.10.2.+3.+3.*92,92,;2+<3*>4+@6-@6-A7.B8/A8/B90A8/A81?6/>5.>5.=2.=2.<1/;0.;0.<1/=20=2.B3.E2.L..R+0V'/U&.P'/I).C/.<1+;2)?2)H1)R/)_.*d/)i9/k;/u<3}<6…;8‰;9Š;7ˆ:6‰>8†@8†B9…B9…C7†B7‡A7‰A5ˆ@1ˆA/‡@.‡@.‡>-ˆ<,ˆ;+‰:+Š8*ˆ9*‡:*ƒ:)<){=(x>(x>*‚>1{7.z7.z<1v;-w=/|A3{@2€B7ƒE:†H=ˆJ?‡KA‡MBˆODŠQHŽSK\QŽh[‹tb…g€‹m~–vž|ƒ§ƒ„ª…‡ª‰‹ªŠ‹¦‡‡ ‚ƒš~}˜yq•oi”ifgfŒeg‹gd†e_~_Zw[PhPK^JBP?8D62:/.4*,/(+*%2&&5%(4%(2&(1'(/)+/+,.,-+++*+-*+-(,-(,/',/',/*+-.*+1++0+'.+"88,PUAiqYvƒe{Œhyh|–iœl}Ÿmyžkz m¥r‚§t€¥q}¤o}£p}¥s~¥v~¥x}¤x|¡x}Ÿzz™wuqn‡je|bXlSN[GDF9?=1:8,45/45/45/560560560761761872872;83<94<94<94<73<73<41<41;30;3083072/61.61.5106216213123121/00./1-.2,04+.4+.4+.2,.2,,2,,2,,3/.3/,3/,3/,21,21,32-32.22022032032051051.61.61-;4.<5/=4-?6-A7.B8.E8/C9/D:1D:1E;2D:1C90B8/@5/@5/>3/>3/=2.=2.=20=20>31>31@51E31M02T,4X)3W(2R)1K,1B30:6-77+:6*B4)M2)X/)^/)f:1j;3s<7z=:‚<:†<;‡;;†:::6>8A8B9ƒC:ƒC:…@9„@7‚C2‚C1ƒB0„?/†=.ˆ<.‰:-‹9-‰7+‡8+…9+‚:+~=+x>*v?*x>*9-|/'‚8/„>4w4+s5*}A6}C7E:€G<‚I>ƒJ?„KB†MD‡QG…WJ}`N{iQ€pYu]‚|bƒ†i†“uˆ|ƒ£~§€‚ª…‚¬†©„¥€{ž}z™wz’pzlxlwŒkumr‰lm„gkd`rX[iRR[HHL=@@4;7,70&5*$6('5''3''1'&.)&+*(++)+-*',('+*)+*)+***,+),+),-)*,#$2*'50*86*BC5UZFfpWn}^tˆeqŠbuex˜ivšjs™htšiwŸkz¢nx lwŸkx ny£q{¥u{¥w|£wyžuzœww–tsŽom†hd{_WkPN[GCC7>:195,560560671671782782872872983:94=:5>;6>;6>;6>95>95?74?74>63=52;63:5294194184184395484373243151240/6-06-.6-06-.4..4..4..4/,40-40-40-51.32-32-43.43.43/331542540841850940:5/=60>7/@7.A9.C9/D:0G:1H;2F<3F<3F<3F<3E;2C90B71A60@51@51?40>3/>31?42@53?53@72C52I35P16T/6S.5P05J22C52=90<:-=:+C7)I6(Q3)W2)]2+d3,l50v64}77‚87ƒ77‚66~75}:4}<6}>5€?9ƒ@8†?9…A8€B3€C1B1ƒ@0…=/‡;.ˆ:.‡9-…9,ƒ9,‚:,<,|=,y>,x?,|=,‡5*‹2,¡LE¨XQ‹A8|90‚F;€K=yH:zJ<{M>|N?}OBQE‡UJ‚_LrkOosR|uX†v\yb˜iŸ‹s ”z––z|‹£ˆ¨…§‚€¤~{Ÿy~™vƒ‘p…ŽoƒŽp€pp{ŽpwŒms‡kj~bfv\_hSV[GOM>GA3@6*=0';,'9+(6+'3+(/,',-'+.').().(+-(-,*/+*3)*4(*7'*7'(3($<3,E>4IG:QR@]bKgqVjyZn‚]k„\l‰]p‘bq•eo•do—eršfuŸmrœjq›itžnx¢rz¤vy¢vyŸvvštw™vu”rokj…fc|^UlON\ECC7@91;4,671782782782893893983:94:94;:5>;6?<7?<7?<7@;7@;7B:7B:7A96@85=84=84<73<73<73<74<74<74;639529338308/09/.8/080.80.80.61.61-61-61-52-52-63.63.74/54/540540841952:63<94=84@93@70A8/C90D:0G:1H<0I=1I=1J=4J=4J=4I<3F<3D:1B8/A7.A81@70@72?61?61@72@72A83?74@85B86D97G96H96H96H94E80E8/E9-E9+G9,I9*K9+Q7*Z/&d/'n3-z63ƒ98‰;9‹;:‹=;‹A>‡@:‚=6<3:3‚<4ˆ=7‰@7ƒA5B3‚@2ƒ?2ƒ=1„<0;/€/|>/}>/=/†9/1+£;8ÎkfÛ~y­ZTŒC<ˆLAN@tJ(+C&+E$+C&(F5-LC4VP@[XE`bLgmQiwVj{Wl‚[g‚Wf†WlŽ\o”an”an–bršfsko›jo™irœnvŸsy¢xxžwu›vs—su—vs’rn‹li„cb{[TmMM]CGH:E<5@707827828938938939:4:94:94;:5<;6?<7@=8@=8@=8A<8A<8C;8C;8C;8B:7?:6>95>95=84>95>95>95>95=85<73:51;30:0.:0.91.91.91/91.91.72.61-61-63.63.63.74/74/74/540651952;83<94?:4B;5B;3A8/B:/C9/E;/H<0I=1J>2J>2K>5K>5J=4J=4F<3E;2C90B8/B92B92A83@72@72A83B94A:4?82@93B;5D=7F=6G<6K<5N;4M6.N6,Q6+Q6+Q7*P9+P9)V6'f6*r6,~;3‰@9•D@›HDŸJGŸLF QJ™LDŽD;…;0„7-…7-Œ91=4ˆ>5‡>7†=6…<5…<5=4}=3z>3x@3vA3x@3z>3<3ƒ:3ˆ73’42˜(&³=;í{zþ•’Åhc–G@‰K@xH:nMhV>lX@t[E`L€hPysQ„wUžt\´l^É__ÓV\ÙQ[×T\äouÙzx̆|À~µ•€«•}£’xŸvœŠrœŠt™u•u‘‘u‹’s†‘s‚‘r|‹ny†ju{amoWgbN_TBUE5R/(9/&7.'6/'81):/)=.+A,+F)+H(+K'+H)'TB4YQ9B?:D?;D?;E@8E>8D=7B;5B;5B;5B;5B:7B;5A:4A:4A83A83A83@72@64>71>71>71<71<71;60:5/96/85.74/74/961961961:70<71=82A:2B;1C:1D<1F<2J>2K?3L@2N@3N@5N@7N@7L?6K>5I<3H;2E;2E;2B90A8/@91?80?80?80@93@93<5/MD=M@:K:3T@9R62O0+a<6\3-`5.`4+^/%^/%f6,m=1q=0ŠJ>G;—I?ŸKAŸF>›>7›>7žD;¦ND¤PE¨VJ«YK¥OB™A5—;0›>6“98‘98Œ65†52†84„?8|@6r>1rB4oA2q=0v:0‚72Œ43’-1š',ÈHIèbaÅEDÍWUáyv«VO†F<„VFmR=i[AibFjeHj`En^D|dLjT’bL²m]ÑnhÛX]à;Lç-Eò+Hõ0Lö@YìI\ä[eånrâ{|ۀ}ۃ؉‚Ãv½wº„x¶†x²ˆx­Šw¨‹y¥Œxš€o™~m˜xi“oabY„UM{IBxA>u:9:49:49:49:4:;5;<6>=8?>9>=8>=8A>9A>9B?:C@;D?;D?;FA=E@8E>8E>8E>8E>8D=5C<6C<4D;4C:1B92B92B92B92B94A83@93@93>71<71;60;6096/85.74/74/96196/96/:70<71>:1A:0B<0C;0E;/I=1J>0L@2L@2N@3N@3N@5N@7M?6K>5I<3H;2E;2E;2C:1B90@91@91@91@91A:4B92D93J71L/+V.,j76u99{;;…ECƒD?„H@…I?†H=ŽJA™NH¡PL¢OG“D7”B4šB6ŸC8 >3œ7-œ7-Ÿ=0£C5›?0™@0 E3¤G6§F6®H:¶NE´LM¯HL¥@D™9;‘98>:ƒ@8x>3o>0zI;…LA„?8„,+’).³9DÒLWÜKNßMMÊ>=À@?Ð`\³YQ„@5‚TDyaIe[@_^@ihIslOvgJ~dK–cN¼dXÖ_[æUZëANò,Eþ%Dÿ&Hÿ'Iÿ.Nù3Nò6UE8[O5cZ9gaAifEnrOz‚]z‰bt†^r‰_p‰_p‹`qŽ`u’dw”dw”dw”fs’ix–rz—xy–x~˜}ƒ„…‡ƒ›…™ƒz’zr‰om„hhd`y[TmMNaERSAVPBUOC8938938939:4;<6<=7?>9@?:@?:@?:C@;C@;C@;C@;D?;D?;FA;FA;FA;E@:E@:E@:G@8F?7JA:I@9H?8G>5F=6E<3F<3E;1D:1D:1D:1D:1D;4D;4D;4C<4?80?80<71;60:5/:5/94.94.96/96/:5/;7.>7/@9/B90C;0E;1F<0I=1K?1M?2M@0P@1O?0P?5M?4L>3K=2I<3H;2E;1D:0C:1C:1A:0A:0?;2@<3@<3D;4UD—I?–LAœNB¬RJ¾URÌOSÄLK¥@4B0 @0¥?1¥;.£7+¤8+§=/«E6¡>+˜7$:'¥>-¬A/²C2¶D:§02¯:B¹DL½LRºMR­KL–A>‚71{8/v6,x2*„1-œ37¹=GÕGWèM[âFIÏ53Ð:9½31ÈNKÆc]”J?Œ[J}cLj_CgdEtoOpQhJhN°hYäbbõQZôDQö7Iý1Jÿ2Nÿ/Mÿ+Iÿ2Oü0K÷1Jõ5Lò4Mð2Kó3Ló7Pò@XïC[îF]íIaëNcêQeèUhèVkåSjäRiãOiäNiçNlëPoòSsóVuþh…ña|å[uÕUlÍYlÉdr¨R]r-2^&'Y0,W:4Q?5B:-:8)>B1LN9VO3aV6e_?heDquT†e~ŒiwˆdxŒiu‹er‹dr‹cvŒeyhzizj€•v„›~Šž… Š’£—¨–˜©™–¦™‘¢’‡˜†zypƒmg~b^wYTmMPcGSXDXUDYVG7827828939:4;<6=>8@?:A@;BA5G=3F<2E;1D:0D:0E;1E;2D;2E<3E<5E<5@91?80=82<71;60:5/:5/:5/96/96-;7.;7,?8.@:.C;0D0K?/M@0M@0O?/O?0O?2O>4L>3K=2J<3G:1E;1D:0D;2D;2B;1@<1@<3A=4B>5G=4S81[*&‰:?¾T`ÙTeæTgãUcËJOŸ30–:/‘>0™A3®F=ÅIGÕBHÍ>@±B7§F5©B3¬@3¯?3°>3³B4´D6²G5©B/£<)¤;(©<(«:(®6&­3(¶97º9=½7>¼7<¿^õ@aøCfö@fõ?eõ?gø?hüCmÿErÿIsÿOuÿQuþUvòSqçTnåaxÖfv·Wb}15j0/Y2+P8,G>/>A.;D/?G/PK._T8g`CokN||`ˆŽr‡‘v}‹qzq|s|szozŠm}Œoƒ’uˆ—z•£Šœ©•£®¦±¡¬´§±¹®°·°«µ­¡«¢•¡•ƒ‘‚s„qh|c]tXSlNPdHRZCWYDYZH671671782893:;5<=7?>9@?:BA/K?1M@0M@0NA0O?/O?0O?2N>1N=3J<1I;0G;/D:0D:0D<1D<1B;1@<1A=2A?3B?6J<3\5.w32­LSÛ]iæM_å?S×6E·&+¨1+7(’:&—<)¬@3ÃD=Ô>?Í;;±?5¨B4ª@2­?2²@5¸C9¼H;»J<¬>/ª?/¨=+¦;)ª9)°:,·;/¼<1ÊFAÎDAÐ>?Ð79Ö7<ÞBEâLNÝROÄC>ÆKCÍTLÔSMÙKJÛ?Bà5>á27Û4.Ú7.Ð1+Ï:4¿84³@9µ[P–UC{N9‚bI†kP„`F‘ZE­fTËrdçmhêEKò:Dê9Cç=8@?:@?:C@;DAGB>GD=GD=HC=ID>IE2I=1G=1G=1F<0F<0E;1E;1D;2C:1A:0A:0@91@91=82<71;60;60;7.;7.;7,<8-?9-A;/D0L?/M@0NA0NA0O?/O?/O?0N>1M<2L;1I;0G;/F90C9/C;0B<0B;1@<1@>2A?3B?6N;4m84—FEÄY_ÛWbßCQÞ8FÔ3;½++­1'¡8%˜:!—9 ¤;&¶>.Ã:2¾71§7,¢:-¥9-§7,¯:1¸B8ºE;·E:®>2­?0§<,¤6'ª6)¶>0ÃD;ÊG=¾8-Î@6áD?ìBBô=Aó9>ë27Þ.0Û75âGBèSLåNGÜ=9Ù10ã/2ê67Ù1(ÞÒA>ÒGDÝOMëWWíNSïDMò9Gö5Fø1Fø.Dû1Gþ7Nþ8Sý8Tý8Vþ9Wÿ;\ÿ>aÿAeÿCkþ;eýjý?mú>nø>oô=mö:jÿHrÿ;aÿ?dÿKnÿKn÷NmïUoãZnèr‚Ä`j—HKt:8\6-P9+PC2UM:^QAreUˆ|n•‚Ÿ‘¦§Ÿ §Ÿ”˜•ž›ž§¤¦¯¬¦¬¨¢§£¦¨£µ´°ÂÁ¼ÌÉÀÑÎÅÕÐÌÕÐÍÔÎÎÕÏÑÑËÏËÆÊ¿½À°²¯˜Ÿ˜€Œ~m~k`t[WnRVjNS`FV`EX`H560560560560671893:94;:5=<7>=8A>9C@;DAHC?HC?GD=HE>ID>ID>JF=JF=MF2@@4P91r1/¨JKÀRU»>D½06Â03Á//º1)©1!£9#œ=!™;›< ¡=#¥;%¤6%ž6) 8-¢6,¥4,­81·@:¸C<²@6±B7­A4¨-Ï>-Ù5+á*&í"%ú%+ÿ*1ÿ.4í)*ç.+á3,ß4,à3,ã2,é0-ç2+Ú2%Ö6&Ð2&Ï7,Å6.½>7È`UÒq¦eSVBŠM:£WIÈf[ßd_çRTèCIõFMí@Dß??Ô@<É@8Æ?9ÑFAãMLïJPô@Kù9Hý7Hü5Hø3E÷6Gú;Mú8Pü7Rû6Rý6Uÿ6Xÿ9]ÿ;aÿkÿ?mÿ@qÿBtÿBuþBuüBtùBpÿFmúAaþEeÿKjþKkÿVtÿ_zõ]tòj~æp~Ónv¯]aƒCAg6/hB7sUJye\Œ}v£–­£¡²®«¶¶¶²¶¹¨°³°·½¶½Å½ÁÊÀÃÊÄÃËÉÆÍÕÎÖÝ×ÛâÚØçÝÛéÝÝæÚÜåØßä×ààÔÞÙÏØÊÅ˺ºº¢§£ˆ’‡t‚qexb\sW[oS[jM\iK]gL561561561560561671872983<;6=<7@=8B?:DAHE>HE>HE2G=1E=2D;2C:1C:3A:2@93@93?74<73<71>7/>7/<8/=90>:1A:2C<2D=3H@5I?3L@2MA1NA0P@0O@-O@-L?/L>1M=0L;1J91I81E80C90@9/>:/;;/<<0=>0>?1A?0S8-‡<7Ä\[ÊZY®86«.*±0*®.%­2#¬9&¬B*ªF,¦D'£A&£A&¢<#Ÿ9# 9*£;0¦:0¦7.­<4¶C<·E;°@5«=0¨Dà:<Ö<<Í@9Á>4¶8,¹6.Ä94âHHé@Eð:Fö:Hú:Iø8G÷;Iû?NþAUÿ?Vþiÿ>lÿ>oÿ>pþ?rú@rø@t÷Aq÷CjÿMmÿSs÷JhìAaýTsÿg…ÿe‚÷]wï_xèg{Üp}Æqx§gg^X{ZQ—~wª™’¾°­Ä¼ºÆÂÃÈÇÌÇÇÏÃÃÏËÊØÌÊØÑÊÚ×ÎßßÔäæÛéêàëíãëïåæòèæôèèðäæîáèíàéêÝçäØâÑÊÑÁ¿Â««©‘–z†xl{hbu_`rXbpVboScmT21/320431651875984984984;:5<;6==5??7AA9CC9EE;EE;HH@HH>HHLC4J@4KA5MC9LB8F=4B90E<5C:5@93?74@85?75<74<42C:5B94A96>95>96>:7?;8@<9B?:D@7G@6J@4L@0O@-O@+L?,G@.F?/I;0K81M53L76J88F;9B?:6904,«=,­<,³=/½C4ÄF8À>1º2&Ç9+Ì8*Ð8+Ö8-Û7-â5.é3/î1-ñ.,ô.-ó0,ñ1,ê5*ã7)Ý:)Û:(Ü9&Ô3Ð3 Ï8'Æ7'¾6(ÂB5ÏSIÈMEÏSKá\Wî]ZðPRí>Cò9?÷?GêAFßCDÕAAÈ?9»<3±;/°HH>HH9H?:F=8B;5D:8A96?74?74@85@85=85;62=4/=4/=52<74=96>:9=<:>=9B?:D?9G@6J@4M@0O@-P?+L@*B?,B?.F<0H:1J65I56F35@65@<9:=6;>5@@4E<-J9)^B4€L>®QB«;- 2#¡6&£:'ž7$ž9%£>*¡;%§<(®?+³@-¶=,·9*¹7)µ7)ª9)¥:*¥:*¥;+¨>.«A1«B/«@.®?,«:(±<+¿E6ÆH9Á?1¼8+À6)Ë7+Ï7,Ð9.Ñ;-Ô8·;1®:-ª<-«=.¶E5ÆL?ÔNEÜGCã?>ï?Bú?Fý?IøCJ÷CLúDPÿFTýBSù>Sü>XÿBaÿGiÿCiü?iù@jùBpüFvþJzÿK{ÿJzÿHtõKpñQsõ\zù_{úWvüNqýEkúDlïEiÚKgÈ_p±nukLI~t°–‰Ì²¥äÓÉìãÜëçæêéîêçòíâóöãùûáúÿâýÿçÿÿìÿÿñýÿöþÿùûþú÷ýúõü÷ôúõòøïðôëîñèíïæëæÝàÜÖØÊÆÅ´³¯ž¡šŽ“Œ‰…‡‚•‡‰€†Œ~/.,0/-10.21/43/540762761:94::2<<4>>6@@6BB8CC9DD:IF=IG;JH;LI8MJ7NL7NL7OL9KI:NKBTRS_^fihxmm…lkŠkhƒ`YiYQ\OGRH@KH>GG=EE93>:1=9083-94.;60<92=:3>;4?<5@<3E>4G?4I?3L@0O?0P?/P?-L?,<;&:=(?<+A;-B71A62>42;30=84B;5H94N2.Y,)l/.‡;=¡FE£;0¢2$Ÿ1 ¤9'¥<)ž7$ž8"¢<&¤;&ª=)±A-¶A/¹>.»<-¾:-¾-­>-­<,²?-°8(¹>.ËL=ËG:¼6*º2&É9.Ð6,Ô6+Ô8,Ö:.Ø:/Ü8.ã6/è3,ð0-ô.+ô.+ð1)ç2'Ý6&Ô8"Ò7!Ý8$Ü5#Ú9'Ú>/Ó=.È6)Å9,ËA7É<5Í>8ÙEAåKIêJJéCCì?AëCCÞCAÕD?ÍB=Â=4¶:.®8*«:*¬;+¬8)ÀD8ÔNEÝIEâ?@ê=A÷BIÿHPôAGô@IùCOýGTþEUú@Uû?XþA_ÿEgÿCiÿCkÿFpÿIwÿK{ÿL|ÿJzÿFxÿHwÿKtûOuÿZ|ÿa€ýUvñCdûIkÿTvÜ?\ÍI`Ø{…¸||aC;|n®ŽÕ³§óÛÑûìåúòðù÷ú÷ôýôìûúëÿÿêÿÿìÿÿîÿÿóÿÿ÷ÿÿûÿÿýüÿþûÿýùÿúøÿøöÿõöýóôûðôùðóðçêåßáÓÏξ½¹­®¨¢¥ž£™£—£«žž¦—›£–/.,/.,0/-10,21-32.54/650880991;;3==5??5AA7BB8CC9HEQPL^]bmlzzz’‚¡€‚¨€€¦{u—rkŠe_{YSmTLdMEZG@PB;2?=1@<1?;/A;-F?/H?.K?/M@/O?0O?/P>0L?/@=*?>,@=.?;/?;2>93=:5:94<94D95M51V-+j)-†18ž9A¬>A¦7.¥7(¥:(ª?-¨?, 9&¡8#¤;&¥:&«<)³>,¹@/½>/Á=0Å=1Ä>2½?3¶=2²9.®8*¯9+°:,²:,³9*¶;,¹;-ÄB4ËE9È>3¾1'À2(Í9/Ö5+Ø4*Ú6-Û7-Þ7.á6,æ3,ì1*ó0,ô.+ô/)ï0(ä2&Û4$Ò6 Ð5×2Ú0Ú4$Ü<.Ö=/Ð9.Í=2ÒD:Ä5-Å60Ê;5ØD@âMIåKIÞC?Ö=8Ó@9ÎA8Ç>4¾VádtþŸ§ÓŽd92lJ>¥ynÐ¥œõÔËÿéãÿôòÿýÿÿüÿùóÿüïÿÿïÿÿðÿÿòÿÿôÿÿ÷ÿÿûýÿüûÿýúÿüøÿúøÿù÷ÿö÷ÿõöÿôøþó÷öëïìãäÚÕÒÉÆÁº¹´³´¬±´©°¶ª¶¾³°¸­¬´©10,10,0/+0/+10,21,43.54/77/880991;;3==3??5AA7DA8IE:LF:NH:PJ:RK9RM:SL:QK=OJDVTUfdqwx‡‡©¹“ϐƎ‹À‡ƒ¶{w©pmšid_[~UPnNJaKGXEBM?=B;7895296/85,85,671783891;;1>5L?6K>5F<3B92=82:946;46=57<5>:1H4-Y2-w78”?D¦>E©8:ª;0ª<+«@.¬A/©@-¥<)¦;'«>*§8$­:'µ<+¼=.Á<-Å;.Ê<0Ê=3Å?6¾>3º:/·7,·7,¸8+º8+¹7*»7+ÇA5ÍC8Æ9/Á1&Æ3)Ë7-Ï5+Û4+ß3)á4-â6,ã5,ç5+ì1*ð/*õ/,ö/*ò/)ì0'â2#Ù4!Ð5Ï4Ö1Ù/Ø2"Ø6)×9-Ô:0Ö?6ØE=ÖF>Í@7É<5Ë@9ÖKDÙNGÒE>Å;1Å=1Â<0ÀCòBLûIUÿJYýFXúCYûC]û@_ûBbÿEjÿJsÿNzÿO|ÿLyþIvÿJwÿTÿT}ýJqùImÿStÿVtøNiëD^äF]êXkÿ–¢ÿµ¼óžŽHFk.)¦kc͖óÈÁÿãÞÿñðÿüýÿýÿü÷þþöÿÿöÿÿøÿÿøÿÿúÿÿüÿÿýýÿýúÿüøÿûøÿùøÿø÷ÿöøÿõ÷ÿôøÿôøýñóóéêäÜÚÖÑÍÍÊÃÉÉ¿ÊÊÀÊÍÂÉÐȾȿ¸Â¹65143.32.10+10+21,32-43.66.77/880::2<<2>>4@@6B@4JD8ME8OH8RK;TK:TM;SL*F@*G?*H@+IA,IB0IA4HB6HA9G@:K=?40§;/ª<+ª?-ª?-©>,©>*¬?+°?-«8%²9(¹:+¿9-Ã9,È:.Í:0Ï<2Ë>5Æ;4Â91Á8.Á8.Â9/Â8.Ã6,Å7-ÑC9Ð@7Ã0&Ã,#Ð7/Ö<4Ó2*à3,ä1*ç2+è3*ê3+í2+ð/*ó-*ö/*õ.)ò/)ì1(á4$Ú5"Ñ6 Ð5Ø7#Ù3#Ö3$Õ3&Õ5)Ô8,Ô<1Ö?6ìYQáRJÓHAÌC;ÊE<ÌI?ÈE;À>1¼:*¼;(¼:*¹:)·:(¸:+¼>0¿A3ÁA6Á<3Æ=7ÏA=×EEÝGHäIMëLPèBFê@CðCIùKTþNYüJZüF\üF]øA]ùBaýEiÿJpÿNwÿOzÿNxÿLvÿQ{ÿRyþOvýOrÿVwÿ]{ÿSoîD^úTlîQd÷dtÿ’žÿ‹•ôƒ‰Ç`d§MMµjgΏŠï¼¸ÿÞÙÿïîÿúùÿüþýûÿýúÿþûÿÿûÿÿûÿÿüÿÿûýÿûûÿûøÿûøÿüùÿûúÿûúÿøúÿöøÿó÷ýñóùíïòææçÝÛßØÒÛ×ÎÝÛÏàÞÒßáÖÜãÛÏØÓÅÎÉ<94;8185052+41*41*52+63,74-85.96/;81=:1?<3A>5C?4JB7MC7PG8SJ;WK;UL=UK?SJCSJK]Wcnl‚‚‚¦‘•Åš ÚŸ¦ê¢©ñ¡¥ïž ë™›å•˜Ý”•Ö‘ʉ‰½‚ƒ±zy¡rq‘fc~XVkPN\IGRFCLCBJ??K==G;:@;9:<94?;/C=-E@,F@*FA+EB/EC4CC7BC;AC>@ACBLCANEEOCHNAIL>HI=HDCHAA=2L:.gF7ƒOAI<Ž?2”8)¥>/©>,«>*¬?+­@,¯@-°?-²=+±8'¶8)½9*Ã9,È8-Ì8.Ò:/Ô;3Ï:4Í:3Ë81Ë81Ì92Í:2Ì70Ë6/Ó<5Õ>5Ò91Ì2(Î4*Ø;2Ú<3×3*ä1*é1)ì1*î2)ð1)ò/)ô-(ö,(÷-)õ.)ñ0)ê2(â5'Ù6%Ó7!Ï7 Ô9%Õ8%Ó6%Ñ4%Ò4(Ó7+Ò8.Ð7/ãNGèXPçZSÚQIÌG>ÄD9¿@7¹>/¹<*¹<&¹<(¹:'¸9(º;*À>0ÃA4ÉD;Æ@7É@:ÑFCÕIHÖHGØGJßIKæFHèBDíDIõLSüQZûO]ûL]ûK`öD^÷DaùFfýIlÿNuÿOxÿOxÿPy÷UzóUvôTvüYxÿ]{ÿZwûQkòI`ýWköUgêM^ö^mâKZæTaåTa×XaÁefȃ~嫧ÿÔÑÿëèÿóòÿøùÿþÿûüÿûüÿûüÿüûÿüúýýùúý÷÷ü÷ôÿú÷ÿûøÿüûÿûúÿøøÿóóýîñúëîðáäéÝÝäÙÕâÙÒæßÕëçÛñíáññåìóìÛæâÎÙÕ@=6=:3:7074-52+52+52+63,74-74-96/;81=:1?<3@=4B>3JB7MC7RF8VJ:WK;XL?:6@<1A>/C@/CB0BC3BD7?D=>D@CVCIaLRhU\n\br`dobbjd`afXWaJDlG>ƒSE•XF“J7‘@+™>+¨A.®@/®A-¯@-°A.´A/²=+°7&µ7(¼8+Â8+È8-Í6-Ñ7/Õ8/Ø;4Ò72Ð72Ð72Ñ82Ô94Ô94Ò72Ó6/ÞA:Õ8/Ñ3*Ö8/Ü>5Þ=5Ú91Ü5-ç2+ë0)ï0(ñ0)ô/)÷-)÷,(÷,(÷-)ô/)ð1)ê4)á5'Ú7&Ô7$Ð8#Î7"Ï8%Î7$Ï6&Ð7)Ò9+Ñ7+Î4*Ë4+ãNGód\ë`YÕOFÄA7º;2µ9-¸>)¸>'¹<&¹;%º9&½9*À2ÊD9ÊA9ÎE?ÕKHÓLIÎGDÍEEÖHGãIIæCDèEHòMSøSZùR\÷O^úOaôH^õG`øGdûIiÿNrÿQxÿRyÿTzðUuïZxù^}ý^|ùUpõMgùOiÿYnÿ[mÿctðM^øUfôO`üUgõL_äR_À^_»vqל˜úÉÅÿåãÿíëÿôôÿÿýüÿÿûÿÿûÿÿûÿÿýýýýüúþùöýøõÿøõÿùöÿúùÿúùÿööüððøéìôææëÝÝèÚÙäÙÓèÞÕðèÝùóåÿúìþþòôúöâìëÓÝÜB>5A=4@<3>:1<8/:6-84+73*62)62)73*84+;60>93A<6E>6I@7MC7RF8UI9WJ:XK;ZLA[NHTIMXR`gd|~§’Ê— ãžªö¥°ÿª³ÿ«²ÿ¬´ÿ¬²üª±ùª¯ó¨¬ì©«èŸ¡Ú™šÒÁ±tr¡he’]Z‡XR~XQ{YQxVOpMH_C?M?:@?;:B?8>>4@B5BE:?D=:CB>FH?LUEWoQfƒarŽisŽtvx„o€€^lŠ[c’WYžWU¦VM¦M?Ÿ@.œ9$ :$¨=)¬=*®?,±@.³@-´?-¶=,¹;,º6'¾6(Ä6*Ë7-Ñ7-Ö8/Ú91Ú83×84Ø95Ù:6Ø93Ø61Ø61Ú83Ý:3æC<à=6Ú70ã@7þ[Rÿlcÿ]Tç?6ä2(í2)ñ2*ô/)ô*&õ(%ø(&ø+(÷-+ó0,í2+ã1'Ú0#Ô1"Ô4$Ó:(Ì;&Ê<(Í<)Ï<*Ò:,Ò9+Ò8,Ñ7-Ú@8Ï81ÜGAôc^åXQËB<Å@;·4*·:&¶<$¹<&º<&½:(¿:+Ä<0Æ>2Ç>4ÌC;ÙPJßXRÔOJÃ?:À?:ÏHDÞHGâGEæJKïPTñRWïNVíKXñL\ùRføOf÷Ke÷JfüMlÿQsÿRvýRvôWvîXuõXuû[wÿ\xÿZsÿWnÿVkÿbuýVgÿ\mÿ[lñFXôDXÿQeîVeÆfgªieʏ‹ç¶²øÒÏÿëçýïîüø÷ùýüùÿÿùÿÿúÿþüþýÿþüÿûøþöôþùõÿû÷ÿùöÿöôÿööÿõõöèèæØØãÕÔÞÐÍáÖÐñçÞüôçþøèÿüéÿÿóúÿùèñðØáàC?6B>3A=4?;2=90;7.:6-95,73*73*73*84+:5/=82@;5D=5H?6LB6OF7TH8VI8WJ9YK>ZMEUJNWQ_eby{¤ŠÉ”â›¦õ¢¯þ«´ÿ¬µÿ®¶ÿ¯·ÿ°·ÿ¯¶ü¯´ø¯²õ©ªë¢£ã˜˜ØŒŠÉ€»uq®jf¡d_™`WŽ`VŠ]TVPtMIbFCTBAIAAC<<:AB=FEACD?A?@DBEOMRWVdch†quš}¢‡}Ÿ’}œ |˜¥pŠ¤`u¬Yi¶VaºQU¸HF°@4¬;)¬<&­='¨8$¨7%«8&®9(±9(²9(µ7(¸6(»3%Â4(Ê7-Ó:2Ù<3Þ=5ß<5ß<5á>9ß<7ß<7á>9åB=èC=çB<æA;å@:æB9ä@7Ü8/Ô1(Ø6+ëI>ÿ[Oñ@6î6,ê+#î)#ø-)ÿ/-þ,+ö((ú0.õ4/ï61ç6.Þ3)Ö2&Ô2%Ï6&Ë:'È;'Ê<(Í:(Ï9*Ð7)Ñ5)Ð4(Ó9/Ï5-Ô=6åPJåTQÛLHÍB?·1(¼;(»=&½<'¾;'¾9(À8(Â:,Ä:/È>4ËB8ÕOFÜWPÒRIÃD=¿C;ÌHCÛLHßJFåMLëSRíTWëPVéNVìOZ÷VføUhùSiúRkþQmÿSqÿStÿRuòMmøUtÿ\zÿ_{ÿ\vÿUoûRiûReüUf÷RbÿZhÿZhóN^øScþYißS^¶`_—^W¶}Ù©¥îÈÅýáÞùééýøõúüùùÿÿøÿÿ÷ÿýúþýÿÿýÿûûÿ÷õýøôþùõþùõþöóÿ÷öÿõõöêêêÜÛäÖÓÝÐÊßÕÌïåÛüõåÿùçÿýéÿÿïúÿøèñîÛáßEA6EA5C?4A=2?;0=9.<8-;7,84+84+84+84+:5/=82?:4A=4F?5JB7ND8RF6TG6WG7WJ:XKBWKKXP]b^ysuœ…ŠÂ™Ü˜¤ðŸ¬úª³þ¬¶þ¯·ÿ±¹ÿ³ºÿ´»ÿµ¹ÿµ¹ÿ¯²ù¬¬ô££ë™—àŽÓƒ€Çxu¼sm³k`¤i]›cZ‘]W…VRwNKhEDV@@L85BZEJpW]‚cs—s—¤{§®«²{£¸vœÀp“ÂcƒÀTnÂG\ÐK\ÑHPÄ<<º5.¸9*µ<'°<%°;'°;)²:)´;*·<,»<-À<-Ä<.Ä6*Ë8.Ó<1Ù?5ßA8á>7à<3ß:4Ü71Ù4.Ø3-Þ93æA;ìE?éB<ä=5ã<4Û4,Ø4+Û7-Ô2'Ì, Ö6*éG:õK>ò@6ï4-ð-)ö,*ú,,ü,,ø*,ð*)ì/+è2.ã5.Ü4+Ø1(Õ1'Ñ3'Í7(Ë:)Í:(Ð:)Ò;*Ó:*Ô8+Ô8,Ñ4+Ö<4Õ:5Õ<7åONíYWÙEEÂ3/À;,¿<(À;*¿:)Á9)À8(À8*À8,Æ=3ÇA6ÏJAØUKÒRGÆG>ÀD:ÇG>ÖKDØICÝLIäSPåSTâPSâMSåNWòXdöZhý[pþZrýUnûQlýPlÿQpýGmÿPvÿZ}ÿ[{ÿVrýTkþWkÿ\mûYhøZhûamö`kí]gïfnìfmÉ\_ ]W{OF˜mfÁ˜”ݺ¶ðÔÑôàßÿõôùù÷ùÿýùÿÿ÷ÿýúþýÿÿÿÿýÿÿøùüùôüùòüùôýøôÿùöÿøöùîìïäâåÚÖÛÐÊÜÒÈîäØýöäÿûèÿýçÿÿíúýôêðìÞãßIE9HD8FB6D@4B>3@<1?;0>:/:6-95,95,95,:5/<71>93@;5C?6HA7LD7OF5RE4UF3UH7VJ>XMKXNW^Zqpp–€†ºŒ–Ô•¡é©õ§±ù©±ù¬´ý°·ÿ±·ÿ²¹ÿ´¸ÿ´¸ÿ¯±ü«­ø¥§òŸžê—–⌋ׂÍ}yÅum¶pgªf`ž_ZYX„QQuGGcA>Q=5DH8BT=C`@EnCJ€OU–]dªgx½kÉnšËo˜ÉiÈ`ƒÉWxÆIgÄ;UÆ2HÙAPàEMÑ;<Æ71Ä?0½@,±:$­6"­5$®5$³5&¶7(¼8+Ã;-Ç;.Ó@6×@7Ú@6Ü?6Þ=5Þ93Ý6.Û4,Ó.(Ò-'Ó.(Ø3-á:4ã<4á81Ü5-Ü5-Ð,"Í)Ù7,âB6Ü?0Ð4%Ë.éF7óI<ýH?ü<7ô-*ñ#%õ')û/2ñ-.ë/.ä2.Þ3,Ú1*×0*Ö/)Ó0'Ó7*Ò9+Ö:+Ø<-Ú>/Û?0Ü@3Ü@3Ò6*æLBåJEÎ50ßGFóZ\ßIKÕA?È2ÈF9ÏOBÎPDÆH<¿C7ÁC7ÎH?ÑF?ÕJEÛPKÝROÙMLÚKMÝLQëX`ó[güaqÿauûXmõOgõMgÿNkÿOuÿRyÿUwÿTqüTmý[pÿcuÿjxÿguúboõamídlãflÙhjÎghµfa^TeG<^U©ˆÍ«©æÈÆïÚÙÿóóùøöùýüøÿÿ÷ÿÿûÿÿÿþÿÿüÿÿùúþûöûûóûúõþûöÿýùÿûøþôòøíéêßÙÞÔËÝÓÉíæÖÿøåÿþèÿÿæÿÿëøúïêïèãæßNH:MG9LF8JD6HB6F@4D=3C<2?80>7/=6.=6.=60>71@93?:4C>8EA8KC8NE6QD3RE2VG4VH;ZMGVMR[Whlk‹~‚±Š“Î’Ÿãš¦î¦®÷©¯ù«±ý¯³ý°³ÿ°´þ°³ÿ¯³ý«®û¨«ø¤§ô ¢ïšœé“•âŠŒÙ†…уÉ{u»mk¬dež_a’Y[„RQsNHbWFY_CQmBLEO˜LV¬U]¼[dÊZhÙRpâRußTuÙPlÒJbÍBWÇ8JÅ.?Ô8EãCKåFJØ>>Í>6ÌF:ÃH6¶?+·>-¸=-º<-½>/Ã?0ÊB4ÐD7ÕE:ÙE9ÚB7Û>5Ù;2Ù6-Ù5,Ú3+Ù2*Õ0*×4-Û7.Ý90ß80Þ7/Ý6.Ü5,Ö/&Ù5+×7+Ï2#Î2#Ò9)Õ>-Ô;)Ø<-çC7øJAýD?ù64õ*-ö*-ö.1÷67í55â30Ú1,×0*×/,Ù0-Ù0+ã81ä91â:1â;2à<0ß=0Ü?0Ú>1Ñ7+ïWLøaZÓ;6Ñ;:æPQÜFHæPQÏ<4Ê:/Æ8,Å9,Ä:-Ä<.Ã;-À;,¾:-¾<.ÃA3ÇH9ÇI;ÂD6¾@2¼>0ÉF<ÊE<ÎIBÕPI×RMÕNKÓKK×LOéZ`ð^hüfrÿhxü]qóPeóMeýNkÿVzÿTxÿRrøTmö]qûhxûjw÷erüetó_mì`kêkrßruÃjfªd\žla}fVXH9kXJ”|r½ œÞÂÁîÖÖþîïûõõûûûûÿÿùÿÿýþÿÿþÿÿûÿÿúýÿþùûþõûüöÿþùÿÿúÿþúÿûõÿ÷òñèáäÜÑáÙÌðé×ÿúäÿÿæÿþåÿÿê÷ùëíðçèéáQK=PJ1ÃE6ÃE6ÅF7ÉE8ÎF8ÑG:×G<ÚG=Ö>3Õ;1Ö8/Õ4,Ö3*Ø4+Û4,Ú6-Û81Þ;4à=4à<3Ý90Ü5-Ü5,Û7-Ò.$Ý;0Ú=.Í1"Æ-Î7&Ò=)Í:&Î8'Ô8)â:/ó=9ÿ@@ÿ<>þ37ó,/ê,.á+*Ø*)Ô+(×/,Þ44ä88é99ï75ð74î73è71ã7-Ü6*×5(Ñ5&Í5(çPEÿmcÛHAÈ42×CCÓ>BêVVÙA<Ò>4Ë8.Æ6+Æ:-Æ/Á=.»9+»<-¾?0ÀA2¿A2½@.¼=.»<-ÄD7ÄD9ÈH?ÐPGÓRLÐOIÒNLÕONç_cîagûitÿnzÿduõVjõQiÿUoÿWvÿVtúXpñ^pônyöw€íksÞXañ`mñ`mìboïs}숊́|ªth™yjskXON:_VGƒqg¯–’ÜÀ¿ïÕØüéëþôõýûüýþÿúþÿþýÿÿýÿÿûÿÿùþÿÿûùÿõúýöÿÿúÿÿúÿÿøÿý÷ÿþöùðçíåÚéáÔôïÜÿûåÿþåÿÿãÿÿèùúêòôçîðåSM=RL4D=3B;3A:2@93A:4A96@;7A@;CC;IE9MG7OG2RF0UF1UH5WK?RHFXR^jg‚}§‰“Ä’žÚ˜¢ç¤§ö¦§ú«©ü«¬þ¬­ÿ­®þ¬®û¬®û¨¬ö¦ªô¤¨ñ£§ð¡¨î §í¤è›¢æ—žâ’šÛ‹“Ò†ÊƒÂ„ˆ·ƒ¨ˆyšmˆšcz©Xi»Q_ÏMYàIRèAIê=Aé=;ã>8ÝC9ÖH:ÎI8ÅF3ÂC0Å@1äTIàG?Ú;7Ø64Ø88Ø:;Ñ98È74À:/¾<.¿;.À:.Â8+Ã7*Æ4'Æ2&Î4*Ð3*Ñ3(Ô3)Ö3*Ù5,Ü5-Ü8/Þ=3Ý<2Û:0Û8/Û7-Ú6,Ø4*×3)Õ3&Ó3%Ð4%Ï6&Ò=)Ñ>*Ê9$À2È:&Ê4%Õ1'ç51ú<<ÿ=@ÿ7=÷37ê-1á-.Ù--×/.Ü43ã9:é;=ð9=ö26ø03ô01í1/ä1*Þ2(Õ1%Ï3$É1$Ñ=1új_äTLÈ95Ð@?Ë:=äRSäJHÜC=Ñ:3É6.Æ8.Å;0Â<0¿=/º;*¼?-½@.¼?-º;*º;(½;+¾<,¼>0¼>2ÀD8ÈLBÌPHÊNFÌLIÐNLç`dìaføhrÿo{ÿhx÷Zk÷UjþZrÿYsû]tîaræjtë}€ñ‡‰èwyÚ_dñgtþm|óeuëlwö‘•ì¢ŸÄ”Š¢|hjUHQSK>PJ>êDFå@DÙ8=Î65ÍB;ÈD8ÉC8ÇA5Æ>2Ã9,Â6)Â2'Æ2(Ë3(Î4*Ó5,Ø5.Ù4.Û4.Û4,äB7Ý=1Ù7,Ú6,ß9-ß9-Û5)Õ1%Ø8(Í2 Ê1!Ï9(Î8'Ç4"Ê7%ÔC0È7&Î8*×6,Þ5.æ3/î53ö:9û?>ÿLKúHFòBBì>=ê<=ç7:å26æ,1ô+1ø)/ô,.ï/.è1+à4*Ù5)Ó7(Æ0!À.ôdYë]SÏ@:ÔDCË;;ßMMêRQàHEÓ;6É6/Æ8.Æ9/Ã;-¾:+½;+Á@-ÀA.»<)·8%¸9&½<)¾?.µ7)³7+¸>1ÁG:ÅK@ÅIAÆJBËJEåa_æ^`ñdjþnwþkuó]iðXeø]mú^sõbtèdoãlrì~ù‹ö†…éqsøryÿy†õaqàXföˆ‘ÿ´´Ð®¢ ›‡]jPDR9QT?jbUœ‰‚ÚÀ¿òØÙöàãÿô÷ÿúýÿþÿýüÿþüÿÿýÿÿûÿþùýûÿúôÿòòþòùÿôüÿöûýòÿýôÿÿôÿÿóûõç÷ñáþùåÿýçþüãþýáÿÿêÿÿñüþóüüòXO@WP@WN?UN>TK2G?2H>2F@4FB9GE9JG8NI6RJ5UJ4UJ4VK9XNDUMKZTbkhƒ{~§‰Ã‘™×˜Ÿç£¤ö¥¢ù¢¢ü¡¢ü¡¥ÿ¢¨ÿ£«ÿ¤­ü¡ªõ¡©ñ¡¨ì¥¨íª©ï­©ó±©ö¬©ø ©ø—§ò’¡â–ŸÖ¦£Î¶ž¾¹…œ¸gz¿L]ÑERß>Mç;Gç?ß<=ÝEBÉ:4ÊD9ÊF:º1)ÛJEçIHéCEê=Aè;?æÚ<=Ô<;ÏB;Ç>6ÊD;ÑMAÍK>¿=0¸6)¼8+¿7+Ã6,È5-Ë2*Ñ/*Ô/+Û2/Þ5.çA5ß9+Ù1$Ý3&å9+ç;-ß8&Õ2Ï2Ì4Ê5!Ç4"Ç4"Ê4%Í5'Ï5)Ê0&Í3)Ñ5)Ò6*Ò4(Õ3&×3'Ü4)à2)æ3.ë52ë33é/2ç-2è-4í.5ö-3ö+/ï+,ì/-ê5.ã9,Ù7(Ð4%Ã-Ä3"çXHéYNË;3ßNIÅ41ÚHHáOPÜJJÔC@Ì;6È80Æ8,Ç9+È<+Å<*Â;(¾9&¼;(»<)º=)º=+·<,´8,µ;0¹=1»?3»?3¾@4À@5ÄA7ïjaõpiêc_ômjûqqìadôgmÿpyÿlzûhxðdoébiëdjîlnîqoîqoûy{ÿ}…ùZlücwßbpû¬¯¶ªš}‘u]rQJY:LR8snZ¥•ˆË·°íÕÓÿîðÿö÷ÿ÷ûýøüüüþÿÿÿÿþÿÿþÿûÿþðÿôåþéæûêïÿîøÿöüÿôþÿóÿþñÿýñÿûîÿúêÿùæÿùãÿùáÿùáüúåÿÿõþÿûÿÿûYPAXO@XO@VM>UL=TKÌLAÁC5¸:,·9+¹7*¿7+Æ6-Ë4-Ñ2.Ø3/á53ä84ä>2á;-Þ6)ß5&á5'á5'Ú5"Ó4Ñ9$Ë9"Ç9%Ç:&É<+Ë<,Ì8,Î4*Ó4.Ö5-Ó7+Ï7)Ë5&Ç4"Ë4!Ï4"Ø2$Þ2&ã0+æ.,æ,-æ,/æ-2è.3ì+.í,-ì0.è2.à4*Û5'Õ8'Ò9'Õ?.»*ÖD5Ð>1ÙF>ëVPÚB?ØBAçUVâRRÜKHÔC>Í=5É9.È9+Ç8(È;)Ä;(¿:'½<)½>+º?-¹@/¶>.²:,´;0·=0¸>1º?0½?1ÁB3ÅC5ëi\òmdçb[ðkfõolèbañklütxÿq~ÿo|öirí]fêY`ñbf÷qpþzxûvwÿx~ùRdþ[pä]nö¦©©¦“jŒkZtON_;RY:us\©ÖĸöáÜÿõñÿúúÿúûÿûüüüüüþýûÿþúþÿõÿúíÿóáÿéáýæéÿëóÿñøÿòýÿòÿÿñÿýïÿýíÿúéÿöåûóàúòÝüôßü÷äûûóüüúÿÿý\PB[OA[OAYM?XL>WK=VJDã=?å==åAá>CàBè;?ã9<Ü68Ö66Ñ96Ì;6ÕHAÄ;1¾5+ÅA5ÍK>ÆH:»=/·8)º6)¿7)Ç7,Ï6.×50Þ71æ95é=9×3*×5*Ú6*Ü6*Ý5*Ý7)Ú:*×>,Å4!¿4¹4!¹6"¼8)½8)½3(À-%ã@;å>8Þ=3Õ<.Î8)È7$È7"Ì7#Ò7%Õ3$×/&Ù.'Û.*Ý/.Û//Ü./Û,)ß0+à5-Ü5,Õ3&Ð4%Ð9&Ñ>*ÔA/Â1 çSEÒ;0ÚA;ÞC?èJIðTUíUTçSQãOMÝJCÖC;Ï<2Ê8+Å6&Ä7&À7%¼7&¹:'¹<*·>-µ=,²=,°:,±;/´<.µ=/·=.¹?0¾C4ÃE7Ü\Qêg]äaYðlgöpoçabìfgójqàR^ï^kõhqòemñ`gõfjùqqþxwútuÿnuóJ]øRhä[mñœ¡£œŠa€`UoHOd=W`Aww]­¥’áÑÂÿîæÿøñÿüøÿþúþÿúûÿüûÿýûÿýùÿûóÿöèÿîÜþãÚøÞáùáéüæïüèöýëýþìýúéÿúêÿøçúñàôèØòçÕöëÙøñáþúñýüøÿÿû\PB\PB[OAZN@YM?YM?XL>XL>UI;TH:SG9RF8RF8RF8RF8PF:LE;KGEç=Fã?FÖ:>Ñ?@ÐDCÆA<º61Å>:êZYÝABã@Cæ=@ã:=Û89Ó97Ð<8ÎA8ÏE;Â:.»2(À/¸9(½8)Â9)Ë8.Ò:/Ù80à91è;7ë>8Ø1+Ù2*Ü3,Ý5,à5-ß7.Û9.Ö=/É7(Æ:)Á<+¾<,¿;.Á;0Å<6Î95ëC@í@<ä@7Ú<1Ï9*É8%È:&É;%Ï<(Ð7'Ï1%Ñ1%Ô1(Ö3,Ô1,Ñ/*Ó2*Ó5,Ó7+Ð7)Í5'Ê7%Ë:'Ì>*Ì;(Ï<,ô^PàF<Ò3/Ò.,æ@@ûWXÿusÿroÿjgö^YçPGÕA5Ç5(½.Ä8'À8(»8&¸;)·<,µ=-²=,°<-¯;.­<.°.¼B3ÀF7ËMAß`Wâa[ôpløstæ_cä]aæ]dÖHTçYeógrôgoöelükpþsvþvvûpsûenñDXôKbåXk뒖 •ƒ_zYQlCSh?\gEy|_°ª”çÜÊÿõèÿùðÿûñþþôýÿ÷ûÿúùÿúöÿøòüóêûëÚøÞÎóÒÊëÌÏìÎ×îÒàðÖéóÛò÷áöõáûöãüõãõìÛíáÑéÝÍíáÑñèÙüõíü÷ñþùó\PB\PB[OA[OAZN@YM?YM?YM?WK=VJ@Ð@?ÐIEÀ?9³2,ÈC<àUPÜDCáACã?@á>?Ú?=Ô@<ÑD;ÏF<Ç=2À8*½5)½9*¿=-¿=-½;+½<)Â:*Ç;*Ï;/Õ;/Û8/à8/ç83é:5æ95ä52ä20æ21ç32æ40Ý2+Ô0'Ë1'Ë7-È:0Ä7.Á4-Ã40Ì:;Ý?@ë8;í76ä71Ø5,Ì4&Æ5"Ä7#Å:%Ë=)Ë8&Ì4&Î5'Ô8,Ô:0Ó9/Ð8-Ð>1Ê;-Å8'Ä7%Æ9'Ç<)Ç<)Ç:(Í>-Í:*Ø>2áC:Ô/-ä::ß13ß56×53Ö;6ÞC>åKCêQIêSHèTHäUGË?0Ä?.¾<,¸=-·>-´?.°?/®>0¬<.¬<.¬<.¬=,­<,±=.·A3ºD6ÆLAÝcXàc]ïolôrrå`cå`eç`g÷kvûoz÷kví`hð_fýlqÿy|ÿy|úmsø^jóAWôC]èUh懍£“ƒg]YtI^uIhwPˆf³²–èâÌÿúéÿýíÿþïýÿòûÿôøÿôôÿñíûêäòáØî×Åèǻ伺޺¿Þ¼ÇàÀÍâÃØæÌãëÓìîØóðÝ÷òßóêÙìàÒèÚÍêÜÏïáÖòèßñèáòéâ[OA[OA[OAZN@ZN@YM?YM?YM?XL>XL>WK=VJQI>QI>SK>UL;XM9XM7YL9YL;WK?ULGYSWe^nnjƒut–~}¥„…±†‰´‡‰¹Š‹Á‹ÈŽÏŽŽÔÕÓ”Ó‹ÊƒŠÁ{‚¸u|²ov­io«ljœ€lˆ“cy®YvËPoãBdð7Vö4L÷8Hï@EåFBÝJCÛJEáGGèCJò=Nð>LäCI×CCÌA>ÎIDº;4°4,ÉI@ÕLFØBAÚ?=Û;;Ú<;Ø@=ÔE?ÍG<ËG:À8*Á8(À8*¾9(¼9'»8&½:(À;(Ä;)Ê=,Ò<.×;.Ü8.á6.ä6/è50é32è./é,0î02õ47õ77î45æ21Ú.*×4/Õ62Ñ32Ï/1Ò/4Û6=ê:Dí06î02æ3/Ü3,Ñ5)Ê7'È9(É<(Æ8$É6$Î6(Ó:,Ú>2ÝA5ÝA5ØA6ÓG8ÉA1Â;(À9&Ã<)Æ=*Å<*Å8&Ì:+Í7)Í0'æC<Û2/ï?Aã/2Ú*,Õ1/Ò5.Õ81Ö90Ò8.Ì5*Æ2&À1#ÎE5ÆA2¼=.µ:*±9)¯9+«:,ª:,«;/«=0¬>/¬<.«<+­<,²>/µA2ÉSGàg^ßd_èkiînoæchðjqõoxúq{üs}ömuîbködnÿrzÿx~ÿquúipøWfùAYô@[êQfá~ƒ¬—†ykmˆ]o‰ZyŠ`—r¶·˜ßÞÂùôÞüúåÿÿïûÿïõÿïïÿëçúäÜïÙÐãÍÅÞÁ°Ö­¨Ó¦ªÐ§°Ó«¶Ô®¼Ö±ÇÚºÒßÁàæÌèêÔòíÚóêÙîâÔìÛÑêÙÏìÛÓéÚÓæÙÑä×Ï[N>[N>[N>[N>ZM=ZM=ZM=ZM=YLUL=XLNÝAEÔFDÈA=ÉHB´:/±7,ÎOFÉB<Î=8Ð64Ï10Ð51Ó>8ÑD;ÈF9ÃD5À8(Ã:(Â:*¿:'½8%¾9&¿:'Á:&Ä9&Ë:)Ó:,Ù9+Ý7+á5+ä3+ê3-ë*+ñ*-ø-3ü/4ÿ17ÿ37ÿ38ý58ù8;õ8<ò9>ò9Aô9D÷7Fû6Hþ5Eó*4ô-2í12ã4/Ù6-Ð8*Î;+Î=,Ë5&Ñ8*Ù;/ß=2â>4ä=4å>5ßA6ÙJ<ÏG7ÉA1Ä<,Â9)Â9'Æ8*È9)É2'Ó9/á@8ëD>Þ0/à..ë46è66Ø3-Õ7.×90×:1Õ;1Ò;0Í:0É;/ÖL?ÌF:¿@1´9*°6)¬6(«7*©8*¬;-­=/®>0­=/«<+«<+­<.±=0ÀKAÚdZÞc^èkiðosêinõrzüvîfp÷oyùryöjsþlvÿwÿu|ùhoùcn÷RbþB[÷ZM=ZM=ZM=ZM=ZM=YLVJ>XL>YN5É83Ç/,Å*&È/*Í:3ÍC9ÃC6¼>/À;*Ä;)Ã<)Á:'Â;(Ã<)Â;'Ã8%Ä5$Ê7%Ô8)Ù7*Ý5*á3*å3)ê2*õ33ÿ58ÿ8<ÿ4:ÿ-2ÿ(-ÿ(-þ+1ü-3ö)0ò&1÷)6ÿ,?ÿ*Aü 9ó/ö"0ó(.í,1æ0/Ú1,Ô3+Ñ5)Ð6*Ô6+Ý90æ=6ë>7ë:4è71è50â92ßH=×K<ÓE7Ë=/Ä6(Â3%È6)Ï8-Î4*Ô6-æC<à93à21Ò ì89å63Õ1(Ò4)Ò4)Ï5)Î6+Ê6*È5+Å7+ãYNØRFÊH;¾@2·;/µ;.µ<1µ<1¯9-±;/±=0±=.¯;,­9*­9,®:-±<2ÐYQÜb]ìppôvyîmrõq|ör}ÿzƒÿ‰ÿy€ôhq÷epÿq|ÿuÿktø^jöOaÿA^÷8WéG^Ûntº‹™©„‚žn}™f€–gœq¡©‚´º–ÈÍ­ÕܽÌÙ»ÁÔ´²Ì©§ÂŸž¼˜š¶–²Œ±†‰³†µ~¹„•À‹œÂŸÄ‘¨Å™²È¡¾ÎªÉÒµÚÙÄæßÍêÞÒéÖÏáÌÉÛÆÃÔÁ»Î½µÈ·°ZM=ZM=ZM=ZM=ZM=ZM=ZM=ZM=XK;XK;XK;YLYM=YLCWLHXNOZPX]Ub`Yia\rjfokŽsp›vq§{u³ƒ~ÁŠƒÉŠƒÇˆÀŠ~¼ˆy²ƒr¨†r§t«‡l£†\„HL¤B9¶A:ÍC@Þ@?è:;ô<>ÿDE÷><ó=<ì>=ê@AëBIêCMëANãALÐ>>Å@9¾?6·>3°3µ6'»>,»6%Á:'Ã<)Â;(À9%Â9&Æ;(Ç:(Ë:'Ð9(Ö6(Ø2$Ú."à/%ì7.õ=5õ82÷40÷0-ø**û&(û%'û%'û%'û&*÷!)ø".ÿ'7ÿ(>ÿ!;ÿ6ý1ÿ'8ï#,æ#+ã+-Ý--Ô+(Ò-)Ü41â62è64î66ò65ò12ï./î,,å/,Ü92Ñ:1Ò91ìSK¼#Ä+#ßF>È.&Í.(Þ<7èE@â:7Ø/*Ú.*â51å<7ß>4Õ<.Ï5)Ë3&Ì5*Í;.Ë;0Å8.ìbXàZOÈC:¹6,º:/¸8-±3'´6*°0%°2&®2&¯4%°6'²:*´<.³=1°:0ºC;Ö\Wìppñsvöx|ûyƒõq|ÿ|„ýw€út}üs{ÿr~ÿr}ÿmxÿgsü`nôI\ÿ>\ÿ>[äAVÔek´•€’¡zƒm}™f~”c‡—j”Ÿwž¦ ¨ƒœ¨„’£Š£|€Ÿvzšqyšo|r vƒ¤u‚­wƒ³y‹¸‘¼„“¾†—¾‡œ¾Œ¢½§¼“¯½š¾Â§Ï̹ßÓÇãÒÊÜÇÄÔ¿¼Ìº¶Á²«¹ª¥ZM=ZM=ZM=ZM=ZM=ZM=ZM=ZM=XK;XK;XK;YL]P@[OC[NFYNJZPQ\SX_U^_Wfd\tibƒng‘qjxp¬€y¼‡€ÄŠÄ¿~ºt«Œn¢—q¤¡u¨šjž™W{=Aª5+±5+Â<3Ó@8Ý>8è?:óA=õ=;õ;<ô;@ñ>Bî@IèAIâ@KÚAFÇ<9¼<3¶<1±;/«:,®:+½A5ÐJAÚG@ÜA=Ô63Ð51Õ@9ÍC8»9+²5#½8'Â;(Ä=*Ä=*Ä;(Æ;(Ç:(Ê9(Ï9(Ï6&Ô2#Ú2%ã5*ê8.ï80ð91ç1&ç/%ê.%ï,&ö+'û+)þ,+ÿ-.ü*-ú%+ú$.ÿ'7ÿ$;ÿ7ÿ3ü0õ0ö.9õ3<å*1Û(,Ü.0Þ02Û+.ñ:>ô7=÷4:ö26ö/4ø03ù25ô87Û2-Ú;5×82äE?äE?Î/+Ñ2.Á"Ô51á?:èE@à=8Ø3-Ù2,Ý60Ý:1Ô:.Ï9*É5'Ç5(È9+Ê<0Ê<2Æ9/ícYáXNÉ@8º4+Â91Ã:0¿6,Â9/¿5+¾4*½4*»5)¸6)µ5(²7(°6)´;0»B9ÓYTèljïqtöx|þ|„øv€þ|„üyùv~þuÿsÿp}ÿkwüdqý_nöI]ÿ>\ÿ>\éCYÓeh®Žw‰˜oz•bu’\xŽ]cŠ•k˜p‹•p…”mp‡]l‰]h‰\g^l`q•ey›izŸk¬t„±vŠ·|»}¼“¼‚–½†›»‰›µ†¡³‹­¶—¾½¨ÏÆ·ØÇ¿ÖÁ¼Ï¼¸Æ·´»­ª²¤£\L<\L<\L<\L<\L<\L<\L<\Lù:Aö=Eï@GæAHÙ@EÏ@BÀ;6¸90±9+­9*©8(­9*»?3ÏF<ÙD>×96Ù74Ú;7ÜC=ÝOEÎH<µ3#¾9(Á:'Ä;)Æ=+É=,È<+É:)Ì9)Ï8'Ï2#Ó/#ß4*î=3ô?6ñ91é4+à4&Þ4%â2%å/$ë,$î+%ñ+(ò+(ó+-ð(+ò&/ø(5þ%8ü4ü3ø3ô%7ò0;ó5?ò9Að;Dðä,6ð2<ó/;ö.9ö-7õ.3õ.1ó/1í42Û/+â=9Ú64ß;9ÿmjåCAÑ/-Î/,Ù:7ß@<àA;Û<6Õ7.Ö5-Õ4*Ò6*È6'Ã6%Â6'Ä8)Å;.Æ<1Æ<1Å;1ë`YáTMÉ<3¿0(Ë;3Ñ>6Î;3Ò=6Ø=8×<7Ô=6Ï<2É;1Â:.»7*¶6)¹;/¼@6ÏTMãgeíorøz~ÿˆû|ƒû|ƒûyûx€ÿwÿsÿn}ÿgvû`pü[mõG^ÿ\ìFZÎ`až~ev…Zi„Qh…OmƒRt…X{ˆ]}ˆ^x„\q‚X`zM_Pa…UeYn•`uœg} j~£mƒ¬r„²tˆ¶x‹¹y‹¹y¹z‘º~”º“±•¬€›©†©­’ºµ¢Ç¹®Ë¸²È¶´¸¬¬ª¡¢ —š[K;[K;[K;[K;[K;[K;[K;[K;ZJ:ZJ:ZJ:[K;[K;\L<\L<\L<]K=]K=]L<^M=^M;^O<^O<^O<^Q@^Q@]OB[OC\NE\OG\OI]OO^P_bTmdY{i^‰pgœ|t­…{·ˆ{³™…¸¥…´¯€ª¸z¡ÆxŸÑuœÊdŒÆMlÜFRßA@ÕA=ÏE;ÌH;ÍG;ÓE9ÞA:î@Aõ0ÎD:Õ<7Õ31à;9åA?áD?èSLßUJ¿:+Á9)¾7$À7%Ä;)É=,Ê=,Ë9*Î8)Î5'Ò2$Ù3'å9/ñ>7õ>6ð5.ä/&à6)Þ6)à4*ã1'ç.)ê-)ì*(ì**ê),è',ë'1ò*7ö';÷!9ü>û%Aû6Hä(6ç/;ÿP[ÿ`lÿP\ò;åGDÛ=:Ú<9Õ:5Ò80Ñ7-Ð6*Í4&Æ3#¾5#¹6$»8&¿;,À9é=9æ?9á@8Ù?5Ï<2È:.Á9-»9,»=1ËNHàc_ìnoú|ÿ„ˆý~…øy€øy€üyÿx‚ÿt‚ÿn}ýetù^n÷VhóE\ý8Vÿ^N>\O?^NA]OB^PE^OJbNYbQdcTqdZ}le‘xr¢w¨ƒv¤”}§¬†«Â‰©Î‚žÚw”ál‰ÛXwÚD_óBTúDPïJPáIHÐE>ËE<ÐF<ÙD>èBBð@Cõ@GõBHíDGßCDÏA=Â?7¿@7µ=/®:+«:*ª9)®8*»;.Ì?6áFAâ=;îBBëAAÞ;6ãJBæXLÕK>È@2¿7'¼3#Á8(È<-É:*Ë7)Ð8+Î0%×3)à8/é;4í:5í60ë0+å,'ã0,ã1-ç10ì31ó25ö37÷48÷6;ì-5ê,6í.=ñ0Có-Fõ(Fý+Nÿ3Rô9Lå3?ð@Mÿ_lÿkyÿWfõCSõ>Pî3Dí3Aí3>é6<ã99Û83Î4*Ç/$Ë2*Ç.(Ð72òYTö\ZòXVÛA?âHFÜB@Ô<7Î70Í6-Ï8-Ï9+Ê7'Â5#¹8#³9$µ:(¸=-¹;,¶6)¼7.Æ=5ÛNGÙEAÎ50Ð1-á>9ç@:ã81ç51ë20î21ë52ç83á:2Ø:/Ð9.È:.¾6*º8+ÈIBÜ_Yënlû}€ÿ…‰ýƒõv}öw~üyÿx‚ÿsƒÿk}ýdvù^pôSeôF]ý8Vþ=ZïL]ÀTRz_BWhÑC?ÖEBãEFèBDîAEíCFçDEÚEAËB:¿?4»?3±;-©8(¨9(ª9)°8*¼:-Ê;3èIEé??ë=>å78Ú2/ÞA:îZPôh[ÚPCÉA3¾5%Â6'Ç9+È9+Ë7+Ò8,Ñ0&Ú6-æ;4é;4ê40è/,ê-+ë--ó49õ3;ø3=ü3=ÿ1>þ0=ý1=ù1>õ0Aò1Bô4Kõ5Nõ0Nö-Oÿ1Xÿ>_æ3HùO\ÿanÿ_nÿWfûP`ôDXé8JóAQê:GÝ2:Ò/2Ê2-Â8-½;+¼:*Ä:/À2(ÙJBúkcÝLGáPKÏ;9Ï;9àLJÔ@<Ê70Ê7-Î-±9)¯3'º:/ÊD;ÖGAØC=Ô72×2.ç;7ì:6è2.í2-ò,-ô,,ò./ï31è71â:1Ú<1Ò>2Â6)º4)ÅB:×XRçjhú|}ÿ†‰þ€„õv}÷xýz‚ÿx‚ÿqÿi{ûbtø]oòQc÷I`ÿ:Xý?[ðO_ºQNqX:Sf8]uEa|InSv†Y{ˆ]~‹`g‚—l€œl}Ÿm|¤o}¨p€©o‚ªnƒ©l…©lˆ«qˆ®qˆ°r†³r„³oƒµp…·r‰¸t‹µv‰¬tŽ¥wš¨„°´™ÈïØ̾ÛÒÍÂÂÌ«±Á›¡±ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8[L9[L9\M:\M:]L:^K<`J<^K<_L=^M;_N<^O<^O<^O:_P;`O;aP>aP>aP>aPÉ@8¾>3¸>1¯9+¨7'©:)­<*´<,Á=1Ï?7ß=:å99ã03â/2à42Û94æMEülaòh[ÙQCÆÁ63É;7äUQÕF@É91Ç7,É:,È9(È9(Ä=)±?'¦<&¨;&¬=*«7(¬3(¼=4ÓLFÖGAÝE@Û96Ü30é73ì51ë0+ô1-ý,/ÿ+-ú./ô1/í4/æ81ß;1Ø>2É9.½3(À;2ÏNHáa^÷yzÿˆŠÿƒ‡ùzû|ƒÿ{†ÿx„ÿn~þew÷^põZlëL`õIaü9Wû=YîM]²JGhQ1Qd6\tDf~Nuˆ[Žc„h†’jˆ—n‰žsˆ¤t„¦t§r}¨p¨n©mƒ©l…©l…¨n‡«n…­o…¯o°l€²k‚¶n…·r‡³t‡­t§wœ¬…²¹šÈƯ×νÙÒÌ»¿Ê¤¬¿’š­[J8ZK8[J8ZK8[J8ZK8[J8ZK8[J8ZK8[J8[L9\K9\M:]L:]L:^K<^K<^K<^M=^M=^O<^O<\O<`Q>aR=aR?bQ?bQ?aP>aO;bL>hOKgNRbP\cWkjfuv”}|œx—‘z–«•Æ„’Ú}…ðuzýklÿY[ýDLþ/Iÿ5Rÿ4½=0µ?1¬;+©8(­<,´?.»@1ÊA7ØC=Ù74á85Þ..â30æ:6Ó0'Ñ5)ëUGÿwjë[PÑC7Ê<0Ë;0É7*Í6+Ô:0Ú70ß82å63ç32ê01í12ô36ý4<þ%6ÿ#9ÿ"9ÿ"9ÿ!8ÿ6ý5ø6ï2î9ð%Bï(Gî&Jñ'Mÿ3\ÿEhÿbuÿ`l÷WcñQ]òP]ïMZâ@MÔ2=Ú=DÌ79»/.®/(¦5'¢;(›?&œ>%ª9'²8+ÑUI»;2Ä?8¾41½2/ÎC@åWSÕHAÈ91Ä6*Å6(Ä5%Æ5$Ã:(±<(§:&¨7%­9*¬4&¯1%Â?5ÛRJÙIAáHBÞ;6Þ2.ê41í1/ï-+ü22þ,/ý+.ù+-ó++í-*æ1*ß4,Ö8,Ñ=1¿2(¼7.ÈIBÙ\Xówwÿ‰‹ÿ‡Šû€…þ†ÿ}ˆÿv„ÿj|þ_s÷XlöTiêD\õD^õ6Uñ:VàLZ¥HC^K-Mc5Uo?b}JtŒ\€–g‡˜lˆ›nŠ r‹¥vŒ¬z†«wªr~§m|¥i}¥g¥g‚¦i‚¥k‚¨mƒ«m‚¬l®h~°i³j„¶o‰¶s‰¯rŽ¬x™°„­»˜¿Å©ËʵËͶ½Åžªº‹—§]K7\K7]K7\K7]K7\K7]K7\K7^L8]L8^L8]L8^L8]L8^L8]L:]J<]K=^L>\L<\L<[N=]P?^SA`SB_R?`P@bQAcRBdQBdNAdLBjMIhKMdPYf[lnk†w{ž€…­‰ˆ²ƒ©¥‡©¾ˆ Ð‚’ây~ðsqújbÿa^ùJWñ>Që:Lî?NïCQê@Kæ9Ê=4Á;0¸:,§6&¯A0­<,¬6(¿A5ÌF=Ì=5Ð72Ú85Ü71Þ5.Þ6-Þ8*Ý<*Ù:'Ó6%Ù;0ðSLòZOÙE9Ç8*Í>.ÔB3Ò:-Ô3+ðGBá//î5:ó6=î,7ÿBMñ'3ú&2ÿ)2ÿ(2ù'ý"*ÿ'/þ'/ð&ð)ù+7ê .ì&7ñ-Aç#;ÿXrç-Dÿ]lÿ_iþZcùU\õPWëHMÝ?@Î95Ë>7ÄA7·?1¦7&™2!™6#š;'Ÿ<)§8-®7/ÂE?¿;7½31Ä64Å54ÔDCÛLHÚKEÑD;È:0Ä4)Ç5(Ë4)Å5*¼1¹=3Ö_Yésqÿû„†û‡Šÿ„Œÿxˆÿh}ÿ_wÿ[uÿUoøLføEcñ:Yô;[æ?YÛ]i‹@;VF-L^6YuBg†Mw–]}œcg€¡jƒ¦n‚¨o€§n¦m~¥l}¥i|¤h}£f£e£f~¤k¦m«l¬k~­g®f±gƒ³i‡µm‹´r°vŽ®|™´‰§½™±Á¤²Á®¦²°˜žz…‹]K7]K7]K7]K7]K7]K7]K7]K7^L8^L8^L8^L8^L8^L8^L8^K:\K;^L>_M?^N>[N=[N=\Q?^RB_SC]QA]OB_OB`NDbPFcOHeNHiMJgNQdR^g_tnny~¨€‡»‡ŠÁž•Ê£‹»«£¹xÓyƒê|{ôvjöi`ø]aóOZìFRòHSøIVõEPï?Jë;Eä9?à:<Ú::Õ=8Î?7Ç>4À/Ç8(Ê8)Ó;.Þ;4öJFä01ð6;ö6Añ.<ÿ@Nï'4ó$,÷%(û),ý+,ü*+ø((ö((÷+,ï$'í%(ë&-ý;DÙ'ð4CüARØ&6ÿjuÿbjþZaüW]ôOSåBC×<8Ñ>6¾8,¿D5¹H6©>,™/)(’(ž-%°:6ÑTPÎHGÃ54Æ45Ñ==ëWU×FAÖG?ÐA9Ç9/Æ3)Ê6,Ð7/Î70Ç=3Â91Â5.Ã2-É4.Ñ83Ø?9ÞE=äJ@ÞA8Ú6-Ý0*ç0,ò21û03û03ô02ó12ô01ó/0ó0.î1-ç4-ß9-×=1¿3$¾aP@`P@]P?\O>[O?[RC[QE[QG\OG\OI_PMcQOfTTgUUgUUgV\h]nli†sv£|ƒº‚ŠËŠÔ˜‘× ŠÊª‚´¹}ŸÏ€“䄆îvósjüfh÷S\íGQðFOöHR÷EQòAKî=Eä7=à7:Ù99Ô<7Í@7ÅA4¾?0¶>-­>-ª<+«:,¸B6ÇH?À;2»0)Ê:2Í6/Ð6.Õ7,Ø8,Ù7(Ù8&Ü9&à:*Ý4-Û4.âA9éOCÞH:È5%È2#Ù@2â>5õHDè13ò5;ù7@ø4@ÿESø2?ð)0ë#&ì$'ù13õ-/î&&ì&%õ12ë)*ö8:è+1â)1ë3=ÿR^ï=Kÿ\iþ^fñV\îOTðMRêEIÝ:;Õ74Ô?9À6,À>1¼B5³=1¬7-¥3)¡,#œ' š%©/*ÇECÂ::¼,,È35×ABô^]Ñ@;ÒC;ÐA9Ë=3Ì9/Ô=4Ú@8Û@;Û@<Ø=;Ý>;ãA?ä>>à::ã?=ëIDàB9Ý<4Ù5,Ý2+ç1-ð31õ12ø02ô02ô02ô01ó/0ó0.î1-ç4-ß9-Ø>2À4%º8+µ;0Ð[Tízwÿ“’û‡Šúƒ‰ý~‰ÿr‚ÿdyÿ[tÿTqÿNmÿFgû=_ô=\îEbßTg¢BFp<1QI2Pb<]xEf‡Nr“Zu˜^tš_xžc{£g|¤hy¢fy¢fy¡cx byŸby a| bz cz¢f{¤h{§h{¨e{©a{©`}«`®`‡²jŠµn‹²s‰¬t†¦w‚žuy“no†lSeYAPM2A>^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^M9^L8`N:aP<`Q>]P?ZN>YOCXPEXOH[QO_UTbXYeX_iYcl\fk^glaildqok‚rtšy~µ†Ê…ŒÚŒŽáŽ‡×Ÿ‹Ó­ŠÄ³€©½yŽÌ{Þzò‚wÿsrÿcgùU\ôMTõGPôCMò>Gï-±=0¼F:ÌRGÇH?º5.º1)È91Í81Ó;0Ù=1Û;-Ù6'Ü6&à8+à5-Û2+à=4ìNBãK=Ò:,Ñ8*àB6ß7.ð>:é/0ð16÷4<ü8BÿNZÿLUý>Eò38â$&í/1ê,,ð22è**ë/.ò::Ñæ37Ý,2è9@ðENÿXcòNWØ=CÚADáBFá>AÞ9=Ü89Ø88Ó97É83Â91½:2ÀA:ÍNHÖVSÐNNÃC@²72¶95ÏKIÙMLãQRïYZêRQñYVÉ51Î>6ÒB9Ð@7Ó?5ÙB9àC<â@=é?@ç8=ì9=ò?Cï:?è58ì>=öMJÞ93Û60Ú3+Þ3,å4.ì30ò21ô01ô02ö/2ö01õ/0õ/.ð0-é4-à8-Ù?3Â6'·5(³9.ËVOï|yÿ“’üˆ‹ý‰þz‡ýoücwÿXqÿOlÿFhÿ@cù:\ô?^éKdØZh…43f<.VP8WgCa{Kj‰Ps’Yt•\u˜^wby¡ez¢fw dv awŸavž`xŸ`xŸ`{Ÿaz cz¢fz£gz§fz§bz¨`z¨]|«]~­_†²g‹´nŒ³tŠ­s†¦u€qtŽii€dQcUDSL8G@^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M9]K5_M5`P9_P;\O>ZN@XOFXQKYPQ`W\g`hnfsshysg{sg}qh}ol}pq†rw—v}«z‚Á‡Ò„Šà‹Œæ“ãŒÚ „¿žuŸ l‚¬nq¼vlÒviòsmÿllÿgiþ^`ûRWõFMï3Û=1Ú6*Ü4'â6*à3,â70ä=5åE9âF9ÞB3ÞA2â>2Û0&ê72ì0/ï.1ñ.4ú7?ÿPXÿ]dÿZ_ÿOSá.1ã03à,-÷EEè66Ü,,Û-.ë>@Ü25Ù37ÿbhàÆE@å^[øhgÿopÿjjåKK×=;É40Ñ>7×D<ÖC;Õ>5Õ<4Ø:1Ü41î5;ñ-9ð,6ò.8ï,4ë,3ó9<þJKß3/Ü3.Ú3+Ü3,ã5.ê40ï4/ò21ô02ö/2÷/1ö.0õ/.ð0-ê3-â7-Ù?3Æ8*´2%²8-ÃNGï|yÿ’‘ÿˆŒÿ‰ÿw…úl|øatûTnýHgÿ>bÿ:_ú6\óAaàNcÂW_p/+_?0[W>^lIe}Mk‰St’\u–_v™_xžcy¡cx buŸ`uŸ`u_vž_wž_xŸ`{Ÿaz¡bz¢d{¥e|¦d|§`y§^y¨Z{ª\}¬^€¬a…¯g‡®m‡ªp…¥sƒ r{•nrŠjexe[k^RbU_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N:^L4_N4`N8^O:[N>YOEZSMZTT_ZahbprmzuŒ{u‘{q“zp“vp’ps’rxšt}¨w¶zƒÄ~†Ï„‰Ú‹ŒÞ–Ü™ŠÍ›…¶¢ƒ£ª„‘«~yŸl[šQ>¼MBÔQIâWRëWUñSRñKMí>Cå4:é9<æ9;à;9Ø=8Ó@8ÊB6ÀA0º?/³9,ºA6«5+£.$¾I?Ùg\ÙdZËUI¸<2¸6)À3)Î:0Ù;0Ú6,Þ3)ä6-ß1*ä71ã;2Ý9/Þ>0ãF5äB3Þ8*ß1(é4-ð31ï-.í*.ô17ÿEJÿV[ÿ]bÿ\aâ9<ã9<Õ+,ôJKâ89×//Û57Ì()Ì'+øXZÝ>BÖ:>Ñ6:º#Ä(+Ü<>æAEÝ49Ù,2Þ17Ù05Í(.Ò37äKNöaeûhnùcl÷`iú`løbkÖLLÕNJê\ZêVTçMMãHFÏ42Î3/ÙA<àKDäOHßJCÙ@8×:3×6.Ü.-õ1;û-:ø*7õ'4õ)4ø0:ÿ>CÿJJà1.Þ3,Ü3,Ý5,á4-ç4/ì3.ð3/ô02÷/2ù.1ø-0ö..ñ/-ë2-â7-Ù=1É;-³1$±7,ºC=ìyvÿÿˆÿ|ˆÿqöhxö_rùRlùDcÿ9^ÿ6]ù7\ðFcÑN^¢IKe5+VD0[Y@^lIe|NkˆRt‘[w•_x™`{ždz cvž`s›]rœ\s›\tœ]v^wž_{Ÿaz¡by¡bz¤b|§b{¦_x¦[x§Yz©Y{ªZ~ª_ƒ­e…¬k‡©m‰§s‰¥u„s|”ru‰pnlfwe_P=_P=_P=_P=_P=_P=_P=_P=^O<^O<^O<^O<^O<^O<^O<_N:aP6aP6aO9^O<[OA[RK\VV_Zakgvso†}z—‚~¡|¥}w£{u¥xv§sy©s}°x¸{„¿~†Ä„‰ÉŽÎ”“Íš“Ç •½«›µ¼¦²É­©Å¦”ªˆmœfJœE2¯A4¶@4ÂB9×IEèNNîJKì?Cë=?é;=ä<;ß=:Ø?7Ð@5È>1Á=0½:0¼@6¯4,§1'»I?ÑcVÖh[ÕeWÃOBº>2º4)Ç7,Ö90Ù5,ß2+ç60â0,ã4/â7/Þ7.à>1åC4ä>0Þ4%æ4*é0+ð3/ð..ï-.ò14ó78öBEöMRüY^éFKöQWØ37ëFJÝ8<æAEÚ7:Î.0Ñ05äHKÒ7;Ð7:¹#%Õ;=Û8;å;>ëÿ0>ú*7ü.:ÿ;EÿCHûABã1/ß4-Ý4-Ý5,â4-æ3,í4/ñ40ô02÷/2ù.1ø-0ö..ñ/-ë2-ã7-Ø:/Í>0µ1%±7,²;5ésqÿŠŠÿ‡ÿv†þi}óató[p÷PjúCbÿ8`ÿ8aù;_ìLf¿O[~86]=0NF1VX@ZeEcxMj…RrŽ[v”^yša{ždxžas›]p˜Yp™WqšXqšXt›\uœ]y_xŸ`x¡_y¢^z¥^y¤\x¤Yx¤Wy¥V{§X©_‚¬d„«h†¨l‡¥o†¢q€šmx‘jq…ikdbv]_P=_P=_P=_P=_P=_P=_P=_P=^O<^O<^O<^O<^O<^O<^O<_N:cQ9cQ9aP<]P@ZPG\TR_Zaa_mtrŠyx˜€¨ƒ°}}¯yy¯yu°wwµw|¾x€Á}…Ä‚ˆÄ…ŠÁ¿—–¾ ¼¬§»¶¬µ¾³±È¸«Ð¾¦ÖÁ¢Ñ»–Ьˆ¯oT®\G¤G5¨>0ÂG?àWQïWVñNOé@Cê=?æ<=â=;ß=:×=5Ñ:1É90Á80À=5¹:3·>5ÁOEÇXMÇ]OÑeXÓcUÂL>¼:-Å8.Ò91×4-ß2,ç60æ40á2-à5.ã<3çC7æC4â:-ß3%ê5,æ.&ð0-ï/,ð31ñ54ç-.â24çBF÷X]öW\ÿouåDJëHMà@Æ02Ö:=òHKî9>ð7?ø=Fò7Bè-8ô>Jÿ]gÿmwÿjrÿcn÷]gú^kÿaoÿ]nùYeò\]ãPIâJGÕ74Ò/0Ù54Ò0.Ø95ßD?ãJDâIAÙ@8Ó6/Ö4/Ü71é77ê'/ü0<þ2=÷+6ù0:ÿ>Eý?Aì44â3.à5.Þ6-ß4,á3*è3,ï4/ô41ö01÷/2ù.1ø-0ø..ò/-ë2-ã7-×9.Ñ?2¶0%²6,¯50çonÿ‡ˆÿ†Žÿp‚ücxñ\pôXn÷OiûBbÿ9aÿ`P@`P@_O?_O?_O?aQAbRB_O?]M=]M=aQAcSCbRB`Q>dS?aP>]P@^QI[QPZSZeapsq‰yxšz|¥~€±€¹}ºxz·rs´lo¶twÈv{̀ƒÊ‹Æ–—䤾²°»¼¹´ËƳÓÌ°ÙϬÛϧÜÏ£ÝУ٘٘Ѩˆ¸€g ^HËzgÖtg½H?×QN÷ccéKLå?Aâ89ä::â:9Ü75Ù61Ö;6Ë81À5.ÇB;¹=3¿I?ÆXK¹OAÎdVÑcTÌXIÅG9Ä:/Í6-Ø7/á6/ã4/ß0-ß2,à70ä=4à<0Ý7)ß5(å7,ä/$ê/&ì/)î1-î20ë40è51â64×79æJNõY]íNS×8=×6<ùX`ÿ~„ÿ~†ÿouÿgoÿipÿflõ\añX[ûZ_ÿUZÿDKü8Bû7A÷3?î+9ì0>ñ=HÿS_ÿ`iÿgrÿepþbmÿcnÿ`oý]gíSSßF@Ö85Ö41×11×/.Ø31Û94áD=ÜB:Ù?7Ö<4×90Û81à93æ66ñ7<ó4;õ3;ö4<÷6;ò59ë33ã1/Þ3,Þ5.ß7.à5+ä3+é2,ï2,õ20÷12ø03ú/2ù.1ù//ó0.ì3.å7.à?5Ì8,¿6,¯/&¸;7ÒXWÿ˜šþ{ƒÿm€ÿe|ø\rðPhôGeüCeÿ;bù9^õNlÓRd‰=?Q-!C;&CG.KM5Z`DZjEcxMqˆZx’bx–`t•\r–Yq˜Yl•Sm–Rn—So˜Tr™Xt›Zuœ]uœ[t›XtWv Xw¡Wv¢Wv¢Uu¡Tt S{¥[{£]zž^u—[m‹Ub~MXrCSj>AW0?U/`P@`P@`P@_O?`P@aQAcSC`P@_O?`P@bRBcSCbRB`P@fVG_QF\OG^TSaZad`omkƒvw–wy¢{}®}¸x|¹quµkp´lo¶nq¾uvÐ|~Չ‰Ó˜˜Î¨§Ç¸¶ÁÉźÓαÛתâÛ¥çÞ¥æÝ¢äÛ¤âØ£ÛÑ ÔǛӼš»œ€©|eŋwÊ}m´VJÒa[örpìZ[çKLã?@ç=>ë>@ç;;â66Û64Ö=8É83Ê?8¹6.¸>3½K@¶H;È]MÝo`Ô`QÆH:½5)Å1'Ô6-Ü5-Û0)â51å95ä=7à<3Ü8.Û5)ß4*ã5*ì7.í5+í2+ë0+ç0,ã2,á4.Ý52Ö87Ø>@äJLóW[ú^bü\dþ]eÿaiôS[ïNVñQYÿ_gÿjqÿflõZ`óNTí4:ñ,5ô*6÷-9ñ'5å!-æ'6í7CþPZÿZdÿblÿdmÿenÿcmý[hõQZåEEÞ<7Û64Þ63ß55Ü30Ú2/Û62à>9Û>7Ø;4×:3Û81ß82å95ç:6ê7:ë7:í6:ï79ï79ì65å31ß2,Ü3,Ý6-ß7,â6,å2+ê2*ò1,õ20÷12÷03ú/2ù.1÷//ó0.ì3.å7.ß<3Ô=2Â8.¶1*·74ØZ[ÿ“ûs}ÿfzÿ^vùWo÷OiùFfû?bü^QA^QA^QA^QA_RB`SCaTD`SC_RB`SCaTDaTD`SC^PCbUM\QM[QRcYbkdtqm„vu•z|¥y{¬y~¶x|»nsµei°`g¯jn¸ruÆ}}ׇ„Ý—”Û©§Ø»¹ÏËÊÈÜØ¿åá´éäªíè¦ðé¥íå¤çá§âÛ§×Ï¡Ëܸ¯©››ƒk¨ƒp§o`œRGº]UÝmi÷uuï__äJLå@DëADì>@è8:â66ß=:Ô;6ÔA:Â70·7,·>3®=/¶F8Ûj\ßi[Ù[MÊB6Å2(Ñ4+Ù6-Ù2,Þ52éA>ìGCà=6Õ2)Õ1'Ú2'Þ0%æ4*è1)ç.)æ/)ã2,â7/á=4àB9Æ-(Ê43ÜDCðVXú^b÷ZaóS[ñQ[èFQêHSïOYü\fÿmvÿntôY_ã>Dé.5ô-4û2<ü2>õ+9í'4ö6EÿKW÷ISõPWøW_þ^fÿckÿ`i÷RYéBIÞ97Þ71ã75é<8ë;;æ95á51Ý60Ý:3Ù;2×90×90Ü71á83ç:6é<8ã99ã99æ87è88è88æ74á40Û2+Ú6-Û7-Þ8,â6,ç2)ë0)ó0,÷1.õ12õ13ø02÷/1÷//ò0.î3.ç6.Ý90ÜD9Ç80»4.µ/.ä_bÿƒˆølwþbxþWsúPmþLlÿCfö:]ó;_ìIfÔSgDJl;4O>,=<':?(ED/FH0Q\U'B\/E_2Ic6WJ:ZM=\O?^QA^QA^QA_RBaTD`SC`SC`SCaTDaTD`SC_RB\PDZOMZQVbXcjcsqm†vu•xz£z|­w|´sy·mr´bi¯]d¬ag±lr¾x{ʉ‰ß•‘夡䶵áÇÄÙÕÑÎáÝÄçä¹ëæ¯îê­îè¬éâ«ãÛªÚÓ©Ë¡»¶™¥¥›™„“ˆv˜q™rc›bW³i`Ïrmû‹‰õutê[]æLNèCGí@Dìô@?ï=;æ95à72Ý82Ú91Ù80Ù80Ü71ã73è96é:7â:7à;9ã:7æ:8ç:6å84à5.Ú3+Ú6,Û7-Þ8,â6,ç2)ë0)ò/)ö0-ô22ô23÷12ö01ö0/ò0.î3.ç6.Ü8/àF<É91¾3.¶,,îfjÿy€øgtÿbyýTqþKkÿGjÿ>cò6Yë=^ãQhÄXeˆBBgC7[N;GF1AC-JH3EE-LU6Sc>btLlƒUp‹XnRkPiŽKgIhJh‘Kj“Mk”Pm–To–Wp—Vt›Xs›Uq™So—Pj“MgJeŽHdG`‡D]AWy=Rq8Mi6Lf6Ne7Of8Lf7Oi9Sm>UH8WJ:[N>\O?\O?]P@_RBaTD_RB`SCaTDaTD`SC_RB_RB^QIVMR_Xhnf{tp‰xt—xw¡xz«y{´sy·jr³`g­[c«_g°jr»v|ƀ„Γ•àžžä­®ç»½æËÉßÔÓØÝÛÎáßÆåá¾æâ¼äß¹à׶ÚеÎƱ¾µ¦­§›˜šŒŒŽ€‰…yŠ|q‘vk›si¨meºoi扄î~ósrñedñWYðMNîDEì@@ã:7à;7äB=ÞE?Ì<3Æ=3ÄB5¯1#®0"ÇI;ÜXKÖN@Ì=/Î8*Ñ7+Ñ3*Ö42õUUÿkhú]XãD>Ü;3ß;2ã80â4-ã2,â1+Ý0)Ô0'Í/$Æ/$Â0#Å9,À4'Á3)Ë:5×CAÛEGÛBGÚ@HßCNëOZòVaòVaú^iÿgoóYaáBGê:<í57ï28ï28ò2=÷9CÿHSÿV_ä6?Ý4;ß6;ëADùJOüIMô;Aé13è51ë95ð=9ò<9ó;9ð:7é73â70ß;2Ü;1Û:0Ü90ß82ä73è64é75æ:8ä;8æ:8è:9è;7æ95á6/Ü3,Û7-Ü8.ß9-á7*å3)é1)ñ0)ô1-ó32ñ33ô22ô01ô1/ò0.î3.ç6.Þ7/àC:Ê70À1-À13økqÿqzúftû]túPmÿCfÿ=dÿ9cõ8^æEdÙZm«V[wE>dJ=aYFTO;KI4PI6GE.FO2L\8ZlFf|Nm…SmŠRlŒMhJfŽHgHg‘Ii’Lj“Ol•Sn•Vo–Ut™Vs˜Un•Rj’LfKcŒHaŠF_ˆFZBX|?St;Pn8Ok:Rl=Wn@ZqCUo?Vq>WqARE5UH8XK;ZM=[N>\O?^QA`SC`SCaTDaTDaTD`SC`SCbUEaVP^Vcje|yu}yšzy¡xy©vy°sw´jr³cj°[c«]e®hp¹v~ǁ‡ÑˆŒÓ™Ý£¥à¯³ã»¿åÆÇãÏÎÞÔÓØ×ÖÑÙ×ËÙÖÇ×ÑÅÒÉÀÌþŹ¹´¨¬£šŠ‹†x{tyvquleleogŽa[`[ÀsmØyuð{ü|yÿrpýccöSTðHGïC?ê>:á<6àA;Ñ:1ÓC:ÝTJÂ>2¸6)½9,Â=.È?/ÏB1×C5Ö@1Ñ7-Ð2/êLMú_]òWSßD?Ù:4Û81à70æ93ç92ç92â:1Ú9/Ñ9,Ê8+Å9*°(¸3"È@2ÓI>ÒD@Ë;:Ì7;Ï:@Ñ7AâHRíV_ðYbõ^g÷`iêU[ÜAEå@>ì?;ó@CûGJÿLTÿQYÿT]ÿV^á4:Ú/5Ü/3ç7:ô=Aø;?÷48ó12í42ï95ð86í42ë20ê20ç40á4.ã<4à=4ß<3Þ;2á83ä73è43è43è88ç98è88ë99ë97é75â5/Þ3,Û7-Ü8,Ý:+ß7*ã2(ç0(ï0(ò1,ñ42ð43ó32ó11ó1/ñ1.ì3.ç6.à91Ù<3Ì71Á0-Ñ@CÿnuýkuùbqðRiõHfÿ;aÿ4^ÿ6bû>däNiÊ\i‹GFjF:]L<]VCXQ>RJ7OG4ID.DJ.GU2Sc>^sHgMj‡OjŠKgŒGgŒFfŽGfHgJi’Nk”Rm”Um”Uq•Up•Rj‘NgŽKcŒH`‰E_ˆF^†G\‚E[~DWxAVr?Uo@YpB]rG^uG[sCYtAXs@NB2QE5UI9WK;XL\P@^RBaUEbVFbVFaUE_SCaUEfZJh]YngwupŽ|x™{y wx¦vw­pu¯jo¯ah¬^f®_g°em¶pxÀ}…͉Ø—Ø™ Ö¡¨Öª±Û´¹ßº¿ßÀÁÝÃÃÛÇÆØÆÃÔÅÁÐÁ»É¼³Ä»°Áµ¨¼¦˜¯–‹œˆ…Œqqqtpopfewhe†nj„_Y•d_›ZT¹f`Ùsnðzvÿ{wÿwsÿhfüZWþRNõHBæ=6çD=Ø;4ÛG=ê\RÅ;0Ä<0¼6*¾6(Ç>.ÑD3ÔB3ÔA1×A3Ò86Ø>>ÝCCÜB@Ö=7Õ81Ø7/Þ7/å:3æ93å:3â;3Û>5ÕA5ÑE8ÌG6®-¼;%ÍJ8ÑL=Æ=5º/*À00Ê9>×AJáKTëU`ðZeð]eìYaßLRÔ>@Ï4/Ø7/à;9ê@@òCHõDJñBIî?Fâ5;ß26ã36ï8<õ79ø14û/2ü14ï20ð95ð74ì0.è,*ç0,æ3.à3,ä=5à=4à=4à<3ã:5æ95ê65ì65ì57ì57í57î68î66ë54ä2.Þ1+Þ7.Ý9-Ý:+ß7*á4&æ1&í1(ñ1,ð42î53ñ42ò21ó1/ñ1.ì3.ç6.â;3Ò4+Ò:5Æ20èVYÿpxùcnòZiçI`óFdÿ8bÿ/]ÿ5bÿBhÜLe±PYj5/^G7XK:UN;[P>VI8M@0JC0@F,AO.K[6Xj@bxGfJhˆIf‹FeŠDc‹BcEeŽHgLh‘Oi‘Rk’Sn’RlPhNd‹JaŠH_ˆF_‡H_‡H_…H_‚H]~G]yF]wH`wKcxOczN]uC[vAZu@JC3MF6QH9TK.ÑE6Ë>-Á2"Ê7'ÛE7ÞE?Ó97Ì3.Í50Ô;5×=5Ý<4á=4ä;4ä92Þ5.×4+Ï5)Ê8+Å<,Â?-ÔS>ÈG2½<)¾:-Ã=2Ä;5Â74Â43ÜKNÞMRáPUåTYèY]åVXÜMOÓD@É5+Ñ7+Ù80Ý52â24å26æ18æ.6ì4>ì3;ó5?û9Bý4>ú+5ÿ(3ÿ/9ø-3ù57ù59ð./ë*+é0.è51â5/ã<4à=4à=4á=4ä;6ç:6ë76î66ì46ë35ì25í34í55ê41ã1-Û0(Þ8,Ý:+Ý:+Þ8(à4&ã3$é3&ì4*î50î52ð42ð3/ò2/ï2,ì4,ç6.ä=4Í/&×>9Ì35ùbgÿoy÷[iðNcêC]ùFfÿ:eÿ0]ÿ6aöGhÉJ]“CFR,#VI8SL:OH6[O?UI9F?-HF1>B'@J(IU1Sd:_rEe}Ig„JeˆHcˆCa‰BbŠCcEeŽHfMhPiQlPkMfJcŠIaˆG`‡F`‡H`†I^G^F_}G`|Ia{Kd{Mf|Nf~N]xC]z@^{CCA5FD8JF;PG>RH>WI>]M>_O?`Q>aR?`SB_VGbYRgb_ojnso~wq“zt |y¨yw©pp¦gg£`a¢\_¤`b­fhµopÀyz̄‚֍‹ß–’眙栞ݡ¡×££Ù¤¤Ú¦£Ø¥¢×¥¡Ô¤ Ó¥žÑ£Í¢šÉ¢™ÈŸ–ٍ»Ž‚°ƒ|žrn}igld^`fZZkYUrWP}WNŒWO•RI¨ZPµXPÁZSØkdìyrù‚|ÿ‹†ùuqÿusí_]ßPLÙEAïZTÌ71Å2*Ä6*Ã7(À7'Ã7&Æ9(Ê;+Ð<.Õ?1Ò8.Ö<2×?4Ó;0Í5(Í3'Ø:/â@5à90á90Þ7.×7+Ï7)É:*Æ?,ÄA/Â=.Æ@4ËE:ÍG<ÌC;Å<4»2,¶+&Ç<7ÐEBÙOLàVSãYVáXRØOIÐC:Ì;*Ó:(Ü8,â5.è./ì*2ð(3ô'6ú->ú+?û*?ý)?ÿ(?ÿ&?ÿ$<ÿ$<ÿ$8ÿ'9ÿ+<þ,9ó+5í.5è45ç;9Ý84Ý:3Þ;4à;5ã:5æ95é73ë54ë35ì46ë54é54ç53â5/Ý5,Û5)Ü8,Û9*Ü9(Þ9&ß8&â7%ã6%æ4&ì5-í4/ð50ñ4.ñ5,í5+ê5*å7,à90Ø7/Õ:6Û?BÿmwÿbsûSjõIcÿKjö7Yÿ6_ÿcçNj¯IV]#!D, ?:'HE4PMC/?G/BH&EK%KS.S]8[kDavKd~NdƒJb†F`ˆBa‰@c‹BeFhJlPm‘Ql‘LiŽHgŒGf‹HfŠJe‰Ic…HaƒGdƒJdIbGc~GdJdHe~Ga}C[{<\=_‚B=?4?A6FC[K>]M=`O;`Q<^SA^VIc[Xhcinlyso†tp•vpžtp¢pm¢gfŸaaŸ]^¡\\¤ed°kjºtrÅ}{φ‚ٍ‰à”Žæ˜“å›–Ùœ˜Õ™Öžš×ž˜Ö—Õœ–Ô›•Ñž–Ñœ”Íœ“Ê›’ÇšÄ“‰»ˆ®‚xtk|mdif]^f[YiZSoWM{UJŠVKšVK°\RºYRÁXRÓfaàqjãvoí~wý‡…ÿ‡…÷usîgdãUSëZUÇ2,Â/%Å7)Ã7&À7%Á8&Ä8'È;*Ï;-Ó=/Õ9,Õ9,Ó:,Ò:,Ñ9+Ñ9+Ô8+Ø8,ß;1à90Ü8.Ö8,Ï9*È9(Á:&¾9&¾6*Á80Æ=5É@8ÊA9È?7Å<4Â91¿4-Ç>6ÑH@ØOGÚQI×NFÌC;Ã7*Ë8&Ó8$Ý7)å4,í//ô+3ù)7ý(:ÿ+@ÿ*Aÿ)Aÿ&Aÿ#@ÿ!<ÿ=ÿ:ÿ:ÿ 9ÿ%;ÿ);÷-9ð19ê7:å;;Ü94Ü:5Þ;4à;5ã:5æ95é73ë54ë35ì46ë54è64ä71ß6/Ü5,Ù5)Û9*Û9*Ü9(Ü9&Þ9&ß8%á8%ã6%ç5+ê3+ë4,ë5*ë5*ê6(ä7)á7*ß;1Õ4,Ó54óTYÿesÿ[põGbÿIhÿAdÿ;`ý3[ù;aòMmÍLb‰8?S*$A5'69(;<,B@1DA0@?-=B.>G,=CKP'\b_„?b‡B69.:<1??7DA:KB;OE/Ô>/Î6(Ë/"Ú:.Ú8-Ù7,Ö8,Ð:+É:)Â9&¾7$½5)À6,Â8.Ä:0Ç=3Ê@6ËA7ÌB8Ç:1Ê@6ÏE;ÐF<ÒH>ÑG=Ê@6Å7+Ì6%Ö6&ß7,ç4/ñ03ö-5û+9ÿ*<ü';ü'=û%=ù#;û!:ú7ü7þ6ÿ8ÿ6ÿ$8ý*;÷2<ñ6=ë8;ä::Ü94Ü:5Þ;4à;5å95ç85é75ë54í36î47í55ê65å61á6/Ü5,Ø4(Ú8)Ù9)Ú9'Û8%Ý8%Þ7$à7$á6%á5'â4)ã5*ã6(ã6(á7(Þ6)Û7+Ý<2Ð1+Ø88ÿkrÿ]nþPiñ<[ÿHlÿ7]ÿ>eù5[î>bæVqª?Qa#(L/);7+07'37&9<)@=*A<(@>)BB&?FXa4s~T€Œdw‡`hSa}La€G`ƒC`…?a‰@cŒ@hŽEjJkMl‘Nn“Mk‘HhHgŒGh‹Kh‹Kh‡Lg†Ke„KdƒJc€FdGf‚Hf‚GeFb€Bc†DeŠEhH25*58-;<4A>7G@:KB;RE.Ñ>.Ë8(Ç/!Ò6)Ó5)Ò4(Ò6)Ñ9+Í<+È=*Ä;)Ä:-Ä:/Æ90Æ9/Ç:1È;1É<3Ë=3ÓD<ÓE;ÐA9Ë=3Ë<4ÏA7Ï@8Î;1Î5'Ù5)â5.ë31ò/5÷+6ù)7ü):ù&9÷&;÷&;ø'<û&<ý%:ÿ$:ÿ#:ÿ"7þ#7ú%7ù,;÷5>ò9?è8:à87Ü94Ü:5Þ;4à;5å95ç85é75ë54î47î47î66ê65æ72á6/Ü5,×5*Ø8*Ø8(Ø8(Ù8&Ú7&Ü7$Ý6$Ý6$Û5%Ü6(Ý7'Ü9(Ü9(Û:(Ù9)×:+×:1Ð3.ëHKÿoyÿVjøD_ø<_ÿAgÿ3\ÿ8bø>cèMlÅOe€0=J C1-11'.6'4=,=B.B@+B<$E>$HE$U\0p~MŸr—¨|ƒ˜mj„W_{J]~E_ƒCa†@bŠAfCkJl‘Lm’Om’Oo”Nl’IiŽIhHiŒLiŒLj‰NiˆMf…LdƒJdGe‚HgƒHh„If‚Gd‚DgŠHiŽIl‘L-3'36+891<;6B=9G@:MD=QG=SI=SK>UNDZUQa^eigumklkŠjhb`XVˆPP†QQXYš`cªfj´orÁuxÉ|Ђ…Ö†‡Ù‡ˆØŠ‰Ù‹ŠÖ‹ŒÏ‹ŠÌŠ‰Í‰‡Ð‰…ш„ÑŠƒÑ‰‚ÐŒ„Ï‹„ȍ…Á†º†°‡¥~w–m…„Yj€SZnVTc\RZaOZ_HeZDxUB’LD¸TRÐSWÛRYå^dèejãklæuqäunâoh÷~vÿ‚{ÿ‡~ôl`É?2Á8(À;(¿='¿='À<'Â;'Å:'Ç8(Í7)Ø:/Ø7-Ò8,Ï9+Ì:+É:*È9)É7(Ï9+Ñ7+Ò8,Ñ7+Ï7*Ì8*Ë<,Ë>-Ê<0É=0Ê<2É;/È:0Ç9-Å7-Å5*Ð@7Ð@5Í=4É9.Ë80Î;1Í:2Ì5,Ð/%Ù0)ä20ì25ô/8ù-9û+;ü,<ü-?û.?ü/@ü/@þ/Aÿ/?ÿ-?ÿ.@ÿ)9ü)8÷+7õ0:ñ6=í8=ã77Ü43Ü94Ü:5Þ;6â:7å95ç85ê65ì44ñ48ñ48ï56í76æ72á6/Ú6,×5*Ø8*Ö9(Ö9(Ø9&Ø9&Ù8&Ú7&Ù8&Õ8%Õ:&Ö;'Õ=(Ô=(Ô=*Ô=,Ô<.Ñ7/Ú;8ÿ^eÿaqÿPi÷<[ÿAiÿ4_ÿ4`û1YôKlÛYq•>NZ%-C),:2/-0)08+7@/:7B=:HA;KD1Î8*È4&Ê8)Ë<,É:,È:,É;/É;-Ê:/È9+È5+Ç5(Ê6,Ï;/Ò>4Ó?3Ö?6Õ>3Î7.É,#Ò+%Ü-*ç02ð39ö1;ú0<ý0?ý0?ù0@÷1@÷1@ö0=÷/<÷-9ù+8ú*7ü0<ù/;ô0:ñ4;í6;æ69ß55Ù42Ü94Ý:5ß:6â:7å95ç85ê65ì44ò59ò59ð67í76æ74ß6/Ú6-Ö6*Õ7+Ô8)Ô8)Ô9'Õ8'Õ8%×7'Ô9%Ð9$Î<%Ï=&Ï?'Î@(Î@*Ð?.Ò;0Ñ61ëHIÿfrÿOdÿHfû7[ÿAmý/]ÿ7aò4XãPj¼Ufm19E(*E697325406906=-3;#38CCja:…TŸ®w©Á‡µÎ—¯Ç“’®}v”be†Q`‚F`…BcˆBgFm–Jr˜Or—Rq•Up”To”Nl‘KhHf‹Fh‹KiŒLi‹Ni‹Og†Kf…Je„If…IhˆIi‰Hi‡Gf†CjJk“Mn–P(0#+1'/4-350764<85@=8C>8IEù4>ù1>ú0@ø/?ò.<ï/<í/9í07ï-5ï,2ò+2ñ*1õ2:ó4;ò5;ì59å57á55Þ65Ü75Ü86Ý97ß:6ã:7æ87é77ê67ì46ô5:ô5:ñ7:î87æ74à70Ú6-Ô6*Ó7*Ñ8*Ð8*Ð9(Ð9(Ð9&Ñ8(Ð9&Ë9"È:"È>$Ç?%È@(È@*Ì=-Ï;1×96üU\ÿ^qÿGcÿ?aÿ:aÿ7gþ3`û9^íFbÅNa‰@IS12A64@:<:46?56>7179+4="9CSZ.‚‚P¢§q±ÅŠ¯ËŽ°Ì’¦Ã’®}{™egˆQ_E^ƒ@c‰@iDo•Js™Ps˜Sq•Uo“Sn“NkJgŒGeŠEgŠJh‹Ki‹Ni‹NfˆKd†Id†IeˆHgŠJh‹Ii‰Hf‰Ej’Ll–No™Q&.!(0%-2+13.331764:95=<7GD=DD*¾;'¼7$À4#ÑB2ãOAäN@ØB4Ë7)Ë7)Ð>/Ê;+É:*Ç8(Æ7'È6'Ê6(Î8*Ð8+Ó;.Õ;/Õ9-Ò6*Õ7,Ú<1Ý<2Ü71è88ñ8=÷:Aû9Bú4Aõ/<ò,;ï,:í/;ê19ê38ë48í57ñ56ô36ó57ð37ï6;í9<é69â45Ý33ß76à;9Ý86Þ97á96ã:7æ87é77ê67ì46ô5:ô5:ñ7:ì89æ95ß82Ø7/Ó7+Ð8+Í:*Í9+Ì;*Í:*Í:(Í:*Ì;(Å9"Â:"Ã=$Â>%Ã?(Æ?+Ê<.Ð92ß<89?48E26C41=:)>E&FU*bs?›a­½±ËŒ«É‹¦Ã‹º„Ž¬z{™ef‡PZ|@^?a‡>hŽCo•Jr˜Or—Rp”Tn’Rn“NjIf‹Fd‰Df‰Ih‹Ki‹Ni‹NfˆKe‡Jd‡GeˆFgŠHh‹Gh‹GeŠDk“Lm—OpšR(0#'/$(-&).(.0-3317839:4==5?@8DE@JLKORYVXeZ\s]^}YX‚[Y‹^]–ee£nn¶wxȁ؄…⌌ðŠŠì†‡ä‚‚Ü€€Ö‚€Óƒ‚΀ƒÈ„ǃƒË„„ΆƒÐˆƒÓ‹„ÒŒ„ÏŠ€ÅŠ€¼‰€¯‡}Ÿ€xwozkegf]Xm[Qm[Mi\Lf^Kd_IeaHhaGo_FoP;…UA¥]O¿aYÑYXÝQTîS[ø\`ùheæYPÔD<Î70Ñ7/×:1Ö=/Ô;+Ï9(Í:&Ï9(Ñ:)Ô8)Ø8*Ü5,Ü5,Ð/%Í3)Ì8,Ê>/Å@/Á@-¾=*¼9'Â9)¾0"éWJßK?Ã/#Ñ=1Î2Ü<0Ù7,Ú8-â>4ìC<õBEò9?ð2<ö4?ö2@ñ-;í-:í2=ì7>æ5;ä68å78ë99ð:9ñ78ï77ò;=î<<ê::æ87á85ß74Ü75Ü75Þ97á98ã99æ::é9;ì9<í9<ï8<ô7;ó6:ð8:í9:ç;9à;5×90Ï7,Ê8+È9)Ç9+Æ:)Ç:)Ç:(È;*Ç<)Á9#Ä='¾:#¶4¼9%ÉD3Ï?6Ê1,ÿ^eÿVgÿIbÿ<\ø1X÷0Yû6cõBiçYo¬FQo33N3,B?6>C<@78@-1L/3K2.A9&DJ(Zn=~š_ž¸w¨Å‚«É‹Ÿ¾‚˜¶€”²~‚ nf„RXvBY{?]€>c‡AiDn”Im•Ll”Nk’Ol‘NiŽIfŠDc†Bc†Bf‰Ih‹KfŠLdˆJg‹MhŒNg‹Kf‹HeŠEf‹EjIk“Jq›QržSt U*0$)/#).').(-/,130561782;<4>?7AD=HJGOPTSUaXYkZ\u\Z^]‰db”kj¤utº~·‡ß‹ŒéïŒŒð‰‰ë…„ ؀~ҀρË…†É†‡È‡ˆË‰ˆÎ‹ˆÏŒ†Î†ÌŽ…ÈŠ€¼‰±†|¡‚x‘{s€tknlb`e]Re`Me^Kf^Kf^Kh]Ij^Hk_Gn^Ew_G[C’YF­ZLÇVPÞRSõQXÿX_ðUSãLEÙ>9Õ60Ù6/Ü90Û9,Ö9(Ó8&Ñ8&Ñ8(Ô8)×7)Ü6*ß4,Ý5,Î0'É5)È9+Æ=-ÄA/Á@-¿<*¾9(Ä8)Ë<.äREÜH<È4(Ë9,È:,Â4&Ê=,Ë<+Ê;*Ê;*Ë:)Ì9)Î8)Ï6(Ó7*Ö8,Ù7,×3)Õ1'Ø1(Þ7.ç<5øDGñ8>í/9ï/:ð0=î.;ë1<ë6?ä5:Ü36Ø22ß:8îEBøIFøDCó?>é:7ç98å97â96á85à85á98á98à87â88å99ç9:é9;ì9<í9<î7;ó6:ò59î68ê88ä;8Ü:5Ò8.Ë7+Æ8*Ã:*Â:*À;*À;*Á<)Á<+Á<)½9$Á?)»:%³5¹:'Á;/Ê:2Ø<=ÿ^gÿPdÿA[ù8Wö6[õ;`ô>dãIe«?Lƒ?>_:2G;/:>08>2F<:R>=N0.S8/VK5ciEx[°pÂ}¡Æš¹}š¹€š¶ƒ©xrŽ^YuETp=\{B_@b†@iCm“Hl”Kk“LiMiMgŒGe‰Cc†Bc†DgŠJiŒLhŒNg‹MiOiMiŽKhHgŒFfŽEl’Im•LpœQoRt U-1#-1#,/&,.)//-11/34/45-9;0<>1@B7EHAKMLQRWVVbVWi\Yt^]fdŒpn zx·…ƒÎ‹ßêŽïŽŒíŠ‰ç‡„߁Ó|Ë}Ȁņ…LjˆÆŠŠÊŒŠÉŒŠÉŒˆÅŒ„¿‹‚·‰€­†|¡€v{p€ujpndbi_Vc]M_aL_aKc^Jg\Jl[In\Ho]Gq]EwaIxX?‡S=£VDÇXOãUSøOTþMSâ><Þ<7Ý84Þ71á6/á6.Ý7+Ú7(Ô7&Ó8$Ó8&Õ8'Ø6)Ý5*à3,Ý5,Ë3(Ä6(Â9)Á<+Â?-Â?-Á<+À8(Ã5'ÛI<ÚF:ÕA5Îå84â62à72à72à72á85â96ä;8ä;8á77ä88æ8:è8;ë8<ë8<ë8<ì8;ï58î47ì57ç77â:7Ù:4Ï8/Ç7,Â8+¿:+½;+»<+»<+»<)»<+»<)¸9&½@*³9$±6$¶;+µ0'Ã40ìPTÿ[iÿJ`õ:Uð7Vñ@]ïHfçHdÍNa‚89e?6R@2DA09=,57)>6+L:0E-#R=,g]Bˆ_’«t—»{–Áz–¿{”³xœ¸…š´…€šm\uKHb5Nh8[xB_}?cƒ@hŒDl’Gj’Ih’JgLfKd‰Dd‡Cc†DeˆFh‹KkŽNkOjŽNiOiOiMgIgHh’Hl”Ko™Ms¡Vs£Wv¤Y24&04&01)01+12-23.34.46+9;-;>-?A3DF9IJDMONRQWSS]XVd\Zoda~nl”zw¬„‚ÃŒ‰Ö‘ã”‘ꓐ뎋≅قÌ|Ã|¿€~¿„‚Á†…Á‰ˆÂŠÃ‹ˆ¿‰…¸‡®…}¤…{€vŽyn~rgmmaak^Vi[Pc\J]`K]aJc^Jh[JmZKqZJtZIv[FsWAxR;ŠQ=ªYFÍ[PãTPðFIñ>AÛ2/Ü5/á51ã60ã5.á5+à6)Û8)Ö7$Ó8$Ñ8&Ô9'Ø6)Ü6*à3,Ú6-È6)¿7'¼7&½:(¿>+Â?-Ã;+Ä8)Æ4'éUIÓ<1Ì8,ÑB4¾5%À=+À=+À8(Ä8'Å9(Ç:)È9)Ë7)Ì6(Í3'Ò6*Ô3)Õ2)Û4,â92é>7ì?9ì=:è45ì59ï6;î5;ê2:å28ä7=â<@óUVübbÿmjÿidóVQäA<ß63Ý4/ß61Þ71Þ71ß82á85â96å97æ:8å78æ89è8;é9<ë8<ë8<ë8<ì7<î5:î68ê67å97ß<7Ö<4Ì9/Å9,¾9*º;*¶;)µ<)µ<+´=)³;*³<(³:'·@,­8&­8'³;-«+"Ã54ý`gÿTdúG\ð-=@-@C.DG4IK>MNFQPNRRRVUSYX]a_lkius›€}²ˆ†ÇŒŠÓ•’ᔑ␍܋‡Ó„Ä}º|µ|³~·„º‡„¹‰…·Š„²†¨z›€xs‡znzrfjm_^j[Ti[PjZKfZJb_Lb_Le^Li\Kn[Lr[Kw\K{ZG~UA†R=›RA¶VFÎRHÚG@â88å33Ý1-ß3/â5/ã5.á3,ß3)Ý5(Ü9(Ó8$Ð9$Ï:&Ñ:'Õ8)Ù7*Ý5,Ø7-Æ:+»9)µ6%·8'½;+Â=.Ç;.Ç7,Ð90õ\TÖ=5É5+ÏA5¸3$·:(¼?+¿:)Ã:*Æ:+È:,Ê;-Ì:-Ï8-Ñ7-Ð3*Ò1)Ö1+Þ71å<7ê>:è;7æ74é75ï;<ðë8>è7=ê7;î7;î79ê7:ä::ß=:Ö=7Ë;2Ã;/º8*µ:*³;*¯<)¯<*¬<(¬;)¬;)ª;(¬=*¦8'§9*ª8-¬/)Ë@CÿhrôM^óH[íDYåH[ÙO^ÉT]·TWœXUdM?OL9LG4JE1FD-?B'=D#>H#KV.\g.==1==3==5;<4;=2;=/?B/@D-CG.FJ3KL:NOAQQIRRHYWJZZN_^\gerqn‰{y¡ƒ€·‡…ďŒÑŒÓŠÏŠ…ǃº~y¯zw¦yv¥{v¬|y®€|®ƒ}©ƒ}£x—|t‹zrvksrffm_\j\Sk[NlZLl[Kk[Ki]Mg^Mi]Mj]Mn]Ms^My\LZI“`O›VG§N@¸J=Å@7Ï6.Ø1+Þ1+á51á6/â5.â4-à2)Þ4'Ü6&Ú;(Ñ9$Í;$Ì;&Î;'Ñ:)Ö9*Ù7,Ó9-Â=,µ:(°5#²5#»9)Ä<.É;/Ë7-Ù?7ø[TãIAÎ:0Ì@3¸6&¬3 µ<)¼9'¿7'À7'Ã7(Å7)É7*Î7,Ñ7-Ù<3Û:2Þ93å<7ê>:ê=9ç85ã41è96ë<9ì::è8:ì>@øPPÿbcÿppùheâTPÊ=6À1+É40Ö;7ß=:à;7â;5á:4â94á83ã73ä73å55æ66é69é69ê7;ë8<ë8>ê7=è7=é6:ï8<ì89è8:ã;:Ý>:Ó>7É<2À8ÛTXûepîK\ïI]éJ\ÛM[ÉQZ´VV ZRŠ`RPI7HM9NI5H@+;567>O%Lf6lŠTw”\„›e‰šd›f£k”­t˜°|ƒ•mn}\Q`Cg{HiƒFl‹Gm‘Gj“Gf’GbGcŽGhJlMo’Pn“PlMiŽKjJj’Ls›TsUsSržQržOs¢Rw¦Uz«Zv¦Zu¥[s£YRK;RK;RJ=RJ=RJ=RJ=RJ=RK;UNXQ?YR@[TD\UE\UEb[Hb[IaYLbYRe][kaiqftuj{zn„|pˆs‹s‰|p„uj{mbre]jc`k`_g_\c_Z^^ZY^YUaZRbZOe[Og[Ki\Kk\Ik\Gm]Fm]Fj^HicMqfTqZJuOB‹WJœ\P£YL¬ZL¥N=¦E4§<,±7(Â8-Ñ80Ü41Ý1-ß6/Þ7.Þ7.Þ7.Þ7.Û7+Ø6)×7)Õ8)Ô8)Ò9)Ò9)Ò9+Ò9+Ô8+Í;,½;+¶>-®9(©1 «2!·9*ÀÔH9Â=,·2#ÝPFØJ@ÓE;ÔD;ÚG?ÞG@àC>à<:à74æ87ì::ì::ç77â64à93Ü=7ÙF>ÏB9Ä:/¼4(·1&¹5)¿;/Ã?3Ã:0Ê=4Ò?7Ú?:â=;ç;9ì89í9:ç7:å8:å8:å99å97å97å95å95à40á51ä65å76æ89ç9:ç9:æ8:ë;>æ9;ß99Ü=:ÖA=ÍB;ÁA6·?1©:)£<+ =*›<(™:&–9'•8&9&A0‹<-‡/#‘/&¼LJämoçloÍVZ½LNµNOªQM¢UO›XO—]R•aTŠjSWZ/:M7FTa)~ŽP›°oŸ¼yœ½x’µs~ah€L\mCYdBT]BHP9?D0:=,@C2<@1:>0]sBgƒHpKo“Kl’Gj’Ii“KgJlPm‘So“Sl“Pm’Mk“Jm–Jm˜IqœLqžMrŸNr¡Pt£Rv§UyªYzª^y¦cm™ZbŽOWN?WN?WN?WN?WN?WN?WN?WN?XO@YPAYPA[RC\SD]TE^UF_VGd[JcZIcYMcYOf[Uj_]nbdpdhreltgpvirvirsfmm`gg[_bXY^[VZZRYVOWTKXTIXTH\VH^WGcZKcZIf[Ig\Hi]Gj^Fk_Gh`IcbMngTv\MSFšVM«VO°RH·QE¯H9¬C0¬=,±9)¾8,Ë80Õ62Ù40Ý6.Ü8.Ü8.Ü8.Û7-Ú8-Ù7,×7+×7+Õ7+Õ7+Õ7+Ô8+Ô8+Ô8+Î:,¾<.¶>.®9(¦1 §2 ²:)¹>.¾<.Æ:-Ç4*Ë4)Ò;0ÜE:áOBßQCÝOCÛF?Ø@;Ó<5Ò;4Ö=7Ú=8Ü86Ý33ç77ë78î79ë78ç77å97â=9ÛB:ÊA7¿?4¸:,±6'¯5&²8)¸=-¿@1ÅA4Í@6×@7ß=8ã:7é77ï56ð69é6:ç6<ç7:æ89æ87å95å95ã:5â92ã:3ã:5ä;6ä;8ä;8å99å99ä:;ã;;ß<=Ù?=ÐA;Ä?6·=2¬;-¥;+ =*œ=+—<)–;(’:&‘8&Œ9'€9'€8)‰5*<5¿QP×eeÑ^a·MM¬NL¤TMYP˜\Q—^S—^S˜_VŒfQ`_/Sg*^r3zO™¯n¥¾|™²pˆ bj‚HauBTe;JX7FP7?H59?158-:^tEgƒHqMp”Ln’Hk”Hk“Lh‘Kk’Qn’Tm”Sm”Qk“Lk”Hl—Hm˜HpJpJp Ls¢Qu¦Tx©Xx©Xx¨^m—Xb‹QY‚H]TE]TE]TE]TE]TE]TE]TE]TE[RC\SD]TE^UF_VG`WHaXIaXGe]Je]Hd[Jd[Le[Qf[Uh]Yh][i]]j^^k__k__i^\f[YbWS_VQZVMWTKUQHRNCQMBSOCWQCXRB^WG^WEaYFc[Fg\Hi^Hk`JhbLbaMngUy_PˆXN¢\T±VQ²IE¸E@¹@7¸>1·;/¸8+¼8+Ã9,É;/Ñ:/Ù8.Û7-Û7-Û9.Ú8-Ù7,Ù7,×7+×7+Õ7+Õ7+Ô8+Ô8+Ô8+Ò9+Í;,À>0¶>.¬9'£2 £3ª:&³>,¹>.Ä?0Ä8+Å2(È4*Ð<0ØF9ÜM?âNDÙ:6Ø43Ô20Ö42Û97á=<æ<<é;<í9<î5:ë27ê37è58å99á<:Ù@:¾8-µ:+±6'®4%­5%°8(µ<+»=.ÈD5ÏC6ÖB8Ü=7â94è64í55ï79ê69é69é69ç77ç77æ95å95å:3ã:3ä;4ä;6ã<6ã;8â:9á99Þ88Ý9:Ü<<Ú@>ÓB=È?9¹:1­7+¤6'¡;,<+™<+”;)“:(9&8%Š9&z6#y6%ˆ9, F=¹SOÀWT¸PO«IF¢MHœSL™YP—^S—aW—aW˜_V‹ePsrFzV“¦n¤¹€«À‡ž³{|[[oaXIaXIaXIaXIaXIaXIaXIaXI_VG`WH`WHaXIbYJcZKd[Ld[Je]Hf^Gf^Ig_Lg^Of\Pf\Rf\Sh]Wh]Wh]Wh^Ug]Te[QdZPc[N]YMZVJVRFRNBPL@PM>TN@UO?WQAYTA[VC]XDaZGd]Jf_LfaMdcQleUv\OŠ[Q©b\¸[V¶FD¹<:Ã<8Æ;6Ä:0Â8-½8)¼:*¾?.Ç?/Ó9-Ù7,Ú8-Ù9-Ú8-Ø8,Ø8,Õ7+Õ7+Ô8+Ô8+Ô8+Ô8+Ô8+Ò9+Í;,Á?1·?/­:(¢3 3¢8"¬=)µ@.¼?-¿:+Ã7*Å5*Ë7+Î:.Îî7<ì38é06æ25å58á77Ú65Î61·5(¯7'®6&¬7&¬7&®9(²:)µ:*ÃA1ÊB4ÔA7Ü?8â;5æ95ë76î87í68ë78ë78ê86ê86è94ç:4æ;4â92á:2ß:4à;7Þ:8Ü:8Û97Ù99Ö<:Õ@<ÒC=ÊA;»;2¯6+¤6'ž7(œ;*˜;)”;)’;(:&8$Œ7#‡9%€=*v5#5'™E:ªPH¬MG©LG¦QLPJ˜UL”ZO”^R•aV•aV—aWgT‰…_™©x­½Ž¦¸ˆ¡ts†YN`8/A->3B%:F.=F3;A3:=2:=4<=599-?@2<>39<1<@29B/?L2PbNK:NK:NK:PMTQ@VS@XWC[ZF]\H^]Kb`Qf^QmWJ†[R¬ic¾c`ÁMMÈBCÐ;=Ô89Ó84Ì70Á9+º=)µC+¼B+Î;+×7)Ø8*×:+Ù9+Ö9*Ö9*Ô8)Ô8)Ô8)Ô8)Ò9)Ò9)Ò9)Ò9)Í;,Á?1¶>0«:(¡6"š4›7 £=&¯B-³;*º;,Â:,Ç9-Ë8.Î:0Ð<0Ù:4é9<ì4<æ39ã28â38á48â38â25é6<é49ç4:ç7:ã9<Û76Ð21À0(´6(­:(­:(«:(«:(«:(¬9&¯7&¸:+Á;/Î>3Ø?7à=8ä;8è96ì87î66î66î66í74ê84è:3ç:3ä<3á:2ß;2ß<5Ü=7Û=:Ù><×=;Ô>=Î@<ÉB<ÅB:¹=5­7-£5(ž7(š:*–;)“<)‘;*:(Š9&‰8%ˆ7$ƒ8%ƒ@-u4"{3%“G:¤QI¡NFžNG¡WN˜UL’XLZN\N]R”`U—aWhW‰f˜¥z©€Žj]kHDS42@&$2-:&0;*5=.9?3?1;=28;0;?18A.>K1PbÜ87Ô70Ç;.¼?+±C*µA(Ê;*Ô7(Õ8)Õ9*Ö9*Õ9*Õ9*Ô8)Ô8)Ò9)Ò9)Ò9)Ò9)Ò9)Ò9)Í;,Á?1µ=/«<)¢9$™6•5›;"§A*²B.¹@/¿;,Ã7*Å2(Ë4+Ò;0ß=8ê5:î3<ë6=é8>ç:>ä;>ã:=â9<ß58á7:â9>á=>Û=>Ñ96Ã2/¶0'¯9+«>*«>*©>*ª=)©<(©:'«8%¯6%¹7)Å;0Ð=3Ù<5ß<7ä;8é:7î87ï75ï75î85ë:4é;4ç<4ä=4â>5à?7ÞA:ÚA;ÙA>ÕA?Ñ@=ÍB?Á@:»@8³=3ª8-¡5(›5'˜8(•<*‘<(<)Š<(ˆ:&†9'„7%ƒ6$6%}:)t3!~9*—OA£YNœRG•OE˜VJ•YN[MŽZMŒ[MŽ\Q“_T™`W‘gW~xXyƒ^r|ZU`B;E,/;%0;*0<.3=24<16<2?1:<17:/:>07@-=J0Oa;bxIk‡Lu”Qu™Qt˜NqšNršSpšRs›RsœPr›Op™Kn™Jp›LsžOv¡Ry¥X{§Zz¨]x¦]qŸWg”O]ŠEVƒB_ˆNXIR{Cg^Og^Og^Og^Og^Og^Og^Og^Og^Og^Og^Oh_Ph_Ph_Ph_Pi`OjaPjbOjbOjbOi`Oi`OiaNiaNiaNh`Kh`Kh`Ih`IhaGhaGhaGf_Le^Kb[I\WDWR?PM:LI8IH6IH6GH6GJ9GK:HL;IMì;Aê@CæAEàBCÜ@AÙ??Í12Ð66Ó:<Ñ=;É;9¾71µ4.­4)ª<-¥>+¥>+¥@,¥>+¤>(¦;'©:'ª7%²7'»7*Å8.Ì70Ô:2Þ<7æ?9ë97ì95ì95ë:4é;4è;4å=4â>4àB7ÝC9ÚC<ÕB;ÏA=Ê?<Ç=;¿>9±<3©:/¢8+œ6(˜7'”8)‘:):(‹=)‰<*‡<)ƒ:'‚9(€7&6%}6$x3#x5%…B2˜UEWK”PCPD•ZL“YMZN\Q\Q’[T•\U˜[VŽbUkbEV`=JS4=G,6?*2=,4>35?66=68?8=B;CF=EG/;9*78*=>0:<17:/:>06?,=J0N`:awHk‡Lu”Qu™Qt˜Nr›OršSpšPq›OrNqœMp›LošKrNu¡Ty¥X«`~©az¥]qœUf‘L_‰G]‡E^ˆIb‰PY€ISzCh_Ph_Ph_Ph_Ph_Ph_Ph_Ph_Ph_Ph_Ph_Ph_Ph_Ph_Pi`Qi`QmdUlcTjaRi`Qh_Pg^Og^Mh`MiaNiaLiaLiaLiaJh`IhaGh`IgaKf_Le^KaZG\WDUR?PMSQDSPAXLÂYSÙROàDEà::Ü75Õ;3Ê>/º=)µ8"É:)Ï8'Ð9(Ñ:)Ò;*Ò;*Ò;*Ò;*Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)Í;,Á;0¶:.­<,§>+™9#3“7Ÿ?'¢9#¯<)À>0Æ<1Ì8.Ð7/Ù<5ã?=ì=Bî?DéCEâDCØ@?Ê;7À50»1.¹/,¼51¾:6»<6³:2ª8.¤8,¡:+¡=-Ÿ>+ ?,¡@-¡@-¡A+£>*¦=*©;*­:(²7(¹5)¿5+É90Ö?8àC<å<7è;5è;5ç<4å<5ä=4á>5Þ@5ÜD9ØD:ÒC;ÊA9Ä?:¼;6¸85°93¢7-™8(•5'“6'‘:)<*‹:)…8&ˆ=*…<+ƒ<*€<)~:'|8%{6&{6&y1#€8*ŒG8–SC’PB‹L=RE™_S‘WL’YN”[R–]T–]V—\V–YTŒ^QaX;EM(6@8A&>G26BE*;:&78(=>09;069.:>06?,F7GK=IK=AE4KJ6\Q;aE/ƒJ9Àj]Üg`ãUSäFEåA@àA=Õ>5É=0Æ=-Æ4%Ë5&Ì6'Í7(Í7(Î8)Ñ;,Ó=.Ò<-Ò<-Ò<-Ò<-Ñ;,Ñ;,Ñ;,Î<-»2(¶7.±;/¨:)š7"”5•7œ9"¬A-±<+º6)Á4*Í6/×<7âC?éGDèDEèEHÝCCÉ:6»61´80®8.©4+«9/©9.¤8. 8-›9,–:+“<+’<+–=+˜=*™>+š?,›@-A, A-£@-¢;*¥:(«7(°6)¶6+¾8-Ä;1Ì<3Ú=6à=6â?8âA7âA9ÞB6Ú@6×@5ØH=ÒE;ÇA8»;2²5/ª3-¦1*Ÿ2+™9-’;*‘9+:*‹:)ˆ;)‡;+…<+€9'~9)|9(|9(|9({8'y6&x3$w- ‹A4—OC“MAŽL@‘QE“UJŽRG˜\R˜\R‘UMTL—ZU•XS”WT“gZ]T5IQ*AK(BK,>H/7@+2=-4?14<1HPCZ^PW[JMO:DF.AA'==%:;)>?1;=2:=2;?14=*;H.PbF7>F7=E6@F8>E5>F1HL5MI0U?'Q:¼sbËcXà_ZëUTçGGâ@>àA>Ø?9Î:0Í9+Í<+Ï=.Ï>-Ï;-Î;+Í9+Í:*Î:,Ð:+Ð:,Ð:+Ð:,Ð:+Ð:,Í;.É?5ÅB:¼B7®=/ 7$–1–1›2¦5#²7(Ã;/ÑA8ÞE?æIDéJFêKHÞCAÛEDÐB>¼<3¯9/©=0¥?1Ÿ=0Ÿ?1œ>2—>0”>/>-Š>.‡@.ˆ?,Ž=*‘;*’<+“=,”?+–?,—>,™>,Ÿ@.¡=-¤:,¨8,¬8+±8-¶:0¼9/Ê<2Ð<2Ó?5ÕA7×C9ÖC9ÔD9ÑE8ÊB6ÃA4¹=3°:0©6/¢5.Ÿ4,™7,‘;.Ž=,Š;,ˆ;+†:*„;*ƒ<*<,~;*|;){9)y:)x9(w8'u6'w4$€4'D7˜NC‘K?ŒJ>QD’TIRG“SJ˜XO–UO—VPœ]X”WRŽSOŠcT]W5Xc9_jBZfBIT66C)4@*0:<19<1<@25>+;H.PbMKD63Å?3ÅA4ÃA3ÁA4¶;,²:,ª8-£7+ž6+™7,˜7.“;/‹EI0?C(=@#:<$89';<.8:/9<1=A36?,MK4Ñ>4Ò>4Ò>4Ó?5Ó?5Ó?5Ó>7Ó?;ÑB>ËD>ÆF=ÂF<ÃI>ÇM@ÎPDÙSJÝPGâMGäIEäGBâC?àA=ÛB=ÕFBÉD?º?7«=0Ÿ>.šC0•G3”I6F4ŒE3ˆC3…B1€A/}@.zA.|?-‚:,†8,…9+†:,†:,‡;-‡;+ˆ;+‰:+‹:)Ž8)8*•9,™;/=/¢<0ª:/­8.¯9/°:.°:.°:,¯9+®8*¨7)¥7(ž6)›6*•7+’8-9/Ž<0ˆ<.…<-„;,9*:*~9*}:*};+|:,z;,y;,w9*s8*q6(r7)u5)ŒD8’H=‘K?ŠH:‡I<‹OD“TK—TL–QL›TP—QO”SO–\X_Xh^—~j””p…’fu‚WYh?CR+?O*P`B)=A(;='78(:;-79.9<1=A37@-NKB1=I1?G/LG1S>+g=-•ZL­_Sœ>4ž3+¶?9ØXUóigödeëRUæJNèNPÚIDÓF<Í@6Ë>4Î@6ÒD:ÕG=×G>ÚJAÚJAÝJBÝJBÞKCÞKCßJCàKEëSRèTTãSRÜROØSLØSLÛTNàUNàLHáIFãEBâC@äB@âC@ãDAàFDÙJFÊE@¹>7¬=2¡?2˜B1’E3G4ŒE3ˆC3‡B3ƒ@0?/~?0z?/|>/€:.ƒ9.ƒ9.ƒ9.ƒ;-ƒ;-ƒ;-ƒ;-9*ƒ:+…9+‡:*‰:+;-<.“;/š:.ž9-Ÿ9- :,¡9,¢8+¢8*¢8*Ÿ8)œ8)˜8(”8)9*Œ:,‰:-‡;-„:-‚:,9+€8*}8)}7+|8+{9+z8,y9-x:-v8+q5*o5)q7+t9+ŒH;I<‰I=„I;…K?ŒRF“WM˜XO˜QMœUQ—SP“VQ’`YˆbWƒg[†zdnrQZi@JY0AR(IZ0Wi?dvNj|VXiEL[:?L.:D)C-B47@-;H.L^8_uFi…Jt“Pt˜Pt˜Nr›Os›TpœQnMmžLp¡Pw¨Y|ªaz¨`rXi“QZƒA\„EaˆIeŒMgŽMgŽKfJd‹Lc†PY{IRtBi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QkbSkbSkbSkbSkbSkbSkbSkaUlbYlbYlbYlbVlbVlcRlcRldQldQldQlcRlcTlbVlbXlbXlbXocUnbRkbQlcRlcRkbQg`Pd]M^WGYSCSM?MJ;KH9GE6EB3?B/;H.?H-OC-a=-ƒE:«XR´NJž,+²:9¹=;ÓSRòpnþvvñefëX^ð^_ãUQÚPFÔG@ÐC:ÑD=ÔG>ÖGAÖG?ÙHCÚJBÜHDÝJCÞJFÞKDàKGàKGâHHáGIÜHHÙGGÖHD×HDØGDÛEDàBAäABæBAèBBçCBäB@ßA>ÛA?ÛJGÊC?¹<6®>3¢@3˜A0A0D3ŠA2ˆ@1‡?1…=/‚<0€.™9)–9(“:*:+Š;,‡;+„;,‚:+‚:,9+7)~6({5){5){5)z6)x6*x8,w9,s8*p4)o5)r:-v<0‹M@‰K<„J<‚M=…QC‹VH’XM—WN“NI™TO—VR–]Ve\{^PfVF`^GEO->N)?O(J\2_rEk~QexKXj@M_7@Q-6E&7D*=F1=D4:>07;-8:,:;-68-8;0>B47@-9F,I[5[qBeFr‘Ns—Ot˜Nr›Os›TpœQmœLo Os¤Ux¨\z¨`s [i“Q`ŠHYB^†GeŒMgŽMfJeGeGfLa„NXzHQsAi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QkbSkbSkbSkbSkbSkbSkbSkbSlbXlbVlbVlcRlcRldOldOldMldMldMldOldQlcRlcTlbVlbVocUnbTkbSlcTmdUlcTi`Qf_Ob[K^WGXQARLÐB>Í@9ÒC?ÒC=ÔC@ÕD?×CAØD@ÙECÚDCÝADÝADÞDFÝGHßIHàJIâHHåGHçACêADìBEìBEçAAâ@>Û=:Õ=:ÚFFÉ=<¹83°;2¦@4˜?1>0ŽA1ŠG]/AV-7H$1@!6B*=F5PK8MH5ID1DC.@F*DD([B,ˆTG¯\X«>A¬/3ÎINÆ?EÀ;>»;<ÄFGØZ[ãefÛY[ÌGHÑJGÐEBÍB?ÐB>ÔFBÔFBÐB>É>7ÏD=ÏD=ÒD@ÔEAÖEBÙECÚDEÝDFÞ?Cß@DÞBEßEEáGGàFFàBCá>?èBDé@Cè>Aç=>ä>>ãA?áC@ßECÖBBÅ98¶50°;4¦?6š>3=/?2ˆ)=C5ã?>â@=â@=ÞC?ÓB?Å>:¶93ª70Ÿ:0—=2Ž>3†>2ƒ?2?3=2;3„93‡83ˆ81‰92…;0„<.„<.ƒ;-;/€:.€:.€:.~:-~:-~:-~:-};/};/};/};/}90}90~80~8.€7.€7.€7.~8,€8,~8,}9,|8-{9-z8,x8,x8,x8.x8.w7-u7,v6,t6+s5*q5+m1'r6,n4)m3(o6+m4)q8-I=…SH…SJ†RGˆRH‹PHQJ”QK•RL“TMTK‰[N‚cQo_HYU:MV7O_;j~YbxQYoHUjCRg@Mb;IY5CR17D&4>#2:#6;'<>0@B5@@6<>358-39-4:.7:/9=/;?.=B,%Q?)kP=XG„NBˆE=“D?±WV¸TT»QQÀPOÀNMÁMMÂLJÃKJÐTTÈHGÂ=>Ä=:ÐB@ÓEAÏB;Ç>4ÊD9ÉE9ËF=ÍG>ÔFBØDDÜAEÝAEáBFáCDáCDâDEâDCáFDáFDáFDàEAßD@àB?ßA>àA=àA=àA=ÞC?ÔE?ÈC<º>6¬:0 90”:/Š<0‚<0€A2~@3~>4<3ƒ:3†91ˆ81‰90‡;.…<-„;,„;,ƒ;-‚:,‚:,‚:,9-9-9-9-~:/~:/~:/~:/}90}90}90}90}90}90|90|90|90z:0z:0y9/y9/y9/w9.w9.w8/w8/t8.s7-r6,r6,p6+p6+k1&q7,m4)l3(o6+l3(p7,~H>„RI…SLˆQJ‹PJQL”PM•QN”SOŠOG…SH€[K{ePsiPhkLfqQgxT^tMXnGPf?La:K_:K\:GV7CP4;E,8@)6;'7:)<=/?@2>>2;=04:03;05;16<0:A,>D*Q[9^mDkRpŒRp“Sq™RsSsžVxŸ^|¢exžak‘T`†I]ƒF]ƒF\‚E`†Ia‡Jc‰Le‹NdŠMbˆK`†I^„I]LRtBIk9i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTnbTqdTo_Pm]Pm_RqeYog\ldYhbVfbWqma{xi~{j€zjzubpiVe`JTT(MB.S@/U8(]7*l=3n70u91~;5‡@:’IB›PJ¥XP­ZR»^YºSN·GE¼B?ÈDBÑFCÓD@Ï@:ÐA;ÐC<ÒE>ÔG@ÖGCÚFFÛEFÞDFßCDßCDßCDßCDàDEßEEßECßECÞE@ÞE@ÜD?ÛC>ÜC=ÜC=ÜC=ÛC>ÖE@ÎE?ÃB<³>5¢:1”8-ˆ9,ƒ;-‚@2@1~>2=1ƒ:1†91ˆ81‰90‡;.„;,„;,„;,‚:,‚:,‚:,‚:,9-9-~:/~:/~:/~:/~:/~:/}90}90}90}90|90{8/{8/{8/{;1{;1z:0y;0x:/x:/x:/x:/t8.t8.s7-s7-r6,q5+o5*o5*j1&o6+m4)k2'l6*i3'm7+}G=‡PI‡PI‹PJŽQL‘RM’SN”UP‘VPŒWO‡[P~^OtbNoiQorUlwYfwUQeBK_:EY6DU3EV6GV9GT8ER8?I0*7;*:<.<>0;=/9;.6<25=26<26<0:0=@-=C)MW5Zi@f|MlˆNn‘Qq™RuŸUtŸWz¡`w`n”Wc‰L\‚E\‚E\‚EZ€C_…Ha‡JbˆKdŠMc‰La‡J_…H]ƒH[}JPr@Gi7i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTnbTrdWoaTm_Rk_SkaWlcZle[jf]jf]xtiˆ„x‘•’Œ~‰‚r}zg`cNOT>DG2FE1HC0F=,L<,VC4P9+R6*V4*Y5)\6+a9/e=1m=1ŠKBœRI®UO¶NK¼FDÆABÒDCØFFÔ@>ÕA?ÖB>ÖE@ÙECÚFDÛEDÝEDÞDDßCDßCDÞDDÞDDÝEDÝEBÝEBÛFBÚE?ÙD>ØE>×D<×D<ÙD=ØE>ÔD<ÒE>ÉF>ºA8§;1˜8,Œ9+…<-ƒ@0@1~?0=/ƒ:1„:/‡9/ˆ:.„:-„;,„;,ƒ:+‚:,‚:,9+:+9-9-~:/~:/~:/~:/~:/~:/}90|90}90{8/{8/{8/{8/x8.{;1y;0y;0y;0x:/x:/x:/v:/s7-s7-s7-r6,q5+o5*o5*m4)j1&o6+l3(h2&k5)h2&l6*|F<ŠOGŒOJPKRMSN‘VPWPŒZQ‰]R…aUy_PiZGd_IdhO\fKN]@EU8AQ4=M0G2:A/9=,9=.9=.8<-7;-7=36=56;46<2:<1;=/bxIj†Ln‘Qs›Tw¡Wx¢Z{¢ar˜[e‹N\‚EZ€C\‚E\‚EZ€C_…H`†Ia‡JbˆKa‡J`†I^„G]ƒHY{HNp>Eg5haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTrfXth\sg[mcYjaXle]snhzwp~w† ”¨¥œ«§œ¨¤™£‘™–‡z{kcfSOR?GJ7EH5BE2BE2EH5KL0A9,A7+@6*F4(S5*qB8ŒPHŸPK¯IG¿GIÌEIÓBEÖ@BÙ@BÚBAÛCBÚEAÚEAÜDAÜDAÞDDÞDFÞDFÞDFÞDDÝEDÝEDÛFBÚFB×FAÖF>ÔE=ÔE=ÓF=ÔE=ÕF>ÔA:ÓC;ÎE=ÁB9®>3ž9-‘;.Š.€=-;/„:-†:-‡;.„:-ƒ;-‚:,‚:,‚:,9+9-9-9/~:/~:/~:/}:1}:1}:1}:1|90z:0|90y9/y9/x8.x8.v8-y;0y;0x:/v:/v:/u9.u9.t:.r8-q6.q6.p5-o4,n3+n3+m4+j1(m7-j4*h2(j4*f2'j6+}D;NGNHQJTLUOŽWPŠYRƒ[Q{YMv\OkZJ]UBYXDY^HOYA?K3:H/7E.4B+5A+8D.=I3CL7EN9BK6?H5.5<,4:,5<45<56;56;49;0:-;@)GP1Ra:`vGi…Ko’RuVy£Yy£[xŸ`n‘W`ƒIZ}C[~D^G^G]€F`ƒIa„Jb…Kb…Ka„J`ƒI_‚H^IW|ILp@Bf6haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTkaUndZpf\lcZkd\rmg„|‘Œ§£ µ±®ÄÁ¼ÉÆÁÉľÅÀºÀ¹±¹²¨¤œˆ‚rfcTPQ?FI8>E3;D1:F28E38E38C2:B34(P:/e?6€EA¡PO¿X[ÊQVÊCIÕFJ×EFÚFFÛEDÝEBÞDBÝD?ÞCAÞDDÞDFÞDFÞDFÜDCÜDCÜDCÚDCÙEA×FAÕF@ÓF=ÒE<ÐF<ÑG=ÔE=Ô?8Õ@9ÐC:ÆC9¶A7¥=0–=/Œ=.†>/‚?/>.€=-<-ƒ;-„:-…;.‚:,‚:,‚:,‚:,9+:+9-~8,~:/~:/~:/~:/}:1}:1}:1}:1z:0z:0y9/y9/x8.v8-v8-t8-w9.u9.u9.t:.t8-s9-r8,r8-q6.q6.p5-o4,n3+m4+l3*j4*h2(l6,i3)f2'h4)e1&i5*{B9ŽMG’MH‘PJTLVO‡XNYO|\Qs\Nk[L`WFVSBPSBJQ?@I64@,3<+2;*09(09(2;*5>-9B1G4:F2:C25@/3>-1<,3:33954954928919;.;>-;@*CL/O^7]sDi„Mp“SwŸYy£Yw¡Yq˜Yf‰OZ}CX{A\E]€F]€F^G`ƒI`ƒI`ƒI`ƒI`ƒI_‚H^G]€JV{HJn@Ae7haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlbVj`VjaXkdZkg^upjˆ…€Ÿžš°°®ÃÂÀÓÒÐâáßçæäçãàâßÚÜ×ÓØÏÈμ²¸¥——‡zym]_YIKL:@E1;D/>J6=H7=F5;C4;>5:;3983880==3C<2N71a84ˆHH¯]_Å`dÊWZÍQSÓNO×MKÛKJÞHGáFDãDAâBBßCDÞDFÞDFÝCEÝCEÜBDÜBBÛCBÚDCØD@ÕD?ÓF?ÒE<ÐF<ÐG=ÔE=Ù@:Ù@:ÑB:ÈC:¼C:¬@4™;/Œ9+‰=/ƒ>.>-€=,<,ƒ;,ƒ;,„<-‚:,‚:,‚:,9+9-9-~8.}9.~:/~:/}:1}:1}:1}:1}:1}:1z:1y:1x90x90w8/t8.s7-r8-t8.s9.r8-q8-r8-p7,p7,p7,o6-o6-n5,n5,m4+l3*k2)i3)g1'k7,h4)e1&h4)b0%f4)zA8MG’MH‘PJŽULˆXNYOxZOr\Nk^N^WGRPAKN=CJ:9B12:+08)17+17-06,/5+/5)08+2:+4<-9D4;F5=H7-.800621622717829;0:<.:?)?H+KY5[qChƒLq“Vwž[w¡YsœVgP^IUx@WzB[~F[~F[~F]€H_‚J_‚J_‚J_‚J^I^I]€H]€JUvGJk@@a6haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlbVpg^ng_lgatqj‡„¡ œ¼¼ºÍÏÎÏÏÏàààòòòúøùû÷ö÷óðñìéîãßèÐÆÝÁµÁ«¢‘}ub^\GKM7CH2AI2AI4@G5BD7AA7B=9C97?:69<5>?7B71J.+d66QR³giÆnmÀ\\ÇZWÐVS×QNÜLKâHHæCDåBCßCFÝDFÝDFÝCEÝCEÜBDÜBBÜBBÜDCÙCB×C?ÓD>ÒE>ÐF<ÐF<ÔE=ÜC=ÛA9ÒB:ÊD;¿E:°A6œ:-‹5&ŠD69A208+/7*6<247058157247025.06,08-19,6A3:E5=J9>K9-,6..400511606718:/:<.:?+WzB[~FY|DY|D\G_‚J_‚J^I^I^I]€H]€H]LStGHh??]7icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSjcSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUldWibZgd]vsn“’Ž¯¯­ÄÆÅÚÜÛêîïóôöö÷ùüüþÿÿÿÿÿýÿûúü÷ôýòì÷áÔòØÇàʵƶŸª ‡ˆ„ibbFEH-DH/CG0FE1GD5F<3C60F42H:9>=9>?:B:7I75cGF’jjœ’è­©Ò‹‡ÇtnÀ]XÆSPÕONßJLçFKéFKßEGßIKÚDFÔ;>Ø>@áGIàDGÖ:=Ú@@Ú@@ÙA@ÖB>ÔC>ÑB<ÐA;ÑA9ÞC>ÛA9Ó@9É@8¾B8°@5Ÿ:.8*Œ=0‡>/ƒ>.>-€=,<+=*<,:+9-9-~8,~8.|8-|8-|8-{8/|90|90|90z:1z:1z:1z:1y=5w<4w;3u:2t91q8/p7.p7.o6-m7-m7-l8-m7-l8-m7-m7-i2+m6/p92o81k4-g2*g2*h3+e0(i7.d2)]-#`0&_/%b2(s>6ŒOJPKˆQJRJ}YMx^QhXITN>DE5>E5:C25@04&DR1WlCh‚Rs”]wž_r›Wk”R[~DXyDTu@Tu@WxCZ{F[|GZ{F^JbƒNbƒN^J\}H_€K`L^~MTsJFd@2I:3L95K<9?:7BA?MHE]RPyjg£Ž‹Î²®èÅ¿ÿ×Ñ벩͂|Àc^ÊVVØRSßHMÚADÖDEÕEEØHHÜJKÛEFÕ<>Ö<>ÛACÙ??Ù??ÙA@×A@ÖB>ÓB=ÒA<Ó@9ÜA<Û@;Ó@9ËB:¿C;±A6 ;1’8-Œ=0‡>/ƒ>.>-€=,<+<,<,:+9-9-~8,}9.|8-|8-|8-|90|90|90|90z:1{;2{;2z;2w<4u<3u:2s:1r90n8.o6-m7-m7-l8-l8-l8-l8-j8-l8-l8-k6.n70o81n91l7/i4,g2*e3*c1(d4*_/%^.$b2(^.$`0&p>5JE‡RL‡XR~XOrVKdRDRI:>?/:A16A05@03>04<14<15;17:379477577557246116//6./7,.9+1<.4A08E49H58G44E24B1.8/.5..3--2+23+46+8:-9=,7?(DQ3WlEh‚Ut•`wbp˜YgPY|DWxCTu@Tu@VwBYzEYzEYzE[|G_€K`L\}H[|G^J^J^{MSnKF_A9R4icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUneVneVlfZed_y{x—™˜²¶·ÍÑÒäéìôùüúÿÿûÿÿüÿÿýþÿþþþÿþüÿÿûÿÿúÿÿôþüçúùÝïðÑáåÄÒØ´½Å  ¨ƒ‡‘l`gEQX7EH-DC.JD4LD7KA8I>:C;9SJKia_wvœ’¾³¯ÙÎÈêÜÓþèÝÿóéÿäÛð©£ÃecµBEÇDIÚRVÛUTÑMKÊDAÍCAÔFE×EFØDDÙCDÖ=?×>@Ø@?Ö@?ÖB@ÓB?ÓB=ÔA:Ù@:Ù@:ÒB:ËE<ÀD<²B7¡<2“9.Ž<0‰=0ƒ>/>.=-~<,€=-€=-9-9-~:/}9.}9.|8-{8/{8/}:1}:1{;2{;2{;2{;2z;4x<4t;2q;1r90o9/n8.l8-l6,k7,l8-j8-j8-j8-j8-i9-j8-j8-n91m80m80m80m80i7.f4+c1(d2)a1']-#_0&c4*\-#_0&sD<}PJVP~YQpTI^J?OC7?<-46(2;*0;+1<.2=/4<15;17:17:379479668357257227007/08-.9+0;-2?.5B17E48G48G49F54>33:2/4-,2(/0(13(57*6:)6>'ER6YmJk„Zw—fwœfl“Z_‡KWxCWuCTr@Tr@VtBXvDYwEYwEZxF]{I_}K]{I]{I_}K^|JZwKPgJAW@3I2icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSjcSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUneVneVneVneVmg[jkfƒ‡ˆ£§¨¹¾ÁÐÕØåíïóûýõýÿûÿÿûÿÿüÿÿüþûýþùþýøÿþ÷ÿÿóøýæôýÞî÷ØæòÎÝéÃÎÚ´¶Á™¡«†€‡efmLMR4FH0HJ5KI:HD9D@7OGDj`_‹€¤š™·¯¬ËÆÂÞÛÔêæÝúñèÿûñÿ÷íÿÝÕû¶±åŽÊcd°@?ÃPKÉTMÉPHÃF@ÈGBÔMJÖKHÐ@?Ò>>Ó??Õ?>ÕA?ÕA?ÓB?ÓB=ÓB=Ö>9Õ@:ÒC=ÌE?ÀE>²A9¢=5•;2Ž<1‰=0ƒ>/>.=/~<,€=-€=-9-9-~:/}9.}9.|8-{8/{8/~;2~;2|<3|<3{;2{;2z;4x<4r90o9/o9/m9.l8-k7,j6+h6+i7,i7,i7,h8,h8,h8,h8,h8,m;2l7/j5-i7.j8/j8/f4+a1'd4*a2(].$a2(b3)Y* a2(yNE\VvWRiNGWC:I<3@:.:;-8<.08)/:*3;.4Ð@?ÑA@ÒC?ÑC?ÑC?ÒC=Ó?;ÒA<ÐE@ÉE@½C>¯@9 >5•=3Ž<1‰<2ƒ=1=0=1~<.=/=/~:/~:/~:/}9.|90{8/{8/{8/|<3|<3|<3{;2z;4y:3y:3w;3n70m80l7/l7/k6.h6-h6-h6-i7.h8.h8.g8.g8.g8.g8.h8.k92h6/f4-g5.i70h70e4-b1*c2+b3+_0(]1(]1(V*!b6-{ULtYRaNHN?8A7.=6,;9-9;.9<139-3;.5;/6<06<07:/68-47.6904923812:/2:/2:/19.19,.9+.9+/:,0;-3>.6C2:E5Qn>Qn>Qn>Qn>Qn>Sp@Sp@WtD[xH]zJ]zJ_|L_|LZwGRlECU?6D7(6)gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSicSjcSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVneVofWpgXpgXng]lnmz‚…“š «µ·ÄÎÐÜæèí÷ùôþÿõþýöÿüúÿúûÿùûþóøúíõöèñôãôýêôýèôüåóùßòöÛéìÍØ×¹ÅÄ¥±°’ŽregOMP;GK:FM=GOBKQG{{sŸš”ž¸ØÎÌßÓÓçÛÛóëéü÷ôðïêüüôÿÿöÿýôÿùïÿóêÿçÞÿ×Ëؓƒ¸eS£J:´TF½WIµF;·@8ÈKEÇC>ÊC?ÌB?ÎC@ÎC>ÎC>ÍD>ÍB=ÐA;ÒC?ÎDAÅD?¸A=ª=8ž;5•<4Ž;3‰<2ƒ=3=2=1~<0=1=/~:/~:/~:/}9.|90{8/{8/{8/|<3{;2{;2z:1y:3x92w81u91n70l7/l7/j8/i7.i7.h6-g7-g7-g7-f7-f7-f7-f7-f7-f7-h70h6/g5.g5.g6/h70g6/f5.a2*e6.^2)\0'`4+a5,i=4uSJXG@E>6<5/95,;8/8:/57,36+69.5;/7:/69.69.58-57,36+28,19,19.19,19.19,19,19,.9+.9+.9+/:,0;+3>.6A17B2ex\umt’lf‰_RwKBh9KkVsCZwG]zJ^{K_|L_|LVsCNg@ÉD=ÈC<ÉB<ÑC?ÐE@ÌEAÂC=³=9¦;5œ;5•<6Œ<3‡=4…<5=4<3~<0=1=1~:/~:/~:/}9.|90{8/{8/{8/{;2{;2y:3x92w81v70v70s7/n70j8/j8/j8/j8/h8.h8.h8.g7-f7-f7-f7-d8-d8-d8-f7-g6/h70i81i81h70i81j;3l=5g80k<4b6-a5,oC:xLCtI@nMDC9056.45/8918;247.14+25,58-58-57,46+46+46+46)37)/7(-8(.9+.9).9+.9)08)08)19*08)08+08+08+19,3;.4<-9B1:C0;B0:A1:<.68*24&/3$29'IU?cu[m„gf„bWyTInE?d8Hg;Li;Nk=Nk=Li;Li;Mj

    UrDYvH[xJ]zL^{M\yKQn@G_;6B4+4/#)%gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSicSjcSjcSjbUlbVlbVmcWmdUmdUmdUleUmfVngWogZnh\oh^mjekormtzƒŠ¥®³ÃÌÑÕßáæîñôüþôýú÷ýùùþ÷úÿôüÿòüÿñüÿîýþðûøïþúñÿùïÿúíÿùéÿòßïàËÝηÁ²›¢—|ubb_NXZL]cWmwn|†}¦¬¢¾ÀµÚÕÏîäâüîîÿôôÿô÷þôõþøøûúøûýøüÿúøÿõôüñ÷ýñÿÿñÿùèÿôãÿÌ»½p›QD©SFµSH²C:ÀJ@ÄH@ÇG>ÉF>ÈE=ÇD<ÆC;ÆC;ÍG>ÌG>ÇG>¼C;­>5Ÿ:2—:3‘>6Š=5†=4ƒ=5=4€<3;0;1;1~:/~:/~:1}90|90{8/{8/{8/z:1z:1x92w81v70u6/u6/q6.m80k90j8/j8/i9/i9/i9/h8.g7-f7-g7-f7-f7-f7-f7-f7-f5.j81m;4k:3j92j:0m>4oC8l@5oD;d<2c=2zVJ†dZyWMbLA>:13814927<54:0/5+25,9<336+25*24)03(13(25*46+47,.6),7)/7*-8*/7*/7*/7*/7*19,08+08-/7,/7,/7,08-08+7?09B14*00!''heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjdVjdVjdXldYlcZmeZmeXmfVg`NjeRnkXol]he\feasqr‚†Š“–ž¡«³¶ÃÈËØÝàêîïö÷ùùûúüþýþþüÿÿúýþöúýòùüñúýòûþóùúòúúòùùíüúëþüçù÷ÞéåÊÕÔ¶º¹›˜˜|psX_dMbkXr}l„‚‘›´¹²ËÌÇãâÞòîë÷óòû÷öýùøüø÷ÿþüþþüþþüýÿúýÿúýÿúýÿúýÿúúü÷ÿÿúÿûöÿêåا £`X›D=µNE¿MCÂF<ÄD9ÊE<ÎI@ÎKAËH@ÇG<ÆG8ÃH8½J8³H8¦E5šB4‘B5‹C5†B5„B6‚@4‚>3‚<2„:1†91†9191~:1|91{80z7/z7/w7.v6-w7.w7.w8/w8/v7.u6-q5+n3+l7/i81i81h70h70g6/g6/g6/f5.g6/i70i81h70g6/e4-e3,h3-j5/m80k90j:0i;.i=0kA3gB2jI:dH:v_O~k\ŠxjŒoRJ=79.4:04:039/39/39/28.28.17-17-36-06,25,/5+14+/5+/4-.5-/4-.5-/4-/4-/4-/4-05./4-/4-.3,.3,/4-/4-/6.1;23=26@58B79D67B45@03>-4?.DQ=WeN[kQPbHEX<@T8BW6Ic>Ke>Kf=Kf=JeOj?UpGYtK\vO]wP]wRWqNHb?;O6&1+&+.$),heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjcYkdZlc\md[meZmfVidQjhSmjWjk[gg_lll~„“š¨¯µ¸ÂÄÑÖÙâçêòóõûüþÿþÿÿþÿþýûÿþúÿÿúþÿùûüôøûòöüò÷ýó÷úñøúïøúí÷úéùûåòõÚßâÃÌЯ´¸—‘–vkqUYaI_kUtoŒ˜Š§œ¿Á¼ÓÓÑççåóóñ÷÷õûûùüüúûûùþþüþþüþþüþþüþþüþþüþþüûÿþõÿÿõÿÿþÿÿÿûúÿíêð¿ºÂ~uŸKA¯M@¹K>ÂL@ÅK>ÃE9¼=4¾?6ÃE9ÄF7ÃJ7½L:³J7¦F6™C4‘C6E7…C7‚B8A7>5‚<4ƒ:3†91„93~92}:2z:1z:1y90x8/v7.v7.u6-v7.t8.t8.t8.r6,o5*m4+l7/i81j81h70i70h70g6/g6/e3,e3,g5.h6/j81j81j81j81k60l71k90k;1k;/j>1j@0hC1gH6kP=gRAufSue‹†s†ƒrKL<69.39/39/39/28.28.28.17-17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4.05//4..3-.3-.3-.3-/4./6/.80/:21=34@66B66B66B45B16C1CP>P]IR`IIW@AO6BP7FV;Jb@Jd?Ke@Ke>Ic6I5&1-',0$)-heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjcYkdZlc\md[meZmfVmhUkiTmjWjk[kkcwww‘’—§¬²¿ÆÌÒÜÞìñô÷üÿþÿÿþÿÿÿþÿÿþÿþýûÿþúÿÿúýþøúûóõøïñ÷ëñ÷ëô÷ìõùëöøêõøåõ÷áîîÔÛÛ¿ÉÊ«°±’“–yuy`kpZt{iˆŸ§œ®µ­ÍÏÊÞÞÜïïíøøöûûùþþüþþüýýûþþüþþüþþüþþüþþüþþüþþüýÿþûÿÿûÿÿþþþÿûùÿúôÿ÷íýÑÆ؞”L=¥RB©L;§@1·G;ÏYMÏUJ¼@4ÃC6ÆH:ÃK=¹I;ªB7?5—@7“D=‰@9„A9A8?6~>5}=4<4}=4z;4x<4w;3w;3u:2t91t91t91r90r90r90r90o9/n8.l6,k5+l7/j81l71j81k60i70i70h6/g5.g5.f5.g6/h70i81k:3k:3l;4j;3i:0h<1k?2jC4iD2fE2gJ8lVAjYGujV†m‘Ž{€mDG658-28.28.28.17-17-17-06,17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4./4./4..3--2,-2,.3-/4..5.+5-+6.-9//;12>24@46B47D38E3?L:ER>CQ:;I28F->L3DT9J_@Jb@LdBKc?Ia=G`9F_8G`9RkDXpL]uS^vVZqTPgK=T8.A.&1-',0%*.heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjcYkdZlc\md[meZmfVniVljUlkWlm]pqi€‚ž¡¦¹¾ÄÄËÑÛåçõúýûÿÿüýÿüýÿþüýüûùÿþüÿÿûÿþùûüôõöîîñæéïãçíßíñâðôåñôãñôßòñÜêêÐØؼÇÇ«²±•¡¡‰‘“}“€œž‘ª­¢¶»´ÀÅ¿ÜÜÚééçööôûûùýýûÿÿýÿÿýýýûþþüþþüþþüþþüþþüþþüþþüþþþûûýÿþÿÿþÿ÷òïüóìÿüóÿûíÿôäìñ¹p•P@¢O?¸XJ·M?µE9ÀG<ÁA6ÈE;ÅI?½G=¯@9¡;6š=8–A>?;‡@<@:}@;z?9y@9x?8x?8v=4v=4v=4u<3s=3r<2r<2q;1o;0o;0o;0n:/k9.j8-j8-i7.m82n72m61l71l71k60i70i70l:3j92h70f7/f7/f7/h91f:1j?6f>4e=1f>2hC3iE5fG3cG2cJ6hV@i\IskV…‚ozor_9=,28,28.17-17-17-06,06,06,17-17-17-06,06,/5+/5+/5+.3-.3-.3-.3-.3-.3-.3-.3-.3-.3--2,-2,-2,-2,.3--4-*4,)4,*6,+7-.:.1=14@26B46C2:G5N4DX¿@7ÆC;ÅF?¿D=±>;¦:7ž:8™>=‘=;Š?<„@=}@=xA6s>6r=5r=5r=5p>5o=4n>4m=3l<2k;1j;1i:0i:0j:0n72p62p62m61m61l71i70i70l;4k:3h91e90e90e90e:1d<2fB6cA5cC4dD5dG5dI6bI3_I2^L6eV?jbMrmW„ƒo„‡r[`L3:(28,28.17-17-17-06,06,06,17-17-17-06,06,/5+/5+/5+.3-.3-.3-.3-.3-.3-.3-.3--2,-2,,1+,1+,1+,1+-2,,3,,6.+5-*4+*4++5,.8-0;-2=/2=-5@/6A05A-1=)1=)5A-8F/=O5@T8FY=H\@J]?I^=K^>K`?TgG[pQcvZ`tYYkSJ]G6G4&4%$-*$),"'*heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjcYkdZlc\md[meZlfVjgTkjUlnYorasvm€†„Ÿ¤¨¸¿ÇÖßäí÷ùûÿÿûÿÿûüÿþÿÿÿþÿþýûÿÿûÿÿúüüôóõêëíâãçÙÝãÕÜãÑãèÒçìÕéíÖêìÔëëÓèæÏßÚÄÓθÓκÌƶËøÐÉÁ×ÒÎàÛØêæåðïíóòðùù÷ýýûýýûýýûÿÿýþþüüüúþþüþþüþþüþþüþþüþþüþþüÿýüÿûüÿøùÿþýþÿýùÿýôÿøïÿõ÷ÿöð÷çÿÿíÿîÛͧ”¤kX¢[GªWE­L;¹D:ÀD<ÀE>¼E?´A>ª=:¢:9š;9•=<?=…?=}@;wB5o?5o?5o@6n?5m>4k<2h<1h<1h<1l<2o83q62p62p62m61l71j81i81h70g80e90e:1d<2e?4f@5dB6^B4aG8cL:dM;cM8`K6]K3]M4]Q9bX?mhRss[€ƒnv{eFO:4=*39-28.28.28.17-17-17-06,17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,-2,,1++0*+0*+0*+0*,1+,3,.5.,6.*4+*4+*4++5,-7,.9+-8*0;+4?/5@/4?.3?+3>-3@,7F/9K3@O8BT:GW¸J=¹I>¸I@´G@¯D>¥=:œ:7–=9>:ˆ?9€A:xA:tD:pF:pE5j>5n=6o83r73p62p62n72l71j81i81d8/d90c;1d>3d@4cA5cA5_C5ZE4_NnlUtv^|kcmU2>(6B.3;.39/39/39/28.28.28.17-17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,,1+,1++0**/)*/)+0*,1++2+-4-+5-*4,*4,+5,+5,,6+-7,,6+/:,2=/6A17B27B15@04?.2?-4C.:G3=L5AO8DT:JX?L\BTbI\kTcqZ^mXUbPDRA2>0#/%&/,&,,$**heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjdVjdVjcYkdZlc\md[lfZlfVolYmlWjlWgkZflbr{xŽ˜š¨±¸ÊÓØãìñøýÿ÷üÿúûÿþÿÿÿþÿúùõÿÿúýýõøøîðòåéëÝåéØãêØåíÖæìÒéíÒêíÒèèÎèæÏèãÏáÚÈØÐÃØÎÄÝÒÌéÞÚøíëÿôöÿõùÿõûÿùüÿýþÿÿýÿÿýþþüþþüÿÿýÿÿýýýûþþüþþüþþüþþüþþüþþüþþüÿþúÿýûÿýûýüúùýüøÿÿõÿÿóÿÿíýúóÿûûÿúÿÿôÿöæÿóßÿãÍ×­•©oY¨WD®Q@¬O>¯OA±OB­K@¤C<™<5•>7?6ˆ?8A7{B7uD6qE8qE8p?8q?8s>8q?8q?8q?8q?8p?8sB;qB:p?8m>6l=5j>5m>6o>7o83q73o83m82m82i81h91f:1f;2d>3d@4bB5`C5]A3\@2WB1TG4[S>f^Gi^HbX?ZS9ZS7\W:ZV;XW;kmUsw^u}fUaI&28D03;.4:04:039/39/39/28.28.17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,,1++0*+0**/)*/)+0*+0*,1++2+)3+*4,+5-+5,,6--7.-7,,6+.8-2<16A39D69D47B46A10;+2?-5B09F22=/x=/t?/sB3tD6r=5r=7t=8s>8u@:u@:t?9q?8sA:q@9r@9q@9p?8n?7o>7o>7k92m82l:3l;4l;4h<3g<3c=2c?3^>1dG9cG9T=-N9(M8'@1WQ;PN7KI0OK2]Y>ieJeaDVU7XX<]`CosZz€fdlU>J2-9#2>*4-1=)2>*9E/BN8IU?O[GVbN]hWYdTLWI/u@8t?9u>9u@:t?9o=6p>7sA:q?8p?8p?8o>7o>7m>6n=6m>6k<4l=5m>6k?6j?6gA6eA5bB5dG9[A2^G7^I8N=+F7$G8%?7"LL4GK2DG,BE*MM1[[?baC`aBYY=dgJsw^sy_X`I:D,/;%7C/6>16<26<26<25;15;15;15;15;15;15;14:04:039/39/39/27127127116016016005/05/.3-.3--2,-2,,1++0*+0*+0**1**1*)0))0))0)*1*+2*,3+.5--4,.5-07/4;39A6?F>BJ?;F8:E57B14?.3?+6B.)r>)s@+tD0vE4q?4n<3q<4tB9sA8o?5qA7xH>n>4m>4m>4m>4l=3j>3l=3j>3g?5gA6gA6gC7eC7cC6`C5^D5bK;UB1ZI7`S@RG3C;&E=(FA+AE,BH.AE*<@%?B%LO2_`AijK``DnqTvzagmSJO94<%4=(=F38>28>48>48>47=37=37=36<28>48>47=37=37=36<26<26<25:449349349338238238227105/05//4..3--2,,1++0*+0*).().().().().(*/)+0*,1+160/4.,1+,1+/4.6;4=BK:4.8/-4--4-,3,gdUgdUheVheVheVheVifWifWifWifWifWifWifWifWifWifWkeWkeWlcZmd[md]mf\mg[jiWkmXimVjoYjs`hthm|wˆ˜˜¦³¹¿ÊÐÓÜãëðööûÿüýÿýÿþÿÿýÿþùþþöýýñúûí÷úçô÷âîóÜåíÕâèÎÛàÀ×Ú»ÖÖ¼Ù×ÂÝ×ÇÞ×ÍåÛÙìààøìðûðöÿõûÿùþÿúýÿûûÿûûÿýüÿþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýÿüøÿþøÿþûÿþþþþÿüþÿúÿÿùÿÿøþÿúýÿùüÿùùÿýúÿÿøÿÿøûÿõüþðÿÿíÿüéÿñßÿðÝÿïÚñÒ½´zyS>sI3uH3vI4zM8~O;yL7nA.e7'{M@sD:qB8sD:oC8g;0d8-g=1i?3i?3i?3g?3f>2f>2f>2e?2b@4bB5`C5_C5_C5[D4YD3WD3XI6OB/\T?oiSc^HMK4IG0IK3>D*?H-@F*48>47=37=37=38>48>48>48>48>48>48>48>47<67<67<66;56;56;55:45:438238216005//4.-2,,1+,1++0*+0**/)*/)+0*,1+-2,-2,05/.3-+0*+0*-2.2718=9;B:@K=@M;@M;=J68E13@,1?(0>'4.:0,6..5.-4-gdUgdUgdUheVheVifWifWifWifWifWifWifWifWifWifWifWkeWldWlcZmd[md]mf\mg[jiWkmXinWiqZgs_drejyt…••£²·½ÈÎÒÛâêïõôùýûüÿýÿþÿÿýÿÿúÿÿøÿÿóþÿñûþë÷úåðõÞæîÖâèÌÙÜ¿ÕÕ¹ÒйÔѾÚÔÈàÙÑêàßôéíþóùÿ÷üÿûÿÿýÿÿþÿÿþüÿþúÿþúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýÿþúÿÿúÿÿûÿÿþþþÿýþÿüüÿûüÿûúÿúøÿù÷ÿú÷ÿýøÿÿûÿÿûýÿúýþùùôîÿþöÿýôÿüóÿûîÿ÷çûæÕéÒÀÏ´¡¶š…”uawVClI6mH6rM;uP>mF7iB3gB2jE5nI9nJ:oK;oK;eA1cB1cB1cB1cB1cB1bC1`C3]F6\G6\G6ZG6ZG6WH5TG4RG3PH3NH2fdM~~frrZVX@JL4GM3A.:>-;>39?59?58>48>47=37=37=38>48>48>48>48>48>48>48>49>89>89>88=78=78=77<67<66;55:449338227105//4./4.-2.-2.,1-+0,+0,,1--2.-2.,1-,1-,1-,1-.210513763:3;G9=L9@O<@O:8F71?2-9-,6--4,,3+fcTfcTgdUheVheVifWjgXjgXifWifWifWifWifWifWifWifWldWldWlcZmd[md]mf\mg[jiWkmXinWiqZgs_bpcgxr‚””£²·ÀËÑÔÝäëðöõúþûüÿýÿþÿÿýÿÿúÿÿøÿÿôÿÿóÿÿïúýèò÷àçðÕâèÌ×Ú½ÑѵÍË´Î˺ÖÏÅÞ×Ñìâã÷îóÿöþÿúÿÿýÿÿþÿÿÿýþÿúþÿùþÿúþÿúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþþýþÿýþÿýþÿýÿþýÿüþÿúþÿùÿÿ÷ýýóýýõþýøþýùÿþüþþþÿýÿÿþÿþùÿÿüÿÿûüûöóÿøòÿýôÿþñÿþíÿúéÿóà÷äÓçÒ¿Ôº©ºŸŽŸ„srb|]K}^LtUCaD2W:(Y<*[>,X=*`E2`E2`E2_F2`G3`G3`G3]H3\K7\M:\M:YL9XM9UM8RL6QL6NL5QQ9ikS|€gmqXSY?FL2>G,48>48>48>47=37=38>48>48>48>49?59?5:?9:?9:?9:?99>89>89>88=78=78=77<66;55:4493382382/40.3/-2.,1-+0,+0,+0,+0,+0,,1--10.21/32/32/32-4-3?17F3=L7@O:?N7M:MJ9BC3=@5;A7;A7;A7:@6:@6:@69?58>48>48>49?59?5:@6:@6:@6;@:;@:;@::?9:?99>89>89>8:?9:?99>89>88=78=77<67<6495273162/40-2.,1-+/.+/.,0/,0/-10.21.23.23-12+1-+9*/@-6H2;M7=O7A6>A6>A6=@7=@79?59?59?5:@6:@6:B7:B7:B7;@9;@9;@::?8:?99>79>89>7;@:;@9;@:;@9:?9:?8:?9:?98?87=94;4382160/4..3/.3/.21.21,2.,2.+2++2*,4))6%$6)=!2F+8L1;O6;M5;M5;M58J29K3;M5H&DK*FM+EL*PV4PT3KN/HK,TT8bbFccIZZ@[Y@\ZA][B][B[Y@XV=US:SQ8HF1GD1DA0A?0@>1>>2??5>@5;>59?59?59A69A48C58C58C5:B79A69@88@58?79A69@8:B7:A9:B79@8:B7;B:E=8B:8B:7A88@56>14O<>P::L6@R8EW=FY=DX=@T;5H2+<),6+,3++2*ZgM[hN\hP]iQbjSckTfkWhkXghVghVifWifWkeWlfXmeZmgYmgYkhYkg[kg\jf]jf[hfZefVhiWglVfo\erajwnzŠ‰œ«²ºÈÑÐÙàáéìò÷ûøþþùþúúÿøûþóùýïøùë÷øæõôâíìØéæÓåâÏÜ×ÄÒ˹ʿ­Á´¤¹­¡¼¯¦Á¶²ËÁÀÛÐÖæßæûóþý÷ÿþûÿÿþÿþýÿüýÿüýÿüýÿþþþþþþþþþþþþþþþþþþÿþüÿþüÿþüÿþüÿýúÿüùÿüùÿýúÿýùÿþúÿþýÿýüÿüýÿýþÿþÿÿþÿÿýþýûüÿþýÿþûÿüúÿøóøíçòåÝöèßûðêÿúýÿüÿÿýþÿÿýÿÿûýÿüýÿþüýÿýþÿýþÿÿýÿÿþüÿþõÿÿîÿþèÿÿäúöÝýûâäàNj‡lRM0SN0QK+QK+UO/UO/TO1TO1SO2SO2QP4QP4QM2PO3PN5NQ6MO7JP6HM6EM5HQ6EN1BK.?I'BI(FM+JP,KQ-NR/PT1VZ7^bA_bCY\?TWWU>XV=YW>YW>XW;VU9XT9QK3OI3LG4ID1DA2B@3A?3>@5<=59?59?59A67B48C57D37D3:B79A69A68@58@59A69A6:B7:B7:B7:B7:B7;C874>63=40>-3C)9M*BY/Ga1Op;Ln;Li=Fa>BY?F;J@?I>>I9?G8>F7>D8=B;>E>9C;6@74B19I/BV3Pg=XrB^J[}JXuIMhECZ@9O:6G54E2XR6:@6:@69A67B47B46C26C2;C8:B79A69A69A69A6:B7;C8;C8:B7:B7;C8;C8=E:>F;=G<=G?>H=>I9?G8>F7>D8=B;=D=9C;6@74B19I/DX5Ri?[uEZ{FWyFTqEIdA=T:2H3/@.->+6H2@R8L_CReGSgKOcG@W=6I31;007/-4,YgMZhN\hP^jRblTemVinZjo[mn\lm[mk\mj[nhZnhZoi]oi[liZkhYjfZieZie\ieZig[ghXghVchRajWerao|s{‹ŠŸ¦¢°¹ÁËÔÔÝäéñôòúüôúøñöðíðçèìÞâãÕÚÛÉÒÑ¿ÌɶÉıþ«¿¸¦¼³¢Ê¾®ÓŸÜÐÄæÙÑíâàöìíÿôúÿùÿÿ÷ÿÿúÿÿüÿþýÿýüÿûüþüþýþÿÿþþþþþþþþþþþþþþþþþþÿþüÿþüþýûþýûÿýúÿýúÿýúÿüùÿúöþùõÿýüÿûúýùúþúûþüýÿýþÿþÿÿýþÿüûÿýúÿüúÿøó÷ìæòåÝøêáÿôîÿúýÿüÿÿýþÿÿýÿÿûýÿúýÿþüýÿüýÿýþÿÿþÿÿÿýÿþõÿýìÿûãþúßÿüæÿÿéçâ̌ˆoRL2TO2TM0UN1TN.UO/VQ3VQ3UQ4SO2ON2NM1PL1NM1NL3KN3LN6KQ7KP9JR:LU:IR5JS6OY7SZ9T[9]c?fnG‚’c’¦sŸ±›ª’¡zˆ”pr{\\bFLP7KM5LK6LJ5LJ5PK5TN8VP:WQ;VP:SN;QL9LI:IG:GE9CE:=>6:@6:@69A67B47B46C26C2;C8;C8:B79A69A6:B7;C8;C8;C8;C8;C8;C8F;=G<=G?=G<=H8>F7=E6=C7=B;:A:7A95?64B19I/BV3Ne;Uo?Tu@RtAPmAE`=9P6-C.+<*+<)1C-2&G!!v93X%U{C~NZCIGr5U;2a@F0mkT5Cs4N{}=i{Tm~>X zBQIQqg6Sp#X-ml*;epDp-6PEcG~i1T1DF9&0uEN3c2Bq8$wmUn0+or-5)5L$> zZYUc^*NW`geZZdxP^pV^%`yz@uOO*o-Cp0B)mz(a7W0 zJSqS3)PkYvM?ag1)SP^GS0rMt{7HkZ|Am7DBd3Oo{#X75O&{6P+Fq)!8^71pOcD&# zH)($II}ge09Ez>B{`aA*3Ook-^DYeje=~3D6;QJKxvq@}|**dT<{SBc#dXp^X<_DuM zwIxg1Vg$^k%{j>K2=?7Eghrt>XUt2SQbJ6Ub0)o2DsOTuwIQgwM$`$S&x z{p8xaLdN%xcsgs|u$Q0*$|vvxDR%u;L+#T4c!TO8&8a3A-Y4lJu9e$Y@VB92@>Iqh zo0*NRmaq$&hGcINP->TM(|mY106u7W@w>8i^(moKGuTh0Fcz!(si}YjOzNAlE)XAo zAE-rgQ7cjUTu5cm#a562!BmbJgPX9acaispGF_L*V{McBNpW@cj|Pljom8td#F`7zJ@mh zf?j@M}XP17YC$wdc#W0xCXK=aPS@%R<c>9)Tq-Ot{1Mn}%&smLh>z*^E#SpJ7DTSM6{I<8gym2w%i7-~Ft ziw*xL5>{ch^6r6qqGX_0kDkUewXziJJxQNGlG>`K=Y<3Vk&8^9AeX^TmP}jA+zGEK zh%iCVe{N1QW_W5VT9>wA%G8Cj#IPb*!PIz&z)Y_=VR>|wAvsrGYnoY#vTNbcgYr?4 zSX4Y$C$-T>Ofn~>5Vncs_mpb@T<0XNB)G4OjY&)3x(8LJduy1N zyQq8`Cw9!|^E z6ZbRMcjO}$Nr27qD{OM;SCBq=MU`5)z^;C;{d}VTu2JCJAuaKioNhnCN zI2iTe$Af(J-YtKv=O+OodO>ZO$XOd`UkG|e< z#Mc_ggAQDpZdWs^Z{|FA{B-OWYfWd^d|y7Dj@9dkL?r^|lLV>juuo!gS1{nV-qj3}o19Jl^B zl*|p_P4X(ylRusPQhgr8?k|Y?7Z)(4*C?R(_AnYUE7Uai{$fnNu2EFoB8rTSS5Vp0 z@iEtvAKEuSqjjH(rhi0xRTAzmJ*iZ-@NI3|nl*bUGK#(FVMaVGE&1+d3TGNIh?o~H zjpGcwmG1l3zS#9Cu017U&_*dQHH3+di3@B|5PC3D<|F?AKDTnbO~o-I#q$g*8k#WS z@KNS0_8=g;5$O^3p0jmG!-_$;(s0&K^nj3HvdYTAQP&m@5$yAsS47u4?@c4PgF@7B z_<`HUL0sG&9A&P-h(yLnzfpCCD&R&gWQTs5-;BO%J(AXeb-XWs+krg$WI1iF((ipz}+A;^)o|j}D(1MeYNJ0?ks6goYQV#=%Vr1j0{i z8tPrc^U|Gml@$pWezsq+tV``~sykyO0PK9y=5euX%*j#bT5mpdyF$f^z#Z0fw9oZ6 z=j4djhifzRgXUx>&LZ?ymN0wzTU3qNb|fcT)fgR82sS(#kB)y|@#8}8yh0(QG;C2| zv)A72M+f#QKGY+Hyzz68J6GQJc6PdGV0JWDa#dzeI+GQ~zN=K*^S)&uoUzuc?pF>y zsPJ2PWMeyvv*f5|_|wpd5trsQ52t@FhoIqZGv9GJJ*o4>Zs16?Q>*JUS|m7aO-W@{ z{G}SZgevlph4D4SwRS*AXgV8d%l!P#Ec-S-X$L;jNE2T&Vk#$?I5O_0wM^)Df2Lat zTOk1&a}=#kR@}e`iuQrgybbdOX=d0d<8W)}p(NJZU*?WO#!RIbwXe=kb@-#- zpu?(|bQfDy`qX?WwMr3oN4rkFrBJ!r*NOy)s%$fv_ z_WfBLNm%}sR+9bUt3wV50dq6F!r5HpyUAP`MDAv|>e#4qr?VHa=|lhexi5mjC1(3^ zPw#K1K;wKeOwPFSo@0Pfl7O8(k&T5Y0120;UOUtok?Z)7g}L{Wj(D}B-BH4}<_1j1 z3Fs&cJ5Dbq=ZXmuafY^L*B(6S>lLz4KzwdYdUn;LCX8*Fe-yEt<9b^Qe-oocQOcGvM+x~f{<8Mi|vcyIbfm_liLre7Ae{b++;ldu4Hv16OF zVa4=l)Fi_Ba}nccn93EW!A)}#080sS^ZLd~taINZ(kg)HaC&xp7SE2Ej8>DM`}$WS zr`q*RrHR+~{P>n;3DSCH(X@VtX&g+?=bIsw!P+*+uT@!&0x9yfL^}Z^ts>nSCgW!U zesi*mtT!QbK~ZW)?q=S3sZiw><#{qohaIT8$eS0GjY{Z;F0}oEdm}s0dJvsl`M9i| z5wjdbLt&@(XMOYJL&qhBk2~4e}BK9`+Q)0 zGW=y*UzJ17?A?C;Cb@sU0ST}rCc&nB|IIw!nR!o_kJBmXp>vBA4rHjMx=_rd5*Qde z2JRR8j4Qrb`*mPj&&MiLF1OCUYgN|-`L#*?$5?++<(OW^y;c8f7f!`*2FLLxBGYQ8 ziLLL0)!TnbbpnPju)xcZV&&Rsv?rcLjs$3P-*xP*M5bW2kZ9FwT8w0CjSaPgE{h;D z-+`A#Tn8>g)o(1d&Do#4n^a1F?}DL4uhQh;fTM(mGBOQ_%tj0ER_hA1gX~@Ic>+ox z{~r;1uebhGn{x`rz4M5L_|(02 z4C;Men!B8B`I;b}6B*OJKbGj!ZV--m!?F`jpZXYXXzij%zESIhp8g#|UJaX)Fk9PH znss<^>KHocJMYoZWP8ZWQhhdcj?1{+LUuDd?uG1Kq3PEzIp1S6SSe2b#W|_=U9{UN(U9RlPm6{pFK(BXm-rE3jHU*t* z3v+)Xk|1f>l{}yLkza^w$?nLaLw+B{+|+SQCJ!R2;`@3q!!BLfd%pn*VNGB5LMab> z`OT9*(4gVN)yIwu2Y-XpO@7<)dV3zlihPVplDYTv7FA!oYnGtlo7Z-5cE&}Mh#IiwgOz0IM&G)_|X_D>Ll}P^s_I0 zj|>1^aDHWL>WSk>5nez{^_sy{Zv;z@Tq=MkBw;Y2K7HW7)nwwG6Xlj-YoQ1CE#{D( z!PL1<88@ul|K#SHm4xw?C!rkM+=NPJY+W2nZbwVhe0jw>18x(Ot^s6 zb^GL9;VZTNr@_oK3dlpNp#@bYk+CEwT0d=gO=whR&pGDV`E^3?3d+HS*K~ zw+mH-TbeYxx6Gn>WK(LDl1Ts}_hpFShjZ;c6F*homUri9K3tb#5eX=xJK9$$J2{le z8}{2`NoC9>WYo{LrSW{;KMDTwfm+#Td9=!7^j}WXncPN*t^&5TXVA?z(#c>xtiR-H zS?I9r4oqJdhp#SmKF(ba8~s{443+eLRymNGlfG8u22VcuIR7l)hdUzBaMFXQgWW}5 z{^JC8^Ad3^<3aVQQcJ4@?y2(RLSe+_J}+tLt@RNL`Ya22yufpk- z{cA`dpK_8%OO5fdCIlq_vx=%mo?qP%j>F{mQ5%;uE|k`na^876jQKbw>204=8aBL9 z6gkA026UMtzrPu7uljtYx9?G0jS%y*AbEAVS!tY5;Y-J|+bkd2CNOWN?gGKA7JINo55e39M(5GudSE)~Sb|YC9YoEv!Q)#6_RZ%EuI> zTtnXIvU+?9ek2xCkeH~JKJNuBOe=T|nlk1~p-*EmIaNlGDHO!f5YeUIg)1-Bó<@õ;>ô:=ó9>î;>è>?ß@=Ö>;Ê@6»=.´?+´?+´?+²?,²?,°@,¯@,­@,©@+¥@,¡A+A*™A)˜@(•A)’@+?,‘>,‘>,=+=+>)>)“>*“>*“>*“>*”=)•>*–?+•?.”@5“?5—=2ž>0¨A0³D1¹D2½D1·?/³B2ªF7œI;†H9mB2T9(C3&<5/95484373262/51.40-3/,63.52-52-52-41,41,41,10+-/*+0*-/*-/*./*./*1-*1-*2-*1,)3)(2('5)):..D66O:9iAB|IH‹NM”POžVY©ck¨o€œtŽ’|¢…«†º|ˆ¼rz«^aŽTKvOEhRIfMH^KH[SQ_ddn{|‘˜—¢¨ž¡§™¡’Ž’z{iefTXWEQNETQZTPaTPa/.*/.*0/+10,21-21-52-52-72.72.72,72,92,92,92*92*72.61-61-50,50,61-61-72.61-61-61-61-61-61-61-61-3.*3.*3.*3.*2-)2-)2-)1,(2-)2-)2-)2-)2-)2-)2-)2-)/,%/,%0-&1.'2/(2/(30)30)52+63,63,74-85.96/96/96-@:.A;-C=/E?1F@2HB4IB2IB2JC3JC1KB1JA0KC0LD1OD2PC2O?/U@/]@0iB1wD3„E4‘D4›B2¦B2¬A1³B4ºB4¾D7ÁE9ÅF=ÊC=ßEGçBHèCIêDHìCFïBDó@Cõ>Böó:?ï,‘>,=+=+>)=(“>*“>*’=)’=)“>)•>*•>*•?.”@5“?5—=2Ÿ?1«A1³D1¼D3½D3º@1´C5«G8šH:‚G9j@0S9*A3&=60:6595484373051.51.40-63.52-52-52-41,41,41,10+.0+,1+.0+.0+/0+/0+0/+2.+3.+2-*3+)3)(5))9--A55M87d>=vEA†KGŽMK™SS£`g¢l|šrŒ{ …­~…¹y„ºmt¨Z\ŒPIuNDiNEdMH_NI_PM^ZZfmnsƒ‡ˆ“˜’˜–™Ÿ“˜œ‘€|nijX]\JURIURYUQ`UQ`..,..,0/+0/+10,21-41,52-52-52-61+61+61+61+81)81)61-61-50,4/+4/+50,61-61-61-61-61-61-61-61-61-61-3.*3.*3.*2-)2-)2-)1,(1,(3.*3.*3.*3.*3.*3.*3.*3.*1.'1.'1.'2/(30)30)41*41*52+52+63,74-74-85.96/96-?8.@:.B<0D>2E?1F@2G?2HA1HA1HA1H?.H?.I@/JA0MA1MA1L@0QA1YB2bC1nC2{C2‡B2‘@/—<*Ÿ;+¦<,®>0³B4¸D7¼F:ÄD;×CCß@DâAFæCFéCEïBDôADø@Bø;?÷:>ô<>ï==æA?ÜA<Ð@8ÅA5¶>-±A-²?,°@,°@,¯?+¯>,­@,ª?+¦@*£@+Ÿ@*›A)˜@(–@)•@+‘?*?,?,>+>+>+<*<*>)>)>)>)>)“>*”?+•?.”A3“?4˜?1¡@0­B2·D2¾C3ÀB3¾D5¸G9«I<™J=€F:fA1P:,B6*?82<74;63:5294183062/51.63.52-32-32-21,21,21,01+.0+,1+,1+,1+.0+/0+0/+0/+3/,4/,5-+3+)4*)7-,=32G53[:5k@9{F>…JBOM—[]™gs’o‡‰xœ~«{‚¸s~¶fm£TV‰MEvLAkKAcOFaOJaLI\LKYZZdqux„‰……Œ…‰‘†Š‚…‰zwykfiXZ[KSSIYTZYS_YS_--+--+/.*0/+0/+10,41,41,41,41,50*50*50*50*70(70*50,4/+4/+3.*3.*4/+4/+50,50,50,50,50,50,50,50,50,3.*3.*2-)2-)2-)1,(1,(1,(4/+4/+4/+4/+4/+4/+4/+4/+2/(2/(30)30)41*41*52+52+52+52+63,63,74-85.85.96-=6,>8,@:.B<0C=/D>0E=0E=0E>.E>.F=.F=,G>-H?.K?/JA0KD2MD3UD2]D0gD1rC/|A/†?-‹:'‘8&š9(¢=+ª@0°E5¶H9¿F;ÒDBÚACÝCCáCBçCBìBBò@@ö>@ø;?÷:>ô<>í?>åA?ÙB;ËA7¿?2³>,¯@,¯?+®?+¯?+­>*­>+¬?+¨?*¥?)£@+ž?)š@(–@'”@(’@*?*?,>+>+>+Ž=*<*<*>)=(=(=(<*>)‘>,’?-“A3–@3›?0¤@1°B3»C5ÁC5ÁC5ÀF9¹I=¬L@—K>{G:`@3L:,?7*@93=85<74;63:5294173062/63.32-32-32-21,12,21,01+,1+,1+,1+,1+.0+.0+/0+0/+21-40-4/,4,*3+)5-+91/A2/R7.b<1pB5yE:‚IBˆRR‹`j‰i€‚r—|y¨w~µmw²_eŸQRŠLEyL@pL@fODdOFcID[FCVLLX[^cimnsyuw~vyutzlkoa_aSVXJSSI[WX[V\\U\,,*,,*--+..,0/+0/+10,10,30+30+30+30+4/)4/)4/)4/)4/+3.+3.+2-*2-*3.+3.+4/,4/,4/,4/,4/,4/,4/,4/,4/,2-*2-*2-*2-*1,)1,)0+(0+(4/,4/,4/,4/,4/,4/,4/,4/+30)30)30)41*41*41*52+52+41*52+52+63,74-85.85.85,<5+=6,>8,@:.A;/A;/C;.C;.C;.C<,D;,D;,E<-G>/J>0I@1JG6JG4PH5WF2`E2jD/tA.|?,‚;'ˆ:&‘:'™>+¡B0ªF6°J;ºJ>ÊFAÓCBØDBÜDAâC@è@?ï==ó;;ø:<÷;<ó=<ë?=àC>ÓC:Ä@3¹@/¯?+­@+®?,¬?+­>+¬?+«=,©>,¥>+¤?+ ?,œ@+˜@*•?(”?*‘?)>)>+>+>+Ž=*Ž=*<)<)Ž=*Ž=*<)<)Ž=,Ž=*>-?.”C2–@1@1¨A2´C5½C6ÂB7ÂB7¼C:´H>¥KBJ@tE;Y?2E9+:6*>93?74?74=52:5194074/74/43.32-32-23-12,03,12,/2+-2,,3,,3,,3,-2,/1,/1,01,12-32.40-3.+2-*2-*50-;0,M7,W:,c=0l@3rC9xKHZbh~~o–yw©tz¶js´\d£SU’MGƒKAvNAmNBfKAcGA]EBWFEUILUMPU]ca`g`ah``f\Y_SVZLUYKVXM\YT]WW_VW++),,*,,*--+/.*0/+0/+0/+2/*2/*2/*2/*3.(3.(3.(3.*3.+2-*1,)1,)1,)1,)2-*3.+2-*2-*2-*2-*2-*2-*2-*2-*2-*2-*2-*1,)1,)0+(0+(0+(3.+3.+3.+3.+3.+3.+3.+3.+30+30)41*41*41*41*41*41*41*41*52+63,63,74-85.85.;4,;4*=6,>8,?9-?9-@8-@8+B:-B:-C9-C:+D;,F=.I=/G@0IH6IH6MH5SF3[D2dC0lA.s?*{<*‚;'‰;'’=)šA/¡F3ªK9²K<ÃH@ÌE?ÐE@ÕE=ÝD?äA<ë=<ñ;:ö:;ô:;ð<;ç@:ÚC<ËC7»@0±>+¬?*ª?+ª?+ª?+©>*©>*¨=+§>+£>*¢?*ž?+›?*—?)”?*‘?)>)>+>+>+Ž=*Ž=*‹=)<)‹=)<)‹<+Š;*Š;*‹<+Œ=,>/>-’C2—A0 @0«A3¸B6¿C7ÃC:ÁB9¸A9¯H?¡ODŒNCoG=S@2@:.77+>93?74>63=52:5194074/74/43.23-23-14-03,03,03,-2+,3,,3,,3,,3,-2,-2,/1,/1,01,12-32.10,1-*1-*2.+8/*F5+M5)V9+`<.e?6jGCwYck‚tœ{{¯w|¼luºbi¯[\ŸRMLC|MAoK?eH>aF?^FB[EDV?AN;@FBGJDMHIPIJQIIQFJRENVIUXM^ZQ`YQ`YS*,+*,+,,*,,*--+..,0/+0/+/.*/.*1.)1.)1.)1.)2-)2-)1-*0,)0,)/+(/+(0,)0,)1-*/+(/+(/+(/+(/+(/+(/+(/+(1-*1-*0,)0,)/+(/+(/+(/+(1-*1-*1-*1-*1-*1-*1-*1-*30+30+30+30+30+30+30+30+41,41,41,52-63.74/74/85.92*:3+;4,=6,=6,>7->5,>6+A9.A9,B8,C9-D:.F<0J>2H@3FD5GF4KF3PE3VC2]B/e@.l=+u=,|;)‚9(‰:)“=,™B/¡F4ªF7¹G<ÁE;ÇG>ÏF<ØE>àC<é@=ï=;ò::ð:9ë<9ã@9ÖC;ÅC5´A.¨>(©@+§@-¨?,¨?,¨?,¥>+¥>-¤?-¢?,Ÿ>+œ?-™>+•>*“>*>)>)>+>-Œ=,Œ=,‹<+Š=+‹<+Š=+‹<+‰<,‰<,‰<,‰<,Š=-‹=0Œ?/’C2—A0¡A1¬B5¹C9ÀD:ÃB<¿C;¸G?¯QI£YPŽZOpRGVH;BB671>71<5/94.83-63,63,43.23-23-14-03,.3,.3,,3+,3,,3,,3,,3,,3,,3,-2,-2,.0+12-23.12-0/+/.*0/+4/+>1+C1'K3'S9,Y<4cGDs]iƒs‡€ªƒ„¼~ƒÇs{Äkq»ce¯VSšICK?oI=eF]EAZDCU>BN8?E:BD=HDDMHFPGGQFHRGLVKUXM^ZNaYLaYN)+**,+++),,*--+..,/.,0/+.-).-)0-(0-(0-(0-(1,(0-(0,)0,)/+(/+(/+(/+(0,)0,).*'.*'.*'.*'.*'.*'.*'.*'1-*0,)0,)0,)/+(/+(/+(.*'0,)0,)0,)0,)0,)0,)0,)0,)3/,30+30+2/*2/*2/*2/*2/*30+41,41,52-63.74/74/85092,:3+;4,<5-<5-=6,=4+=4+A8/A9.B8.C9-D:.F<0J>2I?3EB3FC4JC3NB2SB2Z@1`?0g<,p<.u:*|9)„8(Œ;*”>-šC2£C3±G:·E:¿F;ÈH=ÒH>ÝF?çD?íA=ë<9ê;8ç>9ÞA:ÏE:¿D4®A,¢>'¥@,¤A,¥@,¥@,¤?+¤?+¤?-¢?, ?,ž?-š?,—?+”?+‘?*>)Œ>*>-Œ=,Œ=,‹>,Š=+Š=+Š=+ˆ=*‰<,ˆ<,ˆ<,…<-†=.‡>/ˆ>1Š>0‘D2–C1¡A3­C6ºC;¿D=ÀC=ºE>·PI°\R¤f[fZu_R[UGGM?BJ=;8/>7/=6.:5/94.74-63,33+34.23-14-14-.3,.3,-4,,3+-4--4--4--4--4--4-.3-.3--/*/1,23.12-/0+./*/.*2.+7-+:,)B1)J6-Q=6]IHscn…{”ŠµŠŒÅ„‰ÍyËqwÃhl¶WWŸHDE=lE=bD=_B?\B@V@CT>DP=FKGQRKWSQ^US`VR`SR^RS_SY_Q]ZI`YG`YG+-,+-,+-,+-,+-,+-*,,*,,*/.*.-).-).-)/,'/,'/,'/,'.*',+),+)-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*,+),+)-,*-,*.-+.-+/.,/.,/.,/.,/.,/.,.-+.-+.-+.-)/+(0,)1-*2.+3/,3/,2.+2.+2.+2.+2.+3/,3/,51.62/74/70*81+92,;4,<5-<5-=4-=4+>5,>5,?5,@6,A7-C9/G:1F<2G?4G?2I?3M?2R>3W=0[9-a7)k:,r8*{9+ƒ9,Š;,‘>.–>0›>/¦B3¬B4³C5¾F8ÉG:ÓF<ÝD>åC>è@=éA>åC>ÙD=ÈD7¶C1§A+¡A+¡A+¡@- ?,Ÿ>+¡>+Ÿ>+Ÿ>-ž?-œ=+™<+–=+”=*=+Ž=*Ž=*Œ>*‹<+‰<*‰<*‰<*ˆ;+‡;+‡;+…<+ˆ<.†=.†=.…=/†>0ˆ@2‰A5ŠB4D4•D1£F7±I>¹F?ºC=ºE>¸ME´ZQ­g]¡qctf}qcik]T_QGRDLLBIE:B>3;8/85,74+63*33)34,34,14-03,-2,,1+,1+,1+-2,-2,-2,-2,-2,-2,-2,-2,02-02-02-02-12-12-12-21/4+.:/3A32B5/H;5ZNNwmxŠ…œ’‘»“–͐•×ƒ‰ÓtzÄgn´^c¥Z[”LJrFCb@=Z=?V?BUAITJU[Sabapmn}vu…{p€uiylguh^l]W`O]\Ha[Eb\F,.-,.-,.-,.-,.-,.---+--+.-+.-).-)-,(/,'/,'.+&.*',+),+),+),+),+),+),+),+),+),+),+),+),+),+),+),+),+),+)-,*-,*-,*.-+.-+.-+/.,.-+.-+.-+.-+.-+.-+.-+/+(0,)1-*2.+2.+2.+2.+2.+2.+1-*1-*2.+2.+40-51.62/7/,81+:3-;4.<5/<5-=4-=4->5.>5,?5,@6-A7.C9/F90G:1G=3H>4K>5L>3Q=4T<2Y8/]7,g8.m7+w7-€8,ˆ:-<.•=1™=0¡A3¥A2ªC4²D5½E7ÈF9ÒE<ÙD=ÞC>ßD?ÞG@ÓF=ÁF7±C2£C-B-žB-A,œ@+›?*>*>,ž?-œ?-™<+˜=+”=*“>*>+Œ>*Œ>*Š=)‰<*‰<*‰<*‡<)‡;+…<+„;*„;,…<-„<.„<.ƒ=1„>2„@3†B7ˆC4‘H9•F5¡H:¯J@¸IB·HA¶KE²TL¯eZ¨sež}lo}{llteZfXMYKKM@JH>2=:177-44*11'23+12*03,/2+.0+,1+.0+,1+.0+,1+.0+,1+.0+,1+.0+.0+/1,/1,/1,/1,01,01,01,10.3,48.6<23>42G@:[VSvszŠˆ“¶“—ǐ–Ò„ŒÍx‚Àpz·jsªgo\_~XZqQViQXhT^hYfleuuq~s‡~}‘…–‡|Ž€u‡wpqdueZfRZYD_Y?a[C*./*./*./*./,.-,.-,.-,.+,,*,,*-,(-,(,+',+',+'+*&+*(+*(+*(+*(+*(+*(+*(+*(,+),+),+),+),+),+),+),+),+),+),+)-,*-,*-,*-,*.-+.-+.-+.-+.-+.-+.-+.-+.-+/+(0,)1-*1-*2.+2.+1-*1-*0,)0,)0,)0,)1-*3/,40-51.80-91.:2/;30<41<5/=4/=4-=4-=4->3-?5,@6-B8/E80F91H;3H;3I<4M<4N;4R94U82[6.b70h6-r6,{7,…9,;/’¼F8­C3ŸC.™A-œA.›@-›@-š?,š=+š=,›>-š?-˜<-•<,“=,=+Ž=,Œ=,Š=+‰>+ˆ=*ˆ=*‡<)‡<)‡;+„;*„;,ƒ;,ƒ;-;/‚<0=2ƒ?4„B6…B9‡C6“K=–I9 H<«JA²KD±KF±TM­_U¬rd¦oŒxŽzŠwr€ocqbWcUKRBKM?GI;CE7??39;.35*/1&01)/0(/0*./)./*-/*./*.0+/0+.0+/0+.0+/0+.0+/0+/0+01,01,01,01,01,01,01,1/04,76,78/2;62HE>]^Vxy{‰˜Ž”®—¼•Ä„ŽÁ}‰¹{Šµ|Œ°|‹¨|‰šw„q~†n}€l~~nƒ~x„‚šŠ¢’¨•¦’‡œ‰€•‚zzj{i\hRWW?\X;_[@*./*./*./*./,.-,.-,.-,.-,,*,,*-,(,+',+',+'+*&+*&+*(+*(+*(+*(*)'*)'*)'*)',+),+),+),+),+),+),+),+),+),+),+),+),+),+),+),+)-,*-,*-,*.-+.-+.-+.-+.-+/+*/+(0,)1-*1-*0,)0,)/+(/+(/+(/+(/+(0,)1-*3/,3/,80.91.:2/;30<41<41<3.<3.=4/<3,=2,>3-?4.@6-C6.D7/F93F93G:4I:3L:6M83P72T50]6/c7.l5.v8-9/‰;/=1“=0˜@4™@2˜?1@1¤@1­A4·C6¾D7ÇG<ÊG=ÉI>ÂH=¶F8¨B3œA/—@-˜A-—@,–?+–>*–=+–=+™>,—>,•<,”=,=+Ž=*Œ=,Š=+ˆ=*ˆ=*‡<)‡<)†;(„;(„;*‚;)‚:+€;,€:.;.€<1€>2‚?6‚B8„D:…E;‘K?•I<œH>¥KC«LF¬RJ«]S©k^§n Žxšš‚Žš‚„–€x‹wlzian]R[HNUCJN?DH9?C5:>057,13(/0(./'-.(,-',-(.-)/.*0/+/.*./*/.*./*/.*./*/.*./*/0+/0+/0+/0+/0+/0+/0+0./5-85+63-/961HJ=aeWy€xˆ‘Œ”¡Œ–¯Š•³ƒ°€‘­…™±Œ£³©°“¨©£¡‹ ›‡ž–€š}˜‰€‹‡¤Ž“±™–²™“­”‹£‹„œ„|’{i|fXfOSV;XW9]Y<+/0+/0+/0+/0+/0+/0-/.-/.--+,,*,,*,,*,+',+',+',+'++)*********))))))((((((************************************************++++++,,,,,,---------/.,/+*/+*0,+0,+0,+/+*/+*.*)/+*/+*/+*/+*0,+1-,2.-3/,91/91/:20;31;30;30<20;2-<3.<3.=2.=2,=2,?4.B5/C60B73B73C84D93G96G83J71M60V80]7.g6/q8-z:0„<0‹=0>2–?5–?5•?2—?1œ@1¢B2«D5²D5¹E8¼F:¾H<¹G<¯E8£B2™@0•?.–A-•@,”?+”=*”=,”=,•<,•>-“;-’<-<,Ž=,‹<-‰<,‡;+…<+†;(†;(„;*ƒ:)ƒ:+‚:+9+:+;.~<0<3?5A8ƒD;…F=†G>K@‘I=˜H? KD§PI¨XQ§g[¤vf¡u™™}”£†‹¤‡„œ‚|’}s‚ojudZfRU^ILUBDM:>E59@07;-47,01)/0(.-(,+&,+'/+(0,+1-,0,).-)0,).-)0,).-)0,).-)/.*/.*/.*/.*/.*/.*/.*1-.7-85)31,)66*GL8_iQwƒm†’„‹—“š ‹™¤†—¡‡œ¡©¨™¹® À±˜·¨—¶¦˜·¥˜¸£²š‰«’‰«Ž±“’³”’³”¬Žˆ¢…ƒ›{’xg{bTbIPT9TU6XW9+/0+/0+/0+/0+/0+/0-/.-/...,--+--+--+-,(-,(-,(-,(,,,,,,+++******)))((((((*********************************))))))))))))(((******+++,,,,,,---.......*)/+*/+*/+*/+*.*)-)(-)(/+*/+*/+*/+*0,+1-,3/.3/.:20:20;31;31;30;30;1/;1/;2-;2-<1-<1-<1+=2,@3-?4.?61>71?82@93B94B94D71G6/O6/V5,^6,i7,t:.~<.…=/‹=0“?5’>4’>3“@2”A1™B1ŸD2¤C2ªC4¯C6³E8¯E8©C7 @2˜?1•?0“@.’@+“>*’=)“<+“<+“<+“=,‘;,<,Ž=,‹<+‰<,‡;+…<+„;*…:'…:'ƒ:)ƒ:)9*9*~9*}9,~<0}=1~>4A6‚C:ƒG=…IA‰JCJAG=—HCŸOH¦UQ¦`X¦qc¢ƒo›•{”¡ƒŽ©ˆ…¦‡Ÿƒ~–~x‡tp|hcoY[iRP]IGS?@K:3-<5/;60;83<94<94=82?82@5/G4-N3*W5+b6+m8*x:+<,…<-=2<2Ž>3@3A2‘B1•B0™@.ž>.¥?1©A4©C7£A4œ>2–>2”>/’?-?*=+<*‘;*‘;*‘;,’<-‘;,<,;-Š;,ˆ;+‡;+„;*„;*ƒ:'ƒ:'‚9(‚9(9*€8)~9*}9,=1~>2?5€A8ƒD=…IA‡JE‰MEŠJAŽH@•JE¡TN§\W©i`§|l£Žy—œ~§…‡­ˆ€©‡~¡ƒ~˜}}Švw€miw`brXXgPO]FHT@CL;>D6<@257,34,0/*/,'.)&1)'2)*3*+2*(0+(2*(0+(0+(0+(0+(/+(0,)0,)0,)0,)0,)0,)0,)1++6)25)-1-"46 ?I&Ud9o€T€’j‹œ|Ž †¡‹Š¡‡‹©‡”·žÉ”¢Ñ›¦Óª¥Ñ­¤Ð¬žË¤½”‚¯„¬…°ƒ…®‚Š±…ˆ«ƒŸzy”sp‰i_sWM]BIO3JM0IL/,01,0/,0/,0/,0/.0/.0-.0-/1.00./0+/0+0/+/.*/.*/.*/.,/.,.-+-,*,+)+)*+)*)))))))))))))))))))))))+)))+),+)**(+*())'(((((&''''))))))***++),,*--+..,..,,+),+)-,*/+*.*)-)(,('+'&0,)0,)0,)1,)2-*4/,50-61.:20;31;30;30;30;30;1/:0.;1/:0.;0,;0,;0,;0,>0-=2,=4-<5-:70991891891991>7/@1*I0)R1(\4*f6*o:,t<-z<-†>2‰=0‹?2Œ@2ŽA1@1‘@/“=,–=-œ?0ŸB3 C4A4™@2•?0’?/“=,“=,=-Ž=,<+Œ=,Œ=,Œ=,Œ=.‹<-Š=-‰<,‡;+†:*„;*ƒ:):(:*:*~;*}:)|:*|:,y:+~>2~>2€@6B9‚F<…JB‡NEŠOGŠICHC’OI˜\Tœh]œufˆu™€“¢…Œªˆˆ­‹©‡~¡ƒ}š~yxs‡ng~baz\ZqUTfLM\EFR>@I8=A379.55-4/+0+(0(&1'(3)*3*+/)).*'.*).*)/))/))/))/))0**0**0**0**/+*/+*/+*0*,4)/4*+2.#35DM2EI0CG.-/*.1*.1*.1*/2+01+01+01+23-32-43.32-52-41,30+2/*50,4/,4/,3.+1-*0,+0,+-,*.,-.,---/--/+,.*+-()-))+.)/.)-.)/.)-.)-,*-.*+,*+,+)-,*,,*,-(-.)-.)-.)-.),,*,,,---.,-/.,/.,2.+2.+1,(2-)3.(6/)70(81):1*:1*;4,<5-<5-<5-=4/<3.<3.;2-;2-;2-;0,;0,;0.;0.<1/>0-A0)?1(;4*57*28,19.36-83-?-)E)&K($R)%Y.'`5,d<0k@0x@/@.…@0ŠA2@1‘>0‘;.‘9+’:,“=.“@0”C2“B/’A.>+<,•;0–:/’-ƒ?,‚?,>+…@0‡?0‡>/ˆ<.‡;-†:,„;,‚:+z8*~@1w<,q8'w>-w>-u<+{@0{<-?3‡E9‰I?‡K@†MBƒOB‡NELI”SO”bY‘pa‰}g†‰n‡–y‡Ÿ‹¤†‹¦‡§ŠŠ§‰…£‡|Ÿt™zn–tgh`„^Y{XYtSZnRVfLNWDIK=A?3=829/-4*)3')3'+2&*0'****',((*))))*()-)*.(*1(+2).2).2(02(00)0/*0/*0/*./)-1++0-(/0";>)S\?nyW|‹d‹›t‰žs‹¢t‹§v‰§s‡ªrŽ´{—¾…œÁš¿Œ•¹‰Ž´ƒˆ®}ƒ«y‚©zƒª}‚§{‚¥}Ÿzv“tp‰lf}aYkUMZFHQC/.1(.1(.1(/2)01)12*12*12*44,44,63,63,63,52+41*30)7/,6.+6.+5-*2-*2-*0,+0,+.,-.,---/--/+,0*+/)*.)(--(..'..'..(,-(,-)*-)*-)(-,*-,*,-(-.)-.(-.(./)./*,.+,.----..,/.,/.*1-*1.)2-'3.(6/'70(90':1(<2);2)=4+<5+=6,=6,>5.=4-<3,;2+;2-;2-;0,;0,;0.;0.<1/>0-B/(C1'?2)<3*95,95,83-:1,?-)C+'G)'N+'T/)Y4,_:1d=.o@.w@,@/ˆ@2Ž?2‘=2’;1‘:0Œ:,Š;,Š>.‰@/ŠA.‹B/ŽA/‘?1“;/”:1<1Š>0„?/@.@.€?-ƒ@/„?/†=.…<-„;,ƒ;,‚:+<,w7+x<1r:+n9)s>,r=+q9(t;*|=.‚@2ˆF:‰I=‡K@…M@ƒOB‡NEIG”SQ’f]Œwf‚†m~“tž~‚¥„ˆ§‡Š§‰¨‹Ž§Šˆ¥‡ ƒt›|m™vd“i^‹`X‚ZX|VYwUXoRRaJMVCDH:@@6:724/,1++2)*/)+-)****)+*))))))+),-(,/)-0*.2(00)00)0/*1/*1-*1,+1,+02-12.-/+(,,$8:,SXBnwZ}‹g…•nƒ™k†žl†¢o…£o‚¥m‡¬vµ˜¹„–·‚‘³€Š¯{…ªw‚¨u‚¨y‚§{‚¥{¤|~{w’soˆkh|cYkUMZHDM<=D4:>//2)/2)03*03*12*23+23+23+55-55-74-85.74-63,63,52+81+70*50,4/+3.*2-)1-*0,)/.,/.,......--/,,.)*,**,.)-/)-/)-/)-.)-.*+.*+.*).-+.-).-)/.*./)./)/0*/0+//-///..,..,/.,/.*1-*1.)4/)4/)70(81);2)<3*>4*=5*?6->7-?6-?6-?6->5,=4-<3,;2-;2-;0,:/+:/-;0.<1/>0-@1*D1*G/+J.+K+,J*-G*,C++A.*=.'@/(C/&M/'W0)b3-e5+i9+n:,v<.=1‡=4‹;4:2Š:1‰<2‡=2„?0ƒ@0†A2‡B3‹A4ŽB4>1>/‹>.‡>-†?-ƒ?,„=+…<+ˆ<,‡;+‡;+†:*‚;)<){=(z=*|>/z5,@6,@6,A8/@9/A8/A8/@7.?6->5.=4-<3.;2-;0,;0,;0.;0.<1/=2.A4.E2,L.,R+.U(/U&.P'-H*,A/+;2):3)<2&G1&R0'^/)b0)g8.j:.t;0|=4ƒ<6‰;7‰:5ˆ;5ˆ?8…A8„B6‚B6…C7†B7‡A7‰A5ˆ@1‡@.‡@.†?-…>,†=,‡;+ˆ;+ˆ9*ˆ9*†9)ƒ:)~;({=(v>'w=)?1z6+x8,y;.u:,v<.z@2z@2~C5ƒE:†H=‡I>†J?†L@‡NC‰PEŒSJ[PŽiYŠt_ƒfŠl~–tŸz‚¦‚ƒ©„‡«‡ˆª‡‰¦‡†¡‚š||—xp–oh“hdŽfdee‹fc‡c]~_Zw[OgOH^I?P>6D30;-,4)).'*+%1'&3%%1%'0&'/&'.((.*),,,)+*'+*'+,&,,&,,$-,&+.'+,.*+1,)/*&.+"79+PUAhrWtƒb{gyfz•hœl|žlxiy k~¥p€§r~¥n}¤o{£o|¤p}¥s}¤u}¤w{ u|Ÿwy˜vrnm†he|`WkPM[DBF7<=/78*25,25,36-36-56.56.56.56.77/880;81;81;81;81:70:70<5/;4.94083/72.61-51.51.51.32.32032021/10.0.//.,1+-3*+1+-1++1++1++0,+0,)2.+2.+10+10+10+21,12*12,22022022012-21-21,41,50*;4.;4,=4->5,@6-A7-B8.C9/C;0C;0C;0C;0B90@7.?6->5,=4-<3,<3.;2-;2-<3.<3.=4/@51E3/L0/S,1X)1W(2R)/I,.A2-:6+66*97(B4'L1&V0'[.(d90h<3q<4z=8‚<:…;:†;8„:7:6€=7€@7B9ƒC:‚B9…A8„@5B0C.ƒB.ƒ@-…>,‡;+ˆ;+ˆ9*‰7)‡8)…9);({=(x>(t@(v=)€8*{.$€8,ƒ?2v4(s5(|@5}C7}E8F;‚I>ƒJ?‚L@„NB‡QE…WH|aLyiP~pV€v[€|aƒ†i…“r‡y‚¢}§€€ª‚€­„€ª„|¤yŸzz™wz’pykwiuitŒjrŠjm„gkd_qWYhQO[GFM;?A3:8+40%4+$5'&5'&2&&0(&.)&+*&+,'*,)',(',('+*)+*)+****+),-)**%"0+'50*86*@C2RZCcpTl}[tˆcqŠ`sbv—hvšjs™fs›gwŸjy¡lu jtŸjv¡ly£q{¥uz¤t{¢uxryœtw–tpŽll…gd{^UlOL[DBD6=;/86*47.47.47.58/67/67/780780991991<92=:3=:3=:3=:3<92=82>71<73;62:5194084173084184165165154243/21/40-3--5-+3--3.+3--3.+2.+2.+3/,30+21,21,21,32-23+23-34/34/34/45/54/85.94.95,=6.=6,?6-@8-C9/D:0E;1E;1F<2E=2E=2D<1C:1B90@7.?6-?6/>5.=4/=4/=4/=4/>50?61?61C52I43O13S.5S/3O/2J20C60<8-;9,<9*A8)H6(P2'V1([3)b3+k4/t72}7576‚6674~73}:4|;5}>5?6‚?7…>8„@5€C1~D0€A/@.ƒ>.…<-†:,‡9,…9+ƒ:+€;+~=+z=*x>*v?*{<*„4)‰2)ŸLD¦XN‰@7{9-‚F;J}O@€RC…UG^JrkNosP{vX…w\y`–€hžŠr ”z•–wŽœy‹£ˆ¨„©€¥|z y|švo„n‚mŽm~oznv‹lqˆki}aeuZ\hPS[DLM;EB1?7*:0&:-'9+(5*&2+%.+$+,&*-&(-&).(+-(-,(/+(2)*3)*6'*6((1(#:3)D>2HF7OR=[cKdqShyWmƒ\i„YjŠ[m‘ap”dn”an–bošetŸjrhpœgržkw£ry¤vy£uxŸsušqv˜st“qnŒjj…fb{]UlOL\BAC5=9.:3)58/58/58/690780891891891::2;;3>;4>;4?<5?<5?<5>;4?:4?:4>93>93=82<71<73;62:72;83;83:72:6385073063.50-7/,7/-7/,50-50,50,50,41,41,52-52+33+44,44,43.43/540651761:72;81=82=90?80?8.A8/B:/D:0F<0H<0G=1G=3G=3G=3G=3E;1D:0A8/@7.@70@70?6/?6/>71>71?82?82?82@93B94D95G96H96H94G:2C90C9/C9-E9+F9)G:)J9)Q7(Z0$d/'m2,w60‚85†;8Š<:ˆ=8‹B<†A:>6~;2;2;3‡<6ˆ?6ƒA3€A2€A2?1=0;/€.{=.{=.|=.ƒ9,1)¡;6ÌkeÙwªZQŒC:ˆLA~M>tJ:qN;oP4+=2,:1*51(2/&./'-0',/&/0*2/*6,*9+*=)+A&+D%+A'(C5,KD4VQ>[YD^bIenQhxTg|Ui‚Xe‚Tf†Wj\n“`m”_n–aošesžio›hm™fpœkv rx¡uxžutšss—qt–ss’pm‹ii„ca|[TmML\AGH8D=3@7.6906906906908918919:29:2::2;;3>;4?<5@=6@=6@=6?<5A<6A<6@;5?:4>93>93=84=84<94<92<94<92<73:70:5194.91.92,91.92,91.72,72.72.61-52-52+52+44,44,44,55-54/54/761880<92=:1?;2@<1@9/@:.B:/C;.E;/F=.I=/J>0H>2H>4H>4G=3F<2D:0A8/@7.B92A81@70?80?82?82@93A:4=82>93A:4C<4E<5G=4J;4L;3K7.M7,N6*O8*O8(O8(O:'T7'f6(q5*}:1‰@9“D?™IBJDœLEŸPI–LAŒD8„<0ƒ6,…7+Œ:/=4ˆ>5†=4†=6ƒ=3‚<4€<1}=3y>0w?2u@0u@2y?1}=3;1‡834/•(#°=8ì|zý–‘Ãia•H>ˆJ=wH8mL9gQ:eUKB9F=48;27:17:17:19:2:;3;<4<=5<<4<<4?<5@=6A>7B?8B?8C@9E@:E@:D?9D?9C>8C>8B=7B=7@;5@<3@;5?;2A:4?;2A:4A:2@93@70@72?80>71>7/=60;60<71;60:7096/85.74-74-63,66.66.85.96/;60=90@91A:0B90C;0F<2H>2K?3L@2L@2L@2MA5L@4K?3J>2G=3F<2E;1D:0B90A8/?8.?8.>7/=90=90>:1;4,MD=K@:J92S?8R70N/*^;5Z3,^6.^3*[/$\0#e7*k=0q=0ˆJ=ŒG8•I<žLAžG>˜>5š=5C:¤MC¤QC¨VHªXJ¥OB˜@2—;.›?4’95:7Œ65…40…73ƒ?6|@6r>0rB4n@0o>0v:/82‰41-0˜')ÇGFçc_ÂECËXUàzu«WM…E9„VFmR=g[AhcFhdGhaDm_DzdL‹kRbJ²n[ÑnhÚY]à;Kæ,Cð+Gò0Kö@WêIYä[eãorâ|zځ{؃~։Á~u¼‚v¹„v¶‡w¯ˆw«Šw§‹v¤‹w—l˜k•xh“oaŒbVƒTJzH?w@=t9;g/2d02_11N&$G&!J1,K70G4.D3,D1+E2,F.,D*)J.-O6/XI4`W:e`BeeCioKs}Xsƒ\m‚Wj„WkˆXnŽ]q“`t–cs˜bušdv›hq–jr™ms˜oq–mr”qw™vz™zx—xw”vqŽpj‡ii„eg‚a`{ZSnKM`DNO?QK?OI=7:17:17:17:19:2;<4<=5=>6>>6>>6@=6A>7A>7B?8B?8C@9E@:E@:E@:D?9D?9C>8C>8C?6C?6B>5D=5D=5C<4B;1B;3B;1B92A8/A81A81@91@91@91@91<71;60:7096/85.85.74-74-66.66.96/96-;7.=9.A:0B<0C;0C;.F<0H?0K?1L@0L@0L@0L@2L@4K?3J>2I<3F<2E;1D:0B90B90@9/?8.=90>:1>:1A:2C:1I81J.*U-+i65t88{;;„DBD?ƒH@„J?„H=JA˜OFŸPKŸOF‘C6‘B3˜B3D6Ÿ?3™7,œ7+ž1n=.yH9„L?„@7‚-*‘*-²:CÒLUÚLKÞOKÈ>;À@=Ï`Y³YP„@3‚UBx`Hc\?]^?hiIrmOugJ}eK“cMºdWÕ_[äUYè@Mò,Cü&Bÿ%Gÿ&Hÿ-Kø2Kð=RîIYèP\ãQ[âR\ßWaÛbiÕflÓimÑmoÍqrÊtsÈwtÆxtÇ|yÈzxÆvwÆqtÅjoÅflÄ`jÃ_iÄ_m³S_¥KU™HOEI„FIk87FT1-K0)H1)I7-J91K:2M?6SF6[O5cZ9fb?ggCnrMx‚]z‰br‡^o‰\n‰\oŒ^qŽ^s“bu•cu•cu•fr’iv–qz˜vy–w~˜{ƒ‚„ž…ƒ›ƒ™y‘yq‰ok„gg‚c_zYSnKNaCPS@TQBRNB6906907:18;2:;3<=5>?7?@8@@8@@8B?8B?8C@9C@9C@9C@9EB;DA:DA:DA:EA8D@7D@7D@7HA9HA7H?6G>5F=4E=2D;2D<1C:1C;0C:1C:1C:1C:1B;1B;1<8/<8/<8/;7.96/85.85.74-96-96-96-:7.<8/=9.A:0B<0C;0D/J>.L?/M@/M@/M@0M?2M?2L>3J>2I=1G;/E;1D:0C;0C;0A:0?;0?;0?;0?<3B;1UD–H>”L>šNAªQI½TPÊORÄLK£A4›B0žA0£?0¥;-¢6)¢8*¤=.«F4 =*˜7$œ9$¤=*«@.²C2¶D9¥11®9?¹DJ¼KO¸NP­KJ–A<€7.y9-u7*w3(„1+œ45¸?7@A9AA9AA9C@9C@9DA:DA:DA:DA:EB;EB;EB;EB;FB9FB9FB9FB7JC9IB8I@7H@5G?4E=2D<1D:.A;/B<.D1K=2J<1H<0G;/D:0D:0D<1B<0@<1@<1@<1@>2@=4F<3Q9/Z+%‡;=½U^ÙUcæUfâT`ÊINŸ30–:/?.—A0­F=ÄJEÔAGË?@±B7¥F4¨B3«A3®>0¯?1±A3³E6±H5¨A.£='¤;&¨;'ª9'«6%­3(¶97º9=¼7<»6;¾=AÄIKÄTR¾XS™?6Š3)†,#61ÂGIÜOWàBPÙ3=Ý98Í.(Ñ82Ç82ÅD>Ç\R¦WHXDvV=veG{pPpQ‚gJŽdK©o[ÒthìSVûCOö]ô?^öCcõAdó?dó?fø?hûBlÿEpÿHqÿOuÿQrþUvòSqæSmãbvÖftµXb|15g0-W2*N8+E>,=@+8D.>F.PK.]T5f_BnjMy|_‡q„‘u|ŠpyŒpzŽr{syŽox‹m{Œl’r‡–y•£Š›©’¢¯¥²¡ªµ§®¸­®¸¯ª´«Ÿ«Ÿ” ’’€q„pe|b\uWRmLPeFPZBUXCWZE47.58/58/7:19:2<=5>?7?@8AA9AA9C@9DA:DA:DA:DA:EB;FC2G=1F<0E<-D:.D:.D:.D:.C;.D<1D<1C=1@9/@9/=90<8/<8/;7.:5/:5/96-97+;7,;7,>7-@:.C;0D/J>.K@.M@/M@/M@-M@/N>/N>1K=0J2A?3I<3\5.u40¬LPÚ^håM\ã@QÖ6B¶%(¨1)›7'’:&–;&ª@2ÁE;Ô>?Ë;:°>3§C3ª@2¬>1±?4¸C9»G:¹I;ª?-¨?,¦=*¥:(©8&°;*·<-º<0ÊG?ÎDAÏ==Ï68Ô8;ÝADàLLÝROÃD=ÆKCÌSJÓTMÙKIÛ?Bà5=à16Ú3-Ù8.Ï2)Î92¾71³A7´\N•TBxN6€bF…jM„aE[C­fRÊqcämgèEJï:Cè9@æ=BæCHæEJçFKêGLòKSñALò9Gö5Fø1Fý/Fÿ2Jÿ8Rÿ9Uþ9Uþ9Uý:Xý<[ý>_ý?aýAdÿCiþDküClüCmüCmüCoüCoýBmÿGpÿAfÿGmÿMpñJhèNhå\pØbr»Zc‹?A^'$O*!TA2TO;IL7?C,QK3cXBskVzf‹x—œˆ“œ‹†“‚~ˆ–…›Š‹˜‡†‘‰’–¢©—±µ¦¸¼­½Àµ¿Â¹ÂýÄÅÀÁÃÀ¼¾»¯´®¡¨ ‹—‹x†uh{e\sWSlLPhHN[AUZCW\E47.47.47.58/891:;3;<4<=5??7@@8B?8C@9DA:EB;FC/G>/F=.F=.F<0E;/D:1=90<8/<8/;60;7.:7.:8,;7,<8-?9-A;/C;.D=-G>/H?.K@.LA/M@/M@/M@-M@/N>/N>1K=0J2@@4L;1k92•FBÃY]ÚW_ÝCOÜ8CÒ38¼+(¬0$ 7"•9 •9 ¢<&´?.Ã:0¾8/§7+¡;-¤8,§7+¯:1¶A7ºE;·F8¬>/ª?/¦;+£5$©5&µ=/ÃE9ÊH;¼8+Î@6ßD?ëAAñ=@ñ8=ê37Ü./Û75áFAçRKåNGÜ=9Ø0/â/2ê65Ø0'Ý;.Ê,!Ï8/½3)¯6-Çg[¶m\VA‡[B‚V=‰S;©\JÍk^ÞgaãUTïFKî=Câ<>Ø>>ÒA>ÑFAÝOKêVVíNRíDKð:Gõ4E÷2Dø/Bû2Eþ7Lþ8Qý8Tû9Tü:Uÿ:[ÿ=`ÿ@dÿChþ;eýjü>lú?l÷=lócÿLnþLlõNjïUoâYmçqÁ`i•IKq:5[5*O8*OB1UM:\P@qeU…|m“œœ¤§žŸ¦ž“•“ž˜œ§¡¤¯©¤­¨¡¦¢¥§¢´µ°ÂÁ¼ËÈ¿ÐÍÄÔÑÊÓÐËÔÎÎÔÎÐÐËÏÈÆɽ½½¯±®—ž–‹}l}j^uYVoQTlLRaDU_DV`E47.47.47.47.67/7809:2:;3==5>>6A>7B?8DA:EB;FC/E=0D.N>/M=0L:.?;/?=1@>2??3N:1p1,¦KJ¿RUº=A¼/5Á/2¿0,¸2'©1 £9!œ=!–;™;Ÿ="¥;#£6"6'Ÿ7,¢6,¤4)«81¶A8·B9±A5°B5­A4§;.¥7(®:-»B7ÃD;ÃA4Â=*Ì>*Ù5)à)#ì""ù$(ÿ*/ÿ.1ì)'æ-(à2)ß4*à4*ã2*ç0*æ1*Ú3#Õ5%Ð2&Î6+Ä7.»?5Æ`TÐ~p¦eSVBˆN:¡XGÇeZÞc^åSTçDIôGKëABÝ?<Ñ@;È?7Ä?6ÑF?âLKîIMó?Hø8Gü6Gû5Fø3Dö6Eú;Kú9Nù7Qû6Rû6Rþ7Xÿ9]ÿ;aÿ=eÿ>jÿ?mÿAoÿBqÿBuþBtüBtùBpÿElúAaýFeÿJiýLiÿVqÿ^yò]sñj{åo}Ònv­]^ƒD?f5.gA6qUIwe[Š}u •«¤ž¯®ª´¶µ±µ¶§¯±°¸»µ¼Â½ÂÈ¿ÂÇÃÂÈÈÆËÓÎÔÜÖØáÙÖæÝØçÝÜåÛÜä×ÞãØàÞÔÜÖÏÖÉÄʹ¹¹¡¦ ˆ’‡tƒpey`\sWYqQYiL[hJ[hJ47036/36/36/56067/780891;;3<<4>>6??7C@9CC9GD=EE=GD=GD;HE0L:/=;/;;/:<.<=/=>0A?0S9,…<5Â\XÇZW­73ª-)°1*­/#¬3"ª:$«A'ªG*¤E'¡B$¢@#¡>!ž8!Ÿ9*£;0¤:-¦7,¬<1µE:µE9¯A4¨-Î6)Æ8,À@5±A5Ïm`¾hY¥RB¦N@ÊdXåhbæRRé@EóBJê=Aß;:Ô<9Ë@9À=3¶8,¹6,Ã81âHHè?Dï:Cö;Fù;G÷9Eö;Fú>LþBSÿ?Tühÿ>lÿ>lÿ?ný>qú@rø@r÷AqöBiþLlÿTsôJgêA^ûTpÿhƒÿeö\vî^uægxÛq}Åpu§geŒ]W{ZQ–w§˜‘¼±«Ã»¸ÃÁÂÆÇËÄÇÎÀÃÌÊÊÖÌÊØÑËÙÕÏÝÝÕâãÛæèáéìãèîäãñçåòèçîäåíàçìßæèÝåâØàÐÉÐÀ¾Á©«¨–Žy…wkzgbv]`rXbpVboS`mQ01,12-34/5616727828938939:2:;3<>3>@5AA7BD7DD:DF;HH>GG=GH:GH8HI7KJ6LK6NL7NK8JG8GE9IFAMIJNIOGDMD?CNE3B:/D=3B;3@93?82>93=84;62:51B94B94@93>93=:5>:7=<8=<7@@8B?6D@5H@3JA0L?,N?*L@*G@-E?/I;0J70K61K63J88D:8@?:4:01<.9D39B/58#?=(bC/¼j\¶J>¥7*¤6)¦8)£5$¤6%¨=)¡8"¤;%¨?)¬?(¬>'¬9$«6"ª7$¢7'Ÿ8) 9*£<-©?/¬B2¬B2ª@0¨=+«=,­<*³>-½C4ÄF8À>1·1%Æ8*Ë7)Ð8*Õ9,Û7-á6.è3,í0,ñ.,ó-*ò/+ï2,ê5*ã7)Ü9(Ú;(Û:&Ó4Ï2Í7&Æ7'»6'ÀB4ÎTGÇNCÎSKß[Ví^ZîPQë>Bñ8>ö?Dé@CÞCAÓB?Æ?9º;2±;/¯;,±;-ÉK?ÔKCÛFBà=>é<@÷?Gü>Hø:DýCNûCOüCQÿDUý@Vû;Tÿ7F=6F?7G@8E>6B;3C<6?:4?82<71=82>95<73;60<3.=4/=60<73<94<;7=<8>=9@?:B?8D@5H@3L@0L?,O>*L@*A?*@?+D64>=97<59?3?A3C<,I9)\B3L;­QBª;*Ÿ1 Ÿ6#¡:'8$9"£?(Ÿ;$¦=(­@+²?,´<+´9)¶7&³8(¨9(£9)£9)£<+¨?,ªA.ªA.ª?+¬?+ª9'±<*¿F5ÅG8Á?1»7*¿5(Ë7+Î6)Í9+Ï;-Ò<.×;.Þ7.æ3,í0,ñ.*ô.+ð1)è3(ß8(Õ:&Ó;$Ü<&Ø6!Ô7$Ó<)Ë:)À4%Â:,ÌF:ÐE>ØICçOLñQQòHIï<@ô:?÷BGåBCÚEAÐB>Ã>7·;1®:-©;*ª<+µD4ÅK>ÔNCÚG@â@>î>Aú?Fý@GøCJöCIúENüFRüCSù>Sû=VÿB^ÿFhÿCiú@gö@iøCnûGtüKyÿKzÿKzþItóKoñRrô[w÷^zúWvûMnûEkùEjíEhÙJfÆ_p°nrjKFr°–‰Ì²¥ãÓÆìãÚéèäèéëéæïêâñõâøûáúÿãûÿçýÿíýÿòüÿ÷üýùøýùöüùôû÷ôøôñöððòììïéëíçéäÞàÚÖÕÈÇŲ³® ™Ž”Šˆ…ˆƒ–…‰~†}--+..,/0+12-23.4505606718919:2:<1<>3>@3@B5BD7BD7GG;IG;JH;JI7KJ6MK6NL7NK8KI:NKBTSQ_^dihxll„klŠiiƒ^ZiYQ\OHPHAIE>EE?CC=?@::A;;>:7<73;60=82>:1>:1=9.84+95,;7.<90=:1>;2>;2><0C?4E?3G?2K?/M@0N>.O>,L?,:<$9>'=<*A;-A8/?6/<41940<94@;5G:4L3.W+(k/.†<= GC£;0 2!2 ¢9&¢<&9"œ8!¡=&¤;%¨>(¯@,µ@.¹>,»<+¾:+»<-±>,«<+©:)¨:)ª;*¬=,¬=*¬=*±>,­8&¸?.ÉK<ÊH8»6'º2$È:.Î6)Ò6)Ò9+Ó:,Ö:-Û9,â6,è3,ð0-ô.+ò/+í1(å3'Û6#Ó8"Ð8!Û9$Ú5!Ú9'Ú?-Ò<-È6)Å9,ËA6Æ;4Ì?8ØD@äJHéJGéCCì@@ëCBÜC>ÔD<ÌA:Â=4µ9-­7)©:)ª;*«7(ÀD8ÔNEÛJEà@@è>AöAHÿGOôAGòAG÷CLýGSþEUù@Rú>VþA]ÿEeÿDgþDküFoþItÿKxþM{ÿJzÿFwÿGvÿJsúOsÿZzÿa€ýVtïEbùJkýTsÚ@ZÊI]Ø{…·{{_B:|n¯‚Õ³§óÛÏúìã÷òîøöù÷ôýóëúùêýÿêÿÿëÿÿîÿÿôÿÿøÿÿüþÿýüÿýúÿýøÿû÷þùöýôõûòóúñôùðóïæçäÞÞÓÏξ½¹¬¯¨ ¦œ£™œ¤—£«œ¦•š¢“--+-.)./*/0+01,23-34.45/7808919;0;=2=?2?A4@B5BB6HF:JF:KH9LI8MJ7NL7OM8OL;KI=QPK]\amlzyy‘€ §}¥yu–qj‰d^zYTkQLbKGXD@N@=HA>E=;>986952:70<8/<8-;9-88.991::0>;2><0>;,>;*E?/F?-H?.K@.M@0N>.N>.K@.?=(<>)>=+>)Ÿ9#ž8"¤;&¤:$«<(²?,¸?.½>-À<-Ä<.Â>1»@1³=/¯9+®8*®8*¯:)¯:)±9)´;*¹;,ÁB3ÊF9Æ>0¼2%À2&Í9-Ó5*Ø4*Ø6+Ú8+Ü8,ß7,æ3,ê2*ñ0+ô/)ñ.(ì0'ã1#Ù4!Ð5Í5Õ3×0Ø5$Û;+Ö=/Ð:,Í=2ÒD:Ã6-Ã6/Ê;5ØD@âMGäKFÞC>Õ<6Ð@7ËA6Å?4¾DôCKüHSþHUúCUú@WüA\þCbýDfþFlÿJrÿMxÿN{ÿLyÿIwÿEtÿO|ÿR}ýJq÷LnÿVuÿVs÷MhðFaîLdÐ>SádrþŸ¥ÑŽd92kI=¤znÐ¥œõÔËÿéãþóïÿüþÿûÿøòþúïÿýïÿÿïÿÿòÿÿõÿÿøþÿúúÿûøÿþùÿýøÿû÷þùõÿö÷þõöþó÷þôõöìíëãáÚÕÒÈÅÀ¹º²²µª±´©°¶ª¶¾±¯·ª«³¦10,0/*0/*0/*0/*21,32-44,77/88099/;;1==3??5@@4AA5HD8KE9MG9OI9PK8QL8QL9OL=NKBVTUeeowx„‡¨Œ¸Ž’ÂŽ‘ÄŒŒ¾†‚´zw¦ol—fd‹\[{SPmLJ`IFWDBM=4E;2@91<928915<45<47=3<:.F3,W2,u87’@B¥=D¦89§;/¨=+ª?+«B-¨?*¤;&¤;%¨>(§8$­:'µ<)º=+¿;,Ã;-È3Ä@4½=0¹9,·7*·7*¸8+¸8+·8)¹7)Æ@4ËC5Å9,¿1%Å2(Ê8+Ï5)Ú3*ß3)ß4*à6)ã5*æ4*ê2*ï0(ò/)ô/)ñ.(ë1%â2#Ù4!Ð5Ì4Ô1Ö/Õ2!Ø6'Ö9*Ô:.Ó?5ÕE<ÔE=Í@7È;2ËA7ÕKAÙOEÐF<Ä:/Ä<0Â=.¾<.º;,´9)³9*µ=-¸>/µ9-¼<1È?9ÑB>ØBAàDEìINõOSê@Cí>CòCJúISýKWûFWùBVúBZùA]úCbýEiÿKqÿNwÿOzÿMwþItÿJwÿS~ÿT}üIpùImÿStÿVq÷OhéE]ãG\çYiÿ–¡ÿµºòžœHCi.&¦kc̗ñÉÁÿâÝÿòîÿüûÿýÿùöýý÷ÿÿ÷ÿÿ÷ÿÿøÿÿúÿÿûþÿüüÿýúÿüøÿûõÿú÷ÿùöÿ÷øÿö÷ÿôöþôõüòóñéçäÜÚÕÐÌÍÊÃÈȾÉ˾ÉÍ¿ÈÐŽǾ·Á¸54/43.21,10+10+11)33+44,66.66.88.::0<<2>>4??3B@4IC7LD7OH8QJ8TL9SL:SL*E?'G?(G?(H@+HA/HB2GA5G@6G@8H=;H::C98=85664173.91.:05=275)A1$Z8.~C=”FB><40¦<.¨=+¨?*©@+¨?*©>*¬?*¯@,ª7$±8'¸;)¾:+Ã9,Ç9-Ì9/Ì<1É?4Å<2Â9/À7-Á8.Á9-À8,À6+Ä7-ÑC7Ð@5Ã0&Ã,#Ï8-Ô<1Ñ3(ß3)ä2(å3)è3*é2*ì1*ï0(ñ.(õ.)ô/)ð/&ë1%à3#×4!Ð5Í5×6"×4!Õ4"Ô4$Ó6'Ô8,Ô<1Ó?5ëXPáRJÓI?ËB8ÊF:ÌJ=ÅE8½>/¼:*º;(º;(·:(¶9'¶;+º?/¿A3ÁA6Á<3Å<6Î@<ÖDDÜHHãJLëLPèBFê@CðCIøJSýMXûKXùFYúG]õA\÷C`úEfþJmÿNuÿOxÿNvüKuÿQ{ÿRyþPuüNqÿVwÿ]{þTníE\÷TiîQb÷erÿ’œÿ‹“ò„‡Ç`c¦LK´ke̐ˆî½¶ÿÞØÿðìÿùøÿûýüúÿüûÿýúÿÿûÿÿûÿÿûýÿûûÿûøÿü÷ÿüöÿüöÿüùÿûøÿùøÿö÷þòôýññøììðæäæÜÚÞ×ÑÚÖÍÜÚÎÝÞÐÝáÓÛâÚÎØÐÄÍÈ::288055-33+22*22*33+33)55+66,77-99/;;1==3>>4A?3IC7MC7PG8SJ9VK9UL;TK>H:=D;:?:97<92>:.C>+D?)E@*E@*DA.DC1CC7AB:@C<@BA?ICALBELBGM?IK=IG=HBCI?@<0K9+fF7‚N@ŒJ<Ž?2“7(£>,¨=)©>*©>*ª@*®A,®?+°=*°7$¶9'½9*Â8+Æ8*Ê8+Ð9.Ò;2Î;3Ê:1É90É90Ì91Ì91Ë80É6,Ñ=3Ô=2Ñ9.Ë1'Î4*Ø<0Ù;0×3)ã2(ç1&é1'ì1(ï0(ñ.(ó.(ó,'÷.'ô/'ð1'é3&à5$Ø5"Ò7!Î8 Ô9%Ô7$Ñ6$Ð5#Ñ5&Ó7+Ñ7-Ï8/ãNGçWNæYPÚQGÌG>ÃC8½A5¸?.¶<'¶<%¶<%·:&·:&¹:)½>/ÃA4ÈC:Å?6É@:ÑFAÔIFÕGFÖHGÞJJåEGçACìCHõLSûPYúNZúK\úJ^öD\öC`øEeûIkÿNrÿPwÿPwýQwöVxñVvôUuûXwÿ\xÿ[uúRiñJ^ýWkõTdéM[õ]jßKYæTaåTaÖYaÀfeDŽ~嫧ÿÓÎÿìèÿóñÿøöÿýþúûýøüÿûüÿúûýûûûûúøû÷ôûøóÿûõÿüöÿüùÿüùÿø÷ÿóóüîîùëëïááèÝÛâÙÔáÚÒåÞÔëçÛïíÞïñãëòëÚåßÍØÔ==5;;188044*22*22(33)33)44*55+66,88.::0<<2>>4A?3JB7MD5RF8UI9WL:WK;VJ2ÉC8ÈB9ÌE?ÓLFÓLHÍFCÌEBÕGEâHHæCDèEHñLPøSZøQ[÷O\ùN`ôH^ôF_õFcùJiþOpÿQuÿSwÿUyîUsíZv÷^zü]yùUpóMeøPgÿZlÿ[mÿcsïM\÷UdóN^üUgôK^äR_À^_»vqל–ùÊÄÿåàÿíêþôòÿÿýûÿþúÿÿøÿÿúÿþûýúûûùýùöüùôýøòÿúôÿú÷ÿú÷ÿöõûïï÷ééóåäêÜÛçÙÖãØÒæÝÔïçÜøòäýúéýÿñóúóàëçÒÝÙ@=4@>2>;2<:.:7.85,74+63*52)52)52)74+96-=:1@=4C?4H@5LC4RF8TH8VI8VJ:YM?YOFRILUQ_eez}¦Œ“Ê–Ÿâ©õ£°ÿ¨´ÿª³þ«³üª²úª±÷§¯ð§¬ì¦ªçŸ¡Ú˜™ÏŒŽ¿€°sržhe]Z…VT|XQzXRvVOnMH_C?M=;@=<8@@8=?2?C5BF8?E;;B;:C@>FH>KTDVlQf`q‹htŒsuŒxŠo_j‰Zb’WYœWR¥UL¤L>Ÿ@.œ9"Ÿ9"§<(ª=)¬?*¯@,±A-´?-¶=*¸;)º6'¾6(Ä6(É7*Ï7,Õ8/×9.Ú91Ö71×:3Ø93×82Ö71Õ7.Ú91Ü;3åD<Þ=3Ø7-á@6ü[Qÿmbÿ]Rç?4ä2(ì1(ñ2*ò/)ô*&ó($ö)&÷,(õ.)ò/)ì1(ã1%Ø1!Ò1Ò5$Ñ:'Ë:%Ê<&Ì;&Î;'Ð:)Ñ9+Ñ7+Ñ7-ÙA6Î7.ÜG@ôd\äWPÊA9Å@9µ5(·:&¶<$¹=%º<&¼;(¾;)Á<-Å=1Æ=3ÊD;ÖOIÝXQÓOJÀ?9À?:ÏHDÞHGáFDæJKîPQðQVîMUíKVñLZøQcöOcõKeôJeúMkÿQrÿStüStòWvîXuóYuû[uÿ\uÿYpÿWlýVhÿbsýWeÿ]kÿ[jñFVñDWÿQeîVcÆfgªicɐ‰å¶°öÓÏÿêæúïëúöóøüûùÿÿøÿÿ÷ÿýùþúþþüÿûøûöòýúóÿúôÿøõþöóÿ÷õÿöôöèçæØ×ãÕÔÞÐÍàÖÍïçÜüõåýøåÿüéÿÿñúÿøçðíØáÞB@4A?3?=1><0<:.:8,85,74+52)52)52)74+96-<90?<3B>5G?4KA5OF7SG7UH7VI8XL>WMDTKLWQ]eb}wz£‰Ç’œáš§õ¡®ý©µÿª¶þ­·ÿ®¸ÿ®·ü­¶û­´ø®³õ¦ªê¡¢â–˜Õ‹‹Ç~¸sr¬gfŸc^–_V‹`Vˆ]TUOqMIbEBSBAI@BA<=8AB??=CABNLQWWcbg„pt—~ †}œ‘|›ž|—¤p‡£_t«Xh¶VaºRS¶ID°@4¬;)«;#¬>%¦7#§8%©9%¬9&®9'±8'´7%·5%»3%Á5(É7*Ñ:/Ù<3Û=4ß<3Þ;2à=6Þ<7Ý;6à=6äA:çD=çB<åA8ä@7åA8â?6Û9.Ó1&×5*éI=ÿ[Oñ@6í5+ê+#ì)#ø-)ý0-ü,*ö)&÷0-ó3.í6.ä6+Ü4'Ô2#Ó3%Ï6$È:$È<%É;%Ë:%Î8'Î7&Î5'Î4(Ó9/Ï5+Ô=6åPJåTOÛLFÌA<¶0%¼;(º<%»=&¼;&½:(¾9(Á9+Â:,Æ>2ÉC8ÓNEÛXPÒRIÀD<¾B:ËGBÛLFÞIEäLKëSRìSUéPSéNTëNWöUd÷TeùSiúRküRmÿSqÿSqþSsòMm÷Tsÿ[yÿ_{ÿ[týUlúSgúSeûVf÷R`ý[hý[hñO\öTcýXhßS^¶a^–]Tµ€zÖ©£ìÉÅúáÝøéæûöóùûøøÿþøÿÿöÿýùþúþþüÿüûýøõüùôýúóýøôþöóÿøõÿöôõêèéÛØäÖÓÛÐÊÞÔÊîæÙüõãÿúæÿýèÿÿïùþ÷çðëÙâßEA5D@4C?3A=1?;/=9-;7,;7,73(73(73*84+:6-<8/?:4@<3E>4IA6NE6RF6SF5UH7WJ:XKBVLKVPZa_wsuœ„‰À˜Û–¤ïž«ù¨´ü«µü®¸ÿ°ºÿ²»ÿ²»ÿ³ºÿ´¸ÿ®²ù©¬ñ £è˜˜ÞÓ‚Çwv¼rm°i`¡g]™cZ‘]W…TRwLLfCDV??I76;A=>JB@L@@N>?ZFHoV\€ds–r–£z¦­~¨±z¡·u›½p’Áb€ÀTnÁG\ÎKYÐIPÄ=:¹6,¶9'µ=%°<#®;&®;(°;)³;*µ<)º=+¾<,Á<-Ã7(È9+Ò;0Ù?5Þ@5á>5à<3Þ:1Û81Ø5.×4-Þ93æA;êF=éB:ã<4â;3Ù5+×5*Ù7*Ò2$Ë+Ó6'éG:õK>ò@4ì4,î-(ö,*ú,,û++ö*)ï)(ë.*è3,á5+Û5)Ö2&Ô2'Ð4%Ë8&È:&Ë:'Î;)Ð:)Ñ:)Ò9+Ô8+Ð4(Ö<2Ó:4Ó;6äOKìXV×EEÀ3,À;,¿<(¾;'¿:'¿:)À8(À8*¿7)Ä>2Æ@5ÏK?ÕUJÑSGÃG=¿C9ÆF;ÖKDØIAÝLGãROåSSáOPâMQãNTòXdöZhú[mýZoüVnùQkúPkÿPoüHkÿQtÿ[{ÿ[xÿWqüTküVjþ[lúYh÷Ygú`ló`jë^fîgnêgmÉ]] ]U{OD˜md¿˜‘ÛºµïÓÐòàÞýõóùù÷ùÿû÷ÿþöÿýúþýÿÿÿÿüþþøøúùôúúòûøñýøòÿùöÿ÷õøïêîãßåÚÔÛÑÈÜÒÆìåÕýöãÿüæÿþçÿÿì÷ýóéðéÝãßHD8GC7FB6D@4B>2@<0?;0>:/:6+95*84+95,:6-<8/>93?:4B>5GA5KC6NE4QF4SF3UH7VJ>WMKVOW^[pmp“…¹‹•Ó” è›©ô¦°ø¨²÷¬´ü®·ü°¸ÿ°¸ÿ±¸ÿ±¸ÿ®²ûª®÷¤¦ðŸé”–ጋׁ€Ì|zÅtm³mf©e_›^[VWƒPPrFF`A>Q<6BF9@S/Ð4%É.çE6óI<úH>ù<6ó,)ð$%ô&(ù//ï-+é0-ã2,Ý2+Ø1)Ô0'Ó/&Ò0%Ó7*Ò9)Ô;+Ö=-Ú>/Û?0Û?2Û?2Ñ5)æLBãJBÍ50ßGDðZYÞJJÓB?Ç;.Ã<)Â:*Á9)Â:*Á9)À8*½8)Á;/Á=0ÈF8ÎNAÍOAÃH9¾C4ÀB4ÎH=ÏF<ÔIBÚQIÜQNÙNK×KLÛLPêW_ò\güaoÿ`rúXmôNfôLeüMjÿOrÿRvÿVuÿToûUkü[mÿesÿiwÿfsúbnôblìeláfi×ijËge´g__ReH:~^S©ˆÊ«¦äÈÅíÙØýòðø÷õøýù÷ÿýöÿüúþýÿþÿÿýÿÿúúûúõúûóúúòýúóÿüøÿüöýöð÷îçêà×ÝÕÊÜÔÇëæÓýøäÿÿæÿþåþÿê÷ûíéðèàåÞKH9JG8IF7GD5EB3C@1B>2A=1<8-<8-;7.:6-;60<71>93?:4B>5EA6JD6MF4PE1RF0TG4UH8XMGVMRYVgkl‹}°ˆ’Í‘žâ™¥í¦®÷§¯÷ª°ú¬³û®´þ®´þ¯³ý¯³ýª®ø¨¬ö£§ñŸ£í™ç’”ߊŒ×††Ð€Æyv¹llªbeœ]a‘WZƒRQqNI`WFY_CQmBLFM–MT¬U]»ZaÉYgÙRpâRußTsÙPjÒJ`ËBTÆ8HÂ.<Ô8EãCKãGJÖ>;Ë>5ËG8ÂH3¶?)¶=,¶=,º=+½>-Â@0ÇB3ÎE5ÓE7×E8ÙB7Ø>2Ù;0Ù6-Ø4+Ù2)×3)Ô1(Õ4*Ù6-Û8/Ü8/Û7-Ü5,Ü5,Ó/%Ø6)×7)Ï2#Í2 Ñ:'Ô=*Ò;(Õ<*æD7öJ@üE?ù64õ*-õ),ö.0ö65í53â3.Ú1,×0*Õ0*Ø/*Ù0+ã80á90â:/â<0à=.ß=.Û>/Ú>1Ð6*ïWLøaXÐ;5Ð;7äPNÛGGäPNÍ=4È:,Æ8,Ä8+Ä:-Ä<.Á<-¾:+¼:*»<+ÀA0ÅG8ÆH9ÂD5½?0¼>/ÉG:ÈF9ÍH?ÓPFÖQLÓNIÒLKÕMOçZ`ï]güfrÿgwü]oñOdòLbýOjÿVwÿSuÿSp÷Skõ\nùhuûkuöfpùeqñ_jë_héjqÜrtÁie©e\œl^~gUYI9kXJ”|r¼Ÿ›ÝÁÀëÖÕýííûõõûûùùÿýøþþüýÿÿþÿÿüÿÿùüþÿùúýôùüóýþöÿÿøÿþøÿúôÿøððçÞãÛÎàÙÉîéÕÿúäÿÿæÿÿãýÿçõùêëñåæéÞNK:NK:LI:JG8HE6FC4EA5D@4@<1?;0=90<8/<71=82>93?:4B?8DB6HE6MF4NF1PE/UF1UH7YLCTKLXTbhi…|«ˆ’Ç’Ý—¤ê¥­ö§­ù«®û«±ý®±þ­±û­±û¬°ú¨¬ö¦ªô£§ð¡¥îž¢ëšžç•™â‘•Ü’׆‰Ìz€¾rx²mt¨koœigŒi^|x_u€WiŽP_¡PYºR[ÍT]ÕOVÛHRå@Qç@QáCQÜENÔCHÎ?AÉ99È44ãIIçIJßA@Ó84Ì92ÎA7ÇC6½?0ÂD5ÂD5ÄE4ÇE5ËF7ÐF9ÕG9×H:Õ>3Ô<1Ô8,Õ4*Õ2)×3*Û4+Ú6,Ú7.Ü;1ß<3ß<3Ü8.Ù5+Ù5+Ú6,Ñ/"Û;-Ú=.Í1"Å.Í8$Ð=)Ì9%Ì9'Ò9)à:.ñ>7ÿ@?ÿ<>ü46ñ-/é++ß+*×*&Ó+(×/,Ü41ä88è88ï75ð74í81è7/â6*Ü6(Ö4'Ñ5&Í5'æODÿlbÚG@Æ50ÔBBÑ?@êVV×B<Ñ=3Ê7-Æ6+Æ:-Å=/Â=.¿=-¹:)º=+½@.¿B0¿B0½@.»>,º=+ÂD5ÂD6ÇI=ÎPDÑRIÏPIÏNIÓOMç_aíbgúhrÿnzÿeuôUgôQfþUlÿXuÿWsúXoñ^nómvõv}ëmqÜY_ïbkïamëblîrz뇉́|¨tg–ygsmWON:_VGƒqg®•‘Û¿¾íÕÕûèêþôõüúûüýÿùýþýýÿÿýÿÿûÿÿùþÿÿûùÿõøþôýÿ÷ÿÿøÿÿøÿþõÿþôøñçìæØèâÒòðÛþüåÿÿãþÿàþÿæøûèðôåîðãQN=PM3@<3>:1>93>93?:4?<5@@8CC9IE9LF6NF1PE/UF/UH5WK?QIFUR[hh€}§ˆ’ѝٗ¡æ¢¨ô¥¨ù¨©û©¬ý¬­ý«®û«®ûª®ø§«õ¥©ò¡¨î §í §ëŸ¦ê¤è›¢æ–žß‘™ÚŠ”Ñ…È‚Œ¿ˆ´‚€§‡z˜m…˜cw¦XhºR]ÏMWßHQç@Hé<@è<:ã?6ÜD7ÕH7ÌI5ÅG1ÂD.Ä?.âTHßH?Ø;6Õ63×85Ö;9Ñ96Æ71¾:-»<+½;+¾:+À8*Â6)Ã4&Ä2%Í5(Î4(Ñ3(Ó2(Ö4)Ø4*Ú6,Ú8-Þ=3Û=2Û;/Ú:.Ú8-Ø6+×5(Õ3&Õ3&Ó3%Ï4"Ï6$Ñ<(Ð?*Ç9!¿1Ç9%Ê4%Ó1&ä6/ù;;ÿ>@ÿ8;õ26ê./ß--Ù-+×/.Ü43â88è:<ï8:ô23÷12ò0.í2-ä2(Ý1%Õ2#Î2#È2#Ï=.új_ãTLÇ82Ð@?Ë;;ãQQâJEÛB<Ð92È5-Æ8.Å;0Á=.¾<,¹<*º?-»A,»>*¹<(º;(»<)¼=*º?/º?0¿C7ÇK?ËOEÊNFÌMGÎNKæabéae÷gpÿnzÿix÷ZköUgýZoþZrù]rëapäkré}}æxw×_aðhrünzñerêlwö‘•ì¢ŸÃ•ˆ¡ŒyhlUHR:WVDth\¢ˆÙ¿¾ðÖ×÷ãåÿôöÿúüþþÿûüÿýüÿÿýÿÿúÿÿøýþÿû÷ÿô÷ýóüÿöÿÿøýýõÿýôÿÿôþúïóðáïìÙøößÿýäýýáýþßÿÿåýÿê÷úéö÷éTN>SM=RLDê;@ë;;ê?7â@1ÚE1ÓH1ÉI0ÂF,¾B*Â?+áSEÜC;Ü:7ã==éCEåABÙ9;Ì65ËB8ÇE7ÇC6Æ@4Æ>2Ã9,Á5(À2$Å3&É2'Í3)Ó5*×4+Ù5,Ù5,Ù5,äB7Ý=1Ø6)Ù5)Ü8,Ý9-Ù6'Ó1"Ø8(Í2 Ê1Î9%Ì9%Å4É8#ÑC/Å6%Ë8(Õ7+Ü5,å4.í53ô;9ù@>ÿLKúHFðBAë?=é;<ç7:ä15å+0ó+.ö*-ó-,ï/,è1)à4(Ù6'Ó8&Æ0½.òdVê]SÎA:ÓEAÉ;9ßMMèSOßGBÑ<6É6/Å7-Æ9/Â:,¾;)½<)¿@-¾A-º=)·8%·8%»<)¼?+³8(²8)¸>1ÁG:ÅK>ÅI?ÅI?ÊKDä`\å_^ðehþouýjtó]iðXeø]k÷^póbqçeoàloë}÷ŽŠó†ƒèrr÷qxÿ{„ôaqÞWeô‰‘þ´³Ï¯¢›„]lOCS8QT?jbU›ˆØÀ¾ðØØõßáÿô÷ÿúýÿýÿüûÿýüÿÿþÿÿúÿýøüùÿúòÿññýñöÿóúÿöùüñýýóÿÿôÿÿóùöç÷òßüúåÿþåýüàþýßÿÿçÿÿñûýðüüðWP@VO?UN>TM=SL1F>1F@4EB9DD8HF7MH5PJ4RJ3UJ4SK8VNCRMJXU`hh€z}¦ˆŽÂ˜Ö—žä£¤ô¤¡ø¢¢ú¡¢ü ¤ÿ¡§ÿ¢ªÿ¡¬û¡«ó ©î ¨é¤§êª©í­ªñ¯¨õª©÷ž©ø•§ñ’¡â•ŸÔ¥£Ë³ž½¶…›¶hx¼LZÐDOÞ>Jå;Dæ;Aã=?ß??Þ@=á=>ß=;ÜD?É:2ÊD9ÉE9º1'ÚKCåJFèDCè>Aè;?å;>à<=Ú<;Ò=9ÎA:Å?4ÈD8ÑMAÌJ=¾<.¸6(¼8+¼6*À6)Ç4*Ë2*Î/)Ó0)Ù2,Ü5-åA5Ý:+Ù2"Ý3$ã9(æ<+Ý8%Ó2Î3Ê4Ç5Æ5 Ç4"È5%Ì6'Î6(É1$Ì2&Ï5)Ð7)Ñ5(Ô4&×3'Û3&à2)å4.ë52ë33è.1æ,1ç,3ì-4õ.3ó+-î,*ë0+è6,â8+Ø7%Ð5#Ã.Á3æYHèZLÊ<2ÝNFÃ4.ØIEàPOÚKGÒC?Ë<6Æ7/Å7+Ç9+È<+Å<*À;(½:&»:%º;(º=)·=(µ<)²8)´<.¸>/¹?0»@1½?1À@3Ã@6îkaôohéb^ômjúppë`côhkÿqwÿmxùhuîemèchêehímlîqoîqmúxxÿ}ƒ÷[iûdwÝcpø¬®³«˜z‘t[sQIZ8LR8pnY£•ˆÉ¶¯êÕÒÿîíÿö÷ÿ÷øüøùûûýýþÿþÿÿþýÿùÿýíÿóåþéäûéíÿíøÿöûÿôýÿòÿýðÿýîÿûëÿúèÿøåþøâýùàýùàûúåþþôþÿúÿÿúXO@XO@WN?VM>TKÆ=5Ã=4ËI<ÌL?ÁC5¶;,¶8)¹7)¼6*Ä6,É5+Ð3,Ö3.Þ52â92â>2Þ;,Ý6&ß5&á6%à6%Ú5"Ó4Ï9!Ê: Å9"Å:%É<*Ê;+Ë7+Ì4)Ò4+Ó5,Ñ7+Í7(È5#Ç4 Ê3 Ï4 Ø2$Ý1%ã0)æ/+æ,-å-/æ-2ç.3é+-ë--é0-å2+à4(Û5'Ô7$Ð9$Ò?+¸*ÓD3Î?1ØE;êWO×B>ÖB@åUTàRPÚKGÒC=Í=4É9.Ç8*Æ9(Ç<)Ã:'¿;&½<'¼=*º?-·@,´?-¯9+±;-¶>0¸>/¹>/¼>/ÀA2ÂC4ëi\ñndåbZðkfõolça`ðjiütxÿq{ÿoyöirë^déZ^îbcöpmûzuøvtÿw{øSdüZoâ]nõ¦©§¦’iŒkZtON`:PY:ttZ§žÔÄ·óàÚÿóïÿúùÿùøþúùûûùúþýùÿýùýüóÿ÷êÿòàÿèàüåèÿêòÿð÷ÿñüÿñÿÿðÿýìÿüìÿúèþõäùòßøòÜúôÞú÷äúúòûü÷þþüYPAYPAXO@WN?VM>UL=TKCã=?å==å?á>Aß>Cà=BÖ7;Õ?@Î@>ÉB>Á<7Ã83éXUßABä>Bå;>â8;Û78Ô65Î93Ë<4ÔG>Ä;1¼6+ÄB4ËL=ÅG8»=.µ8&¸6&¼7(Å7+Í6+Ô6-Û60å95æ=6Ö4)×5(Ù5)Ü6*Ü6(Ú7(Ú;(Õ>)Ã5½5¸6 ¸7"¼9'¼8)¼4(¾.#á?:â=7Ü>3Ô;-Ì9'È7"È7"Ì7!Ò7%Ô2#Ö0$Ù.&Û.*Û/-Û/-Ú.,Ú-)Þ1+Þ6-Ú6*Ô4$Ï4"Ï8%Ð=)ÓB/À2æUDÏ;/Ù@8ÝB=èJIïUSëUTåTQáPKÚJBÖC;Ï<2È9+Ä7&Ã7&¿8%»8$¸9&¹<(·>+³>,°=+®:+°<-²<.²=,µ=-¸>/½B3ÂD6Û[Pçg\âbYðlgôplåa_êefòkoàS\î^hõhqòekñ`eôegùroýyuøtrÿnuòI\øRhãZl¡œˆ`]UoHPe>Va?ux[«¤‘ßÒÂþíåÿ÷ðÿüøÿýùýþøûÿúûÿýùÿýùÿûñÿöæÿíÛýâÙ÷Ýßùàèûåîûçõüêüÿìüûéÿûèÿøæùðßòê×ïçÔóëØöðàüùðýü÷ÿþúZQBYPAYPAXO@WN?VM>VM>UL=SJ;RI:QH9PG8OF7OF7PG8OH8JF:KG;NH8QJ7SK6TL5VK5TL9VL@UMJZW`jh}xxš„±‡Á“͐•Ï“”Ô“–Ù”˜á•›ç—Ÿê™¡ê›£ë›¤å˜¢ß•ž×’›Ô“™Õ’–Õ’“֏Ð…„½„¶£}®¶t¢ÇfÐWxÓGaÔà@@ã>Bæ=Dæ=Dâ?DÔ:<Ð>>ÏEBÆA<º61Ä=7éZVÜBBâ?Bæ=@á;=Ù99Ó97Í=5ËA7ÎD:Á9-¹3'¿;,ÅF7ÃF4¼=,·8%»7(Á9)É:,Ð:,Ù80à91æ:6é>7Ø1)×3*Ú3+Ý5,Þ6-Ý7+Ú:,Õ<,Ç8'Ã:'¿<*¾<,½;-¿;/Â<3Í:3ëC@í@:ã?6Ø(Ê<(Î=,ó]OßG<Ñ2,Ñ/,å??ùVWÿtrÿrnÿkeô_XåQGÔB5Ä5%¼/Ä8'¿8%»8&·:(µ<)µ=,±>,­<,¬;-¬<.®=-¯;,±<+´?.»A2¿E6ÉMAÞ_Váb[ñpkõsqä_`â]`ä]cÕIRæYbógpôgmöelúkoûssüvuùqsúdmðCWóJaåXk뒖•‚\zXQlCRi?ZhDw|\®ª‘æÛÉÿôçÿøïÿûñýýóüÿöùÿøùÿúöÿøñýóéûëØùÞÍòÑÊëÌÎëÍ×îÒÝïÕèòÚñöàóõàùöãûôâôëÚêáÐèÜÌíáÑñèÙüõíü÷ñþùó\P@[O?[O?ZN>YM=YM=XL?Î@>ÎID¿?6²3*ÇB;àUPÚEAàBAâ?@à=>Ù>:ÔA:ÎD:ÌF;Å=1¿7)»6'¼9'¿=-½>+½<)¼;&À;*Ç;*Î<-Ó;-Û8/à8/å82ç:4æ95ã62á2/ä2.ç40ã5.Û3*Ò/&Ë1'É7*Ç:0Â8.À3,Â40Ë;:Û@>é9;ì63ã60×5*Ë5$Ä6"Ã8!Å:#É=&É8#Ê4#Í6%Ò9+Ô:.Ó9-Ï9+Ï=.È;*Å8'Ã8%Å:'Å='Ç<'Ç:&Í>-Ì9)×=1àB9Ô/+ã99ß12ß56Ô52Ö;6ÝD>äKCèQHèTHçUFãVEÉ@0Ã>-¾<,·<*¶>-³@.°?-®?.ª<-«=.¬=,«<+¬;+¯>.¶@2ºD6ÅLAÜbWàd\ïpjóqqâ`bå`eæ_föjuûoxöjsë`eð_fýlqÿyyÿzzúnq÷]iò@VôC]èUh䈍£”f€]YtI\vGgxNˆf²±•çáËÿúçÿüìÿþïüÿñûÿô÷ÿôôÿñëüêãñàØî×Åèǻ伹߸½ßºÅà¿ËãÃØæÌáëÒëïØòñÜ÷òßóêÙëßÏçÙÌêÜÏîâÖñçÞñèáòéâ[O?[O?ZN>ZN>YM=YM=YM=XLÍID¸<2®4)ÉI@ÔKEÖB>Ø><Ú<;Ú<;Ø@;ÓD<ÌH<ÊH:¿7)À8(¾9(½8'»8&º9$¼;&À;(Ä;)É<*Ð=-×;,Û7-Þ6+ã5.ç60è21ç//é-.í//ó55ó76í53ä2.×.)Ö3.Õ62Ñ30Î.0Ò/4Û6=éâ/2Ù)+Ô1,Ò5.Ô70Ó9/Ñ9.Ì5*Ä2#¾1 ÍD4ÆA2»<+´9)®9(­:(«:*©:)ª<-«=.«=,«=,«<+¬=,°?/µA2ÉSGßf]ßd]èkgînoåbgíjpônuùpzüs}ömuîcjöelÿsxÿx|ÿquúipõWeø@Xó?ZèPeá~ƒ«–ƒxŽhmˆ[nŠYx‹^Œ˜p³·–ÞÝÁøóÝûùäÿÿíûÿïõÿïîÿëåûäÚñ×ÐãÍÅÞÁ°Ö­¨Ó¦¨Ñ¥®Ó¨µÕ®¼Ö±ÇÚºÑàÁàæÌçéÓïíØñêØîâÔéÛÐêÙÏëÚÒèÛÒäÚÐä×ÏZN>ZN>YM=YM=YM=XLQI?èC=ßHAÜIBàFFçBHñKÝADÔFBÇB;ÇH?³:/°7,ÎPDÈC:Î=8Î63Í2.Ï61Ñ>7ÏE;ÆG8ÂC4¾9(Á:'À;(¾9&¼9%¼:$½;%Á:&Ä9&Ë:'Ò;*×:)Ü6*ß5(ä3+è3,è**î*,õ-0û03ÿ26ÿ47ÿ47ü58ø7:õ8<ñ8=ñ8>ó8C÷7Fú5Gû5Dó*4ó,1ë20á4.Ø5,Ð8*Î;+Î=*È5%Ï7)Ø:.Þ>2á=3â>4â>4ßA6ØK:ÍH7ÉA1Ã<)Á:'Â9'Å9(Ç8(Æ2$Ò8,à?7êC=Ý1/Ý--é56æ66Ø3-Õ7.Ö8/×;/Õ;/Ñ;-Í;.È:,ÔL>ËG8¾?0´9*®6&«7(©8*¨8*«;-¬<.­>-­>-«<+ª;*¬=,®=-ÀL?ÙcYÝd\çlgîpqéhlôqwüvígp÷oyøqxójqþmtÿwÿu|ùhoùclõSbþB[ôõ==íA=æD?áFBäDFçBIî>Kë?KÕ?@ÐGAÂB9ÂH=¯9-°:.ÐTHÃ>5Ç82Æ.)Ã*%Æ.)Ë;3ËB8ÁC4¼?-¿<*Ã<)À;(¿:'¿;&Á=(À<'À8"Ä6"É6$Ñ8&Ø8(Ý5(à4(å3)é2*õ31þ68ÿ9:ÿ58ÿ-1ý(,ý(,ý*0û,2õ*0ò&/ö(4ÿ,=ÿ*?ü 9ó/õ!/ð'-ë-/ã/.Ú1,Ó2(Ð4(Ï5)Ó5*Ü:/æ>5ê=6é;4è71ç60á90ÝI=ÖJ;ÒF7Ë=/Ã5'Á4#Å6(Í9+Í5*Ó6-æC<ß82Þ20Ïë99ã62Ô1(Ñ3(Ð4(Î4(Í5(Ê6(Æ7)Ã7(áYKÖREÊH;½?1¶YM?YM=ZM<[N;[O9[O9\Oè:;ô<<ÿDCö=;ñ=<ì>=ê@AèBFéBJê@KãBJÏ?>Ã@8»?5´>2®=-°<-¾D7ÑLCÆ7/Ó;6Ì1-Ë2,ÓC:Ç?3³5&»>,¹6"À9%Ã<(Á:&À9%À9%Ã;%Æ;&Ë:'Ð9&Ô7&Õ2#Ø.Þ1#ë6+ô>3ô71õ4/÷0+÷,(ù'&ú&%û%'û%'û&*õ"(ø",ÿ'5ÿ(;ÿ"9ÿ4ý/ÿ'8ï#,ä#(ã+-Ü,,Ó*'Ò-)Ü5/á51ç51î64ñ54ò21ï/.í-,ä.*Û:2Ð9.Ð90êSJº#Â+ ÞE=È.$Ë.'Ü>5çD=à;5Ö/)Ù-)â51ä;4Ü>3Õ<.Í5(É3%Ê6*Í;.É;/Å9,êbVßYMÇC7¹7*º:/·9-±3'³5)¯1%¯1#®3$®4%¯7'¯:)±<+²>/°:.¹C9Ö]Uêpmðtvõw{úx€óq{þ|„ûx€÷tzût{ÿs}ÿr}ÿmxþhsü`mòJ[ÿ>Yü>Zã@UÓdj´•€’¡zj{™c}•c…–i“ už¦ž¨ƒ™§ƒ’£‰¢{€Ÿuxœpw›oyo s€¥r‚­uƒ³w‰¹}¼’½…—¾‡œ¾‹ ½¦»’®¼™½Ã§Î͸ÝÔÅàÒÉÜÇÂÓ¾»Ê»´¿²ª¸«£YL;YL;YL;YL;YL;YL;YL;YL;WJ9XK:XK:XK:YL;YL;YL;ZM[OAXNEXOJYPQ\SX]V]^Xda\sgb‚lgnjœuo«zº†ɀ́¿}·u©‹mŸ—q¤ t§šjœ˜Vz=A§5*°6)Á=1Ð@7Ü?6ç>7ò@<ô<:ó;;ò;?ð=Aí@FèAHá@HØAFÅ;8¼<3´;0¯;.ª9)®:+¼B5ÎJ>×G?ÛB=Ô72Ð50ÔA9ÌB7¹:+±4"»8$Á:&Ä=)Ã<(Ã<(Ä;(Æ;&È:&Î8'Î5#Ó3#Ù3%á5'é9,î9.ï9.å0%æ0%ê.#î,#ô+$ø+&ý+*ÿ-.ú),÷$*ù#-ÿ&4ÿ%9ÿ5ÿ0ü.õ.ö.9ô2;ä+1Ú'+Ü.0Þ01Û+-ð9;ó6:õ47õ13ö/2÷/1ø23ó76Ú1,Ú<3Ö71ãD>âE>Í0)Ï2-Á"Ó4.Þ?9æD?à=6Ö3,Ö2)Ý6.Ü90Ò:,Ì9)È6'Ç5&È9+Ê<0È[éCYÒdg­vˆ—nx”at’\vŽ\}‘`ˆ•iŒ™nŠ–nƒ“lp‡]kˆ\h‰\fŒ[j_p–cv›hy i­r‚²t‡·y»}½‘½€•¼ƒš½‡š´…¡³‹¬·—¼¾¦ÍÆ´ÕǼÔÁ»Î»·Ä¶³¸­©°¥£YL;YL;YL;YL;YL;YL;YL;YL;WJ9XK:XK:XK:YL;YL;YL;ZM<õ;>÷:@õ+Ç>+È=*É:)Ê9&Ï8'Ï2#Ó0!ß5(ë=2ò@6ð91è3*Þ4%Þ4%á1"å/"é-$í,%ð*'ñ+(ò,+î'*ò&/÷'4ü%7û4û2÷1ó$6ñ/:ñ6?ð8@ï;DíYìFZÍ_`ev…Zh„Qf„Nl„Rs‡Vy‰\{ˆ]u„[oW`zM_P`„TeYl”_t›dzŸi|£j­pƒ±q‡µuŠ¸x‹¹yŒºzŽº}’¹€’°|”«}š¨„¨¬‘¹´ Å¹«Ê¹±È¶´¶¬«§¡¡—™YL;YL;YL;YL;YL;YL;YL;YL;WJ9XK:XK:XK:YL;YL;YL;\L<[K<\L<\L<\L<]N;]N;[O9\P:^Q>]P?[O?ZN@ZMD[NF\OIZNN^P_`TldY{f^‡oh›zu­ƒ{´…z²˜„·¤„³¯€ª·y ÆyÐt™Êd‹ÆNjÙEQÝB@ÓC;ÍD:ËG:ÌF:ÓE9ÜB:ì@>ô=AùFïBFâBDÒ@@Æ?;¾>5µ;.®:+«:*©:)­9*¼>0ÌC9Ô=6Ó40ß;9åA?ßE=çTJÞVH¾:+¿:)¾7$¾7$Ä;)É=,É<*Ë:)Î8)Í4&Ñ1#Ø2&ä8,ð?5ó>5í5-ã.%ß5(Ü6(ß3'ã1'æ.&é,(ë+(ë+*ê)*è',ê&0ò*7õ';ö"9ú ;ú$>û6Gâ(5å/;ÿP[ÿ`lÿO[ñ=Hñ9Eè*6í+6ð.7ó19ð16é/0á+(Ö)#Õ0*Ø61Ó1.äB?ÿspõVSÜ=:åGDÚ<9Ù<7Ô:2Ò8.Ð8-Ï7*Ì4&Ä3"¼5!¹6"»8&¾:+¿;,¾:-À:/Ä;1ãYOÚMDÊ70Å0)Õ<6ÜB:Ù<5Þ;4æ=8ç>7ä@7à?5Ø>2Ï=0Ç;,¿:+¹9,º<0ËOGßd_ëooø|~ÿ„ˆü}„÷x÷xúx€ÿx‚ÿtÿmzýerù^löUeòEYý8TþÊD;ÏE;ÙD>çCBïACô?DõBHëEGÞDBÍB=Â?7¼@4µ=/¬;+ª;*©:'­8'º:-Ë>5àE@à<:ëB?éA>Ü:5ãJBæXLÓK=È@0½8'º2"À7%Ç;*É:*Ë7)Ï7)Í1$Õ3(ß7.é;2í:3í60ê/*ä+&á0*à1,ç1.ë20ò12õ26ö37ö5:ë,4ê,6ì-<ð/@ó-Dô)Fü+Kÿ4Qó8Iä2>ïAKÿ`jÿkwÿWdôDQô?Ní4Bì4@ì4>ç6<â88Ú72Í3)Æ/$Ê3*Å.%Ï81ñZSö]XñWUÛA?àHEÛC@Ó;6Í6/Í6+Í9-Í9+É6&Â5#¶8"±8#³:%¸=+¶;+µ7)»9,Ä>5ÙOE×G?Í6/Î1,ß>6åA8á81å61ê1/ë2/ë51æ81à90Ø:/Î:,Ç;,¼6*º8+ÈI@Ü_Yênlù}}ÿ†ˆû~‚óv|öw~úx€ÿx‚ÿs€ÿl{üdsù^nñRdóE\ý8Tþ=XîK\¾URz_BVg:Wr?[vCdzIl~Nr‚Uu„Yx‰]w_w”dušgx k{¦n«p‚«oƒ«o„ªm…­o‡¯q‡´s‡µt„¶q…·r†¸s‹¸wŽ¶zŒ­x¤v–¤€ª­’¾¹¥ÍÁµÏÄÀ»¹¾¨«´™›§ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8YJ7ZK8ZK8ZK8[L9[L9[L9\M:]J;^K<]L:]L:^M;]N;]N9^O:ZM:[N;[N;\O<_P=`Q>`P@`OEbNPbNZ_Pc_Upga…qo–ytœ|r—u•­‚Ê‹ Ú“ãsƒêctçPcè=Pø4Jÿ;PûERèCJÔ@@Ë@=ÏD?ÖE@âDCèBDîAEíCFåEEÙD@ÊA9¿?4¹?2°:,©8(¨9(¨9&­8'»9,É:2çJEè@?ê<;ã75Ø3/ÞA:íZPôh[ÙQAÆA0½5%À7'Ç9+Ç8(Ê6(Ð8+Ï1&Ù5+å:2é;4é3/ç.)è-(ë.,ò46õ49ø3<û2<ý1<þ0=ü0<ù1>ô/@ò1Bó3Hô4Mõ0Nô-Nþ2Wÿ=^å2EøNYÿakÿ_kþVcùQ`òFVç8Gñ@Pè9FÛ29Ð02È3-Â8-½;+º;(Â:,¿3&ØKAùjbÛLFáPKÌ;6Í<7ßKGÔA:Ê7/Ê8+Í;,Í<+Ë:'Ã:'´<$«;%¬<&±>+¯:)®4%¹9.ÉD;ÔG@×D=Ñ61Ö3.å<7ê<5æ3.ì1,ñ+*ó++ñ/-ì3.è7/à90Ø1·=0­9*§8%©:'«<)³;+À5ß=:ä88ã11ß//Þ52Û94åNCûm_ñgZ×RCÅ=/Ã:*È:,É7*Ì5*Ó9-Õ4*Û7.å:3è71è1-ç.+ì0.õ13ÿ3Aÿ0Bÿ-Cÿ*Aÿ&>ÿ":ü 9ö 8÷'Aô*Dõ.Kõ/Pó+Pô)Tÿ2`ÿBhñDWÿ_jÿhr÷WcìJYðK[êCTØ1Bè@OÛ7BÇ,0¸('¯/$«8%¥?&¨@'·@,¹:)ÜZLà\PÌF=ÌC;À71Æ;6âUNÔE=È:0Ç8*É:*È9(Ç9%Ä='°>&¦<$¦<&ª=)©8&«3%»<3ÑLCÔG@ÚE?Ø95Ú3-ç83ë51ê/(ó0,ü,,ý+,ú.-ô1-í5-æ8/Þ<1×?2É9.¼4(¿<2ÎOFßb\öywÿ‡‡ÿƒ…ø{ù|‚ý{ƒÿwÿn~ýdvö]oôYkëL^ôH^û9TúgNIgNRbQ[`Whiguv”{|›y•{”©‚•Æ„Ú}…ïtwýklýYZûCKü1Gÿ4QÿÛA?ÖC<ÏB9Å?4¼>0´>0«:*¨9&«<)³@.»@1ÉA5×B;Ø63à74Þ/,á2/ä;4Ó0'Î5'éUGÿwié[OÐB6Ê<.Ê;-É7*Ê6*Ô:.Ù8.Þ7/ã62æ21é/0ì01ò46û4;ý&6ÿ"6ÿ"9ÿ#7ÿ 5ÿ5ý3ø4ï2í8ï$Aï(Gí%Ið(Mý3[ÿFhÿbsý`iôW`ðPZðP\îLYá?LÒ2<Ù>DË68º0-®/&¥6%¡=&›?&œ>$¨9&²8)ÑUIº:/Ã>7»4.»2,ÍB=ãXQÕH?Æ9/Ä6*Ä7&Ã4#Å4!Â;'±<(¦9$§8%ª9'¬4$­1%Â?5ÛRJØIAßHAÝ;6Û2-ç40ì1,î-(ù2/ü,,ü*-ø*,ó,)ë.(ã1'Ü4)Õ7+Ð>1½3&»9,ÇH?Ø]Vñwtÿ‰ˆÿ†ˆû€…ý€†ÿ}…ÿvÿj|þ_s÷XlõShêDZôC]õ7Sñ;TßMZ¢H@\L+Lb3ToaR?cRBbQAbO@bL?iMIfLMdPYf[lkk…v{›€…«‡‰°Ž„§¢‡¦¼ˆŸÎ‚ây~ðsoùkaÿ`\öKTð=Pé:Ië?MíCPç@Jä=Eã>DáÚ<;Õ=:Ï?7È>3À4Ï60Ù72Û60Ý6.Ü6*Ü9*Ü;)×;%Ó6%Ù;0ïRIñZO×E8Æ7)Ì=-ÓA2Ò:-Ô3)ðGBà..î5:ò5;î,5ÿALï'2ù&/ÿ(0ÿ'1ù&û"*ÿ&.þ'.ð$î)÷+6é!.ì&7ñ-Aä":ÿWqç-Dÿ^lþ^hü[cùU\óPUéHMÚ>?Í84É>7ÄB5·?/¥8$™2—7!š;'œ;(§9,®7/ÂE?¿;7¼2/Ä64Ä51ÓD@ÛLFØKBÑD:Ç9-Ã3(Ç5(É5'Ä6(º<-±9)­/!©)²,!Á9-ÐC9×G>ãPFÝD<Ù80Û0)å/+ñ10ù11û11÷/1õ/0õ/0ó0.ð0+ë3+ä6+Û9,Ô>0¾2#¾?0·=0Õ^VèrnÿŽŒø„„û‡Šÿ„Œÿx…ÿhzÿ_wÿ[uþTnøLf÷Dað9Wó:Yå?WÚ\gŠ?9UG,L^4Xu?g†Kw–]}œc|f€¡j‚¥m§n¦m~§m|¥i{¥f{£e|£d|£d}¤e}¥i~§m~ªk¬k~­g~®d~±d‚²f†´k‰´oŠ°uŽ®|˜³ˆ§½™±Á¤²Á®¤³°‹˜žw„Š\K7\K7\K7\K7\K7\K7\K7\K7]L8]L8]L8]L8]L8]L8]L8]L:\K;]L<^N>\O>ZO=ZO=ZR?[S@\TA]QA\P@\NA_ND`OEbPFcOHgNJfMPcS]f^snoŽv}§}‡¸…‹¿œ•É¡‹¹ª~¡¸wÓy‚ê}zôvjõh^ø]aðNYëEQïHRöJVôFPí?Hê=Cã:?Þ:;Ù;:Ô<7Î@6Ç?3¿=/¶=,©<(©>*¨9&¯:)¿A3Ã=2Æ7/Ô=6Ò5.Õ4*×5*×5&Ø7%Ú9%Û;%Ú9%Ü5,æA;éLCàJ<Ð>/Æ7&Ê9(Ó;-Ü;1õIEä01ð6;õ6>ð.9ÿ?Mî&1ó$*ö%(ú(+ü,,û++õ''ö((÷+*î#&ì%(ê%,ý;DÙ'î4Bû@Q×%5ÿjuÿcjü[aûX]óNRåBC×<8Ñ>6½7+¾C3¹I5©>*—0*Ž(’(œ-$°;4ÐSOÌHDÁ54Æ44Ð<:êVT×FAÕF>ÏA7Æ8.Å2(É5+Ï7,Ì8.Æ<2Â91Á4+Ã3+È3,Ï81×@7ÞE=âJ?Ý@7Ù6-Ü1*æ0,ñ10ø00ú00ô02ò01ó/0ó0.ñ/-í2+ç5+Þ8,Ö>0¾2#¼=.µ=/Ó^Uévqÿ‘÷……÷„‡ý‰ÿuƒÿfyÿ\vÿXtÿQnýIfû?`ó:Zñ@]áI^ÀR[{?7RF.L^6Yv@e‡Jr–Yu›^wby¡e|¥i}¦j|¥i{¤hz¤ey£d{¢c{¢c}¡a{¢cz£gz¦k|¨i}ªg|«c|¬`~¯`€±b‚°e†±j‡¯p†¬s‰ª{Ž­„©†Œ£‰v‡aooO]]\K7\K7\K7\K7\K7\K7\K7\K7]L8]L8]L8]L8]L8]L8]L8]L8]L:_N<`Q>^Q@[P>ZO=YP?ZQB[RC[QEZPG\OI]OL`QNeSSgUUgUUfW\f^mkhƒrw¡y‚¹ŠËˆÑ–‘ÔŸ‹È©‚±¹}ŸÏ‘䄆í~uñriúegõT\íGQïENöHRöFPòAKí>Eâ7=Þ8:Ø:9Ò=7Ì?5Ä@3½@.¶>-­>+¨=+©:)·C4ÅI=¾8À6,À>1¼B3²>/©8*¥3(Ÿ-#›&š%§0*ÅEBÁ;8»-,Å33ÖB@ó_]Ð?:ÑB:ÐB8Ê<2Ì9/Ô=4Ú@6ÛA9Û@;Ø=9Ý>;ãA?â><Þ:8ã@;ëIDàB9Ü;3Ø5,Ú1*ä1,î20õ20ö0/ó12ò01ó/0ó0.ñ/-í2+ç5+Þ8,×?1À4%¸9*´<.Î\Rëztÿ“ù‡‡ù‚†û~†þrÿewÿ[tÿTqÿNlÿFeú<^ó<[îEbßTg¡AEp<1QJ0Pb:]xCfˆLp”Wr˜[tš_wŸcy¢fz£gy£dx¢cw¡bw¡bxŸ`y a{Ÿay az¢fz£gz§f{¨cy©_zª^|­^~¯`„²g‰´mŠ²s†¬s„¦t€Ÿux’mo†lRdX@OL2A>]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8\L5^N7`O;`Q>\O>ZN>XO@XPEXOFZSM^TSaWXeY]gZak[ek^glaikeonl‚rtšw~´~‡Ê„‹Ù‹ŽßŒ‡×œ‹Ñ«ŠÁ³§¼xËz€Ü‚yðvþrqÿcföU[óLSóHPóDKò>Gí-¯>.»G8ËSEÅI=¹6,·1&Æ9/Ì9/Ò<.Ù=0Ú:*Ø7%Ù6#Þ8(Ý5,Ù2*ß>4êNAãK=Ñ;*Ð7'ßB3Ý6-î@9è0.ï13õ3;û7AÿNXÿKTý>Cð45á%$ë/.é-,î21æ*)è/-ñ99Ñå26Ü-2æ9?ïFMÿX`ñMT×<@ÚACÞBEÞ>@Þ:;Ü89Ø96Ò94É91Á80¼9/ÀA8ËOGÕVPÐNLÃC@²72´92ÍLGØNKâRQîZXèRQïZVÈ5.Í=4ÑA8Ï?4Ò>4ØA8ÝC9â@;è>>ç9;ì9=ñ>Bî;>è58ë=<öMHÝ82Ù6-Ø4+Û3*â4-ë40ð3/ò0.ó12ó/1õ/0õ/.ò/-î1+é4+ß7,Ù@2Â6'´5&²:,ÈVLî}wÿ“û‡ˆü†üz„ûo|ûbtþXpÿOlÿFfÿ@bø9[ó>]éKd×Zh„32e;-UO5VhBa|IiˆMq“Ws—Zr˜]vžby¡ex¢cv av auŸ`vž`wž_xŸ`{Ÿay ay¡cz¤ez§dz§bx¨^yª[z«Z|­\„³e‰´l‹´rŠ­s…¥sœpsfhbPbTCRK7F?]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9^N7\L3]M3_O6^O:[N=WN?WODWPHVQN]WYg`hnfsphwpgxrfzqh{ol}oq†rw—u|ªyÀ‡Ò„ŠÞŠŒã“ŽâšŒ× „¿›užŸl¬nq¼vlÑuhñrlÿljÿgiþ^`úQVõFKï/Ø6'Ú4&à6)ß2+á6/â>5âD8áE8ÜC3Ý@1á?0Û0&é61ê1.ï./ð-1ù6<ÿPXÿ\bÿZ^ÿORá.1â/2Þ,,öDDç55Û++Û-,ê>>Û33×34ÿcfÞ=BÊ+0Ê.2À')Ô::àBCÚ7:Ø24ß9;Ü89Í/.Ë30Í<9ÒGDÝSQëaaõilôeké^aÂA<ÅF?ã^Y÷igÿppÿkjãKJÖ>;Ç4-Î>5ÕE<ÓC8Ó?5Õ=2×:1Û30î5:ð,6ð,6ñ-7ï,4ë,3ò:<ýKIÞ2.Ú3+Ø4+Û4+á4-ç4-ì3.ñ1.ô02õ.1ö.0ö..ô.-ð0+é4+ß7,Ø?1Æ8*´2$±9+ÀNDí|vÿ’Žþ‡‰ÿ‰þv„øk{øatûUmýIfÿ=aÿ:_ø6YñB_ÝNbÁV^p/)\?-YW>]mHe}MkŠQq’Ys–\s™^wŸcy¡cx btž_tž^u^u^wž_xŸ`{Ÿaz¡by¡bz¤dz§bz¨`y§\y¨Z{ªZ|«[«^ƒ®f†¯k†ªm…¦qƒ rz•lq‰idwcZj]QaT^O:^O:^O:^O:^O:^O:^O:^O:]N9]N9]N9]N9]N9]N9]N9]N7^M3_N2_O6]N9ZN>XNBYRLYSS^Y_ebmrnyt‹{u‘yr‘wp‘tp‘ps’pyšt}¨v€µy‚Ã}…΃ˆÙŠ‹Û“Ù—‹Ë™†´ ƒ¡©ƒŽ«~yžkZšQ>ºNAÓPHáVQëWUðRQðJLí?Aå58è8:å99Þ:8Ø=8ÑA6ÈC4ÀA0º?/³9,¹@5«5)¢.!¼J?×g[ÖeWÉUH·=0µ5(¾4'Í;.ØAÔ:<Ð7:¸!Ä()Û;;æAEÝ47Ö,/Û14Ù03Ì'+Ñ34ãJLôbcùhköciõ_hù_k÷ajÔMJÓNGç\YçVSæNMáGEÎ31Í4/ÖA:ÞKCãPFÝJ@ØA6Õ;1Ô6-Ú.,ô19ú,9ø*7õ'3ô(3÷07ü>@ÿJIß0+Û2+Û4+Û4+á5+æ5-ì3.ð3/ô01ö.1ø-0ø..õ--ñ0+ê3+á6,Ù=0É;-³1#±7*¹D;êysÿ‹ÿˆŠÿ{‡þp€õgwõ^qøRjùEbÿ9^ÿ7]ù7ZïGaÏO^¡HJd4(VD.ZZ@^lIe|NkˆRs‘[t•\wš`xžcx bu^rœ\rœ\s›\s›\uœ]wž_zž`y ay¡bz¤b{¦_y§^x¦[x§Wy¨W{ªY}©\‚¬b…¬i†ªl‡¨qˆ¥uƒžs|”pu‰pm~kevd^O<^O<^O<^O<^O<^O<^O<^O<]N;]N;]N;]N;]N;]N;]N;]N7`O5aP4`P7\OÎbUÓgZÓeVÃO@¸>/¸4'Æ8,Ó9-×5*Þ3+ä6/à2+â5.ß7.Ü8,à>1åC4â?0Ý3$å5(è0(ï2.ï--í-,ñ01ò67öBEöMPûX[éFIôQT×47éFIÜ89äABÚ78Î.0Ï12âHJÑ8:Í78·"$Ô;=Û89ã;;é<@ç6<à-3Ý*0á29çâKDæRHèTJßKAØ@5×:1Ù80á32ó.7ÿ0=ÿ/<ú*7û-9ÿ:BÿBEúBBà1,Ü3,Ü5,Ý5,à4*å4,ì4,ñ40ô01ö.1ø-0ø..õ--ñ0+ê3+á6,×;.Í>0µ1$±7*²;3çtoýŠ‡ÿ†Šÿvƒüi{òarò[n÷PjùBaÿ8^ÿ8_ù;_êLe¾NZ~86]=.LF.UX=ZeCcyKh„QrŽ[v”^wš`yŸdwŸarš[o™Yo™Wp™WqšXr›Yt[wž_xŸ`w ^x£^y¤]y¥Zv¥Wu¤Tw¦Ux§V}©\‚¬b„«h„¨j„¥n…£qšmx‘ip„hj~cbv]_P=_P=_P=_P=_P=_P=_P=_P=^O<^O<^O<^O<^O<^O<^O<^O:bR9aQ7`Q<[O?ZPG\TR_Za`^lsq‡yx—€€¦‚®}}¯xx®wv¯vx³t|»w€Á{…ˆÁ…ŠÁŒ¿•—¾¹«§¸´­´¾³¯Æ¹©Ð¾¦ÕÁ Ñ»”Ьˆ¯oS®\F¤G5¨>0ÁG<ßVPïWTðNLè@@ç==æ<<â=;Ý>:Ö=5Ï;1Ç9/Á80À=5¶:2·>5ÀPDÅYLÅ^OÏeWÒdUÂL>º:-Ã9,Ð9.Ö3*Ý2+ä6/ä6/à3,Þ6-ã=1æB6åB3á:*Þ2$é4)å-#í0*ï/,ï20ð42æ.,â22æBCôX[óWZÿosãDHèGLÞ=BûZ_ÿptÝ>Bÿ}€ÿnpêQSÓ=>Å02Õ;=òHKí:>ï8=÷>Dò7@ç.6ô?Hÿ]gÿltÿjrþck÷]eù]hþ`nþ]löYbò\]âOHáIFÒ73Ð1.×52Ò0-Ø93ÞD<áJAáJA×@7Ò5,Õ4,Ü71æ74è&.ù0:þ2=÷+4ù08ÿ>Bý?Aë52à3-Þ6-Ý6-Ý5*á3*å2+ì4,ô41ö01ö.1ø-0ø..õ--ò/+ë3+â6,×9-Î?1µ1$±5)¯6.çplý‡…ÿ‡‹ÿoücwñ\oòYm÷OiûBbÿ9_ÿ]P?^Q@_RA\O>ZM<[N=^Q@`SB_RA`Q>cT?_P;]P@\RHZPNZSZd`orp†wx—y{¢~€°€·}ºwy¶qr²lo´rxÆv|Ê„ȈÅ•˜Á¤¤¼±°¸¼¹²ÊŲÑÌ®×ϪØϤÛТÜРÙ˚ØÁ•Ñ¨ˆ¶€f ^FÊyfÕtd¼G>ÖQLöb`èJIã?>á99â:9à;9Ú64Ø61Õ:5É91¿6.ÅB:¸<2¾I?ÄXK¶O@ÌeVÏdTÉXHÃH9Ã;/Ê6,×6,ß6/á4.Þ1+Ý2+ß7.ã=1à<0Ú7(Ü5%ã7)ä/$ç/%ì/)î1+î3.ë40ç4/â62Ö66åKMóX\ëOS×8=Õ6;øW]ÿ~„ÿ~ƒÿpuÿhlÿimÿgjó]_ïY[ú[_ÿVZÿCJú8@ú6@ö2>ì,7ë0;ð?X0=V/:S,YL;[N=]P?^Q@]P?]P?]P?_RA`SB^Q@\O>]P?`SBaTC`SB^Q@dWF_QD\OF^TR`Z^c_mmkuv•vy¢y}­}€·x|¹quµkp²lo´mq»uwÎ{}҇ŠÑ–˜Ë§¦Å¸·¿ÇŸÒÏ°ÚÖ©àÛ¤äÞ¤ãÝ¡äÛ¢âÙ¢ÛўÔǚһ™»œ€¦|cċwÉ}m³UIÑ`XõqmìZZæJKâ>?æ>>é?@å;;à66Û64Õ<7È72Ê?8·7.¶=2¼L>´H;Æ\LÚo_ÒaQÄI:º4(Ã0&Ó5,Ü5-Ú/(à40â94ä=5à<2Û7-Ù5)Ý5(â5'ë6+ì4*ì1*é1)æ1*ã2*à3,Ú5/Ó86×>@ãJLòW[ù]aû\aü\dÿ`hòRZíMUïRYü_fÿjpÿgjóZ]ñNSì38ð+2ó+5õ-7ï'4ä ,å&5ì6BûPYþZcÿcjÿemÿemÿblüZeõQXäEBÜ=7Ù53Ý52ß63Û2/Ú2/Ù6/Ý?6Ø>4Ö<2Ô:0Ù80Ý82â94ç:6è88é69ë78í68î87ê65å3/Þ1+Ü4+Ü5,Ý7+à5+ã2(é1)ð0+õ20õ12ö/2÷/1÷//ö..ó0,ì4,ä6-Þ>2Ò>2Â8-µ2(¶71Ø[Yÿúszþeyÿ]uøVnöOiùFdù@`ú<`óAaäNg¹KVx;6K1 ;9":C(EG/OS8Vd@^sHlƒUt\v“]q“Wo“Um”Qi’Nj“Ok”Pm–Rn—Up™Wr™ZsšYsœVsUtžVsŸTsŸTržQpœOo›Pm—Mk“MhŒL`‚EWv=Lh5D^.>X)=V,>W-?X.XK:[N=]P?^Q@]P?]P?^Q@`SB`SB_RA_RA`SBaTCaTC_RA]P@bUL[PL[QP`Y`jdrqm„vu•y{¤w{«x}´v|¸ns³di­`g­im¶ruÄ|~Յ…Û–•Ù§¨Ø»¹ÏËÊÆÙ×¾äá´èã©íè¦îé¥ëæ¤çá¥áÚ¤×Ï Ëܶ°§›™ƒk§ƒm§o^›QDº]UÜlh÷usî`^äJJäABéAAë??è8:â66ß=:Ó;6ÒB:Á80·7,·?1­<.¶G6ÙjYÞj[Ù[MÇA5Å2(Ï5+Ù6-Ø1+Ý52çB>êG@ß<3Õ3(Õ1%Ú2'Ü0$æ4*è1)æ/)ä/(ã2,â7/á=4ßA8Å-(É32ÙCBîUWø]a÷[_óS[ðPZçGQèHRîNXú]dÿmsÿntóX^â=Cè/4ò-4ù1;ü3=ó+8ì(4ô5DÿJVôIRôPW÷X]û_cÿdiÿ`föQXèBFÝ86Ü71á85è<8ê=9æ95à40Ü5-Û:0×;/Ö:.Õ9-Ú7.à91æ;4é<8ã:7â96ä86æ87ç:6å84à5.Ú1*Ù5+Ú6,Þ8,à6)ä2(ë0)ñ0)ö0-ô22ó12ö01ö0/õ/.ò1,ì4,ä6-Ü:/ÚC8Æ9/º4+´0,á__ÿ„†÷ktþbwýVpúPmýKküCeô;]ñ<_éIeÓRdœCGk<4O>,==%9?%EE-FI.Q\:YkCg}Oq‰YrYpTlOiMgJh‘Ki’Lj“Ml•Qn—Uo—Xo˜Vt›XsUrœTq›QnšOl˜Mj–Ki”LdG`‡D[ARt8Ki3D`-?Y)>U'B\-D^/Ic4WJ9YL;\O>]P?]P?]P?_RA`SB_RA_RA`SBaTCaTC`SB^Q@\PDYNLZQV_X`gcrqm„ut”xz¡z|­v{²syµjr³bi­\c«`g¯lr¼v|ȈŠÝ”“㣣㵴àÆÅ×ÓÒÎßÝÄçä¹éæ¯íé¬ìè«çâªâܪÙÒ¨Ëߺµ—¤¤Œ™˜ƒ“ˆt—€n˜qb›cV²h_ÏrkúŠ†ôtqê\[åKKçDEê@Aì3Á.&Ã3+Î:6ØDBÜFGÞEHãFMéLUîQZóV_õXaø[dÿhpÿnsòY^Ý:?é26ð/2ñ.4ð+4ê&0ë)4ø=HÿS^ë@HæAGçFKòQVÿZ^ÿW\óFLã68á53ã81ê;8ñ?;ò@>î<8æ93à70Û8/Ø:/×9.×9.Û8/á81æ93è;5â:7ß:6á96ã:5æ:6ä92Þ5.Ù2)Ú6,Ú8+Ü9*à6)ä2(ë0)ò/)ô1-ó32ò12ô01ö0/õ/.ò1,ì4,ä6-Ú8-ßG<È8/¾3,´-*ìfgÿy}öirÿcxüTnýJjÿHjþ>cò6Yè=]áQhÂXb‡A?eC7YN:GG/AC+JH1DD*KU3Sc>btJkƒSoŠUnRjMhHgHfHgJi’Lk”Pl•Qm•Vn—Ut›Xs›UpšRm—Oj”Lf‘IcŽFcŒF_†CZ@Vxdÿ9`ô8[æFbØ[kªUZvD=bK;_YCQO:KI4PI6FD-FO0L\8ZlDe{Mm…Ql‰Ok‹JgŒGfŽGfFg‘Ih‘Kj“Ol•Qm•Vm–Tr™Vp˜Rm•Oi’LeŽHb‹E`‰C_ˆDZ@V}>St;Pn8Ok8Qk;Wn@YpBUp=Ur]QA^RB^RB_SC`TD_SC^RB^RBaUEaVP^Vaje{xt}yšzy¡wx¦ux­rx´iq°bi­[c«\d¬go¸u}ŀˆÐ†Ñ—œÜ ¥Ý¯³ã»¿åÄÈáÌÎÛÒÓ×Ö×ÑÙ×ËÙÖÇÖÐÄÐÉ¿Ìüù·³©ª£š›‰Š…wzsvvnulcleogŽbY›`X¿rlÖyrï{û{xÿqoýccõRSïGFïC?ç>7ß<5ßB9Ï;1ÑC9ÝUIÁ=0·5'¼:*Â=.Æ>.ÏB1ÖE4Õ?0Ï7*Î3/èMKú_]òWSßE=Ø:1Û8/ß8/ä91å9/å81à90Ú9/Ñ9,È9+Â9)°)·2!È@2ÒH=ÒE>Ë;:É78Ï:>Ï8AßHQìU^ðYbô]döagéTZÚACã?=ë?;ñAAúHHÿMRÿQVÿU[ÿW^Þ39Ù/2Ú03æ8:ô=Aø;?õ47ñ01ì51ì94ð95ì51ê1.é3/å3/á4.ã<4ß<3Ý<2Ü;1à91ã81ç51ç51ç98æ87è96ê86ë95ç83â5.Û3*Û7+Û9,Ý:+Þ6)ã3&ç1&ï0(ñ1,ð42í42ò21ó1/ò0.ñ1,ì4,æ5-à90Ø;2Ì70À/*ÐBAþosükröbnïQhõHfý;`ÿ5^ÿ5_û?bãMfÊ\g‹GFiE9\M:\WAWR>QJ7OG4ID.DJ.FV2Sc<]sEgKi†Li‰Hf‹EeFdŽDeGg‘Ii’Nj“Ok“Tl•So–Sm•Oj’LgIb‹E`‰E^‡C^‡E[‚CZ~AVw@Tr>Tp?VpA\sG^uGYtAWt>Vs=NB2QE5TH8WK;XL6æE=Ö<2ÚF<ê\PÄ:-Á<-¼7(¾6(Ç>.ÏC2ÑB1ÓB1ÕA3Ð83Ö>=ÜDAÚB=Õ<6Ô70×6.Ü8/ã;2å:2ã:3ß;2Û>5ÕA5ÐD5ÌG4®-»:$ÍJ6ÐK<Æ=3º/*¿10Ê9<ÕBJßLTëU^íZbï\dëZ_ÞMRÓ>@Î3.×6.à;7è@=ðCEóEGñBGì?Câ59ß26ã36î7;õ79õ13ú.1ú24î3.ï82ð72é0+ç+)ç0,å2-à3,ã<3à>3Þ=3ß<3â92å82é62ë52ê67ë46ì44í55î64ë52â4-Ü1)Ý7+Ü8,Ý:+ß7*á4&æ1&ë1%î2)î52ì42ð31ò2/ò0.ñ1,ì4,æ5-â;2Ñ3*Ò;4Æ2.çUVÿqvöckðZfåI_òEcÿ9`ÿ0[ÿ4aÿBhÛMc°OVj5/]F6WL8TO9YQ>TI7LA/ID.@F*@O.K[6Uk=`xDe‚Hg‡FeŠDbŠCc‹BcEeGfKh‘Mi‘Rj“Ql“Pj‘NgŽKd‹HaŠF_ˆF^‡E^†G_…H^G\}F\zF\xG^xIaxLczLZuBYv@Yv@IB2LE5QH9SJ;WK=XL>[O?]R@dWFcXFcXF_VE^UFaWMf]Ticewrˆyu˜wuœsržrr¤ru¬ko®af¨Za§^d®fl¸ms¿v|Ȁ†ÐŒ’Ü–›Ýš¡ÕŸ¨Ó¦­×­²Ü¯´Ü°´Ú±³Ù´´Ú²°Õ²®Ñ­§É¨¡Ã¨žÀ£™»–‹­‡—{xƒcadhdebZXi[Xzc]wVMcZ‰MC¡TJº`WÖkcïxrÿ€zÿzwÿniý`[õSNæGAìOHÜB:ÝF=éVL¹+¾2%¾5%Æ>.ÏF4Ê?,Á2!È7$ÙE7ÝF?Ò:5Ê2-Í6/Ó:2Ö<2Ü;3á=4ä<3á90Ý6-Õ4*Ï5)È9)Å<*Â?+ÔS>ÇF1½<)¾:+Â<1Ã:4Á63À43ÛLNÜMOàOTåTWçX\åVXÙMNÓD@É5+Ð6*Ø7-Ü5/à21ä14å05æ.6ì4<ì3;ñ6?ú8Aü3=ú+5ÿ)3ÿ07÷,0ø46ø46ð./ë*+é0.ç40â5/â;3ß<3ß>4à=4ä;4ç:4ê84í74ë33ë33ì23í42ì42ç4/à2+Ù1&Þ8,Ü9*Ý:+Þ8(à4&ã3$è2%ë3)í60ì51ï31ð3/ñ1,ï3*ë4,ä6+ã<3Ì.%×>8Ì43ùceÿoxö\hîOaèD\øEeÿ;cÿ1[ÿ6aöGhÈK[“CFR,!VI8RM9NI5YQ>SK8F?-GG/=D%?K'GU1Rd:]sDc~Ie„HeˆFb‡Ba‰BbŠAcEdGfKgNhNj‘NhJeGcŠGaˆE`‡F`‡H`‡H^G]€F_}G_{H`{Ha{Ke}Mf~L[x@[z?\{BAB4FD7JF;NG=RH>VJ>ZM=]P=`Q<^R<^S?]VDaZPgb_nimrp~vq‘zuž{x¥yw¨pp¦gg£`a¡[^£_a«dg´opÀyz̄‚Ս‹ß•“盘域ݟ Ö¢¢Ø££Ù££×¥¢×£¡Ó¤ Ó¤Ð¢œÌ šÈ ˜Ç–—Ž¹Œƒ®ƒ|pn{hfic_^e[YkYUqVO|VM‰WL’RH¨ZP³YP¿ZRØkdêyq÷‚{ÿŠ…÷vqývsë`]ßPLØD@ïZTË80Ã3(Ä6(Â6%À7%À7$Ä9&Ê;*Ï>-Ô>/Ð8+Õ;/×?2Ó;.Í5'Í4&×9-â@5à:.ß9-Û7+Õ7+Ï7)È;)Å>*ÄA-À<-Å?3ÊD9ÍG<ÌC;Ä;3»2,µ,&Å<6ÏF@ÙOLßVPãYVáXR×NHÍC9Ì;(Ó;&Ú8)á5+ç/-ë*/ð(2ò(6ù,=ù+?ú+?û*?ý(>ÿ&>ÿ$<ÿ$:ÿ$8ÿ(9ÿ+:û+8ó+5ë.4ç55ä;8Ý82Û:2Ü;3Þ;4ã:3å82è62é62ë33ë33ë54é62ç51â5.Ý5,Ø4(Û9*Û:(Û:(Ü9&ß8%â7%ã6%æ4&ê5,ì5/ï4-ð5,ð4+í5)è6*ã7)Þ:.Ö8/Õ:5Ú>?ÿlvÿbqúThôH`ÿKhõ6Xÿ5\ÿ=dö>båOh®JT]#!C-=:'GF2ON:OJ7DC/=B.>G,BH$EL#HR-R^8ZkAawIdLdƒJa…E`ˆAa‰@cŒ@eDgHj‘Nk’Oi‘JgFeFc‹EcŠGdˆHb†H`„FbƒJbHa€GbGdHdHc~Ga}C[{<\=_‚B;?1>B4DD:IEQG=XJ=[N=_P;]Q9\T?^WG`[Uecfmkxqo…so”sptq omŸgfŸ``œ\]žZ]¢ce°ik¸trÅ}{υÖŒˆß“å—’䘕ؙ˜Òœ˜Ó™Ö™Öœ˜Õœ–Ò›•Ñ•Ð›“Ìš“É™’ƘÁ‘‰¸†«xšskzlcfe][d[VhYRmWLzVJ‰UHšVK¯]RºYRÀYRÑf^Ýpiávnë~wú‡„ÿ‡„övsífcâTRëZUÆ3+¿0"Ä6(Ã7&À7$À7$Ä9&Ç:(Í<+Ò<-Ò9)Ô8)Ó:*Ñ:)Ñ:)Ð9(Ô8)×7)Ý;.Ý9-Û9,Ö9*Ï9(Ç:&Á:$½:&¾6*Á8.Å<4È?5É@8Ç>4Ä;3À:/½4,Ä>3ÑH@ÕODÚQIÕODËB:Á7*É8#Ñ9"Û8'å4*í0.ó*0ù)6ý(:ÿ+?ÿ+Aÿ(@ÿ'?ÿ#=ÿ!<ÿ;ÿ9ÿ9ÿ!9ÿ%:þ);õ-8ï29ç79å;;Ü94Û94Ü;3Þ;4ã:3å82æ72é62ë33ë33ë52è62ä71ß7.Ú6*×5(Ù9)Ù:'Ú9%Ú9%Ý8$Þ8"à7"á6$å4*é4+ê4)ë5*ë5(ç5'ã6&ß8(ÞR+$@4&69&9<)@A/DA.@?+:B+>G*=DJQ%Zb;dpJfvOezQd~Od‚LaƒFa†A`‰=b‹=eDgHkKl‘Lj’IhGeFdŒEf‹HeŠGd†Ib„GdƒHc‚IbEbEd€FeFcDaA]€>_„?b‡B4:,9=/??5DA8IB:ND;TH)?=&>>&?B#?FW`1s~T}Œcvˆ^hSa}La€G`ƒC`…?`‰=cŒ>eDgHkMkMk“Li‘HhGgŒFgŒIf‹HfˆKd†Ie„Ic‚Gc€Fc€Fd‚FeƒGd€Eb€Bb‡DbŠDeG06(39-:;3>>6D?9KB;PF-Ê7'Æ0!Ñ5(Ñ5(Ò4(Ð7)Ï9*Ì;*Ç<)Ä;)Ã9,Ã9,Ã9.Ã9,Æ9/È1ÒE;ÒF9ÎA7É=0Ê=3ÎB5Í@6Ì=/Î5%×5&â6,ë40ñ.2õ,4ø*7ú*:÷&9÷&9÷&9÷&9ù&9û&:þ%:ÿ$8ÿ"7ý"6ú&5ù-9ö4=ð9>ç9:ß76Ü94Û94Ý:3ß:4ã:3å82è62ë52î45î45ì65é75ä71ß6/Ù5+×5(Ø8*Ö9(Ø9&Ø9$Ù8$Ú8#Ü7#Ü7$Ù6%Ù6%Ú7&Û8'Û8%Ù:'×:'Õ9*Ö:.Ð3,éIKÿoyÿVh÷E_ö=]ÿAfÿ3[ÿ8_÷?cçMiÅPc/:G@1*02%,7&4=*=B,@@(@!HE"T\-o}JŸp–©|‚˜jiƒT_{H]~E^ƒ@a†@b‹?fAhGj’Kl‘Nl‘Nl”Mj’IhGgŒFgŒIgŒIg‰LfˆKe„IdƒHdGd‚Ff„Hf„Ff‚EcAf‹FfŽHj’L,4'06*690;<6A>9E@:KD:OG-È<-È<-Èý.>ÿ/=ÿ.=ÿ.=ý)8û(7÷+7õ0:ñ7<ë8;á77Ù42Ü94Û94Ý:3á:4å95æ74è64ë54î45ñ56î66ê65ä71ß6/Ù5+Ö6(Õ8)Ô9'Õ8'Õ8%×8%Ø7#Ø7#Ø7#Õ8%Ô9%Ó;&Ó=%Ô=(Ó>(Ò=)Ò<-Ð6,Ù;8ÿ^dÿanÿOhô;ZÿBgþ5_ÿ5^ú0VóLjÚZq•?LY&+B**83/+1'.9+5A-:B*9+Ì=,Ó@0ÙA3Õ=/Î8)È5%Ç8'Ê=,Ç:)Ç;*É;-É<+È:,È9)Æ7)Ç5&È6)Í;,Ò>2Ò>0Õ>3Ô>0Í6+Ç-!Ð+%Ú-)ç10ï26ö1:ù/;ü/>û1?ù0@÷1>õ1=ô0:ö.9÷.8ù+7ù+7û/:ø.:ô0:ð3:ì59å78Ý54Ø42Ü94Ü94Þ93á:4å95æ74è64ë54ñ56ò67ï77ë76å82ß6/Ù5,Ö6*Ó7*Ñ8(Ñ8(Ñ8&Ó8&Ô7$Ö7$Ó8$Ï8#Í;$Í=#Ì>&Í?'Í?)Í?+Ð<.Ð50êGHÿgpÿPbÿHeù7ZÿAjú/Zÿ7_ð4UáQjºUem19E(*C7754034/39/4=*2:"18ACh`9„‚RŸ®w¨À†µÎ—¬Ç’’®{v”`d…N_ƒE]…?a‰@gDl•Go—Np˜Qq–So”Qo”Nk‘HgŒFf‹Ef‹HhJi‹Ni‹Ne‡Kc…HdƒGe…Fg‡HhˆGg‡Fd‡CjIi“Km•N%0"*2%/4-36/672:95?<7B?8IE1×?1Ú@4ÚA3Ö:.Ñ0&Û/+ä22í57ô5<ø3=ù1>ø0=ö0?ð.9î.9í/9ì/6ì-4ï,2ñ*1ñ*1õ2:ó4;ò5;ì59ä46à44Û62Û83Ü94Ü94Þ95â96æ87æ66è66ë46ò59ò59ð67ë76å84ß6/Ø5,Ó5)Ñ8*Ð9(Ï9(Ï9(Ð9(Ð9&Ñ8&Ð9$É9!Ç;"Ç=#Ç?%Ç?'È@*Ë>-Ï;/×96ûT[ÿ^nÿH`ÿ?aÿ:aÿ7dý4`û9^êFaÃN`ˆ?FQ12@64@::956>64;607:)3`ˆ?gDm–Hp˜Op˜Qn•Rm”Qn“MjGf‹Ed‰CeŠGgŒIhŒNhŒNe‡Jd†Ic…Hd‡Gf‰GgŠFf‰Ed‰Ci‘Jj•Mn˜P#. (0#,2(.3,241553984<;6FC*½:&»6#½4"ÐC2âN@äN@×A3Ë7)Ê8)Í>.È;)Ç:(Ç8'Å6%È7&Ê7'Ë8(Ï9*Ò:,Ô;-Ò9+Ñ5(Õ7+Ú<0Ý=1Û7.ç85ð9;õ;@ø9Aø4@õ/<ñ-;ì,9ê/8é19é27ê37ì46î45ò46ò46î47ï6;ì8;é69â45Ý33Ü73Þ;6Ü94Ý84à85â96æ87æ66é56ë46ò59ó6:ð67ë76å84Þ71×6,Ð6*Î8*Ì9)Ë:)Ë:'Ë:)Ë:'Ì9'Ë:%Ä8!Â: Â%Â@(Å>*È<-Í81Þ;>ÿ]fÿRfÿIeþ8\ÿ>hø-Zý=fç=Zã\m£LT]--F93BC><87>56C34A4.<;)fCl•Gp˜Op˜Qn•Rl“Pm’LjGf‹Ed‰DeŠGgŒIhŒLhŒNe‡Jd‡Gc†Fd‡EgŠFgŒFg‹EeŠDj”Lk–Nn™Q(0!'/"(.$).'.0-2206729:4==5?@8DE?IKHORWUWdY[p\]{YX€YZŠ]^”ce¢mmµvwÇ~€×„ቌ뉌퉉酆₂Ú€Ó‚ÑƒƒÍ€ƒÆ€„ăƒÉƒƒË…‚φƒÐˆ„ÑŠ„·€Ãˆ€»‡€¬„}ž€y‹upwjfee^Vl\Ok[Kh]Ke_Ib`IcaHf`Fm_DlP8„V?¥]O¿aWÐYUÛQQíRX÷\`øieæYPÔD;Î7.Ñ7-×;/Ö=/Ó<+Î8'Í:&Í:&Ï:&Ò9)×7)Ù5+Ú6,Í/$Ë3&Ë9*É=,Å@-Á@+¾=(¼9%Á8&¾1 éWHßK=Â. Ï=.Ì=-Å8'È;)È;)Ç8'Æ7&Ç6%È5%Ê4%Ì4&Ð7)×;.Û=1Ü<0Ù7,Ù7,â>4ìC<õCCñ8=ð3:ó4<õ3>ð.9ë-9ì2=ê7=ä5:ã57ä67é99î:9ð86î64ï;<ë;;é99æ87á85ß74Ü73Ü73Ý84Þ95â88æ::è:;é9;ì8;î7;ó6:ó6:ï77ì87ç;7ß:4Õ8/Ï7*É7(Ç8(Æ9(Æ;(Æ:)Æ;(Ç:(Æ;(À8 Â>%½;!µ5»:$ÉD1Í?3É0+ÿ^eÿVfÿIbþ;[ø2Võ1Yú7aóCgåZoªFNm32K2+@@6>C<>96>./J03J2.@9&BI'Xn=}›_›¸v§ÄªÈˆ¼€—¶}“±{Ÿmd„RVw@Xz=]€hŽCm“Fl”Kk“Li’Nj‘NhHeŠDa†Aa†Ad‰Ff‹HfŠJdˆHg‹Kg‹Kg‹KeŠGeŠEdŒEjIk“Jo›PoRr U)/!)/!(.$).'-/*02/450782;=2=?4AD;GIDLPSSV_WXjY[t[Z|]\†bb”jk¤ttº}̆†ÞŠ‹èŒŒì‹‹íˆˆè…„ကÖ}Ѐ́É„…ƃ‡Æ†‡È‰ˆÌ‰ˆÎŠ‡Î‹…Ë‹…ň€»‡°„|¡€x{s~tkljc]d^Rd_Ld_Kd^He]Hh]Gh^Ei_Fm_Dt_D~Z@‘XD«YKÇVNÜRPõRWþX\îUPãLEØ>6Õ7.Ù6-Û9.Ú:,Ö9(Ð7%Ð9&Ð9&Ñ8&Õ8)Ù5)Ü4+Ü5,Í1%È4&Æ9(Å>+Ã@,Á@+¾=(½8%Á8&Ê;+ãQBÜH:Ç5&É:*Æ:)Á5$Ê=+É<*Ê;*É:)Ë:)Ë8(Í7(Ï6(Ò6)Õ7+Ø8,Ö4)Ô0&Ø1(Þ7.æ;4÷CDñ8=í07í07ï/:í/9é1;é5>ã6:Û25Ø22ß:8îEB÷JF÷EAñ?;ç:6å97ä86á85à85à85à85à85ß74à85å99ç9:é9;é9;ë8;î7;ð69ï58í76è96ã:5Ü;3Ò8.Ê6*Æ8*Ã:(Â:*À;(À;*¿<(À;*À;(¼:$À@'¸:#²6¸;'¿;,È91×==ÿ]fÿPcþ@Zù8Wõ7Yô;]ó?dãIeª?Iƒ?>];2E;/8>07?2E<7Q>:N0.Q9/VK5bjCvŽZŒ°pœÁ{ Å—ºz™¸˜¶€ŒªxrŽ^WtDSq=\{@^~=b†>hŽCl’Ek“Ji“Kh‘Mh‘Mf‹FcˆBa†Ab‡BeŠGgŒIg‹KfŠJhŒLiŽKhJeGdŒEfŽEi‘Hl–Lo›PoRqŸT-1",0",/&,/(-/*/1,25.36-8<.:>0?C5EH?KMJQRVUUaUVh\Yt^]}edŒnn yy·ƒƒË‹ŒÞêŽìŽëŠ‰æ„„Ü€~Ñ~{Ê}ƀņƆˆÅŠŠÈ‹‹É‹‰È‹‡Ä‰„¾Šƒ·ˆ¬…{ uŽzotimne`h^Tb\L]`K]aJc^Hg\HkZFm[En\Fo^DwbGxY=…S:¢UCÆWLàUP÷NQýOQâ><Ü=7Û81Ý6.ß7.ß7,Ý7+Ø6'Ó6%Ñ9$Ñ8&Ó8&×7)Û5)Þ3+Ü5,Ê4&Ä6(À8(À=+Á@-Á@-¿<*À8(Â4&ÛI<ÚF:ÓA4Ì=/Ã7(Â:*¾7$Å:'Å:'Ç:(È9(Ê9(Ê7'Ë5&Í4&Õ9,Ô6*Ö4)Ö2(Ú3*Þ6-ã;2è;5ï;<í49é06ì18í4<ì4<è7?ç3Q?1DA06=+48'>6+K9/E-!R=*e^Aˆ]‘ªs•¼{•Ày•Ày‘³w›·„˜´ƒšm\uKGb5Mi8[x@_}?c„?hŒBk‘Dj’Ih’JeIfKcˆCc‡Ac†Bd‡CgŒIiŽKjŽNjŽNhLiMhLfIeGg‘Gk•Im™Lr¡Ss¤Uu¦W13%04%/2'/2)/1,02-14+25*8<-:>->B1CG8HKBMOLQRVSS]XVd[Ynbb~mm“ww«‚‚‹‹ÕŽá”‘ꐐ莋⇅؂Ì|Ã|¿½‚‚¾…†¿ˆ‰ÂŠ‰Â‹ˆ½ˆ„¶…­ƒ}£„zœuxm}qflmb`k^Ui[Nb[I]aJ]aJc^Hg\HmZIqZHr\Gu]ErX?wR8‰S;ªYDÍ\NâSMïEFñ>AÚ1.Ù4.Þ5.á6.á5+à6)Ý5(Ù8&Ó6#Ñ9$Ñ8&Ñ8&×7)Ù5)Þ3+Ù7,È6'½8'»8&»:'½>+À?,Á<+Ä8)Æ4'èTHÑ=1Ë9,ÏA3½4$¿<*¿<*À9&Ä9&Å9(Ç:(È9)É8'Ë5'Í4&Ò6*Ó3'Ô1(Û4+â92ç?6ê?8ê=7ç55é58í6:í6;è38ã28á6<á<@ñVTûc`ÿmhÿhcòUPãA<Þ71Ý4/Þ71Ý60Þ71Þ71ß82á83ã:7æ:8ã77å78æ89ç9:é9<é9<ê7;ë6;î5:ì57é77å97Þ;6Ö<4Ì9/Â8+¼8)¹:)¶;)´=)³<(±<(³<(³<(±:&´?+¬9&«8%²:,«+"Â42û`fþTaøG[ïWG7JC0ED/AD/;?(97";3>2OF)kkEˆ”f•¬t‘´tŒ·r¹wœº„ž¸‰§}kZJ`:@V/Lc7Wr=_{@bƒ>g‹AjCh’Fe‘FbHcŽGa†Ac‡Ad‡Cf‰EhJkMm‘Qk’QiMiMh‘Kg‘Ig‘Gi“Gm˜Io›Lu¤Vu¦Ww¨Y78(58'57*56.56056057,68*;>+,Å<,Æ7)Ï8-ô\QÖ>3È4(ÍA2¸3"¶9%¼?+¿:)Ã:(Ä;+Æ:)É:,Ë9*Î7,Ï7*Ï2)Ò1'Ô1*Ý6.å<7ê?8è;7ä73ç85í;;ï;<é69â25ã68çCDëMLÿyuÿqlñ`[ÝJCÐ71Ð3,Û83ç@:Þ93Ý90ß80Þ7/à72â62ã75å76å78æ68ç7:è8;è8;è8;è7=é6:î7;ë78è88ä;8Þ<7Õ<4Ê<2À:.¸9*´;*°;)¯<)¬<(«<(«;'ª;'ª;'«>*¤9'¦8'ª8-ª/(Ê@@ÿgoôN\óHZíDWäGZØN]ÈS[¶SV™XRcN=NM8JH3HF/FD+?B%=D#>H#KV.\gO/AR0Mb9Vl;_{Ac‚?i‹AjCg‘Ee‘FaGbFa†Ad‡Cf‰Eh‹GiŽKkMk’Qm”Sj‘Nj“Oj“Mi“Kh”Gj–GnšKožNu¦Ws¦Wt§X<=+<=-<<0;=2;<4;<4;=0;>->A,@D+BF-FJ1IL9MOAPPHRRHWXJZZN^^\ffpnn†yx ƒ€µ†„όюÓŒ‹Ïˆ†Åƒ€¹|z¬zw¦yv¥zxªzz®}®~©} ~z•|t‰yq€tjrpfem`Zj\QjZKl[Kl[Ik\Ih]Kf^Kh]Kj]Lm]Mq^Mx]L€[I‘aM™VE¦O>µJ:ÅA5Î7.×0(Ý0)à5.á6.â5.á3*à2'Ý3$Ü6&Ù:'Ð8!Í;"Ì<$Í;$Ñ:'Ô9'Ø6)Ò:,À=)³:%®5 °6!¹:'Â=,È:,Ê6*Ø>4÷ZQãI?Í9-Ì@1·6#«4´='»:'¿7'À7'À7'Ä6(É7*Ë7+Ï7,Ù<3Û:2Ý:3ã<6ç>9é=9å84á40ç:6ê;8ê::æ87ê>>õOOÿccÿpmùhcâUNÇ<5¿0*É4.Ö;6ß=:à;7à;5ß;2à91à70â62ã62ä65å55ç79ç79è8;è8;è8;è8;ç6<ç7:ì8;ê88ç98ã;8Ü=7Ó?5É<2¿;.³8(¯:(¬<(ª;'¨;&¦<&¥;%¤;&£='Ÿ:&Ÿ:(Ÿ9*¡5)µ>8ÚTUúdmíKZîIZèI[ÛMYÇRX´VTŸYQˆaPOH5FN7KI2F@(;648=N"Kg6j‹Tv•\ƒšbˆ›cŠ›d¢j“¬r—°yƒ•kn}\P_@+ÉE6ÌB5É?2Ê>1Í?3ÔA7ÛD;àF>á?:â=9á96à74á53â64å97å<9â?8Þ=5Û94Þ?9èMHèQJÐ@8¶)"¶-%¾5-È>4Ï@8Õ=8Ù<7á<:æ>;á96á:4á83ä84ä84æ95è96é99é77ê88è8:è8:è8;ç9;æ8:å79è58å55á77Ý97Ö=7Ì>4Á;0·<-­:(¨;'¥<'¢;( ;'ž;&:%š;'—@,Š5!—>.–9*–/&Í\Xöx{ßX_äXaÙQ[ÈKQ¶LN¨UO›`RŽhS€oUOV5?J(<<B>TR)jvD‚¡e“Â~‡¼t…·p{`k‚JsOˆ\t|SXb=;D'2<#4=(XS@YSCZTD[UEa\H`[G_YKaZPe][icgogtsj{wnƒyp…|sˆ}t‡yprjyjboe]hb_h`_e^]b][\]YX^YU^ZQa[Od]Me]Jg\Hh\Fi]Gk\El\Ej^FicMqfTpYIsO?ŠVIœ\P£YL©ZK¥N=¤E3¦;+°8(À8,Ï8/Ù40Û2-Ý6.Ý6-Þ7.Þ7.Û7+Ù7*×7)Ô7(Ô8)Ò9)Ñ:)Ñ:)Ñ:)Ñ9+Ò9+Í;,º;*µ=,®9'¦1ª2!µ:*À<-Â8+È5+Ì5,Ó;0ÚC8ÜJ=ÔH9Â=,¶1 ÜPCØJ@ÓE;ÔD;ÙF>ÞG@ÝC;ß=8ß63æ87ê;8é:7å84à72à93Ü=7×G>ÍC8Ä:/»3'·1%¹5(¾<.Ã?2À:.Ç=2Ò?7Ú@8à=8æ:8ê88ì89å78ä79ä88ä88ä86ä84ä84ä84à40á51â62ä84å97å97å99æ89é;<æ::ß99Û<9Õ@:ÌB8À@5µ?1¨:)¢;(Ÿ<'š;'—;&•9$”8#9%B.‰<*…/"/&ºMHânnälnÌUY¼KM´MNªQM¡TN›XO–^Q•aS‰iPVY,9L6E Q`%{O™¯nž»xœ½x‘´p~ž_h€LZm@WeAT]@HP8>C/9>*>C/<@18?/:C28D.?N1Rd>\t@f‚EoKm“Hi’Fh’Fg’JgJiOk’Qn“Pl”Nk“Lj”Jk•Il˜IpLnLp Lq£Ns¥Pu¦Tx©Wzª^w¦blšZbŽOVO?VO?VO?VO?VO?VO?VO?VO?WP@WP@XQAYRB[TD\UE]VF]VFc\Jb[IaZJbZOd[Th^\lbcodhpekrgmtiotioqfllaef[_`XV]ZSYYOWWMWUIWSHXTH[UG\VFaZHc[Hc[Ff[Eh]Gi_Fj^FhaGbbJngTv\K~SC™WKªXM®RG¶QE­G8¬C0«<)±9(½9,É90Ô72×4/Û7.Û7-Û7-Ú8-Ú8-Ø8,×7+Ô6*Õ7+Õ7+Ô8+Ô8+Ò9+Ò9+Ò9+Í;,½;+µ=,­8&¥2¦3 ¯:(¹>,½;+Å9,Å5*É5)Ñ:/ÚF:ÞOAÝQ@ÜN@ÛG=×@9Ò;4Ò;4Ô=6Ø=8Û94Ü41ç77ë78í68ê65æ74â94á<6ÛB:ÉA5¾@2·9+°5&®5$±8'·>-¾@1Ä@1Ì@3Ö?6Ü=7ã:5é75î66ï79é6:æ8:æ8:å99å97ã:5ã:3ã:3á81â92ã:3ã:3ä;6ã:7ã:7â88ã9:à::Þ<:Ø?:ÐA;Ä?6·=0¬;+¢;*<)™=(—<'“;'‘:&‘9%‹:%8$~:'‰5*›=5½QNÕedÏ^`·MM«MK£SLœXO—[P–]R•_S—^S‹eN_^.Rf']r1yN—°l£¾{—²o† _iG_v@Sf9IY5CP6?H58>059+9;-?B1=?28>0;A37C/?M3Od=]uCf„Fp‘Ln”Il’Gj“Gi“Kh‘Kk’Ql“Tm”Ql”Nj”Jj”Hj–Gl™HmImGn Iq£Nu§Rw¨VvªXx¨^j–W_‹PV‚G[TD[TD[TD[TD[TD[TD[TD[TDZSCZSC[TD\UE]VF_XH_XH`YGd]Jc]Gc\Ic\Ld\Oe\Sf]Xg][h^\i_^j`_j`^h^\d[V`WR]VNYULVTHSQEQOBQMARO@TQBXRB\WD^WD_XEbZEe]Hg_Hj_IhbJbaLmfSx^O†XK \S¯VP±JC¶E=·A7¸>1¶;,¸9*¼8+Â:,É;/Î:.Ö8,Ù7*Ú8+Ú8+Ú8+Ø8*×7)Ô7(Õ8)Ô8)Ô8)Ô8)Ò9)Ò9)Ò9)Í;,½>-´?.¬9&¡2¡2©9%³>*¹>,Ã>/Ä8+Â3%Ç3'Î5á:4å63ì65ï79ê69é69é69ç77æ95å:3å:3ã;2ã;2â;3ã<4á<6à;7ß:6Þ97Ý98Ü87Û=<Ú@>ÒA<È?7¹;/­7+¢7' ;)›<(—<)“<(‘:&:%Ž7$ˆ:&z6!x5"‡9,žF<¶SN¾VS¶PN©JF¢MHœSJ˜ZO—_R•aT•aT•_U‰eOrqEzU“¦n£¸ª¿†œ´zyXXo9?R$@R(AQ-=L/8D.4=,39-58-9;-?B1<>17=/:@27C/>L2Od=^vDh†Hr“Np–Kn”Il•Il–Nj“Mm”Qn•Ro—Qm•Nk•Kj”Hk—HmšImImIp Lt£Rx©Wx©Xt¥VpŸW]‰JU~DNw=`YI`YI`YI`YI`YI`YI`YI`YI^WG^WG_XH`YIaZJb[Kb[Kc\Jd^Hd^Fe_Ie^Ke^Le]Pd\Qd[Rg^Ug^Uf]Tf]Te]Rd\Qc[Na[M\XLXVITREPN?OL=OL=QN=RO>UR?XS@ZUA]XD`[Gb]Gf`JfaKcbNkdRt]O‡[P§b[µZU¶FD¹<8Á<7Å:3Ä:0Â8-½8)¼;(½>+Ä?,Ñ9+Ø8*Ù7*Ù9+Ø8*Ö9*Õ8)Ô8)Ô8)Ô8)Ô8)Ò9)Ò9)Ò9)Ò9)Í<+¾?.´?.ª:&¡4œ3¢8"¬>'´?+»>,¿:+Â6'Å6(É7*Ì:-Ì=-Ò:/Ý54Þ22Ú00Û32Þ97ä<;é==ë;=ë7:ê37é05æ23å57á85Ù53Î70¶4'®6&¬7&«6%«8%¬9&±9(³:)ÃA1ÉA3ÓA4Ú@6à;5ä84ê65í76ì57ê67ê67é75ç83æ93å:2ã;2à90Þ:1Þ;4Þ;6Ý;6Ú;7Ù:7×98Õ;9Ô@<ÒC=ÇA8º<0¬6*£5&6%š;'—<)“<(;&;%‹9$Š8#…8$€=*v5!6'—E9©OGªMF¦KF¥PI›QH—UI“[N’^P’aS•aT–`V‹fSˆ†_˜¨w­½Ž¦¸ˆ¡tr…WN`6.@,=2A"8F,:F09B17=/9<1;=29:,>A0;=06<.:@26B.=K1Nc<`xFi‡Is”Or˜Mp–Ko˜Ln˜Pm—Op˜Rp˜Rp˜Qn–Mk•Ik–Gl˜In›JnLožMs¢Qx§Wz«Zv§XlœPd“KZ„ER{AMv6ã<6è96ë76í76í76í76ë84ê84è:3ç:3ä<3Þ:1Þ;2Ý<4Û>7Ù>9×>9×=;Ó=<Î@<ÉB<ÅB:¹=3¬8+£5(œ6'š;)–;(‘<(Ž<'Œ;&ˆ:$†8$‡6#ƒ8#‚A-r3!x3#“G9¢RG NCœND VK–VJ’XJŽZL\N]R“_T—aWŽgV‰f–¥z›ªh\lHDS22A$$2,:#.;'2=-7?0:@4;>3:<199-89+=@/;=05;-9?15A-=K1Mb;`xFjˆJt•Ps™Nr˜Mp™Mo™Qn˜PpšRq›QpšPn˜Lm—Km˜Io›LqNq Pt£Sx§W{ª\y§\pžUb’HX‡A]‡HU~DPy?d]Md]Md]Md]Md]Md]Md]Md]Md]Md]Md]Me^Ne^Nf_Of_Of_Mf`JgaIhbJhbLicMicMhaNhaNhaNhbLgaKf`Hf`HgaGhbHhbJe`L`]J[XEVS@QN;MJ9IH6HG5KJ6JL7KM8LO*°D(³A&É;'Ó8&Ô9'Õ:(Õ:(Õ:(Ô9'Ò9'Ò9'Ò9'Ò9'Ñ:'Ñ:'Ñ:'Ñ:'Ë<+À>.³>-ª;( :$—7”6™;!¦B*±C,¸?,¿;,Â6)Å3&Ë4)Ò;0ß=8è59í4:ë6;è:<å;<ã;;á;;à::ß58à67â9<à<=Û=<Ð85Ã2-µ/&¯:)ª=)ª=)¨=)¨=)¦<&§:%¨8$­5$·8'Ä<.Ï<2×=5Ý<4ã<6è;7ë84í74í74ë83ê93ç:3æ;3ã<3á>5Þ@7ÛA9ÙB;ÖA;Ô@<Ñ@=ÌA<Á@:º@5³=3©9- 6(š6&–9'•<*;'<'Š<(‡:&„9$ƒ8#ƒ6$6#{:&q2 |9(”O?£YLœRE•OC˜VH”ZL[MŒ[MŒ[M[P’^S˜_VŽgV}wWx„^p|XSa@9F*.<#/<(0=,1=/2<15=29?5>A8?A6;;/78*78(04@,PM:KJ6IH4FG5FI6FI6GK:HL;IM#È;'Ð7%Ñ8&Ò9'Ó:(Ó:(Ò9'Ñ:'Ñ:'Ñ:'Ñ:'Ñ:'Ñ:'Ð;'Ð;'Ë<+¿=/´<.«<)£='—9 5“9 @'­C-¶A/¼=,À6)Â/%Æ/&Ð6.Ý:5ç48í5=ì;Aé@CäABßA@Û@>Ù?=Ì22Ï53Ò:9Ð<:Ç<7½81´5,«5)§<*¤=*¥>+¤@)¤@)¤>(¥<'§:%ª7$°7&º8*Â8+Ë8.Ó:2Û<6ã>8è94ê93ê93è:3ç:3æ;1ã<3à>3àB7ÜB8×C9ÒB9ÎA:È?9Ä=9¿>8°;2§;.¡7*œ6(—7'”9';'Œ;(‰<(ˆ=(„;(ƒ:'€9%8$6%}6$v3"w6$…B2—TDœXK”PCPD”YK’ZM[M[N\O’\R•\S—\VcUkbCV`;IS1*4?15?44>56@8.;:(78(ON:JL7EF4DG4CG6BI7BI9AJ9BK:CJ:HL>PQCRPAXM;dK7sD4•I<ÁXR×QNÞDBÞ:9Û75Ô;3Ê>/¸>)´7!È:&Ï8%Ð9(Ð;'Ò;*Ñ<(Ñ:)Ð;'Ñ:)Ð;'Ñ:)Ð;'Ð:)Ð;'Ð:)Ë<+¿;.µ;.­<*¤>(˜:!Ž4’8ž@&¡8"¯<)¾?.Æ<ë>@î?DéCEâDCÕ@<É:4¿4/¸1+·0*º50½94º;4°91¨8-£9, :+ž=*ž?+ ?,Ÿ@* @* @*¢?*¤>(¨;'­:(²7(·5'¿5*È:0Ó>7ßB;ä=5ç<4ç<4å=4ä=4â>4à@4ÝA5ÛC8ÖC9ÑC9ÊA7Ã>7¼;5¶93¯:1¢7-˜7'’5&’7%‘:)Ž;)‰;'„9&†=*„=)=(;(}:'{8%{7$z5%w2"~9)ŒG8•RB’PBŠK<QD™_QXKZL’\P•\Q–]T–[S–YTŠ^QaX9EM&5?7B$=G/:F23>0-7,/905?6@F=);:&67%;>-9;.4:,7=/4@,;I/K`9_wEi‡Is”Os™Nr˜MqšNq›SpšPpœMpLoœKn›Jn›JqNv¢Uz¦[‚®cªbv¤\h•PZ‡DVƒ@\‰FeOcŠQY€IRyBhaQhaQhaQhaQhaQhaQhaQhaQg`Pg`Pg`Pg`Pg`Pg`Pg`Pg_Rh`Uh_Vh_Vh`Uh`Uh`Sh`ShaQhaOhaNhaNhaNhbLhbLhbLhbLg_He_Ge_Ic^Ha\HZXCRQ=KM8HI7DG4@D3=D4>E5>G6>F7=E6ELß@:Õ>5É=0Æ=-Æ5$Ê4#Ì6'Ê7%Í7(Ì9'Ð:+Ð=+Ñ;,Ï<*Ñ;,Ñ;*Ñ;,Ñ;*Ñ;,Ì=-º2&¶8,°<-¥:(š7"‘5“7œ9"¬B,±<*¸6(À3)Ê6,Õ<4áD=çHDçCDæFHÛCBÉ:6º5.´8.®8.¦4)©9-§8-£9,ž8*š8+–:+‘;*‘;*–=+–>*™>+˜@*š?*›@+A, @* ;'¤9'¨7'®6&µ7)½9-Ä;1Ë;2Ú=4Þ=3à?5âA7àB7ÛA5Ø@3Ô@4×H:ÐF9Æ@5»;0°5-©2*¤1*ž3)™9-’;*:+Œ9'ˆ9(‡:(„;(ƒ<*~:'|9&z9%z9'z9'z9'w6$w4$w- Š@3—OA“N?ŽL>‘RC“UHRD—[P—[QTLTL—ZU”WR“VQ“hX\S2HP'AK&@K)>H-5A+1<+3>.1<.EPBX^PU\JLO:CG.@@&<<$9:(*9G-NcE5>E5>G6>F7=F5?H7=F3=G/FL2MI.S?&}P9»raÉcUÞ_XéUQåGDß@<ß@<Ø?9Í9/Í9+Í<+Î<-Î=,Í;,Ì;*Í9+Í:*Î:,Î;+Î:,Í:*Ï9+Ï9*Ï9+Ì:-É?5ÄA7¼B5®=-6#•2•2›2¥4"±6&Á;/ÐB8ÝF=äJBèKDèKFÝB@ÚDCÍB=»;2¯9-©=0£?/=-@/š>/–?.“=.>-Š?,„@-†?+<)‘;*‘<(’=)“>*”?+–?+—?+@.Ÿ>-¢;*¦8)©8*±8-´:-¼:-É;1Ï;1Ò>4ÕA5ÕC6ÔE7ÒD8ÎD7ÇA5Â@2¹=1¯9-§7,¡5+5,™7,‘;,‹<+‰<*ˆ;)†;(ƒ:)=*€=*|;'y:(y:(x9'x9(v9't7%v4$}3&D7—OA‘L=ŒJ<ŽPA‘SFQF’RI—WN•TN–WP›\W“VQTM‰bQ]W3Xc8^i?ZfBGU46C'4@(-9;.7=/9?12>*:H.NcKL:GJ7CF5@D3?F6?F6>E5H0GK2D>$U@%…[Cµr_³VGØcYîe_ëSPåGFéGEæDBØ;6Ë7+È9)É:,É:*È9+Ç8(È6)Ç5&Ê8+Ê8)Ê8+Ê8)Ë7+Ë7)Ë7+Ê7-Á2*¾5/¶6-¬3(¡0 /Ÿ1 ¦3!»@1ÇC7ÔG=àKDæMGçJEåFBÞC?ÖB>ÎC>Á@:±;1£<-žA0šE1–E2“E1C1ŽC0ˆA/„A.A,|B.~@+„;*ˆ9(‰:)‰:)Š<(‹=)<)<*•@,–=+˜;*›:*ž8)£9+¦:-«:,¸:.¼:-À<0Â>2Ä@3Ä@3ÃA3ÁB3µ:+¯9+ª9+£7*7+™7,–8,’:.‹<-ˆ<,…<+ƒ:)‚;):*~;*~=+|;)z;*y:)w:(u7(r7'q6&t5&†<1“F<•MAI<ˆH<ŒNA‘SH‘QG‘NF˜SL—TN—VP™\W‘ZSŒZSlY€~X}Š\~‹_ixOJX45E!;J+L[>cqWboU[eLMV;CI-?D&=@!:="79$:=,8:-7=/:@23?+:H.Mb;bzHk‰Ku–Qs™Nr˜Mp™MpšRo›Nr¡Pn IlžInŸMt£Sy¨Zz¨_z¨`ošUdŽL[„B[„BcŒJh‘OdK^†Hb‡QY~JRwChaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQh`Ui`[i_]i_]i`[i`Yi`WiaViaTiaTibRibRiaTiaTiaTiaViaTkcPjbMjbMjbOhaNd_K_ZGYVCPO=KL:GH8CF5AE4AE6?C41Ñ>4Ñ?2Ò>4Ò>2Ó?5Ò?7Ó?;ÑB>ËD>ÅE<ÀF9ÁI;ÇM@ÎPDØRGÝPGáLEãJDãFAáD?àA=ÚA<ÔE?ÈC<º?7ª.˜C/•G3‘H5F2ŠF3ˆD1ƒB0~A.{@.xA-z@,:*„8*…9+…9+†:*†:*†:*‡;+ˆ;)‹:)Œ9)8*“:*—;,š=.¡=.¨9.«9.®9/¯;.°:,¯9+®8*¬8)§6&¤6'ž7(š6'”7(8*:-;-‡;+ƒ<*‚:+:*~9)}:)|;)|:*z;*z;*x:+t9)r7'p7&p7&t6'‰C7‘I=K>ˆI:†H;‹PB“UJ—TK•PI›TN—RM”SM•\U_Ug]•j’”mƒ“dr‚UXi=BS)>N'O_:csOdsRZiJLY;AL.LK9GH6EF4BE4@C2=B.)d>+“ZI«_Rš>3ž3+¶?7×XRñjfõedéSTäIMçNPØIAÐF9Ì?5Ê>1Í@6ÒD8ÔF<ÕG;ÚJAÚJ?ÚJAÛK@ÝJBÞKAÞKCßJCéTPçSQãTPÜSM×RK×RKÚTKßTMÝMEáIDãEBâC@áB>âC?âE@ßGBØIEÉD?¹>7«<1Ÿ?1–C1’E3H4‰E2ˆC3†A1ƒ@0~?.|>/y>.{=.9-‚8+‚:,‚:,€;,<-<,<,9*‚9*…9)‡:*‰:+Š;,Ž=,’<-˜:.›9,ž9-Ÿ9+ 9*¢8*¢8(¡7'ž7&›7'—7'“7(9*‹:)‰:+‡;-ƒ;,€;+:+}8)}8){8(z8(z8*x9*y:+x:-t9+q6(o5'q7)t9+‹I;ŒJ<ˆJ;„I9…K=ŒRD’VK—WN–QLšUP—SP’UP‘`YˆbW‚hY†zbmsOZi>IX-AR&HY-Wi?dvLi{SXjDL\8=L+8E':D+9ÒROñpküvuñefêY\î^^âUNÙODÑG=ÍC8ÑD;ÔG=ÖG?ÖH>ÙIAÙI@ÚJBÚJAÝJCÞKCÞKDàKEáGGàFFÜHFØGDÖHDÕGC×FAÚEAÝB>ãA?æBAèBBæB@âC?ßB=ÙA<ÚIFÉB>¹<6¬=2¢@3—A0B0D3‰A2†A1†>0…=/€,˜8(–9(’9):(‰:)†:*ƒ:+‚:+:+~9*}8)|7({6'z7'z6)y7)u6'v8)w9,s8*o5'm5&q9,v<.ŠL?†K;„K:L:„Q@‹VH‘WL–VM“NI™TO–UQ“\Ud[z^PdWD`^EEO,>N'>O%J\2^qDiQcyKVl>M_5@R,6E$5D':F.06:,79+9<+68+6<.OL9LI6IF3FC0AC.:G+@F*U@+wF7¢OI²HH´7;¸36ÈBCÃ>?ÊJIßb^ïrpînmæabâZZÚQKÔKAÎE=ÌC9ÏD=ÐF<ÐC<Í@7ÑB<ÒC;ÓB=ÔD<×C?ØE>ØD@ÚEAÜ@AÝADÝCCÜFEßIHßIHâHFäFEæBCé@CëABëABæ@@á?=Ù>9Ô<7ÚFDÈ=:¹83®<2¦@4˜?/?.@0‰=/ˆ<.ˆ:.†9/†91„:1ƒ:3„;4€:2;2;2~<0~;2|<0|<0|=.{=0{=.{=.{<+z;,y:)z8(y7'9-‚:.…9,‡9,Œ:,‘;,“<+•<*‘8(9(:(Š;*‡;+ƒ<*€;+~;*~9*7)~6({6'z4(y5(y5*x6*s3't6)v8-r6+n4(m5(s;.x@1‰QBƒN<€M<€Q?…VFˆWHTI‘RI’OI–SM‘TOŽ\S‡eYl[INL5DJ.@N-JZ6WgB_qIezObyKUm=E\.AV+5J#/@ 4B(;G3;C67<57:39;.:=,68+6<.G*DD([B,ˆTF­]V¨>>ª/2ËHMÄ?B½;=º:9ÃFDØ[YâecÛYYËGEÐIEÎE?ÌA<ÎC<ÑF?ÒG@ÐC<É?5ÎC<ÏD=ÑD=ÓD>ÕD?ØDBÚDCÜDCÞ?CÞ@AÞBCßEEàFFßECßA@Þ>>çACè@@ç=>å==ã==â@>áD?ßFAÖB@Å:7¶5/¯:1¦@4—>0=/‹?1…<-…;.†9/†91†91‡81ˆ94‡:4‚92;2;0;0~<0};/{;/{<-w9,w9*x:+y;,y;,y;,y;,z;,};/}9.~8,7)‚6(„6)†7(†7&ˆ9*ˆ9*‡:*…<+<,€=,~<,};+|8+{7*{5)y5(x4'w5)w5)u5)p2%s5(s7,q7+m5(n6)r=/xC5ˆUD‚Q@P@‚SCˆWI‹UIŒRGNE”SM“TMˆRHƒYM}cRc[DGK0ÒC=Ä?8µ91¨8-Ÿ:.•=/Œ>1„?0?1?3€>2€<1ƒ:1†91ˆ81‡81…;0ƒ;-ƒ;-<-€;,€;,<,<,~:-~:-};-};-};-};-};-};/{9-|8-|8-}7+~8,~8,~8,~9*}7+}7+|8+{9+z8*x9*x9*v8)x8,v8+w7+u7*t6)s5*s5*q5*k1%p6*n4(k3&o7*j5'n9+}I;ƒSEƒSG„RG‡QG‹PHPI‘PJ’QK’SLŠTJ†ZMbPm^GVU9KV4M^:jXaxNYpFSj@Qf=Mb;GX4BQ06C%2?#0:"3;&;?.?A3??3<>339+2:+39+5;-7>.9A,;C,;F(Q`9_rDn‡PrRq”Pq™RrœRržSužX}¦b}¦dp™Wb‹I]†D]…F\„E^†GaˆId‹LeŒMeŒKb‰H_†E]„E^KSuBKm;h_Pi`Qi`Qi`QjaRjaRjaRkbSjaRjaRjaRjaRjaRjaRjaRjaRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTlcTqaRqaQobRpdTpgXohXlfXgdUgdUkhWmjWjhShcMc_F[U=RL2PK.F?#P@'kP;XGƒOB†F<’E?°WS¶TQºQN½PM¿NJÀMJÂLHÃLHÏSQÇGFÁ=;Ä=:ÎC@ÑF?ÌB8Æ=3ÈD7ÈF9ÊF:ÍG>ÓEAÖDDÛBEÝAEÞBEàBCáCBßDBàECßECàEAáFBßD@ßD@àC>ßB=ÞA<ÞA<àA=ÜC=ÒE<ÇB9º>4«;/Ÿ:.“;-‰=/>.@1|A3}?2=1;1†91ˆ81ˆ8/†:-„;,ƒ;,ƒ;,‚:+‚:+€;,:+:+:+~:-~:-~:-~:-};/};/|8-|8-|8-|8-{9-{9-|:.z:.z:.z:.y9-x:-x:-w9,w9,w9,t8-t8-s7,s7,r6+p6*p6*o5)j2%o7*m5(k3&l7)j5'n9+}I<ƒSGƒSI†QI‹PJPK“OL”QK’SL‰NFƒSG[KzdMqjPhkLcqNfxR]tJUnDOe>Ka:J^9J[7FU6BQ4;E,6@(3;&6;';>-?@0>?1;=03;.1<.4:.5;-9=.;@,%LA+SA-S8']7*l>1n8.t8.~;3‡A9‘H?›QH¤WM¬YQ»^WºSN·GCºC?ÅCAÏEBÑC?Î?9ÏB9ÐC:ÏE;ÓF?ÕF@×FCÚDCÜCEÞBCÞBCßCDÞDDÞDBÞFCßECÞFCÝE@ÜD?ÛD=ÚC<ÚC<ÚC<ÜC=ÙD=ÔE=ÌF=ÁB9²=3¡9.‘8*‡9,<-@1~@1~?0=/;/„:/‡9/‡9/„:-ƒ;,ƒ;,‚:+‚:+‚:+:+:+~:-~:-~:-~:-};/};/};/};/{8/{8/{8/{8/{8/{8/y9/y9/z:0y;0y;0x:/x:/v:/u9.u9.t8.s7-r8-q7,p6+p6+o5*n5*j1&o6+j4(i3'l6*i3'm7+}G;†RG†RGŠQHŒQI‘RK’SL“TM‘VN‰WN†\P~^OsaKoiQnsUkvVevTPd?I_9DX3BV1BV3FW7ET7DR8?I0:D,6>)7<(9=,;>-;=/8<.5=22<16<26<09=.:>-N1BP6ES9GS;@L4>G29B-7?*7>,7>,8<-4:,5=23=46;46<29=/:>-;@*9B'IS1Ud;bxGi…KmNršSv Tv¢Wz¡^q˜Yd‹L[‚CY€A[‚C\ƒDZB^…F_†GaˆIaˆIaˆI_†G]„E\‚GW|HLq>Ch5g`PhaQhaQhaQibRibRibRjcSibRibRibRibRibRibRibRibRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTlcTrfXsgYqg[ldYhaWieZrnezwn€}v…Ÿœ“§¥™ª¦›¨¤˜¢œŽ˜•†x{hbgQMR-@:,?7*@6*F4&R5'oC8‹PHžOJ­IG½FHÊEHÑBDÕAAÖ@?ØC?ÙD@ÚE?ÚE?ÜD?ÜDAÞDDÞDDÝCCÜDCÜDCÜDCÚEAÙEAÙF?ÖF>ÕF>ÔE=ÒE;ÒE;ÓF<ÔF<Ó@8ÓC;ËE:¿C7­?2œ:-‘;,‰=-ƒ>.?/~?.=-€=-ƒ;,†:-†:,ƒ:+‚:+‚:+‚:+:+:+~9*~9*~:-~:-};/};/};/};/};/};/z:0y9/y9/y9/x8.w9.v8-v8-x:/v:/v:/u9.u9.t:.s9-s9-q7,q7,p6+p6+n5*m4)l3(l3(g1%l6*i3'f2%i5(f2%i5(|C8ŠNDNEPISKŽULŒXM‰YOƒ[OyYLt]MiZG\UBYXCY^GNX@?K39G.7E,4B+4B+7E.+4=*2:+3=42<45:35;18;09=.:?+9B'GQ/Ra8_uDh„Jo’PuVx¢Vw£XxŸ^k‘T]ƒFW}@YB\‚E\‚E[D^„G^„G_…H_…H_…H^„G]ƒF\‚GV{GKo?Bf6g`PhaQhaQhaQibRibRibRjcSibRibRibRibRibRibRibRibRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdTkbSndXnf[jcYhd[pmfƒ€yŠ¤£Ÿ²±¬ÁÀ»ÈžÇÄ»ÄÀ·¿¸®¸²¦¢œŽ…‚qedROP>DI5D8BE:GE9<4'M:,d?6~E>¡PO¿XYÊQVÉDGÒFGÖFFÙECÚFBÝEBÝE@ÝD?ÜC>ÞDDÞDDÜDCÜDCÜDCÛCBÙD@ØD@ÙEAÖF>ÔE=ÒE<ÐF;ÐF;ÏG;ÓF<Ó>7Õ@9ÎD:ÄD9³A6¤>0•<,‹<+…>,‚?.€>.>,€=,<,„;,„;,‚:+‚:+‚:+9*:+~9*~9*}:*~:-~:-};/};/};/};/};/{;/z:0x:/y9/w9.w9.v8-u7,s7,u9.t:.t8-s9-s9-q9,r8,r8,p6+p6+p6+n5*m4)l3(l3(i3'g1%k7*h4'f2%h4'e1$h4'{B7MD‘NF‘PJŽSK‹WL‡XN€ZMy\Ns\Lk[K_XFUT@PS@JR=@I64@,3<+1:)09(.9(0;*3>-7B19D3=H7*0;+0:10943824927:18<.9=,8@(CL-O^7]sDhƒLp“SvžWx¢Vw¡Wp—Xc‰LW}BV|?YD[D[F[D]ƒH]ƒF^„I^„G]ƒH\‚E\‚G[HUzGJn>@d6f`PgaQgaQgaQhbRhbRhbRicShbRhbRhbRhbRhbRhbRhbRhbRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdTiaTicWjcYkg^spi…„ž™¯°«ÁÁ¿ÑÑÏààÞæåáæãÞáÞÙÛÖÐ×ÎÇÌ»±¶¤––†wvm\_ZGKM8>F/;D/=J63:;3983880<>1A=1L8/_81†IH¯^]Å`dÈWYÍQSÑOO×MKÙKIÞIEßFAáC@áB?ßCDÞDFÝCEÝCEÜBBÛCBÛCBØC?ÙEAÖE@ÔE=ÒE<ÐF<ÐF<ÏF<ÒE;×@9×@7ÑC9ÈD8ºD8«A3˜<-‹:)†=,ƒ?,€?->,€=,=*ƒ<*ƒ;,‚:+€;,:+:+~9*~9*}9,}9,~:/};/};/};/{;1{;1{;1{;1y:1w;1x90u9/t8.s7-s7-q7,r8-q8-r8-p7,p7,n8,o6+o6+o6-o6-n5,k5+j4*j4*i3)h4)f2'k7,h4)c1&e3(b0%e3(zA8ME’MF‘PJTK‡WMYLwZLo\Mk^N]XERQ?KN;BI79B/2;*08)06*06,06*.6).6'/7(2:+4<-9D4:E4b6f`PgaQgaQgaQhbRhbRhbRicShbRhbRhbRhbRhbRhbRhbRhbRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkcVoi]kg\lh_spi„ƒ~Ÿ ›¼¼ºÍÏÎÍÏÎÞàßñññøøöø÷õöòïðëèíâÜæÐÅÛÁ´Á¬› ‘~}u`^\EJN7AI1@J2@I4@G5BD7AA7B=7B:7>;67=3=@5B71H/*c74ŽRQ³ggÆnm¿[[ÆYVÍVRÕQMÛMKàHEäEBåBCßCDÝDFÜCEÝCEÜBBÜBBÛAAÚBAÙD@ØD@ÕD?ÓD<ÑD;ÐF<ÏF<ÒE;ÛB<Ù@8ÒB9ÊD9¿E8­A4š:*‰6$ˆ<,ƒ?,>->,€=*€=*=*=*€;,:+:+:+~9*}:*}9,|8+};/};/};/};/{;1{;1{;1z<1w;1v<1v:0t:/t8.r8-q7,p7,p7,p7,p7,m7+m7+m7+l6*l6*m7-l6,l6,k5+j4*h4)h4)g3(f2'i7,e3(c1&e3(a/$e3(wA7ŽMG‘NHŽRJŠUMƒYMzZMq[Mh\LWTCHI9?C2=D49B108)/7(6<047047058117-06,/7*08+19,6A38E4-*5-,50/4.16/4707:/9=.8@+>^5icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUkdTkdTkdTjdVhdYee]ttl‘’Œ®¯ªÃÅÂÙÛÚéíîñõöôø÷ûýüÿÿýÿÿýýüøúöóûòë÷áÔòØÇÞɴŵž©Ÿ„ˆ„gbbFEH-DH/BF/FE1GD5E<3C60D52F;9>?:>A:B:7G83bFCjgēç¬¦ÑŠ„Çtn¿^WÅTNÔPNÞLLçGIêGJÝDFÞIKÚDEÔ;=Ø>@àFHßEEÕ;;Ù??ÙA>×B>ÖB>ÓB=ÑB<ÏB9Ð@7ÜC=Ú@8Ò?7É@6½A5®@3<,Ž8'Š=-†?-‚=-€=,~=)<)<)€<):+~9*}9,}9,|8+|8+|8-z8,{9-{9-y9/y9/y9/z:0z:1y:1w=2v=2v<1s:/s9.q8-p7,m7+m7+m7+m7+l8+l8+l8+l8+l8+g3(k7,o;0n:/j6+g3(f2'e3(c1&h6+c1&]-!_/#^."b2&q?4‹OGPK‡PIRJzXLu^PeXHSM=BE2=D29B14?/2=-3;.2:-39/68357257227016/06,.6+.6)-8*0=,6C19H5:I45G11C-0>-(4*)2--2,.3,25.58-8<-8@+6?$DR/WlAg‚Or“Zv\r›Wj“QX~CVyCSv@Sv@VyCY|FY|FX{E]€J`ƒM`ƒM\I[~H]€J_‚L]MRrIDd?9W3icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUleUleUleUjdVee]noi…†£¥ À¿ÕÙØéíîõûûöúû÷ûüùýüýÿüþþüÿþúÿüùÿûóÿðàúêÑìÞÄ×αÀ»¤£„€„cflJLQ3FI.CC+GB/H>2G:2J84J<9>:7CB>NIF\RPyje£Ž‰Í²«çżÿ×Î벧̓zÀc\ÉXT×RSÞIKÚADÔDDÓEDØHGÜJJÚFFÓ=>Õ=<ÛAAØ>>Ø@?ÖA=ÖA=ÕA=ÒA<ÐA9ÑA9ÛB<Ù@8ÑA8ÊA7¾B8°@4ž?/9@.5@/3@/2?.2=/3;.4:069268368557246116/16//7,/7,-8*/;-4A07F39H56H23E/3A0,8.,6.-2,-2+03*36+6:+6>)6>&DR1VkBh‚Ss”]vœ_p˜YfŽOV|CUxBRu?Ru?UxBWzDX{EWzDZ}G]€J^K[~HZ}G\I]€J[{LPnJD_@7R3gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSicSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUleUleUleUieYde_y{x—™–²¶µËÑÑãééóøû÷ÿÿûÿÿûÿÿûÿþüþûþÿúÿÿúÿÿúÿÿôýûäùøÚïðÑàäÃÑ׳½Åžž©‡’j^hEPW6CG,DC.HE4LD7J@7H?8C;8QLIia_wtœ’½²¬ØÎÅéÛÐüéÛÿôçÿäÙï«¢Áfa´DCÆEIÙSTÚVTÎMHÉC@ËDAÑFCÕEDÕCCØBCÖ>=Ö>=Õ?>Ö@?ÕA=ÓB=ÑB<ÒB:ØA:×@9ÑB:ÊD;¿D<°A6¡<0’:,‹<-‡>/‚=.€=,~=+~=+~=+~=+~;+}9,}9,}9,{9-{9-{9-z8,{;1{;1{;1{;1z;2z;2y:1w;1s:1q;1p:0n:/n8.l8-k7,h6+k7,i7,i7,h8,i7,h8,h8,h8,k90k90j8/j8/j8/i7.e3*b2(c3)`1'[,"_0&c4*Y-"\0%pD9}PJWO}XPoSH^J?OC7?<-46(1:)0;+0=,1=/2<14<15;169268368368338227027008-08--8*.:,2?.4C07F38G46G48F52>20:1/4-,2(-0'03(37(4;)6>'DQ3XlGk„Zv–dwdl”X_‡KUxBTtBRr@Rr@TtBVvDVvDVvDWwE[{I\|JZzHZzH]}K[{IXwKNgG?W=1I1gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUleUmfVmfVjfZikf‚ˆˆ£§¨¹¿¿ÍÕ×åíïòúüôüþùÿÿùÿÿúÿüúÿùüÿøýþöÿÿõÿÿó÷ýãóüÝîøÖåñÍÝéÃÎÚ²µÁ™ ¬„}‡bfmKLS4DH/HJ5KI:GE9D@7OGDia^Š‚€¢š—·¯¬ËÆÀÝÚÑéåÚùóçÿüïÿ÷ìÿÝÕú·±åÇcc®@?ÁPJÈSJÇPHÂG@ÇF@ÒMHÕJGÐ@?Ï>;Ò><Ó?=Ô@>ÓB=ÓB=ÒC=ÒA<Ô?9ÔA:ÑD;ÊE<¾E<°A8 >3”:/‹Pp>Qq?SsASsATtBUuCYyG[{IZzH[{I]}KYyGVsGH_C:M9,?,gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSibRjcSjcSjcSkdTkdTkdTleUkdTleUleUleUmfVmfVngWkg\pro…¤©¬·¿ÁÌÔ×ãíïñûüóýþ÷ÿÿøÿþúÿúúÿøûþóùûîøùëöùèõÿçóÿäðýßíøØèóÑÞèÅÊÒ­¶¾™›£~{‚aX^BGL5FK7DK9@F8@B7b]W…~x«¡ŸÀ¸µÊ¿ÕÐÌäáÚîîæùöíûôêþðåÿóéÿôìÿåß騤¶ic¥K@²PC¿YKÇ[OÃQG¾E=Á@:ÊE@Ê@=ÌA>ÏA=ÐB>ÐB>ÑC?ÐC<ÑB<Ò?8ÒB:ÏD=ÇG>»D<­A7Ÿ=4”<2‹;0‡=2‚<0€Oo>Oo>Oo>Pp?Qq@TtCXxGZzI[{J]}L]}LWwFQmDAT>3C6&6)gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdShbRjcSjcSjcSkdTkdTkdTleUkdTleUleUmfVmfVngWohXlh]jnmz‚…“›ž«µ·ÃÍÏÚåçë÷÷òþüóþúõÿúùÿùùÿöúþð÷ûìõöæñôáóüçóüçóûäóùßñõÚéìÍ×Ö·Ää°¯‘qdfNMP;DK9EN=EPBIQF{{qžš‘Ľ·×ÎÉÝÓÑåÛÙðëçú÷òïîéûûóÿÿöÿþóÿøîÿóéÿæÝÿ×Ëג‚·dR¢K8±TC½WI´E:¶@6ÈLDÄC=ÈC>ÊC=ÍD>ÍD>ÍD>ÌC;ÍB;ÐA;ÑB<ÌE?ÄE>¶A:©>6<5•<4‹;2‡=2‚<0€C?695,86*99/79,48*37)4:.4:.4:.4:.58-47,46+36+28,19,19,08+08+08+.9+.9+.9)-8(-8(.9)/<+2?.4A06C2:E48C28?/4;+37)15'04%-4$07%HT>dw[tŒls‘keˆ^RwKBh9Ij;Ll;MmÉD=ÉD=ÈC<ÈB9ÐC<ÏD=ÊE>¿C;³>7¥:2›:3”=4‹;2‡=4‚<2€<1~<0~<0~<0~<0};/|:.|:.|:.{9-{9-y9/x8.z:1z:1x90x90w81v70s7/r7/l8-j8-i9-h8,h8,h8,h8,f8+f8+f8+d8+d8+d8+d8+d8+d8+f6,g6/h70h70g80g80i:2k<4d8/i=4b6-`4+nC:vKBsH?kMCB9047.25,7:/8;247,14)25*58-47,37)37)35(35(46)37)/7(-8(-8(-8(-8(-8(-8(-8(.9).9)-8(-8(.9)/:*0;+1<+7C/7C/:A/9@.9=.59*15&,3#18&IU?cu[m„geƒ_WzRHmD>c7Gg8Li9Nk;Nk;Li9Kh8Mj:OlF`95C2)4, )$feSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSgdShbRicSicUjbUkcVkcVkdTleUkdTkdRkeUlfVmgYnh\mi^jidjpplvxŠ¤®°ÂÌÎÔÞàãíîñûúóü÷öýö÷þöùÿóüÿòûÿðüÿîüýíúøìýùîÿùíÿúêÿøèÿòßîßÈÝη¾²šŸ—€zua`_KVZK\dWkwk|†{¦¬ ½¿´ÙÖÍìåßøíëÿòòÿóóüòóý÷÷ùúõøý÷úÿùõÿôóûîõýîÿÿñÿùèÿôãü˺ºošRC§TF´TH°D8¾I?ÃG=ÇG>ÉF<ÈE=ÇD<ÆC;ÅB8ÌF;ÌH<ÆH<¹C9ª>2Ÿ:0•;2>3‰<2„>4=4€<1;0;0€:0;0};/|:.|:.|:.{9-{9-y9/x8.z:1y90x90w8/v7.u6-r6.q6.l8-i9-i9-i9-i9-h8,g9,g9,e7*e7*e7*e7*e7*e7*e7*e6,f5.j81l:3k:3i9/i:0l=3nB7kA5mE9c=2b>2xVJ…cWwWLbLA<902:/2:/5=24:0.4*06*6<025*25*04&04&04&15'37)28*.6),7),7),7),7)-8*-8*-8*.9+.9+-8*-8*,7)-8*-8*-8(4?.6A0;D3BZ81?2'0-(%heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVgdSheVhdXjdXkdZkeYldWmfVe`MjeQnkXmk\hfZed_qqo€ƒˆ’•Ÿ ª´¶ÁÉË×Üßèîîó÷øøúùüþûýÿúýÿùüÿöúýòøûðùýïúþðøúïøúïøøìûùêþüçøöÝèäÇÔÓµ»ºœ˜™zptY]eMbkVq~lƒ‘‚œ´¹²ËÌÆãâÝïîé÷óðû÷ôüøõû÷ôÿþúþÿúýÿúýÿúýÿùýÿùýÿùýÿùùûöÿÿúÿüöÿêäר  `V™E;³ND¿MBÂF<ÄD9ÊH;ÎKAÎKAÉI>ÆH:ÅH6ÂI6ºJ6±H5¥F4šC2C3‹C5„B4B3€@4€>2;1ƒ9.…8.ƒ90~:/}:1|90{8/x8.w7-v6,v6,u7,v8-v8-w9.t8-r6+p4*m4)j8-g8.g8.g8.f7-f7-g7-f6,f6,f6,h8.h8.h8.g7-e5+e3*g2,j5/l7/k90i9-i;.i=0hA2eA1iJ8dI8u^N|kYˆxh‹~nQK=79,3;.2:-2:-19,19,19,19,17+06*06*06*/5)/5)/5)-5(.6+.6+.6+.6+.6+.6+.6+.6+.6+.6+-5*-5*-5*-5*.6+,6+0:/2>26@58C58C57B24?/3>-3?+DQ=WeN[kQPcGDW9@U6@X6Ic>Ie=Jf=IeSpDWtHZvM\xP\xRVrLFa>9P6$1($,.!)+heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVfeSgeVhdXhdYkd\kdZldYlfVidPjhQlkWjk[fh]jli{‚Ž“™¨°³¸ÂÃÎÖØßçéïóôøüýÿÿÿÿÿýýüøþýùþÿùýþöúýôøûòöüðöüðöùîöùî÷ùë÷úçøúäñôÙßâÃÌЯ´¸—‘–virUXbG_kUtm‹™ˆ›§›¼ÁºÒÓÎçèãòóî÷øóúûöûü÷úûöþÿúþÿúþÿúþÿúþÿúþÿúþÿúúÿþôÿÿóÿÿûÿþÿüúÿîèïÀ¸Á~užL@®L?¹K>ÂL@ÅK>ÁE9»?3¾@4ÁF7ÂG5ÁJ4»L8±J7£F4˜B1D4‹F7ƒD5C6€@6€=4€<1ƒ:1ƒ90‚90}:1{;1z:0y9/w9.v8-v8-u7,s7,s7,t8-t8-r8,q7+o5)m4)j8-h8.h8.g8.g7-g7-g7-g7-c3)d4*e5+g7-h8.i9/j8/j8/i70i70k90j:.j.hA0gD1fG3jQ;fQ>ufQ~vcŠ…q„ƒqIL;39+2:-2:-19,19,08+08+08+08+/7*/7*/7*.6).6).6)-5(-4,-4,-4,-4,-4,-4,-4,-4,.5-.5--4,,3+,3+-4,.5-,6--7..:01=34@65A56B45B14A05B0BO;P^GQ_HHV=AO5BP6EU8Ia?Ie?Ke@Ie=Hb;Fb9Hc:Hd;RmDVrJ[uN[wQ[tTRmNB[=4J5$1*$,/"*-heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVfeSgeVhdXhdYkd\kdZkeYlfVmhTkiRkjVijZjlauwtŽ’•§¬²¾ÆÉÒÜÞêòôõýÿüÿÿüÿÿÿÿÿþþüýüøÿþúÿÿúýþöøûòõøíñ÷ëñ÷ëóöëôøêõøçô÷âôöÞìïÔÛܽÆɪ®±’’—yuy`kpYt{iˆ‘€¨š¬¶«ÌÏÈÞßÚïðë÷øóûü÷ýþùþÿúüýøþÿúþÿúþÿúþÿúþÿúþÿúþÿúýÿüùÿÿùÿÿýÿþÿüùÿúôÿ÷íýÑÄן’M=£RA¨K:¥?0·G9ÎZKÏUH¼A2ÃD5ÅG8ÃK=¸H:©C5?3•A6‘D:‡A9„A8€@7~?6~>5}=4}=4}=4z;2w;1v<1u;0u;0t:/r9.r9.q8-q8-o9-o9-n8,m7+l6*k5)l8-j8/j8/h8.i7.h6-h6-h6-e5+e5+e5+f6,g7-h9/j:0j;1k<4i:2i:0hiXDujT…~k‘z~mCF528*19,19,08+08+/7*/7*/7*08+/7*/7*/7*.6).6).6)-5(-4,-4,-4,-4,-4,-4,-4,-4,.5--4,,3+,3+,3+,3+-4,,6-*4+*6,,8./;12>24@26C27D37D2?L8ES6•B<Š?:…@;@:|@8z?9x?6x?8x?6v=4u<1s=3s=1r<2r<0p<1p4c=0e@0hC3iF3eF2aF1aK4hV>i]GrjS…ƒnyor_9=,17)08+08+08+/7*/7*/7*.6)08+/7*/7*/7*.6).6).6)-5(-4,-4,-4,-4,-4,-4,-4,-4,-4,,3+,3++2*+2*,3+,3++5,*4+)5+)5++7--9-0<03?15B15B19F4;H47E.2@)1?&7E,=M3DY:E];J_>Ia=J`9¥9697˜=:‘=;Š?<ƒ?<|?:w@;tB9qB:qB8p>5r>3r=5r>3p>5o=2o=4o=2m=3m=1k<2j-0=,3@.5B03@,0=)/=&3A*6F,=O5?S7EXI\>I^=J]=J_>SfFZoPbuY`tYYkSI\F5G1$5%"-'!*) )(heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVgdSheVhdXhdYkd\kdZkeYlfVigRjjRlnYnq`pvj€†‚œ¤¦·¾ÄÕßáí÷ùùÿÿùÿÿøüýüÿÿÿÿÿýþùÿÿúÿÿ÷úüñóõèéíßâæ×ÜãÓÛâÐãèÒæëÔéíÖéëÓëëÓèæÍÜÚÃÒÍ·Ò͹ÌƶÉõÍɾÖÑËÞÛÖéåäïîìòóîøùôýþùüýøüýøþÿúþÿúûü÷þÿúþÿúþÿúþÿúþÿúþÿúþÿúÿýúÿûúÿ÷øÿýüþÿýøÿûòÿ÷îÿòôÿõïöäÿÿìÿíØ˧‘¢kW¡ZFªXC­L;¸D7¿C9ÀE=»D<³@;ª=:¢:7š;9”<;Œ><…?=}@;wB:rC9oD;oE9o?5p>5p>5p>5o?5o?5o?5o?5n?5m>4j>3i=2h<1h<1h<1k;1n70q60p70o6/m6/l7/i7.h8.f7-d8-d:.b:.d<0d>1e?2cB3^B4^G7bK9dN9aL7`L4]K3\L3]Q7`Y=lhOssY€„mt|dEN92>*19*19,19,08+08+/7*/7*/7*08+/7*/7*/7*.6).6).6)-5(,3+,3+,3+,3+,3+,3+,3+,3++2*+2**1)*1)*1)*1)+2*+2*,6-*6,)5+(4*)5)*6*+7+-9+,8*/<+2?.3@.3@.2?+2?+3A*6E.8J0>P6BU9EX9™:4•<8Ž=9ˆ?9@9xB8rD7oE9oE9o?5p>7p>7p>7o>7o>7p?8p?8pA9o@8k?6j>5i=4i=4j>5m<5n70q60p70p70m6/l7/i9/g8.c9-a9-b0d@2bA2aA2^C2WD3]N;eVAfW@bS<[O5[O5\R7\W:ZY;mmSrv[yicmT1?(5B.0;+2:-2:-19,19,08+08+08+08+/7*/7*/7*.6).6).6)-5(,3+,3+,3+,3+,3+,3+,3+,3++2**1))0()0()0()0(*1)+2*+5-*4,*4+*4+*4++5*,6+,7),7).9)2=-5@07B26A05@/3@,0?*4C,9H1=M3@P6DT9HX=K[@RbG[kQapY^mXSbODRA1?.!/"%0*$-*"+(heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVgdSheVjdXjcYkd\kdZkeYjgVmlWkmUilWelZem`qzu—˜§°µÊÔÖâìîõýÿôüþ÷ûüüÿÿÿÿýøùôÿþùýýó÷ùìïñãèìÝåéØãêØåíÖæìÐèïÐèíÏæéÎææÎåãÎáÚÈØÑÁ×ÍÁÜÒÉéÞÚøíëÿóõÿõöÿôøþøøþýûÿÿûÿÿûþÿúýþùÿÿûÿÿûýþùþÿúþÿúþÿúþÿúþÿúþÿúþÿúÿþúÿþúÿþúüû÷øüûøÿÿôÿÿðÿÿëþúïþ÷ûÿøÿÿóÿõåÿòÞÿãÌ×­•¨pW¦XB¬Q>«N<¬O>¯OA¬L@¡C9™<4”=4Ž>5ˆ?6€@6zA6sC5pE5oE7o?5p>7p>7p>7q?8p?8p?8p?8rA:pA9n?7k?6l=5j>5k?6n=6o81p70n70m80j8/i9/h9/e;/d<0c?1bA2aA2_B2]B1[@/VA.SF3ZT>f^Gg`F`Y?YR6XS6[W:XW9WX9imRqw[u}eUbH%36C/1<,3;.2:-2:-19,19,19,19,08+/7*/7*/7*.6).6).6)-5(+2*+2*+2*+2*+2*+2*+2*+2**1)*1))0()0()0()0(*1)*1)(2*)3+)3**4++5,,6-,6+,6+,6+.9+2=/6A18C59D47B25@/.;)0?*4C.7F/;J3?O5DT:HX>QaGYhQ_nY[jWP^MAO@.<-!-#(1,&/,#,)heVheVheVheVgdUgdUgdUgdUifWifWifWifWifWifWifWifWjdTkeWkeYkdZle]le[jfZkhWpoZjnUinXjq_hsenys…‘‘ž©­»ÄÉÏÙÛçïòóûýúþÿûÿþþþüýþùÿÿúýýóøúíõ÷éòöåïôàêòÝçï×ïö×ëòÑêïÑéìÑææÎÞÛÈÜÕÅÜÔÉßÕÌçÙÖñãâøììþòôÿöúÿùýÿüýÿþüþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúÿþùþÿùþÿúýÿþûÿÿúÿÿøÿÿúÿÿüÿÿþÿúÿüóÿûïÿýìÿûäÿóÛÿéιf¥bH•O6ŸT=¨ZF£RAžK; M?=1‹?1†>0~?.w>-s@-sD2tF6p>5r=7s>8s>8u@:sA:r@9q?8r@9q@9q@9o@8p?8n?7n?7n=6j8/m80k90k;1j;1g=1d<0b>0`?0^>/bG6aG6T=+N9&L7$@1WQ;OO7KI0ML0[Z>gfHbaCUT6WX9]`AosXw€ccmT=J0,:#1>*1<,3;.3;.3;.2:-2:-2:-19,2:-19,19,08+08+/7*/7*/7*/6./6./6..5-.5-.5--4,-4,+2*+2*+2*+2**1)*1)*1)*1)+5-+5-*4,*4,*4++5,+5,,6-(2)*4).8-2=/7A6:E7=H:>I;5B04A/1>,/<(1?(7E.AO8HV?N\EUcL[hTXeSKXG:F8.:.(4*&/*%.)%.)heVheVheVheVgdUgdUgdUgdUifWifWifWifWifWifWifWifWjdTkeWkeYkdZle]le[jfZjiWnmXimTjoYjs`itfo|u†”” ®±½ÈÌÒÛàéñôôüþúþÿûÿþþþüüý÷ÿÿøýýóùûîöùèóøäðõßéñÚæïÔéðÏåêÊäçÊææÌãáÌÞØÈÜÔÉÞÕÌåÚÖíßÞõççûïñÿôöÿ÷ûÿùýÿýýÿþúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúýÿúûÿùûÿùýÿüýÿþþþÿÿýÿÿýÿÿüÿÿýÿÿýýÿûøÿýóÿÿñÿÿìÿúâÿòØÿìÐß²•§uZ‘[A–ZB›ZDšVAšSAŽG5‹G4‡F4‚E2}D1wC.qA-p?.r@5q?8t?9sA:t?9o=6p>7rA:p?8p?8o>7n?7m>6m>6m>6l=5k<2k<2j>3j@4h@4eA3cB3aA2cH7[A0\G4\J6N=)E6!F7">6KK3GK2CG,BE(JM0Z[9F58E35B02?+1>*4B+:H1?M6JXAQ_HWdRUbPJVH;G90<2*6,(2*(1,'0+gdUgdUgdUgdUheVheVheVheVifWifWifWifWifWifWifWifWjdTkeWkeYkdZle]le[jfZjiWmlWhlShpYiuaiugq~w‰——¥³¶¿ÊÎÔÝâêòõõýÿúþÿûÿþþþüüý÷ÿÿ÷üüðùûíöùèò÷ãîóÝçïØãìÑàçÆÜáÁÛÞÁÞÞÆÞÛÈÝ×ÉßÖÍãÚÕîââóçéúîðþôõÿ÷øÿøùÿúûÿüüÿþúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúýÿúøÿúøÿüûÿüýÿþÿüÿÿûÿÿùÿÿùÿÿúÿÿûýÿúøÿþøÿÿôÿÿñüÿìüúãÿóÛÿøàÿíÓâÀ§«ƒj‡YA…S<’[F–]IŒS?F2u>)r>)s@+tD.vE4p>3l<2o=4sC9sA8n>4qA7wH>m>4m>4l=3j>3j>3i=2i=2h>2g?3f@3fB4dC4cC4aD4_D3[D2aL9TB.YJ5_S=RG1C;$D<%EA(AE,@I.?E):A"=B$LO0\_@fiJ^aBmpQuy^flPHP83=$4=(=F37?07?27?26>16>15=05=05=06>16>16>16>15=05=05=05=03:23:23:2291291180180180/6..5-.5-,3++2**1)*1))0((/('.''.''.'(/()0)*1**1*/6/-4-+2++2*.5.4;3H?>J<=K::I66E02A,0?(2A*3B+CR;IXAP_LO^KGUF:H91>4,8.+5-*4,)3+gdUgdUgdUgdUheVheVheVheVifWifWifWifWifWifWifWifWjdTkeWkeYkdZle]le[jfZjiWkmWimThpYht`gsem|u‡—–¤³¶¾ÉÍÓÜáéñôóûýùýÿúþýþþüýþøþþöüüðùûí÷úçò÷áíòÛåíÕâèÌÛàÀÖÙºÖÖ¼×ÖÁÜÖÆÞ×ÍäÛÖëáß÷íîûðôÿõùÿùüÿúúÿúúÿüùÿþúÿþúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúýÿúøÿüøÿþúÿþýÿþÿýþÿûþÿúþÿùþÿùüÿùùÿúùÿýùÿÿøþÿöúÿóúþïÿÿíÿüéÿñÝÿðÛÿðÚñÒ½³zxR;rI3rH0uH1yL5|O:xK6nA,d7$xM=pD7nB7qE8nB7f:-c9-g=/h>2f?0f>2f?0f>2e@0e?2d@2aA2_B2_D3^D3^D3ZE2WE1UD0WH3NB,\T=nhPb^ELJ1IG.IL1;D)=G,>G*9B#;@"DI)UX9adEjmNuxYtw\Z^C?D-4<$8@+16>16>16>17?27?27?27?27?27?27?27?26=56=55<45<44;34;34;34;329118007//6.-4,,3++2**1)*1*)0))0))0))0)*1*+2+,3,.5.,3,*1*)0),3,1817>79C:?K=?N;?N;';J3AP9GVAHWDBP?9G81?2,9/+6.+5-*4,fcTfcTgdUgdUheVheVifWifWifWifWifWifWifWifWifWifWjdTkeWkeYkdZle]le[jfZjiWkmWhnThrZfs_cqbixq‚•“¢±´½ÈÌÑÚßèðóòúüøüÿúþýÿÿýþÿùÿÿöÿÿòüÿîúýêöûåïôÝåîÓâèÌØݽÒÕ¶ÑÑ·ÓÒ½ÚÔÆßØÐéáÞòéêýô÷ÿ÷üÿûÿÿþÿÿþüþýùýþøþÿùþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúýÿüúÿþúÿÿûÿþýÿþÿþüÿýúÿüúÿüùÿù÷ÿú÷ÿû÷ÿýøÿþúþÿûûÿúüÿø÷ôíÿþöÿýôÿýñÿûëÿ÷çùçÓéӾʹžµ™ƒ“t_vVAiH5kH5pM:sP=kF4gB0fA1jE3lH8nK8nJ:mL9bA0bA.bA0aB.aB0bC/bC1`C1\E3[F3ZH4YH4XG3TH2RG1PH1NH0MI0ecJ~~dpsXTX=IM2FL0;E*G*>G(@E'BG'JM.ST5vwXyz[nnTRU:@B,>B+>A.9=,8>07?27?27?26>16>16>15=06>16>16>17?27?27?27?27?28?78?77>67>66=56=56=56=54;34;33:229107//6..5--4,+2++2+*1**1**1**1*+1-,2.+1-+1-*0,+1--3//511731;2:H9;L9>O<=O9:L45G/1C)0B(3E-8J2=O9?P=1,:-*6,+5,*4+fcTfcTfcTgdUheVifWifWifWifWifWifWifWifWifWifWifWjdTkeWkeYkdZle]le[jfZjiWkmWhnThrZer^ao`fwo‚•“ ²´ÀËÏÓÜáéñôòúüøüÿûÿþÿÿýÿÿúÿÿöÿÿóÿÿñþÿìùþçòøÞæïÒâèÌÕÚ¼ÏÒµÌÌ´Î˸ÕÏÃÞ×Ñëãáöíðÿ÷üÿúþÿýÿÿþÿÿÿýüÿøýÿ÷ýÿ÷þÿùþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþþüýþÿûÿÿýþÿýÿþýÿúþÿùþÿ÷þÿõüþóüýõýýõüý÷ýýûþþþþþÿþþÿûùþÿûÿþúûúõòýøòÿþôÿþñÿþíÿúèÿòÝôãÏæѾѺ¨¸žƒrrax\Gz^IqU@aE0W;&W<'Z?*X=(_D/^E/_F0_F0_F0^H1^H1]I1\L5YM7YM7XM7UM6SM5QM4NL3MK2OR7ilQ|€elrVQZ=DM0=H*9F*9F*?H+BK,DI+CF'GH)LM.xwYsrTecJSS9KJ5HJ4DE3:=,9?18@38@37?27?26>16>16>16>16>16>16>17?27?27?27?29@89@89@88?78?77>67>67>67>66=56=55<44;33:2291180-4--4-+2+*1*)0))0))/+)/+)/+*0,,2.-3/.40.40-3/+5-2@/5G1;M7=O7=O79K17I/5G-2D,5G/9K5;M7:K94E3.?/,:-*6,*4+)3*ebSfcTfcTgdUheVifWifWjgXifWifWifWifWifWifWifWifWjdTkeWkeYkdZle]le[jfZjiWjlVhnThrZfs_`qahyq„—•¥·¹ÆÑ×Úãèíõøõýÿùýÿûÿþÿÿûþÿ÷ÿÿõÿÿòýÿïüÿê÷üåîôÚâëÎÝãÇÓÖ¹Ì̲ÇÅ°ÇijÏȾÚÒÏéàáöíòþ÷þÿùÿÿýÿÿþÿýÿúúÿøúÿõüÿöýÿùþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþþüÿýÿþýÿýþÿûÿþúÿúøÿ÷÷ÿó÷ÿóöÿòøÿóúÿ÷ûÿùýýûÿýÿÿüÿÿûÿûõÿýùÿÿýÿÿýÿÿýÿüýøúúò÷øêÿÿñÿÿïÿÿíÿþíÿüìÿõæÿíßüéØøãÎüæÎàʲ¤Žvt^FdP7aM4\H/]I0[J0\K1\K1]L2\L2\L2\N4YO6VP8VP8VP8TP7PN5NN4KN3LO4NT8`fJenQS^@DO1@K-9F(=J.16>17?27?28@38@38@39A49@89@89@89@88?78?78?77>68?78?78?77>67>66=56=56=538227105/.3-,1-+0,+0,+0,+0,,1--10-10.21-10,0/)3+*8'-@*5H2:N5;O6:N39M28L04H-5I08K5:M79L95H5.@0+<,*6*+5**4)bcQbcQcdRdeSefThgUigXigXhfWifWifWifWifWifWifWkeWjdTkeWkeYkdZle]jf[jfZjiWhjTglUhrZgt`aqdh|sˆšš©»¿ÍØÞßèíòúýøÿÿúÿÿûÿüýÿùýÿôùùíùúìùúè÷úåòößêîÕÞäÊ×ÛÀÒÒ¸ÌDZĿ¬Ä¾°ÊûÕÍÊæÝàóêïþ÷ÿÿúÿÿýÿÿÿÿýÿüúÿùúÿ÷ûÿøýÿúþÿúþþüþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúÿþúþÿúÿþúÿþüÿüÿÿýÿþþÿýÿþúÿúøÿ÷÷ÿõöÿõøÿöùÿöûÿøþÿúÿþúÿüþÿûÿÿúÿÿüÿÿüÿþüÿþýÿüýÿùûúùþøüÿú÷úñùûðúúîýùíÿùëÿúëÿýíÿþêüðØÿûáêܝt^P5PB'WI.WI.ZL1[M2YN2ZO3ZO3ZQ4ZQ4XQ5SO4SO6SO6QO6OO5KN3JM2HL1IO3IR5R[>OZ<>I);F&@K+?J*CN0DM0HQ2KR3IN0JM.YZ;jiKedH_^B]Y@][B][DXV?PN9KJ6@C2>B3>B327?28@38@39A49A4:B5:B5:B79A69@89A68?78@58?77?49@89A69@89A69@89A69@88?77>66=64;318005./4..3--2,.3/-2.,2.+2++2++2*)3((5$#7'>!/F)6M18O3:N39M29M26J/7K09M4;O6:M76I50C0,=++7+,6++5*\fN\fN^fO`hQaiRejTgjWgjWfgUgfTheTgdSjdVjdVkeWlfXlfVjgXjfZjf[jf]ieZhdXefTehSdlUenYan\aqfq„€•§«¶ÇÎÑÜàáéìï÷ùôýü÷ýùùþøüÿöûÿñõ÷éøùçö÷åñðÜîíÙëêÕàßÊÔÒ½ÖϼÉÁ®½´¥¼²¨Â·±ËÁÀÛÒÕêáæùòúü÷þþûÿþýÿýþÿùýüùþúúÿûýÿüýÿüýÿþýÿüþþüþþüþþüþþüÿþúþýùþýùþýùÿýøþýøÿþùÿþûÿýüÿüûþüýþþüþÿýþÿýúÿùøý÷ýÿúûüöýýõÿþøÿþøÿúõÿøòÿúøÿúÿþûÿþýÿþþþýÿþýÿüúÿûúÿûýÿþþþþÿþüÿþùÿýòÿýíÿýêÿþæøôÛþúßåßŎ‰lTM0WN1TK,SJ+VM.VM.TN.TM0TO1SO2SO2QP4ON2ON2PO3PP6MP5JN5GM3DM2HQ6EN1AJ-=F'=G%AK(EL*EM(PV4OU3JO/HK,RU8bbFbbFZZ>YY?ZZ@\ZA[[AZZ>WW;UT8SQ8FE0ED0CB.?@.>?/=?1=?2=A3:=28>28@38@37B47B48C38C57B47B46@56A36@56A37A67B47A67B47A67B48B79D6;E:;E:8B98B97A66A36>14H&AH'EM(IO+JP*MS-NT0U[7\b@_bCY\?TW:TT:UU;VV@3:=28>29?38@37B47B47D37D37B47B46A36A36A36A37B47B47B47B47B47B48C5:E7;F852<30>-3C)7M)AX.Ea0No:Ln;Ih@Y<;S;:M:9L8@3;>39?39?38@37B47B46C26C28C57B47B46A36A37B47B48C58C57B47B48C58C5:E7;F8G68P85H52E139?39?38@37B47B46C26C28C58C57B47B47B47B48C58C58C58C58C58C59D6:E7;F8G6=F5emD‘b’¦sž²š«~’¡x†•nq|ZZcDKO4KM5KJ5JI4LJ5PK5SN8UP:UP:TO9QO:OL9KJ8FG7DD8BD7G6=F5W:3I2*6((2'%/$ \ No newline at end of file diff --git a/testimages/testimgfst100.jpg b/testimages/testimgfst100.jpg deleted file mode 100644 index 36d9b75e64c75d12f01447ab77faddff16b6b4d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18884 zcmbq)Ra70pw(Z8;1b;3T^{G$`}4kU^+%5y zUA0z^?y6d=X3hDr^sxy*mzS2420%an01%%S;A0ga@mc%7mH!y|zghU~{m~1+fCr=k zcAy|A0FW3EP#6#&g8BEC>UsH1O#X} zIA|yU1T+RD6bv~myBGitOU(p`=^O};O_hj4K}r3^w4h-IfkRvp^s{g4l1n40pN3P) z3>@?q5m#FMTj7-zSI8}7&vHHc!W=9P>7$;MH z;4IG#{DKu!rl^r+InKBN+u#;_`8$wnroy{py4@)qjN6ac{h6 z!~6v6b^7k0{@41u#M@Ig5Y_Uu#gb#U_R)ppu!p$g{OIWRF*R9EXOMJ}EgTr28IgfDRz}Kc< z2Io6vv+wJC>&hcX15KIqyTZS^*QNgn|Fs*WD}xnTJQK=&_0)}|YU9;i`z5fqJ8fZ+FPutv3ck{JVyOdS z!WMJi=nSRlv6U=0$Yrmvd8G$?q3-DzZCI#{u&nfDdfR1DsFql1-Jn{BN&ZP96fCAoxB26ui&8EARqnEW1o;kN`Cm!%Z!VN^F9j{46Cp{?)p^r-w^(84d~`$ zv2txfvEZ{QL`Dduuf{J+CG?2Qszf-fdct?)eH4W^X|Te2M#D6XN8{Rj=(|RRjUqI& z_q{DGf1ksdlqYX&M3sbP26m(g-z~2iCis?o^(J0>CKmiFAKJ&3y8oI`7xUFMY6(=f zE*sgwh&eeIxGmoUH;em@~)@xsfRc7KQ_Rm_*8OsFe?n-vFXk&p^Cz}CA!!zKAHSnP-QWX| z>8!R5<2aogp>4_n@x@VBlovLQr`*NaGZ?n$85FR>oi+4G_!!-_<1gF6rKgOYIPf>+ z@;JLDFa~E@rZr4zYQf)SNz0GXm>fBhWO^6{wK(AETFA2#KK9T0`#v3`6NJQ?w+yWC zjwbc_op1&=da*cBZjTF#7vtS*h zz|T?3JU&ODqk{sTQjrW%uvudHUq=)a0s zfxTI*JKAS=Di8Q-kxT^9bk^eFOl)QEcsnB)?ru*s-dzMlK#Re z`M!2;0j7z+OVMiLS_SFSNymq=VRKb3dAJ>?)% zA}**a0FYJT7gNloN7B--wm<(i&SsFfvdZ%Ype4`m4uNn#uEwxV0D=gFner;`kEL`c15)~*sz5HlG7<72$tq5;31!g z`*T%oFwc>QZ;huw$P1Hq;I<~jaxgV~@~~?7kAyxklFo0oKf_}%i}jaMtueamz8qR} z{`z8Zm%d+$Bs}g`Ws+^UP7R5B-16>V+VK>ct-WmRyNcn^SAu!rPI443`A`MIkoTF+ zT*8F$Gcw{LG`R_$&Ncb~2BXRnYL)((5t#h8yD#^^~gjsDzBY zw>lxmlRsgST}vghC$}tsCYTPJ3y_zsy`6BLbZYh>o?vZuc5z{dxj4Vl#4bd7^Q*4Z z`EDk7<2E|!tg-h;OeUDz6S84|KnNch3E@L89|Xj4J8rc8KOkZG;(6)O1~W{-c*p;xqLceUhKX#cGLxMY&3lk& zqnJ9vX@4(nz=9J96G1}Iu#v%nCQ|_(T0*57C$A;7eB`Y;^U@s$8YF~%_uE(Nx%3_> z5awU%x?b|0Z+w|P>fw8GIX+vorYI8l&*HZnyxw~-89O|2O;wiv<+}bMuwHRdJF;0iXt`hLM*rV+T4HDwic4?b~JguDk-#p{G6pRl*IRH9nV!F*8H}bOZce6#FcL+8$ zpI^y>5aAEMfN;K~Kt6H$P{bodb-MS%#)1e>-}Y!6sxhoFI$KP|VBz9Sel7i?>sEdy_*m$d#(i)T*FtI^it>(ef_eQv9x)uQ z*OdJD_4WDw18{`h*sTN>qhQO~>LpTKI@?}L>)C&{A&oBdN6oE~8u~qZ*lX4pl=GND zs=-G>hCpAa>E#hOWoq4-HzIqfg}W|(EUOgaobWD$4%hx?#B~srt zvP7ToRh;yFA}h}E=H`G>jmo7VuN;DI|Hkdmlv<={{o@rq#2Vy5E90(9gRUH;#?JRM zCn;gCX7!VDjalnk?BGSj-l@uieR-68@zvr=n9FW~l+86_291+ha|FS)N|2{nn&5yqK9vR8tc=^_mvfmn!c>)=HnXv_Gn-da zC=sanvE3_!=Zh&FpBFw`mjgV4?OnneKc(Me~a&9fT^a+^2LCyxi&SyCV(6wWM!KSKu1-e*k`tG`)%tsl%<1;A&JPi3;brBL6Oj;Vuy^lpl3s97(Teavj~z zdzZPKqD&4hd7W~neF!ps+xP(3iNviZT;UeJ@46?WC?R*Pf({jqt&R;S)&za^L1jZ2 z87MYk4#StnVt_AdxB?dIS8o_R$sIXzK+jv&kQ7uluWX#ZY6P*&-grH&)xv1z6@R|3 ztfEDYLZk1pxwS(>uA4!1HDfEg^*kz%7$%gc-Gq99l@k!>!}>1ggWBT~K*Xpn+*5L3 zkwg2=3CpmCYvk|kaLB>IP$9D%cX_{&2NMR1OM9_O^9+wvh*Fwa3Ul(T}-YX?on zhgFBpU5I&zyh%0UpzNrk7XoD@ft+X?xY!ZO=7YZVAn*N(N-=UoRATTbMML58 z&%DN+;*KvQ9eo>lCNkB-z@tWSDDvN0)|{(5o_f??VxqH6aFBcezF{AgM+APkyDY1X z;WS2n*H&%aq^8jK4?tm}KX1pH0S@h0@R`CJEhEX#{$^(11mCN0OOZzBIX+mz^DfS7 z_vs?_iRV^esXr{oe2o1w|Auxu+SkXvqmqu2N5n=@0d3;x@h{KeXB&ONIyrZLY#$j{!&LX-{gj;qO-L7`|*u!ca!loqF*AZ z5Cvsg?LifI+1?ZO!eXPVIPd1RadP`;H28IR+*F(!H7>wji_Ue)B0q=c!BB9spa=SjG9Wa|ZnnLp`bmp% zZQW2nsoX_z<_91yQOajk|L!aC)QZYs{$Y4n>rAL7YnAM_27|?kN9}~{^qKoA2OSda zSTg1K>Dirk{gElrzT3dHgK5RJ*<8Y?A2CCp|5G6e&*`H-WwD;!lgdjnG6*vlzt_0i%w`T42dy2%)-ZTF)Hjgdf+QpI#%C02!s<2UUO z0G2PD^qkQ{x8((?)61WK|1?2}`-JMRoDl{FYe;(ubIGl3w_H*3gW)|1nX;`HQgv3% zZxkoY^= z-m|Kg(_4aJm!LW|P%{0Nez5id?mS z;I^ZEgL;zzRtzSQW+UU^)EywJ-LjmfW@@tDkK>HnqCy!mg~6Q@8LJSB z&l>#Ww?2AeJN3X?0!e%fam+C&=2;1`6{Otj9ElOXBIF}{lB6g4uNKmf&nxSks<=W) zBp)@o7CynOHWa4TbiKOVhi zbRx@Ey}JFBPjw4FhM5ku32r9f=zm$qT&56V1ov~QDE@&w=VB4|I)4s$%3pTeoNbEW z>&yE#eYoNa52`yH$3G&WMlTW{M2BDM5|f`s_iD1Oluy-6X9ZRMsQ9YWVA_KpoM${W zg*u33W8)f0MVn84{j$CP#_y3gH3eS|#1N^eT;uTeE7AAa85cn(1rc$cs)o6e6D8#( zQ%254>+YaWm-mF50Yqu-z>!gE4Akd$T?jlkl>0)3g>FzmPU5Df-h;O0vhwQV+)5gF zWJ#j<5-3oPqRwJ@aW;8yhxfD9+Bdk4kPaiJ5K8&fR2nJQe9YBMjh5(lwA!cfaJVcw z{o-S{WAYwHSn~|ben^M7(c^-@B#fIe_DgpRWRx{Zy%;J}Uge1NBzu;l3!h|t6$}al zwjpOYI~yYSP!)}Qrna6ryDJHAmAmIB(U5uVpu)`=E<)oYNO3ji%eRBKWuemqeK6#J zW`jOL7w9g232Ed5*=Yg{DM#04d7IZgncj~tIctevzx`yR)R8}Zia(a^sdY{;z2cq& zbaw5XM4h8zxod>f5``eMtmN01HD!+13Zp&%woeJW4NC+jh1)k8NcMW`i~O@+<)|*- z_OH!VGejvAHAOXP2i4U4(Goj_CT@;?;G=&A+srH+OAIvX6G;Vm*F z*5cw{Fzdrei_48lOGHPSoSK2-uLDuOzQnMd_q=nc?hWna^oYT}{0%G;8|wPA1LZ6k zxqXw=4HldXW;bETI>5pDDj)>JIbK$hERh)YamuTFx6JXf->piWiuYQNt@Qv@b^h9q zyNl!MNSjIA^mq|B31J6?{yPG}XO25M%NLH29+$zDTe5tlBoQ!JwBr`1zMD@#ueGz6NX zGwKs$MHH1_=uj(Pz(CL;S8r>Mb1T@cn9Dt3H5=$K{3Ol`O39F_KIcL z64L6*3-yO=D3Z9d*4AatoQtijDiu9^(eu@WR~n?(0Wwk5yT@?1LP-=5gfqoZa-O#b zMTbEz`txYai+J_F+o~HsxmsIN2aO^6IXUdO4Q;R8} zOV^|2bbUo0#!_{m(rJ#(9mox9a3f0PaalSuwNn#x3@}BeYlYo1m$Nm7dD9oK+j`z} zGX(#H)oHhA%ReY3u+s=%mD@ajF9GV2gjED{$gc1t3fPiyZ@; z-D!4C$QT!IQ_m5|R%ozwu+`{EDG-zfrRuTA8`?1SFMP9I8!(T^7{VKZ7c99Bg5WbK zZ^wqnBtwc;?LjnJpuwZC4Qfzq#GQD`X_sM5e^!(<6Qj+3{sQwJD>y{YKrcsDm8tqe z-bc*bdS}Lc_e4FIC;sptlxDhYR>_cqBhpR|B~%g5ICpe>GE%6fi90itZq7qd3}}Lc z7TpgC@wk&n>gUNz>&Uc`i2IinsO79B_^;z`P2Nk3s*;7^b^hcpf8bZq`9c;4)b;w3 zFIMYcT{t9J@N!LEa-+k$i-We&Ctta6aj1!x%A?rH);el;vx)gN`+VVcNbDeK4G!11 zoAIeOGBkhxKoUnU38P*MK5^W}As>w+FHxPNiL<#qdI`)NtL^37zs$z0iH%&Pd$>Au z4C^9ucD|Fx`mJ8_0RRiGrsvt$dfVnIhh;S=m(N;G(O|P-g@lRV?Am&xk!`I3zoE=- zNiAs!%4Rw<*&Kwlkz(!$pt>V37i05b^z&Is^mCc8rmpM?vAMb1d_0t|!~>}p;F9P*P*TgcXPZu?EE(1aw*=zDq2g7GM66)JXIon~I(TDy8-PhK<N8l$-wEmLck8g;|!P_jc_!@rljXun&`g0{TwEjPFsV zA`0QCQuT5>eA>i(Z_3yhH<3HOwSjAH3e}Oc`r-K*wKbIw4QW#>Kj%mOE1Xa zsOJrwk0iY>oVmzoC1a7E@0ss;{s1^$FZrSpsf0>q-lpDh(a!_xu>;$n5ZH2EZYUYE z?QXOyWM$;lg~j93o1emCt1r^>_=BF?N8WyzvixCZ<*<#=P@$t2gP2`@}Uk(zJ6J9dk#h{l~70@02#Xk13a z+)WARG`eI`k6{STDE`>$xW3bI@VXsK(Ow4fH+prX1yv#&6;9;*d(!6+6<~R~qL-x! zTH&s=|MFF|O9mus(jK#5ixf@yHNaFtwG*;RwPz|IDj$R0t7Gskl0o)!P`D~U&KaMR z59M!!5cvV|o3PQKHX z!w${EgKXT~I7FZVn^3;>nAK6b`2kpS#9V%TeG0gn@{!baTKGDtU-?kc`nwtB+v&S} zc|}Lz)VJdfiMfu@Y`s=ZTqdB(ntIw)TIKi0oC?$5-42W+Hr&*?c?ad+zS)OSnKb`9 zx|pL;&Zmz0y+T@VWKw@k-Hr(+k2qCe{{q~O0w4c$$B&!Pg!+cgL#eO3#s=O$&JEwJ zbH`fN)EJ!8OhS}t9;*i-RDjK^vv>sPv!8|5BxU`vJ)RR{J{e0a#tZ`2budEH&nL z(DQORoIS?K7F0FMx8pew$WP~@|DBKyHjKb^zHAbgFjFGI{RZzGBf}@f<)cw&p(GqM zn)tGPvg!JVkJ73ll+AzDPOkhhu>PnE-ldCy#1aMkHvk%(zRxO(fDl z;{4LgpFioH@H+Q90-5YceHp`&CM-iuPHh(&I~> zv#a|%ah^1Daqx+>v=0oUrVs?ON>~;zw#_Uw{%|FmjvX#Ez~*33l&UoNQ& zl?BxMO!T@^a@V^M4%e*IT?Bx%@6Q(kNKmbG;$RPWd8u1Plzq$ zdZOwkky=2roi_-bS~N=}gT<}3x>UuMl8BF?nwIUTrt48xzwH3$Nsy<|Mrkvy|;#&l{Q&ROVu=q^e8sYK%%sQ=R2yRv(2r=znqVF+J8YN zimJzyCol8^5HOiTMzAEBuezC}G3+wh+E5W3F;|=G9Ho0yBEg7ts5WNadJ;a{-zsdA zyxgQ^tOroO-p!3Qs0?N#wSvmc&uj@P(GL;{EKSO3zkyE;@fm_Zj#UM}4;BMGA@lvv6eGT+NUk(!yrC;ozN);d^ILND>JYonl@G6k% z{wBH+yd0Pemvj8Gsa!)W+%9L7J^uly-Cxct%Aplp1-acgiVo&rr5x?j?G8Wu(w^pY z6Xx4xn%Z(^;jEiu^l)5U<0Ae5==+&B`Z>TwxU;rWd8AAhDPmc(Xrc_qC=LO@nD|(i@WF(57+mzUP5gsaetRx>f1^|bEp0g&L)FgwJkpb-2f#586TZT+xlP_RUjIN;zT zy<_ZY=qG}H&$^c#OzgY!UXu>y_ugJstCU-iOWgBmj=b{)AEP?Bv8gEK^IIoUNK9+m zi%u~<8f$m9Senb5xS*#5W+VU!YUKk;wY&WIQ$Z)|!F-xL{vtlNPf@r;XoWJu-456n2HFG8 z_xkPJ6Z%mKOP^n3bx^yiPl|ug z3=t6KY?pO>)l4g_@TXBc{Y6M zJ{fkh^d|pA#NmL8hpb#fAgQ6^SShH1oVSt>1rHXZ?EyLjBVQoqs}1W{7-bd7YKiyB zeE@98TyV_e>@!WzS$*rZF-+PA%LedHlb|$vVKf>a6;Lv=+VsyaKBpH8$=M=urr?lK zXii88gI=_yDnL^*JB>xo5|^i#u(Q9Coo?`Z3L*@5Z7MOfDOc3Uq$|?M4Ou%+BZ;G_ zw>~}bYi4BvYeI>T7(;KQjg;3q&57Um%S~g3W_>C3fPAV-iOLkJUMC?na9zVeJw{focs(Z_$9= z1jBhf6y1j(5IITX18g^T%n>n#bfIG@BOJ2ie$H zUUI)9rv*D~q^CTr&GF5(6r&!)@)baF(DJD?O>}xOR+5-yHn@PB)ArT4ws@51bfo8~ z>av9`yhk~?&FT7iBQ~P%EXylnwGN~E-@-~&#x+C6R?#0~^whJagMfpjV7EIP{yh#1 z80;)i1G0`=ML(o%trgTolA6iCxlP%79N+CY3I4Zj$KO;x>h z-9hFnr$^H^!%o>4wl}B~#4ahZSq^6@h|m>PieB{BVuAkXTjeZvhBZT40UV}k0SiS) zL?oVvBmy*1Usp?W!j5N@yJrNhM%o;$CKkmGMtMag(y^>fc*{T|d_6RzVC`F1EpQZG z6`L5o5Nit7w0Evqp$i^rw4GcThqlRjVg(O8F~^u9uQoyT_**_D3II%ilmo@t%+rf9 zz(vhRU#;^EC($3`s%E;%qGegjp;QL9prB{uEJ1)h+dbS4!)FK_Xp3pfzeT-CplY_U z_t6xs7l%dy7U7|B!AweP0>O=3uu3eQ>S7v$yhH3|B|10^h-nK_a?T#TRJ@H1WZr8y zX=;wc?E**|GjtLItk2lwhRf^RJlqab>0lOb7O$|#5PA(WU7C`NU~`rdvh1#@t@U5- z5l+ah=%tzn(8x!8K&>%Vh4ga$ketvpbOj7k4c-W~udjri9eyNnuM4Ft&Ch z4udj!4wkYPn-@$^&!2S6ufk87{PyjIT;0PeST$n2DWqaJBf$J-Umkngd{bota**$a zLasH?6@p$ zR>}?Hzbi{-r<)jTpN19-h*{H*+~+KXgjB}6mDkx1yphbns3O}|iPxNF07rZNoOVu; z3|vz;e6~m|0$5Tw%F^H(QdKe2zW%WvrPtGv^0U;1;^nZmoo^_2fH`WZ{{Q7a{Ok^# zr@D6EiKUYl(H%(T8og~|k7!@Iw~YteDXqU~)3-})!Cfe>nBN+yaOZZdX~t3gG{Yi7 z0!i2Cj?P!9A(BmWb#e`ClXtc+mEt)n#%2hSES9#4B+up18@7-8vcfTVGYTQ&k61xAAK^tOv zREzYz@(LF&Y_;$QLQ5a-DC*=js%iZ6xy;H-!_#Kgsn!7vswLk0I0~fOH=KCRhdhoD zXte$asxGDj)jPR;0L%rA3Kj?SgIKL{pHL7rl91A6Ep4DOVo@r5XH8S{*s87?W7U^8 zOhE5bWGRUPBM77=fS)}@Kj>K5puN^H)hxjWv337IQ)nnZ&au4tHFAxHSGrqvPYo}~ zWb2%hRmQJL?Q|RX5;$K(BM(K2?(bl{VMfIUy~T~}o^nZ+Exy~fyO>$cpOB{S3g(ed z?5``bC?wToVj|#~K(ssAu@qD|-jJUnyk048#W0ybXD6_}$TxPa-n`{8buf&8&3w9p z*KPz|9sTSmmV$xbY?=w8D*Ols^I;b+gI9T{3=3Y22(H`7?<=v_?1j)d(6bNM`8bbv zo&s^^1w1hu)`c}xr|UFk)t`!WJcs53M=j))Y&;$`;u&QJki=nzio_7(WtV;RFK z*yW+4q87Tjx{QC!#bda;Z4%=B-Z0n3)~@9ArN(-Q##PM6Z9(3FI|17p?eB&&ejW49 zEp~(RCYL;ly(;ZFNH9f9r@WX;dSTABKBHg*a68 zTuC?ye?k>%8`I-w-w2PrJny9@?|;3d*OBE^fbQ_Ap(HZckqiP~;cTW3>^7tVDo0Bt z3#G2#wmEHsUeA0{7rwd8R?b;o&-^@dJ$ewhSDrvHP|QNLXNZY0O#mrDV9^wR$IpGJ zfF{8g+UIP4;Ge0|_L;9D9wOa7h<=YMislKAL_t7wH7b{%(D9oyj`#%mc?7Ir&#ZeO zj;=+tR0-al4_90%IWsKF-eY+CLn3`Z3_mfQabBjS`SRiB&YXBcW9VcDL;vFDk!<)F z>n(LAF-a!K*whkku~{%ZSOebd}3 zCgpW0*TO_{@ictPiNLzJj&4h<0neo?pK319PCB?dEs8yH{{vvsj_MXae-VsOSRy4X zdAlYvMBtLamkaR<0iEUl%lDveSY6|X*jv6y9q+1fgTBj1rZS0>Sw2wW>APblwyb7q|uy`^G#>c$OVh>Icdq;S^pytUk;Re>h>` zhc_UpD#YH3yBG%gisfwdkdn?;TC}gB+g)lE?Kvkj3GoKIU|box{P(h;_}TPvriuY zXut!_T}zTa@xE|SHqXV}yF2AQ!L&}M1%j9Ry_=jV-ajSk$PGq=e0%tbh4~Ine48=) zfjO~0JRo=~x3sBU`Pb<=OCB51*SK$)mhh%zLf7zo@v;$emqeWFgeK(`F^_!pP$u(v zc;xvv2P%Ea*x^3@$-#@baY3~g2nm~Sx+4I6R`7EF%X+!sRgcZ*-ZgfViO zS{opuLL>5zwCe)z3vEO{FGCLhs$CVM9GdZ?PmYH?OU<~Ft9|!u^227FklgrT`8e>Z z@!$E{li7r_)h%gA^t_6pVd0D_m3ebkEt$?IjRrSHcN^l@aLG9C%Y4;pPZHMOR&Y>} zUV?ti@MAy{t`UV4Y?vs`HeL*XBovu5IbF zUbT1T=#t*Je70$LAG*KT8Qz_~nET3{R&uVl<9R(VB_N!(!I6K1Qa2vzCNzBM;brF| z%0>{6aE06Hn~Ol9nh3fmAx+;aI6xnp^3CsL+g-7vXWi5~n<+y(@iD3;lF_bj=BLCc zR2yMmc8t!5s$n0hQ|6IV%8z$XmMNfphDqBt2!CdjIP-d;ovd{k=R{ap++JB@U$9ZI zh$HuKK%psDm;kGA^d@hTOgTJ~$o(@-#l;8dKWE8`skkd0<@rSur(bJJrB@S`l4yf>Jv2il?tTsQuKPa%Ed8 zy6b}L(rDu>5R@*Dj0G3vAbY3t=mKCafNnPKcMy*!pnO$uyTf0Vu}b#QM*r#Qll&~m z7}f}cC6sRu=0XfmyNlKwqiPrY{tZon0k??dkge(V&TO8^_!BDE!XX%{n8=%K7Zg3J zcf%}=Y`X63+4J)!5ZLv%WcrsA#tQeW>}B_-b>>%&NXUavmwXPnf)4NRpFf5DDh2JI zWv+hlFr#y#K!PLj{FK)8jT+Eg!?bTO_**d~r2C)QhX0g9neL{owSBp9o2QK7$%*)R zmG~7x8t3<(D3T9B_jsZoKLbaxvPPxYO!ra|#qxW!2iGWc!j;lR+mENjgZFv?zRwsj z6tL8vscf0o!zIJ4v~BNm)0kLw>a5t`c)*%?O>j5fZo1 zx}|7h`6BtCy0x_7U2Wy+d#HE*ib&B1&#P-RCBpXay_KbBMu54xsY6Ow5mGlVcMI9K z$tB{%SEkM5w1s#b&A9Gu4dyo9xV5zN&Fd=CAL8f(@I<=!*y1b|Y9{9o@sQy9`_F-8 zV;b18Rpmbb#VYNP(mmSD=*B;|ZEin~hOmLXy~Q8ThL!74iqB@V!jjjyVht^JDj9!n z{_Z9>4oPr!QOv(W26{%YVnbzsaY(egH;%8uwX*dDw{6S`z}?+D>aGV|VPq zBA(%77mSNm2*(>GBT{3N#X2S}3$bs{t&g7xXfB(Euv_qA}y?)x*`>GWe7CHOZ ztpz`96pIgr3*HfYd4{}W!17?4rHkl^3r?*wW%S#!t}0&K{Z_FjpMs}r#;8_2z4%zM zgT+8;ec>Ij+s^MOUHaF(AOOX!x+79)@U}%NQtc{VkEUkN4aM%Aw}G2M&=%RWFd~=* zPY3}fDv*b#%GQf_$7UnwF(M;xTKgzc-fSG2h%53aQ8U!qz?|&3tM$*6uN@l@f)0 zy;=uKW+)h_1#aWo+h6R?CmV)1;>8C*@s+Ag58Aqhg(TdEA)oc#(e;wO5l*_Stqke%XKQ~mVsVm9xTLd`gZ=>*n7;Gt%x4t4l?<1cc zL;p#0HvCMyC?hHC<$U(`YlLKgMWbfQt-J5vczjEdxr`;$Q}QI^Ez}B??M(klzG>wj{)@rj@90o$*p-EMP%{=|VNZ56(zcIt~N+dtn9?`B?I{G=(kfin2(V=+$j zCJGf*cThe*fF9qsMFxe5&S^N5q|oV5Yi)>C)V=4A#{}i^20W|}0Y3QU+yqSBCGoYy!=;JPtuw);YCm+5C|f$fG~O=OoAOfj@j2wA;S2$Q%k_vYNcS zdfK?5tSWaFrqSCK+#Ob$F4%+D4xQ4(%nAYit}wmu#xx?n@-G!W6e46}RzP@W`l>PF zF~9q5EA5J5qg>O7rAT;M9SrZGus_VTUV6)ulBnd4zb&6CCth$C4LMzw9-k?M@(D$W z;GNm9E2H*y4rHs;j`oGSJyN8ebuY9o@D|~`TCKdf9z!M97_UpS6))~r7H>7tS2Q8Q zHBibXbiJqrSDhdQ`&9Ry>Z3`>lSjoc)$C6_rMN&Ma8(^98M~pvyVN?!1se=x)bCno zX=<+Ch6JFj)WXz(jRRiM8{g;$UfX`F#97Mhszk5(rLArRTmPgr(UXzAirK zfGXTeeY1oR(-7@VUGKj!vIf-xThKzsXWS(PGVGTC>Hb|;Ak1zsJ`GL0T@`XJL)S- z469V0`qXUZk$K^zd%=-kSnUOJEwgQ^m5mm}b$ zLfPfd;xjticabOBM(gl5os3HkssdclGA8#JeZ}01pBGfOtJ!n4W*9w6SpScPbA6vG zF_g`mT1ig4bQ1RuRD!e-+H50uFjhAC35R{1@n3aRvs+T8{GDuYwJaKM-BU+n^XhhI zlF_T5G(YTF@zxXOF36*@=cEd|kf(CV)h^5zug&GK)@}@>HiVoaCHVucQ5>&a$0 z06b@a+1!{*9TFNu!z2)BuTT-bUcJAj6|y@dm8gZxyltsUYfEMOgVj$Y!{VKX{RsEa zHG)xx3mhXSIe=INVNLJ7H|zu8i&wdX0$B5W@Xmcae)9>tB|?4eMB!TfaWVZa=># zjQRsuvH%*rm}wJZHaLO`ghlIMlq&{}K;&Shx=RzA34!6e%(u{;0=_RQU)^%3)DDW0 zas4S%mkz(#hBZff3~pw)t$YB+l%D7h1v=$ITkE2Z=qq({LF~hfTEYRlT%CL?{rkJ^ zl=i^e&etUG?hOv?woWi+#Y@#XD*~2Zbr94gEtWm=q?ALF7qR%vPD}`G1@<3;KF)eL1cx^5^ zHC6FQKpnljLS07j^#?$;5L6sbY4I z($odd%nQLB8_vCxuMCo@H$4L#hK#b zsQ|BP%xq1!4_+8zKtv*!1Idy{!VCcK!XL_Ho-j2NPgj^0K^%K_b#7>WGj%s23;CEI zfO~r@o_KzlO8HNjmMm!5)+1v>AL#lx$j;V1AE^C2+Ee#;WrXs=ceJ5sJrz}~;mOu; zBS!hGED-@II>wBkkr$PCt)o&RcVk;Z$iw0PmriCohO8A{20xVAKXHRSS>4C(4yKvv zrgP&KWUXvFkMv&t`3cOOe9w_osr~>YRPoK(jEO+c4_sYk3$**Y#PoTL2z{S67_mB= z(PDIsz`5zJx;8(w)*6!}x*>+#H?sqo~ft(gGm5O!I@ZaakjV#s2PXU3J zbvHKRE)U1NB?R81i@gWwR{tUdbjhiLO4*kJ20bea;s&PY(Lj$kE8IdF9{|BDRne3` zjO*m`FvlpX+hVL~jYBg2j8_bI!oRjXTosvX#%-SOdN`D4nx#nL2J6IbU6rPD%<{QU zo_UxIAip1B8rK;UUCbrsdB#T2&4*l@V=;EeKjH-}%AAy(D-R|!hlEh8n!JI|=9W6w zxK5|NihIv{D&g*IeKqxxTe1K|njZlAXw1m6@R{zL{k_K7i?+D7n)l{SrYJn%7`!peHne{j9qQLan{Sopv{j}&aek!u#1){Tjp7o#{# ztQbhLqaKIf4`1_kdp)u`-xD-f{7;-e_i3aH#NV$8nafc*Hli}yDmyvUh}RTK@mRoL z;e<>gUuELPEo|5{jKoyTg{MCNv_?n>M7p!~BGdo0XRD5t#~qgeQ+~1gMuMmQmJ@>x zn>`!fa`=J?aX;4}^@lpr|A}l(B+(w~2-}9|o6pLO@6$+7#huY<6Z!r$%`Mf}|BZc3 zBrz8PJ|6fYP8wI5feH2s$3AtYD5GRR(4QO6uUuHZ&6e-D?G;shIfD^OpQ^CwosB&~Do?!(<&zVW%Wwab zWCEBD9-#lFc(TlMcar0YFcm2E)ror5fFaTyT@#W8%P#Tv1;NM?Xs!jS*C;IPpBa(o z?r%5W2_or<<}ar(NE2o$3hH z?mzsE;%0mFjxrsvUCb{<{$+ZstmwH*JiK^;WTNLsR3@(+Imi}a*vEQR^auCrKsl8` z0_yw`QEOK+Pjov|!iaZRyIt8hNQ`XpkX({b3NxccBON+PjzqMjaMG4O*{!p?Y?Fu~ zD3n6>UNXS*mjg$G71;fkZjxJ)NL|n6i;Pg(xb0U0)cj1_JC#3Lfx}VtccFMzQ&paU zDwJRq?2W&qGj%S)DZB)3&>Jim5)oG0cts^Oz&0PLa2v@%7^7hQAd1SEN_YU9VuGSH zo(ZPFs3b?rwaHP}6HDv(VMa$mRQ-3Z$rA@d4fMfuY$_?vEp7~U{N5Nx=>qvQO14b1 z9Ca+VuSZUq=8BP=6hTmD(j1bgG;aSdqX=C0OWGp|=M(5!!|}*Od81D$T6yp)h8d8} z9fR5(pkZjibD<1Nwr8f*ELDV{XZ)oQ0w!R1R2tQ1@Usdr%9kg=-Iz{b-YQtekXC5_N2==+%S#`h6SkAJ~KyL z!1JP)EK3=-6rYBs5JW~~QFejBZSnsA+3xh#!;6)v-Mw3NJI$v6I5R}V6R@pJd}#jw z*m#yqxN?Uvj0<*!+}&{thbGbxVPa*Yn1>9s5TuaoRP1cP>2qS_Y@Yf50ET3|f6(zEz!5t#v}!&we+!K76hZ$0 zmY){yeXWP2x1xss06h?KB_9fJ>jL}W+|NY!it1`dl$a3w$5N0A~vkm@W&F zK&;|Q`Oe)l*Ymykc;{mK5>Ims`GKa_b&V^xT9&S2X?*-$20{M!1Tb^GOOfI?4BNP< zEaCH{*!gqk6BlltCc^!bvQCdb?)Lg${Nt{7>etU=iKzRTU#n#LzH$AzIqE|eyM`&k zxK4KN==D|A-=Ec1Dy@f7xAs%U`uGucxenpXsx>Y2*lXA8cP?pDuF>TXp+XIms#mX! zja<||woMqG5-c}9LP-m|k7rce8E&yZGAto{-?hjVve)8AlH|)Ck$go?m51=2 z8}_U*h5fZ>`~6Yl(>(#xQJ9FIFn_L>wJ&d3V}C7nz4%kkacts$2A~N8a7d%5^wGxd z`Um4b=J)qz>&rNsJssOlTQ|+hF9<(+X3_-OZhs&SSJODUyBvo$%#pV^rpTP&NaQa3 z;%<4levJ1mvjq%N7`+GmPQG6;UFbE|`riI6&zD-OTA1Iy9LKsZ$8LTz<$ljD(`4_S zj?M9Nw$en}42$`5YZ%z-Z>G6|OC5*R;aTDMex7aGcKZk!-YY(27--*i{okeOUT~?E z>GFF?=lfE73kzo(obzVq*5I_ji+EMp)T%le59*3v>TS%&$m-S{%ujH3uJci^MKJf} zONRHkX8UcZIl0(|fnHHZR%iaNW=Pg&i>|uzBwYMrV#Lc+6qOeNn>K^m8lApAsBL(N zVSyD;BUjAZ4NvFsdhvJY81W5$QhpwP45Hc|arJxUo$q%AzN?zQI9cF>`Q{AAzvftxpK}ft}G$* zCzjPXS#%JLCqP3RhYCN)8@-tLM*)N^8-^s*ers)af2S03d7s}-bocEaz9IN)nHMZh z%VT(vr|rk`8s9&!)5qR#VC!Z&W+?y$umjcGH%_DEZo$olVATvhUN-(ePByBAE*XS_ z^?%R!e=@^oxX{U$GA0=}N4#U7)djkd*JZNVaSe0kKYN2RMG_QACW7_-x4!vD$WXOg zrrt9z^lkPS`tmeuyFmjND$vvCuOqQ$0Yv%jLQBWz0B+P zx#B({{ZITz{qAQT;5TWAl}p`K8lWXhGq^wj?Hhb)gOU4v?|rFG{ddiaAT=6%jvhpg z>?deJKNaSe)BgZ0S@q38 zT1QDoEDCsur7QhqZP0x#)iXBsytwV#mSkoaVvJ@0`w1Gpb~@{Gve|9)=UHA~{+)Uc zrD;*Tjkj0_%QJ7c`jcKi)TqpHPnL295d7Q`&#R7C7kAn|#*tLbPYuF~tfrqLV&+#N zJTUfE!toF$L`%XxE7|k8BtFY!v}p1~JA%iEP?s{LS3F4p-{{ zd)%S$&CKi2eKxO&@B2upyB?K$oRbXLyR*6m?6A`iPKEQ=un$bGM{939b3P(-G+rQE zUU80pR39_4*=(EUfFjsf0sMOX(xivr@<}j&l590T{{UZgKOw808{qkPVv`kv3yy{- zv+DM}u3VCKA;TC#pINOz#Y~y<%0g(`7*E7_uW~Q(a^!Ojve|7bpZb!%{jWYNaUZRp zkM8~d05WUFm~S7^69!-%%fX6hn1ZPdeqs?(SyPEBaW!Ihj2d*vMB*WkS^IAkLCEYE zeX|}-d34nUB9bS`wW7D_5HvbJyj{bUvfJS$C!Gcr%{kA8ruyuDd(qvv^(N-?Ij%X2 zEA?;DL~pS_I+AO^HYTIf;fg7eB#8tN8UpX{1NtX7J4MiZoA!R+65rQ@xf?B(*XdvC zN6kM+ZBN-XHGeazXKHzWuio!oIy9twxG;q9!DgZUgp6{k=1pV&@J}?KIfAo)e*=)A0O3Cy*sJVRCtNPo!{dliI z))c*JKYN%r=r!ACG!0V8Fe#r1O%V{r!`fzjZ>!XMhRbEL+WwzZc@O%WTNCP!A^!kV GkN?>`nbk=E diff --git a/testimages/testimgfst1_2.ppm b/testimages/testimgfst1_2.ppm deleted file mode 100644 index c17f310..0000000 --- a/testimages/testimgfst1_2.ppm +++ /dev/null @@ -1,4 +0,0 @@ -P6 -114 75 -255 -0/+10,32.63.83/83-:3-:3+72.61-61-72.61-61-61-61-4/+3.*3.*2-)2-)2-)2-)2-)/,%0-&2/(30)63,74-96/:70A;-E?1HB4JC3LE3LC2LD1PE3R?0fB2‚D5œE4²D5¾D7ÆF;ÊG?êCKëDKíCFó?B÷:>ó:?ä@?Ò>:µ@,´?+³@-°@,«@,¤A,œB*—A(‘@-‘>,‘>,>)”?+“>*•>*–?+“@8›?2®C1½D1¹A1¤G8xD6J7&:6584362/40-63.52-52-41,,1+.0+/0+2.+3.+3)(8,,G99sCCŽMK¥Z^¤p†Š©z‡¼ek›SGoNI`OL]jjr”ž¤˜•™ˆrsaWVDUQbUQb..,0/+21-52-52-61+61+81)61-50,50,61-61-61-61-61-3.*3.*2-)1,(4/+4/+4/+4/+2/(30)41*52+52+74-85.96/?9-B<0E?1G?2G@0H?.I@/MA1LC2[D2qD1ˆA/–;)¦<,³C5ºI;ÝADâDEìDDö?Aù:?ó<>áB>É@6±A-°@,¯?+®?,©@+¡A+™A)•A)?,?,>+<*>)>)‘?*”?+“A5žA2´C3ÂC4ÀF9£I>pD7F:*=85<7494173063.32-32-21,-2,-2,/1,10,40-5-+6,+>43`;2|F:PN’gxx£s¹Z_–NBrNCcMH_ON\ost†~…wjl^VWG[U_[U_,,*--+0/+10,30+30+4/)4/)3.+2-*2-*3.+4/,4/,4/,4/,3.+2-*1,)1,)4/,4/,4/,4/,41*41*41*52+52+63,74-96/<5+?9-A;/B:-C;.D;,F=.K?1FI6PH5aE0tA,‚;'’=)¡D2®M<ÏEBÖE@äB?ò<;ú9<ï=;ÖC;ºA0­@+­@,¬?+©>,¤?+ž?+–@)‘?)?,>+Ž=*Ž=*Ž=*<+Ž=,Ž?.”C2¥A2¼B5ÆA8¹D;›MCcC8:;-@85>63:5174/43.23-14-03,,3,,3,-2,/1,23.40-1-*50-N7)b=-qE<€ap|v¤ny»[`¢NF‚PAjJ@bFCXEHQRXVU\TQWKRXJ`XU`XU*,+,,*..,0/+/.*1.)1.)2-)1-*0,)0,)1-*/+(/+(/+(/+(1-*0,)0,)/+(1-*1-*1-*1-*30+30+30+30+41,52-74/850:3+<5-=6,>5,A9.C9-F<0K?3DE5LE3XC2f?.u<+ƒ:)”>-ŸF4»F<ÆH<ÚE>îA=ò::ç>9ÊD8©@*¦A-¦?,¦?,¤?- ?,š?,”?+>)>-Œ=,‹>,Š=+Š=-ˆ<,‰=/‹?1“E1¨B4¿C;ÃB<·PIš`UeUH>I;?80=6094.63,34.14-/4--4,-4--4--4-.3-/1,23./0+0/+5.>5,@6-C9/H;2G?4L@4T>3]9-m9,~8,Ž<.˜?1¦B3³E6ÉG:ÝD>çB>ÞE?¼D4ŸC, A-Ÿ@,Ÿ>+ž?-š=,•>+>+Œ>*Š=+‰<*ˆ<,…<+†=.…=/…?3ˆB6’G4ªH;¼E?»LE°f[—zjrtfM]PMI>A?3:7.33)34,03,-2,,1+-2,-2,-2,-2,02-02-12-12-7-6?42RID€|‹’”ʼnØqyÁbh¦TQpIKbLTa]klq‚zy‹m}p\j[a[Cc]E+/0+/0-/.-/.--+-,(,+',+',+)+*(+*(+*(,+),+),+),+),+)-,*-,*-,*.-+.-+/.,/.,0,)1-*2.+1-*0,)0,)2.+40-91.;30<41=4/=4-?4.A7.E80G:4J;4O:5U61c60u6-ˆ:.”<0šA3žA2®B5ÃE9ÑG=ÍH?±F6™B.šB.˜@,™>,š?-–=-‘>,Œ=,‰>+ˆ=*‡<)„;*ƒ;,;/=2ƒ@7…E;“K<£I@²LG®^U¦n“•z‹xao`PTCGI;=?224)01)./)./*/0+/0+/0+/0+/0+01,01,01,01,6+<711SUH‡‡Ž•²‡’¿€¶„š²‡–›|ŽŽv…€›Œ¬–Ž¦•€`q^ZV9`\?+/0+/0+/0-/...,--+-,(-,(,,,+++***)))+++++++++++++++*********+++,,,---.../+*0,+0,+.*)/+*/+*1-,3/.:20;31<41<20<3.=2.>3-B5/@72B94D95H70U7/h8.~<0Œ>1–?6“@2šC2¨D4µE9·G;§B6–@1“A,”?+”=,”=,’<-Ž=,‰<,…<+†;(„;*‚:+:+=1?5ƒD;…IAŽJ?JDªWQ¦uf™™}‰¨ˆ~šs~m\hRJVB=F58<.12*.-(/+(2,,0,)0,)0,)0,)/.*/.*/.*/.*7)841(Q\>~ŒrŽ›”Œ›ž¨ŸŸÆ«ŸÀ«žÂ¨´•‹°Ž´Š§ˆ}–yZnUST5UV7,03,01,01.0//10//-..,/.*...---+++*********************)))(((***+++---.../+*/+*.*),('0,+0,+2.-40/;23<42;31;1/;1/;0,<1-?2,:70983:94=82F3,Z6*q9*<+:3?3ŽB2“B/ž>.¨B6 @4•?2‘@+=+‘;*’<-<,‹<-‡;+„;*ƒ:'‚9(9*}9,~>2€A8„H@‰NHŒIAžPL«d^¥ˆvŽ¦„¯‰}ž†tfx^XgPHT@=C557,1.)1)'4*+2*(2*(0+(0+(0,)0,)0,)0,)9(232GW(vŠYŒ{Œ „°œÎ‰ Î§œË¡†µ‡„²ƒ†°‚‚¥}sjSgKIL/FI,.1(/2)12*12*44,63,52+30)7/,6.+2-*0,+.,---/+,0)*./(//(/.)-.*+-,*-.)./)./),.-.../.,2.+2-'6/'90'<2)<5+=6,=4-<3,<3.;0,;0.=20F/'97*.:,36-C+)Q'(Y2+]A3vB,†A1”>1“9.<,B/ŽC.Ž@,›82=1‚A/|B.ƒB0‡>/‡;-„;,x<1p;+s@-t<+€>0ŠH<‡MAQC˜LNm`zo}¢€Œ¦‰’¦‹‚£†kz`bX|VZnRQUDF?7:..6',2%,$-*'+*+),1(-3(03'10)1-*11-..-(HK8w‚`ˆ›nˆ£n†§p¶}»‡’´†«xƒ©zƒ¦|{˜ylƒiTcPCJ:;B203*14+34,34,66.96/85.74-92,61-4/+2.+0/-///..0*+-0*.0*./+,/+*/.*/.*/0*01+000//-0/+2/*61+92*=4+@6,?8.A8/?6-=4-<3.;0,;0.=20B4+O-,X&/L(,>1+;3(Q0'h.,i;,y=2‰<6‹;4‡>5„B4†B5ŠB6‹?/ˆ?.†?-‡;+‰:+‡:*<)w?(|<0v;-v>/x>0‚B6ŠG>‰K@ˆODšNN”l`ƒ‰m| |‚ª…‹ªŠ¡……•{a™j[ŽcZ‡`SvXE^H5G7)6,$/'4%(2&(1(+/+,+,.(..%/0$002,..+&DG6s~`|‘h›k}Ÿl€§r…ªt€§r~¦r~¥v}¢yx–tjeRdLAC58:,47.47.67/780991<92=:3<92>71:5194073073054232010.5,-3--3--2.+3/,21,32-23+33134/43.83-<5-?6-C9/D:0D<1D<1B90@7.>5.=4/=4/>50@72R/3\(4Q-1<8/4;+D6)Z/(`80q:59:ƒ98~:7}A9B;…@9~F/€B-†=,‹9+‰7)‚;)y?)qB(…2*’H=|:.E9|H;K>‚NAŠTHnoO{wZ†‚eŒ—w¤|}­ƒzª€uŸy„nl{Œlr…iesZUZFGA33:6+6906908919:2;;3?<5@=6?<5@;5?:4>93=84<94<94:7285091.91.72.72.52-52+44,55-540761<92?;2@9/C;0F<0J>0H>4H>4E;1A8/A81@70?82@93>93?<5A>7D=3F90I9,H;*F>)g3(z93Ž@<“D@‘HA‚?6‚90‹<5A5‚@4=2}=1y?1x@1|>1;1£3/å{¤TKL>nO;iU=sXCƒ`Lc€P“x]¾e_ÌbdÉv®–~– }‡wq‡•r~˜ss—qig_xXS]BBD.B5-:3)11'.1&41*<-*F',M$,ME2`[EfmNj|VhƒVi‹Yo–aq™dpœinšiw tu›tt–soŽle€_MgDLC:D;28;28;2:;3=>6==5A>7B?8C@9E@:E@:D?9C>8B>5C<4B;3B;3A81A81?80?80<71:7085.74-77/96/=90A:0C;0G=1L@2MA1MA5K?3G=3E;1B90@9/>:1?;2C<4I81[<7h=7o>7r>3y@5ƒI>ŽF7šG9?5ž>2¡I;£M<£G8¨D5 BC“99‡<7uA4lE4wC6‡10¬7@ÞPNÈFDÅb\‚M=h\BafFlgIjO¶eTâU[ú(Eÿ!Iÿ5SïQ`ågkàloÈuqÃzs¹€u²„u«s¨vm£d_›TR“HO>Bh86O0+J3-F3,J2.Q84]R2fc@qyRt†\m‰Yo]t—av™cr—nu—rz™y~›z”yl†ic~]NiFTNBQK?6907:1<=5?@8AA9C@9DA:DA:EB;EB;FB9EA8IB8I@7F>3D<1C;0D<1D;2C<2=90<8/96/85.96-:7.=9.B<0E=0J>.M@/M@/M?2L>3H<0E;1D<1@<1@<1@=4Q9/‘@FÕN_ÖR]™?7”H8¹LGÛ?J¡F3¦@1«;-­?0ªC0Ÿ;$ª=)±<+³6<¼?E¹HJ£LE~<.ƒ5+½BGá@RÚ83Ì73ÉTM•VEpbEopN€kL¥s\ÿKWý8Jÿ5Lÿ0Jÿ5Mý1Jÿ/Iÿ/Nÿ5Vÿ9ZüA`øEcõFeõCgüClÿHrÿXzïUqÛ\qªOXe/-O<.;@,9K3[Q.ieB|‚`}ŒkxŽjuixŽh~“lŸ…–¨’ ®¢°£”¢“wŠvaz\OjGVWEXYG58/690:;3>?7AA9DA:EB;FC2G>/F=.E;/D:1<8/;60:8,<8-@:.D/K@.NA0M@-N>1K=0G;/D:.B<0@<0@>2@@4u:4ÎU^ìé:?ã?@ÑD=ÙSJÜ>=è08Ú6*Ð3*»80±bS€[A‚_C®cPÚg`ö=Eá<@×HDßQOêKOò9Gú1Dÿ4Jþ9Uü:Uÿ=]ÿBdþ?hüAlúAm÷@nÿ?hÿFkøKièZp¾Zdl71QA1FK4bUBƒ|j™›“’Ž›‘™¥›—“­¯¤Â¶ÉÉÁÍÉÈÆÄDZ³°‡“‡ey`RmLU^CW`E47.47.67/9:2==5A>7EB;GD=HE>HE1D1L7´B8«?3§;.ºD:Á@:Ä>#ä2&ÿ $ÿ#)÷*'è3(å3'ë/&Ö7"Ô6*Ä;3ÃeYžaNŸ[HÜa\ñCLí?AÓ@9¾@4ÎA:òAIÿ4Gü6Gõ=Iý;Sý8Tÿ7Zÿ9cÿ>mÿ?pÿ@tùAuúGeÿLjþMjÿa|ïfxÏjr˜TQPHŽz³©§¼¼¾¸½Ã¼ÃÍÆÈÔÒÏÚãÙäìáÝíáãëÛåâÖàÇÂȘŸ˜n€j\uW^mN]lM11/442783893:;3=?4AC6DF9GI>HI9IK5MM3KJ6JIDRP[KI^OF7I@1IA4D<1B;3?82>95;63A62?74<;9===?@;EA6LA/O?(@B-J91N45F698?82E27A)QK3½L<¡6$Ÿ:& =&¡=&®?+³:)µ6%¡:)¡<*§B.©B/©>*´?-ÂD5¼8+Í6+Ë<,Ñ=/â7/ò/-õ/,ä7)Ó>(Ú8#Ñ9$Ã7&ÉE8ÕJCñSRöAFþ9BàDEÌA<²<0¨?,¿N>ÖI@ì?Aÿg÷CpüL{ÿKwíRrçYqÿYzÿHqôLpÀhvzmdº ‘ÝÕÊàäãäàîôÚõÿÞ÷ÿéöøôõûøó÷óðñëëéãåØÔÕ¶¶´Œ‘Š{…z„‹y~…s..,01,34/560891;=2?A4BD7IG;KI:NL7OM8NL@`_dttŒsv™jbwVO_JDPC>DA=>;83=90=9-96-<90><0>:/;83?:4P20r*.¥:D¥7&¤9'¢<&Ÿ;$§='´A.½>-Á<-°?/«:*¬;+­<*³;*ÃE6Â=.Ã7*Ö6*Õ9,Ú:,æ3,ô.+ò/)à5$Î9!Ü3 Û:(Ñ;-Ì?5Å:3ØD@çIFå@>ÓC;Å?4²:,«<+µ=/ÕJCä@AüGNñ@FúFOýDTü@YÿDeÿFoÿLyýLzÿFxÿMuÿWxúPmøKiÖK`ӋŽdWGÁ—‹øâ×û÷öøõÿþíÿÿîÿÿöÿÿýüÿþùÿúöþõöýòöîåæÍÉÆ®±¨§­¡ª²£¤¬32-10+21,44,77/::0>>4AA5KE9PI9SL9RL&I?&K@,JA2I?5O<6F93893/<24¨7=¨=+ªA,§>)©?)¬9&¹<*Ä:-Ì<1Ã?3½9-½9-¼8+Å=1Ê<0Æ2(Ï8-â1)â4)é4+ï0(ö/*ð/&Þ4#Ì7Ù2 ×4#Ö8,Ô@6ÛLDÌC9ÐL@ÅC6¿;,º;*µ:*¹?0½=2Ë@;ÛEFëLPí@DöGNýKYûE[ùB`þIlÿOxÿLvÿP|ÿOvÿTuùOiìMaÿz†ÿ›–KF¾vúÑËÿ÷ôþüÿýúÿÿùÿÿûþÿüùÿüöÿûøÿ÷øÿóõöìëàØÕÔÑÈÔÖÈËÕ;ÈÀ;;366.22*33)55+88.<<2??5LB6TH8WL:TJ>WRXwx—–œÖ¢«ö£¨ùœ ê—›ÛÅ€‚©hh„TSeKIVCET>=C>;2C>*CA*BC1?E;;DABASJM\MW`LXVLNCaJ:‰R>@,ª?+«@,¯B-°=*¶9'Â8+Ì8,Ô:0Î92Í81Ñ:3Î7.Ö>3Ò5,Ù;0Ù8.é1'í1(ô/)ö,(÷.'í3'Ü7$Ï9!Ñ9$Ï6$Ó7*Ñ7-ßJCç]SÈH=·?1¶>%¶<%¹:'Â>1ÈB9ÏF@ÓIGÓIGèDEïIMûQZúN^öE_úHhÿPtÿQxê[wö\xýVpùRfÿ[lóRaòO`óL^¼ql︳ÿíéÿüûùÿÿùÿÿüüúüùôÿûõÿüùÿôôøêêìÞÝäÛÔïéÝø÷åæñíÏÚÖA?3><0:8,85,52)63*;8/A>5KA5SG7WJ9ZNBUNUpp”˜Ù¬ÿ©µÿ¬¶þ«´ù«°ò ¢ß‹ŒÄtq¦_]]TƒVOqEAP??=>A6?G<;DAFOTMl‹i|š‚|–j| Xc¯RM«A1§;!¨;'¬=)±<*·:(½5'Ê8+×:1Ý:1Ü:5Ý;6ß<5á>7åA8Þ;2îLAóQFî6,ï,&ø+(ú*(ö1+é4)Ö3$Ò7%Å=%Ë='Ï9(Ð6*Ó9/ãNHÜOHÀ93·=%º<%½:(Ã;-É@6ÙTMÉJCÃF@âHFéOOíQUíMWøSd÷OhþQoÿRsíWtû\xÿZsýTgÿYgÿ[jøIZÿMcªg_ќ–ùÚ×ûóð÷ÿý÷ÿÿýÿüÿú÷ýúóÿ÷ôÿ÷õïáàáÓÐèÞÔþ÷åÿÿëïøõÖßÜGC7D@4@<0=9.95*84+;7.@;5G@6NE6TG4WJ:WNQhg†‡Í—§õ©³ø®¸ý²»ÿ²¹ÿ¬°ùž êŒ‹×yvÃod¨bZ“RRvBCU<:?QABdGK‡bi¯q¢¼u¡ÂfÈMlÒ>TØ?DÁ9+µ="¬9&°8'¸;)Á<-Ì=/Ù?5à=4ß80Ö3,Ø3-æ?7â;3Û4+Ö4'Ø8*Õ9*ñG8õ:3÷))û*-î.+â4-×3)Ó1&Ì;(Ï<*Õ>-Ø8êRQÔ@@Á<)À;(Á9)À8*Ä>2ÐNAÉMA¿E8ÕH?ÜOHßQOÞMPñYeý^púTlúPkÿKsÿWvÿVmÿ_pý_môbläfjÑcb}WJ¡{rßÀ½÷éè÷üøöÿþþÿÿÿúýúûóýúóÿú÷÷îéâØÏäÝÍÿûåÿÿæð÷ðÝäÝMJ9JG8FC4C?3>:/<8/<71?:4C@7KE5QF0WH3WLHb`vƒŠ¾”£è§­÷«±û­³ý®²ü©­÷¢¦ð™ç‘Û†…Ënr¯bh˜\YxkPcˆJUµQYÏS[ðBcåG^ÕAOÍ3=åAHÝ?>ÊB6ºE1¼A1ÁB1ÉD5ÔF8×@5×9.Ø4+Û4+Ø7-Ý:1Ü8.Ü5,Ö4'Ó6'Ì5"Ð=)Õ>-ðB9þ68ø-0ë20Ø/*×2.à42ê72æ:0à:,×:+ÝE8éTMÕA?ßJLÑ>4Ç7,Å;.À<-»<+ÀC1ÁD2¼?-ÅE8ÍMBÒQKÓOMê_dÿiuùZløRhÿRvýWoõlvífmôbmîhqÓ{yrb_]Hyg[Ë­«öàâüø÷ùÿÿÿÿÿÿùÿûÿ÷üÿöÿÿøÿüôïçÜëæÓÿýäÿÿâó÷éêîàQN=OL;KH9HD8D@5@<3?:4@;5ABÔ59ÁB1Ã?0Å9,Å3&Í3'Ô3)Ø4*Ú6,Ý?4Ù9-Û9.Ö4'Ô4&Î5#Ì;&Ç;"Å:'Ü5,ù78þ7<ò;=ß:8á99å58ü+0ô.-ä2(Õ5%Æ5$îaWÎ@<ÕFHæIDÏ81Æ9/¿=-¹>,»A,¹:'¾=(¶<-ÀF9ÇMBÉLFæabújsýbrúYkú^sàkq㊄àwtþp|îaq󝞷šŠKbF`]N¾¤£öÜßÿ÷ûýþÿÿýÿÿ÷ÿøÿ÷øþôýþöÿÿöû÷ëöôßþþâÿÿáýþîûüìXO@WN?TKê<>ÕF@á:BÓ??ÊC?Ï@<éCGì9?â9<Ô<9Ë@9ÊE<ÅG9µ:+»9+Æ6-Ó1,à42á>-ß4#å8'Ú5!Í7Æ8 Ë8(Ï5)Ñ3*Î8*É8%Ñ6"à2'ì0.ì+0ê-4ó+.ì/+ã5*Ô7$Ä3ÜO>ÙKAÒA<ÞRQÒD@É90È9)Æ;(¾:%»>*¶?+³;-¸>/½?0ÃA3ñmaíhaïiföpoÿmzïdkòadõtoý{yÿVmõŽ}¦†SiB`dI¼¬Ÿûæãÿøøüúûûÿÿúþÿãÿíæÿê÷ÿóÿÿòÿýíÿøçüöàýùàüþûþÿýZQBXO@VM>UL=QH9OF7NE6OF7IG;OJ7TL5WL6VMDb_p}€«Š“Ζ—Ø–šä™ ðœ¥ðœ§å˜¡Ú˜œÛ—–ÜŒ’Ψ†¹Èl‘ÏG[ÝAEâ@>ã?@ä=DÜ;@ÑA@Â>9ÖKFâ?Bç:>Ø88Ì=5Ê@6¾:-ÆH9¹<*¼8)Ë9,Û81é<8Ó5)Ú6,Û7+Ö=+À9#¸;%º<-½9-ë?;Û=1È:&È:"Ð7%Ô0$Ø1+Ô1,Ø1)×7+Í6#Í<'Ê<(áM?×:5ïLMùecíZS×D:Ä5%Á8&º9&¶=*±>,­<.±=.¶>.¿D5Û]QéhbîjhédgåTaóho÷djûws÷qrýG`ñt„q’sQj@hoNÊ¿­ÿõíÿý÷ûÿùùÿûóýõØýÞÔòÖãõÝôùåûøåûòáíåÒòê×üùôÿýø\P@[O?ZN>YM=WK;VJ:UI9VJ:MI=SL:XM7XM7UMB_\etu”ƒ‡¶ŠŽ»È’א•Ù˜ÓƒÀy‚¹owµ„p‹¹[ì=dö5JæDBÖLAáEFö:KÛBDÌEA´:/ÐKDÜB@ß<=ÖA;ÊH;Â8+½8'½<)½<'Å<*Ò<-Þ7.æ81æ44ç10í53ß4-Î4,È91Ä22Ô>@ò14à5-È7$Â<#Æ;$Ë8&Õ=/Ô>0ÊC0¿:'Â>)Ä<&Ì;*Û=2â64â.1Ô72Ú@8ÝE:ÓD4ÉA1º=+°=+¬=,©>.«=,¬=,¶B3ÓZOæicëikìfmûozðgnûhnÿxxöelþ=Zîgx”ucOz‰`ÍÉ®ÿùæÿÿñõÿñèûçÖçÔ´ß´³Ù°ÁܹÔãÆêìÖôíÛëÝÐíÜÒìâÙëáØZN>YM=YM=XLVMXOJZSZ_Yehe‚pmš|w¹‰‚È‹½ˆt©’t¨‰dš¡@0»?3Ý>8÷@<ö=;ð=@ëBIä@KÄ?8´>2¬=,ÆH<Ô?9Ñ4/ÏB8³:)¿8$Ã<(Â;'Æ;&Î9%Ö4%á4&ð:/î3*ô-&ü(%ÿ'(û$)ÿ$0ÿ"8ÿ1ö&3é*1Ú,-Ù0-í76ö45÷/1ö.0Ö90ßB;Ë1)Ï2+×82äA:Ø1+ã81Ô<.Ë5'Ì:-Ç;.æ^RÀ<0½:0·7,·3'´4'±7(°;*µ?3ße`òuyùwüz‚ùv|ÿr}ÿitôVdÿ:\æO`•œzwš`}“b’s’žx}–nq•gr˜g~ n±sŠº|’¾ƒ›¾ˆ¤¹½Á¨ÙÍÁ׿½Âµ¯µ¨¢YL;YL;YL;YL;XK:YL;YL;ZM<\L=]M=]N;\P:^Q@[OAZOI\QO`Tlf^‡upª…|»›„º¨y¥ÁvŸ¹\ˆÒ=9Ä@3ÈI8ÚC8õ=?ý9Cë@FÍA@»=1¬;+ª;*ÃC6Ö;6ß;9ßKAÄE4À9&Â;(É>+Ë:)Ð4%Ü4'ñ?5ì4,Ø9&ß4#é.%ì,'ë+*ð(2ø#7þ7ð-;ó;EüKUì7@ð,8÷.8õ.3ì,+Ú51Þ97ÿ]\Ú86Ü=9Ù<5Ñ7+Î5'¾7#À8(Á<-Ä;1áWMÅ5-Ó>7Õ<4à=6Û>5Ì=/½9*¸<0×\Uòvxþ†ùzüyÿp}ûcpóPaÿ7WäM\tW^HkPx…YrƒYfƒUj’^w h€¦mƒ¯p‰·vˆ¹wŽº{‘¯{œ§…º³¡Ê·±«¦ª™”˜[L9[L9[L9[L9ZK8[L9[L9\M:^K<^M;]N;^O:[N;\O<_O?`PAcO[bUomj•|v¢ž€¢Ï‡ämàKaÿ:MìGMÊE>ÑF?êBBô?FãEDÅB8·?1©:)©:'Â<1æB@ë=<ß=8æZMÉD3¾6&È;*Î8*Ó3'ç:3ì5/ê-)ç53ð45÷29÷4<ì1<î3Dó.Jÿ3Wë=GÿYdÿ[hñ@Pî8Gâ3:Ò72Á8(Æ3)åRJéTPÖA=ØC?Ë7-Í;,É8%¯=%²=)²8)À=3×H@Ñ4/æ=6æ5/ó-.í4/á90Ð<.¼6*ÐQJñusÿ„†õx~üz‚ÿn}ùapðOaÿ7WÞLWXh;[wDmPy†[}cy›iz¥m«n„ªm‡­p‡´s„¶o‡¹tŠ²v‘¦{¸¸ ÖȽ²¶Â™©ZK8ZK8ZK8ZK8ZK8[L9[L9\M:^K:_L;^M;^O:`Q<`Q:aQ:`P9gMN`Tbmm‰|y”ž~×€†üjmÿHNÿ)Mÿ9RÞAJÓCCÛBDÝB@ÔD<Â@3²<.¨;'°?-ËA6á77å.0Ý52æRFêeVÈ>1É:,Ð8-Ú7.å61é0-ò53ÿ'Bÿ$Aÿ=þ;ó"Aò*Nñ(Tÿ8jú]f÷[fîM]ß:KÜ:G»-,¥8$˜E%´;(ÑSEÄA7Â;5ÚOHÇ9-Æ9'Ç9#¥?&¥<'§6&ÈH?ÙHCÛ62ë40ò1*ÿ)-ú,,ê3+Ú:.Ä8+ÃC8élhÿ‡‡û~„ý{ƒÿgyóZlëJ\ÿ5TÓFNJ`/]xE|`‰”j‹žq‡©w}¨p|¨i¨i„¨kƒ­m±j·l†³r’¬}»¾£×˽ªµÉ‹–ª\K7\K7\K7\K7]L8]L8]L8]L8]K=[N>ZO=[S>^S?^Q@bPBbOAkLIgWbqv–Š·˜·¹‚™åywùlZñO\êDPñEQë=Fá;?×<:Ì?5½;-¦@*«:(ÅA5Ð92Ù6/Ú6*Û:&Ø:!ç@:æNCÉ<+Ï>-å@:ê16ó1<ù4Eü&(ý')ü('ø&%ñ%(ñ)3è(7÷:NÿdmýX_ïKLÔ=6¿B0«B,’3“4"§60ÇGDÄ44ÖB@ØICË>4Ç4*Î6+¹=1¶0%Ã5+×D:àI>Ù5,ì0.ÿ.1ò12ó/0ñ1,ã7+Ê8)¸>/Ýjcý‹Šø‡‹ÿmÿZvÿNjù=^ñ>\¨LOHV5^€Cvš]y¡e~§k}¦j{¥f|£d~¢b{¦n~ªk}­c²c†´kˆ°t”³‰¶–‚‘cqr]L8]L8]L8]L8^M9^M9^M9^M9^M9`Q>[P>YPAZRG^SOdVViY\k]]lj€w€¹„Ü–‹×°‚±Ñ}Šê~qÿbgòKSöFPñ=Fá7:Õ<7ÇA5¹@-©>,²A1ÄH<¾5+Ì8.Ö:-Ù8&Ü:%Ü3.äH<ÕB2Ó<+è@7ì23ù5?ÿDPò01ì**ï--ì,+é-.â-2ñAKûO[åOQçHLá=>Õ:6Ã:0¹?2»E;´94¨3,ËGCÕCCéSRÎ>6ÏA7Ò>4ÞA8á=<ç=>ç;;íEBÝ<4Ø4+é3/õ20ó12õ/0ò1,ä6+Ì:+³9*ÜkcÿŽù€‡ýjzÿVqÿGgú;]éMe€;6N\;c‚Gr–Yuay¢fx¢cv axŸ`| bz£g{¨ezª^}®]†´iŠ°s‚¢sq‹hKZU5D?^O:^O:^O:^O:]N9]N9]N9]N9^M1_O6ZN>YRJ^Y]qjzvn…vl‡nuˆt}¨{„Ï…Šæ•â´©w€¬m[ç\Wõ]\öLOí8=ç79Ú=8ÉD5ºC/³=1«7*ËYNÇQEº:-Ê;-Ú:,à6)â3.á?4ßC4ß?/ä3+ð0/ó04ÿQYÿZ\á46ç;;ß33Û32Ý:;ãGJÆ-0Ë32ß3×6.ú.:÷)6ô+5üBCÞ3,Ù5+ã5,ï4/ö/2ø-0õ/,æ5+Ð<.±6'Ôc[ÿŒÿx‡ôfvúNhÿ8_ú;]ÅO[`<,YdFg„Ns”[wbx btž^u^wž_| by£cz¨`y¨Z{ªY­`…¬k‡¥sz•lizj[l\_P=_P=_P=_P=^O<^O<^O<^O²B4ÚMFðJJë=>ä<;×@7Æú>?ß4-Ü5,â4+ð5.÷/2ù-0ö/,ç5+Ó=/³5'ËVOþŠŠÿkî`pøIfÿ6_÷Dd’DDLH/V\@d~Nt]yœbtœ]n˜Vp™WsœZwž_x¡]y¤\u¤Tw¦U}©\‚¦fŸkubey]XlP[N=^Q@]P?^Q@_RA\O>`SB_RAbS>^RF^X\omƒx{¤}€·tx¸nq¶uyԉÍ§§¿ÃÀ¯ÖÒ¥ßٟß֝Ö̗ġƒ³yaÄdVæa\ëKKå;<ä::Þ63É83À=5¼L@½WHÐeUÀ@3Ï5+à3-á40â;2Ü8,à6'ê2(í0*é2,â5.Ø?AíRVéJOÿemÿckþahÿfiðZ\ÿ1¸6)ÅJEÿˆŠÿc{óWmùDcÿ:aßMdc9-9C(OQ9[pErŒ\v•\o–Uk”Pn—SqšXt›\tžVu¡Vt SržQsSm‘Q]zDKe6>W/<ìKCÖ6*Ý2(å0'ã.'ß4,Ü>3Å1-ÜFEìQUíMWîNXøXbÿlrçLRò.2ø/9ð(5þDQîGOñUYÿ^cíDKß82é<8î<:â70Ù;0Ö:.Ý90é:5ß<7â:7å95Û4,Ú8-Þ8*è1)÷0+ó23ö01ö0-ê5,Ü@4Á7-ÍIGûv{ÿ[tþLlû;`îCc°LTYF5;D)JE/Qa7àB9Ì>4ÄB5¹;,ÎI:Î?/Ò9+àBAû`\Ý@7Þ:0ä6-á4-Ó5*Ã5'º2"È>3ÓB?Ô=BßEOñWaøahãNRê;8ò;=üCIÿR[Ý49á8;øDGò46ê93ñ:6î73ä50ß<3Ú<1á81é62ã;8ç:6è94Ý5,Û9,Ü9*ç2'ò/)î53ó11ô1-ê5,Ý<2Å5-àTUûktõRmÿ;bÿ7`ÜSgLF[U?PN9NF3FT3]oEj…NiŒHeEg‘Ik”Pm•Vp˜Rj’LcŒF_ˆDY€ASt=Tn>[rFVs=Wt>OC3UI9XL<]QAcWGbVFaUEk_Ospwwtv©jo¯]e­em¶yÉ–Û›§Í«µÙµ»Ýº½Ü¼¹Ö´®Ê®¤¿˜‹§utyjfevgbƒaXZQÕphÿzuÿjgÿPJìE=ÜB8ÕG;¿7)Æ>.Ë>,ÒA.Ö=?Ò=9Ô;5Ü92å:2ß80Ò;0ÇB1¾B(ÅD/À:1Ä57ÛJQèU]êY`×HLÏ7,Ý;6ç=>ç:>ã6:ì8;ù25ÿ-1î71ï4/é-+å4.á=3ß>4å:3ì63ì46ï34í42à2+Ü8,Ý:+ã3&î2'ì63ð31ó2-ê5,Ù6-Í82ùgjò\gèJcÿ3_ÿ8e¼IVW@0PN7YL;LA/.Õ9*Ô=,Ï8'Ú:,à:.Ú8+Ë:'¿?&Ã:2ËB:É@8¼6-Ä>5×QHÛULÊD;Í.Ë3%×7+Ô6*Í:*Â;'Á7,Ã9.Ç=2Ê@5ÌB7ÍC8ÎD9È>3Ò7#ä6-õ.3ü)8ú':ù%;û#:þ 7ÿ 7ü(7ó6=ä::Û94Þ;4å:3é62î45ê65â70Ø6)Ù9)Ù:%Û9$Þ7$Ý5(á7(ß8&Ù:'Ô8,÷X\þSfúBdÿ5^ö>b¸DWI*'-8'6>)B='EA&Wa/…”isˆ]`~J`…@cŒ>hGlPk“JhGgŒIfˆKe„IdGf„HeDc‹EhJ-5(7:3A>9KD:PJ%Ä;(Ê9(Ú6,Ñ9+Æ;(Ç<)Ï<,Õ<.Í7(É<*È<-É;-È:,Æ7)Í>0Ï=0Ð<0Ê6*Õ.&ê22ø/9ü-=ú0@÷1>û/;ÿ-:ü,:õ0:ë7:Û64Û94ß:4æ95é54ó57í76ã81Ø6+Ô8)Ô9'×8%Ø7#Ñ:%Ð>%Ð@(Ð?,Ø=8ÿ^iþCbÿ:eÿ/ZÜRkc28841-7.4@*<=n^:“¨m¬Äla‚I_‡@i’Do—Np”Tn”KhGhJi‹Nd†Je„Hg‡Hg…Ei‘Jn–O&1#/4-664?<7GD;LMH\^k]a~[\ŒWX‘fh²v{Ï~ƒÞ‚†ß‚„ׂ„у‡ÇƒÍ„€Ô‡×Œ„ÏŠƒ¶‚~•nlqQOg[KYhKeaD“XHÉUUãX]íbgîujæaXÓE9É:)Ä<&Æ>(Î;)Õ7+Ò/&Í9+Â=*¾;'Ê>-âL>Ð:,Ì:+Ç:(Ç8'Ê9(Ì9)Ò:,Õ<.Ú>1×9-ç55õ8>ú2?ô.=í/9ë28î15ó/3ò5;í6:á55Ü94Ü94á96ç77é56ô5:ï77ã73Õ7,Ï9*Í:(Ï9(Ð9&Å;!Ä>#Ä@)Ê<.îIMÿPgÿ;cÿ2cõB`CI>=8:8;B449>(J\,›že¬ÊŠ¥Ä‹ƒ¤oa…H^†?j“Eq™Pn•Tl’If‹Ef‹HhŒNe‡Jd‡GgŠFg‹Ej•MošR(0!).'/1.783=?4FIBQT]Z\s[Z†cduwą†ãŠŒð‡‡ç€€Ö‚Ï‚†Å††Ìˆ…Ò‹…ω½„}ŸyrzfbYg_Lf^If`HhaEuZ?¦^OÕURýS\éZRÕ<4Ù8.Ø;,Ð9&Ð;'×7)ß4,Ì2&É<+ÂA,½<'Ã7&ãOAÉ7(Ç:)É<*É:)Ê7'Í5'Ô8+Ú:.Ø4*ä=4ö=Bñ2:ò0;ë1<ã6:ß76ïB>ô=9é;:å97à85Ý84Þ95æ::é9;í9<ô5:î87â;5Ð8-Ç:)Ä;)Ã<)Ä;)À<#¶8½?)Í:3ÿXeÿ>\ø4Zú;f®IOR:03C6G78S/1ON2r”XŸÃyŸ¾‚”²|l‰YWx?`„>k‘Dl”Ki’Pf‹Eb‡Bf‹HfŠJhŒLgŒIeFk“JoRs¡V/3$.1(/1.36-9=.AE6MOLUUa\Zrih~~¾ãíˆˆâ€}Ì~„†ÁŠŠÆ‹ˆÁˆ´…{žyn~od`h\NXeKd^HpYGq]Eq\?X?ÖWNþEKÜ94ß6/â6,Ý7)Ó8$Ò9'Ù5)á3,Ã7(½:(¿@-À;*ÔB5Ó?3È:,¿<*Å:'Ç:(Ê9(Í5'Ô6*×3)á90è=5í6:í4:ë3;å:@èMKù`[òPKå:3ß82ß82à93ä;8ä88ç9:é9<ë8<ï58ç77Ü:5È8-½9*·<*¶=*¶=*·=(­8$°5&ÜFGÿNaô9TëG`ÕJ_cF8ED07@+C5(O5$xxR‘³vŒÀu›·„…ŸrKdB+CG.KM?RQMXXNddlww‡…Æ‘ŽÛ‹ŠÐ‚~¹}y«}}³„‚³ƒ¢~vwmuna[k[LkZHb`Kh]Ko\Ky\J‰YC©R?ÑD:ã1-Þ5.ã5.à2'Û8'Ð:"Î<%Ô9'Ü6*¸>)±7"¾=*È9+æLBÕ=2Ã;+±=&Á9)Â9)È9+Î7,Õ7.Ü71é=9å84é:7ì::ê=?÷YXúkeÔG@Ð71á<8ß;2à91ã73å76ç79è8;é9<è7=î79æ:8Ø>6Å=1³:)­=)©<'©<'¦=(¡:)©9.éX]ôI[éHZÆSZ ZRHR:JE/@<AR(`xFƒ”^¢j’µuŠœvUfF?N1Se;cBjBf’E`Gd‡CiŒHkMl“Rk”Pk•Mk—HrŸNv©Zwª[ED2DD8EE=CF5EI.JM.OQ9USF[]8]^Nkjzzy¥€ºƒ€·xvžol‹ki›om•olmgii_Uk[Ko]Ir]JuYNl_OkcP^M¢RG¸92Î4*Ù6'ß7.à4*à6'Ô8"Ê="Ç?%Í<'Õ9*±A+©4 ¾:+Î7.à=8èNFÇC4¨;$Å@1Ä<.Ë=1ØA8àA;á<8å97è88æ;4æ:6õPNáLH¾71Ã=4ÕB;Þ<9à<3â92æ95ê88ë7:ë8<è7=æ7<ê67â96Ô=6À-ª5#¬7%¾<,É6,Ó;0ÜJ=ÍD2ÛH@ÑA8ØC<Þ<7é77î87ä84ß>6ÅE8·9+±8'»@0Ç?1Ù?7è96ò67æ7<å8:ã:7ã:3á81ã:3æ:6å97è:<Þ<:ÎA:·?1¢=+™=(“;'‘9%€?+3+Ñ[[Ï[^¬QNšZP”^R™_TK`Vm'’®d˜³ly‘SXk>JV>?/;?1:B3HY9a}Co“Ij“Gh’Jk‘Tm”Qj”Jk˜GnžHp¢Kv¨Sw«Yl˜][‡L^WG^WG^WG^WG]VF^WG`YIaZJd^Fd]Je]Pf]Vh_Zh_Zf]VaXOYWKRPCQN?TQ@ZUB_XEd^Hh`IdfQ~\P®[U¹C?À=5¾:-½9*Ä?.Ù7*Ú8+Ù9+Õ8)Ô8)Ô8)Ò9)Ò9)¸@0¦7#¡7!³>*Á<-Æ4'Ï=0ÔG6Þ44×31ß;9ê<=î5:ë14æ66Ü94³9*®6&­8&µ<+ÈC4Ø@5å95î66ë7:ê88ç:4æ;3â;2à;5Þ;6Ý98Ú<;ÒA<»;0¥7(›<(“<(:%8$v9$Ž?2´QL¬MIœRI“^P“bT–`V~[£µ“§rSi88J".:>09A2GX8cEr–Ln—Km—Oo–So—Pk•ImšIoŸKt£RyªYnžRY‚HNw=c\Lc\Lc\Lc\Lc\Ld]Me^Nf_Of`FhbJicMhaNhaNgaKgaIhbHa^MXUDOL;KJ8NM9OQ3ß<5è96î64í74ê93æ;3à=4Ü?8Ø@;Ô>=ÅB:·=2¢6)™:(‘<(Š<&†9%…7#u;'†A1¡SG›SG’ZKŒ\N^SšaXew…aBQ4-:&0<.7?4=@7::0;<,9=/8@1FW7eGs—MqšNpšRq›QpšNn™JržOu¤Ty¨ZqŸV[ŠB[„JR{Af_Of_Of_Of_Of_Og`Pg`PhaQjcPibOg`Mg`MhbLgaIgbEgbEf`J`[EUS>LK7EH5EI8EL"¬?*À<-Ê3*Ù<5ñ8@ê@CÙ?=Í97Ä30È:6¸92©7,¢?*£@+£@)¤>(¬9&»7*Ë8.Ý@9ë:4é;4ç<2á?4ÝC9ÑC9Å>8¼;6¢:-˜7'’9'‰;'†=*ƒ<(~:'}6$y6%L<“QC“XJ[M‘]P•\S—ZUU]6=F'7C/2<34=8AF?DF8=<(:;+7;-6>/DU5d€Fs—MqšNq›SpLoœKpLx¤W€¬ar X]ŠG^‹H^…NSzChaQhaQhaQhaQhaQhaQhaQhaQi`[i`Yi`WiaTibPibPibOibOh`If`J`[GQPG69Í=2Ë8(Í:*Í:*Ï<,Ï<,Ï<,Ñ;,Ð:+¿:1¯>.•6 •7¬<(Â:.Ù@8çHBãEFÌ>:°:.£<-¢>/š=.=-ˆ?,”=*•>*—@,›@+¡>+¨9(´8,À<0Ø;2Ü@4ÛC6ÕC6ÎD7»=1¨6, 3,<,Š;*†;(=*|;'y:(x9'u6%†8,–N@ŽO@TF—XO”UN˜YT–YTR[.OY4;H.5@/GRBX_MGK2>? ;<,9=/7?0EV6f‚Hs—Mp™Mq›Sp JoŸKs¢R}©^y¤]bŒJ`ŠJeO^…PSzEhaQhaQhaQhaQibRibRibRibRj`_j`^jaZjbWjbUjbUjbUjbWjbMjbMd_KYVCKL:DG6?F6=D48F/BJ2PE)šfP»UGî_[ìIJå?AÈ:,Ç9+È9+È9+Í;.ÎßJCæIDáB>ÐE@µ?5œA/“H3F2†C0}C/vD-‡:*‡:*‰<*Š=+<*“:*œ;+¢<.³9.¸<0»=/¸=.¬8)¢8*–8,’:.†=,ƒ<*:*}<*z;*x:+s8(q8'‘C9K>ŠL?“SI˜QK˜SN–]V”i`^m}P@P)O^=apSNY;@G(ÚJAÛKBÞKCßLDçMMÝNJ×NHÛNGáFBæBAäB?ßD?ÒGD³>5™B1F2‡D3…@1~?0z?1‚:.;/€ØD@ÙEAà?DßEEàHGãCCê@Cí?Aä@?ÛB<Ó??µ82Ÿ?1Ž?0‰;.‰90‡81‡:4€;4~;2|<2{=0w<.x=-w<,x;)};/‚:,ˆ9*9(Ž8'Š;*=*~=+€8*}5'z4(y5*t4(s7,n6)t?1‡R@R?†XHSH—RMVOvaPBL1L[ÓD>ÌD8ÅG8ÈH=ÔDCÜ?FáCDáCBàECáFBâDAáB>â@=ãA>ÊD;±;1˜?/@>11<.5;-:>->C,Zf@p‰Rr—RržQz¡buœ]`‡H]„EaˆId‹Ld‹L_†GXzGJl:haQibRibRjcSibRibRibRibRjcSjcSjcSjcSkdTkdTkdTkdTrbSk_QmeXieYmk^…‚sˆƒpwr^MW-9;-3=46<2:>/*6B.=I5>J6:F26B.2>*2;65:38;0:?)KW3d|Hs˜Sx¤Un”WYB[D\‚E^„G_…H^„G\‚EQuEAe5gaQhbRhbRicShbRhbRhbRhbRjcSjcSjcSjcSkdTkdTkdTkdTlfZmi`‡†¶¶´ÐÒÑììêïëèãÞÚ×»°ž‹|c^JAI2=J6>F7=>6=966A3J70‰LKÅbeÌTU×PMáIFæB@ÞDFÞDFÝCCÛCBÙEAÔE=ÐF<ÎH=Ý@9ÏB8µD6‘:)†?-€?-€=*„=+€;,:+:+}9,};/};/{;1{;1w;1v:0t8.r8-q8-q8-n8,m7+o6-l6,j4*h4)i5*e3(d2'm;0•LFSKYMo\MYVEFJ99B12:+47017-/7*2:-9D4=J88G21@+-63160690:>-DO/ayGt™VsŸT`ƒKVyA[~F[~F_‚J_‚J^I]€HMqE=a5icSicSicSicSicSicSicSicSjcSkdTkdTleUleUleUleUleUgg_Œ‡ÃÅÂéíîõùúýÿþÿþüüøõþãÐÜʲ§ ƒefGGJ/HC0H92L76;@?Ù??×B>ÓB=ÏB9ß@:ÏA7·A5–:+‡>->->*€=*:+}9,}9,{9-|:.z:0z:0z:1v=2t;0q8-n8,m7+l8+l8+j9+k7,o;0j6+e3(e3(_/#`0$g9,‹NI…TMrXKRL<;D14A02=/4:077557216//7,/;-6E27I32D.+4/.3-36-9=,>I+`wIvš]l—RX{ESv@WzDY|F^K^K\I]€JKiG7U3gdSgdSgdSgdSgdSgdSgdSgdSjcSkdTkdTleUleUleUmfVmfVpts©­¬Øàâôüþùÿÿûÿüþÿùÿÿø÷þÝçñÎÌØ°œ«€dnIFJ/JG6I@7SKI…}{µ°¬ßÝÑÿöèÿÚÐÖ{xÊLPÍRKÉHCÑGDÖDDÖ>=Ö@?ÕA=ÒC=Ø?9ÎD:¸C:š<0‰=/>.>,>,~:-}9,|:.{9-|<2{;1z;2z;2p:0n:/l8-i7,i7,h8,h8,h8,k90j8/j8/c3)b3)^/%\0%j>3}VOlOGMA58:,/:*1=/5=27:179449338119..9+2?.7F37H55?4.4*.1&48)>H/e{UxšgaŠPTtBRr@TtBUuCXxF[{I\|JXxFE[D-C.gdSgdSgdSgdSgdSgdSgdSgdSjcSkdTkdTleUleUmfVngWohXt|~¦®±ÔÞàñýýöÿýúÿùùýïö÷çñÿçïüàçñÏÆ̨”šxTZ@DM:AL>ƒ|v¹´ÙÑÎîíèö÷ïÿûðÿóê굯¼eT¶VF¼MBÃD=ÉB>ÎC>ÏD?ÎC<ÔA:ÊE>²A9™<4‰<2=0=/=/~:-|:.|:.y9/|<2z;2y:1x92k9.j8-i7,g7+g9,g9,e9,e9,h8.f6,h8.d5+c4*]1&]1&qG;WMD@9/99-6:,3;.4ÈE=ÆC;ÒE>ÅD>«<5–<4‰<4=4=1=1};/|:.|:.y9/z:1x90v70s7/k9.i9-i9-g9,f8+d8+d8+d8+g6/j92h91m>6k?6e90|QHvKB4;33;039/36+47,35(35(46)-8(-8(-8(-8(.9)-8(.9)0;+7C-G4fz_YyTAg>Jg7Nk;Kh8Mj:VsC[xH\yIIf6/83 )$heVheVheVheVheVheVheVheVgfTieZkd\meXidNmlXghb~ˆŸ©ªÇÏÑëïðüüüÿþúþÿùùüó÷ýñ÷úñøúì÷ùáØÜ»¤ªˆbmOiw`ŒÅÆÁëìçøùôúûöþÿúþÿúþÿúþÿúíÿÿÿþüÛ®¨®VLÁH=ÊF:ÈF9ÄF:ÁJ2µL6œG2‰F5D4€@4„:/ˆ8/}:1|90x8.w7-v8-w9.s7,p4)h9/g8.g8.g7-e5+h8.i7.h6-k4/m80k;-hA0fJ5kYE€yfihV3;.2:-19,19,08+/7*/7*.6).5-.5-.5-.5-/6.-4,-4,/6./;14@67C54A0Hd;Jg;UqH[wOXsR6w=2u<1t;0q;/p:.o;.m9,k7*m80j8/i7.i7.h8.g7-g8.i:0i=4g=1iB1fE2gQ:ocMŠˆs[^K19,19,08+/7*08+/7*/7*.6)-4,-4,-4,-4,-4,,3+,3+-4,*6,,8.1=16C2:G5?M66D+>L3F^Ha:F_8UnG^vTTkN2I/%-/"*,heVheVheVheVheVheVheVheVheTieZkd\lfXkiRnp[zx­´ºÝçéùÿÿúþÿÿÿýÿÿúùûðèìÞÞåÕçìÖëïØêêÐÕÓºÆÁ­À½®ÐÍÆáàÞñòíüýøþÿúýþùþÿúþÿúþÿúþÿúÿùüÿÿý÷ÿúóÿòýüçɦ WD³P=Å@9ÃD>°=:ž::>=€@>tC4i=2h<1h<1q60p70m6/i7.i:0f:/c;/f>2`D6dI8cJ4_K3_S9okR~ƒlAJ519,19,08+/7*08+/7*/7*.6)-4,-4,-4,-4,,3++2*+2*,3++7-)5++7+.:,0=,4A/1>*4B+;M3DW;H[=K^>XkMbtZPbL+<)#,+ )(heVheVheVheVheVheVheVheVheTkdZkd\lfXllTinXovnž§¬Úäæ÷ÿÿûÿÿýýûÿÿ÷ôöéæêÛâé×æíÎçëÐçåÎÜÕÃÚÐÄêßÛøîïÿöùýþùÿÿûþÿúþÿúþÿúþÿúþÿúþÿúÿüúÿÿýñÿÿíÿÿóÿùÿÿíìȲ¬t[µN=³L=±I@ =7”<8…@9uC8mH8q?8q?8p?8p?8qB:k?6j>5k?6r71p70m80h9/c;/c?1aA2^A1WL8f[E^T9ZS7YX:nrWjt[0?(3;.2:-19,19,08+/7*/7*.6),3+,3+,3+,3++2*)0()0(+2**4,*4++5,,6+-8*4?/8C36A01@+8G0@P6HX>VfL_nYJXG(6'&/,#,)heVheVheVheVifWifWifWifWkeUle[le]khYlnViqZlxn’ £ÇÐÕîöùûÿÿþÿúÿÿ÷øúìò÷ãèðÙêñÏçêÍâàËÝÕÊçÙÖøêêÿõùÿûÿþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúýÿ÷ýÿüýþÿýþÿÿþÿÿüôÿÿìÿõÙÖ¡‚›^BŸWAžO>ŽA1„A0xA-qB.s>8t?9t?9r@9r@9p?8o>7m>6l:1m=3i?3d@2_B2_H6M;'F5!LN6FI.Z[<^_@\_@sy]KX>0>'5=04H=7D23@.4B+AO8P^GYfTCOA,8.'0+&/*heVheVheVheVifWifWifWifWkeUle[le]khYkmUis[lyo–¥¨ÊÓØï÷úûÿÿþÿúþþôøûêðõßäìÔÜâÀÚÚÀÞØÊåÜ×õéëÿôøÿùúÿüüþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúöÿüûÿþÿûÿÿ÷ÿÿùÿÿûùÿÿôöÿîÿüãûåÍʨ‘eLƒQ:zF0xE0p@*sC9rB8o?5n?5k?4j>3i?3h>2cB3cC4`E4ZE2WF2aV@QK3HD+=G,16>17?27?26>16>15<44;33:23:207//6.,3+*1))0))0))0)+2+.5.+2+070L;;J73B+1@)BQ:L[H@N?/<2,6.*4,gdUgdUifWifWifWifWifWifWkeUle[le]khYjnUfrZeuj‘¥¦ÉÒ×îöùúþÿÿÿûÿÿôþÿîôùâãìÏÔ׸ÏÏ·ÜÕËïæçÿ÷üÿýÿþÿúýÿ÷þÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúúÿÿýÿþÿþúÿý÷ÿûõÿýøþþüûÿþþúùÿý÷ÿüïÿòáâкº¡‹˜{i…fTrQ>iH5bC/dE1`D/aE0`E0`E0[J6ZK6VK5QK3NL3qtY`fJCL/:G+@I,CH(MN/xwY__EEG1>A.8@38@37?26>17?27?27?28@39@88?77>67>66=54;329107/-4-+2+*1*+1-+1-,2..400626G4=O9:L44F,5G/=O98I7,ZZ@XY:UT5LG1FD/A?0>@3;>38@38C57D38C56A36A38C58C58C59D6D\<0H.*4)(2'YgM]jPblThmWjkYkjXmgYnhZkhWjfZie\hfWdiSdp\u†€¢µ¼ÓÚàñùû÷þ÷ó÷éëîÛÞÝÉÒϼÅÀ­Âµ¤É½±ÚÏÍïæëýøÿþýÿüýÿûÿþýÿþýÿþþþüþþüÿþúÿýúÿýøÿýøÿýúýüúÿÿÿþþþÿþýÿúôçÝÔõçÜþüÿÿÿýþÿûúþýýþÿÿþÿÿþòÿýàüüâµ´˜QL.RL,UO/UP0RQ3OO3ON2NN2KO6HQ6GQ6EN/KR0U[5`k@}ˆ`ovTQV8MO7OO7SQ8VU9WR39A47B47D38C57B47B48C58C58C5:E7P6OdEOgG9Q7/9.+5*YgM\jPdnVhpYlo\mlZliZoi[liXieYie\igXejTdp\s„~•¨¯ÊÓÚëõ÷ñ÷óéìáÜßÎÎ͹ÆÁ­¼·£ÐóãÖÍóèæÿ÷üÿúÿþýÿüýÿûÿüýÿþýÿþþþüþþüþýùÿýúÿýøýúõÿüùûúøýýýÿÿÿÿýüÿûõöìãýïäþüÿÿÿûþÿúúþýüýÿÿþÿÿþïÿûÞÿÿê¹·žTO2UN1UO/VQ1RQ3MN/ML0MM1KO6JS8JT9NW8U\:djDŒ£mš°žtgrPKO6KJ5OJ6SN:TO9PN9KI:DF9=@59A47B45B19D68C58C59D69D69D6;F8=H:=I?=J9>G6.=+“=,”?+™?6¸B4±E9_>/;5572/62/41,.0-0/-5,-=13yD@œ`l±XT†PGbopuŽ‘†bcSYSa,,,0/-2.+3.*2-*2-*2-*2-*2-*1,)3.+3.+41,41,52-850<5-@7.C9/I=1JG6fA/„;*¢E6ÊE>è@?ò;=ÁB3ª?-¨?, ?.”?+>-Œ=,‹<-Œ=.žB3ÂA;ªPHPF<@6494043.02--3/02/21/3/.P5*sTY|~»YXžJ>fDCUMVQQYNaXQ,-/---.-+/+(.*).*)/+*/+*/+*0,+1-,1-,1-*2.+1-*40-:2/=4/?4.E80J=5V93r7/’;1¦A5ÇD:ÙF?ªC2@.=-–=-Œ=,‰<,‡;-„<0†B7žH;¶OJ¡}mhseKI=77-01+/0+.0-//-00.00.:/7jhiŒ’Äv‚¶hoiyx‚—ˆj{k`Z@,03./1....-+-+,+)*+)*+)*+)**(),*+/-./+*.*)0,+3/.;23<21<1/@2/?82A83X6-;.’>4™A3­C6?3’?-“;-<.‡;-…9)9+>5…IA–KE¨nc¥…|yZfR?E710+2)*1++1++1-,1-,6,-cqMŽœ–º–ŸÆ§Š²‰«†g~bOO312,32-74/72.7/,3--/-.,+0/(//)+.-+/0*///2.+70*=3*?6->5.<1-<1/D1+B0.D,*\4,x>0:3‹?2A3<1ƒ>.ˆ<.€;+w;0v>/†C:†MB–\X~•x‹¨Š€^‹bWpS>D:.-+-)*1(-/*0+,10,+^cL„šl†¨uŽ°}‚¨w~žy`r\?A4671872=:5?:6?74;629527327./50-41,43.540;62@7.G:1G=4C90?61?61D65M34A9.K8*m61‰==„A;„=7B1…;.<,{>,¨KFŠG>tM<VFxwX§xhž˜~…¡{†pxpasYGD39.*./)1-*=&,H@5clQmŠ^r˜erœjw tt“qZsUD;4893=<7B?:D?;FA;F?9F?7D;4B92B92<7194.96/@9/F<0M@0M?4H;2B90?;2\:8œEK„@7¤EAœD6¥=2¤E3ª@2©ªVLjeG…kPæOVÿ+Iý;UôL]äWgØclÐ`lÐQfÁL_DKR3.E=2cZ9yƒ`sŒdx“f„Ž¤{‘|YrRURC671;:5B?:GB>HC=LE=MC9L@4H>2D<1A:2<71<8-C;0K?/O?/M=0F:.A:0A?3¨EHÌ17 <%°=+¥:0¶A8¨AÑFAô>Jü5Hþ9Uÿ;`ÿ?mûArÿFjùTr»WalLA‹~u©«¨«³µ¾¼¿ÚÒÏÙÏק©¦`w][eJ10.762<<4BB8JH71>;6F?5P?-A>-D65>;4h;5«;-¡:'«>*»9+©;,¬>-·?/Á;/Ñ7+Þ7.ô.+Ú7&Ù6#Ë=1ÚFBñADÒA>­<.ÇG<ó@FøDMýAYÿBjýIxÿKwùVuóJkžnnÓ»¯îëòþäýÿóüýøõöíðÒÎ͗“•›74/52+:70@=4OE9TK+¸9*Í9/È91Ç9/Î:0Ñ7-è1)ð/*ò/)Ö7"Ö5#Ó9/ÜMEÅE:»<)»<-ÈA;ÛIJïDJüK]úEdÿNwûUyýSnù\mß`iٞšÿööýüÿÿûúÿûøÿñôêßÝäâÕÐÙÔC?4<8/84+>93MC7WJ:a\p”žæ¬¶þ®µûŸ ãvtµbXGDWD@=[OS‰sš§f„¾IR³<(­:(º;,Ì9/Ý:3Ú72ä=7Ý90äD8ñ91ú**ì1,Ö2&Ê<(Ó:,Ú?:×EE½<'Á9+ÎH?ÅIAßKGæOTøWiþQoÿTwÿXoý\kíWc§unóÞÛ÷ÿýÿüýýúõûðîåØÐÿüèæìèPJ9Â@2Ë=1Ô7.Ù5,Û:0Ú6,Ô4&Ì9%Û;/ü47ç55á55ò21Ü6*ßK?ÖDEÔ=6Ã;/½@.½>-ÃE9ÎMHôdmúXmû[sëtxôftȉ‚baOßÂÄýûþÿúÿúÿöÿþ÷ôîàÿÿãööêXO@TK-´<.¾@2éf^ïijóboöllþbo¶‹„[iFãÑÇÿüùúþýßýåôýìÿøè÷ïÚþýùZN>YM=WK;WK;SK>YL9ZRPsr”„†¶ŒÐ…‡Àqs¬¤Ymù7OáFAí>KÒDBÁB9Ô97ÌC9Á9)¾;'Í:*â6,ó04ô02á34æ2>í/1Ë8(Ñ9+Ý<2ÊB2Å9(×:1ã03Ö71Ò>2ÇC6¯;,¬<.®=-Ú_Xïlr÷nxÿpwûNb½~yxa×ÖºãñØÃÚ¾¢ÍŸ»Ô­äãÎêÙÑßÑÈZM5ÝC9ö:Ý;8×4+Ç8(Ç:0ÔJ@È;2Ë80¼:,ÊOH÷xüyÿkxÿE`¶mdp‹X„hpczŸl‡µw’»¤´Î½µ¯¥¤ZK8ZK8ZK8\M:^K<_N<_P=aP>cQ_uq–º€–òZiÿ9PÓCCæAEÑB<¯;,»=/ç9:âH@ÏG9Ì8,ß6/í1/ü,<ý(<ð,Dü/XùS_ñIZÛ4>´;*ÍE9ÓD@ÑA9Ê9(«<(¹=1Ø?:ë51ù-.Þ7.Å@7øz{üz‚ýdvùA[•VEiP‚‘h~¥p©m†¬oƒµn­yÉ° §¹]L8]L8]L8]L8^M=[O?^RFfSOkZd|ƒ¹§‡¸çwsôP[ñALÝ:;Ã?2­>-Ç<5Õ7.Ú9%äA:Ñ=/ê86û7Eö*-õ)*ì)/ó=LôT\ß@=º?0§8-¹>9×CCÐA9Ò91Ï:6Ý>:Ü;3ò00ô02ë2-Â:,î{xþw…ÿQnôAaqM?jŒPz¢f{£g}¡c}¦j}­a‰²p‰¥[gg_N<_N<_N<_N<`N6\SNql‚xqšt|ª‡‹Ò¥•Â¶Œ|ÏSIëGHä:;È@2´91ÉYMÃ?3Ý6-â70á?0ì1,ú9<ôNRåã4;ðW\ù_kàRNÞ@?ÜG@Ø93û+9ü7>Ý4-ê5.ù.2î1-Â8+çtqûj{ÿAcÓCZWQ9m‰Vwbrš[wž_y¤_x§Y‚ªd~™las]\O>^Q@_RA`SBaTNnjƒwy²mq¸ŒÜÆüäÞ¢Øѝ¬xÃe[ìRTè:;Í<7¸G9ÐVIÕ4,å>8Ü6*è0(ã60ÚACóS[úZdø]cú2<ô1?ùU^üXaá<8â64Ù<3â94è8:å63Ý6-ð0+÷03ñ1.Ì9/ädeþWsû?b”EHCG0bwLp’Vj“Oq˜YtœVo™Og‹KNh8G^4UH8]P@bUEdWGpk‰sv«cj²|ƒË¥«ÛÆÇÙËÅDz¦°yxt‹hbÐoiübbîE@ÐB8Ã>/Ð=-âFGÜ;3ã60Ì:-Â=,Ë;;åMYèSYã:7öCIä7;ù59î73é30ß<3è64ê67æ40Ü8,ì1(ñ33ï2.Ò80ò_gûBdêCaaK=RG5LZ7g…IeFj’Sj‘N`‰G[|E]tHZuB@@6TG>^SAjgrol›`` qrŽŠá˜—Ó™“Ó˜Ë‹‚±n_drWL¸YSãtmözxÛKCÁ8&É:*Õ9,Ò9+Ú8-Ç<)Å;1Æ<2ÎD:ÏF<Ù7(ø*6ÿ'?ÿ!<ÿ#9í6;Ý:5ç85ì44Þ6-Ú9'Þ7$ç5+ã7)áB>ÿQjÿ:a˜;F8<+BA-_h=g~RcˆBkKjIfˆKdIeFcˆC/4-A<8OJDabwYYfh³~€×…†Ö††Ì†Õ„Å}xxUS^bG¹SQèagìqi×K>Ã<(Ì9)Ô6+Ä;)Ô@2Í9+É:,Ê8+Ò;0Ò:/é24ù/=ó1<ø/9õ1;â66Þ95é77ò59Ý6.Ò9)Ô9'Ê<$Ì?-÷MVÿ:dÜB\F678:-de;¥¾…s‘]fŒCq–SjIi‹Nf…IhˆGl–N-0'34/@B7TT`b_ŠƒÔ‹‰ê~͇‡ÇŠƒÆ„zŸndbd_Km\Hˆ[DêQTàA=Û7-Ñ8&Ý5,Æ7)À=+ÔB5Ç9+Ç:)Ì6(×6,â92ð5<ì2=êFGïB>ä86á96å99ë8<î68Ö92¿:)½<)¸:$Ç=3ÿG^î@akC;><0[J8²o•±~YuEe‰Ah‘KeˆDhŒLiŽKj’It¢WA?2??5EG/RPC]]Qzw¢ˆ…Èyv£xt§yqˆob\n[Ll\Mu^N¤L@Ø7/á4.Ý5(Ì<$Õ9*³:'Æ:-âE>¸=+Ã;-Ï;1Þ;6ç98é:7ïLMÔIDÙ;8á:4æ66ê7;è7=è8:Í=4®;)¥:&ž:*ÌOMçHZ£]SHG3R^6v˜\‡˜bWdHGT6i†Dc‘HiŒHlPn—QržOv©ZZQBZQB[RC_VGd[Jj_]qeij^`ZWNYSGaYFi^Hp_O¯RK³?0Ë80Û7-Ù7,Õ7+Ô8+²:*±9(Ê7-ÓD6Ù;8à<:í49â96¹;-´;*Ð@5í76é6:å95â92ã99Ü<<¸<2›<*‘8&†:,ÁUUŸVO˜_Vp„I„œ`Rd:>D6<>1AM7jˆHl”Kn•Tl–Jq¡Mu¦W]†Lf]Nf]Nf]Ng^OiaLiaNiaLhaG`[HOL;JK9ORA^TH­UQß;<¹@+Ô8)Õ9*Ò9)Ñ:)°<-™;"º<-Ñ80ï7?Ü9:Ø58Á61§>+§<(¼:,Ý;6î85ç<4Ú@8Í=<®<1–9(‰<(ƒ8%‚?/™SGZN–]VcmJ6A08?7>>29;.>J4m‹Kq™Pq›OsžOz¦[bJXHi`Qi`Qi`Qi`Qj_]j`WjaRjaRiaL]XEFI8?E7AI4wT>ÛVQàA>Ë9*Ì:+Ï;-Ñ;-¾;3¤;(ÈB7âE@ÍB?¡@0”A1ƒ@-Ž;+“=,œ;+¬:/É<2É?4¶J4nŒLq™Pp Lz¦[h‘OdŒMY~Ji`Qi`QkbSkbSlbXldQldQlbVnbThaQWQAHE4MG/¬BBÉIHæ^`ÒG@ÒE>×FAÛGCáGIÝIGçACáB?Ä>;—A2‰=0‚<2;3=1};-€;,Š:/•9,‘:)„;,€8*{5)v6,q9,‡M?UH—SPn]MP`;YoA;L*:@49;.”A=©HBÀHGÐB>ÎE=ÙCDáCDàECÞC?ßB=ÄA9‘:0?3‡81„;,‚:,9-~:/}90|90z:0x:/t8.p6+l3(p:.ˆQJ“RN‚[LbiJNd>HW89A,=>04<16V?7·PSØJIàEAÞDFÜDCÖE@ÑG=ÔA: >1‚?.ƒ;,‚:,9-~:/}:1y:1v7.s9.r8-p5-l3*i3)k7,’OI€ZO\UE@G74:,6>/6XSP¼©£ì¶¬ÚUXÓIGØBCØ@?ÓB=Õ@:©>4…=.€=,9-|8-}:1{;2s:1m7-l8-j8-l7/g5,a1'd5+~QKSG94?/5;168516/1=/7F307046)Q`?o•ZUuCWwE\|J\|J>V¤=8†<3=1~:/{8/{;2w81j8/i7.f7-d8-i70i81e6.qE767/58-57,08+08+.9+2=-9B146(TbIWzPNk=Ol>ZwIVsE,6.heVheVheVheVhdXmd[khU€ƒÉÑÔúúüÿþúõøïõ÷êååɋt˜ˆááßûûùþþüþþüúÿÿç·­ºTFÃI>ÀH8™C6A7;3z;2u9/s9.o6+j81i70h6/h70j92j@2jUBtq^39/17-17-/5+/4./4..3-.3-.:04@2BO;AO6Ic@Hb;YsNF_B&+/heVheVheVheVjdXmd[mlXŽ””ëóöþþþûûóäèÙèìÓâÝÇÓËÀìãäúúøþþüþþüþþüÿüýôÿýñêØ»xe½G=¨?<Š?7m>6i>5cA5_J9L?,DH/XX49?5:?99>88=75:4051,1--10/325G19K39K53D4-4,\hPfkUjhYnfYkg[ieZemXŒ›žäìïùüóìíÛØÓÀÅ·ªÝÒÖþøÿüýÿþþþÿþüÿýúÿýùÿüûÿýþÿüùøêáÿýÿýÿüþýÿÿþëØÖ½RK.UO/QP4PN5IO5EN1KQ/agC]`CTT5AU0Kk<:M:EXF;>H=0dC2¥A2âBBá=;®?,œ@+>-=-¬B5‚F;:5232./1.5//uKLkj¤SNdci_\VX-.0.-+,*+,*+,*+.,-0,+2.-<20A4.H94w9.¦A5³C7—>,Ž=,„;,„A8¤TK„‰sGK<0/+/.,0/-PMF‰›§~˜‹wwWV:45/:728302012,.10,32.?5,B8/>3/F21K4,€;4ˆ?6†>0<-‡C8M@xc‹ m†fFJ<1,)1+-NO?y™h¥vk†g@>29:4C@;GBAŸ?1§?4¬@3Â::¾:8ÃG?•bMé?Hù>QïKcçLlÔJanE?„‚m–£±¹¬wˆuX[F43/==3OI9kllg‡IDJ>;6H@3C?2ó6:ñ7:æ9?å@DÒKHÓECÖ?8é6:æ5/ò00×XQÿ\t£IKr•[xŸ`z¨`…¦oYi^[N>aTDlhqvº°°ÒÎÇ­ukçWVÑB:ÎB5à=8Þ6-×CAðV^ñ8>ôGMæ74á:4è66å4*ò21ÝMLøFhcG;bzJj“Ok”N\yCPj;A>5^Z[ccŸ€ÔŒÑ‹ƒ´n\RÎa^å`YÇ:(Ï9*Ñ;,È:0Ð@7í04ú)<ò09â96ç53Ø9&Ù9)öGX°;NEG1w\iŽHiŒJf„HhJ780JKCom”„€Ê€|¯sgkm^K¼LAß8/Ô8)¿:+Í?3É:,à93ì²@6ˆ?0ˆ<.’:,¬<0š:,9+v8+ŒNAXPTb>CK4;B0n‘MqŸTdKTyFjaRjaRkbSlcTumb›—ŒjZJnC<¦GC×FCÞDDÙD>±?5‚<0‚:,~:/y9/u9.p6+l6*ŒSL`XE?M4:A/6<0g„Jd‡Ma„JIj=gdSgdSlcTneV²·ºûýøÚØ¿[ZH¯¤¢ï½¶ÎWOÐB>¼?9‚<0}9.z:1m9.h8,i70g80RD;4:.28.2?.39-ZtMSp@[xH1B2heVheVkeYy{pëïòõöîèêÔµ¶¨õõóþþüöîëËq°D:€?9u<5o:2l71f:1eE6gbN28.06,.3--2,/90;G3EZ;NbG%*-heVifWlfZtqîòõô÷æÝÚÉý÷÷þþüþþüþþþÿþùáÆ»«†t{UHeD5]F6TN8JN3VXB8>47=36;5271-2.1628G2=K:+2+akSliZjfZw‚zéïï×ÔÃÜÑÍýüÿþþþÿüùþüýýôïþþþÿýö˜’xTO2LN6OV5r~VRP9KH79A4:B7gv=4-_35A08bV92_7dE+-%&EF&BoC^soAFflYVG#@89JvcHvE;BST|G)qX2mqA; z;{gE?0RO}Q9{>OW1pxs80RaI300000000010s{mE1_uZU3Jd?l0JRVR0s#X90t5pE z1q1{D00Dgg0s{a95d{(Xb($mz{*4NnC+Tr5k6F(!D8cW7H&Ae~8tymf4P8E;gQsk-Hz=P;%tZ9UkQ=LBHZDP7)#4?fC-GDt!ZA8On}+Za}F8 zv<^Og*-y7hvDnDwewywGQ12{?Z1XEos=rz9=_GEo)R&pUnJtV zzY*BAtgRRv8s)yod!=(javU176V=oi8LpQ?&?3}r%Q(q2-9y2b5tc9#N1?7}^Gmz5 zkgSm!s1=mqfd}5E9VtG~JB*}m!_*3~XKKaFlA#KRp&dwJpRkTkM7f z9AlcLa~AFo@Q!de%~x20{rAB78kI^Y!VLSGcw&I=3QyCeB3#OhO1T;82Se;fdXot# z-5&?KpXpILIcyaxj_ff(RZ+<&=~jZNwv7uGj%CO{-E8317mUW`PXtuIX#L8e9D|Wp zA-N471a+-*9wJvYJ4`;<&xriR&0fG ze+<{G4p*N_W5gszQhM=KtYByifxo@QM>VUwtk~*n<|Y8tCJ;?I69T#~4_+m+5XS_X z>*3VY^PJQ-I^x1k&`;8{ZZ(-Mpk+)A+!8A{XT3m36UGlCc2CfALrAg{hw0Xq@BXGn@|DqI$Z|sDoMS(QK$j9pJ=|!1XNao)pW#}c4y_}x)aHAZP+O7puSvPqtZh{0bS>x& zXF=jfonT*&S^;{u^*Bge`%pRII08jwj7LVB)v zty_lK87G2kow&R7N`5<78=k)ygRJRvb7XekH z`J4Ducl4$Hz%xb~;zo_}z+R*4QLVfdi5QvL=1zzJ!RNWC<&OngOfwPC8dzbE&I}L^ z<+IwD7_^0tQ%Y-3!tMsGG-tXJKhNV@T9wDlanEYyHEDsG3vA;jd;b7W>s=a`D7kDSWoaT-OW7n_wV4}+0;UK_z#N*^vawizmTYe8 zk4n&hNqI0t;xYQyaiUq;TcBxhPrYes8l9vT?d9#r73Vj4j8fhf7#Ndz01i(|blQAZ zXw%uSWIXNeD<()Kg^5G4loE5(j%l+>w=A-%>~b)}JQM9tm16Ru^4#yo&ba7m6S+_D zpKRi+THn3AXkAA2KPe;TU+}GOw3B5cGcj^93mlMZDj<@`uPozeIXNdLt*)mbw`D7a z=%%yZY2~t9^O`VsWb;Fxkn>C&5l=ODMFlk}ZU+jH5Kp<|{Azod#Ew{;DCCprTy^Y% z;_0r{&Pn6x+PCzp?>5vfc@?D`zVx!(mEmh9@Z4QC(<24;HAHFYjzKkpZFSQow{+=L zv18h=tIc;mmZ0nv&{?P1kajg}-bv6CRc~&XK--$RM`F?z9<|WvQiKZ1c9I7}Q)|*& zHJbtg+_nG<+-Ls)tz6QA4n;V(83*WnDbB66SoCg$Q#11IKQQz)KbqnaicZ{g&oqdK zU@S59r6WJYe*sI4gPu=n2TDl>7NgxtA0w@5z&_1lqxj`J+v(VUpIXE51@Vg4?9rdz zOUwH&{{UXF^vgSqLgqVIK`h7c72e!;XA z&X(2Gyszx$)DYg|d0 zS&uE)dRHD`xYV!wxK-tu&pc=IuHVDNnBDY{bH+mOsR5 zILQ3#iTg78QX0 zqiHNs?g7Hca2Gx49y1e?e;RgjDJrA3%Yb_xD%>& zgXk)ub}zh~nz;;HE&Bs6AOcqv7CYZ=Ikq{jS}|H%yvbU zcyXWBv&GU8H7_ z&&+>H&XxZFdf!@vQAlaZTb};u`e=5|lyK_i`wGe_6FWiydy%>-eg~;@-XT;tg zwbd+S^CAb2O7I<5MSERROIVb?56fPk;BNy*Xt7>Qfu$podsjuT_zv4qLp6b0Yn*-G z;B)Wk_*a-}dVSuNbk_HfG*XVop&p?36-PXCRqqJ$@OqldZnYVpkSZo(X}O?+!vK9K zhTcb*9j9uLSo#We-lo!JBFd*s_cfkhJx)zDkZMTe0BvrR$3q)#U%OqFlW>;05ORKY z914U_&V6dbOSU59^cBclYGm9w9Wz}`6r!~>NFke2g(myC>0ari*jriIN94wUmB}Dg zi>b_53NmVq?CkcAqk=_omYxc0ol);y$=rVm^cy=xwYONn=qk-;YT7l9wPP|;Kt5#u0C*4Q(zyGON&}9aYdOa?2^pp`o|M8U3;BE0 z>j?@Q93GXZvZbbpb0GtBuEqMEE0Z~+~b5f+FaCsGRZsakdkGQ?6{8vjT7&tX& zQ=iJyNe7ZEk2%TWyRpqJD6LH!olXIa<*VKFr7K|=BOFuj2w2N*6^R|k+O9mNZuP$e z3km?WH57-ZT0#RU&wAsvzlVBWrXE{d*<3d{L6j%mf5R2QYCj4!*j$@ewYgr~Uupc0 z_}3w<=vt0}Izy=2`7Yyfjq2GSfvn6iq$`2iojeemBzBYcg^$QRDVEPF%nl0%;IFM) z)$;Mj3|z$@C*0O4Pijqo_M|Ziji5cMBCMyJ)R9VKZ1(i4fCd6cjtxt7J56d8hf2yS zGt#?QhH2$MG}G4=vEjzssUzSLr;7IrIf&EIvCbYDVc^C-H!P#Y1K@$Jze?t$EqtW}DZFk{flBQIpi- zx@*k>3tcbHjz;q_lGy9*T)>r!VDc&nqg><+RbG_1=A5INR#hXF6(xjGz0eGRk4m+w bvctE_MO^w)0I#Q(Dl>}b*??om>tFxbQ9COu diff --git a/testimages/testimgint.ppm b/testimages/testimgint.ppm deleted file mode 100644 index 59c50a8..0000000 --- a/testimages/testimgint.ppm +++ /dev/null @@ -1,4 +0,0 @@ -P6 -227 149 -255 -0/+0/+0/+10,21-32.52-63.83/83/83-83-:3-:3-:3+:3+72.72.61-61-61-61-72.72.50,50,50,50,50,50,50,50,4/+3.*3.*3.*2-)2-)2-)2-)1,(1,(1,(1,(1,(1,(1,(1,(.+$.+$/,%0-&1.'2/(2/(30)52+63,63,74-85.96/96/:70@:,A;-C=/F@2GA3IC5JC3JC3LE3LE3LC2LC2LD1ME2PE3PE3Q>/S@1c?/iE5C4†H9œE4žG6´F7µG8¿E8ÁG:ÇG<ÈH=ÊG?ËH@êCKëDLëDKëDKíCFìBEò>Añ=@÷:>ö9=ò9>ò9>ä@?â>=Ó?;Ð<8µ@,´?+´?+´?+²?,²?,°@,°@,«@,ª?+¤A,£@+œB*›A)—A(–@'‘@-?,‘>,‘>,=+=+>)>)“>*“>*“>*“>*”=)•>*–?+–?+“@8’?7™=0›?2«@.°E3¼C0½D1·?/¸@0¥H9£F7K=s?1N;*E2!95495484373262/51.40-3/,63.52-52-52-41,41,41,30++0*+0*-/*-/*./*./*1-*1-*2-*1,)3)(2('5)):..D66J<TPaTPaTPa/.*/.*0/+10,21-21-52-52-72.72.72,72,92,92,92*92*72.61-61-50,50,61-61-72.61-61-61-61-61-61-61-61-3.*3.*3.*3.*2-)2-)2-)1,(2-)2-)2-)2-)2-)2-)2-)2-)/,%/,%0-&1.'2/(2/(30)30)52+63,63,74-85.96/96/96/@:,A;-C=/E?1F@2HB4IB2IB2JC1JC1KB1JA0KC0LD1OD2OD2Q>/S@1b>.gC3~@1ƒE6˜A0šC2­?0®@1¹?2»A4ÂB7ÄD9ÈE=ÈE=ç@HèAIéBIêCJíCFíCFô@Có?Bø;?÷:>ó:?ó:?ä@?â>=Ó?;Ð<8´?+´?+´?+³>*²?,²?,¯?+¯?+ª?+ª?+¤A,£@+œB*š@(—A(–@'?,?,‘>,‘>,=+=+>)=(“>*“>*’=)’=)”=)•>*•>*–?+“@8’?7™=0œ@3¬A/°E3½D1½D1¹A1¹A1¦I:¢E6}I;q=/N;*E2!:65:6595484373051.51.40-63.52-52-52-41,41,41,30+,1+,1+.0+.0+/0+/0+2.+2.+3.+2-*4*)3)(5))9--C55H::k;;uEEŠIGŽMKœQU©^b l‚£o…ˆ}§‰~¨z‡¼x…ºnt¤W]THpOCkLG^MH_MJ[PM^ZZbmmuƒˆ„“˜”˜ž’™Ÿ“˜œ‹‘€}~lijX]\JUTBUQbUQbUQb..,..,0/+0/+10,21-41,52-52-52-61+61+61+61+81)81)61-61-50,4/+4/+50,61-61-61-61-61-61-61-61-61-61-3.*3.*3.*2-)2-)2-)1,(1,(3.*3.*3.*3.*3.*3.*3.*3.*1.'1.'1.'2/(30)30)41*41*52+52+63,74-74-85.96/96/?9-@:.B<0D>2E?1F@2G?2H@3HA1HA1H?.H?.I@/JA0MA1MA1JA0LC2YB0\E3pC0tG4‰B0ŠC1—<*™>,¦<,ª@0²B4µE7¹H:ºI;Ü@CÝADáCDãEFëCCìDD÷@B÷@Bù:?ø9>ó<>ò;=âC?ß@<ËB8È?5±A-±A-°@,°@,°@,¯?+®?,®?,©@+¨?*¡A+ @*™A)˜@(•A)•A)?,?,?,>+>+>+<*<*>)>)>)>)>)‘?*”?+•@,“A5’@4›>/žA2±@0µD4ÁB3ÁB3¾D7¾D7¥K@ F;vJ=j>1I=-B6&=85<74;63:5294183062/51.63.52-32-32-21,21,21,10+,1+,1+,1+,1+.0+.0+0/+0/+3/,3/,5-+3+)4*)7-,=32A76^90gB9|F:‚L@OMšZX“hy˜m~‚y¤…|§wƒ½r~¸gl£QVPDtL@pLAaPEeOJaMH_LKYZYgquv„ˆ‰…Œ„‰ˆŠ‚ƒ‰{wykfhZZ[KSTDYS]YS]YS]--+--+/.*0/+0/+10,41,41,41,41,50*50*50*50*70(70(50,4/+4/+3.*3.*4/+4/+50,50,50,50,50,50,50,50,50,3.*3.*2-)2-)2-)1,(1,(1,(4/+4/+4/+4/+4/+4/+4/+4/+2/(2/(30)30)41*41*52+52+52+52+63,63,74-85.85.96/=7+>8,@:.B<0C=/D>0E=0E=0E>.E>.F=,F=,G>-H?.K?/L@0LC2MD3YB0[D2nA.qD1…>,†?-’7%“8& 6&¥;+®>0³C5¸G9ºI;Û?BÜ@CàBCáCDêBBëCCõ>@õ>@ù:?ø9>ó<>ó<>âC?Þ?;ÊA7Å<2°@,°@,¯?+¯?+¯?+®>*­>+­>+¨?*§>)¡A+Ÿ?)˜@(—?'”@(”@(?,?,>+>+>+Ž=*<*<*>)=(=(=(=(>)“>*”?+“A5“A5œ?0ŸB3²A1¶E5ÂC4ÂC4ÀF9ÀF9§MB F;uI96=85<74;63:5294173062/63.52-32-32-21,21,21,10+,1+,1+,1+,1+.0+.0+0/+0/+40-40-6.,4,*4*)6,+:0/=32Y4+a<3u?3zD8†FDOMŠ_p‘fw|sž€w¢s¹lx²`eœNSŠPDtL@pLAaODdMH_ID[EDRLKY[_`imnszrw~vyqtzlln`_aSWXHSTD[U_[U_[U_,,*,,*--+..,0/+0/+10,10,30+30+30+30+4/)4/)4/)4/)4/,3.+3.+2-*2-*3.+3.+4/,4/,4/,4/,4/,4/,4/,4/,4/,2-*2-*2-*2-*1,)1,)0+(0+(4/,4/,4/,4/,4/,4/,4/,4/,30)30)30)41*41*41*52+52+41*52+52+63,74-85.85.85.<5+=6,>8,@:.A;/A;/C;.C;.C;.C;.D;,D;,E<-G>/J>0K?1FI6FI6PH5QI6aE0cG2tA,uB-‚;'ƒ<(;'•@,ŸB0¥H6­L;°O>ÎDAÏEBÖE@×FAäB?äB?ò<;ò<;ú9<ú9<ð><ï=;ÙF>ÕB:½D3¹@/­@+­@+­@,¬?+¬?+¬?+©>,©>,¤?+¤?+Ÿ@,ž?+—A*•?(’@*‘?)>+>+>+>+Ž=*Ž=*<)<)Ž=*Ž=*<+<+Ž=,Ž=,>-Ž?.”C2“B1¢>/¦B3º@3½C6Å@7Å@7¹D;ºE<OE–H>jJ?]=2<=/78*@85?74?74=52:5194074/74/43.32-23-23-03,03,03,/2+,3,,3,,3,,3,-2,-2,/1,/1,12-23.40-2.+1-*1-*50-72/N7)S<.c>.hC3pD;xLCz[j†gvwqŸ|v¤p{½it¶^c¥PU—OGƒIA}PAjPAjKAcI?aEBWGDYILUMPY]ca`fdah`_f^Y_STZNSYKSYK_WT_WT_WT++),,*,,*--+/.*0/+0/+0/+2/*2/*2/*2/*3.(3.(3.(3.(3.+2-*1,)1,)1,)1,)2-*3.+2-*2-*2-*2-*2-*2-*2-*2-*2-*2-*2-*1,)1,)0+(0+(0+(3.+3.+3.+3.+3.+3.+3.+3.+30)30)41*41*41*41*41*41*41*41*52+63,63,74-85.85.;4*;4*=7+>8,?9-?9-@8+@8+B:-B:-C:+C:+D;,F=.I=/J>0FI6FI6OG4PH5_C.aE0r?*r?*:&‚;'Ž9%’=)@.¢E3«J9®M<ÍC@ÎDAÔC>ÕD?ãA>ãA>ñ;:ñ;:ù8;ù8;ï=;î<:×D<Ò?7ºA0µ<+¬?*¬?*¬?+¬?+«>*«>*¨=+¨=+£>*£>*ž?+>*–@)•?(‘?)>(>+>+>+Ž=*Ž=*<)<)<)<)<)Œ;*Œ;*<+Ž=,>->-”C2”C2£?0§C4»A4¾D7ÆA8Å@7·B9¹D;žPF—I?jJ?\<1;<.78*@85?74>63=52:5194074/74/43.32-23-23-03,03,03,/2+,3,,3,,3,,3,-2,-2,/1,/1,01,12-51.3/,1-*1-*3.+50-K4&M6(\7'a<,i=4qEgH>`H>`FCXFCX?BK7->5,>5,A9.A9.B8,C9-D:.F<0J>2K?3DE5EF6LE3MF4XC2YD3f?.f?.v=,v=,‚9(…<+“=,˜B1ŸF4¢I7»F<¼G=ÆH<ÈJ>ÙD=ÚE>ì?;ì?;ò::ñ99ç>9ç>9ÍG;ÇA5­D.§>(¦A-¦A-¦?,¦?,¦?,¥>+¤?-¤?- ?,Ÿ>+›@-™>+”?+“>*>)>)>->-Œ=,Œ=,Š=+Š=+Š=+Š=+Š=-‰<,ˆ<,ˆ<,ˆ<.‰=/Š>0‹?1’D0’D0¥?1©C5½A9ÀD<ÃB<ÂA;±JCµNG˜^S’XMgWJXH;;F87B4?80>7/>71<5/94.83-63,63,34.23-14-14-.3,.3,-4,,3+,3,,3,,3,,3,,3,,3,-2,-2,.0+02-23.12-/0+./*0/+10,>1+?2,J4'P:-V=6aHAo^p…t†µ„„¸{ƒÎs{Æmp¿be´VSšFCŠL?jI`DBXDBX2K?3BC3CD4JC1KD2VA0WB1d=,d=,t;*t;*€7&‚9(9(”>-›B0žE3¸C9¹D:ÃE9ÇI=ÙD=ÛF?îA=îA=ñ99ð88ç>9æ=8ÌF:Æ@4«B,¥<&¥@,¥@,¦?,¦?,¥>+¥>+¤?-£>, ?,Ÿ>+š?,™>+”?+“>*>)Ž=(>-Œ=,Œ=,Œ=,Š=+Š=+Š=+‰<*‰<,‰<,ˆ<,‡;+ˆ<.‰=/Š>0Š>0’D0“E1¥?1ªD6¾B:ÀD<ÃB<ÂA;·PI½VO¡g\›aVqaTbREDOA@K=>7/>7/=60<5/94.83-63,52+34.23-14-14-.3,.3,-4,,3+-4--4--4--4--4--4-.3-.3--/*/1,23.12-/0+./*/.*0/+:-':-'F0#L6)T;4aHAsbt‹zŒŠŠ¾ŒŒÀ‰Ôx€ËsvÅhkºYVFCŠIEO>EOGQPLVUR]UT_WS_SR^RT^SV`U`YI`YI`YI+-,+-,+-,+-,+-,+-,,,*,,*/.*.-).-).-)/,'/,'/,'/,',+),+),+)-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*-,*,+),+)-,*-,*.-+.-+/.,/.,/.,/.,/.,/.,.-+.-+.-+.-+/+(0,)1-*2.+3/,3/,2.+2.+2.+2.+2.+3/,3/,51.62/73070*81+92,;4.<5-<5-=4-=4->5,>5,?5,@6-A7-C9/G:1H;2G?4G?4K?3L@4T>3T>3]9-]9-m9,n:-}7+€:.Œ:,>0—>0˜?1¦B3¨D5²D5·I:ÉG:ÌJ=ÝD>ßF@æA=çB>ßF@ÜC=ÀH8¹A1 D-žB+ A- A-Ÿ@,ž?+Ÿ>+Ÿ>+ž?-ž?-š=,™<+•>+”=*>+Ž=*Œ>*Œ>*Š=+‰<*‰<*‰<*‡;+‡;+…<+…<+†=.†=.…=/…=/„>2†@4‡A5ˆB6E2‘F3¦D7­K>¼E?ºC=¶G@»LE©_T°f[”wg‘tdsugik]P`SCSFOK@IE:A?3;9-85,74+44*33)34,34,14-03,-2,,1+,1+,1+-2,-2,-2,-2,-2,-2,-2,-2,02-02-02-02-12-12-12-12-4*39/8?42@53E<7YPKrn}Š†•‘”–ÇŽ•ÝƒŠÒs{Ãfn¶^d¢V\šNKjFCb=?V=?V5,>5,?5,@6-A7-C9/F90G:1F>3G?4K?3K?3S=2S=2\8,\8,k7*l8+{5)~8,‹9+Ž<.–=/—>0¤@1¥A2¯A2²D5ÄB5ÈF9ÚA;ÜC=å@<æA=ßF@ÛB<¿G7¸@0 D-žB+ A-Ÿ@,ž?+>*ž=*ž=*ž?-ž?-™<+™<+”=*”=*>+Ž=*Œ>*‹=)‰<*‰<*‰<*ˆ;)‡;+‡;+„;*„;*…<-…<-„<.…=/„>2…?3‡A5ˆB6“H5“H5§E8­K>½F@¼E?¹JC¾OH¯eZ¶la›~n˜{kz|nprdWgZJZMOK@KG2=:196-44*11'23+12*03,/2+,1+,1+,1+,1+,1+,1+,1+,1+,1+,1+,1+,1+/1,/1,/1,/1,01,01,01,01,5+48.7=20?42H?:^UPvrŒˆ—‘”–ÇŽ•Ý„‹Óx€ÈpxÀlr°gm«a^}[XwSUlTVmU]j\dqftur€u†~ˆƒ•‰|Ž‚v†yp€sfteXfW^X@_YAa[C*./*./*./*./,.-,.-,.-,.-,,*,,*-,(-,(,+',+',+'+*&+*(+*(+*(+*(+*(+*(+*(+*(,+),+),+),+),+),+),+),+),+),+),+)-,*-,*-,*-,*.-+.-+.-+.-+.-+.-+.-+.-+.-+/+(0,)1-*1-*2.+2.+1-*1-*0,)0,)0,)0,)1-*3/,40-51.80-91.:2/;30<41<41=4/=4/=4-=4->3-?4.@6-B8/E80F91H;5H;5J;4K<5O:5O:5V72V72c60d71t5,w8/†8,Š<0“;/•=1šA3šA3ŸB3¡D5®B5²F9ÃE9ÅG;ÑG=ÓI?ÏJAÌG>µJ:®C3›D0˜A-šB.™A-™A-˜@,™>,™>,š?-š?-–=-•<,‘>,=+Œ=,Œ=,‰>+‰>+ˆ=*ˆ=*‡<)‡<)…<+„;*ƒ;,ƒ;,;/;/=2=2‚?6„A8ƒC9„D:“K<’J;¡G>¦LC±KF±KF¨XO®^Užyf¦n’|y{ŒypncqbVdUMQ@JN=GI;CE7>@39;.35*/1&01)/0(/0*./)./*./*./*/0+/0+/0+/0+/0+/0+/0+/0+/0+01,01,01,01,01,01,01,01,6+<6+<600;55EG:]_Ru{{‰”±‘˜µ‹–ď¼|‹²{Š±y§xŽ¦|‹v…Šn€€l~~jym„|u€›Œˆ¤Ž©“§‘†žˆ€–xŽyj{hXiVZV9\X;_[>*./*./*./*./,.-,.-,.-,.-,,*,,*-,(,+',+',+'+*&+*&+*(+*(+*(+*(*)'*)'*)'*)',+),+),+),+),+),+),+),+),+),+),+),+),+),+),+),+)-,*-,*-,*.-+.-+.-+.-+.-+/+(/+(0,)1-*1-*0,)0,)/+(/+(/+(/+(/+(0,)1-*3/,3/,80-91.:2/;30<41<41<3.<3.=4-<3,=2,>3-?5,@6-C6.D7/F93F93H92I:3N94M83T50T50a4.c60r3*v7.…7+‰;/“;/”<0™@2™@2›>/@1©=0­A4¾@4ÁC7ÎD:ÏE;ÌG>ÉD;³H8¬A1™B.—@,™A-˜@,—?+–>*˜=+˜=+™>,™>,•<,•<,=+<*Œ=,‹<+ˆ=*ˆ=*‡<)‡<)†;(†;(„;*ƒ:)‚:+‚:+€:.€:.€<1=2‚?6„A8„D:…E;“K<’J; F=¥KB°JE´NI¬\Sµe\¦n­ˆu˜š„•—„•‚yŠwlzk`n_UYHPTCKM?EG9@B5;=057,13(/0(./'-.(,-',-(-.)./*/0+./*./*./*./*./*./*./*./*/0+/0+/0+/0+/0+/0+/0+/0+7,=5*;3--:44HJ=bdWyŠ‹’¯Ž•²ˆ“ÀƒŽ»€¶‡–½Œ¢º¦¾—¦«’¡¦Œžž‰››‚™‘–Žœˆ£””°š–²œ”¬–‹£…›†|’}j{hUfSXT7ZV9]Y<+/0+/0+/0+/0+/0+/0-/.-/.--+,,*,,*,,*,+',+',+',+'+++*********))))))((((((************************************************++++++,,,,,,---------.../+*/+*0,+0,+0,+/+*/+*.*)/+*/+*/+*/+*0,+1-,2.-3/.91/91/:20;31;30;30<20;1/<3.<3.=2.=2.=2,?4.B5/C60A83A83B94C:5E:6D95I81I81V80W91g7-k;1|:.€>2‹=0?2–?6–?6“@2”A3™B1œE4©E5«G7¶F:¸H<ºJ>¸H<«F:¥@4—A2•?0”B-“A,”?+“>*”=,”=,”=,•>-’<-’<-Ž=,Ž=,Š=-‰<,…<+…<+†;(†;(„;*ƒ:)‚:+‚:+:+:+~<0~<0}=3?5€A8ƒD;ƒG?„H@K@ŽJ?šGAŸLF¤QKªWQl]¦uf““w™™}‰¨ˆ‡¦†„x”{u€ojudZfPS_IJVBBN:=F58A07;-48*01)/0(.-(,+&.*'/+(1++2,,0,)0,)0,)0,)0,)0,)0,)0,)/.*/.*/.*/.*/.*/.*/.*/.*9+:6(70-$85,DO1_jLv„j†”z‹˜‘œ•‹šˆ—š„Ÿ–ª¡–½¢Ä©—¸£–·¢–º –º ´•ˆ­Žˆ­‹²‘µ‘‘µ‘¬†£„ƒœz“vg{bPdKST5TU6WX9+/0+/0+/0+/0+/0+/0-/.-/...,--+--+--+-,(-,(-,(-,(,,,,,,+++******)))((((((*********************************))))))))))))(((******+++,,,,,,---.......*)/+*/+*/+*/+*.*)-)(-)(/+*/+*/+*/+*0,+1-,3/.3/.:20:20;31;31;30;30;1/;1/;2-;2-<1-<1-<1+=2,@3-A4.?61?61@72A83C84C84G6/G6/S5-T6.d4*h8.z8,~<0‰;.‹=0•>5”=4’?1“@2—@/™B1¥A1¦B2°@4²B6´D8³C7¨C7£>2–@1•?0“A,’@+“>*’=)“<+“<+“<+”=,‘;,‘;,Ž=,<+‰<,ˆ;+…<+„;*…:'…:'ƒ:)ƒ:)9*9*~9*~9*~<0=1~>4€@6‚C:…F=…IA‡KCŽJ?ŒH=šGA¡NH¨UO¯\V£rc®}n——{‹ªŠ‡¦†‚ž…{—~z…tp{jcoY\hRQ]IGS?BK:-;4;4?3Ž@4ŽB2C3”C0”C0ž>.¡A1¨B6©C7¢B6ž>2•?2”>1‘@+?*=+<*‘;*‘;*‘;,’<-<,<,‹<-Š;,‡;+‡;+„;*„;*ƒ:'ƒ:'‚9(‚9(9*€8)}9,}9,}=1~>2~?6€A8E=…IA†KEˆMGŒIAŒIA—IE¡SO¤]W­f`€n¨‹yŠ¢€§…€°Š|¬† ƒyš}ˆvxmfx^`rXXgPN]FHT@AM9>D6:@257,35*2/*/,'0(&1)'3)*4*+2*(2*(2*(2*(0+(0+(0+(0+(0,)0,)0,)0,)0,)0,)0,)0,)9(28'10/65!1+?2,96/96/872983983983<71<71C0)E2+U1%Z6*l4%q9*|9(~;*Ž92Ž92Œ>2?3A1A1‘@-?,›;+ž>.¥?3¦@4 @4ž>2•?2”>1?*?*=+<*:)‘;*‘;,‘;,<,Ž;+‹<-Š;,‡;+†:*„;*ƒ:)‚9&‚9&‚9(‚9(€8)€8)}9,|8+~>2~>2@7B9‚F>†JBˆMGŠOIŒIAŒIA™KG¤VR¨a[±jd¢…s­~¥ƒ¨†±‹|¬† ƒz›~ƒŠx{‚pj|bew]_nWVeNO[GFR>AG9;A379.46+30+/,'0(&0(&3)*4*+1)'1)'1)'1)'/*'/*'/*'/*'/+(/+(/+(/+(/+(/+(/+(/+(8'18'11054 9IQa2kN~’a‡˜vŒ{‹ŸƒŠž‚†§x’³„•Ç‚›Íˆ™Ç ™Ç ˜Ç“˜ˆ·‰~­¯€ˆ¶‡‚¬~…¯†©zuvmk…bZnRFZ>HK.FI,DG*-0'.1(.1(.1(01)01)01)01)33+33+63,52+52+41*30)2/(7/,6.+6.+5-*2-*1,)0,+/+*.,-.,---/--/+,0*+/()-()-/(//(//(//(/.)-.)-.*+.*+,+)-,*,-(,-(-.(-.(-.(-.(+-,+-,------/.,/.,2.+2.+1,&2-'5.&6/'8/&90';1(;1(;4*<5+<5+<5+=4-<3,<3,;2+;2-;2-;0,;0,;0.;0.<1/<1/E.&E.&86)86).:,.:,36-36-C+)B*(O%&R()V/(]6/\@2`D6vB,xD.…@0‡B2”>1“=0“9.’8-<,‘>.ŽC0E2D/ŽC.?+Œ>*›82š71=1Ž<0‚A/@.|B.{A-ƒB0ƒB0‡>/†=.‡;-†:,„;,ƒ:+u9.|@5s>.n9)s@-s@-t<+yA0};-?1‡E9‹I=†L@‡MA€PBQC•IK›OQˆh[pct‡i{Žpx{~£Š¤‡‹¥ˆ‘¥Š¤‰ƒ¤‡}žkzg™vbdZ‡\X|VSwQZnRSgKQUDHL;D=5?80:..5))5&+5&+2%,2%,$-*$-*&*)&*)*(++),0',1(-3(03(03'13'10)10)1-*1-*1.*+0,-.-(/.);>+VYFnyW~‰gŠp‹žq‰¤oŒ§r‡¨qˆ©rŽ´{˜¾…¡¿‹Ÿ½‰—¹†‘³€‰®{…ªwƒ©z„ª{ƒ¦|‚¥{€~v“tqˆnf}c[jWL[HIP@AH85.=4-<3,;2+;2-;2-;0,;0,;0.;0.<1/<1/E.&F/'86)86).:,.:,36-25,C+)C+)O%&R()U.'Z3,Y=/\@2s?)uA+ƒ>.†A1“=0“=0”:/“9.:*:*Š?,‹@-ŒA,B-A-A-š71š71=1Ž<0‚A/@.|B.{A-‚A/‚A/†=.…<-†:,†:,ƒ:+ƒ:+t8-x<1p;+n9)r?,q>+q9(s;*~<.‚@2ˆF:‹I=†L@†L@€PBQC“GI›OQŠj]“sfx‹m’t{ ~¦„‹¥ˆŒ¦‰’¦‹‘¥Š…¦‰ ƒmŸ|i›xe’g^‹`\€ZX|V_sWZnRY]LPTCKD6?338,,7(-6',3&-2%,$-*$-*&*)&*)+),+),1(-2).3(03(03'13'10)10)1-*1-*12./2./-,',+&8;(TWDmxVŠh„—j…˜k„Ÿj‡¢mƒ¤mƒ¤m‡­t¶}š¸„˜¶‚‘³€Œ®{…ªwƒ¨u‚¨y‚¨y‚¥{¤zœ}u’sp‡mf}c[jWL[HEL<=D48?//2)/2)03*03*12*23+23+23+55-55-74-85.74-63,63,52+81+70*50,4/+3.*2-)1-*0,)/.,/.,......--/,,.)*,)*,/)-/)-/)-/)-.*+.*+.*).*).-).-).-)/.*./)./)/0*/0*//////..,..,/.*/.*1.)1.)4/)4/)70(81);2)<3*>4*>4*>7->7-?6-?6-?6->5,=4-<3,;2-;2-;0,:/+:/-;0.<1/<1/@2)A3*N,+N,+W%.V$-L(,K'+=0*3‰<6‰<6‹;4Š:3†=4†=4‚@2‚@2…A4†B5ŠB6‹C7‹?/‹?/ˆ?.‡>-†?-…>,‡;+‡;+Š;,‰:+ˆ;+‡:*<)<)w?(w?(}=1{;/u:,v;-w?0w?0v<.u;-?3‚B6ˆE<‹H?‰K@‰K@†MB‡NC”HHœPPh\™qe‚ˆlˆŽr{Ÿ{€¤€‚ª…ƒ«†‹ªŠ‹ªŠ£‡‰†–|‚’xa™j\”eX‹`V‰^X…^S€YPsUIlNB[E;T>4F6+=-(5+%2($/'#.&4%(4%(1%'1%'0'*1(+/+,0,-+,.+,.(..(..%/0%/0$00$004.04.0.+&,)$58'QTCkvX}ˆj}’i~“j~šj‚žn~ m}Ÿl¦q†­xŠ¯y‰®x…¬w‚©t§s~¦r~¥v¦w¤{~£z}›yt’pp‡ke|`XjRJ\DEG9=?18:,14+14+14+25,34,34,45-45-66.66.96/96/96/96/85.74-92,92,61-61-50,4/+2.+2.+0/-10.000/////1--/+,.*+-0*.0*.0*.0*./+,/+,/+*/+*/.*/.*/.*0/+/0*01+01+01+00000000.00.0/+0/+2/*2/*61+72,:3+;4,=4+>5,@6,@6,@9/@9/A8/A8/@7.?6->5.=4-<3.;2-;0,;0,;0.;0.<1/=20B4+B4+O-,O-,X&/W%.M)-L(,>1+>1+;3(;3(N-$Q0'e+)g-+g9*i;,v:/z>3ˆ;5‰<6Š:3Š:3ˆ?6ˆ?6„B4„B4†B5†B5‰A5‰A5‹?/Š>.ˆ?.‡>-…>,…>,‡;+‡;+ˆ9*ˆ9*†9)†9)~;(~;(v>'v>'?3w7+u:,w<.s;,u=.z@2z@2A5„D8‰F=ŠG>ˆJ?‰K@‡NC‰PE˜LLžRRg[•ma|‚f‚ˆlvšv| |§‚©„Š©‰Š©‰£‡Šž‚‡—}ƒ“ydœm_—h^‘f]e`f]Šc\aVy[NgQF_I>P@3E5.;1(5+%0(#.&4%(3$'1%'1%'/&)0'*.*+/+,)*,)*,&,,&,,#-.#-.".."../)+1+-.+&.+&7:)QTChsUw‚dyŽezfz–f€œl|žkzœiy k~¥p¦p¤n}¤o|£n|¤p}¥q}¤u}¤u{ w{ wz˜vrnn…ie|`XjRJ\DCE7;=/68*25,25,36-36-56.56.56.56.77/880;81;81;81;81:70:70<5/;4.94083/72.61-51.51.51.51.32032021/10.0/-/.,3*+3*+1++1++1++1++0,)0,)2.+2.+10+10+10+21,12*12*22022023.12-21,21,50*50*;4,;4,=4+>5,@6,A7-B8.C9/C;0C;0C;0C;0B90@7.?6->5,=4-<3,<3.;2-;2-<3.<3.=4/?61?61P-1P-1['3Z&2O+/N*.:6-:6-29)3:*B4'C5(Y.'Z/(b:2e=5r;6v?:ƒ;<ƒ;<…;:„:9;8€<9}A9C;‚C<B;…@9„?8}E.}E.C.€B-†=,…<+‹9+Š8*‰7)‰7)‚;):(x>(x>(qB(pA'‡4,,$7,‡=2v4(v4({A5}C7zF9|H;K>€L?M@ƒOB‡QEŠTHjkKnoOwsV|x[€|_ˆ„g‡’rŽ™y€£{ƒ¦~|¬‚~®„|¬‚w§}v zsw„nŠk|Ši|ŠiyŠjwˆhpƒglcbpWZhOTYEHM9E?1=7):-$7*!6&&6&&1'%1'%+*%+*%(-'(-'&,(&,()+()+(+)*+)*0'*0'*,$!2*'51&95*?D0TYEbqRm|]qŠbqŠbp‘bv—hu›js™hqœgu kw¢lu jsŸju¡lx¤sz¦uz¤vy£uxtxtw–toŽll…gc|^UlOG^AFB7>:/95*47.47.47.58/67/67/780780991991<92=:3=:3=:3=:3<92?82>71<73;62:5194084173084184165365354243121/21/5,-5,-3--3--3--3--2.+2.+3/,3/,21,21,21,32-23+23+33133134/45054/65094.94.=6.=6.?6-@7.C9/D:0E;1E;1E=2E=2E=2D<1C:1B90@7.?6-?6/>5.=4/=4/=4/=4/>50?61?61@72R/3R/3])5])5R.2R.2=90<8/5<,5<,D6)E7*Y.'Z/([3+]5-k4/p94~67787676|85}96y=5{?7~?8@9„?8„?8}E.}E.€B-A,†=,…<+Š8*Š8*‰7)‰7)‚;)‚;)x>(x>(qB(qB(†3+†3+™OD£YN…C7{9-G;‚H<{G:|H;~J=K>M@„PC‰SGWKmnNqrRzvY~z]‚~aŠ†i‰”t‘œ|~¡y€£{{«}­ƒ|¬‚x¨~w¡{tžx…Žo„n€Žm€Žm~o}ŽnwŠnt‡km{bft[afRUZFQK=GA3B5,3IE:NS?]bNcrSixYk„\jƒ[iŠ[oao•dn”cl—bošetŸirgpœgržiw£ry¥ty£uv rušqušqt“qmŒjk„fb{]UlOG^AEA6=9.84)58/58/58/690780891891891::2;;3>;4>;4?<5?<5?<5>;4?:4?:4>93>93=82<71<73;62:72;83;83:72:7285074/63.7/,7/,7/,7/,50,50,50,50,41,41,52+52+33+44,44,44,43/540650761:70;81=90=90?8.?8.A9.B:/D:.F<0H<.I=/G=3G=3G=3G=3E;1D:0A8/@7.@70@70?6/?6/>71>71?82?82=82>93>;4?<5@=6@=6C<2C<2E8/E8/H8+H8+F9(G:)D<'E=(a-"d0%q0*w60…73ˆ:6‹<8‹<8‹B;‰@9>5~;2‚90ƒ:1Š;4Œ=6A5€@4‚@4?3=2€<1}=1}=1x>0x>0w?0w?0{=0{=0€:0€:0›+'¨84Ïieá{wªZQ‘A8„OAL>mN:nO;hT;4?<5@=6@=6@=6?<5A<6A<6@;5?:4>93>93=84=84<94<94<94<94;83:7296185091.91.91.91.72.72.72.72.52-52-52+52+44,44,44,55-540540761872<92=:3?;2@<3@9/@9/B:/C;0E;/F<0I=/J>0H>4H>4H>4G=3F<2D:0A8/@7.B92A81@70@70?82?82@93A:4=82>93>;4@=6A>7B?8E>4E>4F90F90I9,J:-H;*H;*F>)F>)i5*l8-{:4ƒB<’D@—IEšKG›LH›RK•LEˆE<€=4€7.8/‰:3Œ=6A5€@4‚@4?3=2€<1}=1|<0x>0x>0w?0x@1|>1|>1;1;1—'#®>:å{ü–’¼lc—G>‚M?{F8lM9mN:hTc^HhcMfmNmtUj|Vk}Wj…XhƒVe‡UlŽ\n•`p—bq™dtœgqjnšgl˜go›južrw tvœuq—pr”qs•rr‘okŠhi„ca|[TnKGa>SJAKB9F=48;27:17:17:19:2:;3;<4<=5<<4<<4?<5@=6A>7B?8B?8C@9E@:E@:D?9D?9C>8C>8B=7B=7@<3@<3B;3A:2A:2A:2A:2A:2A81@70@70@70>7/>7/=6.=6.<71;60:7096/85.74-74-63,66.66.85.96/;7.=90@9/A:0B:/C;0F<0H>2K?1L@2L@0L@0MA5L@4K?3J>2G=3F<2E;1D:0B90A8/?8.?8.<8/=90=90>:1;4,LE=P?8J92Z;6T50W,&d93a0)d3,e1&a-"e,!l3(s9.u;0G8ŽF7šG9ŸL>£E;›=3=1¢B6¥M?§OA«UD­WF©M>›?09*¡=.•78•7855‹11ƒ83‡<7wC6r>1lE4iB1q=0q=0‰32‰32œ'0š%.ÑCAî`^ÅCAÕSQÞ{uµRL~I9‰TDcW=g[AafFbgGgbDgbDzeJ„oT¨WF»jYí`fâU[þ,Iö$AÿFÿ"Jÿ8Vÿ:XòTcÿapòtxóuyíy|ð|ÌyuÍzvÆ}vÇ~w»‚w»‚w³…v²„u¤zl£yk£qhœjaš[VŽOJˆA?‚;94;t)0m,0l+/T$"Q!N/*R3.J3-H1+D1*E2+F.*C+'H/+O62VK+aV6da>gdAhpIu}Vr„ZoWi…UlˆXnŽ\r’`t—au˜bwšdx›eq–ms˜ot–qr”ot“sy˜x{˜|y–zy“xsrl†iiƒfg‚a`{ZSnKHc@SMAQK?OI=7:17:17:17:19:2;<4<=5=>6>>6>>6@=6A>7A>7B?8B?8C@9E@:E@:E@:D?9D?9C>8C>8C>8C?6B>5D=5D=5C<4B;3B;3B;3B92A81A81A81@91@91@91@91<71;60:7096/85.85.74-74-66.66.96/96/;7.=90A:0B;1C;0C;0F<0H>2K?1L@2L@0L@0L@4L@4K?3J>2G=3F<2E;1D:0B90B90@9/?8.=90>:1>:1?;2B;3B;3C2+F5.[<7`A9xD7s?2g@/rK:M@yE8‚,+…/.°;DÆQZÚLJÝOMÂ@>Á?=Æc]¹VPzE5‡RBocIfZ@Z_?ejJrmOojL{fKlQ·fU½l[âU[ÖIOú(Eù'Dÿ!Iÿ"Jþ/Mþ/MâDSéKZ×Y]ÖX\Ï[^Ò^aÂokÃpl½tm¿vo¶}r·~s±ƒt±ƒt±‡y°†x²€w¯}t³to°ql±jh°ig³ho¥Za”SWŽMQ}MK{KI]>9? L5/H1+E2+I6/N62O73T;7ZA=[P0dY9eb?ifCltMz‚[xŠ`t†\nŠZnŠZm[o]r•_t—at—at—ao”ks˜ow™tv˜s{šz€Ÿ‚Ÿƒ€€šx’wpŠmj„gg‚a_zYSnKIdAVPDVPDTNB6906907:18;2:;3<=5>?7?@8@@8@@8B?8B?8C@9C@9C@9C@9EB;DA:DA:DA:EA8D@7D@7D@7HA7HA7H?6G>5F>3E=2D<1D<1C;0C;0C;0C;0C:1C:1B;1B;1<8/<8/<8/;7.96/85.85.74-96-96-96-:7.<8-=9.A;/B<0C;.D.L?.M@/M@/M@/M?2M?2L>3K=2I=1G;/E;1D:0C;0C;0?;0?;0?;0?;0?<3?<3ZB8N6,{*0?EÆ?PÓL]ÚVaØT_œB:žD<—K;šN>¸KFÀSNàDOÜ@KŸD1B/¤>/¤>/©9+¥5'¥7(©;,¬E2¢;(›7 9"©<(­@,¶A0¹D3«.4´7=¿BHÄGM½LN·FH˜A:Š3,{9+x6(~0&3)©.3¸=Bá@RëJ\çE@Õ3.Ï:6Å0,ÄOHÓ^WN=•VEugJl^AdeCpqOƒnO~iJ–dM¢pYÿQ]ÿLXÿ0Q>0:?+6;'4F.AS;YO,aW4d`=ieBouS…c}Œkw†ewiu‹grŠfrŠfvŒfxŽhzhzh€’x†˜~‹‡Ÿ‰“¡™§–š¨›—¥˜’ ‘‰—ˆyŒxpƒofa^wYSnKKfCUVDUVDVWE58/58/6907:1:;3<=5>?7@A9AA9AA9C@9C@9DA:DA:DA:DA:EB;EB;EB;EB;FB9FB9FB9FB9JC9IB8I@7H?6G?4E=2D<1D<1C;0C;0C;0C;0D;2D;2C<2C<2=90=90<8/<8/:7096/85.85.96-96-96-:7.<8->:/A;/B<0D1K=2J<1H<0G;/D:0D:0D<1C;0@<1@<1@<1A=2@=4A>5Q9/J2(Š9?­\bÛTeßXiÛWbËGR“91”:2Œ@0D4±D?»NIÚ>IÕ9D¤I6¢G4¨B3¨B3®>0¯?1°B3³E6¯H5¨A.¢>'¡=&¨;'¨;'«6%ª5$µ8>·:@¶9?µ8>³BD½LN³\U´]V‰G9|:,~0&Œ>4ÂGLÐUZâASÕ4FÜ:5Ï-(Î95Ë62½HAÎYR›\K”UDj\?tfIstRtuS~iJ€kL¤r[µƒlþJVøDPý8Jü7Iÿ7Nÿ:Qÿ4Nÿ-Gÿ;Sÿ5Mþ2Ký1Jÿ/Iþ.Hÿ.Mÿ3Rþ2Sÿ3Tû5Vü6Wö;Z÷<[ò?]ó@^óDcòCbò@dò@dø?hûBkÿEoÿGqþSuýRtôZvïUqÙZoâcxÈmv´Ybn86f0.K8*L9+=B.okHx~\ˆŽlƒ’q|‹jxŽjzly‘mwkwgxŽh”m„™r’¤Š˜ªŸ±›¢´ž¨¶¥¬º©¬º­¨¶©ž¬“¡’€“q„pd}_\uWRmJLgDUVDVWEXYG47.58/58/7:19:2<=5>?7?@8AA9AA9C@9DA:DA:DA:DA:EB;FC2G=1F=.E<-D;,D;,D:.D:.C;.D8,@:.C;.D/J?-K@.M@/M@/M@-M@-N>1N>1K=0J2??3@@4j/)q60½DMØ_hõEYì$±=.¼H9Ý:;Ø56§C3§C3­?2¬>1´>4¹C9»G:¼H;ª?-©>,§<*¥:(¬7&°;*º:-»;.ÌF=ÌF=Ø:9Ó54á27ê;@ëGHîJKÍ@9ÓF?ÕOFØRIäFEÝ?>é19æ.6Ø4(Û7+Ï2)Ô7.¼91¿<4®_PžO@uP6…`F‹hL„aEŸTA°eRÛhaáng÷>Fò9Aá<@ã>BÙJFÛLHÛMKÜNLíNRæGKò9Gñ8Fú1Dú1Dÿ2Hÿ8Nÿ:Vþ9Uü:Uý;Vþ;[ÿ=]þ?aÿ@bÿBkÿBkýBmýBmüCoüCoúCqúCqÿClÿ=fÿFkÿInõHfõHfèZpèZp½Yc›7A]("Z%RB2[K;HM6>C,UH5dWDrkY€ygŠŒ~˜šŒ‘›‡‘†Ž„ˆ•‹Žš‹—‰…Š†™›¥§œ³³§ºº®¿¿·ÁÁ¹ÅÁÀÇÃÂÃÁľ¼¿±³°¤¦£‹—‹y…yh|c^rYRmLNiHQZ?S\AU^C47.47.47.58/891:;3;<4<=5??7@@8B?8C@9DA:EB;FC2G>/G>/F=.F=.F<0E;/D:1=90<8/<8/;60;60:8,:8,;7,<8-?9-A;/C;.D/H?0K@.LA/M@/M@/M@-M@-N>1N>1K=0J2@@4@@4q60‡LFÍT]ÓZcë;Oã3GÖ18É$+¤4&¤4&<"<"«7(³?0Ô12Ñ./Ÿ;+ <,¦8+¦8+°:0·A7ºF9¹E8ª?-ª?-¦;)¡6$ª5$³>-ÄD7ÈH;½7.ÈB9áCBãEDí>Cê;@Ý9:Õ12Ì?8ØKDÝWNÙSJÛ=<Ñ32å-5ì4<Õ1%Þ:.É,#Ó6-¸5-¶3+»l]ºk\\B‚]C|Y=|Y=¨]J¾s`ÛhaÐ]VúAIô;Cá<@ß:>ÑB>ÔEAÝOMæXVíNRæGKò9Gð7Eú1Dø/Bÿ/Eÿ4Jý8Tý8Tû9Tü:Uþ;[ÿ>^ÿBdÿDfûcÿInûNlùLjçYoåWmÛwÃ_i†QKp;5L<,J:*CH1LQ:]P=reR„}k”{›¥§™§œ“’’Ÿ•›¨ž¤°¦£¯¥¡§£©Ÿ´¶«ÁøÉɽÎÎÂÒÒÊÑÑÉÓÏÎÓÏÎÎÌÏÈÆɼ¾»¯±®” ”‹kf`t[UpORmLV_DV_DW`E47.47.47.47.67/7809:2:;3==5>>6A>7B?8DA:EB;FC/E=0D1M=0L:.?;/?=1@>2??3@@4ƒ('¦KJÄPQ´@A»11¼22¹3(¸2'¤4§7™?–<”>—A @!™<œ5,ž7.¤5,£4+­81¶A:µC9²@6®B6­A5§;.£7*¯9/¹C9ÄC=Á@:Ä>#ÇA&ã1%Ý+ûÿ $ÿ%+ÿ'-ó&#ô'$å0%æ1&ä2&ä2&ë/&ë/&Õ6!Õ6!Ð2&Ò4(Á80Ä;3ÀbVØzn£fS’UBK8žZGØ]XÞc^øJSî@IõGIî@BÖC<Ó@9ÁC7ÀB6ÓF?ÝPIöEMñ@Hÿ4Gÿ4Gû5Fù3Dñ9Eö>Jú8Pù7Oû6Rû6Rÿ5Xÿ8[ÿ9cÿ;eÿ=lÿ>mÿ@qÿ@qÿBvÿAuúBvùAuûHföCaúGeþKiýLiÿTqÿ^yûXsòi{òi{Ónv»V^†B?s/,m>6~OGte`‹|wŸ•“¬¢ ®®°µµ·°µ»©®´°·Áµ¼Æ¾ÀÌ¿ÁÍÄÁÌÈÅÐÖÌ×ÞÔßãØÔçÜØèÜÞæÚÜæÖàæÖàßÓÝÙÍ×ÉÄʼ·½ § Š‘Šr„nfxb[tVXqSZiJZiJZiJ47.36-36-36-56.67/780891;;3<<4@=6A>7C@9EB;GD=GD=GD=GD=HE1M=0L:.>:.><0?=1??3@@4‘65º_^ËWX«78³))·--²,!´.#ª:"¯?'¤J(¡G%›E$šD#@!™<Ÿ8/¢;2§8/¦7.¯:3¸C<¶D:±?5¨<0¨<0§;.©=0ºD:ÃMCÄC=¸71½7Å?$ç5)æ4(ÿ"&ÿ"&ÿ &ÿ$ø+(ù,)é4)é4)æ4(ä2&ê.%ê.%Ü=(Ð1Û=1Ò4(Â91Æ=5¤F:Ìnb­p]–YF™UB³o\äidÕZUì>GñCLë=?æ8:Ñ>7Ñ>7½?3¶8,À3,Å81ñ@HíVÿ:Vþ9Uÿ6Yÿ7Zÿ7aÿ8bÿ=lÿ=lÿ=nÿ=ný>rý>rø@tø@töCaÿLjÿSqúGeð?\ÿQnÿhƒÿdëbtêasÕpxØs{ºvsªfcŒ]U…VN|§˜“»±¯Äº¸ÂÂÄÇÇÉÃÈοÄÊÅÌÖÆÍ×ËÍÙÏÑÝÚ×âàÝèêàëìâíïäàòçãóçéïãåïßéîÞèèÜæã×áÏÊн武–vˆri{e_xZ\uWbqRapQ_nO00.11/3315536727838938939:2:;3<>3>@5@B5BD7CE8DF9GI>FH=GH8GH8HJ4IK5LL2MM3ML8IH4ED?GFAJHSKITECX@>SOF7LC4JA2KB3LD7KC6F>3B:/D=5B;3@93?82>95=84;63:52C84C84@85@85;:8<;9<<<<<*³:)°7&²3"²3"Ÿ8'Ÿ8'Ÿ:(¢=+¦A-©D0ªC0¨A.¨=)©>*°;)³>,ÀB3ÄF7Á=0¶2%Ì5*Í6+Ê;+Ì=-Ð<.Ñ=/á6.á6.ñ.,ñ.,ô.+õ/,å8*ä7)Ó>(Ó>(Ü:%Õ3Ì4Ï7"Ä8'À4#Ä@3ÕQDÓHAÙNGñSR÷YXýHMð;@ù4=ÿ:CàDEÞBCÏD?É>9´>2±;/¨?,©@-ÀO?ÄSCÖI@ÒE<é<>ðCEÿXÿD^ÿGkÿBfö=fó:cò>k÷CpùIxüL{ÿMyÿKwïTtìQqÞPhßQiþVwÿf‡ÿZƒÿ@iüTxýUy¹aoÊr€vi`ˆ{rªÀ¦—ÍźÞÖËØÜÛÙÝÜÞÚèàÜêíÓîîÔïøÖïûÙòøâïûåòñíîòîïøõð÷ôïõñîóïìïééêääæàâãÝßÕÑÒÍÉʺº¸¤¤¢‹‰{€yr|qpzo~…sxmu|j//-00.11/3315616727827829:2:;3;=2=?4?A4AC6BD7CE8FH=FH=GH8HI9HJ4JL6LL2MM3KJ6KJ6KJEQPKWU`YWbUShQOdRI:MD5H?0G>/G?2H@3F>3C;0C<4A:2?82>71=84>95<74;63=2.>3/=52>63:97<;9<<<===?@;?@;D@5EA6LA/K@.O?(O?(>@+>@+J91J91N45L23D47C369@96=61D14G48B*8B*OI1`ZB¼K;«:*2  5# ;'8$œ9"¢?(Ÿ;$£?(®?+¯@,µ<+³:)¶7&¶7&¢;*¡:) ;)¢=+¥@,§B.¨A.§@-ª?+¦;'±<*¼G5ÅG8¾@1»7*»7*Í6+Í6+Ê;+Ì=-Ð<.Ñ=/á6.á6.ñ.,ñ.,ô.+ô.+ã6(ã6(Ñ<&Ñ<&Ý;&Ø6!Ñ9$Ô<'Ç;*À4#¿;.ËG:ÐE>ÕJCëMLðRQùDIð;@û6?ÿ=FàDEÞBCÎC>Ç<7³=1¯9-¦=*§>+µD4¿N>ÙLCÖI@é<>ì?AÿQû=WÿB\ÿFjÿCgù@iø?h÷CpûGtûKzüL{ÿLxÿHtêOoîSsí_wðbzýUv÷OpÿBkÿAjíEiêBf¼dr¾ft^QHŒv°–‡Ì²£ÝÕÊìäÙåéèæêééåóçãñùßúûáüÿâûÿåþÿîûÿðýýùúýùúýúõüùôû÷ôøôñöððòììïéëíçéãßàÚÖ×ÇÇŲ²°› ™Ž“Œ†…†…Ž•ƒ‰~†{--+..,/0+12-23.4505606718919:2:<1<>3>@3@B5BD7BD7IG;IG;JH9JH9LJ5MK6NL7NL7KI=NL@SRW_^cggll„ilfiŒ`XmXPeNGWG@PD>JD>JB=C?:@@<=>:;;83:72=90>:1>:.=9-74+85,:7.<90=;/><0>.K?/O?/N>.P=,P=,5?$6@%;<*<=+>:/<8-961850=82@;5R42O1/j"&s+/œ1;«@J¨:) 2!2 £8&¢<&ž8"œ8!¡=&¥;%¨>(²?,´A.¼=,»<+¿:+¿:+¯>.¬;+ª9)ª9)«:*­<,­<*­<*´<+¯7&»=.ÉK<ÌG8»6'½1$Ç;.Ô4(Õ5)Ô8+Õ9,Ù9+Ú:,æ3,æ3,ô.+ô.+ò/)ñ.(á6%ß4#Ï:"Î9!à7$Ý4!Ú9'Þ=+Ò<.Ë5'Å8.Í@6Æ;4Ê?8ØD@àLHèJGäFCçB@éDBÖF>ÔD<ÉC8Ã=2³;-¯7)©:)ª;*®6(¾F8×LE×LEã?@ä@AöAHýHOòAGòAG÷CLüHQþEUù@Pú>WþB[ÿEfÿDeýDmþEnþIvÿKxþM{ýLzÿCuÿDvÿJrÿKsÿYzÿ_€ÿUrïEbøKiÿSqÐEZÑF[ʂ…¿wzUH8‹~n¶Œ€Û±¥òÜÑÿêßöòñúöõ÷ôÿðíøûêýýìÿÿëÿÿîÿÿõÿÿ÷ÿÿýüÿýüÿþùÿýøÿû÷þùõýôõûòóûðôúïóïæçæÝÞÓÏÌÀ¼¹¬¯¦¢¥œ£—£—£«œ¥–š¢“--+--+./*/0+01,23.34.45/7808919;0;=2=?2?A4@B5AC6HF:IG;JH9KI:MK6NL7OM8OM8KI=SQE]\anmryy‘™‚¥}€£}uŠsk€f_o[TdSMYMGSFAGB=CC?@?;<;83961;7.<8/<8,<8,:7.;8/<90>;2><0><0=;.=;.E?1E?1J>.K?/O?/N>.P=,P=,7A&7A&<=+<=+>:/=9.<94<94=82@;5P20M/-n&*|48¢7A¨=G¦8'¤6%¥:(©>,¥?)Ÿ9#9"¡=&¤:$¨>(²?,´A.½>-½>-Â=.Ã>/´C3°?/¬;+«:*«:*¬;+¬;)¬;)³;*µ=,ÀB3ÆH9Ä?0¹4%¿3&È0Ð:,Ë>4ÑD:Á6/Á6/Í95ØD@èJGçIFå@>Ý86Ð@8Ï?7Å?4À:/²:,°8*«<+­>-«3%¹A3ÑF?ÔIBâ>?ä@AøCJÿKRï>Dï>DöBKüHQÿGWüCSû?XýAZþBcÿCdþEnÿIrÿMzÿN{þM{üKyÿBtÿL~ÿT|ÿIqõMnþVwÿVs÷MjòEcõHfË@Uê_tՍPC3]P@¤znЦšîØÍÿêßùõôÿýüþûÿöóþþíÿÿîÿÿíÿÿïÿÿõÿÿöÿÿûúÿûúÿþùÿýøÿû÷þùõÿö÷þõöþó÷þó÷õìíëâãÙÕÒÈÄÁ¸»²²µ¬¯µ©°¶ª¶¾¯¯·¨«³¤10+0/*0/*0/*0/*21,33+44,77/88099/;;1==3??5@@4AA5JD8KE9NG7PI9QJ7RK8QK;QK;NJGXTQcdxwxŒƒ†±Œº‹’É‹’ÉŒ‹Çƒ‚¾yv­nk¢ed[Z†QPpJIiHGYCBT=;*?<+B<$B<$I?&I?&J?+K@,JA2I@1I?5I?5P=7N;5G:4D719:48931>41>46>15=0J2(N6,~43CB¬;A¨7=§<*¨=+©@+«B-¨?*¤;&¥;%¨>(ª7$­:'¸;)º=+Ã9,Ä:-Ê:/Ì<1Ä@4À<0¼8,º6*º6*»7+»7*º6)½5)È@4ÏA5Æ8,Ã/%Æ2(Í6+Í6+á0(â1)á3(â4)è3*è3*ï0(ï0(õ.)õ.)ð/&ï.%Þ4#Ü2!Ì7Ê5×0Ö/Õ2!Ù6%Ö8,×9-Ó?5ØD:ÔE=Î?7Å<2ÊA7ÑMAÕQEËI<¿=0Á=.Á=.¼=,º;*´9)´9)¶<-¸>/¸8-¼<1É>9ÎC>ØBCÜFGéJNðQUì?Cì?CòCJùJQýKYùGUøBXùCYøA_úCaûFiÿLoÿNwÿOxÿMwýJtÿKwÿT€ÿU|ýIpùJkÿStÿVpøNhæG[åFZã[gÿ“Ÿÿ·¹ý™›‘FAt)$©jaӔ‹ñÈÂÿßÙÿóðÿûøÿþÿù÷üûøÿüùÿÿøÿÿùÿÿûþÿûþÿýúÿýúÿüöÿûõÿú÷ÿùöÿ÷øÿö÷ÿôöÿóõüòñòèçäÜÙ×ÏÌÍÊÁÊǾÉ˽Ê̾ÆÐȽǿ·Á¹54/43.21,10+10+10+33+44,66.66.88.::0<<2>>4??3@@4IC7KE9OH8QJ:SL9SL9RL=8:94:8,97+27127157,68-<9(?<+D>&E?'I?&I?&J?+K@,JA2I@1I?5I?5N;5L93F93C60671560-:0-:05=008+F.$S;1ˆ>=‘GF©8>¢17§<*¨=+¨?*©@+¨?*¨?*ª@*¬B,ª7$­:'¸;)º=+Ã9,Ä:-Ê:/Ì<1ÅA5Â>2¿;/½9-¾:.¾:.½9,¼8+Á9-ÍE9ÏA5À2&Á-#Í9/Ó<1Ì5*â1)ã2*â4)ã5*è3*è3*ï0(ï0(õ.)õ.)ð/&ï.%Þ4#Ü2!Ì7Ë6Û4"Ú3!Ö3"Ö3"Ó5)Õ7+Ñ=3Ó?5èYQáRJÒI?ËB8ÊF:ÍI=ÇE8¿=0½9*½9*º;*¸9(´9)¶;+¹?0¼B3ÁA6¾>3Æ;6ÌA<ÙCDÝGHçHLëLPí@Dì?CñBIùJQþLZüJXûE[üF\÷@^ùB`úEhÿJmÿMvÿOxÿNxþKuÿO{ÿO{ÿNuÿLsÿVwÿ\}þTnîD^ôUiïPdðhtÿ’ž÷“•ë‡‰´idœQL­neΏ†è¿¹ÿÜÖÿóðÿùöþüÿüúÿýúÿýúÿÿùÿÿùÿÿúýÿúýÿûøÿûøÿüöÿüöÿüùÿûøÿùúÿö÷þòôýñó÷íìðæååÝÚÞÖÓÙÖÍÜÙÐÜÞÐÞàÒÙãÛÎØÐÄÎÆ::288055-33+22*22*33)33)55+66,77-99/;;1==3>>4??5KA5MC7RF6UI9VK9WL:TJ>TJ>PKQ]X^kl‹‚¡“Í™ŸÙœ¥ðŸ¨óž£ôšŸð—›å“—á‘•ÕŒÐ†‰¾€ƒ¸xz¡np—ccVVrNM_HGYECPB@M<>M:<90=:1C>*D?+CA*CA*AB0BC1?E;>D:;DA;DA=P?BQADS>HQ>HQ=IG3O8(`I9…N:…N:@,‰<(§<(¨=)©>*©>*¬?*®A,±>+°=*³6$¶9'Á7*Â8+Ê6*Ë7+Ò8.Ô:0Ï:3Í81Ì70Ì70Ï81Ï81Î7.Ì5,Ô<1Õ=2Ô7.Í0'Ñ3(Ù;0Û:0Õ4*è0&è0&ì0'í1(ó.(ó.(ö,(õ+'÷.'÷.'í3'ì2&Ü7$Ú5"Ï9!Î8 Ò:%Ñ9$Ï6$Î5#Ñ5(Ó7*Ñ7-Ñ7-ãNGêUNäZPÛQGÉI>ÃC8»C5·?1µ=$µ=$¶<%µ;$¸9&¹:'À>4??5KA5MC7RF6UI9WL:WL:TJ>TJ>PKQ]X^lmŒƒ„£•Ï£Ý¢«ö¦¯úª¯ÿ¥ªû¢¦ðŸ£íŸ£ãœ à˜›Ð”—Ì‘“º‡‰°zz–jj†`_qWVhSQ^PN[KM\GIXDCI?>D>;2=:1A<(B=)CA*CA*AB0BC1?E;>D:;DA;DACBTHGYORaX[jZdm[enZfdYec\^SPRGbK;r[KYE‡P<@,ŽA-«@,«@,«@,«@,¯B-°C.°=*¬9&µ8&·:(Â8+Ã9,Ë7+Ì8,Ó9/Õ;1Î92Í81Í81Î92Ò;4Ò;4Ð90Î7.ÛC8Ñ9.Ï2)Ô7.Û=2Û=2Ú9/Ø7-è0&é1'í1(í1(ó.(ó.(ö,(õ+'÷.'÷.'í3'ì2&Ý8%Û6#Ð:"Ï9!Ï7"Ï7"Ï6$Î5#Ò6)Ô8+Ñ7-Î4*É4-âMFðf\ëaWÐPEÁA6µ=/²:,¶>%¶>%·=&¶<%¸9&¹:'À2@>2><0<:.:8,86*74+63*52)52)52)74+96-=:1@=4B?6I?3LB6RF6TH8VI8WJ9YMA[OCPIPXQXddˆ}}¡‰’Ó–Ÿàš©ü¡°ÿ¨´þ¨´þª´ü©³û©²÷¦¯ô§¬î¥ªìŸ¡Þ—™ÖŒÅ~·sp¥gd™\ZŒUS…YPYPVOqMFhC?N=9H<<:??=F;9B?:C@=FKAJO:YxJiˆ^qbu“xrŒ}w‘Ži{‚]ošR]šR]­PK®QL±G7¦<,£7¤8©<(ª=)­>*¯@,´?-´?-¹<*¸;)½5'¾6(Ç5(É7*Ò5,Õ8/Ú7.Û8/Ø61Ú83Ú83Ù72Ù6/Ø5.Û81Ý:3çC:à<3Ù6-â?6ý[Pÿmbÿ]RãA6è0&ê2(ó0*ò/)ö)&ô'$ø(&ú*(ô/)ô/)è3(å0%Õ2#Ó0!Ñ6$Ô9'Å=%Æ>&Ê<&Ë='Ð:)Ð:)Ñ7+Ñ7+Ú@6Ð6,ÜGA÷b\äWPÍ@9Æ?9¹2,µ;#¶<$º<%º<%½:(¾;)Ã;-Å=/Æ=3ÌC9ÕPIÝXQÐQJ¿@9½@:ÈKEáGEàFDåKKëQQîRVëOSìLVîNX÷RcõPaôLeóKdúMkÿRpÿStÿQrïYvîXuöWsú[wÿ[tÿYrÿWjþUhÿcqýWeÿ\kÿ[jôEVóDUÿOeÿLb³ph¬iaƑ‹é´®óÔÑÿèåøðíýõòõþûùÿÿ÷ÿÿõÿýûýúýÿüÿûøûöóýúóþûôÿøõþöóÿ÷õÿöôöèçæØ×ãÕÒÞÐÍàÖÌðæÜüõãþ÷åÿýèÿÿì÷ÿýçðíØáÞB@4A?3?=1><0<:.:8,85,74+52)52)52)74+96-<90?<3A>5H>2KA5QE5SG7UH7VI8XL@YMARKRXQXbb†zzž†Ð“œÝ˜§úŸ®ÿ©µÿª¶ÿ­·ÿ®¸ÿ®·ü­¶û¯´ö®³õ¨ªç¡£à—˜Ð‹ŒÄ~³ur§ig™b`’`W†`W†]VxVOqNJYFBQBB@AA?;>3@C8AI>?G<9B?4í5+ì)#ì)#ù,)ý0-ü,*ø(&ö1+÷2,ì7,é4)Ù6'Õ2#Ð5#Ñ6$Ä<$Å=%É;%É;%Î8'Í7&Î4(Î4(Ó9/Ï5+Ò=7åPJãVOÚMFÉB<¶/)·=%·=%»=&º<%½:(½:(Á9+Â:,Æ=3ËB8ÓNGÜWPÑRKÂC<¾A;ÆICâHFáGEåKKìRRîRVëOSìLVíMWùTeùTeúRkúRkþQoÿSqÿRsÿRsèRoîXuü]yÿa}ÿ[týUnûReûReüVdøR`ÿYhÿYhúK\ÿPaÿRhüE[ªg_ZRµ€zܧ¡éÊÇþßÜóëèýõòôýúøÿþ÷ÿÿõÿýûýúýÿüÿüùýøõüùòýúóÿ÷ôþöóÿ÷õÿöô÷éèéÛÚäÖÓÝÏÌÞÔÊïåÛüõãÿùçÿýèÿÿìöÿüçðíÙâßEA5D@4C?3A=1?;/=9-;7,;7,73(73(73*84+:6-<8/?:4@;5E>4HA7NE6PG8SF3UH5WJ:YLP86;?=BO?@O?@W:>`CGwRY‡bi§iš±s¤¾w£¼u¡Ém”Çk’ÕZyÊOnÓ?UÙE[ÝDIÐ7<½5'½5'µ="³; ®;(®;(²:)³;*¸;)º=+À;,Á<-Å6(È9+Ô:0Ù?5á>5á>5â;3à91Û81Ø5.Ø3-Þ93èA9ìE=éB:ã<4â;2Û4+×5(Ù7*Ò2$Ë+Ò6'åI:õK<íC4î3,ê/(ø**ú,,û*-ù(+ë+(í-*ã5.â4-Ù5+Ö2(Ô2'Ô2'Ê9&Ê9&Ì9'Î;)Ñ:)Ñ:)Ô8+Ô8+Ð4(Ø<0Ó:4Ô;5æNMïWVÙEEÄ00À;(À;(¿:'¿:'Á9)À8(À8*¿7)Ä>2Æ@4ÎL?×UHÏSGÃG;¾D7ÂH;ØKB×JAÛNGáTMãUSßQOßNQàORðXdó[gú[mú[müVnøRjúPküRmÿCkÿLtÿZyÿYxÿXoýTkúWhþ[løZh÷Ygôblò`jácgèjnÜnmÊ\[ŒfYwQD•of¿™Ùº·ñÒÏïáàÿóòöû÷úÿûöÿþõÿýüþýþÿÿÿûþÿ÷úùúòùúòûøñüùòÿùöÿøõøïêíäßåÛÒÛÑÈÛÔÄìåÕü÷áÿüæÿþåÿÿçöýöéðéÝäÝHD8GC7FB6D@4B>2@<0?;0>:/:6+95*84+95,:6-<8/>93?:4D=3G@6LC4NE6RE2SF3UH8WJ:VMPXOR[ZypoŽ|„ÂŒ”Ò‘¡ï™©÷¦°õ¨²÷«µú­·ü°¹þ°¹þ±¸ÿ±¸ÿ®²ûª®÷¤¦ðŸé–•áŒ‹×‚Ì|yÆwl°pe©g_˜aY’XX|PPtFGY>?Q:8=?=BO?@TDEdGKqTXˆcj•pw®p¡³u¦¼u¡¶o›¿cŠ¸\ƒÅJiº?^Æ2HÔ@VÞEJÓ:?Â:,Æ>0ºB'±9ª7$ª7$­5$®6%µ8&¸;)À;,Â=.ÐA3ÑB4Ù?5Ú@6ß<3Ü90Ü5-Ú3+Ò/(Ð-&Ó.(Ø3-à91â;3ß80Û4,Ü5,Ñ*!Ì*Ø6)áA3Ý=/Ð4%É-íC4óI:ÿE>ø=6÷))ñ##ö%(ý,/î.+î.+á3,ß1*Ö2(Ô0&Ò0%Ò0%Ì;(Í<)Ð=+Ò?-×@/ØA0Û?2Û?2Ñ5)èL@ãJDÎ5/ßGFòZYÞJJÕAAÂ=*Á<)À;(¿:'Â:*Á9)À8*¿7)Á;/Â<0ÈF9ÐNAËOCÃG;½C6½C6ÓF=ÒE<ÖIBÝPIÞPNÛMKÚILÜKNíUaó[gþ_qÿ`rýWoôNfõKfùOjÿLtÿPxÿVuÿQpýTkÿXoÿbsÿfwÿesþ`nôblóakãeiâdhÒdcÊ\[‡aTkE8‚\S­‡~Ê«¨æÇÄéÛÚÿñðôùõøýùõÿýôÿüüþýþÿÿÿüÿÿùüúûóúûóüùòýúóÿûøÿûøþõð÷îéêà×ÞÔËÜÕÅìåÕýøâÿþèÿþåÿÿæôûôéðéßæßKH7JG6IF7GD5EB3C@1B>2A=1<8-<8-;7.:6-;60<71>93?:4A>5DA8JD4LF6PE/QF0VG2WH3XMIXMIXVlnl‚zµ‹’ƐŸä˜§ì§­÷¨®øª°ú¬²ü®´þ®´þ¯³ý¯³ýª®ø¨¬ö£§ñŸ£í™ç‘•ß‰×ƒ‡Ñ€Æxw½imª`d¡[a‘TZŠTQpLIh^CV^CVz-Ä?0ÇB3ÑC5ÓE7ÚC8ÙB7Û=2Ù;0Ú6-Ø4+Ù2)Ù2)Ó2(Õ4*Ù6-Û8/Ü8.Û7-Ü5,Ü5,Ò0#Ø6)Õ8)Ï2#Ê3 Ñ:'Ñ>*Ï<(Ô=,ßH7÷I@öH?ü46ó+-ô),ø-0ñ86î53Þ50Ú1,Õ0,Õ0,Ú.,Û/-è50è50å9/æ:0â<.â<.Û>/Û>/Ï7*ïWJöaZÐ;4Ï;9äPNÛFHäOQÏ<2Ë8.Ç7,Æ6+Ä:-Å;.À<-¾:+º;*»<+¿B0ÅH6ÆI7ÂE3½@.¼?-ÇG:ÆF9ÊJ?ÑQFÓRLÐOIÑMKÓOMæ[`ë`eüfrÿiuü]oïPbòLbøRhÿSwÿQuýWoùSkëblôkuõnuðipøfqñ_jçajîhqÐxvÁig˜m]™n^pnYPN9jXL~r¼žœÞÀ¾ëÕ×ÿëíúöõþúùùÿÿøþþýýÿÿÿÿÿúÿÿ÷ÿûÿ÷øþôùüóüÿöÿÿøÿÿøÿúòÿøððèÝãÛÐßÚÇîéÖýûâÿÿæÿÿáÿÿáõùëíñãæêÜNK:NK:LI:JG8HE6FC4EA5D@4@<1?;0=90<8/<71=82>93?:4B?6DA8JD4LF6PE/PE/UF1WH3WLHVKGVTjkiy€´Š‘ŏžã–¥ê¦¬ö§­÷©¯ù«±û¬²ü«±û­±û¬°ú¨¬ö¦ªô£§ñ¡¥ïž¢ìšžè•™ã‘•ß’‘׉ˆÎ{¼sw´nt¤ioŸkh‡da€z_rv[nŽP[“U`·S[¾ZbÎRZËOWé;\ê<]àBYßAXÕAOÐ3Ó<1Õ7,Ó5*Ö2)×3*Û4+Ü5,Ù8.Ü;1ß<3ß<3Ü8.Ù5+Û4+Ü5,Ñ/"Ü:-Ú=.Î1"Å.Î7$Ð=)Ì9%Ï8'Ñ:)å7.î@7ÿ=?ÿ<>þ36ö+.æ-+ã*(Ô+&Ô+&Õ0,Ú51ä86æ:8ì94ì94ç;1å9/Þ8*Ü6(Ó6'Ò5&Í5(çOBÿkdÛF?È42ÖB@Ó>@êUWÖC9Ð=3È8-Æ6+Ä:-Æ,º=+ÃC6ÃC6ÈH=ÏODÒQKÐOIÑMKÓOMé^cíbgýgsÿnzÿcuôUgöPfüVlÿRvÿPtýWoþXpõlvüs}ñjqßX_ò`kò`kéclõox㋉Õ}{¢wg uepnYPN9eSGƒqe±“‘ܾ¼ëÕ×ýçéúöõþúùùÿÿøþþýýÿÿÿÿÿúÿÿ÷ÿüÿøùÿõúýôýÿ÷ÿÿøÿÿøÿýõÿþöùñæíåÚèãÐôïÜþüãÿþåþÿàÿÿâ÷ûíðôæíñãQN=PM3@<3>:1>93>93?:4@;5?@:BC=IF7JG8PE/PE/UF/WH1UKASI?TR`kiwz­‹’¾Ú•£à¥¦ù¦§ú¨©üª«þ¬­ý¬­ý«®ûª­ú§«ô¥©ò¡¨ì §ë ¨éŸ§èœ¥æš£ä•žß™Ú‰•Ñ„Ì½}‰¹…£{Ÿ–i€’e|·Q_¸R`âENãFOø9@õ6=è?,è?,ÖI-ÖI-ÅN,ÁJ(¾G)¼E'âUDÙL;Û96×52Û57Ý79Õ6:Ð15»<+»<+¾:+¾:+Ã7*Â6)Å3&Ä2%Î4(Î4(Ó2(Ó2(×3)Ø4*Ú6,Û7-Ü>3Û=2Û;/Ú:.Ú8-Ø6+×5(Õ3&Ô4&Ó3%Í4"Ï6$Î=(Ð?*Æ:!¾2Å:'Ã8%Ö/&ß8/ü:;ÿ?@ÿ8=ø16æ/1â+-Ô/-Õ0.Ü44á99é9<ê:=þ-2þ-2õ/.ô.-ä2(á/%Ó3#Ñ1!Å4#Ï>-økaâUKÆ84ÏA=Ê;=áRTæIDÞA<Ð92Ë4-Å8.Ç:0À>.¾<,·<*º?-»A,¹?*º;(º;(½<'¾=(¹?0¹?0¾D7ÆL?ÊPEÉODÊMGÌOIæabçbc÷gpÿpyÿhxö[köUgü[mù]rù]rÝhnálr܃}匆ãzwÍdaôfrünzñdtôgw얗ôžŸ·šŠ¦‰y[rV?V:XUFnk\¥‹ŠÙ¿¾ðÖÙûáäÿôøÿøüýþÿûüÿþûÿÿýÿÿùÿÿõÿùÿøõÿô÷ýóúÿöÿÿøüýõÿýôÿÿöþúîóïãïíØøöáþþâýýáýþÞÿÿâýþîøùéö÷çRO>QN=PMSQ_jhvz­Œ“¿Ú•£àŸ ó¡¢õ¤¥ø¦§ú¨©ù©ªú©¬ù¨«ø¦ªó¤¨ñ §ë §ë¡©ê¢ªë¡ªë ©ê— á–Ÿà” Ü’žÚ‘Í™É–´’Œ°—j•h»Uc¸R`Ý@IÝ@Iõ6=õ6=êA.è?,ÕH,ÕH,ÃL*¿H&»D&»D&áTCÕH7Ü:7á?<éCEæ@BØ9=Ò37ÅF5ÅF5ÇC4ÅA2É=0Å9,Å3&Ã1$Ê0$Ë1%Ò1'Õ4*Ø4*Ù5+Ù5+Ù5+áC8Û=2×7+×7+Û9.Ü:/Ø6)Ó1$Ø8*Ð0"Ê1Ð7%Ë:%Å4Æ:!ÐD+Ã8%Æ;(Û4+Ü5,ð./ô23ý6;ÿ;@ÿKMýFHêECæA?å==â::â25Þ.1ù(-ù(-ó-,ó-,å3)ä2(×7'Ö6&Ã2!¿.ñdZê]SÎ@<ÓEAÉ:<ÝNPîQLãFAÓ<5Ì5.Ä7-Æ9/¾<,½;+¸=+¼A/¼B-¸>)·8%·8%½<'¿>)²8)²8)¸>1ÁG:ÅK@ÄJ?ÅHBÈKEä_`ä_`óclþnwÿgwö[köUgü[mù]rú^sÞioàkqޅ쓍ð‡„ßvsünzÿz†ðcsâUe搑ÿ°±Í° ¯’‚WnR>U9URCgdUŸ…„Ù¿¾ñ×ÚøÞáÿõùÿùýýþÿûüÿþûÿÿýÿÿøÿÿôÿùÿøôþóõûñùÿõýþöúûóÿüóÿÿöÿÿóùõéõóÞüúåÿÿãüüàýþÞÿÿâÿÿñüýíüýíXO@WN?VM>UL=TK/G>/H?0CC9DD:IF5KH7QI2RJ3SK4SK4UNFTMEVUgji{y}­ŠŽ¾˜Û–Ÿâ¦¢÷¥¡ö¡¢þ¡¢þž¤ÿ ¦ÿŸ«ÿ ¬ÿŸ¬òªð¢§ç£¨è­§ï¯©ñ³¦ø²¥÷—¬ÿ’§ú’¢Ý Û¯ ¿¯ ¿Î|Š¹guÜ?HÜ?Hô5=ô5=é;=é;=ÔE?ÔE?â;Cá:BÙEEÌ88ÊC?ÊC?¾/+ÚKGìFJéCGî;Aì9?ä;>ã:=Ö>;Ô<9ÌA:È=6ÈC:ÑLCÉK=»=/³8)¶;,º8*»9+Å5,Å5,Ð.)Ò0+Ü0.ß31åB1Ý:)Ü1 Þ3"å8'è;*Ý8$Ö1Ë5Ê4Ä6Ä6Ç4$È5%Î4(Ï5)Í/&Ï1(Í7)Î8*Ê9&Ê9&Ò7#Ó8$à2'ã5*ï31î20í,1ë*/é,3ë.5ö.1ó+.ë.*ì/+å7,ä6+Õ8%Ñ4!À/Ã2æYHè[JÊ<2ÝOEÄ3.ÙHCÝQP×KJÑC?Ê<8Ç7.Æ6-È9)Ê;+Ç<)Å:'¾:%½9$¹<(º=)µ>*´=)±9+´<.¸>/¹?0½?0½?0Â@2ÃA3ïk_ôpdèc\óng÷qnèb_ðjiútsÿmzúhuðelìahòadøgjñpkñpkúxvÿÿTkÿ\sÙerÿŸ¬’»›n—w]sLF\5MQ6lpU¥•ˆÈ¸«êÕÒÿîëÿ÷÷ÿööúøùüúûûÿÿüÿÿûÿÿúþÿåÿïßÿéãüçéÿíøÿôøÿôþÿñýþðÿüìÿûëÿùèÿ÷æþøâþøâýùàþúáüþûþÿýþÿýXO@XO@WN?VM>TKÇ<5Â=4ÌG>ËM?ÁC5¶;,´9*¹7)º8*Å5,Æ6-Ó1,Õ3.à42ä86â?.Þ;*à5$à5$â5$â5$Ú5!×2Ï9 Î8Æ8 Ç9!Í:*Í:*Ï5)Í3'Ò4+Ó5,Ï9+Í7)Ç6#Æ5"Í2Ï4 Ý/$Þ0%é-+é-+ë*/ë*/é,3ê-4ð(+ò*-ì/+ì/+á3(à2'Ô7$Ô7$Ñ@+º)ÒE4Í@/ÕG=çYOÔC>ÔC>âVUÞRQÙKGÑC?Í=4É90Ç8(Ç8(Ç<)Å:'¿;&¿;&»>*¼?+·@,¶?+±9+³;-·=.¸>/»=.¼>/Â@2ÄB4ìh\ònbæaZðkdõolça^ðjiûutÿp}ÿn{õjqê_fêY\ñ`córmûzuøvtý{yýOfÿVm×cpÿš§‹´”eŽn]sLKa:SWUL=TK?â>?ãÇC>À<7Ã83åZUâ?Bâ?Bç:>ä7;Ø88Õ55Ê;3Ë<4ÒH>Å;1»7*ÅA4ÊL=ÅG8»>,µ8&¹5&»7(È6)Ê8+×4-Ú70æ95é<8Ó5)Ô6*Ù5+Ú6,Ú6*Ú6*Õ<*Ö=+¾7!¼5´7!µ8"¸:+¸:+¹5)¶2&è<8ç;7Ü>2×9-É;'Æ8$Æ8 Ç9!Ð7%Î5#Ô0$Ô0$×0*Ø1+Õ2-Ô1,Ö/'Ú3+Ù9-Ø8,Î7$Ì5"Ë:%Ï>)ÑC/À2çSEÏ;-Ü?:ßB=ëHIõRSêVTçSQãPIÜIBÖC9Ï<2È9)Å6&Á8&À7%º9&º9&¶=*·>+²?-°=+¬;-®=/±=.±=.µ=-·?/½B3ÀE6Ú\Pæh\âa[îmgôpnåa_êehñloâQ^î]jôipñfmò_eöci÷soýyuùstørsûE^ÿMfÛ^nÿŽž‡¨‰^`VoEMfVM>UL=SJ;RI:QH9PG8OF7OF7PG8PG8IG;JHâ@>ã?@ã?@ä=Dä=Dà?DØ7<Ï?>ÓCBÅA<º61Ç<7æ[Vâ?Bâ?Bé<@æ9=Ù99×77Ì=5Î?7ÎD:Â8.¸4'¿;.ÄF7ÃE6»>,¶9'»7(¾:+Ë9,Í;.Ú70Ý:3ç:6ê=9Ò4(Ó5)Ø4*Ú6,Û7+Û7+Õ<*Õ<*Â;%Â;%»>(»>(º<-»=.Á=1Ã?3îB>ì@<ßA5Ù;/Ê<(Ç9%Ç9!É;#Ó:(Ï6$Ò."Ò."×0*Ø1+Ó0+Ñ.)×0(Ø1)Õ5)Ô4(Ì5"Ì5"Ë:%Î=(Ê<(Ì>*ñ]OÜH:Ð3.Î1,ã@AùVWÿvtÿrpÿleó`YäQGÔA7Ä5%½.Â9'À7%º9&º9&µ<)¶=*±>,¯<*¬;-­<.°<-¯;,³;+¶>.¼A2ÀE6ËMAÞ`Tâa[ñpj÷sqä`^â]`ã^aØGTèWdóhoóho÷djüioùuqûwsørsðjkö@YüF_Ú]mÿ†–¢ƒYz[RkAPi?_fEv}\²§•æÛÉÿóëÿ÷ïÿûõÿûõúÿøüÿúùÿû÷ÿùòüôîøðÖûÜÍòÓÌêÎÍëÏÚìÔÝï×ëðÜñöâöóàùöãüóâôëÚêâÏæÞËëãÐñéÖùöñûøóýúõ\P@[O?[O?ZN>YM=YM=XLÏHD»A6¯5*ÇB;ÜWPÝCAÝCAâ?@à=>Õ@:Õ@:ÉG:ÊH;Æ+¿>+½<'¼;&Ã:(Å<*Ñ;,Ò<-Þ7.ß8/æ81è:3é77æ44æ0/ç10ê20é1/Ý2+Ø-&Ë1)Î4,È91Å6.Â00Ä22Ï9;×ACõ47ó25â7/Ý2*È7$Æ5"À:!Â<#È=&Å:#È5#Ê7%Ñ9+Ó;-Ñ;-Ï9+ÈA.Ä=*¿:'¾9&À<'Â>)Å='Ä<&Ï>-Ë:)Ú<1àB7Ù-+å97ã/2æ25Ó61Ø;6ÞD<åKCéQFëSHåVFäUEÈ@0Å=-»>,¹<*³@.³@.¯@/®?.¨=-©>.«=,ª<+«<+®?.µA2¹E6ÅLAÛbWàc]ípjóqsâ`bå_få_föjuûozôkré`gñ^dþkqÿyyÿzzýlsñ`gü;Xÿ>[àYjÿz‹‹ i~_XvDZxFhwN|‹b´°•æâÇÿúçÿüéýÿïýÿï÷ÿó÷ÿóñÿðêýéáòßÛìÙÁìÁºåº¹ß¶»á¸Åà½ÉäÁØçÊÞíÐìîØðòÜøñßòëÙìÞÑçÙÌìÛÑñàÖñçÞòèßóéà[O?[O?ZN>ZN>YM=YM=YM=XLRK9TM;XM7XM7XM7XM7TLAUMBVS\c`ijkŠst“y}¬‚†µ…‰¶†Š·ˆŠÃ‹ÆŠÒŒÔ‹ÔŒ‘ÕŒ•Ð‡Ë€Š½yƒ¶s|³mv­go­ck©€l‡k†´Vz¶X|ì=dç8_ö5Jø7LæDBæDBÖLAÖLAáEFáEFö:Kö:KÞEGÙ@BÉB>ÏHD·=2®4)ÌG@ÑLEÚ@>Ø><Ý:;Ý:;ÖA;×B<ËI<ÊH;À6)Á7*¾9(½8'º9&º9&¼;&¾=(Ä;)Æ=+Ò<-Ó=.Ý6-Ý6-ã5.å70å33ã11å/.è21ï75ð86å:3à5.Í3+Ð6.Ê;3Ç80Ä22Æ44Ñ;=ÙCEð/2ð/2à5-Ý2*É8%È7$Â<#Ä>%Ã8!Ä9"Ë8&Ï<*Ö>0ÙA3ÙC5ØB4ÏH5ÉB/À;(¾9&À<'Â>)Ä<&Â:$Ì;*Ê9(Í/$ãE:Ü0.ì@>ã/2Ü(+Ð3.Ò50Ò80Ó91Ñ9.Í5*Â3#¿0 ÌD4È@0º=+¶9'­:(­:(ª;*©:)¨=-©>.«=,«=,«<+¬=,²>/µA2ËRGßf[àc]èkeïmoåceïipônuûozþr}ömtìcj÷djÿrxÿzzýssúipí\cþ=Zü;XÝVgùrƒ¤…xnlŠXm‹Yz‰`Š™p¸´™àÜÁùòßþ÷äÿÿñÿÿñõÿññÿíçúæÜïÛÑâÏÉÚÇ­Ø­¨Ó¨ªÐ§­Óª¸Ó°»Ö³ÊÙ¼ÑàÃâäÎçéÓòëÙñêØïáÔéÛÎêÙÏëÚÐæÜÓäÚÑâØÏZN>ZN>YM=YM=YM=XLÿ5Bï@;ï@;ÜIAÜIAãDHãDHõ:Mõ:MÕFBÕFBÃD;ÇH?°ÌG8½?1¶8*¬6(¬6(©8*©8*«;-¬<.­>-­>-«<+ª;*¬=,­>-ÀKAØcYÝc^ælgîpsçilôqyúwígpöpy÷qxñkrÿktÿvÿu|ùhoüblðV`ÿ=]ÿ6VáPaøgxœ§‡›{z›dx™b‚•g r­±ŽÈÌ©ÝàÃçêÍéøÙäóÔÕðÏÌçÆÂ༹׳³Íª­Ç¤”ÅŽ’ÃŒ˜ÄžÊ•§Ë›©ÍµÎ¤»ÔªÎÙ¹Ôß¿åãÎéçÒîàÕéÛÐçÒÍäÏÊÝÏÄÙËÀÕǼYM=YM=YM=XLUL;VMÔEAÁB9ÅF=®:-¯;.ÒTH¿A5Ë62Ä/+Ä)%È-)É<3ÎA8¾E4¹@/Â;(Ã<)À;(¿:'¾<&À>(À<'½9$Ä6"Æ8$Ó8&Õ:(ß5(ß5(å3)æ4*ù14þ69ÿ7<ÿ5:ÿ,3þ'.û(.ý*0÷.4ó*0í(1ð+4û.?û.?ø":ð2ò#+ô%-ç/-æ.,Ó5*Ñ3(Ê7'Ë8(Ï7)Õ=/ã?5ä@6å=4â:1ã80ã80ÓN=ÑL;ÏG7Ç?/À7%¾5#Ä7&É<+Í5(Ð8+çB<Ý82à00Ïî79é24Ó2(Ó2(Ñ3(Ñ3(Í5(Í5(Æ7)Å6(ßZK×RCÇI;½?1³=/²<.¯>0°?1«;-¬<.®?.­>-«<+ª;*ª;*ª;*°;1ÏZPÛa\êpkôvyëmpôqyõrzÿy‚ÿˆÿy€ðjqúdmÿpyÿu|þmtø^hîT^ÿ>^þ5UÞM^óbs «‹›¦† iz›d‚•gŠo¢¦ƒ´¸•ÈË®ÕØ»ÊÙºÃÒ³°Ëª¦Á »—˜¶’—±Ž”®‹…¶…¶¹„”À‹Á‘žÂ’ªÃ™°ÉŸÁ̬ÈÓ³ÛÙÄâàËëÝÒå×ÌáÌÇÛÆÁÑø˽²Å·¬ZMYM?ZM2­>-­>-ÁC7ÍOCÊ5/Ñ<6Î1,Î1,ÑD:Ê=3°7&¸?.¼5!À9%Ã<(Á:&À9%À9%Å:%Æ;&Î9%Ï:&×5&Ô2#Ú-Þ1#ì6+ô>3ó8/ñ6-÷0)ô-&û'$ú&#ü$%ü$%ü%*ø!&ü ,ÿ'3ÿ%;ÿ!7ÿ4ÿ1ú*7ñ!.â#*ç(/Û-.Ö()Õ,)Ý41è21ê43õ34õ34÷/1ô,.ò*,ð(*Ø;2Ô7.Ô70îQJ¼"Ä*"áD=Ê-&Ì-'Ü=7çD=ß<5Ö/)Ö/)á6/æ;4Ø@2Ô<.Ì6(É3%É7*Í;.È-°:.¹C7Ö\Wêpkðswôw{úx‚óq{þ|„úx€÷tzøu{ÿr}ÿr}ÿmxþhsý_mëM[ÿ9[ÿ8ZÛDUîWh›¢€—ž|} fx›a~”c‚˜g”Ÿuœ§}©ƒ›§¦~‰¢z}¡sxœnvœkxžm¡o‚¤r¯qƒ³u‰¹{½’¾ƒ”À…œ¿‰ÀŠ¦»’ª¿–¾Â©Ë϶ßÓÇßÓÇÞÆÄÕ½»É¼¶¿²¬¸«¥YL;YL;YL;YL;YL;YL;YL;YL;WJ9XK:XK:XK:YL;YL;YL;ZMYM?ZM8ñ:6ö?;õ<:ô;9ïàF>Ë1)Ï2+À#Ó4.Þ?9çD=à=6Ù2,Ø1+à5.â70Ò:,Ï7)Ë5'Ê4&Ê8+Í;.Èô<>û7Aü8BìAGé>DÐDCÌ@?»=1¸:.¬;+«:*¨9(©:)¾>1ÉI<ÜA<Õ:5Ú64Ý97ÙE;áMCÊK:³4#À9&À9&Â;(Å>+É>+È=*Ë:)Ê9(Ò6'Î2#Ö.!Ý5(î<2ò@6ñ91ê2*×8%×8%Þ3"Þ3"è-$é.%ì,'í-(î.-ê*)ï'1ò*4ú%9õ 4ú3ù2ë(6ñ.<ï7Að8Bíâ-6ó/;ó/;ö-7ö-7ô-2õ.3ñ10ñ10Ö1-á<8Ú53à;9ÿkjåA@Ñ/-Ð.,Ù:6Þ?;ßB;Ù<5Ò8,Ð6*Ð7)Ï6(À9%¿8$¿7'Á9)Á<-Â=.Ä;1Ä;1ê`VÞTJÊ:2À0(Í81Ò=6Ò91Ô;3Ý:3Ý:3Ø;2Ö90Ê;-Æ7)»7(¹5&·;/¼@4ÏTMãhaëoqöz|ÿ€‡ú{‚û|ƒùzûx€ûx€ÿrÿn{þfsø`müYjíJ[ÿ7Wÿ9YâKZèQ`‚ey„\e†Od…NmƒRq‡V{ˆ\{ˆ\t…[pW^{Ma~P^†ReYl•]sœdz g}£j­n„°q‡µtŠ¸w‰ºxŠ»yŽº{»|’°|®zœ§…¤¯º³¡Â»©Ë¸²É¶°²­±¦¡¥œ—›YL;YL;YL;YL;YL;YL;YL;YL;WJ9XK:XK:XK:YL;YL;YL;ZM<[K<\L=\L<\L<]N;]N;[O9\P:^Q@]P?[OAZN@XMGYNHZOMZOM\Ph`TlaY‚f^‡mh¢zu¯ƒz¹ƒz¹šƒ¹†¼¯€¬¬}©Äy¢Äy¢Ãf’±T€ÜGCÙD@ËG:ÊF9ÈI8ÈI8ÙB7ÚC8ô<>õ=?ý9Cþ:DíBHé>DÎBAÉ=<½?3¸:.¬;+«:*©:)ª;*½=0ÆF9Ö;6Ð50ß;9åA?ÛG=èTJØYH»<+Á:'¾7$¾7$Ã<)É>+È=*Ë:)Ë:)Ï3$Î2#Ù1$á9,ñ?5ñ?5í5-å-%Ø9&Ø9&ß4#ß4#è-$è-$ë+&ë+&ê*)è('í%/ò*4ú%9÷"6ÿ9ÿ <ú7Eè%3ç/9ÿOYÿakÿPZò=Fï:Cì(4î*6õ,6ø/9ö/4ò+0è('ã#"Õ0,Ú51Õ0.æA?ÿqpøTSÞ<:èFDÛ<8Ú;7Ö92Ô70Ñ7+Ð6*Í4&É0"¼5!¼5!¾6&Á9)À;,¿:+Â9/Ä;1ãYOØNDÈ80Â2*Ò=6ØC<Ö=5×>6â?8ã@9ßB9Ý@7ÑB4Í>0Á=.¾:+¶:.¸<0ÊOHßd]ëoqø|~ÿƒŠü}„÷x÷xûx€ýz‚ÿrÿmzýer÷_l÷TeëHYÿ4Tÿ7WãL[áJYozRfqIVw@XyBcyHiNs€Tu‚Vq‚Xo€Vj‡Yn‹]m•atœh{¤l¨pƒ©p„ªq‚®o„°q‡µtˆ¶u†·u†·u‹·xŒ¸y“±}Ž¬x• ~™¤‚¯¨–»´¢Èµ¯É¶°°«¯¢¡—’–ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8YJ7ZK8ZK8ZK8[L9[L9[L9\M:]J;^K<]L:]L:]N;]N;]N9^O:\O<[N;[N;[N;^N>_O?_O@`PAbNZeQ]aTnfYsheur~x¤}w£š|ž¦ˆªÎ†œÌ„šèq…âkéTjÚE[ÿ;Nÿ>QïJPèCIÌG@ÉD=ÏD=ÒG@êBBëCCô?FöAHæHGáCBÈE;Â?5ºB4µ=/«<+ª;*©:'©:'¾8-Æ@5æB@à<:î@?í?>Ü:5éGBåYLÖJ=ÆA0½8'º2"¿7'È;*È;*Í7)Î8*Ð0$Ô4(â5.è;4ð93í60ë.*ç*&á/-â0.ë/0í12ô/6ö18ö3;÷4<è-8è-8é.?ì1Bò-Ið+Gù+Oÿ2Vë=Gâ4>ìBMÿalÿlyÿYfôCSñ@Pë5Dê4Cæ7>æ7>Ø=8Ô94Â9)½4$Ç4*Â/%Ì91î[Só^ZîYUØC?ÞIEÙD@Ñ<8Ë7-Ë7-Ì:+Ì:+È7$Å4!®<$­;#°;'´?+µ;,²8)»8.Â?5ÜMEÖG?Ñ4/Î1,ä;4è?8ç60ç60ó-.ô./í4/í4/á90ß7.Î:,Ì8*¼6*¼6*ÈIBÞ_Xênlù}{ÿ†ˆûóv|õx~úx€üz‚ÿq€ÿl{üds÷_nóRdëJ\ÿ4Tÿ8XãQ\ÙGR^nAWg:Vr?ZvCfzIkNtVw„YwŠ]yŒ_t–dw™gv¡i{¦n«n€¬o„ªm„ªm†¬oˆ®q‡´sˆµt„¶o…·p†¸sˆºuŽ¶zˆ°tŽ£x’§|¬¬”»»£ÎÀµÒŶºÆ§«·˜œ¨ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8YJ7ZK8ZK8ZK8[L9[L9[L9\M:]J;^K<]L:]L:]N;]N;]N9^O:ZM:[N;[N;\O<_O?`P@`PA`PAaMYbNZ]PjaTndaŒqn™ysŸxrž‘s•£…§ÐˆžÎ†œçp„Þg{åPfØCYü3Fÿ;NðKQèCIÊE>ÇB;ÏD=ÒG@éAAêBBó>Eô?FäFEßA@ÆC9Á>4¸@2²:,¨9(¨9(¨9&©:'½7,Ã=2ëGEåA?ê<;ä65Ö4/á?:é]Pôh[×RAÆA0½5%¿7'Ç:)Æ9(Ì6(Ï9+Ñ1%×7+æ92è;4ê3-æ/)é,(ë.*ê86ë97ó78ó78ø3:ø3:ö3;ö3;î3>ï4?ð5Fñ6Gõ0Ló.Jÿ1Uÿ:^ã5?ûMWÿ`kÿ^iÿVcûQ^õDTè7Gõ?Ní7Fß07Ú+2Ì1,Í2-Â9)Á8(É6,Ã0&ÜIAüiaßJFäOKÏ:6Ð;7àKGÕ@<Ë7-Ë7-Í;,Í;,Ë:'É8%°>&­;#¯:&²=)²8)®4%»8.ÈE;ÕF>ÔE=Ó61Ò50å<5æ=6å4.å4.ñ+,ò,-ë2-ì3.â:1á90Ò>0Ñ=/½7+º4(ÂC<×XQåigø|zÿ†ˆü€‚ôw}öyûyüz‚ÿo~ÿixúbqö^mñPbîM_ÿ6Vÿ9YæT_ÕCNUe8Td7YuB`|In‚Qs‡Vz‡\~‹`’eƒ–i{k}Ÿmz¥m|§o~ªm«nƒ©lƒ©l…«n‡­p…²q…²q‚´m‚´m„¶q†¸s‹³w†®rŽ£x•ª³³›ÄĬÙËÀÞОÂέ±½œ ¬ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8YJ7ZK8ZK8ZK8[L9[L9[L9\M:]J9^K:^K:^K:^M;^M;]N9^O:^O:^O:_P9`Q:aQ:aQ:aQ:`P9fLMgMN]Q_aUcdd€rrŽzw’xu•u„¥…”؁‡Ø‡ýknödgÿKQö=Cÿ#Gÿ,Pÿ;Tü6OÛ>GÚ=FÓCCÒBBÜCEÜCEÞCAßDB×G?ÓC;ÄB5À>1´>0®8*¦9%¨;'¬;)®=+Ä:/Ê@5ä::â88æ/1ä-/Ý52ß74ãOCÿk_îiZ×RCÆ)©8(¦5%¼<3ÎNEÖE@×FAÜ73Ø3/í62ì51î-&ò1*ÿ(,ÿ(,û--û--ì5-ì5-Ý=1Ý=1Ç;.¿3&½=2ÏODßb^öyuÿ‡‡ÿƒƒø{ù|‚ý{ƒûyÿl~ýdvö]oòYkíL^íL^ÿ5Tÿ7VàS[Ë>FJ`/Oe4ZuBdLv‡Z}Ža„e†‘g†™lŠp„¦t„¦t}¨p|§o}©j}©j‚©jƒªk…©l†ªm„®n„®n±j€²k€¶kƒ¹n‡´sƒ°o§x•¯€´·œÄǬØ̾ÜеÀÔ¢­Á›¯YJ7YJ7YJ7YJ7YJ7YJ7YJ7YJ7YJ7ZK8ZK8ZK8[L9[L9[L9\M:]J9^K:^K:^K:^M;^M;]N9^O:`Q<`QÜA?ÔD<ÑA9ÃA4¿=0´>0®8*§:&ª=)±@.´C1Ê@5ÐF;Ý33à66ã,.æ/1ã;8Ö.+Ê6*éUIÿzkã^OÍC6Ç=0Ê;-Ç8*Í5*Ó;0Ú7.Û8/ä50ã4/é0-ê1.ò53õ86ÿ!<ÿ!<ÿ =ÿ =ÿ;ÿ9ý:ü9ì:î<ì$Hï'Kí$Pð'Sÿ0bÿ?qÿfoý`ióWbíQ\ðO_íL\ã>OÕ0AÝ;HÓ1>½/.¸*)¤7#§:&–C#•B"¯6#²9&ÓUG¹;-Â?5¹6,¹2,ÊC=ãXQÓHAÇ9-Ä6*Ä7%Â5#Ã5Ç9#§A(¡;"£:%¥<'§6&¦5%À@7ÕULÙHCÚIDß:6Ø3/ê3/é2.î-&õ4-ÿ(,ÿ'+ø**÷))ç0(æ/'×7+×7+Ì@3¿3&¹9.ÈH=Ù\Xóvrÿˆˆÿ††ü…ý€†ÿ}…ûyÿj|úasóZlïVhçFXêI[ÿ2Qÿ3RÜOWÄ7?CY(Lb1ToJé;Dé;Dâ<@à:>Ø=;×<:Í@6Ê=3¿=/»9+ :$ªD.¬;)©8&Ã?3ÊF:Ò;4Î70Ú70Ú70Û7+Ú6*Û:&Ü;'Ù;"Õ7ß82öOIòZOÛC8Å8'Ë>-ÓB1Î=,Ö1+íHBä+0î5:õ3>î,7ÿ?Pì'8ü&(ÿ*,ÿ*,ö "ù%$ý)(û)(ðí!$ø,/é!+î&0ï/>ä$3ÿYmé,@þajü_hÿZaúU\ôPQìHIØA:Ï81ÁD2ÁD2­D.¢9#”5–7!š;)›<*¨71ª93ÄDA¼<9À00Å55Ç31ÖB@ÛLFÙJDÑD:Æ9/Å2(Ç4*Ì4)Ë3(¸<0³7+²,!­'¸* Å7-ÔA7ÙF<æODÜE:Û7.Ö2)é-+î20ÿ.1ÿ.1ò12ñ01ó/0ó/0ð0+ð0+ã7+â6*Ñ?0Â0!º@1·=.Ò_XæslÿŽ÷…„ùˆŒùˆŒÿs…ÿhzÿ[wÿYuÿRnûJfýAbó7Xï^S?]R>]P?\O>`N@aOAcPBcPBkLIkLIcS^m]hkpy~ž}ˆµ‚º •¿š¹³|“±z‘áusé}{ÿr`öiWüZgðN[ëEQîHTöJVòFRí?Hê(¦@*©8&¬;)Ã?3Â>2Ì5.Ô=6Ö3,Ö3,Ø4(Ø4(Ø7#Ú9%Ú<#Ù;"Ü5/èA;æNCáI>Í@/Å8'Ê9(Ï>-Þ93ðKEç.3ï6;÷5@ð.9ÿ>Oë&7ù#%ú$&ý')ÿ*,þ*)ú&%ù'&û)(ï#&ð$'ì$.ÿ9CÚ)ò2Aü?SÞ!5ÿluÿclÿZaüW^óOPæBCÕ>7Ô=6¸;)ÀC1´K5¨?)’3‹,Š+‹,,&­<6ÒROÉIFÄ44Å55Ð<:êVTÖGAÕF@ÎA7Å8.Å2(È5+Ï7,Ï7,¼@4¹=1¼6+¼6+Ä6,É;1ÔA7ÚG=áJ?ÙB7Ú6-×3*ê.,î20þ-0þ-0ò12ñ01ó/0ó/0ð0+ð0+ã7+â6*Ò@1Â0!¸>/¶<-Ñ^Wévoÿ÷…„ö…‰ö…‰ÿqƒÿgyÿZvÿXtÿRnûJfû?`õ9Zò?]ó@^´X[47AO.N\;Vx;e‡Jr–Yw›^vžby¡e|¥i}¦j|¥i{¤hz¤ey£d{¢c{¢c}¡a}¡ax£kz¥m|¨i}©j|¬b|¬b~¯`€±b‚°g„²i‡¯s…­qŠ©Ž­ƒ¨ˆ‹¤„w…†aopO]^\K7\K7\K7\K7\K7\K7\K7\K7]L8]L8]L8]L8]L8]L8]L8]L8]L8_N:`Q>`Q>[P>ZO=YPAZQBZRGZRGZOKZOK]OO_QQcSVeUXdVVfXXa_ukimv¯y‚»€‰Ø„Ü™ŽÚ—ŒØ®€¯®€¯ÓŒÚ†“ëräxkÿbgôUZîGOíFN÷GQöFPô@Ið+ª?-¨=+ª9)µD4ÅI=¹=1º1'Ä;1Ë7-Ì8.Ó7*Ô8+Ø7%Ø7%Û9$Ý;&Ý4/Ü3.ÞB6êNBÛH8Ç4$É2!×@/å=4òJAé/0ð67ù5?÷3=ÿDP÷3?ì*+ç%&ç%%ô22ñ//ê((ç'&ò21æ*+ô89á,1Þ).å5?ÿS]ê>JÿZf÷acîXZîOSíNRéEFÝ9:Ó84×<8¿6,Ä;1¼B5¶4Ü?6Ý@7á=<Þ:9ä:;è>?è<<ä88æ>;ïGDâA9Ü;3Ù5,×3*æ0,ê40õ20ô1/ó12ò01õ/0õ/0ñ0+ñ0+ä6+ã5*ÓA2Ä2#´:+µ;,Í\Tëzrÿ’‘ù‡†úˆø†ÿoúgwÿYtÿVqÿLlÿEeû<^ø9[æJbëOgJE{61CQ0R`?[z?h‡Lp”Wt˜[s›_wŸcy¢fz£gy£dx¢cw¡bw¡bxŸ`y a{Ÿa{Ÿay¢fz£gz§d{¨ey©]zª^|­\~¯^„²g‡µj‹±t†¬o…¥v€ qx’onˆeSb]@OJ2A<]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8\K7^M9_P=`Q>[P>ZO=XO@YPAXPE[SH_TPbWSgYYi[[l\_n^aoaarddnl‚wu‹u~·ˆÁƒŒÛ‡ß‘†Ò—ŒØµ‡¶¯°ÈtÌx…é}pî‚uÿlqÿbgúS[óLTöFPóCMò>Gï;Dá7:à69Ô;6Õ<7ÈB6Æ@4»B/¸?,§<*ª?-¯>.¹H8ÍQEÅI=½4*¹0&Ë7-Í9/Ö:-Ù=0Û:(Ø7%Ù7"Ü:%Ý4/Ú1,Ü@4êNBàM=Ï<,Ï8'ÛD3Þ6-êB9é/0ì23ö2<û7AÿNZÿJVÿ>?ô23å##ï--í++ò00é)(í-,ô89Õæ16à+0ç7AóCMÿVböJVÔ>@ØBDàAEÝ>BÞ:;Ü89Õ:6Ó84Ä;1Á8.¶4ÖB8ßB9ßB9ä@?à<;æ<=ëABê>>ä88ç?<õMJÛ:2Ø7/Ø4+Ø4+ç1-ê40ô1/ó0.ó12ò01õ/0õ/0ñ0+ñ0+ä6+ã5*ÔB3Æ4%°6'³9*ÇVNî}uÿ’‘úˆ‡úˆö}„ÿl|÷dtÿUpÿQlÿFfÿBbø9[ú;]èLdìPh|72w2-HV5XfE_~CiˆMp”Ws—Zq™]vžbx¡ex¡ev av auŸ`uŸ`wž_xŸ`{Ÿa{Ÿax¡ez£gz§dz§dx¨\y©]z«Z|­\„²g‡µjŒ²uˆ®q…¥v}nsjg^Q`[CRM7FA]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]N9]L0^M1_O6_O6ZN>YM=VOGWPHUPT\W[f_omfvog~og~pfqg‚ho‚ls†nw¢t}¨w€Ë~‡Ò„‰å‡Œè•â•â¡…¸“wªŸmv£qz¸yg½~lùniúojÿhgùa`ûQTòHKð;@ê5:æ68å57Ø;6Ø;6ÈC4ÇB3ºC/·@,­7+µ?3¯;.°×45Ö34ÿehÛ?BÆ-0È/2À('Ó;:ã@CÚ7:Ú14á8;Ü89Ñ-.Ë32Ò:9ÔFEàRQï^cøglùamñYeÁB;ÅF?ç\YõjgÿonÿkjäJH×=;Ç4,Ð=5ÕE:ÓC8Õ>3Ô=2Ú91×6.û/;ö*6÷)6ø*7ó*4ò)3ó9:ÿHIÞ3,Ý2+Ø4*Ù5+â4+ä6-î3.î3.ö/2õ.1ø-0ø-0ô.+ô.+æ5+å4*Ô@2Ê6(¯4%³8)¿NFí|tÿ‘û‰ˆÿ|‹ÿu„ùk{òdtÿSmøLfÿ:aÿ8_ö7Yü=_ÌVbÈR^]9)a=-Q\>`kMbIl‰Sq’Yt•\s™^xžcy¡cx btž^tž^u^u^wž_xŸ`{Ÿa| bx¢bz¤dz¨`z¨`y¨Zy¨Z{ªY|«Z«^ƒ¯b‡®m„«j‡¥sƒ¡oz•lp‹bevfZk[QbR^O:^O:^O:^O:^O:^O:^O:^O:]N9]N9]N9]N9]N9]N9]N9]N9^M1_N2_O6^N5ZN>ZN>YRJ[TL^Y]gbftm}{t„}uŒ{sŠzp‹yoŠov‰szt}¨x¬xÌ|…Ђ‡ã†‹ç•â’ŠßŸƒ¶´²€‰­{„¦gU“TBÏD?ØMHêRQîVUøNQóILñAÕ9<Ð7:¸"Â*)Ö>=åBEÙ69Õ,/Ú14Ö23Ì()Í54ãKJòdcøjiõdiòaf÷_kø`lÏPIÏPIç\YãXUæNMàHGÍ31Í31ÕB:ÞKCáQFÛK@ØA6Ó<1Ö5-Ó2*ú.:ù-9ø*7õ'4ò)3ø/9ù?@ÿHIÝ2+Ý2+Ù5+Ù5+â4+ä6-î3.ï4/ö/2õ.1ø-0ø-0ô.+ô.+æ5+å4*Ó?1Í9+®3$²7(¶E=êyqÿŽüŠ‰ÿz‰ûq€õgwïaqüPjôHbÿ7^ÿ6]÷8Zþ?aÈR^´>J\8(b>.S^@`kMbIkˆRq’Yt•\u›`xžcx bu_rœ\rœ\s›\s›\uœ]wž_zž`{Ÿax¢bz¤dy§_y§_x§Yx§Yy¨W{ªY}©\­`…¬k„«j‰§uˆ¦tƒžu{–mv‡wm~nevf^O<^O<^O<^O<^O<^O<^O<^O<]N;]N;]N;]N;]N;]N;]N;]N;`O1aP2_P;^O:XOFZQH[V]_Zahf|qo…yyŸ~~¤}{¬yw¨wt©wt©my³q}·v€»yƒ¾…Áƒ‰ÅÂ’”Ç›”µž—¸­ž£·¨­Ç±œ¾¨“¥‹fˆnIŸD/¡F1²B4·G9ÖIBàSLîHHçAAê<=é;<ã;:ã;:×@7Õ>5Ç=0Ä:-º:1¾>5®5,©0'·K>ÎbUÐiZÎgXÁP@²A1¹3'À:.Ö8-Ô6+à2+ä6/à2+ã5.Þ8,Þ8,à>/åC4å>.Û4$é3(ç1&ò0.ï-+í-,ñ10ð67ú@AïPTøY]æGKñRVÕ49çFKÙ9;âBD×9:Í/0Ì24âHJÏ9:Í78µ#$Ï=>â57æ9;í:>é6:ã+3à(0â19ë:BíLRý\bÿksÿhpú^kõYfúWhûXiòe^è[TìTQ×?<Ï0-Ó41Ò3/áB>âKBèQHèTJßKAÛ>5×:1Û60Û60ú*7ÿ0=ÿ/<ü*7û-7ÿ8BÿDEýABÞ3,Þ3,Ü5,Ü5,á3*ã5,î3,ð5.÷/2ö.1ù-0ù-0õ.+õ.+ç5+æ4*Ó=/Ò<.±3%´6(±<5étmý‰‰ý‰‰ÿq…ÿg{ðbrì^nüMjóDaÿ5^ÿ6_ò?_øEe¨ZZ„66KG.KG.SY=]cG`zJiƒSrŽ[w“`wš`{ždwŸ`rš[o™Wo™Wp™WqšXr›Yt[wž_xŸ`w \y¢^y¤\y¤\v¥Uu¤Tw¦Ux§V}©\­`†ªj„¨h†¤p…£o€šmx’ep„hj~bbvZ_P=_P=_P=_P=_P=_P=_P=_P=^O<^O<^O<^O<^O<^O<^O<^O?ê<=å=<ä<;ØA8Õ>5È>1Ä:-»;2¾>5´;2·>5½QDÅYLÅ^OÍfWÔcS¿N>¾8,À:.Õ7,Ó5*ß1*ä6/ä6/á3,Ý7+ã=1åC4äB3á:*Û4$ê4)ä.#ð.,ð.,ñ10ó32ç-.é/0âCGöW[õVZÿosäCHèGLÞ>@û[]ÿqrÝ?@ÿ~€ÿnpèRSÓ=>Ã12Ï=>ôGIé<>ì9=ó@Dð8@æ.6ñ@Hÿ]eÿntÿjpýck÷]eù]jýanÿ\mùVgí`YÞQJáIFÐ85Ð1.Õ63Ð1-Ø95ÜE<áJAßKAÕA7Ò5,Ò5,Ü71ß:4ñ!.ý-:ÿ0=û)6ü.8ÿ:Dü@Aï34ß4-à5.Ý6-Ü5,á3*â4+î3,ñ6/÷/2ö.1ù-0ù-0õ.+õ.+ç5+æ4*Ò<.Ó=/±3%³5'¬70æqjû‡‡þŠŠÿmücwí_oë]mûLiôEbÿ6_ÿ8aôAaúGg¥WWu''NJ1IE,PV:W]A]wGgQpŒYv’_wš`zcu^p˜Yl–Tl–Tn—Uo˜Vp™Wr›Yuœ]v^vŸ[w \w¢Zw¢Zt£Ss¢Ru¤Sv¥Tx¤W|¨[€¤d}¡a}›gy—crŒ_h‚U`tXZnRRfJYL;[N=^Q@^Q@]P?\O>]P?^Q@_RA\O>ZM<[N=^Q@`SB_RA^Q@cT?_P;\PD^RFWQUZTXb`vrp†tw x{¤}€·‚¹{¿uy¹or·lo´rvÑvzՀ„ĈŒÌ™™±¤¤¼µ²¡½º©ÌțÒΡØҘØҘÛҙÛҙ×͘ÐƑͪŒ©†hš`Hº€hÔtf®N@ÖQLìgbéIIà@@â89ã9:ã99Þ44Ü41Þ63É83Ä3.ÅB:½:2»K?ÇWKµO@ËeVÏdTÅZJÆF9½=0Î4*Ò8.â5/á4.Þ1-Þ1-Þ7.ã<3à<0Ú6*Þ4%â8)æ.$ç/%ì/)î1+ë4.ë4.ã6/ã6/Ñ8:äKMóX\êOS×8=Õ6;øW_ÿ~†ÿ}…ÿowÿgnÿhoÿgjõ\_ïY[ô^`ÿQWÿBHþ6@ý5?ù1>ò*7ê0=ô:GúT^ÿ^hÿhpÿemýalþbmÿ_lý[híRMßD?Ù53Ö20Ù0-×.+×2.Ý84ÞD:ÜB8×?4Ô<1Ù80Ù80â62ã73î7;î7;ð69ñ7:ñ78ï56æ40ã1-Û4+Ü5,Ý7+Ý7+æ1(ç2)ò1,ô3.÷03ö/2ù.1ù.1ö/,ö/,ê5,é4+ÚB5Ï7*º8+±/"·<7ÓXSÿ—™ú~€ÿh€ÿc{ø\rîRhùDcøCbÿ;bÿ7^æTkÞLcsI=T*6@%?I.JL4[]EWlAbwLo‰Yx’bw–]u”[p—Vp—Vl•Ql•Qm–Ro˜TqšXr›Yt›\uœ]rœTsUt Uu¡Vv¢Uu¡Tt SsŸRz¤Zy£Yy]s—WmŠTbIWqBQk]P?`SBaTC`SB^Q@fWBaR=\PDaUI`Z^f`dmkxvŒvy¢z}¦}€·z}´quµlp°lo´nq¶swÒy}؇‹Ë“—ק§¿µµÍÈÅ´ÐͼÚÖ©ÞÚ­äÞ¤ãÝ£äÛ¢âÙ ÛќÓɔڷ™¾›}±w_ŋs×wiµUGßZUöqlöVVéIIæ<=ç=>é??å;;ß74Ý52Ï>9È72ÅB:¹6.°@4¼L@°J;Ã]NÚo_ÎcSÇG:¶6)È.$Ð6,à3-Û.(á40å84ä=4â;2Û7+Ù5)ß5&à6'í5+ì4*í0*ì/)ç0*ç0*à3,à3,Ñ8:×>@äIMòW[û\aû\aý\dÿ`hòRZíMUïRYü_fÿknÿgjñ[]èRTó06ï,2ó+5õ-7ï'4ç,â(5ï5B÷Q[ÿYcþdlÿemÿdoÿcnüZgóQ^áFAÙ>9Ù53Ú64ß63Û2/Ø3/Ú51Ú@6Ø>4Õ=2Ó;0Ù80Û:2ä84æ:6í6:ì59ï58ï58ð67î45å3/á/+Û4+Ü5,Ý7+Ý7+æ1(ç2)ñ0+ô3.÷03ö/2ù.1ù.1ö/,ö/,ê5,é4+Ø@3Õ=0½;.µ3&³83×\Wÿ’ówyÿbzÿ]uôXnïSiúEdöA`ÿ9`ÿ:aâPgÑ?VlB6V, 3="9C(EG/PR:Rg<^sHj„TtŽ^u”[s’Ym”Sm”Si’Nj“Ok”Pm–Rn—Up™Wr™Zsš[sUsUsŸTsŸTsŸRržQpœOo›Nm—Mj”JhŒL_ƒCXu?Li3D^/>X)=V.>W/?X0XK:[N=]P?^Q@]P?]P?^Q@`SB`SB_RA_RA`SBaTCaTC_RA]P?`US[PNXQX`Y`gczqm„sužy{¤uz²x}µt|½ltµbi±`g¯gm·pvÀ}|څ„◖Ч¦à½»ÀËÉÎÜÙ¬äá´éåœíé îê¡ëçžçà©áÚ£ÖÏ¥ËĚ¯²— …–„nšˆr¥p`XHº]VÏrk÷usåcaåIJßCDì?Aë>@ë7:ç36Ý>:Ø95ÒB:Æ6.¶8,»=1­<,·F6ÚiYÜk[ÜZLÅC5È1&Í6+Ú6-Ö2)Û64çB@éH@Þ=5Ô4(Ó3'Ü1'Û0&è3*ç2)å0)ä/(ß4,â7/Ý?4ßA6Â.*È40ÙCBìVUø]aö[_óS]ðPZçGQèHRîNXü\fÿmsÿntóX^Û@Fð,0ò.2ú1;ü3=ó+8ï'4ñ7DÿIVñJRöOWõY]û_cÿchÿ`eùPWêAHß82Þ71ä73é<8í;9é75à5.ß4-Ù;0Ø:/Ö:.Õ9-Û7.Þ:1è94ê;6ß<7Þ;6á96â:7æ:6ä84Ý6.Ù2*Ø6+Ù7,Þ8*Ý7)ç0(è1)õ.)÷0+ó23ò12ö01ö01õ/,õ/,ê5,é4+Ø<0ÞB6Ä:0½3)´0.ã_]ÿƒˆónsÿ_xûWpÿMmýKkÿ@eø8]ê?_ðEeÀ\d£?GXE4P=,7@%7@%HC-KF0N^9ZjEg}OrˆZrWqŽVkMkMg‘Ih’Ji’Lj“Ml•Qn—So—Xo—XtœVtœVrœTq›SnšOl˜Mj•Mi”LeŒI`‡D\~BRt8Lh5D`-AX*>U'B\,D^.Ic3WJ9YL;\O>]P?]P?]P?_RA`SB_RA_RA`SBaTCaTC`SB^Q@]P?YNL\QO_X_jcjqm„xt‹xz£{}¦v{³ty±jr³bj«\c«`g¯lr¼v|Ɖˆæ’‘藍ݳ²ìÈÆËÓÑÖâß²çä·ìèŸîê¡íé èä›ãÜ¥ÚӜËĚ½¶Œ¢¥Š—š˜†p”‚l¢m]™dT¿b[Ïrkÿ„‚õsqóWXæJKîACì?Aï;>ì8;Û<8Ú;7ØH@ÒB:»=1¸:.©8(¤3#»J:ÕdTëi[×UGÎ7,Ê3(Ø4+Ø4+Ø31òMKü[SíLDÙ9-Õ5)Þ3)Ý2(á,#á,#à+$á,%Û0(Þ3+Ø:/Ú<1Á-)Å1-Ï98ÙCBßDHßDHåEOëKUðPZõU_÷WaúZdÿhnÿmsóX^×Þ71à93é<8îA=ò@>î<:å:3â70Ø:/Ø:/Ö:.Ö:.Ü8/Þ:1ç83é:5ß<7Þ;6á96â:7æ:6ä84Ý6.Ù2*Ù7,Ú8-Þ8*Ý7)ç0(è1)õ.)÷0+ó23ò12ö01ö01õ/,õ/,ê5,é4+Ö:.âF:Ä:0¾4*².,ëgeÿzñlqÿ`yùUnüJjüJjþ>cô4Yè=]óHh¾Zb›7?[H7^K:AJ/=F+LG1GB,GW2Sc>`vHl‚Tn‹SoŒTiŽKhJfHfHgJi’Lk”Pl•Qm•Vn–WtœVs›UpšRm—Oi•Jf’GcŽFbE_†CZ>Vxeÿ=dÿ7`ÿ2[×NbàWk•`ZxC=WQ;_YCQO:KI4QI6JB/CQ0M[:ZlBgyOk†OmˆQiŒHh‹GeEfFg‘Ih’Jj“Ol•Qm•Vm•VršTp˜Rm•Oj’LeŽHb‹E`‰E_ˆDZBV}>St=No8Pj:Qk;WnBYpDTq;Ur]QA^RB^RB_SC`TD_SC^RB^RBaUEcWG]Vfleuxt~z“zy¡yx sx¯sx¯iq²bj«[c«\d¬go¸u}ƀˆÐ…Õ˜›à £è°²â»½íÇÉÖÌÎÛÔÕÇ×ØÊÜØ»Û׺×Ñ·Ñ˱ÍĵĻ¬´©¥¥š–…‚t|qxvjqoc…ja‹pg—^UšaXÈmhÔytø{wù|xÿmmýccúPQðFGïD=é>7Ü>5àB9Ë=3ÑC9ÙWJÀ>1´6'¹;,Â=.Ä?0ÐA1ÔE5×>0Ð7)Ð21êLKú_[òWSáD;×:1Ü8.Ý9/æ8/æ8/å81ä70Ø:/Õ7,Ç9+Å7)°(¹1!É?4ÒH=ÔC@Ì;8Ì5:Ð9>Ñ7AáGQîT^òXbô]d÷`géTX×BFë<9í>;ö?AýFHÿLRÿPVÿT]ÿU^Ý49Ø/4Ù03â9<ò>Aò>Aó57ï13è71ë:4ð95ì51é2.ê3/ã4/â3.à=4ß<3Û=2Ú<1á81á81è51è51ã;8â:7ç:6ç:6é:5ç83ß7.Û3*Ú8+Û9,Ý:+Û8)æ1&æ1&ñ.(ó0*î53í42ó11ó11ó0,ó0,ê5,é4+Ü;1Û:0É91À0(ÎBCüpqûktôdmòOjîKfÿ9`ÿ7^ÿ6_ÿ9bÛRfÜSgLFt?9VP:]WAUS>NL7OG4KC0?M,GU4Rd:_qGe€Ij…NgŠFgŠFdŽDdŽDeGg‘Ii’Nj“Ok“Tl”Uo—Qm•Oj’LgIb‹E`‰C^‡C^‡C[‚CX@Vw@RsVs=NB2QE5TH8WK;XL6êC;Ö<2ÞD:ê\PÇ9-Ã;-¾6(¾6&Æ>.ÐC1ÐC1ÓB/ÔC0Ð79Ö=?ÚEAØC?Õ<6Ñ82Ø5.Û81å:2å:2â;3á:2×@5×@5ËF5ÌG6«/¸<"ÌK6ÎM8Ä>5·1(¿02É:<ÔCJÞMTéV^íZbî]dëZaÝNRÏ@DÍ5*Ñ9.Þ<7äB=îDEðFGðCGì?Câ59ß26æ25ì8;û47÷03ÿ+/ÿ.2ë4.ï82ò72ë0+ç+)ê.,ä3-ã2,á=3á=3Þ=3Þ=3ä92ä92ë52ë52í57ì46ï34ð45ï64í42â4-Þ0)Û7+Ü8,Ý:+Ü9*ã3&ã3&ì0%î2'ì63ë52ð31ð31ò1,ò1,ê5,é4+ß<3Ô1(Ð;5Ç2,çUXÿqtøbmðZeæHaèJcÿ4`ÿ/[ÿ4aÿ;hÉVc¼IVV?/]F6QO8RP9\O>UH7LA/MB0;H*AN0J\4WiA^yBfJeˆDf‰EbŠAc‹BcEeGfKh‘Mi‘Rj’Sl“Pj‘NgŽKd‹HaŠH_ˆF^†G^†G_…J\‚G^|H\zF]wH^xIbwLdyNYv@Yv@Yv@L@0OC3SG7UI9WK;XL<[O?]QAcWGcWGcWGaUE`TDcWGi]MocSuryv“vvœss™qs¦su¨jo¯af¦Ya©]e­em¶lt½u}Ňϋ”Ù“œá˜¤Ê©Ï¥¯Óª´Ø¯µ×¯µ×±´Ó²µÔ´±Î²¯Ì®¨Ä¨¢¾©Ÿº¤šµ˜‹§Š}™zy~bafhdc_[Zj[Vte`xVMˆf]ŽKBšWNÂ]UÒmeùtoÿzÿvsÿliÿZTÿOIìE=óLDÜB8ßE;æXL¹+»3%½5'Æ>.ÎF6Ë>,À3!È7$ØG4ÝDFÒ9;È3/Ë62Ó:4Õ<6Ý:3à=6æ;3ã80Ý6.Ù2*Í6+Í6+Â=,Ã>-ÑU;ÄH.½<'½<'Â<3Á;2Ã46Â35ÜKRÝLSáNVæS[èW^æU\ÛLPÒCGÌ4)Ï7,Ø61Ø61Ý34Þ45à37ß26å8<ä7;í9<ñ=@û47õ.1ÿ*.ÿ04ê3-ð93ó83ì1,è,*ë/-æ5/å4.à<2à<2ß>4ß>4æ;4æ;4í74í74ë35ë35î23ï34í42ë20à2+Ý/(Ü8,Ü8,Ý:+Ü9*ã3&ã3&ì0%î2'ì63ë52ð31ð31ò1,ò1,ê5,é4+à=4Ï,#Ô?9Ê5/ödgÿqtó]héS^äF_êLeÿ7cÿ/[ÿ4aÿ;hÁN[ª7DH1!]F6PN7LJ3\O>VI8I>,NC18E'=J,EW/Rdc~Gc†BeˆD`ˆ?a‰@a‹CcEdIfKgPgPj‘NhLeŒIcŠG`‰G_ˆF_‡H_‡H\‚G[F_}I^|H`zKa{Lf{Pg|Q[xB\yC]zD?C5BF8IF=KH?RH?TJA\L<_O?`R8`R8\T?^VA^ZWfb_jiwqp~uo›zt {w©zv¨op©gh¡`a¤]^¡_a®eg´qoÃ{yͅØŽŠá—‘뜖ð ŸÙ ŸÙ¤ Û¥¡Ü¥¡Ü¥¡Ü¤ŸÙ¤ŸÙ¤œÕ¢šÓ ™ÍŸ˜Ì•Æ–Ž¿‹ƒ²‚z©potgfkd_\b]ZoXRnWQ‚TG‡YL™OD¥[P¶XNº\RÕmdä|sð…}ú‡ðxwòzyça`ØRQØDBîZXÌ8.Æ2(Ä7&Ã6%À7$À7$Å8&É<*Ð=-Ò?/Ó7(×;,×@/Ó<+Í6%Ì5$Ù9+áA3à:.ß9-Ú8+Ø6)Ë:'Ë:'ÁA(ÃC*Ã:2Ç>6ÌC;ÏF>ÌC;Ä;3¹3*³-$Ã=4ÍG>×QHÝWNá[RßYPÕOFÊD;Í#Þ7'Þ7'ï+-í)+ø$3ù%4ÿ(?ÿ(?ÿ(@ÿ(@ÿ$Aÿ$Aÿ"Aÿ"Aÿ :ÿ"<ÿ(=ÿ&;ð,6ï+5ã77æ::Û94Û94Ü;3Ý<4å:3ä92è62è62ì23ì23é62é62ã80á6.Ù7*×5(Ú;(Ú;(Û:&Û:&ß9#ß9#â7#â7#ë4.ì5/ï4+ð5,ï5)ï5)å8(ä7'Ü<0Ø8,Õ:8Ú?=ÿjzÿaqÿQlõGbÿFh÷5Wÿ4\ÿ:bèEbîKh”WV_"!35 :<'EF4MNeDgFl‘Nm’Oi’FgDeFc‹DeŠGd‰Fc…HaƒFdƒJbHbEbEd€Fd€FcDa}BX}8[€;^ƒ>;?1>B4FC:HEZJ:]M=_Q7_Q7\T?_WB_[Xgc`lkyqp~sm™uo›tp¢plžfg `aš\] \] ce²ik¸trÆ}{υØŒˆß“ç—‘똗љ˜Òœ˜Ó™Ô™Ôœ˜Óœ—Ñ›–Н•Î›“Ìš“Ç™’ƘÁ‘‰º†~­~v¥onsfejc^[a\YnWQmVPSF…WJžTI©_T¸ZPº\RÏg^Úriávnêwý…„ÿ‡†útsìfeæRPíYWÇ3)Â.$Ä7&Ä7&À7$À7$Å8&Ç:(Î;+Ð=-Ô8)Ô8)Ò;*Ñ:)Ñ:)Ð9(×7)×7)à:.ß9-Û9,Ù7*Ì;(Ê9&½=$¼<#¾5-Á80Å<4È?7É@8Ç>6Â<3À:1»5,Ä>5ÏI@ÕOFØRIÕOFÉC:¾8/Ê9Íÿ=ÿ<ÿ7ÿ9ÿ%:ÿ&;ò.8ó/9å99ç;;Û94Û94Ü;3Ý<4å:3ä92è62è62ì23ì23é62é62ã80á6.Ù7*×5(Ù:'Ù:'Ú9%Ú9%Þ8"Þ8"á6"á6"é2,ê3-í2)î3*î4(í3'ã6&ã6&Ý=1Ô4(Ñ64ñVTÿeuÿ\lõGbúLgÿ@bþ<^ÿ1Yÿ5]ñNkã@]|?>a$#79$79$:;)@A/DA0A>-5D-9H1@CMP%Zb=goJfvQhxScNeP`…Ba†C`‰;b‹=eDgFkMl‘Nj“Gh‘EeFdŒEf‹HeŠGd†Ib„GdƒJc‚IbEbEd€FeGcDb~C\<_„?b‡B4:,7=/??7BB:JA:MD=TH:WK=[P<[P.Ñ>.Î6(Ç/!Ù9-Ø8,Õ7+Õ7+Î;+Ì9)À9%¾7#¾4)¿5*Á7,Ä:/Ç=2É?4ËA6ÌB7Å;0Ê@5ÎD9ÐF;ÑG<ÑG<Ê@5Á7,Ð5!Ó8$â4+ä6-ô-2ô-2ü)8ý*9û(;ú':ù%;ø$:ù!8ø 7û4ú3ÿ6ÿ6ú&5ý)8ò5<ó6=å;;ä::Û94Û94Ý:3Þ;4å:3ä92é62é62í34í34é54é54ã81á6/Ø6)×5(Ù9)Ù9)Ù:%Ù:%Û9$Û9$Þ7$Þ7$Ý5(Þ6)à6'á7(ß8&ß8&Ù:'Ø9&Ú>2Î2&Ö7;ÿlpÿ[nýReó;]ÿJlÿ2[ÿ:cð8\ô<`Ò^q°)B='A<&A="D@%>HWa/pT}Œat‰^i~S`~JaK_„?`…@`‰;cŒ>eDgFkOkOk“Ji‘HhGgŒFgŒIf‹HfˆKd†Ie„Ic‚Gc€Fc€Fd‚FeƒGd€CcB`ˆBbŠDeG06(39+;;3>>6G>7KB;RF8UI;XM9YN:XQA^WGa_bigjlmop„ol—jg’`^XV‡STWX‘[^¡ad§ko¹qu¿z{ˁ‚Ò‡…؉‡ÚŒˆÜ‰ÝŽŽÊŽŽÊŽŒËŽŒËŠÍ‹ˆËŒ‡ÊŒ‡ÊŒ†Æ‹…ō†¼Ž‡½Ž‡³ˆ­yŸwq—`iyXad[Vd[V]^L[\JsTBvWE¨QJ¶_XÔXXÖZZàfcåkhÚriáypë|uë|uÿ‚|ÿ‡ÿ€yõjcÉ=0Ä8+Â;(Á:'½;%½;%Á8%Â9&Ç8'È9(Ø:.Ô6*Í5'Ï7)Ð=-Ð=-Í5'Ç/!Ô4(Ô4(Ò4(Ó5)Í:*Í:*Ä=)Ã<(Ã9.Ã9.Ã9.Ã9.Ä:/Æ<1Ç=2È>3ÐF;ÐF;ÌB7Ç=2È>3ÌB7ËA6È>3Ð5!Ó8$ã5,å7.ô-2ô-2û(7ü)8ù&9ù&9ù%;ù%;ü$;ý%<ÿ#:ÿ#:ÿ 7ÿ6ú&5þ*9ó6=ô7>ä::à66Û94Û94Ý:3Þ;4å:3ä92é62é62î45î45ê65ê65ã81á6/Ø6)×5(Ø8(Ø8(Ø9$Ø9$Ú8#Ú8#Ý6#Ý6#Ü4'Ü4'ß5&à6'Þ7%Þ7%Ù:'Ø9&Ö:.Ð4(èIMÿrvÿVióH[õ=_üDfÿ1Zÿ5^÷?cûCgÄPc—#6@!K,)*5$,7&5=(;C.C>(@;%B>#HD)S]+r|Jžs˜§|‚—llV^|H_}I^ƒ>a†Ab‹=fAhGj’IlPlPl”Kj’IhGgŒFgŒIgŒIg‰LfˆKe„IdƒHdGdGf„Hf„Hf‚Ed€CdŒFfŽHj’L,4'/7*692:=6A>9DA,È<-È<-É;-É;-Ç9+Æ8*Æ7)Å6(Ï@2ÐA3Ï=0Ê8+Ë7+Ï;/Í9-É5)Ô-%Ø1)è00ë33ö-7ö-7ú+;ú+;ù/?ù/?ö0=÷1>ü0<ý1=ÿ/<ÿ/<ú*8ù)7ò-7õ0:í9<ì8;Þ97Ù42Û94Û94Þ93ß:4æ95å84é54é54ñ35ò46í76ì65ã81á6/Ø6+×5*Ô8)Ô8)Ô9'Ô9'×8%×8%Ø7#Ø7#Ñ:%Ñ:%Ï=$Ð>%Ð@(Ð@(Ï>+Ï>+Ð50×<7ÿ\gÿalÿMlö;Zÿ@ký6aÿ2]ÿ*UßUnáWp|KQX'-40-730(2).8/5A+7C-;<<=VF"fV2t‰N¤i¦¾Š¦¾ŠŠ¦uo‹Z_€G^F]…>`ˆAeŽ@i’Dl”Km•Lo“Sn’Ro•Ll’IhGgŒFgŒIhJi‹NhŠMd†Jc…IdƒGdƒGf†Gg‡Hg…EeƒCfŽGi‘Jl”M*2%-5(4707:3=:5@=8G@6JC9NH:NH:NKBVSJ]]geeoef‚ef‚a`Œ[Z†PR…MO‚PT“[_žei²lp¹sxÉw|Í‚Óƒ†×…†Ö…†Öˆ‡Ó‰ˆÔ†‡Ç…†Æ„„ʃƒÉƒ€Ïƒ€Ï…€Ò…€Ò…΋ƒÌŒ„½Œ„½‹…©„~¢yv‹qnƒŽP[ˆJUgYPi[RSgLQeJfZBh\DžG@°YRÛPWÝRYæ[`ë`eÝjgåroç{oßsgö{sîskþxmã]RÃ;+½5%¿='¿='¾>%¿?&Ä;(Ä;(Ê9(Ê9(Ø4*Ú6,Ó;-Ð8*Å:'Ä9&Æ;(É>+Ï<,Ó@0ÚA3Ö=/Î8)Ê4%Æ9'Ê=+Æ:+Ç;,É;-É;-È:,Ç9+Æ7)Å6(Æ7)Ë<.Ñ?2Ñ?2Ó?3Ò>2Ë7+Ã/#Ò+#Ö/'è00ì44ù0:ù0:ý.>þ/?ú0@ú0@ö0=õ/<ù-9ù-9ü*7ü*7ý-;ü,:õ0:õ0:ê69é58Û64Ù42Û94Û94Þ93ß:4æ95å84é54é54ò46ó57î87í76ä92á6/Ø6+×5*Ó7(Ó7(Ó8&Ó8&Ö7$Ö7$×6"×6"Ï8#Ð9$Î<#Ï=$Ï?'Ï?'Ï>+Ï>+Ð50åJEÿgrýS^ÿHgõ:YÿAlø1\ÿ3^ÿ)TÝSlÓIbf5;S"(>:7730-7.0:12>(/;%56AB"m]9Œ|X›°uª¿„µÍ™®Æ’’®}w“bd…L`H]…>a‰BgBl•Go—Np˜Oq•Uo“So•Lk‘HgŒFf‹Ef‹HhJi‹Ni‹Ne‡Kc…IdƒGe„Hg‡HhˆIh†Fg…EhIj’Km•N%0"(3%/4-16/664997?<7B?:HE0Ø?1Ü@3Ü@3×9-Ï1%ß--ä22ð39ó6<ú2?ù1>ö0?ö0?í/9í/9ê17é06ë.2ë.2ï+/ï+/ñ4:ò5;î7;ì59â66à44Ú72Û83Ü94Ü94à85á96ç77æ66é56é56ó49ó49ï77î66ä84á51Õ7,Ó5*Ï9*Ï9*Í:(Í:(Ï9(Ï9(Ð9&Ð9&Å;!Æ<"Ä>#Æ@%Ä@)ÅA*Ë=/Ë=/Û6:úUYÿ[rÿH_ÿ\ôA_¨[a‹>D<;6:94=;>758B44A336;%5:$4FK]-€ƒJ£¦m©Ç‡­Ë‹®Í”¤ÃŠ°{x™dfŠM]D\„=`ˆAgBm–Hp˜Op˜On•Tm”Sn”KjGf‹Ed‰CeŠGgŒIhŒNhŒNe‡Jd†Ic†Fd‡Gf‰EgŠFfŠDe‰Cg’Jj•Mm˜P#. &1#,1*.3,331553;83>;6FC:FC:FGBOPKWYf^`m\`}Z^{]^ŽZ[‹WX‘\]–df°qs½x}Ñ|Õ„߁†áƒ‡à‚†ßƒÖÔ€‚ρƒÐ„ˆÈƒ‡Ç‚„΁ƒÍ„€Ô†‚Öˆ‚؉ƒÙŒ„ÏŠ‚͉‚µ‡€³„€—{wŽpnsgej‚RP~NLeYIi]MZiLXgJeaDfbE†K;˜]MÅQQÆRRÞSXâW\åZ_îchîujépeõpgÊE<ÐB6Á3'Ä5$ÒC2Ã;%Ã;%Å='Æ>(Î;)Î;)Õ7+Õ7+Ï,#Ñ.%Ë7)Î:,Ä?,Â=*½:&º7#¿3"ÏC2äN@äN@×A3Í7)Ê8)Ï=.È;)Ç:(Ç8'Å6%È7&É8'Ë8(Í:*Ò:,Ó;-Ò9+Ï6(Ô8+Ù=0Û=1×9-é77í;;÷:@÷:@û3@÷/<ò,;ð*9ì.8í/9ê17ë28ï26ð37ö26ö26ð39ò5;î7;ì59á55ß33Û83Þ;6Ü94Ü94à85á96ç77æ66é56é56ó49ô5:ï77î66ä84á51Õ7,Ó5*Î8)Î8)Ì9'Ì9'Î8'Î8'Ï8%Ï8%Ã9Ä: Â#Ã?(Ã?(É;-É;-ß:>ÿ_cÿQhÿKbÿ6^ÿ>fû+\ÿ7hí:XÿMkœOUp#)=<7CB=:8;97:B44A338='>C-EW'`rB”—^µ¸­Ë‹ªÈˆ¤ÃŠ›º‹¬wx™de‰LY}@Z‚;_‡@fAl•Gp˜Op˜On•Tl“Rm“JjGf‹Ed‰CeŠGgŒIhŒNhŒNe‡Jd†Ic†Fd‡GgŠFh‹Gg‹EfŠDi”Lk–Nn™Q(0!'/ (-&).'.0-1306729:5<>3?A6CF?ILEOR[UXaY[r\^uYX„[Z†]^—dežkmºvxÅ~܃„ቋ酅傂ØՂÏƒ‚Ѐ„À„ÃɃƒÉ…‚φƒÐŠ„Ί„Ή½ˆ€¼ˆ£„}Ÿz‚vowkg^c_Vg_Lf^Kf^If^Ie_Gf`Hg`DhaElQ6w\A¥]N°hYÖVSÔTQ÷MVÿW`øiaçXPÚA9Ï6.Ö5+Ú9/Ù<-×:+Ï8%Ð9&Ï:&Ï:&×7)×7)Þ3+ß4,Ê0$Ì2&È;*Ê=,ÃB-Á@+¾=(»:%Ã7&½1 êVHßK=Á/ Ï=.Ë>-Å8'È;)È;)Ç8'Æ7&È5%È5%Ë3%Ì4&Ò6)×;.Ý=1Ü<0Ú6,Ú6,ä=4ëD;ù@Eñ8=ñ2:ó4<õ3>ð.9è.9ì2=æ9=ã6:ß76à87è;7ê=9ð95î73ë=<ê<;ç;9å97à85ß74Ü73Ü73Ý84Þ95ä88æ::é9;é9;ì8;ì8;ô5:ô5:î87î87ä=7á:4Ò:/Ï7,Æ9(Æ9(Ã:(Ä;)Ã<)Ã<)Ä;)Ä;)½9 Â>%º<#³5¹;%ÅG1Ð=6Å2+ÿ[hÿWdÿGeÿ;Yö2Xõ1W÷8cý>iÌgm«FLV>4K3)5E87G:E56>./Q-/R.0=< GF*Qs7zœ`—»q£Ç}©ÈŒ¼€—µ“±{žnfƒSVw>Xy@];b†@hŽAm“Fl”Kk“Ji’Pi’PhGeŠDa†Aa†Ad‰Ff‹HfŠJdˆHg‹Kg‹KgŒIeŠGc‹DdŒEhGk“Jm›PoRr U(0!(0!(-&).'-/,02/450783;=2=?4AD=GJCLOXSV_VXoY[rZY…]\ˆab›jk¤rtÁ}̅†ãŠ‹èŠŒð‰‹ïˆˆè„„䀀Ö}}Ӏ́€Î‚†Åƒ‡Æ††ÌˆˆÎ‰†Ó‰†Ó‹…ÏŠ„Έ€¼†~º„}Ÿ~w™{t|rkshd[b^Uf^Kf^Ke]He]He_Ge_Gg`DhaEx]Bx]B›SD¤\MÑQNÕURùOXÿV_çXPÝNF×>6Ñ80Ø7-Ú9/Ø;,Ö9*Ï8%Ð9&Ï:&Ï:&×7)×7)Þ3+ß4,Ë1%Ì2&Æ9(É<+ÂA,Á@+¾=(»:%Ã7&È<+äPBÜH:Ç5&Ë9*Ç:)Â5$Ê=+É<*Ê;*É:)Ì9)Ë8(Î6(Î6(Ò6)Ô8+Ø8,Õ5)Ô0&Ö2(Þ7.ã<3úAFñ8=î/7î/7ñ/:ð.9ê0;í3>ã6:Þ15Ú21á98ñD@÷JFûD@õ>:ç98æ87ä86ã75à85à85Þ95Þ95Ý84Þ95å99æ::é9;é9;ì8;ì8;ó49ò38í76í76â;5à93Ñ9.Í5*Æ9(Æ9(Ã:(Ã:(Â;(Â;(Ã:(Ã:(½9 Â>%¸:!³5¹;%¼>(Ë81Ó@9ÿ[hÿR_ÿ>\ü7Uù5[û7]ú;fû4O7-1A41A4I9:N>?R.0X46PO3gfJp’V¯sÁw¡Å{™¸|™¸|˜¶€ŒªtqŽ^WtDQr9Z{B\€:b†@hŽAl’Ek“Jj’Ih‘Oh‘Of‹EcˆBa†Ab‡BeŠGgŒIg‹KfŠJhŒLiMhJgŒIdŒEfŽGi‘Hm•Lm›PoRqŸT-1",0!,/&,/&-/,/1.25,36-8<-:>/?C4EI:KMJQSPUUaWWc\Zr`^vedŒpo—yy¹„„Ä‹‹áæŽìŽëŠŠä„„ށ~Í~{Ê~€҆ˆÃŠŠÆ‹‹ÇŠÃ‹ˆÁ‹„·Šƒ¶Š€£…{žv†zoujfod`j^PfZLWdJWdJd^Hd^HoXFpYGp\Dq]EwbEq\?‰Q8”\CÑRIØYPÿIOÿKQâ?:ß<7ß6/Þ5.â6,â6,Ý7)Û5'Ò7#Ó8$Ñ8&Ñ8&Ù5)Ù5)à2+á3,Ã7(Ã7(½:(À=+¿@-¿@-À;*¾9(Å3&ÛI<ÚF:Ô@4Ë=/Ä6(¿<*»8&Å:'Å:'Ç:(Ç:(Ê9(É8'Ì4&Ì4&Ö8,Ô6*×3)Ö2(Û3*Þ6-å:2ç<4ñ:>ì59é06ë28ì4<ì4<ä9?ç)1:%B4'H:-G-U;*aa;„„^‹­p˜º}ÃxÃx”°}›·„™³†€šm\uMHa9Nh8\vF_~;dƒ@g@k‘Di“Ih’HcKcKdˆBc‡Ac†Bd‡CgŒIiŽKjŽNjŽNhLiMgJfIeEg‘Gk–Gn™Jq¢Ss¤Uu¦W04%04%/2)/2)/1.02/14+25,8<-:>/>B3CG8HJGMOLQQ]SS_WUm[Yqa`ˆml”vv¶‚‚‰‰ßŽŽä’‘파慅߂Î~{Ê~}Á~ƒ¾„†ÁˆˆÄ‰‰Å‹ˆÁ‡„½…~±‚{®„z~t—xm}peumb^i^Zh\NeYKWdJWdJd^Hd^HpYGqZHq]Er^FoZ=lW:ŠR9™aHÖWN×XOù@Fõ+¾?,Á<+¿:)Æ4'çUHÑ=1Ì8,ÏA3À2$¿<*¿<*Ã8%Ä9&Æ9'Ç:(Ê9(É8'Ì4&Ì4&Ó5)Ñ3'Õ1'Ù5+â:1ç?6ê?7é>6ê37ë48î5;î5;ê2:è08á6<å:@ñVTýb`ÿmhÿhcõSNãA<á6/ß4-Þ71Ý60Þ71Þ71ß82à93ã:7ä;8ã77ä88æ89ç9:é9<é9<ê7;ê7;ï58î47ç77ç77Ý;6Û94Ê:/Æ6+¼8)¼8)¶;)¶;)´;(´;(´;(´;(³9$¸>)­8$¬7#´9*¨-Ç12øbcÿPcùFYô9Tô9TêF_íIbÖK`ÏDYiL>`C5FE1ED0=F17@+@2%>0#G-Y?.kkEiŽ°s‘³v†ºo‰½r¹†¹†Ž¨{iƒVHa9>W/Jd4WqA^}:c‚?fŒ?jCh’HfFbJaŽIb†@c‡Ad‡Cf‰EhJkMm‘Qm‘QiMiMh‘KgJg‘Gi“Im˜Ip›Lt¥Vu¦Ww¨Y78&67%57,57,56056057*68+;?(<@)?C*DH/HJ3Ë3(ÊB2º2"°<%¶B+Á9)Â:*Ä;+Ä;+É:,É:,Î7,Î7,Ð2)Ð2)Õ0*Û60ç;7ê>:è;7ä73ç85ë<9î<<é77à35ã68ãEDëMLÿ{uÿrlïb[ÙLEÐ71Í4.Ü73å@<Þ:1Ý90ß80Þ7/â62â62ä65å76æ68æ68ç7:è8;è8;è8;è7=ç6<î79í68æ:8æ:8Ù?7Ö<4Æ>2Â:.´;*´;*­=)­=)ª=(ª=(©<'©<'¦=(¨?*¡:)¡:)©9.£3(Î=Bûjo÷L^óHZèGYçFXÉV]ÇT[£]UWONX@GQ9LG1JE/HD'D@#7H:K!C[)Tl:s„Nˆ™c£k“¦n²r—ºz¢´Ž“¥u†fRcC?N1BQ4Oa7Xj@_{>d€CgŒ?kCf’Ee‘D`G_ŽFb…Ad‡Cf‰Eh‹GiŽKkMk’Qm”Si’Nj“Oj”Li“Kh”Ej–Gn›JqžMs¦Ws¦Wt§X<=+<=+;=2;=2;<6;<6;=0;=0>B+@D-BF-FJ1IK=MOAPOKRQMWWMZZP]]effnmm“yyŸÀ†„ÅŽ‹ØŽ‹ØŒ‹Ñ‡†Ìƒº|x³zv¨yu§xx®zz°}®€~¯} }yœ|t‹xp‡tjroemm`Zi\VjZKk[Ll[Il[Ib`Kb`Kh]Ki^Lo\Kq^My\Jz]K‘aKŒ\F¦O<§P=Ë>4Ç:0Þ,(à.*Þ5.ß6/ã5.á3,à2'ß1&Ú7&Û8'Ï9!Ð:"Í;$Í;$Ô9'Ô9'Û5)Ü6*º@+´:%¯5 °6!»:'À?,É:,Ç8*Ø>4õ[QâJ?Ð8-ÉA1»3#©5²>'¿7'¿7'À7'À7'Å6(Ç8*Í6+Î7,Ú<3Ù;2Þ93á<6é=9é=9å84á40è96ê;8ì::é77ê=?úMOÿdcÿnmøicãTNÉ<5¾1*Ì3-Õ<6á<8à;7à<3ß;2à91ß80â62â62ä65ä65ç79ç79è8;è8;è8;è8;ç6<ç6<î79í68æ:8æ:8Ù?7×=5Æ>2Â:.²9(²9(¬<(«;'¨;&¨;&§:%§:%¥<'¢9$ 9( 9(¤4)±A6áPU÷fkóHZòGYêI[èGYÆSZÂOVŸYQWODN6EO7MH2E@*:695=N$Rc9pˆVz’`‡˜b‰šd‰œd¢j°p‘´tƒ•omYO`@;L,8G*AP3N`6Wi?`|?eDgŒ?kCf’Ee‘D`G_ŽFd‡Cf‰EjIkŽJjLkMj‘Pl“Rk”Pl•Ql–Nk•Mj–Gm™JqžMt¡Px«\x«\x«\CB0CB0BB6BB6BB:BB:AD3@C2CG,DH-GJ+JM.MO7OQ9SQDUSF[]8[]8\]MbcShgwsr‚zy¥€«„ƒ½…„¾‡„»„¸~|¤wuspqnomŸqo¡tršus›vsˆsp…rlnoikmcYj`Vl\LjZJn\Ho]Iq\Iq\ItXMtXMk^Nk^NjbOkcP~]L^MªZO¡QF»<5¹:3Ì2(Ì2(Õ2#Ù6'à8/ß7.á5+à4*ß5&ß5&Õ9#Ô8"É$Æ>$Í<'Í<'Ô8)Õ9*µE/­='©4 ©4 º6'À<-Ï8/Í6-Ú72ðMHïUMÚ@8ÇC4À<-¡4¬?(À;,¿:+¿7)¿7)Ä6*Ç9-Ñ:1Ó<3âC=áB<ä?;ã>:è<:è<:è88æ66å:3å:3ä84è<8ñLJÿ\Zûfb÷b^Æ?9¾71º4+À:1ÔA:ÚG@Þ<9Ö41à<3ß;2â92á81ä73å84è66é77ê69ê69ê7;ê7;è7=è7=æ7<æ7<ë78ê67â96ã:7Ö?8Ó<5Â>1¾:-­:'­:'¦;'¦;'¢<&¡;%Ÿ;$Ÿ;$š?,’7$–=+”;)™2)ºSJðgnç^eìN]éKZÖMWÒIS¨[Q§ZPlN~kM?Q9*H7#@8ME!Gx7d•Ts·ju¹l…£cv”T‡‹X‘•b‹•c€ŠXWdHGT8;E-8B*:D,?I1JX4XfBd|BiGhŒBlFg“Fe‘D^‘F]Ef‰EiŒHmLmLkMjLiMj‘No˜Rp™So›PnšOmœLožNs£Ow§Sz­^y¬]x«\FE3FE3EE9FF:FF>FF>EH7DG6EI.FJ/IL-LO0NP8QS;USFVTGZ\7Z\7XYI\]Mbaqlk{sržyx¤{z´}|¶~µ|³ywŸqo—mj‰if…ec•fd–igjhkh}hezicef`bg]Se[QiYIk[Ko]Iq_Ks^Kr]JuYNuYNk^Nl_OkcPldQ^M€_N£SH™I>´5.¶70Ï5+Ñ7-Ù6'Û8)Þ6-Ý5,ß3)à4*à6'à6'Õ9#Ò6 É$Æ>$Í<'Í<'Ô8)Õ9*µE/­='¨3¨3º6'À<-Ï8/Í6-Ò/*ã@;õ[SáG?ÊF7ÉE6£6¯B+ÊE6ÉD5È@2Ç?1Í?3ÑC7ÛD;ÞG>ß@:Þ?9ß:6Ý84á53â64ç77é99è=6å:3â62ç;7ïJHñLJÓ>:»&"´-'¼5/Å?6ÉC:Ò?8Ò?8ß=:â@=ß;2ß;2á81â92å84æ95ê88ë99ê69ë7:ê7;ê7;è7=è7=æ7<å6;é56è45á85á85Õ>7Ò;4À,“:(–/&Æ_Výt{àW^ðRaèJYÐGQËBL¤WM§ZP‚oQ‚oQFX@9K3F5!I8$XP,woKv§f‘}Áty½p~œ\g…Ey}J„ˆUt~LZd28E)0=!4>&UN>VO?WP@YRBZSC[TD\UEb[IaZH`XMbZOf\Zlb`rgmvkqznx|pzs}€t~|qyujrmbhh]cbbZaaY__U]]S^ZO^ZO`ZLa[Me]Je]Jg\Fg\Fi]Ei]Ek]Cl^DbfOgkTwVEqP?›ND¥XN°TG²VI©M8¢F1¦;'§<(Ã6,È;1ß12Þ01Û7-Û7-Ü8.Ü8.Ú8-Ù7,×7+Ö6*Õ7+Õ7+Ô8+Ô8+Ò9+Ò9+Ò9+Ò9+¶=,¶=,®9'¦1¨3!±<*¿=-½;+È5+É6,Ó;0ÛC8ÜJ=ØF9Å<*¹0àMEÛH@ÔD;ÔD;ÚE>ÜG@â@;ß=8å33é77ï98î87ä84â62Ü;3Þ=5ÌL?ÆF9¼>0´6(¯6%²9(¹>.½B2Â:,Æ>0×=5Ú@8è96è96ñ56ò67å6;å6;ä79ä79â96â96â92â92Þ5.ß6/à70â92å95å95å97å97é;=ç9;Ý;9Ý;9ÐC<ÎA:»C5·?1¢=+¡<*š>)˜<'”<(’:&‘9%‘9%‡F2@,‰,$0(ÀJJännámpÊVY­RO¬QN™YO˜XN’\P”^R™_Tš`ULa 9N 2IMdv’H–²h »t »t˜°rƒ›]k~QZm@WcKQ]EHNB0:B3:B3>O/RcCZv-¶=,­8&¦1§2 ¯:(¾<,½;+É6,Ç4*Ì4)Ò:/ÙG:àNAÛR@ÙP>ÚG?ÔA9Í=4Í=4Ò=6Ô?8Û94Ø61é77ê88í76ì65ä84ä84ß>6á@8ÃC6¿?2·9+²4&®5$±8'¸=-¼A1Ç?1ÉA3Ø>6Ù?7ç85ç85ñ56ò67æ7<æ7<å8:å8:ã:7ã:7ã:3ã:3á81â92ã:3ã:3æ:6å95å97ä86æ8:æ8:Þ<:Þ<:ÏB;Ê=6¶>0±9+¡<* ;)™=(˜<'“;'’:&‘9%8${:&|;'2*š=5ÄNNÙccÑ]`¾JM©NKªOL™YOšZP”^R•_S˜^S˜^SRg&Rg&\s-yJ–²h£¿u—²k†¡ZiC_w9Sf9H[.CO7=I18>239-:;+@A1<@2:>0:B39A2>O/QbB[w=gƒIn’Ho“Ij“Gj“Gi“Kh’Jk‘Tl’Um”Ql“Pj”Jj”Jj—Fl™HmGmGn Iq£Lu§Rw©TvªXvªXj–[_‹PV‚G[TD[TD[TD[TD[TD[TD[TD[TDZSCZSC[TD\UE]VF_XH_XH`YId^Fc]Ec\Ic\Id\Oe]Pf]Vg^Wh_Zi`[ja\ja\h_Xd[T`WN^ULXVJVTHSQDQOBQN?RO@TQ@VSB\WD]XE_XEaZGd^Hf`Jh`IiaJ`bMgiT}[O}[OªWQ«XR»EA¹C?À=5¾;3¼8+»7*¼8)¿;,Ã>-Ä?.Ù7*Ù7*Ú8+Ú8+Ù9+Ø8*Õ8)Ô7(Ô8)Ô8)Ô8)Ô8)Ò9)Ò9)Ò9)Ò9)¸@0¶>.©:&¡2ž4¥;%³>*µ@,Ã>/¿:+Ä2%Æ4'ÎÒA<ÂB7º:/¨:+¤6'œ=)›<(”=)“<(;&:%8$8$u8#t7"ˆ9,˜I<¶SN»XS±RN©JF›QHSJ’]O•`R“bT“bT•_U”^TfwC{ŒX“¥q¤¶‚ª¾‰ž²}y^Xn=?Q)@R*AP3=L/:C24=,58/58/:;+@A1;?19=/9A29A2=N.QbB\x>i…Kp”Jq•Kl•Il•Il–Nj”Lm”Qn•Ro—Pm•Nk•Ij”Hk˜GmšImImIpŸNt£Rx©Xx©Xt¤Xp T_ˆNU~DNw=`YI`YI`YI`YI`YI`YI`YI`YI^WG^WG_XH`YIaZJb[Kb[Kc\Ld^Fd^Fe^Ke^Ke]Pe]Pd[Td[Tg^Yg^Yf]Xf]Xe\Ud[TcZQbYP[YMXVJTREPNAOL=OL=QN=RO>WR?XS@[TA^WDa[Ec]Gg_Hh`IacNegR{YM€^R±^X°]WºD@´>:À=5À=5À.©:&¢33¢8"°;'´?+À;,¿:+Æ4'Ç5(É7*Ì:-Ë>-Ë>-Þ44Ü22Ö20Ø42Ý97á=;ê<=ê<=î5:ë27ê03ê03å55å55Ù61Ö3.°6'¯5&®6&­5%¬7%­8&²9(³:)Å@1ÇB3×?4ÙA6å95ä84í55î66ê69ê69é77é77æ93æ93å:2å:2à90à90ß:4ß:4Þ;6Ý:5Ü87Û76Ø:9Û=<ÓB=Î=8»;0³3(£5&¢4%š;'š;'“<(‘:&:%8#Œ7#‹6"|?*s6!ƒ4'•F9¯LG®KF©JF¬MI›QHœRI‘\N“^P’aS“bT–`V–`V|Y˜©u¬¾Š¦¸„£nr†QLb1,B,>1C8G*9H+9B16?.9<3:=49:*?@0:>08<.9A28@1%§E,±<(²=)Â8+Ä:-Ì8,Í9-Ò;0Ô=2ñ4;ï29ç27æ16á46á46à35à35è59ç48å58æ69ß;:Û76Ë3.Å-(«:(«:(ª;(ª;(¨;&¨;&ª:&ª:&·:(¼?-Î>3ÒB7à=6à=6è96è96î64î64í74í74ê93ê93æ;3æ;3Ý:1Þ;2Ú=6Û>7×?:Ö>9Ô>=Ó=<ÇD<ÇD<¿E:¸>3¦:-¡5(˜9'š;)’=)‘<(‹='Š<&‡:&…8$…7#…7#}C/o5!x3#ŽI9¡SGOC˜PDŸWK‘YJ‘YJ‹[MŒ\N]R‘_T™`WšaX‚Žf˜¤|›©…€Žj\kNDS62?+$1,8*.:,4<17?45;;199/89)>?/:>07;-8@17?05á>5Ý@9Ý@9Ø@;×?:Ô>=Ó=<Ã@8À=5¶<1°6+¡5(Ÿ3&˜9'š;);';'Š<&ˆ:$…8$„7#„6"ƒ5!v<(n4 }8(”O?¦XLŸQE—OCœTH“[L’ZK‹[M‹[M[P^S˜_VšaXq}Ux„\n|XSa=8G*.= /<(0=)1=/1=/5=28@5>A8>A8;;177-78(=>.9=/7;-7?06>/;L,N_?^z@k‡Mr–Lt˜Np™MqšNpšRo™Qq›Qq›Qq›Oo™Mn™JošKržOu¡Rw¦Vx§Wz©[w¦XqŸVf”K[ŠBU„<_ˆNW€FR{Ae^Ne^Ne^Ne^Ne^Ne^Ne^Ne^Ne^Ne^Nf_Of_Of_Og`Pg`Pg`PibOibOhaNhaNhaNhaNhaNhaNgaKgaKgaIf`HfaDgbEgbEgbEf`Jd^H`[E\WAUS>PN9KJ6IH4EH5FI6EI8GK:FM=GN>FO>GP?OOCRRFWP@^WGƒYI‡]MµOJÅ_ZâFGÝABã77à44Ë=/É;-­D'ªA$Ð7%Ð7%Ð9&Ñ:'Ò;(Ò;(Ñ:'Ñ:'Ñ:'Ñ:'Ñ:'Ñ:'Ð;'Ð;'Ð;'Ð;'º>2¶:.¨=)¦;'’; 6‘:šC'¯B-±D/¿;,¼8)Å.%Æ/&Ò5.Ù<5ë2:î5=è>Aê@CÞDBÜB@ÖB@ÕA?Æ52É85Ë=9Ì>:¿@9¹:3«9.¨6+¢?*¢?*£@+£@+£@)¢?(£='¢<&ª7$¬9&»7*¾:-Ë8.Ï<2Ú=6ÞA:ê93ê93è:3è:3æ;1æ;1à>3à>3ÝC9ÜB8ÓE;ÑC9ÉB<Æ?9À?:¿>9§?2¤*4>55?64=86?:=B;AF?EG9BD6?>*;:&78(=>.8<.6:,6>/6>/:K+N_?^z@j†Lr–Lt˜Np™MqšNq›SpšRpLpLpLn›Jn›JpLt Sx¤W~ª_~ª_x¦^oUd‘N\‰F[ˆE\‰FaˆQY€IRyBg`Pg`Pg`Pg`Pg`Pg`Pg`Pg`Pf_Of_Of_Of_Og`Pg`Pg`Pg`PkdQjcPibOg`Mf_Lf_Lf_Lf_LgaKgaKgaIgaIgbEgbEgbEfaDgaKf`Jc^H`[EZXCUS>ON:LK7DG4DG4CG6DH7BI9BI9BK:BK:JJ>PPDVO?UN>oE5oE5¦@;¿YTæJKßCDä88á55Í?1Ë=/­D'§>!Ï6$Ð7%Ð9&Ñ:'Ò;(Ò;(Ñ:'Ñ:'Ñ:'Ñ:'Ñ:'Ñ:'Ð;'Ð;'Ð;'Ð;'¹=1¶:.©>*§<(“)Á=.Â>/Í6-Î7.Ø;4ÞA:ó:Bõ<Ð64Å1/Á-+¾-*Â1.Ä62Ä62¶70²3,¨6+¨6+ =(¡>)¢?*¢?*¢?(¢?(¤>(¤>(¬9&­:'¸4'¸4'Å2(Ë8.Ù<5ßB;ë:4ë:4é;4é;4ç<2ç<2á?4á?4ÜB8ÛA7ÑC9Î@6Ä=7À93¹83·61 8+œ4'•4$–5%’9'’9'‰;'†8$†=*…<)ƒ<(:&~:'|8%}6$|5#v3"}:)‹H8•RB’PBŒJ<RDš_QYKŽZL‘]P’^Q–]T•\S–YT•XSV^7EM&5>8A";G3:F23=4-7./835>9@E>EJCGI;AC5>=);:&67'<=-8<.6:,6>/6>/:K+M^>]y?j†Lq•Kt˜Np™MqšNq›SpšRpLpLoœKn›Jn›JqžMv¢Uz¦Y‚®c«`v¤\h–NZ‡DVƒ@\‰FcMcŠSY€IRyBhaQhaQhaQhaQhaQhaQhaQhaQg`Pg`Pg`Pg`Pg`Pg`Pg`Pg`Ph_Zh_Zh_Xh_Xh_Vh_Vh`Sh`ShaOhaOhaOhaOhaNhaNhaNhaNg_Hf^Ge_Id^Ha\H\WCRQ=ML8GJ7DG4>E5=D4=F5>G6H0CM5XS6RM0ƒI5¬r^àe]ÕZRçECãA?á?:Ü:5Ë;0Ê:/Ç4$È5%Ê7'Ê7'Ë8(Ì9)Î;+Ð=-Ï<,Ï<,Ï<,Ï<,Ñ;,Ñ;,Ñ;,Ñ;,·2)º5,®=-©8(—8"“4•7™;"°@,®>*¼4(½5)Í4,Õ<4âC=çHBãEFåGHÔFBÈ:6°:.°:.¤=.Ÿ8)¡=. <-š=.˜;,=-=-ˆ?,ˆ?,•>+•>+–?+—@,—@,˜A-œA,œA,Ÿ<)Ÿ<)§8'¨9(³7+·;/Á=1Ã?3Ú=4Û>5ÝA5ßC7ÜD7ÚB5ÔB5ÓA4ÓI<ÐF9ÁC7º<0ª8.¦4* 3,Ÿ2+=-<,‹<+‰:)†;(†;(=*=*|;'{:&x9'x9'x9'x9'u6%t5$z, ?3—OA•M?ŒM>‘RC‘VHRD™ZQ™ZQ’SL’SL™ZU–WR“VQža\QZ-HQ$AK&AK&-1<,EP@X_MU\JLP7CG.@A"<=9:*=>.9=/9=/8@14<-8I)PaA`|Bk‡Mq•Kr–Ln—Kp™MpšRpšRnžHoŸIoŸKoŸKpŸOs¢Rz¦[~ª_‚­fw¢[i“Q_‰G\†F`ŠJdŽNg‘QcŠUZLSzEhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQi`[i`[i`Yi`Yi`Wi`WiaTiaTibPibPibPibPibOibOibOibOh`Ig_Hf`Je_Ic^J^YETS?ON:HK8EH5?F6>E5=F5>G6E5=G/CM5NI,ID'†L8±wc×\TÛ`XóQOèFDá?:á?:ÒB7Ê:/Í:*Î;+Ï<,Ï<,Î;+Í:*Í:*Í:*Î;+Î;+Î;+Í:*Ï9*Ï9*Ï9*Ï9*Å@7Å@7¶E5®=-˜9#’3’4”6¥5!ª:&Ã;/ÌD8ÞE=ãJBéJDéJDßABàBCÏA=Ä62¯9-°:.¥>/¢;,¢>/ <-š=.˜;,=-<,‡>+‡>+‘:'’;(’;'“<(”=)•>*™>)™>)¢?,¡>+¨9(§8'°4(³7+»7+½9-Ó6-Õ8/Ø<0Û?3ÙA4ÚB5ÕC6ÔB5Ê@3Ç=0»=1µ7+¨6,¥3) 3, 3,<,Ž;+Š;*‰:)†;(…:'=*=*|;'{:&y:(x9'x9'w8&u6%t5$€2&‘C7—OA“K=ŠK<PATFRD‘RI–WN”UN–WP›\W•VQRM—ZUT]0Zc6^hC[e@GT:6C)4?.KL:HI7CF5AD3?F6?F6>E5=D4:H14B+?G/DL4H=!NC'ŒXB«wa¹SEÎhZòc_åVRèEFéFGèBDÝ79Ç9+Ç9+È:,È:,È9+Ç8*Æ7)Å6(Ê8+Ê8+Ê8+Ê8+Ë7+Ë7+Ë7+Ë7+Á2.Â3/¶6-±1(¡0 Ÿ.£/ ¦2#Á=1ÇC7ÙD=àKDéLGçJEåFBáB>ÐE@ÎC>ºD:±;1›@.B0“H3’G2ŽG3ŒE1ˆE2…B/~D0|B.wE.vD-‡:*‡:*ˆ;+ˆ;+‰<*Š=+Š=+‹>,“@.’?-•<,•<,›:*<,¢<.£=/µ;0¶<1º>2¼@4ÀB4ÀB4¾C4¾C4°<-®:+¥;-¢8*—9-–8,’:.’:.‡>-†=,„=+‚;)€;+:*}<*~=+z;*z;*x:+w9*s8(r7'p7&p7&‰;1”F<’NAI<‡I<ŒNA’RH‘QG“LF™RL˜SNšUP—^W“ZS‡\S“h_v„S}‹Z|Œ_iyLIY25E;J)L[:crUapS[fHLW9CJ+>E&=@!:=78(;<,7;-9=/9A25=.9J*O`@`|BlˆNs—Mt˜Np™Mp™MpšRpšRq£Ln IlKnŸMt£Uy¨Zz¨`z¨`o™WdŽL[„B[„BcŒJh‘OdK^‡Eb‡SY~JRwChaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQhaQi_^i_^i_]i_]i`Yi`YiaViaViaTiaTiaTiaTiaTiaTiaViaVkcNjbMjbMjbMgbNd_K]ZGYVCNO=KL:FI8CF5?F6?F6=D4"_T8˜dN™eO¤>0½WIï`\ï`\òOPìIJêDFä>@È:,Æ8*Å7)Å7)Ç8*É:,Ê;-Ê;-Ð>1Ð>1Ñ?2Ñ?2Ò>2Ò>2Ó?3Ó?3ÐA=ÑB>ÇG>ÅE<ºI9¼K;ÃO@ÇSD×SG×SGáLEàKDãFAáD?àA=Þ?;ÑFAÌA<·A7¯9/›@.œA/“H3“H3F2ŒE1‡D1„A.|B.{A-uC,uC,…8(…8(†9)†9)‡:(‡:(‡:(ˆ;)Œ9'Œ9'7'‘8(™8(›:* :,¢<.°6+±7,³7+´8,¶8*µ7)²7(±6'©5&¨4% 6(ž4&”6*”6*‘9-‘9-…<+„;*‚;):(~9)~9)|;)|;)z;*z;*x:+v8)r7'q6&p7&q8'A7•G=K>‹G:†H;OB”TJ•UK–OI›TN—RM—RM•\U•\U‘f]¢wn‹™h…“br‚UYiN'O^=crQdsVZiLNY;AL.>E&=D%=@!;>78(:;+6:,8<.:B36>/9J*N_?_{Ak‡Mr–Lt˜Np™MqšNq›SpšRp¢KmŸHmžLr£Qy¨Z{ª\w¥]r Xa‹I\†D[„B^‡EeŽLh‘OdK_ˆFa†RX}IQvBhaQhaQhaQhaQhaQhaQhaQhaQibRibRibRibRibRibRibRibRja\ja\jaXjaXjbUjbUjcQjcQjcPjcPjcQjcQjbUjbUjbWjbWldQkcPkbQkbQjcQhaOb]J_ZGURARO>LK9IH6EF4CD2AB2?@09L.7J,SC,P@)t6)–XK¹XQ<5¥0)µ@9ØWRílgôfeäVUãJOçNSÕK@ÐF;Ê@5È>3Í@6ÑD:ÔF<ÕG=ÚJAÚJAÚJAÛKBÝJBÞKCÞKCÞKCìRRëQQãTPàQMÚQKÚQKßRKáTMäIEãHDçCBåA@ãA>äB?àE@áFAÕJGÍB?µ@7¯:1™B1™B1ŽG3H4ˆE4‡D3†A2„?0~?0}>/y>0y>09-9-€:.€:.;.€.‹?/”<0”<0˜i…Kq•Kt˜Np™MqšNq›SpšRmžLmžLp¡Pv§V|ªay§^pZg”QYƒC[…E`‰GcŒJgŽKgŽKeGdŒF`…RW|IPuBhaQhaQhaQhaQhaQhaQhaQhaQibRibRibRibRibRibRibRibRja\ja\jaXjaXjbUjbUjcQjcQjcPjcPjcQjcQjbUjbUjbWjbWldQkcPkbQkbQkdRibPe`Mc^KZWFVSBPO=LK9GH6EF4BC3@A17J,8K-QA*SC,ƒE8_R±PI’1*±<5µ@9ÓRMñpkÿtsóedðW\ô[`àVKÙODÑG<ÍC8ÑD:ÔG=ÖH>ÖH>ÙI@ÙI@ÚJAÚJAÝJBÞKCÞKCßLDáGGàFFÙJF×HDÓJDÒICÕHAÕHAÝB>ÞC?æBAçCBåC@äB?ÝB=Û@;ÖKHÌA>´?6°;2›D3˜A0‹D0ŒE1†C2…B1„?0ƒ>/}>/}>/z?1z?1‚:.‚:.€:.€:.€O#K\0^qDk~QcyKVl>M_7@R*6E&5D%/6:+89):;+59+8<.;C47?06G'HY9Ws9eGn’Hr–Lp™Mr›OrœTq›SlKnŸMs¤Sx©Xz¨_s¡Xg”Q]ŠGX‚B\†FcŒJfMfJeŒIeGfŽH_„QV{HOtAhaQhaQhaQhaQhaQhaQhaQhaQibRibRibRibRibRibRibRibRjcSjcSjcPjcPjdLjdLjdJjdJjdJjdJjdLjdLjcQjcQjbUjbUlcTkbSjaRkbSlcTkbShaQf_OaZH]VDVQ>QL9NI6KF3HC0FA.6I)7J*a:)pI8´FGµGHÂ0:À.8Ì@CÈÐC<Í@9ÑB<ÒC=ÓB=ÔC>×C?ØD@ØD@ÙEAß>Cà?DÝCCßEEáIHáIHæFFåEEê@Cê@Cî@Bî@BåA@â>=Ø?9Õ<6ÚFFÎ::¶93µ82¢B4=/Ž?0Ž?0Š0y>0y>.x=-w<,v;+w:(v9'};/~<0‚:,ƒ;-Š;,Œ=.’<+“=,9(9(Š;*Š;*‚>+=*~=+}<*€8*7)~6(}5'z4(z4(y5*y5*s3'u5)t8-r6+m5(m5(q<.vA3‡R@ƒN<|O<R?„VF†XHŽTIŽTI“NI—RMVO“ZSjYoZIFP5AK0?N/JY:VhB_qKd{MbyKUm=E]-AV-5J!/?"3C&;F89D67;:598:;+;<,59+8<.;C46>/5F&EV6So5a}CkEq•Ko˜Lr›OrœTq›Sl No£Qr¥Xt§Zq Xi˜P_ŒKY†E]‡G_‰Ib‹IdKfŽHeGdŒCc‹B^ƒPUzGNs@haQhaQhaQhaQhaQhaQhaQhaQjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdQkdQkeMkeMkeKkeKkeKkeKkeMkeMkdRkdRkcVkcVlcTkbSjaRkbSlcTlcTibRg`Pd]K_XFXS@SN;OJ7LG4ID1FA.7J*7J*d=,XGÁST«=>¹'1ÕCMÉ=@Ä8;·;9ÂFDÖ\YàfcÚZ[ÈHIÒIAÎE=ËB:ÍD<ÑF?ÒG@ÐC<Ë>7ÑB<ÒC=ÓB=ÔC>×C?ØD@ÙEAÙEAß>Cß>CÝCCßEEßGFÞFEà@@Þ>>ê@Cé?Bê<>é;=â>=ã?>ÞE?ßF@ÖBBË77³60´71¢B4œ<.>/>/ˆ:-ˆ:-ˆ8/ˆ8/‡81‡81‡:4‡:4:3:3~;2~;2|<2{;1z~Q>TA†XH†XHŒRGŠPE—RM—RMŠQJTMzeTlWFCM2>H-HW8ZiJgySewQXoAQh:Ld4H`08M$-B*:1A$:E79D68<;7;:;<,;<,59+8<.;C46>/3D$CT4Pl2_{AjŽDp”Jo˜Lr›OrœTrœTn¢Pq¥Ss¦Yp£VkšRb‘I[ˆGW„CbŒL_‰I_ˆFaŠHfŽHgIc‹B^†=^ƒPTyFMr?h_Pi`Qi`Qi`QjaRjaRjaRkbSjaRjaRjaRjaRjaRjaRjaRjaRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdTn]Mq`PqdTqdTlcTi`QgaShbTebQebQa_JYWBVR9TP7OI/HB(NE(I@#dH2ˆlV²zm¬tg³[W­UQ´DCµEDÃCDÆFGÎFFÑIIÔJHÕKIÏCDÏCDÔDCÕEDÔE?ÑB<ÍE9ÎF:ÃE6ÄF7ÇG<ÈH=ÓCBÓCBÛ>EÛ>EàBCàBCáCBáCBàECàECáFBáFBáC@áC@áB>àA=â@=â@=â@=â@=ÌF=Å?6±;1¬6,™=0˜3„:1„:1Š71Š71…<-„;,ƒ;,ƒ;,‚:+‚:+€;,€;,:+:+~:-~:-~:-~:-};/};/|8-|8-|8-|8-|:.|:.|:.|:.y9-y9-y9-y9-w9,w9,w9,v8+u9.t8-t8-s7,r6+q5*p6*p6*j2%o7*m5(k3&m8*j5'n9+~I;€TI€TI‡PI‡PI‘MJ’NK”OJ•PKTLRJ~_KbNdcEVU7GY3M_9gT_yLWpFQj@Qf?Mb;HW8BQ28B)4>%38$5:&=>.@A1A?2?=00;-0;-39+5;-9=,;?.=B+>C,S_9coIn‡PuŽWp•Ps˜SqPržQv^~¥f~¥fq˜YcŠK^…F^…F]„E_†GaˆId‹LeŒMeŒMb‰J_†G]„E^€MSuBKm;h_Pi`Qi`Qi`QjaRjaRjaRkbSjaRjaRjaRjaRjaRjaRjaRjaRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdTraQraQobRqdTpgXpgXlfXicUgdSkhWmkVjhShdKc_F[U;RL2SJ-H?"X<&lP:‹SF†NA–>:™A=ÀPOÀPOÊJKÊJKÎFFÎFFÐFDÐFDÚNOÏCDÉ98Ê:9ÑB<ÔE?ËC7Æ>2ÄF7ÅG8ÇG<ÉI>ÔDCÕEDÝ@GÝ@GàBCàBCáCBáCBàECàECàEAáFBáC@áC@áB>àA=á?<á?<â@=â@=ÍG>ÈB9¶@6¯9/™=0–:-„?0‚=.|A3|A3}?4|>3„:1„:1Š71Š71„;,„;,ƒ;,ƒ;,‚:+‚:+€;,:+:+:+~:-~:-~:-~:-};/};/|8-|8-|8-|8-{9-{9-|:.|:.z:.z:.y9-y9-x:-w9,w9,w9,t8-t8-s7,s7,r6+q5*p6*o5)j2%o7*m5(k3&l7)j5'n9+~I;€TI€TI‡PIˆQJ’NK“OL•PK–QL‰NFŠOG|]I€aMmlNkjLasMfxR[uHUoBMf1>2qA5xH<„NBWK–^QšbUµ`Y­XQ²IE°GCÇCAËGEÓB?Ï>;ÑA9ÒB:ÒC;ÔE=ÖE@×FAÚDCÚDCÞBCÞBCÞDDÞDDÝEBÞFCÞFCÞFCÛF@ÚE?ÙD=ØC<ØC<ØC<ÙD=ÙD=ÓF=ÑD;¿C9·;1;.—5(„;,„;,~@1~@1~?0}>/ƒ;/ƒ;/ˆ8/ˆ8/ƒ;,ƒ;,ƒ;,‚:+‚:+‚:+:+:+~:-~:-~:-~:-};/};/};/};/{8/{8/{8/{8/{8/{8/y9/y9/y;0y;0y;0x:/v:/v:/u9.u9.t8.s7-r8-q7,p6+p6+n5*n5*j1&o6+j4(i3'l6*i3'm7+}G;‡QG‡QG‹PHŒQI‘RK’SLUM‘VN…YN‡[PxaOv_MkkQqqWhwXfuVPdAJ^;DX5BV3DU5FW7ES9DR8?I1:D,6>)5=(9=,:>-;=/9;-3=42<36<26<29=.:>/1˜6)…<-…<-~@1~@1~?0}>/ƒ;/ƒ;/ˆ8/ˆ8/ƒ;,ƒ;,‚:+‚:+‚:+9*:+:+~:-~:-~:-~:-};/};/};/};/{8/{8/{8/{8/{8/z7.x8.x8.y;0y;0y;0x:/v:/u9.u9.u9.s7-s7-q7,p6+p6+o5*m4)m4)j1&o6+j4(h2&k5)h2&k5){E9†PF‡QGŒQIRJ’SL“TM‘VN‘VN‰]RŠ^Sv_MnWE``FggMYhIN]>CW4>R/:N+9M*>O/AR2ES9FT:BL4>H0:B-7?*9=,9=,9;-79+3=43=46<26<29=.:>/;@);@)HT0Wc?azCk„Ml‘Lt™Tu¡Rv¢Sz¡bq˜Yd‹L[‚CY€A[‚C\ƒDZB^…F_†GaˆIaˆIaˆI_†G]„E\ƒDW|ILq>Ch5g`PhaQhaQhaQibRibRibRjcSibRibRibRibRibRibRibRibRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdTrfXsgYph]ldYfbYie\qngzwp~}xŒ‡Ÿœ•§¤ª¦›¨¤™¢œš”ˆx{hcfSMR>EJ6>J6;G3:G3=J6BQ/4<-7;-7;-K8)^K<ˆQJVO°HI³KLÎCHÎCHØ?AØ?AÚB?ÛC@ÜD?ÜD?ÜD?ÜD?ÞDDÞDDÜDCÜDCÜDCÜDCÙEAÙEA×G?ÖF>ÔG>ÓF=ÐF;ÐF;ÐH<ÐH<Ö?8ØA:ÊF:ÅA5ª@3¢8+Ž=,<+‚?.‚?.~?.}>-<,<,†:,†:,‚:+‚:+‚:+‚:+:+:+~9*~9*~:-~:-};/};/};/};/};/};/z:0y9/y9/y9/w9.w9.v8-v8-v:/v:/v:/u9.t:.t:.s9-s9-q7,q7,p6+p6+n5*m4)l3(l3(g1%l6*h4'f2%i5(f2%i5(yE8LDMEPI‘RK‹WLŒXMƒ[Oƒ[Os\Lt]Mc\I\UBUZDY^HLXB?K5:F28D05A-5A-8D0*0<(3<72;65:35:38;09<1:?);@*FR.T`<^vBj‚Nn“NwœWw£Tw£Txžak‘T]ƒFW}@YB\‚E\‚E[D^„G^„G_…H_…H_…H^„G]ƒF\‚EVzJKo?Bf6g`PhaQhaQhaQibRibRibRjcSibRibRibRibRibRibRibRibRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdTmaSpdVnf[kcXhd[qmdƒ€y’ˆ¤£ž²±¬ÃÀ¹ÈžÈĹÄÀµ¿¹­¸²¦œŸŒ„qafRMR>?K7:F27D08E17F16E07D27D2;C4=E6BF8CG9D1"M:+p92|E>±IJÀXY×LQÍBGÛBDÜCEÜDAÝEBÝE@ÝE@ÜD?ÛC>ÞDDÞDDÜDCÜDCÜDCÛCBØD@ØD@×G?ÖF>ÓF=ÒE<ÐF;ÐF;ÏG;ÐH<Õ>7×@9ÊF:ÇC7®D7§=0?.<+‚?.‚?.~?.}>-<,<,†:,†:,‚:+‚:+‚:+9*:+~9*~9*~9*~:-~:-};/};/};/};/};/};/z:0y9/y9/x8.w9.v8-u7,u7,u9.u9.t8-t8-s9-r8,r8,r8,p6+p6+p6+o5*m4)l3(l3(k2'g1%l6*h4'f2%h4'e1$h4'xD7LD‘NFQJ‘RK‹WL‹WLYM€XLs\LpYI_XEYR?OT>LQ;>J44@*1=)/;'.:&.:&0<(3?+7C/9E1=I5*0<(0940943814927:/8;09>(:?)BN*Q]9\t@j‚No”OxXw£Tv¢Sp–Yc‰LW}@V|?YB[D[D[D]ƒF]ƒF^„G^„G]ƒF\‚E\‚E[DUyIJn>@d4f`PgaQgaQgaQhbRhbRhbRicShbRhbRhbRhbRhbRhbRhbRhbRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdThbVicWhd[kg^qpk…„›¯¯­ÀÂÁÐÒÑààÞååãæâßáÝÚÛÖÒÔÏËÔ¸­½¡–˜…v}j[_ZFPK7>F/7†IH¡dcÄad¾[^ÊRSÊRSÕNKÔMJàHEÞFCåA?ä@>ÞDFÞDFÝCEÝCEÜBBÜBBÛCBÚBAÙEAØD@ÔE=ÓD<ÐF<ÐF<ÍG<ÍG<Û>7Û>7ÐC9ÎA7·F8°?1•>-8'…>,…>,€?->,€=*€=*ƒ<*ƒ<*€;,€;,:+:+~9*~9*}9,}9,};/};/};/};/{;1{;1{;1{;1w;1w;1v:0u9/t8.s7-r8-q7,q8-q8-q8-p7,n8,n8,m7+m7+o6-o6-l6,k5+j4*j4*h4)h4)f2'k7,f4)c1&e3(b0%e3(uC8”KE•LFŽRJSKYM€XLp]No\MdaP[XGNRAJN=AJ99B12:+08)25.25.06,/5+.6)/7*2:-4)-63-6316027158/7:19=,:>->I)MX8Zr@iOo”QxZu¡VržSiŒT]€HUx@WzB[~F[~F[~F]€H_‚J_‚J_‚J^I^I]€H]€H]€HSwKGk?>b6f`PgaQgaQgaQhbRhbRhbRicShbRhbRhbRhbRhbRhbRhbRhbRjcSjcSjcSjcSjcSjcSjcSjcSkdTkdTkdTkdTkdTkdTkdTkdToi]mg[lh_tpg„ƒ~ Ÿš¼¼ºÎÎÌÍÏÎÞàßññïøøöúöóöòïðëçéäàêÎÃÜÀµ¿¬¢€{vb`[GGO8AI2=J6=J6?G8>F7@A9>?7?;8>:74?18C5H5.D1*o21RQÃ`cÍjmÍUVÍUVØQN×PMâJGàHEçCAæB@ÞDFÞDFÝCEÝCEÜBBÜBBÚBAÚBAØD@ØD@ÔE=ÓD<ÏE;ÐF<ÍG<ÍG<ÞA:Ü?8ÐC9ÏB8¹H:±@2”=,Œ5$…>,…>,€?->,€=*€=*ƒ<*ƒ<*€;,:+:+:+~9*~9*}9,|8+};/};/};/};/{;1{;1{;1{;1w;1w;1v:0u9/t8.s7-q7,q7,p7,p7,p7,o6+m7+m7+l6*l6*o6-n5,l6,k5+j4*i3)h4)g3(f2'k7,e3(c1&e3(a/$e3(tB7”KE•LFŽRJSKYMWKo\MmZKWTCKH7?C2?C29B109(/7(5=.47047039/17-/7*/7*08+19,6A19D4K9:I46E02A,0?*+41,52/4.16047.7:19=,:>-;F&KV6Xp>h€No”QwœYsŸTnšOb…MX{CRu=VyAZ}EY|DY|D[~F^I^I^I^I]€H]€H]€H\GQuIEi=<`4icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUkdTkdTkdTkdTee]ee]stn‘’Œ­¯¬ÃÅÂ×ÛÜéíîñõöôøùûýüþÿÿÿÿýýüúúöó÷óðûàÍóØÅÜʲƴœ§ ƒŠƒfbcDGH)EH-CF+ID1ID1I:3D5.H32M87;@<@àFHàDEÖ:;Ù??Ú@@×B>×B>ÓB=ÒA<ÏB9ÎA8àA;Ý>8ÏA7Í?5¹C7³=1™=.’6'‡>-‡>->-€=,~=)~=)<)<):+~9*}9,}9,|8+|8+{9-z8,{9-{9-y9/y9/y9/z:0z:1z:1v=2v=2u<1s:/r9.q8-n8,m7+m7+m7+l8+l8+l8+l8+j9+j9+g3(k7,o;0n:/j6+g3(d2'e3(c1&h6+b2&]-!_/#^."a3&oA4‹NIPKƒRK‚QJu[Nw]P`ZJSM=>G4-5@"FQ3Vm?i€Rq•Xxœ_qœWi”OZ}GVyCSv@Sv@VyCY|FY|FX{E]€J`ƒM`ƒM\I[~H]€J_‚L]€JSqOEcA9W5icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUleUleUleUkdTee]oog…†€¤¥ŸÀ¿×ÙÖéíîöúûöúû÷ûüûýüýÿþÿþüÿþüÿüùÿûøÿíÚÿæÓîÜÄÜʲÁº¨¡„‚ƒdijKMP5FI.FA.GB/K<5H92L76O:98=9?D@PHE[SPgc¥‰Õ®§êüÿÒÈí±§Û}uÁc[ØPPÙQQêDHã=AÕCDÕCDÜFGßIJÞDFÖ<>×;<Ü@AØ>>Ù??ÖA=ÖA=ÓB=ÒA<ÏB9ÏB9ß@:Ý>8ÐB8Î@6ºD8´>2š>/“7(‡>-‡>->-€=,~=)~=)<)<):+~9*}9,}9,|8+|8+{9-z8,|:.|:.z:0z:0z:0z:0z:1z:1u<1t;0t;0r9.q8-p7,m7+l6*l6*l6*k7*k7*k7*k7*i8*i8*j6+l8-n:/n:/k7,h4)e3(d2'b0%d2'^."]-!b2&^."_1$n@3„GB‹NI‡VO„SLpVIjPCOI9C=-8A.7@-3@/2?.2=/1<.4:04:077577557246116/16//7,/7,,8*/;-3B/7F37I36H23E/1C--61,50-2,-2,03*36-6:)8<+5@"FQ3Ul>jSr–Yxœ_ošUeKX{EUxBRu?Ru?UxBWzDX{EWzDZ}G]€J^K[~HZ}G\I]€JZ}GPnLB`>5S1gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUleUleUleUleUaedw{z•™˜²¶µÉÑÓáéëñùû÷ÿÿùÿÿùÿÿûÿüúÿûþÿùÿÿúÿÿøÿÿøøÿÞôûÚéóÐÜæÃÍÙ±ºÆž›ª„“h^hCNX3CG,AE*HE4IF5I@7H?6C;9SKIia_wu™”¹´°ÓÑÅáßÓ÷ëÝÿúìÿåÛ౧Áfc¥JGÄFJÓUYÔYRÊOHÆE@ÇFAÐFCÑGDÕCCÕCCÖ>=Ö>=Õ?>Ö@?ÕA=ÕA=ÑB<ÑB<Ù@:Ø?9ÎD:ÍC9»F=´?6œ>2–8,‰=/‰=/>.€=-~=+~=+~=+~=+~:-}9,}9,}9,{9-{9-{9-z8,{;1{;1{;1{;1z;2z;2y:1y:1q;1q;1o;0n:/m9.l8-i7,h6+i7,i7,h8,h8,h8,h8,h8,h8,k90k90j8/j8/j8/i7.d4*b2(b3)`1'[,"_0&a5*Y-"\0%pD9yRK~WPwZRoRJYMAOC7;=/46(/:*0;+0<.1=/4<14<17:169068368349338227027008-08--8*/:,2?.5B17F38G46G46G43=20://5+,2(-0%03(37(6:+5?&FP7WmGmƒ]u—dy›hk”Z^‡MVvDTtBRr@Rr@TtBVvDVvDVvDWwE[{I\|JZzHZzH]}K[{IXxFOeN@V?2H3gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSibRjcSjcSjcSkdTkdTkdTleUleUleUleUleUleUmfVmfVmfVgkjƒ‡†£§¦º¾½ÍÕ×åíïòúüôüþùÿÿùÿÿûÿüúÿûýþøýþøÿÿ÷ÿÿø÷þÝõüÛîøÕæðÍÝéÁÎÚ²³Â—ž­‚}‡bdnIMQ6DH-KH7LI8KB9G>5OGEia_Š‚€¢š˜µ°¬ËÆÂÝÛÏèæÚýñãÿýïÿòèÿÝÓÿ¯¬éŽ‹Ù[_¹;?ÈMFÌQJÎMHÆE@ÍC@ÕKHÙGGÑ??Ô<;Õ=<Ô>=Õ?>ÕA=ÕA=ÒC=ÑB<×>8Ø?9ÏE;ÎD:»F=´?6?3—9-‰=/‰=/>.€=-~=+~=+~=+~=+~:-}9,}9,}9,{9-{9-{9-z8,|<2|<2{;1{;1z;2y:1y:1y:1o9/o9/m9.l8-k7,j6+h6+g5*i7,i7,h8,h8,h8,h8,h8,h8,l:1i7.g5,h6-j8/i7.d4*`0&c4*`1'].$`1'`4)V*^2'yMBZS|UNjME]@8H<0D8,9;-8:,-8(.9)/;-1=/4<14<169058/68368349338238127019.19.-8*.9+/<+2?.4C07F37H58I69C84>317-,2(,/$-0%15&37(3=$GQ8\rLs‰czœixšgdSS|BRr@Qq?Pp>Pp>Qq?SsASsATtBUuCYyG[{IZzH[{I]}KYyGTtBH^G8N7*@+gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSibRjcSjcSjcSkdTkdTkdTleUkdTleUleUleUmfVmfVngWngWksu…¢ª­·¿ÂËÕ×ãíïðüüòþþ÷ÿþ÷ÿþúÿùùÿøûÿñøüîøùé÷øèñÿçñÿçðýáëøÜéóÑÞèÆËÑ­·½™œ¢€|‚`X^DGM3CL9CL9=H::E7d]W…~x«¢Á¸³Ê¿×ÏÌâáÜîíèö÷ïõöîúòçÿøíÿöíÿëâᬦ¥pj¤M<«TC»[K¿_OÁRG·H=ÀA:ÆG@ÈA=ÉB>ÍB=ÎC>ÎC>ÏD?ÎC<ÎC<Ò?8ÔA:ËF?ÊE>·F>°?7›>6—:2‰<2‰<2=0€7-77+88,8<.9=/19,2:-4Oo>Oo>Oo>Pp?Qq@TtCXxGZzI[{J]}L]}LWwFOo>DQG5B8(5+gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSibRjcSjcSjcSkdTkdTkdTleUkdTleUleUmfVmfVngWohXohXgoqz‚„“›ž¬´·ÃÍÏÛåçë÷÷òþþóþúõÿüùÿøùÿøúþð÷ûíõöæòóãïÿåïÿåðýáîûßîøÖåïÍÓÙµÀÆ¢¬²ŠnbhNLR8CL9EN;EPBGRD€ys ™“ż·×ÎÉÜÔÑäÜÙíìçø÷òîïçúûóÿþóÿþóÿóêÿðçÿàÚÿÕÏä|ºcR¨H8³SCÃTI´E:¼=6ÊKDÈA=ÉB>ÍB=ÎC>ÎC>ÎC>ÍB;ÍB;Ó@9ÔA:ËF?ÈC<³B:­<4š=5˜;3‰<2‰<2=0€cxYv‹lr’ig‡^QxIAh9Jj9Ll;MmÈE=ÈE=ÇD<ÆC;ÐC<ÑD=ÇF@ÂA;¯@9¨92–<4–<4‰<4‰<4=4€<3~<0~<0~<0~<0};/|:.|:.|:.{9-{9-y9/x8.z:1z:1x90x90w81v70s7/s7/j8-j8-i9-h8,h8,h8,g9,f8+f8+f8+d8+d8+d8+d8+d8+d8+f5.g6/h70h70g80g80i:2k<4d8/i=4b6-`4+nC:vKBsH?tI@7>6180/7,4<16<228.14)25*58-47,46)46)35(35(46)46)-8(-8(-8(-8(-8(-8(-8(-8(.9).9)-8(-8(.9)/:*0;+1<,7C-7C-:A/9@.9=.59*15&.2#09&KTAbv[oƒhd„_YyTGmD=c:If6Li9Nk;Nk;Li9Kh8Mj:OlEb27@;*3. )$feSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSfeSibRjcSjcSjcSkdTkdTkdTleUkdTkdTleUmfVngWohXpiYpiYgpuluz€‹£®²ÁÌÐÓÞâàîîîüüòý÷óþø÷ÿôøÿõüÿïûÿîýÿêüþéû÷îýùðÿ÷ëÿøìÿ÷çÿñáòÝÈáÌ·Á°œ¥”€{tbd]KVYN_bWkvn{†~¨¬¼À±ÜÕÍìåÝþêëÿðñÿòõÿðóüø÷üø÷õÿöøÿùôÿððýìõþíûÿóÿðÖÿðÖÿůÃ|f¦M;«R@¼PD°D8ÂG?ÂG?ÇG>ÇG>ÈE=ÇD<ÆC;ÅB:ÑD=ÒE>ÇF@À?9¬=6¦70•;3•;3‰<4‰<4=4€<3~<0~<0~<0~<0};/|:.|:.|:.{9-{9-y9/x8.z:1y90x90w8/v70u6/r6.r6.j8-j8-i9-i9-i9-h8,g9,g9,e7*e7*c7*c7*c7*c7*c7*c7*f5.i81k:3k:3h91i:2l=5pA9l@7pD;g;2g;2~SJ‹`W~SJpE<5<42912:/5=24:0.4*25*8;025*25*13&13&13&24'46)57*,7',7',7',7',7'-8(-8(-8(.9).9)-8(-8(,7'-8(-8(-8(4@*6B,ÆH<ÁJ2ÁJ2µL6±H2žI4™D/‰F5ˆE4D4~C3€@4~>2„:/ƒ9.‡7.‡7.}:1}:1|90{8/x8.w7-v6,v6,u7,v8-v8-w9.t8-r6+p4)o3(h9/g8.g8.g8.f7-f7-g7-f6,f6,f6,h8.h8.i7.h6-f4+e3*h1,k4/l7/m80i9+j:,f?.hA0`D/gK6^L8r`Lun[‚{hƒ‚pNM;3;.3;.2:-2:-19,19,19,19,08+/7*/7*/7*.6).6).6)-5(.5-.5-.5-.5-.5-.5-.5-.5-.5-.5--4,-4,-4,-4,.5-.5-/;12>45A77C97C56B43@/2?.2?+DQ=WeN\jSSaGGU;DR8FT:Hd>Ie?Jf>Ie=Hd;IeSoFWsJZvN\xP\wVVqPFaB7R3&.1$,/!),heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVfeSgfThdYhdYkd\kd\ldWmeXidNlgQlkWlkWfgaklf{~…’™§±²¸ÂÃÎÖØßçéïóôøüýÿÿÿÿÿÿýüøþýùþÿùýþøúýôøûòöüðöüðöùðöùð÷ùë÷ùëøúâñóÛßãÂÌЯ³¹—‘—uhsUXcE^lUt‚k‰šŠ˜©™¿À»ÒÓÎçèãòóî÷øóúûöûü÷úûöþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúíÿÿìÿÿÿþüÿÿýÿéãíÀºÐxn¢J@¾E:ÀG<ÌH<ÌH<ÆD7À>1¾@4ÃE9ÀI1ÁJ2·N8³J4žI4˜C.ŠG6ŠG6€E5D4€@4~>2„:/„:/‡7.‡7.}:1}:1|90{8/x8.w7-w7-v6,u7,u7,v8-v8-s7,r6+p4)o3(h9/g8.g8.g8.f7-f7-g7-g7-c3)d4*e5+g7-i7.j8/j8/j8/l50l50m80m80k;-l<.hA0iB1dH3lP;dR>weQ}vc‹„q„ƒqLK92:-2:-2:-19,19,08+08+08+08+/7*/7*/7*.6).6).6)-5(-4,-4,-4,-4,-4,-4,-4,-4,.5-.5--4,,3+,3+-4,.5-.5-,8..:01=34@65A36B45B14A05B.BO;P^GQ_HHVIe=Gc:Fb9Gd8He9QmDVrIZvN[wOZuTRmLA\=2M.&.1$,/"*-heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVfeSgfThdYhdYkd\kd\keWlfXkiRkiRikVikVileuxqŽ‘˜¨«²½ÇÉÒÜÞêòôõýÿüÿÿüÿÿÿÿýþþüýüøÿþúÿÿøýþöøûðõøíñ÷ëñ÷ëó÷éôøêõøåô÷äô÷ÜìïÔÛܽÈɪ®±’“–wuyblpYt{k‰€§œ¬¶«ÍÎÉÞßÚïðë÷øóûü÷ýþùþÿúüýøþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúûÿÿûÿÿÿþüÿþüÿûóÿûóùÔÄÊ¥•P=•XE¤M:›D1¶H9Ê\MÏUH»A4ÆB5ÉE8ÃJ?¾E:©B9£<3”A9•B:†A:…@9@9~?8{?7z>6z>6z>6w=2v<1u<1t;0t;0s:/p:.p:.o9-o9-n:-n:-m9,l8+k7*j6)l7/l7/j8/i7.i7.h6-h6-h6-e5+e5+e5+f6,f7-h9/i:0j;1i=4g;2f<0g=1g@/iB1fE2fE2bL5kU>fZDvjT‚€k‘z}€mCF319,19,19,08+08+/7*/7*/7*08+/7*/7*/7*.6).6).6)-5(-4,-4,-4,-4,-4,-4,-4,-4,.5--4,,3+,3+,3+,3+-4,.5-)5+*6,,8./;12>24@46C27D37D2?L:ES6z>6z>6w=2v<1u<1u<1t;0t;0q;/q;/p:.p:.n:-n:-m9,l8+k7*k7*l7/l7/j8/j8/i7.i7.h6-h6-k;1j:0h8.g7-e6,f7-g8.h9/k?6i=4f<0h>2iB1kD3fE2eD1aK4kU>i]GuiS…ƒnŽyor_:=*08+08+08+08+/7*/7*/7*.6)08+/7*/7*/7*.6).6).6)-5(-4,-4,-4,-4,-4,-4,-4,-4,-4,,3+,3++2*+2*,3+,3+-4,)5+)5+)5++7--9-0<03@/5B15B09F4;I27E.2@'1?&7E,>L3BZ8E];H`´Q>³P=Â=6ÆA:ÅF@ÁB<±>;ª7499ž::>=Ž=<€@>~>5p>5p>5p>5o?5n>4n>4n>4l=3l=3i=2h<1g;0f:/f:/f:/q60q60o6/o6/m6/l5.i7.i7.j;1i:0f:/d8-a9-b:.c;/d<0_C5_C5_D3aF5aH2bI3^J2]I1ZN4bVJ]?J]=K^>SfH[nPbtZasYYkUJ\F5F3$5"#,+!*) )(heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVgdSheThdYhdYkd\kd\keWlfXigPkiRlnYoq\pun†œ£©·¾ÄÕßáí÷ùùÿÿùÿÿøüýüÿÿÿÿýýýûÿÿúÿþùúüñóõêéíßâæØÜãÓÛâÒãèÒæëÕéíÖèìÕëëÑççÍÜÚÁÐεÒ͹ÌdzÇĵÍÊ»ÕÒËÞÛÔçæäïîìòóîøùôýþùüýøüýøþÿúþÿúûü÷þÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúÿùüÿõøÿþüÿÿý÷ÿúôÿ÷ïÿîôÿóõôßÿÿìÿéÓʧ‘®eR¢YF¶S@¯L9Ã>7Å@9ÃD>ÁB<³@=®;8Ÿ;;99>=Ž=<A??=tC5p>5p>5p>5o?5o?5o?5o?5n?5m>4j>3i=2h<1h<1h<1h<1q60q60p70o6/m6/m6/i7.i7.f7-f7-e9.e9.d<0e=1f>2g?3^B4aE7eJ9gL;dK5cJ4_K3_K3]Q7cW=lhOvrY„mv{dEN94=(19,19,19,08+08+/7*/7*/7*08+/7*/7*/7*.6).6).6)-5(,3+,3+,3+,3+,3+,3+,3+,3++2*+2**1)*1)*1)*1)+2*+2*+7-*6,)5+(4*)5)*6*+7)-9+,9(/<+2?-3@.3@,2?+2@)3A*4F,8J0>Q5BU9EX:GZ7uC8tB7lG7lG7p>7p>7p>7p>7o>7o>7p?8p?8pA9o@8k?6j>5i=4i=4j>5j>5q60q60p70p70l7/l7/h9/g8.a9-a9-a=/b>0aA2aA2_B2_B2RG3ZO;bWAcXB_U:ZP5XQ5ZS7YX:ZY;jnSrv[x‚icmT0?(4C,2:-2:-2:-19,19,08+08+08+08+/7*/7*/7*.6).6).6)-5(,3+,3+,3+,3+,3+,3+,3+,3++2**1))0()0()0()0(*1)+2*+5-*4,*4+*4+*4++5,,6+,6+,7).9+2=-5@07B26A15@/4?.0?*4C.9H1=L5@P6DT:HX>K[ARbH[kQap[^mXSaPDRA1?0!/ &/,$-*"+(heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVgdSheTjcYjcYkd\kd\keWlfXmmUmmUhmWglVeldszr–›§°µÊÔÖâìîõýÿôüþ÷ûüüÿÿÿÿýøøöÿÿ÷ýýõ÷ùìïñäèìÝåéÚãêØåìÚæíÎèïÐèìÑåéÎçåÎåãÌáÚÈØÑ¿×ÍÁÜÒÆéÞÚøíéþôõÿõöþõøÿ÷úýþùÿÿûÿÿûþÿúýþùÿÿûÿÿûýþùþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúÿüúÿüúûûùûûùòÿÿòÿÿëÿÿæÿúîÿôôÿúÿÿíþ÷åÿïÙÿâÌᩐ¨pW·P?´M<²K<³L=´LC±I@¤A;:4”<8“;7…@9ƒ>7uC8tB7lG7lG7p>7p>7p>7p>7p?8p?8p?8p?8qB:pA9l@7k?6j>5j>5k?6k?6r71q60p70p70l7/l7/h9/h9/d<0e=1d@2d@2aA2`@1\?/[>.RG3]R>h]Gi^HbX=[Q6YR6]V:XW9XW9imRrv[t~eWaH$35D-3;.3;.2:-2:-19,19,19,19,08+/7*/7*/7*.6).6).6)-5(+2*+2*+2*+2*+2*+2*+2*+2**1)*1))0()0()0()0(*1)*1)(2*)3+)3**4++5,,6-,6+,6+,7).9+2=-6A18C39D47B15@/-<'0?*4C,7F/;K1?O5DT:HX>QaGYiO_nY[jUP^MAO>.<- .(1.&/,#,)heVheVheVheVgdUgdUgdUgdUifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYnpXkmUgoXjr[gsinzpƒ‘”œª­»ÄÉÏØÝçïòóûþúþÿûÿÿþÿúýþùÿÿøýýõøúìõ÷éò÷ãïôàêòÛçïØïöÔëòÐëîÑéìÏçåÐÞÜÇÜÔÉÜÔÉáÓÐçÙÖñããúììþòöÿöúÿùýÿûÿþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúýÿ÷ýÿ÷ýÿüýÿüýþÿýþÿýþÿýþÿÿþÿÿýÿÿûóÿüôÿÿìÿýêÿ÷ÛûðÔ¸ƒdœgHR6–Y=¤\FU?›L;N=Œ?/Œ?/ƒ@/>-v?+v?+sD0uF2r=7r=7s>8s>8u@:u@:r@9q?8r@9r@9q@9p?8p?8o>7n?7m>6j8/k90j:0k;1g=1g=1b>0b>0]@0\?/_H6_H6Q?+L:&I8$A0QS;MO7HK0JM2Z[H=5B04A/1>,/<*1?(7E.AO8HV?N\EUcL[hVXeSKWI:F8.:0(4*&/*%.)%.)heVheVheVheVgdUgdUgdUgdUifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYlnVjlThpYks\htjp|r†”— ®±¾ÇÌÒÛàéñôôüÿúþÿûÿÿþÿúüýøÿÿøýýõùûíöøêóøäðõáéñÚæî×éðÎäëÉäçÊäçÊãáÌÜÚÅÜÔÉÞÖËçÙÖíßÜõççýïïÿôøÿ÷ûÿùýÿûÿþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúýÿ÷ýÿ÷ýÿüýÿüýþÿýþÿýþÿýþÿÿþÿÿþÿÿüôÿýõÿÿìÿÿìÿùÝÿôØÿçÈ少¯rV–Y=žV@ XB¡RAŸP?’E5‘D4ˆE4†C2|E1yB.pA-o@,t?9s>8t?9u@:t?9q<6p>7sA:q?8q?8o>7o>7n=6n=6m>6l=5m;2m;2m=3n>4j@4i?3eA3d@2dG7]@0]F4_H6O=)G5!G6"D3IK3HJ2DG,BE*LM.Z[9F48E35B02?-1?(4B+:H1?M6JXAQ_HWdRUbPJVH;G90<2*6,(1,(1,'0+gdUgdUgdUgdUheVheVheVheVifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYkmUikSgqYku]hukq~tˆ—š¤³¶ÀÉÎÔÝâêòõõýÿúþÿûÿÿþÿúüýøÿÿõüüòùüëöùèò÷áîóÝçï×ãëÓáçÅÜâÀÝÝÃÞÞÄàÚÌÝ×ÉßÖÑãÚÕîâäóçéùîòþó÷ÿ÷øÿøùÿûûÿüüþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúöÿüöÿüûÿþûÿþÿûÿÿûÿÿ÷ÿÿ÷ÿÿùÿÿùÿÿúøÿüúÿÿôÿÿôöÿîòþêÿôÛÿüãÿï×Ù맅l]DU<‹_F’`IˆV?|H2s?)q>)s@+tD.vF0o?5l<2n>4sC9rB8n>4pA7wH>k?4k?4j>3j>3i?3h>2h>2h>2cB3cB3cC4cC4`E4`E4[F3ZE2^M9SB.VK5^S=OI1B<$B>%EA(=G,?I.=F)8A$=B"KP0\_@fiJ^aBmpQuy^gkPHP84<$4=(=F17?27?27?26>16>15=05=05=06>16>16>16>15=05=05=05=03:23:23:2291291180180180/6..5-.5-,3++2**1)*1))0((/('.''.''.'(/()0)*1**1*/6/-4-+2++2+.5.4;44+8.+5-*4,)3+gdUgdUgdUgdUheVheVheVheVifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYkmUjlTgqYjt\fsio|r‡–™¤³¶¿ÈÍÓÜáéñôóûþùýþúþÿþÿúýþùþþôüüòùüë÷úéò÷áíòÜåíÕàèÐÛá¿ÕÛ¹ÖÖ¼××½ÜÖÈÞØÊäÛÖëâÝøìîüðòÿõùÿøüÿùúÿùúÿûûÿüüþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúöÿüöÿüûÿþûÿþÿûÿÿûÿÿ÷ÿÿ÷ÿÿøþÿ÷ýÿúøÿûùÿÿôÿÿôøÿðõÿíÿýäÿüãÿðØÿðØÿîÕôÒ¹ºŽu}Q8yG0xF/zF0~J4€M8|I4p@*f6 {KAsC9qA7tD:qA7i9/f7-j;1i=2i=2i=2i=2h>2h>2h>2h>2bA2bA2bB3bB3_D3^C2YD1XC0XG3Q@,^S=qfPc]EOI1KG.NJ1:D)=G,>G*9B%;@ DI)UX9adEjmNuxYsw\Z^C=E-4<$7@+;D/8@37?27?27?26>16>16>16>17?27?27?27?27?27?27?27?26=56=55<45<44;34;34;34;329118007//6.-4,,3++2**1)*1*)0))0))0))0)*1*+2+,3,.5.,3,*1*)0),3,1817>7;B;>L;?M';J3AP9GVCHWDBPA9G81>4,9/,6.+5-*4,fcTfcTgdUgdUheVheVifWifWifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYjnUimTfrZgs[aqfiyn•–Ÿ³´¾ÇÌÑÚßèðóòúýøüýúþÿÿÿûþÿúÿÿôÿÿóüÿìúýêöûäïôÝåîÑàéÌÙܽÒÕ¶ÑѹÓÓ»ÚÓÉßØÎéàáòéêýôùÿ÷üÿûÿÿýÿþÿúýþùüÿöýÿ÷þÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúúÿÿúÿÿýÿþýÿþÿþúÿþúÿý÷ÿý÷ÿûõÿûõÿü÷ÿýøþþüÿÿýûÿþúþý÷óòÿþýÿþøÿþøÿüïÿùìõè×âÕÄȶ ®œ†v`qXBfI7fI7mNG*>G*@E%BG'LM.ST5wvXzy[nnTTT:@B,?A+>A.:=*7?27?27?27?26>16>16>15=06>16>16>17?27?27?27?27?28?78?77>67>66=56=56=56=54;34;33:229107//6..5--4,+2++2+*1**1**1**1*+1-,2.+1-+1-*0,+1--3//511733958I6;L9>P:=O9:L45G/1C)0B(3E-8J2=O9?Q;1*:-+5,+5,*4+fcTfcTfcTgdUheVifWifWifWifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYjnUimTfrZfrZ_odgwl•–Ÿ³´ÁÊÏÓÜáéñôòúýøüýûÿÿÿÿûÿÿûÿÿôÿÿôÿÿïþÿîùþçò÷àæïÒàéÌÖÙºÏÒ³ÌÌ´Í͵ÕÎÄÞ×Íëâãöíîÿ÷üÿùþÿýÿÿýÿÿÿûýþùýÿ÷ýÿ÷þÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúúÿÿúÿÿýÿþýÿþÿþúÿþúÿý÷ÿý÷ÿûõÿûõÿü÷ÿü÷ýýûþþüûÿþûÿþýùøÿüûÿúôúõïÿøëÿþñÿýìÿýìÿøâÿñÛúáËéкո¦º‹¡‚pq_{ZG}\ItS@dC0Y:&Z;']>*[<(`D/`D/aE0aE0`E0aF1aF1aF1\K7\K7[L7[L7WL6VK5RL4QK3MK2RP7ilQ}€elrVSY=DM0>G*9F*9F*?H+BK.DI)BG'GH)LM.xwYsrTddJSS9IK5HJ4CF3:=*8@38@38@37?27?26>16>16>16>16>16>16>17?27?27?27?29@89@89@88?78?77>67>67>67>66=56=55<44;33:2291180-4--4-+2+*1*)0))0))/+)/+)/+*0,,2.-3/.40.40-3/-3/0A.5F3;M7=O9=O79K37I/5G-2D,5G/9K5;M7:K94E3.>1*:-+5,*4+)3*ebSfcTfcTgdUheVifWifWjgXifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYimTimTfrZgs[_qehznƒ—˜¤¸¹ÇÐ×Úãêíõøõýÿùýþûÿÿÿÿúþÿùÿÿóÿÿóýÿíüÿì÷ýãîôÚâëÎÛäÇÕÕ¹ÌÌ°ÇıÇıÏÈÂÚÓÍéàåöíòþ÷ÿÿùÿÿþÿÿþÿûÿùúÿøøÿóùÿôþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúÿûÿÿûÿýþÿýþÿ÷ÿ÷÷ÿ÷óÿòóÿòóÿñôÿòøÿ÷øÿ÷þüÿÿýÿÿúÿÿúÿùôÿýøÿÿýÿÿýÿýþÿûüÿöüòóùïþÿóþÿóÿÿïÿÿïÿýîÿ÷èüîáøêÝöåËùèÎÝ̲¡vq`FbQ7^N4YI/ZJ0ZJ0ZL1ZL1[M2[M2YN2ZO3UQ8UQ8UQ8UQ8QQ7OO5LO4KN3JP4NT8]hJdoQQ^@BO1>K-9F(=J.16>17?27?28@38@38@39A49@89@89@89@88?78?78?77>68?78?78?77>67>66=56=56=538227105/.3-,1-+0,+0,+0,+0,,1--10-10.21-10,0/,0/':$-@*5I0:N5;O4:N39M18L04H-5I.8K5:M79L95H5.@0*<,+5*+5**4)ebSebSfcTgdUheVifWjgXjgXifWifWifWifWifWifWifWifWjdTkeUkdZkdZle]le]jgXkhYgkRhlSfrZht\`rfj|p‡›œ¨¼½Î×Þßèïòúýøÿÿûÿÿûÿÿþÿùýþøùùíùùíøûè÷úçñ÷ÝéïÕÜåÈÔÝÀÒÒ¶Éɭ¿¬Â¿¬ÊýÕÎÈæÝâóêïþ÷ÿÿùÿÿýÿÿþÿûÿùúÿøøÿóùÿôþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúþÿúÿûÿÿûÿýþÿýþÿ÷ÿ÷÷ÿ÷óÿòóÿòõÿóõÿóùÿøùÿøÿýÿÿýÿÿúÿÿúÿÿûÿÿûÿþüÿþüÿüýÿùúþùÿõüÿø÷ûìøüíüûéüûéÿøéÿúëÿüïÿüïÿïÕÿúàìÛÁŸŽt`O5RA'XH.XH.[K1\L2[M2\N3\N3]O4[P4[P4SO6SO6SO6SO6OO5MM3JM2IL1IO3KQ5Q\>OZ<K-=J,AN2AN2HQ4IR5IN.IN.ZY;jiKgcFa]@]Y@_[B][FXVAPM69@89@89@89@89@89@89@88?78=77<65:4271051/40.3/-2..3/-2.-10,0/,0/,0/,0/,0/#6 )<&1E,8L3:N3:N39M19M16J/7K09L6;N8:M:6I60B2+=-,6+,6++5*YgMYgM[hN]jP`jRblTfkUfkUfgUefTheTgdSjdVjdVldWmeXjgVjgVjfZjfZjf]ie\geVgeVdiSfkUco[bnZ`qks„~”§®µÈÏÓÛÞáéìïø÷ôýü÷þ÷øÿøüÿòûÿñõøå÷úçø÷ãñðÜïìÙìéÖáÞËÔѾÚͼ̿®¿³§¾²¦Â·µÌÁ¿ÛÒ×êáæøóúü÷þýüÿþýÿýþÿûüÿùýüúþýýÿþýÿþýÿþýÿþþþüþþüþþüþþüÿþúþýùÿüùÿüùÿýøÿýøÿþùÿÿúÿýúÿüùþýûÿþüÿÿÿÿÿÿýýýûûûÿýüþúùÿûõÿþøÿýôÿúñÿøíÿúïþüÿþüÿþþüþþüýÿúýÿúúþýúþýýþÿýþÿÿýÿÿýÿÿýñÿýñÿÿäÿÿäõõÛûûáâáŋŠnSN0TO1RL,QK+TN,TN,SN.SN.QP2QP2PP4PP4ON2ON2OO3PP4LP7JN5EN3DM2GQ6DN3AJ+=F'?F$CJ(FL&FL&QU2PT1KO.HL+TT8bbFbbHZZ@YY?ZZ@[[A[[AZ[/@>/=?2>@3:=2:=28@38@37B47B47D37D37B47B46A36A36A36A37B47B47B47B47B47B48C59D6;F8;F87C97C96C25B16?.4=,2:-08+-4-.5.,8,,8,*=.A#0J4N6Y!7Z"8W.7V-:R:9Q9$+5**4))3(YgMYgM[hN]jP`jRblTfkUglVghVfgUifUheTkeWkeWmeXmeXjgVjgVjfZjfZjf]ie\geVgeVfkUglVdp\fr^gxryŠ„™¬³¶ÉÐÑÙÜàèëïø÷õþýøÿøøÿøûÿñøüîöùæöùæôóßìë×éæÓåâÏÚ×ÄÎ˸ʽ¬Á´£¹­¡»¯£Á¶´ÌÁ¿ÙÐÕçÞãùôûü÷þýüÿþýÿüýÿûüÿùýüúþýýÿþýÿþýÿþýÿþþþüþþüþþüþþüÿþúþýùÿüùÿüùÿýøÿýøÿþùÿþùÿýúÿüùýüúþýûÿÿÿÿÿÿýýýûûûÿþýÿþýÿý÷ÿøò÷íäïåÜõçÜþðåþüÿþüÿþþüþþüýÿúýÿúúþýúþýýþÿýþÿÿýÿÿýÿÿþòÿýñÿÿäÿþãõõÛûûááàĉˆlQL.RM/RL,QK+TN,TN,TO/TO/QP2QP2PP4OO3ON2ON2OO3OO3LP7JN5FO4EN3FP5DN3AJ+>G(AH&EL*IO)JP*NR/OS0VZ9]a@aaE[[?VV@3>@3:=2:=28@38@37B47B47D37D37B47B46A36A36A36A37B47B47B47B47B47B48C5:E7;F8@3;>3;>38@38@37B47B46C26C28C57B47B46A36A37B47B48C58C57B47B48C58C5:E7;F8G63;>38@38@37B47B46C26C28C58C57B47B47B47B48C58C58C58C58C58C59D6:E7;F8G6=F5G6=F5V<2J0+5*(2'%/$ \ No newline at end of file diff --git a/testimages/testimgint1_2.ppm b/testimages/testimgint1_2.ppm deleted file mode 100644 index 391cd8a..0000000 --- a/testimages/testimgint1_2.ppm +++ /dev/null @@ -1,4 +0,0 @@ -P6 -114 75 -255 -0/-10.51.62/83/:3-:3-:3-91.80-80-91.80-80-80-80-6.+5-*5-*4,)4,)4,)4,)4,)/,%0-&2/(30)63,74-96/:70A;/E?3IA4JB5MD5NB2NB2PD4T>1gA4‚D5œD6²D7¿C7ÈE=ÊG?ìBKëDKíCFó?Bø9@ó:?å??Ò>:µ@.´?-´?-°?-«@,¤A,A*—A*’?/‘>.‘>,’<+”?+”=*•>+–?,”?8›?2®C3¾C3º@1¦F8yD6J7(:6584371150-72/61.61-50,.0-//-0/-2.-5,-3)*:+.G8;sCCLK¥Z_¥o‡‹~ª{†¼gjSGoPH`PK_jjr”ž¤˜–˜ŠrsaWVDUQbUQb/.,0/-40-51.61-61-81+81+80.7/-7/-80.80.80.80.80.5-+5-+4,*3+)6.,6.,6.,6.,2/(30)41*52+52+74-85.96/?9-B<0F>3G?2H?0J>0K?/MA1LC2[D4rC1ˆA/—:)§;.´B7¼G=ÝAEãCEìDDö?Cû:?ô;@áB?Ê?8³@-²?,¯>,®?,©@-£@+›@+–@)‘>.‘>.=+<*=+’<+“=,”?+”@6 @4¶B5ÂB5ÀF;£I>rD7G9,=77<6694183062/51.52-21,-2./1.00.10.5//5,-6,-?35a:3~E<PN“fzx£t~¹Z_—NBrNCeOFaPN\osv€…„yjl^VWI\T_\T_,,,.-+0/-3/,3/,4/+4/+6/)3.+2-*2-*3.+4/,4/,4/,4/,3.+2-*1,)1,)4/,4/,4/,4/,41,41,41,52-52-63.74/961<5+?8.B:/B:/D:.F:.H<.K?1GH6RG5aD2u@.‚;)“<+£C3°L=ÏEBÖEBäB@ò;=ú9<ð<=×B;º@1­@,­@,¬>-©>,¥>-ž?+—?+“>)?.>-Ž=,Ž=,Ž=,<+Ž=,?.”B4¥A2½A7ÇA8ºC;›MCcC8<:.A75>63<4183/43/23.23.02-,2.-2./1.00.32040/2,,5//P5*c<-qE<€aq|v¦ox»\_¤OE‚PAlK?cFBYEHQRXVU\TQWKTWL`XV`XV+++,,,/.,0/-1-*1-*2-)2-)2,,1++1++2,,0**0**0**0**2,,1++1++0**2,,2,,2,,2,,30+30+30+30+41,52-74/850:3+<5->5.>5,B8.E8/H<0K?3DE5LE5YB2h>.v;+…9)”>/¡E6¼F<ÇG>ÜD?î@?ò::ç>;ÊD8ª?+§@-¦?,¦?.¥>-¢>.š?-”?+>)>-Œ=,Œ=.‹<-Š=-‰;.‰=/‹?1“E1¨B4ÁB;ÃB=¸OK›_WeTJ>H=@72=6094.63.43.13./4..3--3/-3/.3/02/00.2200/-0/-=.)K5*]B;~k~Š‡¼zÏkn½OL“J=iFBMBLMLWQNXOR\QaYLaYL,-/,-/---.-+/.,0,)/+(/+(/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*0,+1-,1-,1-,1-,1-,0,)2.+3/,3/,2.+2.+40-62/80-;4.=4/>5.?4.B5-E80H;2G>5M?6U=3^8/n8.~8,;0š>1§A3´D8ÉF<ÞC>çB@ÞE?½C4¡B, A- ?.Ÿ>-Ÿ>.š=,–=-=+Œ>*‹<+‰<,‰<,‡;-†B>5:7.33+34.03,/1,,1+-2.-2./1./1.02/11/11/11/8,6?42SHD‚{’”ljÙrxÂbg§TQpJJdLTa]klq‚|zŠo}p\j]a[Cc]E-.0-.0-.0....-+-,*.*'.*',*++)*+)*+)*,*+,*+,*+,*+,*+-+,-+,-+,.,-.,-/-./-.0,+1-,2.-1-,0,+0,+2.-40/91/;30=31=4/>3/A4.C60E82H94L:6O:5U61e60v6-‰90”<0œ@5 @2®B5ÃE9ÑF?ÍH?³E8šB.šB.š?-™>,š>/–=-“=.Œ=,Š=-‰<*‡;+„;,ƒ;-;/=2ƒ@7‡D<”J=¥H@³KH°]U¦o“•|‹xao`QSEGI;=?224)01)./)./*0/-//-//-//-//-00.00.00.00.7*>713SUJ‚†‰”²‰‘À€¸…™´‡–|ŽwŒ…‚šŒ’«˜Ž¥‘”€`q_ZV9`\?+/2+/2-.0.......-+-,*-,*-+,,*++)**(),*+,*+,*+,*+,*++)*+)*+)*,*+-+,.,-/-./+*0,+0,+.*)/+*/+*1-,3/.:12;31=32<20=20?1.@2/B5/A62B94D95I62W61i7.;0Œ>1–?6“?4šB4¨D5µE9¸F<¨B6—?1•@,”>-”=,•<.“;-<.‰<,‡;+†:*†:*ƒ:+9-€<1?6ƒD=‡HAI?JDªWS¨tgš˜Š§ˆ€šs~n\hRLUB>E58;022*0-(0**2,,1++1++0,+0,+1-,1-,/.,/.,9(:41*R[>‹sš”Œ› Ž¨Ÿ¡Å«ŸÀ«ŸÁ©³—‹°‘³’Š§ˆ~•yZnUTS7VU9,03,03./1./1000////.,/.,/-..,-,*++)*+)*+)*+)*+)*+)*+)**())'(+)*,*+.,-/-./+*/+*.*),('0,+0,+2.-40/;23<34<21;10<1/=/.>0-?1.:70983:94?82F3,[5*q9,<,‘95?3ŽB2”A1ž>0¨A8 ?6–>4‘@-=+‘;*’<-‘;.;-ˆ:-„;,…9)‚9(9*~8,€=4€A8„H@‰NHHAžPL«d`§ˆv¥„€®‰}ž†thw`YgPHSB=C566.2-)1()4*+2)*2)*2)*0**1++0,+0,+0,+9(241 IV*w‰Yœ{ „°ƒžÌ‹¡Î§Ê¡‡´‰†±„ˆ¯ƒ„¤}sŒlSgKIL/FI,/0*01+12,21,43.63.52-4/+7/,6.,2-*0,+.,---/,+0)*./(//(//)-.*+/+*.-)./*./)--/.../.,2.+4,)7.):/)<2)=4+>5.=4-<3.=2.;0.=/.?10F/':6+.:,45-C++Q'(Y2+]A3vB,†A1”=3•9.<.ŽA/B0?,›83<2‚@0~A/„A1‰=0ˆ:.†:-x<1p;-s@/u;-€>2‹G<‡MAQCšKNm`|Œq~¡Œ¦‰“¥„¢†kzbbY{V[mSRUDG>7<..6',4%,&,,)*,-(,2'/4'03'10(3/)31-..-(HK8xb‰šnŠ¢pˆ¦p’µ}»‰“³†«xƒ©zƒ¦~}˜ynkTcPEI:=A212,23-34.43.65096185083/91.80-4/,3--2./0.1..0+*/2(00*.0*./+,1-,/.*0/*10+0000./0/-3.+81+:1*>4+@6-@7.A8/?6/=4-=2.;0.;0.=20D3,P,.X&/N&.?0-<2)Q0)i-,i;,{<3‰;7‹:6ˆ>5…A6†B5ŠB6Œ?/ˆ?.‡>-ˆ;+‹9+‡:*<)x>(~;2v:/v>/y>0‚B8ŠG>‰JAˆODšNN”l`ƒ‰o| |‚ª‡Œ©‹Ž †…•{c˜j]c\†bTuXE^H6F9*6,%/'5%(4%*2'+/*.,,.)-0&.0%/12,..+&DF8s~`~j›k}Ÿm€¦s‡©v¦s~¦t~¥x}¢yx•vjgRdNBB699-560560671872983<94=:5=84>63<419418307327323121/05,/5,/3--3--3/,40-32-32-43143162/83/<5/?6-C90F90E;2E;2C90A60?40>3/>31?42@72R/5\(4Q,3<714;+F6)Z/)b70s979:„8:~:7}A9B;…@;~E1‚A/ˆ<.‹9-‰7+ƒ:+y?+sA*…2*”G?|90E9}G;K>ƒMCŠTJnoP|wZ‡gŒ—w£~~­ƒ{©‚vžy„nŒn{‹nr…iesZVYHH@5=/&9))3)',+').('-)*,+.*+1(+3)'?;2QTAivZp†`qdr˜gs›iu ktžlz¤ty¢vw›ut’pg€bPdID=5<5-782782893:94;:5?<7@=8@;7B:7A96>95=84=84=85;63941:0/91/91/72.61-52-63.74/540952<94A:4A8/D:0H<0J>2J=4J=4E;2B8/A81@72@72A83>95?<7A>7E<5G90J8,H;+F>+g2*z93?>”C@‘HBƒ?6‚92‹<5A5ƒ?4‚<2=1y?1y?1}=1ƒ:1£31å{¦SMK?nO=jT?sXCƒ`Mc€R“x]¿daÎadÉ~x®–~– ~ˆœws‰”t~˜st–qjŒi`xXS]DDC.C4-;2+11'/0(41*>,,G',N#,OC3`[EgkPk{WhƒXi‹Yo•bq™dpœko™kw vu›vt–upne€_MfFLC=8=<7A>9B?:D?;E@8D=7C<6B;5B;3A81A83@72?82<71;6085.74/96196/=82A:0C;0I=1L@2N@3N@7K>5I<3E;2B90@91@91A:4D;4I81[<7h=7p>7s<5z?7„H>F7œE;Ÿ>5ž=4¢I;£M>£G8¨C7¡AE“9;‡<9uA6lE6wC8‰02¬6BßOOÊEFÅb]‚M?h\BbeFmfIiO·dVäU[ú'Gÿ!Iÿ4TñP`çemâkoÈuqÃztº€u²„w¬€uªum£ca›ST“HO>Bi78Q/-J3-G2-J2.S74]R2gbBrxTu†\nˆ[o^u•cw˜cs–nu—tz™z€šz”{m†id}_OiFUMBRJ?782893<=7@?:A@;C@;DA0M@0M@/O>4L>3H;2E;1D;2B;1@<3A=4Q81’?GÕMaÖR]›>7”H:»KGÛ?J¢E3§@1«;/®>0ªC0Ÿ:&ª=)³;+³6>¼?GºGL£KG;0„4-½AIâ?TÚ85Î65ÉSO•VGqaGppN‚kL¥s\ÿJWý8Jÿ5Nÿ/Jÿ5Oý1Jÿ.Kÿ/Nÿ5Xÿ9ZüA`øEc÷EgöBgüClÿGsÿXzñTsÛ\qªNYf.-Q;09A@;DAGD=HC=HD;KD:LC:KA7J>2I=1F<0E;/E;1D;2A:0@91<71;60;7.<8-@:.D/L?/NA0O?/N=3M<2H:/D:0C;0@<1@>2B?6v94ÎT_í;QÐ*4¤4&’<#´>0×47¥?1ª/¥:(¯9+ÁA6ÊA9Þ>>é:?ä>@ÑD=ÙSJÜ>=é08Ú6*Ñ2,»72³aS€ZC‚^D®bRÜg`÷9EB=HC?HE>ID>JF=MF"Ÿ8/¥6/´=9¶A:«?3§;/ºD:Ã?:Ä>%ä2(ÿ &ÿ"+÷))è3*å3)ë.(Ö7$Ô6*Å:3ÅeYžaN¡YJÜa\ñCLî=CÔ?;¿?4Î@<òAIÿ4Gü5Hõ>6BB8EE9HH@HI;KJ5MM5KJ8JIERP]KI_OF7I?3J@6D;2C:5?74@86;55A62?75>:;===@?;G@6M@/O?(BA/J91P37H599>83D48@)QK3½L>£5& 9& =(¢<&®?+³:)·5'£9)¢;*§B0©B/«>*´?.ÂD5¼8+Í6+Í;.Ó=/â7/ò/-ö/,æ6)Ô=(Ü7#Ñ9$Ã7&ÊD9×JCòRRøAFþ9BàDGÎ@>²<0¨>.¿N>ÖIBí?Aÿ<73=90=9.96/<90>;2?;0F>1K?/P?/P=,8@(>=+@91<73A96Q20t).¥9F¦6(¤9'¢;( :$§<(µ@.½>/Ã;/²>1«:,¬;+¯;,³;+ÄE6Ä<0Ã6,×4+Ö8-Û9.æ3,ô.+ô/)á4&Ï9!Ý2 Û9*Ñ;-Ì?5Ç:3ØD@çIHå??ÕA=Å?6²:,¬;+µ=/×JCä@AüGPñ@FûEQýDVü?[ÿCgÿFoÿLyÿK{ÿExÿMvÿWxúOoùJkØJbӋŽfVGÁ—‹øáÙû÷öøõÿþìÿÿîÿÿõÿÿýþÿýùÿù÷ÿõöýòöîåèÍÉƯ°ª§­¡ª²¥¤¬Ÿ32.10,21,43.77/::2>>4AA7LD9PI9SL:SL(I>(K@,L@2I?6O<6F859830;35;1O4-Š>@¨6>ª<+«@.§>+«>*¬9&º;,Ä:-Î;1Ä>5½8/½9-½7,Æ<1Ê<2Æ2(Ð7/â1)ä3+é4+ð/*ø.*ð/(Þ4#Í7Û1 Ù3%Ö8-Ö?6ÛLDÌC;ÐKBÆA8¿;,¼:*µ:*º?0½=2Ë@;ÝDFìKQí@DöFPÿJYüD\úAaÿHnÿOzÿKxÿP|ÿNwÿTuûNjîLcÿzˆÿšž–KH¿~xüÑËÿööþüÿÿùÿÿùÿÿûÿÿüùÿûøÿúùÿöøÿó÷÷ëíàØÕÔÑÈÕÕÉËÕ;ÈÀ=:385.41*52+74-:70>;2A>5LB6TH:WK;TJ@XQXxw—–œÖ¢«ö£¨ùœŸì—šÝŽÅ‚«hh„UReKIWEDV?+E@*BC1?D=;DCC@UJM^NW`LXXLNCaJ:‰R>Ž@,ª?-­@,°A.±<*¶8)Â8+Î7.Ö92Ð83Ï72Ñ:3Ï60×=5Ò5,Ù;2Ù80ë0'ï0(ô/)÷,(÷-)í2)Ý6&Ï9!Ñ9$Ñ6$Ó7*Ñ7-ßJCç\UÈH=¸>3·=&¸;%»9)Â>1ÈB9ÏEBÓIGÓIIèDEïIMûQ\úM`öE_ûHhÿOvÿPyëZwö[zýVrúQhÿ[lóRbòO`óL^¾pl︵ÿìéÿüûùþÿúþÿýûüýøõÿú÷ÿûúÿôôøéììÞÞåÚÔïéÝùöçæðïÏÙØB>5?;2;7.95,62)73*<71B=7KA7SG7WJ9[MBWMVpp”˜ÙŸ«ÿ«´ÿ­µÿ¬³û¬¯ò ¢ßŒ‹Åtq¨`[‘]TƒVOqEAP@?=?@8@E>;DCFOTMki|œ‚|˜i~ Xc°QO«A1§:#©:'­<*±<*·9*½5'Ë7-Ø:1Ý:3Ü:7Þ;6ß<7â=7å@:ß;2ïKBóQFî6,ï,&ú*(û)(÷0-é4+Ø2$Ó6%Ç<'Ë=)Ð8*Ò6*Ó91ãNHÜNJÀ95·=%º<&¾9(Ä:/Ê@6ÚSMÊICÃF@âHFéOOíQUíMYøRføNhÿPoÿQuíWtü\xÿZtÿSiÿXiÿ[jùH\ÿMcªgaқ˜ûÙ×ûóñ÷ÿýøÿÿýÿüÿù÷þùõÿ÷ôÿööïáááÓÐèÞÕþ÷çÿÿëïø÷ÖßÞGC7D@4@<1=9.95,84+;60@;5H?6NE6VG4YI9@QADdGL‰ai°p¢¼t¢ÂfÈLnÓ>TØ>FÂ8-µ=$­8&±8'¹:+Ã;-Î;1Ù?5à=6ß80×2,Ø3-æ?9ã:3Û4,×3)Ø8,Ö9*ñG:ö93÷))û*-ï--â4-Ù2*Ô0'Ì;*Ñ;*Ö=-Ø3ÐMCËMA¿E:ÕHAÜNJßQPßLRñYeý^rúTlúPkÿJuÿVxÿUoÿ_pý_mõbläfjÓbd}WL¡zs´øèè÷ûú÷ÿÿþÿÿÿùýûûóýúõÿú÷øíëâ×ÑåÛÏÿúçÿÿæñöðÞãÝOI;LF8HB6E>4@91>7/>71A:4C@9LD7RE2WH5WLHc_vƒŠ¾”£è©¬ù­°ý¯²ÿ®±þ©¬ù¢¥ò™œéŽÝ‡„Ëpq±dh˜\XykPc‰JUµQYÏS[ðBcæF`×@QÍ3?åAHÞ>>ËA7ºE3¼A1ÁB3ËC5ÕE:Ø@5×90Ø4+Û4,Ø7/Ý:1Þ7/Ü5,×3)Ó6'Í4$Ò=)Õ>-òA9þ68ù,1ë12Ø/,Ù1.à44ê72ç92à:.×:+ÝE8éTMÖ@AàINÒ>4Ç7,Å;.Á<-½;-ÁB3ÁC4¼>/ÇD:ÏLDÔPKÔNMë^dÿiuùZnøRjÿRxýVpõkxîeoõaoîhsÓ{yŸqb_\Iyg[Ë­«öàâüøùùÿÿÿþÿÿùÿûÿ÷ýþøÿÿúÿüöïæÝìåÕÿýäÿÿäôöëëíâSM=QK=MG9JD8F?5B;3A:4B:7AB2Å9,Æ2&Ï2)Ô3)Ø4+Ü5-Ý?4Ù8.Ü8.×3)Ô4&Î5%Í:&È:$Å:'Ý4-ú68ÿ6<ò;=á98á99å58ý*1ô./ä1*Õ5'Ç3%ïaWÎ@>ÕFHæHEÏ81Æ9/¿=/»>,½@.¹:'¿<*·;/ÀF9ÇLDËKHç`dûitýbrúXmû]tâjs䉆âvvÿo~ïaqõœž·šŒMaH`]NÀ¤£øÛàÿ÷ûýþÿÿýÿÿ÷ÿúÿ÷øþôþþöÿÿöý÷ëøóàÿýäÿÿâýþðûüîXO@WN?TKÖEBá:BÓ>@ÊC?Ð>>ëBGì8Aâ9<Õ;9Ë@;ËE<ÅG;µ:+¼8,È5-Ô0.á32ã=-ß3%ç7(Û4!Î6È7"Ë8(Ñ5)Ó1,Ï7*Ê7%Ñ6$à2'í0.ì+0ê-4õ*.î.-ã5*Ô7&Å2 ÝN>ÚJBÔ@>àQSÓD@É90È9)Æ;(¾9&»>*·>-´:/¹=1½?1ÃA3ñmaíhaïiföpqÿl|ðckó`fõtoý{{ÿVmö€~¥†ThCadI½«Ÿýåãÿ÷úüúýûÿÿüýÿäÿíæÿê÷ÿóÿÿòÿüïÿøçýõàþøàýýýÿÿÿ\PBZN@XL>WK=SG9QE7PD6QE7JF=OI9VK5WL8VMFb_p}€«Œ’Η–Ú—™æšŸñœ¥òœ§ç˜¡Üš›Û—•Þ‘Ϊ…»Èl“ÐG[ÝAEâ@>ã?@ä=DÞ:AÑAAÂ>9ÖKHâ?Bç:>Ú78Í<7Ê@6¿9.ÇG:¹;,½8)Ì8.Ü71ê;8Õ4*Ú6,Ý7+Ö=-Á8%¸;'»<-¾8/ì?;Û=2È:&È:$Ð7%Ô0&Ø1+Õ0.Ù0+Ø6+Î5%Í<'Ì;(ãLA×:5ðLMúdcîYUØD:Æ4'Ã7&º9&¶=,²=,¯;.²<.¶>.¿D5Ü\QëgbïihêcgåTcógp÷djüvuøprýG`ñt„s’sQj@hoP˾­ÿõíÿý÷ûÿúùÿûõüõØýÞÕòÖãõÝôùåý÷çûòáïãÓôé×üùôÿýø\PB[OAZN@YM?WK=VJSLZM=ZM=YLÞIBåDJö;PÔDCÅD>°:.ÊJAÌ73Í/,Ï@8¾D5Ã:(Â;(¿:'Á:&Ç8'Ö9*à5+æ4*ø-1ÿ07ÿ,4ÿ.4ú17ô/9þ0Dý'?ö'/é/0Ô6+Í:*Ñ8*á=3æ;3æ;3ÓK;ÉA1Á8(È9+Ï5+ä?9Ý++í57Õ4*Õ7,Ð8-È8-ØPD¾@2±9+¯;.­<.®>0«<+­<.ÆQGãgeðotör}ûs}÷pwÿnyÿpwõ[gÿ9ZìYlš¥‡{œgˆ™m´¸•ÚÝÀ×æɿظ®É¨£½š¼†—Á£Ç—³Ì¤ÌÕ¸åàÍìÛÓäÌÊ×ƾνµZM=ZM=ZM=ZM=XK;YL]N;\O5ß=8÷?=ø<;ð=@ëAJä?MÅ>8¶=2­<.ÆH<Ö>9Ñ30ÐB8³:)¿8%Ã<)Ã:'Ç:(Î8'×4%ã2(ð91ï3*ô-(ý''ÿ'(ü$)ÿ#2ÿ :ÿ3ö&3é*1Ú,-Ù//í68ö37÷/2ö.0Ö92ßB;Í0)Ï2-Ù72å@<Ù0+ã73Õ<.Ì4'Ì:-È:0æ]SÀ;2½:0¹6,·2)´4'²7(²:,µ?5ßebóuyùwýz‚ûu~ÿq~ÿitöUeÿ9\æO`•œzx™b“b”œu“x}–nq•is—iŸp±uŒ¹~’¾ƒ›½Š¤¹¾À¨ÚÌÃ׿½Ã´¯¶§¢[K;[K;[K;[K;ZJ:[K;[K;\L<]K=^M=]N;^O<^Q@[OC\OI\QOaSlh]‡wo«†|»›„¼¨y¥Áv¡»[‰Ô<9Å?4ÈI8ÚC8ö5î3,Ø9&ß3%é.%í,'ì*+ð(2ú"9ÿ9ð-;ô:GþJUî6Bð,:ù-9õ.3ì+,Ü41Þ97ÿ]\Ú86Ü=:Ù<5Ó6-Ð4'¿6$À8(Ã;/Ä;1ãVOÅ5-Õ>7Õ<4á<8Û>7Î;1¾8,º<0×\Wóuxþ†ùzüyÿpûcróPcÿ6YäM\v~W`~HmPy„Zs‚YfƒUj’^w h‚¥mƒ¯r‰·wŠ¸wº{‘¯}œ§…»²£Ë¶±¬¦ªš”˜[K;[K;[K;[K;ZJ:[K;[K;\L<^K<_L=^M;^O<]N;^N>_O@`PAdN[bUqoi•}v¢ž€¢Ð†ŸämƒâJcÿ:MìGMËD>ÑF?êADô?FäDDÅB:¸>1©:)ª9)Â<1çB@ì<>ß=8æZMËC5¿6&È:,Î8*Ô1(ç:3ì51ê-)è45ð37÷29÷4<ì1<î3Fó.Jÿ2YëÃ?3²<.©:)°?-ËA7á77å.2Þ52æRHìdVÈ>1É9.Ñ7-Û60å61é0.ô43ÿ&Cÿ#Bÿ>þ;ó"Aò*Nò'Tÿ7jü\høZhîM]à9KÞ9I¼,,¦7&˜E%µ:*ÑSEÅ@9Ä:7ÜNJÇ9/Ç8(Ç9%¥?(¦;'©5(ÈH?ÛGCÝ52ë40ò1,ÿ(-ú,,ë2-Ú:.Å7+ÅB:éljÿ‡‰ü}„þz…ÿgyóZlëI^ÿ5VÕEOL_1]wG|a‰”lŒsˆ¨w}¨p~§kƒ§i…¦m„¬m±j‚¶nˆ²s”«}»¾£×˽ªµÉ‹–ª]K7]K7]K7]K7^L8^L8^L8^L8]K?]M>[N=]R@^SA`P@cPBdNCmKIgWbqv–‰¸™Œ¸»šåyyùl[ñO\ëCPóDQìù4Eü%*ý')ý''ø&'ò$(ñ)3è(7÷:NÿcmýX_ðJLÔ=6¿A2«B-“2”3"§60ÇGDÄ44ÖBBØICË>4Ç4*Ï5-¹=1¶0'Ä4,ØC<áI>Û4,í0.ÿ.3ò12ó/0ò0.ä6-Ê8)¹=1ÝjeþŠ‹ø‡‹ÿlÿZvÿNkù=^ñ>^¨LOHV5^€Dvš]z e~§k}¦j|¤h|¢e¡d}¦n~ªk}¬d²cˆ³k‰¯t”³‰¶˜„‘epr]L8]L8]L8]L8^M9^M9^M9^M9_L;aP>\O>YPA[QH^SOeUViY\k]]mi‚y¹…ŒÜ—ŠÙ°‚³Ñ}Šì~qÿaiòKS÷EQñ=Fã6:Ö;7ÇA5¹@/«=,´@3ÆG>¿4-Î70×9.Ù7(Þ9&Þ2.åG<ÕB2Ó;-ê?8î15ù5?ÿDRó/3í)+ð,-í++é-.ä-2òAKýN[åNSèGLá=>Õ:6Ã:0¹?4½D<´94©2,ÌFE×BDëSRÎ=8ÏA7Ò>4ÞA:á=>ç=>è:<íEBÝ<4Ú3+ê3/÷12ô02õ/0ó0.ä6-Ì:+´8,ÝjeÿŽŽû‰þi|ÿVqÿFhú;]éMe€:8P[=c‚Is”[vœaz¢fx¡ewŸaxŸ`| bz£i{¨g{©`~­_ˆ³kŠ°s„¡uq‹hKZU5D?_N<_N<_N<_N<^M;^M;^M;^M;`L3_O8ZN>YRL_X_qjzwm†vk‰otˆt}¨{„Ï…Šè–Œãž€´©w‚¬m[ç\Wö\\öLOí8?ç7:Û<8ËC7ºC/³=1«6,ÍXNÉPE¼9/Ì9/Û9.á5)â3.â>4ßC4à>/ä3+ð/0ô/6ÿQYÿZ^á46è:;ß33Û33Þ9=åFJÇ,2Ë24ßbRBaQAcR@^QH^W^om…y{¤}¸tx¸nq¸uxՋŒÏ§§ÁÃÀ±ØÑ¥áØ¡ß֟Ö̙ġƒµyaÄdVæ`]ëKMç:<æ::Þ63É83Á<5½K@¾WHÒdUÂ@3Ñ4-à3-â30â;3Ü8,á5)ê2(ï/*é2.ã4/Ù>BîRVéIQÿemÿckÿ`hÿekòY\ÿT-YL<]P@^QA`SC`SC`SCaTD^QA\QOcYbqm„xz£v{³mr¶`f°ouÁ‰…樤áÉÇÌäà³íé îçŸâۤʛ¤¤Š—…oœgYÆiböttèLOî?Dì8;Û<8Ó@9¹;/­<.Ô`QÙWIÌ5*Ø4+å=<íJE×4+Ý2(å0'ä-'ß4,Ü>3Å1-ÞFEíQUíMWïMZøXbÿktçLRô-4ú.9ñ'5ÿCQðFOóTYÿ]díDKà72ê;8î<:â62Û:2×90ß82ë97ß;9ã:7æ95Ü3,Ú8-ß7,é1)÷0-ô23÷/1ö0/ë4.Ý?4Á6/ÎHIüu|ÿ[vÿLlý;`ðBc°LV[F5;C+JE1Qa=jTqŽVkOhJi’Lm–Tp—XtœVršSl–Nh’J`‡DUw;Kf3G^0Hb3Pj;UH8ZM=\O?_RB`SCaTD`SCaTD_Xjvrxw¡wy²jqµ\d­iqº…Ïœœâµ·çÎÍÝÛÙÌàÜ¿ÜÕ»Îĸ²§¥†Žƒ~zqri¢ibÛ~yõutø^^ñGHé=9â@;Í=4ÄB5º:-ÎI:Ð>/Ò9+áACû`\Ý@9à91æ5/â4-Ó5*Ä5'º2"Ê=3ÓAAÔ=DàDOñWaú`jäMTì:8ò;?ýBKÿR[Þ3;â8;øDGô38ë83ñ97ï64ä50ß<3Ü;1ã73ë54ä;8ç98è96ß4-Û9.Þ8*ç2)ô/)ð43ó11ô1/ë4.Ý<2Å4/âSWüjuõRmÿ:bÿ7bÜRiLF\TARM9NF3FT3]oGj…PiŒJfŽGg‘Ik”Rn•Vr—Tj‘NcŒH_ˆFYBUs=Tn?\qFWr?Xs@OC3UI9XL<]QAcWGbVFaUEk_Otoxvtv©jo¯]e­em¶yÉŽ•Û¦Ï¬´Ù¶ºÝ¼½Ü¼¹Ö¶­Ê°£Á™Š©utykegvgd…`ZZRÖohÿzuÿigÿPJíD=ÜB:ÕG=¿7+Ç>.Ì=-Ó@.×=?Ô<;Ô;5Ü92æ93à70Ò;0ÇB3¾B(ÅD1Â91Ä57ÜIQèU_êY`ØGLÏ7,Þ:8é<@ç:@ã6:ì8;ù25ÿ,1î73ï31é-+å4.á=4à=4å95í55ì46ï26ï34â0,Ü8,Ý:+ã3&ð1)í53ð31ó1/ë4.Ù6-Í84ùfló[héIeÿ1aÿ7e¼IXW@0RM9[K;M@0>I+O_8c{GeˆFbŠAcEfMi‘SlPeŒK`‰G_‡H_‚H^|HaxLezQ\wB]xC@B7JE?TG?^M=aQ:`UCd^^pn|wqŸws¦hg¡^^¤gf´wuɊ…ߘ’쟛֡Ø¢œØ ›Õ ˜Ñž•Ê™Ã†|®lkqe\]oXR…UK¢XM»ZQÛphï‚{ú€êdcçSQÉ2+Ä6(À7%Ç:)Ó=/Õ9,Ô<.Ï7)Ú:.á90Û7-Ë:)À>(Ã:2ËB:É@8¾5-Æ=5×QHÛULÊD;Ï:"á7*ð,0û'6ÿ(@ÿ'Bÿ"@ÿ?ÿ:ÿ'<ó.8ç9:Û94Þ;4å95é62ì25é54â70Ù5)Û9*Ü9&ß8%â7#ì3.ð3-ï5)æ6)Û9.ÝABÿdtùJgÿ?bÿ6`ìGgv6678&EC4HB48G2FH Y_;csOd€Oa†Cb‹?hŽElPk‘HgŒGf‰Ie„Ie‚JdHeGd}C\.Ë3%×7+Ö6*Í:*Â;'Á7-Ã9/Ç=3Ì?6ÎA8ÏB9ÐC:Ê=4Ò7%ä6/õ.5ý(:û&<ù%<ü":ÿ9ÿ 7ü'9ô5=æ::Û94Þ;4æ95é62ð37ì65ã60Ù5+Ù9)Ú9'Ý8%à7$ß5(á7(ß8(Ú8)Ô7.øW\ÿQhûBdÿ5_÷=b¸DYK)'-8(6=+C<)F@(W`1‡”isˆ_`~J`…@cŒ@jIlPm“JhHh‹KfˆLe„KdGgƒHeFeŠEjJ.4(893B=:LC.Ø=8ÿ]kÿBbÿ9eÿ/[ÝQkc28933/6.4@,=<p^:“¨o­Äma‚Ka†Ai’Fq–Pp”Vn”KhHiŒLi‹Of…Je„Ih†Hg…Ei‘Kn–P(0#/4.764?<7GD;MLJ\^k_`~][ŒWX‘fh²xzÑ‚ß„…ჄׄƒÑƒ†ÉƒƒÍ„€Õ‰×Œ„Ï‹ƒ¶ƒ~•pkr‚PQhZMYhKeaF•WJÉUVãX_îagïtlæaXÔD9É:*Æ;&È=(Î;+Õ7+Ó/&Ï9+Â=*¾;'Ë>-âL>Ð:,Í9+È9)Ç8(Ê8)Î8*Ò:-Õ;/Ú>2×9.è47ö7?ú2?ö-=í/;ë28ï05ó/3ò5;í6:á55Ý86Ü86á96ç77ë46ö5:ï79ã73×6,Ð8*Ï9*Ï9(Ð9(Æ:!Ä>#Ä@)Ë<.îIMÿOhÿ;cÿ2döAb’BK>=8<7;C369>(K[,že¬ÊŠ¦Ã‹…£qbƒJ`…?l’Es˜Rp”Vl‘Kf‹FgŠJi‹Ne‡Jd‡GgŠHgŠFk•MpšR(0!).(/10783=>6FHCQT]Z\u[Yˆdcwvą†ãŒ‹ñ‡‡é€€Ø‚Ñ‚†Æ††Î‰…ÒŒ„ÑŠ€½†|¡yq|ha[i^Lh]Kg_Hj`EuYA¦^OÖTTþR^êZRÕ<6Ù80Ø;,Ð9&Ñ:)Ø6)à3,Î1(É;-ÂA.½<)Ã7(ãOCÊ6*È9+Ê;*É:)Ê7'Í5'Ô8+Û9.Ø4*ä=4ö=Cñ1<ó/=ì1<ä5:ß77ðA>ô<:ê::å97à85Ý86à87æ::ë8;í9<ô5:î79â:7Ð8-Ç9+Ä;+Ä;)Ä;)Â;%¸7!¿>+Î93ÿWeÿ>\ú3\ú;f°HQT905C6G7:U.1QM2t“XŸÃ{Ÿ¾‚”²~l‰YYwA`ƒ?k‘Dl”Mj‘Pg‹Ec†BgŠJfŠLhŒNgŒIgŒFm“JqRu¡V/3$.1*00.45/:<.BD7MONUUa\Zrjh|¿ŒãŽïŠ‡â€}̀}……ËŠÆ‹‡Â‰´…{žyn~odbh\NXeKe]JpYIr\Gq\A‘WAÖWPþEMÜ94á51ã5.Þ6)Ô7$Ô9'Û5)ã2,Ã7(¾9(Á@-Â:*ÔB5Õ>3È:,¿<*Å9(Ç:)Ê8)Í5(Ô6+×3*á81é<6í6:î3:ì3;ç:@êLMù`[óPKæ95ß82ß82á85ä;8ä88è8;ë8<ë8<ñ48é77Ü:5È8-½9*¹<*·<*·<*¹<(¯8$°4(ÜFHÿNaô9VëGbÕJ_cE:ED08?-C5(O5&zwT‘³vÀuœ·„…žtMcA,CG0LM?RQMXXNecnxvž‡…Æ‘ŽÛŒˆÒ‚~¹}y«|µ…³„~¤~vxmun`]k[NkZJb_Lh\Lq[M{\J‹XEªQAÑD;ã1/à40ã5.à2)Ý7'Ð9$Î;'Ô8)Ý5,¸=+³6$¿;,È8-èKDÕ<4Ã;-³<(Á9)Ä8)È9+Ï7,Õ7.Þ71é=9æ74ë97ì9<ë=?øXZúkgÔG@Ð72á<8á:2á83ã73æ66é69ê7;ë8>è7=ï79ç9:Ø=8Æ<1´9)­<*ª;(©<(§<*¡:)ª8.éX_ôI\éG\ÆSZ YSIQ5šA1ŽE2ˆC3…@1€>0z?1‚90ƒ:1;/€ÑFAÎ@<ÒC?ÔC@ØDBÙECà?DßEGàHGãCEì?Cí>Cå??ÛB=Ó>@µ82Ÿ?3>0Š:/‹80ˆ73‡:4€;4:3|<2{=2y;.z2‰QB€Q?†XHSH—RMUQw`PBL3L[M.[t=p‘Js™NrœTq¢Qu¥Yk˜S]‡Ga‰KcŠIfŽHd‰C\~LPr@i`QjaRjaRkbSjaRjaRjaRjaRkbSkbSkbSkbSlcTlcTlcTlcTq_QscVndXicUgdUfaN]XBQK1NB(lP;cW¤LH¼ILÉFKÐHJÓIIÓGJÏ??ÔC>ÌC9ÆG8ÈH=ÔDCÞ>FâBDáCDâDCãEDâDAáB?â@=ä@>ÌC=±:2™;1†>2}B4~>4„93‹82…<-„;,ƒ;-‚:,9-9-~:/~:/}90}90}90|90|90z:0y9/w9.w8/t8.r6,p6+n4)l3(n5*y@5ƒTLˆQJ“OL—PNRJ€_NgcFYiE^wMRi?Ma?1@>23;05;/;=/?C,ZfBpˆTr—RržQz cu›^`†I]ƒFa‡JdŠMdŠM_…HXzHJl:i`QjaRjaRkbSjaRjaRjaRjaRkbSkbSkbSkbSlcTlcTlcTlcTrbSl^QndZkdZnj_…‚sˆ‚rxq^NV>CE/L?.Y=/`8.l:1yC9…LA¨SL·KHÉCBÖB@Ô@<ÔE?×FCÛEFßCDßCDßEEÞFCÝEBÙD>ÚC<ÛD=ÔE?¾B:ž9/‡;-€A2~>2„:1‰90„;,„;,‚:,9-9-~:/~:/~:/}90}90{8/{8/{;1y;0x:/x:/t8.s7-q5+o5*m4)l3(j4(u?3‰PIŽQL’SN‘VPŠ[Qu^LiiO^mNG[8AR2DS6FS9?I19=,;=/9;-5<46<2;=0=@+R^:h€Lp•Pu¡TxžadŠM[D[D`†IbˆKa‡J^„GTvDFh6haQibRibRjcSibRibRibRibRkbSkbSkbSkbSlcTlcTlcTlcTqeYoe[mf^~y›˜“µ²«¸´«®§€qQUD?H5:G3=J89D3:@2=A3Q;.ƒJCµMNÒEKÛ@DÝCCÝEBÜD?ÞDFÞDFÜDCÚDC×FAÔE=ÑG=ÑG=×@9ÉC:ª>2Ž<.ƒ@0€>.ƒ;-‡;.ƒ;-‚:,9+9-~:/~:/}:1}:1z:1y90x8/v7.x90u9/u9/s9.q6.p5-n3+l3*j4*h2(g3(q=2‘LG‘RKVO‚ZPs\N_VERWC@L65A-2>*6B.?H5@I6+KV4d|Hs˜Sx¤Wp“Y[~D]€F^G`ƒIa„J`ƒI^GQuEAe5haQibRibRjcSibRibRibRibRkbSkbSkbSkbSlcTlcTlcTlcTmd[mi`‰†¶¶´ÑÑÑíëìïëèåÝÛغ°ž‹}c^KCH4>J6>F7=>8>966@5K61‹KLÅbeÌTUÙOMâHFçAAÞDFÞDFÝCEÜBBÚDCÔE?ÐF<ÐG=Þ?9ÏB9·B8’9+†>/>-<,„=+‚:,9+9-}9.~:/}:1}:1}:1y:1x90t8.r8-r8-q8-p7,o6+o6-n5,l3*i3)i5*g3(d2'm;0•KHSKƒXOo\M[UEFJ;9A22:-47036/06,2:-9D4=J89F41@+/53162780;>-DO/ayGt˜XsŸT`ƒKVyA[~F[~F_‚J_‚J^I]€HOoF?_6icSicSicSicSicSicSicSicSkbSlcTlcTmdUmdUmdUmdUmdUifaŒˆÃÅÄéíîõùüþþÿÿþüýøõþãÐÞʲ§ „efGGJ/HC0J92N66=?AÚ>?ÙA@ÓB=ÐA;ß@:Ï@8·A7—9-‰=/>-€=,=*9-~8,}9.|8-|90|90z:1z:1w<4u:2q8/p7.m7-l8-l8-l8-l5.p92j5-g2*e3*_/%`0&h8.NI…TMrXKRL<;D34A04<14:0775664350/6.0;-7D39H52D.-3/.3-45-:<.>H-`wKv™_l—RYzETu@XyDZ{F_€K_€K]~I^JMhG9T3icSicSicSicSicSicSicSicSkbSlcTlcTmdUmdUmdUneVneVrts©­®Úßâôüþûÿÿýÿþÿþúÿÿø÷þßçñÎÌØ°žª‚dnKGJ/JG6I@7TJK†|{µ°¬ßÜÓÿõêÿÚÐØzzÌKPÎQMÉHCÒFEØDDÖ=?Ø@?ÕA?ÓB=Ù>9ÐC<¹B:š<2Š<0>.=-€=-9-}9.}9.{8/~;2{;2{;2z;4p:0o9/l8-k7,i7,i7,h8,h8,m80l7/j8/d2)c3)^/%^/%l=3}VQlOGMA58:,/:*2=/5=27:179668338119..9+2?.7E49H57>6.4*/1&57)>H0e{UxšhaŠPVtBTr@VtBWuCZxF]{I^|JZxFGZF/B.gdSgdSgdSgdSgdSgdSgdSgdSkbSlcTlcTmdUmdUneVofWpgXv{¦®±ÔÞàòüþ÷ÿÿûÿúúüñö÷éñÿçïüàçñÏÆ̨•˜yTZ@EL:AL>ƒ|v¸¶ÚÐÏðìéö÷ïÿúðÿóê굯¼eT·UH½MBÃD>ËA>ÐB@ÑC?ÎC>Ô@<ËD@³@;™<4Š<2=2=1=/~:/}9.|90{8/|<3{;2y:3x92m80l7/i7.h6-h8.g8.g8.g8.i70g5.h70e4-c4,]1(]1(rF=YLFA81;8/69.4:.5;/69.57,39/39/19.19,.9+/:,3>.9D4;C44:,13&13%=F1m‚cr’iNuFOl6m>6e90}QHvKB5:349239/36-57,35*35*46)-8(-8(-8(/7(08)/7*08+2:-9B-G4fz_YxVAg>Jg9Nk=Kh:MjES9Jd?Ke>Id;Kf=VqH\vQYrR=V8(-1$)-heVheVheVheVheVheVheVheVheVkdZlc\meXmhTlkWtup¤§°ÌÖØõúýþÿÿÿýþÿþúþýøô÷îíóçñõçóöåððØÑÒ³¦¦Š€„m•‡°·¯ÜÜÚööôýýûþþüþþüþþüþþüþþüüÿÿÿûúÿûóÿÚʸyg£J:¿QDÂH=ÇC7ÁH=¦?6–A:‡@:@9{?7z>6w<4v;3t;2s:1p:0p:0m9.k7,m82l71k60i70i70g6/h70j92i=4h<1iB3fE2iPL3F^>Jb@H`°<<ž::>=€@>tC>mE=q?6q?6p>5o?5m>4k<2h<1h<1q62p62m61i70j92f:1e:1f>4aD6dI8cJ6_K3aR;ojT‚mAJ528.28.17-06,17-06,06,/5+.3-.3-.3-.3--2,,1+,1+-2,,6.*4+,6-/:,1<,5@/2>*5A-;M3DV³H@¢<8”<8…@9uC8nF:q?8q?8q?8p?8qB:m>6j>5k?6r73p62m82i81e:1c?3aA4^A3XK8g[E_S;ZS7[WWeN`mYKXG)5)(..%++heVheVheVheVifWifWifWifWkeWle[md]mgYnmXkpZmwo”Ÿ¥ÇÐÕðõùýþÿÿþüÿÿ÷ùùíòöåèðÛëðÐçêÍäßÌÞÔÊçÙØøéìÿõùÿúÿþþüþþüþþüþþüþþüþþüþþüþþüýÿùýÿþýþÿþýÿÿýÿÿüöÿþìÿôÚן„›]DŸWAžO>ŽA1…@1y@/rA0t=8u>9t?9t?9r@9p?8o>7n=6l:3m<5j>5e?4aA4aG8M:)F5#LN6HH.[Z>_^@\_Bsy_MW?0>'6<25;14:04:04:039/28.28.16016005//4.-2,,1+,1++0*,3,+2++2+-4,-4,1809A6@H=8C34?.5A-BN8Q]IZeUDNC-7.)/+(.*heVheVheVheVifWifWifWifWkeWmd[md]khYkmWjr[lyp–¥ªÊÓÚñöúýþÿÿþúþþôùúêðõßäìÔÝáÀÚÚÀÞØÊæÛÙõéíÿôúÿùüÿüüþþüþþüþþüþþüþþüþþüþþüþþüöÿüýÿþÿúÿÿ÷ÿÿøÿÿúúÿÿöøÿðÿüãýåÍʨ’dM„P:zF0xE0p@,tB9sA8o?5n?5m>4j>3j>3i=2eA5dB6aD6[D4WF4aVBQK5HC->G,>D(DG*abCmmQkoV>C-9B-9?58>47=37=38>48>47=37=36;55:449349316005/-2,+0**/)*/)*/),1+/4.,1+160=B47=38>48>48>49?5:?99>88=78=77<65:4382160.3/,1-+0,,1-,1--10/321548G4?N949?5:@6;A7;@::?9:?99>8:?9:?99>89>86;7273.3/-10-10-10-12-12):'7I31.5-,3+ZgM]iQckThkXghVifWkeWmeZjgVkg\jf]hfYgjUdp\n}x¨¹ÃÚáçôùüúÿùûÿñøùéóòÞêçÔÚÕÂÌ¿®½±¥Ç¼ºâØàûõÿÿüÿüýÿüýÿþþþþþþþþþÿþüÿþüÿüùÿýúÿþúÿýüÿüýÿþÿþüýÿýüÿûøÿòêÿòéÿûÿÿþÿþÿûüýÿþþÿÿýÿÿþòÿþäúø߸´™SN0QK+UO/TO1SO2QP4QM2PP6KO6EM5GP5@I*CJ(HN*RS1TU5]]AZZBYW@[Y@YX58@58C57D3:B78@58@5:B7:B7:B7;C8>F;9D<9D68A06<2284/;/1D&=T&Be-B^6=S>FZ>1H.,3+*1)ZgM]iQckThmYjkYliZmgYog\khWjf[ie\hfYehSdp\v…€£´¾ÓÚàóøûøýùóöëìíÝÞÝÉÒϼÅÀ­Âµ¥É¼³ÚÏÍïåíý÷ÿÿüÿüýÿýÿþþþþþþþþþþÿþüÿþüÿýúÿüùÿüøÿýüÿûüÿþÿÿýþÿþýÿùöéÜÔõçÞÿûÿÿÿýþÿûüþýýþÿÿþÿÿþòÿüâýûä·³šQL/RL,UO/UP2TP3PO3QM2NN4KO6HP8HQ6EN/KR0U[7`kA‡`ovUQU:OO7PN7SQ8XT9XR59A67B47D3:B79A69A6:B7:B7:B7F;=H@>I;?H7=C95A5=P2Vm?Z}EQmE;Q<2C1>P8PcEQeI:Q7180-4,YgM]iQdnVjo[mn\mk\nhZoi]liXieZie\igZfiTdp\tƒ~–§±ÊÓÜìô÷ñ÷óéìáÝÞÎÏ̹ÆÁ®½¶¤ÐóãÖÍóççÿöþÿùÿÿüÿüýÿýÿþþþþþþþþþþÿþüþýûÿýúÿüùþùõÿüûýùúþüýÿþÿÿýüÿú÷øëãýïæÿûÿÿÿýþÿûüþýüýÿÿþÿÿýñÿûÞÿÿ껶 TN4UN1UO/VQ3TP3NM1OK0MM3KO6JR:KT9NW8U\:djFŒ£mœ°ŽvhqRKO6KJ5OJ6TM:UO9RM:LI:EE;=@79A67B45B1;C8:B7:B7;C8;C8;C8=E:?G<=H@>I;>G6=C9:@<6B6=P2Qh:Tw?Lh@3I4+<*6H0L_APdH:Q7,3+&-% \ No newline at end of file diff --git a/testimages/testimgint1_4.ppm b/testimages/testimgint1_4.ppm deleted file mode 100644 index c4eda85..0000000 --- a/testimages/testimgint1_4.ppm +++ /dev/null @@ -1,4 +0,0 @@ -P6 -57 38 -255 -0/-51.72.92,80-80-80-80-5-*4,)5-*5-*1.'41*63,96/B<0H@3JA2MA1YB4†C3«?2ÀF;æCHñAD÷:@Ù?=³@-°?-¦?,˜@*‘>.=+“=,”?+™?6¸B4±E9_>/;5572/62/41,.0-0/-5,-=13yD@œ`l±XT†PGbopuŽ‘†bcSYSa,,,0/-2.+3.*2-*2-*2-*2-*2-*1,)3.+3.+41,41,52-850<5-@7.C9/I=1JG6fA/„;*¢E6ÊE>è@?ò;=ÁB3ª?-¨?, ?.”?+>-Œ=,‹<-Œ=.žB3ÂA;ªPHPF<@6494043.02--3/02/21/3/.P5*sTY|~»YXžJ>fDCUMVQQYNaXQ,-/---.-+/+(.*).*)/+*/+*/+*0,+1-,1-,1-*2.+1-*40-:2/=4/?4.E80J=5V93r7/’;1¦A5ÇD:ÙF?ªC2@.=-–=-Œ=,‰<,‡;-„<0†B7žH;¶OJ¡}mhseKI=77-01+/0+.0-//-00.00.:/7jhiŒ’Äv‚¶hoiyx‚—ˆj{k`Z@,03./1....-+-+,+)*+)*+)*+)**(),*+/-./+*.*)0,+3/.;23<21<1/@2/?82A83X6-;.’>4™A3­C6?3’?-“;-<.‡;-…9)9+>5…IA–KE¨nc¥…|yZfR?E710+2)*1++1++1-,1-,6,-cqMŽœ–º–ŸÆ§Š²‰«†g~bOO312,32-74/72.7/,3--/-.,+0/(//)+.-+/0*///2.+70*=3*?6->5.<1-<1/D1+B0.D,*\4,x>0:3‹?2A3<1ƒ>.ˆ<.€;+w;0v>/†C:†MB–\X~•x‹¨Š€^‹bWpS>D:.-+-)*1(-/*0+,10,+^cL„šl†¨uŽ°}‚¨w~žy`r\?A4671872=:5?:6?74;629527327./50-41,43.540;62@7.G:1G=4C90?61?61D65M34A9.K8*m61‰==„A;„=7B1…;.<,{>,¨KFŠG>tM<VFxwX§xhž˜~…¡{†pxpasYGD39.*./)1-*=&,H@5clQmŠ^r˜erœjw tt“qZsUD;4893=<7B?:D?;FA;F?9F?7D;4B92B92<7194.96/@9/F<0M@0M?4H;2B90?;2\:8œEK„@7¤EAœD6¥=2¤E3ª@2©ªVLjeG…kPæOVÿ+Iý;UôL]äWgØclÐ`lÐQfÁL_DKR3.E=2cZ9yƒ`sŒdx“f„Ž¤{‘|YrRURC671;:5B?:GB>HC=LE=MC9L@4H>2D<1A:2<71<8-C;0K?/O?/M=0F:.A:0A?3¨EHÌ17 <%°=+¥:0¶A8¨AÑFAô>Jü5Hþ9Uÿ;`ÿ?mûArÿFjùTr»WalLA‹~u©«¨«³µ¾¼¿ÚÒÏÙÏק©¦`w][eJ10.762<<4BB8JH71>;6F?5P?-A>-D65>;4h;5«;-¡:'«>*»9+©;,¬>-·?/Á;/Ñ7+Þ7.ô.+Ú7&Ù6#Ë=1ÚFBñADÒA>­<.ÇG<ó@FøDMýAYÿBjýIxÿKwùVuóJkžnnÓ»¯îëòþäýÿóüýøõöíðÒÎ͗“•›74/52+:70@=4OE9TK+¸9*Í9/È91Ç9/Î:0Ñ7-è1)ð/*ò/)Ö7"Ö5#Ó9/ÜMEÅE:»<)»<-ÈA;ÛIJïDJüK]úEdÿNwûUyýSnù\mß`iٞšÿööýüÿÿûúÿûøÿñôêßÝäâÕÐÙÔC?4<8/84+>93MC7WJ:a\p”žæ¬¶þ®µûŸ ãvtµbXGDWD@=[OS‰sš§f„¾IR³<(­:(º;,Ì9/Ý:3Ú72ä=7Ý90äD8ñ91ú**ì1,Ö2&Ê<(Ó:,Ú?:×EE½<'Á9+ÎH?ÅIAßKGæOTøWiþQoÿTwÿXoý\kíWc§unóÞÛ÷ÿýÿüýýúõûðîåØÐÿüèæìèPJ9Â@2Ë=1Ô7.Ù5,Û:0Ú6,Ô4&Ì9%Û;/ü47ç55á55ò21Ü6*ßK?ÖDEÔ=6Ã;/½@.½>-ÃE9ÎMHôdmúXmû[sëtxôftȉ‚baOßÂÄýûþÿúÿúÿöÿþ÷ôîàÿÿãööêXO@TK-´<.¾@2éf^ïijóboöllþbo¶‹„[iFãÑÇÿüùúþýßýåôýìÿøè÷ïÚþýùZN>YM=WK;WK;SK>YL9ZRPsr”„†¶ŒÐ…‡Àqs¬¤Ymù7OáFAí>KÒDBÁB9Ô97ÌC9Á9)¾;'Í:*â6,ó04ô02á34æ2>í/1Ë8(Ñ9+Ý<2ÊB2Å9(×:1ã03Ö71Ò>2ÇC6¯;,¬<.®=-Ú_Xïlr÷nxÿpwûNb½~yxa×ÖºãñØÃÚ¾¢ÍŸ»Ô­äãÎêÙÑßÑÈZM5ÝC9ö:Ý;8×4+Ç8(Ç:0ÔJ@È;2Ë80¼:,ÊOH÷xüyÿkxÿE`¶mdp‹X„hpczŸl‡µw’»¤´Î½µ¯¥¤ZK8ZK8ZK8\M:^K<_N<_P=aP>cQ_uq–º€–òZiÿ9PÓCCæAEÑB<¯;,»=/ç9:âH@ÏG9Ì8,ß6/í1/ü,<ý(<ð,Dü/XùS_ñIZÛ4>´;*ÍE9ÓD@ÑA9Ê9(«<(¹=1Ø?:ë51ù-.Þ7.Å@7øz{üz‚ýdvùA[•VEiP‚‘h~¥p©m†¬oƒµn­yÉ° §¹]L8]L8]L8]L8^M=[O?^RFfSOkZd|ƒ¹§‡¸çwsôP[ñALÝ:;Ã?2­>-Ç<5Õ7.Ú9%äA:Ñ=/ê86û7Eö*-õ)*ì)/ó=LôT\ß@=º?0§8-¹>9×CCÐA9Ò91Ï:6Ý>:Ü;3ò00ô02ë2-Â:,î{xþw…ÿQnôAaqM?jŒPz¢f{£g}¡c}¦j}­a‰²p‰¥[gg_N<_N<_N<_N<`N6\SNql‚xqšt|ª‡‹Ò¥•Â¶Œ|ÏSIëGHä:;È@2´91ÉYMÃ?3Ý6-â70á?0ì1,ú9<ôNRåã4;ðW\ù_kàRNÞ@?ÜG@Ø93û+9ü7>Ý4-ê5.ù.2î1-Â8+çtqûj{ÿAcÓCZWQ9m‰Vwbrš[wž_y¤_x§Y‚ªd~™las]\O>^Q@_RA`SBaTNnjƒwy²mq¸ŒÜÆüäÞ¢Øѝ¬xÃe[ìRTè:;Í<7¸G9ÐVIÕ4,å>8Ü6*è0(ã60ÚACóS[úZdø]cú2<ô1?ùU^üXaá<8â64Ù<3â94è8:å63Ý6-ð0+÷03ñ1.Ì9/ädeþWsû?b”EHCG0bwLp’Vj“Oq˜YtœVo™Og‹KNh8G^4UH8]P@bUEdWGpk‰sv«cj²|ƒË¥«ÛÆÇÙËÅDz¦°yxt‹hbÐoiübbîE@ÐB8Ã>/Ð=-âFGÜ;3ã60Ì:-Â=,Ë;;åMYèSYã:7öCIä7;ù59î73é30ß<3è64ê67æ40Ü8,ì1(ñ33ï2.Ò80ò_gûBdêCaaK=RG5LZ7g…IeFj’Sj‘N`‰G[|E]tHZuB@@6TG>^SAjgrol›`` qrŽŠá˜—Ó™“Ó˜Ë‹‚±n_drWL¸YSãtmözxÛKCÁ8&É:*Õ9,Ò9+Ú8-Ç<)Å;1Æ<2ÎD:ÏF<Ù7(ø*6ÿ'?ÿ!<ÿ#9í6;Ý:5ç85ì44Þ6-Ú9'Þ7$ç5+ã7)áB>ÿQjÿ:a˜;F8<+BA-_h=g~RcˆBkKjIfˆKdIeFcˆC/4-A<8OJDabwYYfh³~€×…†Ö††Ì†Õ„Å}xxUS^bG¹SQèagìqi×K>Ã<(Ì9)Ô6+Ä;)Ô@2Í9+É:,Ê8+Ò;0Ò:/é24ù/=ó1<ø/9õ1;â66Þ95é77ò59Ý6.Ò9)Ô9'Ê<$Ì?-÷MVÿ:dÜB\F678:-de;¥¾…s‘]fŒCq–SjIi‹Nf…IhˆGl–N-0'34/@B7TT`b_ŠƒÔ‹‰ê~͇‡ÇŠƒÆ„zŸndbd_Km\Hˆ[DêQTàA=Û7-Ñ8&Ý5,Æ7)À=+ÔB5Ç9+Ç:)Ì6(×6,â92ð5<ì2=êFGïB>ä86á96å99ë8<î68Ö92¿:)½<)¸:$Ç=3ÿG^î@akC;><0[J8²o•±~YuEe‰Ah‘KeˆDhŒLiŽKj’It¢WA?2??5EG/RPC]]Qzw¢ˆ…Èyv£xt§yqˆob\n[Ll\Mu^N¤L@Ø7/á4.Ý5(Ì<$Õ9*³:'Æ:-âE>¸=+Ã;-Ï;1Þ;6ç98é:7ïLMÔIDÙ;8á:4æ66ê7;è7=è8:Í=4®;)¥:&ž:*ÌOMçHZ£]SHG3R^6v˜\‡˜bWdHGT6i†Dc‘HiŒHlPn—QržOv©ZZQBZQB[RC_VGd[Jj_]qeij^`ZWNYSGaYFi^Hp_O¯RK³?0Ë80Û7-Ù7,Õ7+Ô8+²:*±9(Ê7-ÓD6Ù;8à<:í49â96¹;-´;*Ð@5í76é6:å95â92ã99Ü<<¸<2›<*‘8&†:,ÁUUŸVO˜_Vp„I„œ`Rd:>D6<>1AM7jˆHl”Kn•Tl–Jq¡Mu¦W]†Lf]Nf]Nf]Ng^OiaLiaNiaLhaG`[HOL;JK9ORA^TH­UQß;<¹@+Ô8)Õ9*Ò9)Ñ:)°<-™;"º<-Ñ80ï7?Ü9:Ø58Á61§>+§<(¼:,Ý;6î85ç<4Ú@8Í=<®<1–9(‰<(ƒ8%‚?/™SGZN–]VcmJ6A08?7>>29;.>J4m‹Kq™Pq›OsžOz¦[bJXHi`Qi`Qi`Qi`Qj_]j`WjaRjaRiaL]XEFI8?E7AI4wT>ÛVQàA>Ë9*Ì:+Ï;-Ñ;-¾;3¤;(ÈB7âE@ÍB?¡@0”A1ƒ@-Ž;+“=,œ;+¬:/É<2É?4¶J4nŒLq™Pp Lz¦[h‘OdŒMY~Ji`Qi`QkbSkbSlbXldQldQlbVnbThaQWQAHE4MG/¬BBÉIHæ^`ÒG@ÒE>×FAÛGCáGIÝIGçACáB?Ä>;—A2‰=0‚<2;3=1};-€;,Š:/•9,‘:)„;,€8*{5)v6,q9,‡M?UH—SPn]MP`;YoA;L*:@49;.”A=©HBÀHGÐB>ÎE=ÙCDáCDàECÞC?ßB=ÄA9‘:0?3‡81„;,‚:,9-~:/}90|90z:0x:/t8.p6+l3(p:.ˆQJ“RN‚[LbiJNd>HW89A,=>04<16V?7·PSØJIàEAÞDFÜDCÖE@ÑG=ÔA: >1‚?.ƒ;,‚:,9-~:/}:1y:1v7.s9.r8-p5-l3*i3)k7,’OI€ZO\UE@G74:,6>/6XSP¼©£ì¶¬ÚUXÓIGØBCØ@?ÓB=Õ@:©>4…=.€=,9-|8-}:1{;2s:1m7-l8-j8-l7/g5,a1'd5+~QKSG94?/5;168516/1=/7F307046)Q`?o•ZUuCWwE\|J\|J>V¤=8†<3=1~:/{8/{;2w81j8/i7.f7-d8-i70i81e6.qE767/58-57,08+08+.9+2=-9B146(TbIWzPNk=Ol>ZwIVsE,6.heVheVheVheVhdXmd[khU€ƒÉÑÔúúüÿþúõøïõ÷êååɋt˜ˆááßûûùþþüþþüúÿÿç·­ºTFÃI>ÀH8™C6A7;3z;2u9/s9.o6+j81i70h6/h70j92j@2jUBtq^39/17-17-/5+/4./4..3-.3-.:04@2BO;AO6Ic@Hb;YsNF_B&+/heVheVheVheVjdXmd[mlXŽ””ëóöþþþûûóäèÙèìÓâÝÇÓËÀìãäúúøþþüþþüþþüÿüýôÿýñêØ»xe½G=¨?<Š?7m>6i>5cA5_J9L?,DH/XX49?5:?99>88=75:4051,1--10/325G19K39K53D4-4,\hPfkUjhYnfYkg[ieZemXŒ›žäìïùüóìíÛØÓÀÅ·ªÝÒÖþøÿüýÿþþþÿþüÿýúÿýùÿüûÿýþÿüùøêáÿýÿýÿüþýÿÿþëØÖ½RK.UO/QP4PN5IO5EN1KQ/agC]`CTT5AU0Kk<:M:EXF;>H=0dC2¥A2âBBá=;®?,œ@+>-=-¬B5‚F;:5232./1.5//uKLkj¤SNdci_\VX-.0.-+,*+,*+,*+.,-0,+2.-<20A4.H94w9.¦A5³C7—>,Ž=,„;,„A8¤TK„‰sGK<0/+/.,0/-PMF‰›§~˜‹wwWV:45/:728302012,.10,32.?5,B8/>3/F21K4,€;4ˆ?6†>0<-‡C8M@xc‹ m†fFJ<1,)1+-NO?y™h¥vk†g@>29:4C@;GBAŸ?1§?4¬@3Â::¾:8ÃG?•bMé?Hù>QïKcçLlÔJanE?„‚m–£±¹¬wˆuX[F43/==3OI9kllg‡IDJ>;6H@3C?2ó6:ñ7:æ9?å@DÒKHÓECÖ?8é6:æ5/ò00×XQÿ\t£IKr•[xŸ`z¨`…¦oYi^[N>aTDlhqvº°°ÒÎÇ­ukçWVÑB:ÎB5à=8Þ6-×CAðV^ñ8>ôGMæ74á:4è66å4*ò21ÝMLøFhcG;bzJj“Ok”N\yCPj;A>5^Z[ccŸ€ÔŒÑ‹ƒ´n\RÎa^å`YÇ:(Ï9*Ñ;,È:0Ð@7í04ú)<ò09â96ç53Ø9&Ù9)öGX°;NEG1w\iŽHiŒJf„HhJ780JKCom”„€Ê€|¯sgkm^K¼LAß8/Ô8)¿:+Í?3É:,à93ì²@6ˆ?0ˆ<.’:,¬<0š:,9+v8+ŒNAXPTb>CK4;B0n‘MqŸTdKTyFjaRjaRkbSlcTumb›—ŒjZJnC<¦GC×FCÞDDÙD>±?5‚<0‚:,~:/y9/u9.p6+l6*ŒSL`XE?M4:A/6<0g„Jd‡Ma„JIj=gdSgdSlcTneV²·ºûýøÚØ¿[ZH¯¤¢ï½¶ÎWOÐB>¼?9‚<0}9.z:1m9.h8,i70g80RD;4:.28.2?.39-ZtMSp@[xH1B2heVheVkeYy{pëïòõöîèêÔµ¶¨õõóþþüöîëËq°D:€?9u<5o:2l71f:1eE6gbN28.06,.3--2,/90;G3EZ;NbG%*-heVifWlfZtqîòõô÷æÝÚÉý÷÷þþüþþüþþþÿþùáÆ»«†t{UHeD5]F6TN8JN3VXB8>47=36;5271-2.1628G2=K:+2+akSliZjfZw‚zéïï×ÔÃÜÑÍýüÿþþþÿüùþüýýôïþþþÿýö˜’xTO2LN6OV5r~VRP9KH79A4:B7-DGI?@ysB=jl}iYQV8NKu+nBE1tpkrJwa zR1q!#1O<@?_q+FdYrX&8nfdRx*36uJ_UygSIpKT>0M*yg(*Xd1008jf0-VnQGy&wK zq-3Nd{JnTHk|972t0bt|+4B#sm$O{0$fM6K#ya&Jr z0D!>2%g_C9fq@_h2`SmdAqx=jf6jm)FaSbwJ`11*0|6i?7<$p>{%5F60yCj%=bm_Q z&}ZQwkBzoRcKRC)AB4w+!%9kLeJrX=m3o6#-czS>OwNoPHmHQ$Ha2~AwVr)hVd?j1Jt(rV*>*s*T8SGtsL zwy4-l*>sm(t9gr~YjXJ&EzU3UsasrGOyOaxjFd(Am*A%_krkp<7M&m5bRNm$KJt%C z7d`mh7SGDK8^lz(6>cyVx%F!OaA!_w`9YXHF2BX97#sLLIPH&{?BL3gWH!14Z)EpO zaV8MDkYNP6Cn=;DsDy2^SXBOb>b0?z9rbz!=~WkQ+!~LL9_=+-M!! zog4Y!u$7_Xpd*&kvuHR)hqf4?^TAm!_%FW?XyegRw9PP>r+ls^pAojT6;G2U$H|6Y zP8MhCHh z`DQ=VWMy0@bemngI@x`))vc>ZS#a5njP1y=zvQJh4<@H`N~vyYTIg&AE=R*Oh5f!C zfddgUIojleS(pTp(c!2v9|7L){P&Lm$B7U&$+HjqDy-#dx%a<{aB$bP zQWPWCZPnKe5s5MJ_6+FiUo0C>w#^lSX=Yo2^6AQQLSn)zl+h1|=5GGBA7oS3!CT%M znQxLU4^c%#2_J+=*`3KW<7iNT@u`Awj~IJ50!QiyHr#P}?KQ3y?UFZV%x@m9>O6 z`!$ko40y#G*}M>}L^>N)r!mQQYmlS&V_u68+1tR)$F!U;RQ;3tmGbCjqo{OOKhGt6 zW_d{{>kCB8z2AW44()BWEs*&W4K>HV>I{sOG5aU~97SA5iSkM2FO@yE5%EVa?hw34 zx^4%GUmGMGV+T&|GYfd%82H*#VVYE3)$K@@ppLOQ2iOOHh+KG1hhT*@Qbb$LtehDf zPFzd6`b8a@kb_HoZdS1qB}l&LGHUulVC_49BxR-Uy~MT0d4=m-%H+{wKi7q_ISmz# zbF`iWSnMkH=ga`|cm9f)t+zrSZyqi+$|wd6<@yna3qMBZ9#W+{_Yt0}rW9c3_;;y^ z2sw5piF)T>zG!d;T$qnF<*`W78ipwW-(-sXcK_B>Idg-ru|*qv>NUL_rWrOjrAi=(Wp^+! zbSWBLv3hvx*VqN!1z?wShk!sA>iduK0zoh^6wZTyaMP(HjY$}IHU4J$g#xPre{`ld zsrc?IFuDz8%5E#nv`)I?!u)!ZUqSFWYb@Sz=YSN`b3o0lZPzw@n{@4w9-FoNxE))P zf98T#|H{o>EpD$HUwy$1_rIIgizFu2JtA&?N~L;H!Cb3L@1E#0AZ{3cS5>J09L3Dqz^$ zYenRCmV6d6ULu^$TXdi0tzuFQ4vDIq27FA;2RqBWEEVaaZSkvKnN8z&-ifBCqPo}4 zP^Pzv<Qx+&pke1h2ZW16U0y<>(&}`RpHYBUJ^R zLdTi7d?;UGg}(>O_>NeKNYAY4VzN5DqJQ3oD^fnz4VcpyIMrrB7D;9?9Zwz0LdL_17{I%PVqEC-jIs^Q!d38i^XAyZV!!7jHcaeDX ziD)`GU%^jy)ZBhMT6qpLI*&n=i2ChgH>rfBX#RS59jhUY7E!7w#+G7h$?mZ|HHtWy zkbT}$!C@9gDBnf1ia&oKY^UgHyl+Z7Y6+U&t={iPr2R17U2boF;O^_rfBcrH8bB%5v zk(iPe8OqV^Maa&=>{z0<{qxg1uJGRl!+dCd#|2fHgF2Gl&s$JufagygijLVR$fy0< zb5^iop;7mDa&?p~vp5lE&M!NvLYN74IrT*VfhO`wBwmkfGb`*1I*N|nA^+tF(}dGU zEz7~r>)=i9i4ykwcwFKHnP)yWR>1Avk=60o=`ZWBVW+_NPQBP-!$Unj_51*rwbt8Bt8;H$Ki zXOfIiwwzW>Y(q>uyJ&+D8Iyb8a@BqP5AZUoGkbeMLsfr5X0w?7yj8fz8J>XG-*OMV zwaTxfB*1r4S>!5(Q0KyjLZQvbJ_rk{=~8Ok$XeJym}wMmYP znj-u@Ld><$Zmzc!d%NQtU}b6j(!G+8Hw4mTPS_q~^!?Ml>%mEv5F-a%If!=H^fhBNr2gl~(FXes?w@q)M1&o$jLFKTLN*;Y{^ z9*s{Y!T9~O0o$qq1Z~P18oO5GLX+@u)gXsPZT!X0`1d*hxD0O4`HiIZ!k7HZ(|!jw z;qMbE`}6sd*W|BDkku+|8w^`kSy3sg)7=z{ee@te84r|(k&I3M$nsF4wgLBeleV0} zyPnX4?#f!Q`7JzYgi-eln07C9-`o%jkv`*6aZgOJQhh8sg0d&+_(J@GOY8`bxRh5u z*u}dq^a4oozZUV2UPN;HU+Bf&--2;zrBGDqGBttUr&TnTcicN`)BH-}C$XiDcpWq+ zh2?nr_cVTk#w3+qdTY`45N5h2t9`e+JF#-Gw?jP9JaW#amRM578C}czm<)o5cuw8{ zWQm)Lqch98o(7ioI@UFwHQARC`RoDv4A0DxhR(K$=iLr0R}6wzYMMr150$S!#hlq- zNkbE#Stm-a2j}5MGkn>*>gZe=K%=M-H^cm-(9tj#d%_6sqJC>^;R-!&?>f9Q*#D-3HIQQKl$+U6HeY{ZP#R0xS;L<-T{h*!>F@5CDVnAdJ-={QrjO(oCTSqIGUN zB95#dP}lnuMuJAhcRCP?8T)_su)V$mAKEn7JbVb`uM%(h6fhrI<-EtMdX@T`Jg{V! zi-z4)6s_7`t#6fTJ;7UU&1lziQrCMs)v7E;qg$Dkd6eBumZ*xePOa0Zu9FUPekpdJ zxyQkAXSB-BN%A3NAU)^lG6YkL?%d6mEn7nzFayi|Q`Vj_vmc zr)m6`Mc?goo&%aTOQ*?jEs;2?q2r!K36G=j*6bAJH&-r+aqT}wav8M#$ypb@@*pmJ z1bXQspK3d~m-mSObra~}^`YLJ2$=prqC8&PsA68)X)}w(FiEfsb=5`NG8ba21r$Vf zSyj6E{lt}2l_z;+OGX8P1eTwgbTiW;?hpaO3MbUa1p8h*&-1w21Gw=I_@*bf05mRP zJ0NMO3t+Mi%Z2kBTrgw2AiLSQN0uU?tf$c^6=iH84X#U$d;@L)6rYP zbYQV?yCidqvQFNQA(RJzZ*Gd@({2TUB(M%fQ`C&n6~24LF_h*J`1j&{VG!DNFVmBh zY@9GzyZ^QWgE#2j5BkiTcOLMR0+ZhA8_&hqmhGxzPqaEA9=%HG>8tjZr$599ILfD) zSAOfh+ct`G$X++_I2_65qNy^LQFL_fq=y~Q=m+0+fKG{Lcxm;@Rzcx*O8i5&L{6T@ zeeBU@B40=wNsh+K6Ioj%KXiN<=xXH6T(b;ohr*Of*daFIJ@4WTL*zFmv?EPv(}-*_ z{o_`WFg0nZtE8l#n(|7kk%d>60)@>J@Kd3#Nw%CU-+Rn_hauM2=8X4Czf1qT>B1R{ zIn(`QwrZx1c~p>W0ba!-tF97q*|?Vs`!E&__^ZX<-kHmciD_Zk0}MZ#+{6pZ|AHBR z*H?H4jI*+0qr@bP%sUjF>g!3HJY0!XKt4+9VV(AeO1=w4m*Sgl=M(+v1=-&@QZW=S z(uC+TseTg&)(u|^!v*~*R2ASVaiuvm=>4YL^{h<>V(#Jcx;?IM?GNn)vY&5J^8F^F z(L4uWhfQBS5QoNFILgp8XlLHmH4=Usn9p6LkVN5)I0eTSDCsNmtEX3Q_vjCt1Eknr zG$qf-f}_TAzO5)ZQl-{9OP`$sj1|Aev%k}iU}`Bc=~~>&T&NYzrh*fOQgdVTdvtyi zF#uOu+?toe_9tU{uw>LEk@A~)>{AxmpM2)~GH{t1Wej&>S&yiZ+BhO0`G7bVo{0oVhMnJlX<5so8g&7u|7Fw)SELx7t${*Xj3`?$5Tvje1v zlA8Bq`&Qy27Scp z-IGW*zUb8Yi6)sMgPB-VwN%U-#J7aw`0zFg^U*szg*|*FiM+10U`bj_;+_|OD#|nLb;jsLkk__8E3UMX zrf$@9k%k8A=09Ke+Sv+Cpj#Gj*Aq9iUJRbyQ6;&*WwJjv=< z$>;`?6Y2wpL3G6?!%`{Zy3`wdtFmxDyB7NukQIB*EpPon&bY>%w?>jbgt^zqg?w8# zCFrY~Z=9Y+>9+%u8L#^W?vhK?QvsrGPQ?vpoe7(j`{>@_t~Q`8cpgyvBxhbkmxpxi z2Qyj8pIU6s&)d{656IMoKC#CZJtxlc(P2838Ytybo(S&ZHZks+y z-ADJ$z?^%nx7 zs6?zDVc($7Q8IX>n4TB8!W%UU^0u#u4||-qmV7ivZ%+mZ1yuJwW%&{?*~0tU^Gt7) z&g8j>3wa~S+l6SpH{L`DX{xr;)79^x*;4muOP(l38(7aP#QV#@xo#nVD8`Rk#yG=7Iwvr?grwHs{2wiPEB^F0t=e;?O{#PbL_&Fx>EPBKtBpi%+r-q NYJ3CK{(5yj^FKFm+Wi0k diff --git a/tjbench.c b/tjbench.c index 26a1972..f135da4 100644 --- a/tjbench.c +++ b/tjbench.c @@ -1,5 +1,5 @@ /* - * Copyright (C)2009-2012 D. R. Commander. All Rights Reserved. + * Copyright (C)2009-2014 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -138,7 +139,7 @@ int decomptest(unsigned char *srcbuf, unsigned char **jpegbuf, if(yuv==YUVDECODE) { if(tjDecompressToYUV(handle, jpegbuf[0], jpegsize[0], dstbuf, flags)==-1) - _throwtj("executing tjDecompressToYUV()"); + _throwtj("executing tjDecompressToYUV()"); } else for(row=0, dstptr=dstbuf; row = When testing JPEG compression, this option specifies the level\n"); + printf(" of chrominance subsampling to use ( = 444, 422, 440, 420, or GRAY).\n"); + printf(" The default is to test Grayscale, 4:2:0, 4:2:2, and 4:4:4 in sequence.\n"); printf("-quiet = Output results in tabular rather than verbose format\n"); printf("-yuvencode = Encode RGB input as planar YUV rather than compressing as JPEG\n"); printf("-yuvdecode = Decode JPEG image to planar YUV rather than RGB\n"); @@ -700,6 +704,7 @@ void usage(char *progname) if(i!=nsf-1) printf(", "); if(i==nsf-2) printf("or "); } + if(i%8==0 && i!=0) printf("\n "); } printf(")\n"); printf("-hflip, -vflip, -transpose, -transverse, -rot90, -rot180, -rot270 =\n"); @@ -718,7 +723,7 @@ int main(int argc, char *argv[]) { unsigned char *srcbuf=NULL; int w, h, i, j; int minqual=-1, maxqual=-1; char *temp; - int minarg=2; int retval=0; + int minarg=2, retval=0, subsamp=-1; if((scalingfactors=tjGetScalingFactors(&nsf))==NULL || nsf==0) _throwtj("executing tjGetScalingFactors()"); @@ -825,7 +830,8 @@ int main(int argc, char *argv[]) { for(j=0; j=minqual; i--) - dotest(srcbuf, w, h, TJ_GRAYSCALE, i, argv[1]); - printf("\n"); - for(i=maxqual; i>=minqual; i--) - dotest(srcbuf, w, h, TJ_420, i, argv[1]); - printf("\n"); - for(i=maxqual; i>=minqual; i--) - dotest(srcbuf, w, h, TJ_422, i, argv[1]); - printf("\n"); - for(i=maxqual; i>=minqual; i--) - dotest(srcbuf, w, h, TJ_444, i, argv[1]); - printf("\n"); + if(subsamp>=0 && subsamp=minqual; i--) + dotest(srcbuf, w, h, subsamp, i, argv[1]); + printf("\n"); + } + else + { + for(i=maxqual; i>=minqual; i--) + dotest(srcbuf, w, h, TJSAMP_GRAY, i, argv[1]); + printf("\n"); + for(i=maxqual; i>=minqual; i--) + dotest(srcbuf, w, h, TJSAMP_420, i, argv[1]); + printf("\n"); + for(i=maxqual; i>=minqual; i--) + dotest(srcbuf, w, h, TJSAMP_422, i, argv[1]); + printf("\n"); + for(i=maxqual; i>=minqual; i--) + dotest(srcbuf, w, h, TJSAMP_444, i, argv[1]); + printf("\n"); + } bailout: if(srcbuf) free(srcbuf); diff --git a/tjbenchtest.in b/tjbenchtest.in index bea12f1..72b93f8 100755 --- a/tjbenchtest.in +++ b/tjbenchtest.in @@ -110,12 +110,13 @@ for image in $IMAGES; do done # Scaled decompression - for scale in 2 4 8; do + for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do + scalearg=`echo $scale | sed s@_@/@g` for samp in GRAY 420 422 444; do - $EXEDIR/djpeg -rgb -scale 1/${scale} $BMPARG $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg >$OUTDIR/${basename}_${samp}_1_${scale}_djpeg.${EXT} - runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -scale 1/${scale} -quiet -benchtime 0.01 - runme cmp $OUTDIR/${basename}_${samp}_Q95_1_${scale}.${EXT} $OUTDIR/${basename}_${samp}_1_${scale}_djpeg.${EXT} - rm $OUTDIR/${basename}_${samp}_Q95_1_${scale}.${EXT} + $EXEDIR/djpeg -rgb -scale ${scalearg} $BMPARG $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg >$OUTDIR/${basename}_${samp}_${scale}_djpeg.${EXT} + runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -scale ${scalearg} -quiet -benchtime 0.01 + runme cmp $OUTDIR/${basename}_${samp}_Q95_${scale}.${EXT} $OUTDIR/${basename}_${samp}_${scale}_djpeg.${EXT} + rm $OUTDIR/${basename}_${samp}_Q95_${scale}.${EXT} done done @@ -165,11 +166,12 @@ for image in $IMAGES; do # Transforms with scaling for xform in hflip vflip transpose transverse rot90 rot180 rot270; do for samp in GRAY 444 422 420; do - for scale in 2 4 8; do - $EXEDIR/djpeg -rgb -scale 1/${scale} $BMPARG $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg >$OUTDIR/${basename}_${samp}_${xform}_1_${scale}_jpegtran.${EXT} - runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -$xform -scale 1/${scale} -quiet -benchtime 0.01 - runme cmp $OUTDIR/${basename}_${samp}_Q95_1_${scale}.${EXT} $OUTDIR/${basename}_${samp}_${xform}_1_${scale}_jpegtran.${EXT} - rm $OUTDIR/${basename}_${samp}_Q95_1_${scale}.${EXT} + for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do + scalearg=`echo $scale | sed s@_@/@g` + $EXEDIR/djpeg -rgb -scale ${scalearg} $BMPARG $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg >$OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.${EXT} + runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -$xform -scale ${scalearg} -quiet -benchtime 0.01 + runme cmp $OUTDIR/${basename}_${samp}_Q95_${scale}.${EXT} $OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.${EXT} + rm $OUTDIR/${basename}_${samp}_Q95_${scale}.${EXT} done done done diff --git a/tjbenchtest.java.in b/tjbenchtest.java.in new file mode 100755 index 0000000..ebff9c8 --- /dev/null +++ b/tjbenchtest.java.in @@ -0,0 +1,179 @@ +#!/bin/bash + +set -u +set -e +trap onexit INT +trap onexit TERM +trap onexit EXIT + +onexit() +{ + if [ -d $OUTDIR ]; then + rm -rf $OUTDIR + fi +} + +runme() +{ + echo \*\*\* $* + $* +} + +IMAGES="vgl_5674_0098.bmp vgl_6434_0018a.bmp vgl_6548_0026a.bmp nightshot_iso_100.bmp" +IMGDIR=@srcdir@/testimages +OUTDIR=__tjbenchtest_java_output +EXEDIR=. +JAVA="@JAVA@ -cp java/turbojpeg.jar -Djava.library.path=.libs" + +if [ -d $OUTDIR ]; then + rm -rf $OUTDIR +fi +mkdir -p $OUTDIR + +exec >$EXEDIR/tjbenchtest-java.log + +# Standard tests +for image in $IMAGES; do + + cp $IMGDIR/$image $OUTDIR + basename=`basename $image .bmp` + $EXEDIR/cjpeg -quality 95 -dct fast -grayscale $IMGDIR/${basename}.bmp >$OUTDIR/${basename}_GRAY_fast_cjpeg.jpg + $EXEDIR/cjpeg -quality 95 -dct fast -sample 2x2 $IMGDIR/${basename}.bmp >$OUTDIR/${basename}_420_fast_cjpeg.jpg + $EXEDIR/cjpeg -quality 95 -dct fast -sample 2x1 $IMGDIR/${basename}.bmp >$OUTDIR/${basename}_422_fast_cjpeg.jpg + $EXEDIR/cjpeg -quality 95 -dct fast -sample 1x1 $IMGDIR/${basename}.bmp >$OUTDIR/${basename}_444_fast_cjpeg.jpg + $EXEDIR/cjpeg -quality 95 -dct int -grayscale $IMGDIR/${basename}.bmp >$OUTDIR/${basename}_GRAY_accurate_cjpeg.jpg + $EXEDIR/cjpeg -quality 95 -dct int -sample 2x2 $IMGDIR/${basename}.bmp >$OUTDIR/${basename}_420_accurate_cjpeg.jpg + $EXEDIR/cjpeg -quality 95 -dct int -sample 2x1 $IMGDIR/${basename}.bmp >$OUTDIR/${basename}_422_accurate_cjpeg.jpg + $EXEDIR/cjpeg -quality 95 -dct int -sample 1x1 $IMGDIR/${basename}.bmp >$OUTDIR/${basename}_444_accurate_cjpeg.jpg + for samp in GRAY 420 422 444; do + $EXEDIR/djpeg -rgb -bmp $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg >$OUTDIR/${basename}_${samp}_default_djpeg.bmp + $EXEDIR/djpeg -dct fast -rgb -bmp $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg >$OUTDIR/${basename}_${samp}_fast_djpeg.bmp + $EXEDIR/djpeg -dct int -rgb -bmp $OUTDIR/${basename}_${samp}_accurate_cjpeg.jpg >$OUTDIR/${basename}_${samp}_accurate_djpeg.bmp + done + for samp in 420 422; do + $EXEDIR/djpeg -nosmooth -bmp $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg >$OUTDIR/${basename}_${samp}_default_nosmooth_djpeg.bmp + $EXEDIR/djpeg -dct fast -nosmooth -bmp $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg >$OUTDIR/${basename}_${samp}_fast_nosmooth_djpeg.bmp + $EXEDIR/djpeg -dct int -nosmooth -bmp $OUTDIR/${basename}_${samp}_accurate_cjpeg.jpg >$OUTDIR/${basename}_${samp}_accurate_nosmooth_djpeg.bmp + done + + # Compression + for dct in accurate fast; do + runme $JAVA TJBench $OUTDIR/$image 95 -rgb -quiet -benchtime 0.01 -${dct}dct + for samp in GRAY 420 422 444; do + runme cmp $OUTDIR/${basename}_${samp}_Q95.jpg $OUTDIR/${basename}_${samp}_${dct}_cjpeg.jpg + done + done + + for dct in fast accurate default; do + dctarg=-${dct}dct + if [ "${dct}" = "default" ]; then + dctarg= + fi + + # Tiled compression & decompression + runme $JAVA TJBench $OUTDIR/$image 95 -rgb -tile -quiet -benchtime 0.01 ${dctarg} + for samp in GRAY 444; do + for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \ + $OUTDIR/${basename}_${samp}_Q95_full.bmp; do + runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${dct}_djpeg.bmp + rm $i + done + done + runme $JAVA TJBench $OUTDIR/$image 95 -rgb -tile -quiet -benchtime 0.01 -fastupsample ${dctarg} + for samp in 420 422; do + for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \ + $OUTDIR/${basename}_${samp}_Q95_full.bmp; do + runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.bmp + rm $i + done + done + + # Tiled decompression + for samp in GRAY 444; do + runme $JAVA TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -tile -quiet -benchtime 0.01 ${dctarg} + for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \ + $OUTDIR/${basename}_${samp}_Q95_full.bmp; do + runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${dct}_djpeg.bmp + rm $i + done + done + for samp in 420 422; do + runme $JAVA TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -tile -quiet -benchtime 0.01 -fastupsample ${dctarg} + for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \ + $OUTDIR/${basename}_${samp}_Q95_full.bmp; do + runme cmp $i -i 54:54 $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.bmp + rm $i + done + done + done + + # Scaled decompression + for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do + scalearg=`echo $scale | sed s@_@/@g` + for samp in GRAY 420 422 444; do + $EXEDIR/djpeg -rgb -scale ${scalearg} -bmp $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg >$OUTDIR/${basename}_${samp}_${scale}_djpeg.bmp + runme $JAVA TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -scale ${scalearg} -quiet -benchtime 0.01 + runme cmp -i 54:54 $OUTDIR/${basename}_${samp}_Q95_${scale}.bmp $OUTDIR/${basename}_${samp}_${scale}_djpeg.bmp + rm $OUTDIR/${basename}_${samp}_Q95_${scale}.bmp + done + done + + # Transforms + for samp in GRAY 420 422 444; do + $EXEDIR/jpegtran -flip horizontal -trim $OUTDIR/${basename}_${samp}_Q95.jpg >$OUTDIR/${basename}_${samp}_hflip_jpegtran.jpg + $EXEDIR/jpegtran -flip vertical -trim $OUTDIR/${basename}_${samp}_Q95.jpg >$OUTDIR/${basename}_${samp}_vflip_jpegtran.jpg + $EXEDIR/jpegtran -transpose -trim $OUTDIR/${basename}_${samp}_Q95.jpg >$OUTDIR/${basename}_${samp}_transpose_jpegtran.jpg + $EXEDIR/jpegtran -transverse -trim $OUTDIR/${basename}_${samp}_Q95.jpg >$OUTDIR/${basename}_${samp}_transverse_jpegtran.jpg + $EXEDIR/jpegtran -rotate 90 -trim $OUTDIR/${basename}_${samp}_Q95.jpg >$OUTDIR/${basename}_${samp}_rot90_jpegtran.jpg + $EXEDIR/jpegtran -rotate 180 -trim $OUTDIR/${basename}_${samp}_Q95.jpg >$OUTDIR/${basename}_${samp}_rot180_jpegtran.jpg + $EXEDIR/jpegtran -rotate 270 -trim $OUTDIR/${basename}_${samp}_Q95.jpg >$OUTDIR/${basename}_${samp}_rot270_jpegtran.jpg + done + for xform in hflip vflip transpose transverse rot90 rot180 rot270; do + for samp in GRAY 444; do + $EXEDIR/djpeg -rgb -bmp $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg >$OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp + runme $JAVA TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -tile -quiet -benchtime 0.01 + for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \ + $OUTDIR/${basename}_${samp}_Q95_full.bmp; do + runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp + rm $i + done + done + for samp in 420 422; do + $EXEDIR/djpeg -nosmooth -rgb -bmp $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg >$OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp + runme $JAVA TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -tile -quiet -benchtime 0.01 -fastupsample + for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \ + $OUTDIR/${basename}_${samp}_Q95_full.bmp; do + runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp + rm $i + done + done + done + + # Grayscale transform + for xform in hflip vflip transpose transverse rot90 rot180 rot270; do + for samp in GRAY 444 422 420; do + runme $JAVA TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -tile -quiet -benchtime 0.01 -grayscale + for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \ + $OUTDIR/${basename}_${samp}_Q95_full.bmp; do + runme cmp -i 54:54 $i $OUTDIR/${basename}_GRAY_${xform}_jpegtran.bmp + rm $i + done + done + done + + # Transforms with scaling + for xform in hflip vflip transpose transverse rot90 rot180 rot270; do + for samp in GRAY 444 422 420; do + for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do + scalearg=`echo $scale | sed s@_@/@g` + $EXEDIR/djpeg -rgb -scale ${scalearg} -bmp $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg >$OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.bmp + runme $JAVA TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -scale ${scalearg} -quiet -benchtime 0.01 + runme cmp -i 54:54 $OUTDIR/${basename}_${samp}_Q95_${scale}.bmp $OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.bmp + rm $OUTDIR/${basename}_${samp}_Q95_${scale}.bmp + done + done + done + +done + +echo SUCCESS! diff --git a/tjexampletest.in b/tjexampletest.in index 430088e..40b342e 100755 --- a/tjexampletest.in +++ b/tjexampletest.in @@ -84,12 +84,13 @@ for image in $IMAGES; do done # Scaled decompression - for scale in 2 4 8; do + for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do + scalearg=`echo $scale | sed s@_@/@g` for samp in GRAY 420 422 444; do - $EXEDIR/djpeg -rgb -bmp -scale 1/${scale} $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg >$OUTDIR/${basename}_${samp}_1_${scale}_djpeg.bmp - runme $JAVA TJExample $OUTDIR/${basename}_${samp}_fast.jpg $OUTDIR/${basename}_${samp}_1_${scale}.bmp -scale 1/${scale} - runme cmp -i 54:54 $OUTDIR/${basename}_${samp}_1_${scale}.bmp $OUTDIR/${basename}_${samp}_1_${scale}_djpeg.bmp - rm $OUTDIR/${basename}_${samp}_1_${scale}.bmp + $EXEDIR/djpeg -rgb -bmp -scale ${scalearg} $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg >$OUTDIR/${basename}_${samp}_${scale}_djpeg.bmp + runme $JAVA TJExample $OUTDIR/${basename}_${samp}_fast.jpg $OUTDIR/${basename}_${samp}_${scale}.bmp -scale ${scalearg} + runme cmp -i 54:54 $OUTDIR/${basename}_${samp}_${scale}.bmp $OUTDIR/${basename}_${samp}_${scale}_djpeg.bmp + rm $OUTDIR/${basename}_${samp}_${scale}.bmp done done @@ -134,11 +135,12 @@ for image in $IMAGES; do # Transforms with scaling for xform in hflip vflip transpose transverse rot90 rot180 rot270; do for samp in GRAY 444 422 420; do - for scale in 2 4 8; do - $EXEDIR/djpeg -rgb -bmp -scale 1/${scale} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg >$OUTDIR/${basename}_${samp}_${xform}_1_${scale}_jpegtran.bmp - runme $JAVA TJExample $OUTDIR/${basename}_${samp}_fast.jpg $OUTDIR/${basename}_${samp}_${xform}_1_${scale}.bmp -$xform -scale 1/${scale} -crop 16,16,70x60 - runme cmp -i 54:54 $OUTDIR/${basename}_${samp}_${xform}_1_${scale}.bmp $OUTDIR/${basename}_${samp}_${xform}_1_${scale}_jpegtran.bmp - rm $OUTDIR/${basename}_${samp}_${xform}_1_${scale}.bmp + for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do + scalearg=`echo $scale | sed s@_@/@g` + $EXEDIR/djpeg -rgb -bmp -scale ${scalearg} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg >$OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.bmp + runme $JAVA TJExample $OUTDIR/${basename}_${samp}_fast.jpg $OUTDIR/${basename}_${samp}_${xform}_${scale}.bmp -$xform -scale ${scalearg} -crop 16,16,70x60 + runme cmp -i 54:54 $OUTDIR/${basename}_${samp}_${xform}_${scale}.bmp $OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.bmp + rm $OUTDIR/${basename}_${samp}_${xform}_${scale}.bmp done done done diff --git a/tjunittest.c b/tjunittest.c index 89a6d1d..3bb194d 100644 --- a/tjunittest.c +++ b/tjunittest.c @@ -1,5 +1,5 @@ /* - * Copyright (C)2009-2012 D. R. Commander. All Rights Reserved. + * Copyright (C)2009-2012, 2014 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -219,7 +219,6 @@ int checkBuf(unsigned char *buf, int w, int h, int pf, int subsamp, bailout: if(retval==0) { - printf("\n"); for(row=0; row YUV %s ... ", subName[subsamp]); + printf("JPEG -> YUV %s ... ", subNameLong[subsamp]); else { printf("JPEG -> %s %s ", pixFormatStr[pf], @@ -475,7 +473,7 @@ void decompTest(tjhandle handle, unsigned char *jpegBuf, sf1); bailout: - printf("\n"); + return; } @@ -515,10 +513,15 @@ void doTest(int w, int h, const int *formats, int nformats, int subsamp, decompTest(dhandle, dstBuf, size, w, h, pf, basename, subsamp, flags); if(pf>=TJPF_RGBX && pf<=TJPF_XRGB) + { + printf("\n"); decompTest(dhandle, dstBuf, size, w, h, pf+(TJPF_RGBA-TJPF_RGBX), basename, subsamp, flags); + } + printf("\n"); } } + printf("--------------------\n\n"); bailout: if(chandle) tjDestroy(chandle); @@ -531,9 +534,9 @@ void doTest(int w, int h, const int *formats, int nformats, int subsamp, void bufSizeTest(void) { int w, h, i, subsamp; - unsigned char *srcBuf=NULL, *jpegBuf=NULL; + unsigned char *srcBuf=NULL, *dstBuf=NULL; tjhandle handle=NULL; - unsigned long jpegSize=0; + unsigned long dstSize=0; if((handle=tjInitCompress())==NULL) _throwtj(); @@ -548,12 +551,12 @@ void bufSizeTest(void) if(h%100==0) printf("%.4d x %.4d\b\b\b\b\b\b\b\b\b\b\b", w, h); if((srcBuf=(unsigned char *)malloc(w*h*4))==NULL) _throw("Memory allocation failure"); - if(!alloc) + if(!alloc || yuv==YUVENCODE) { - if((jpegBuf=(unsigned char *)tjAlloc(tjBufSize(w, h, subsamp))) - ==NULL) + if(yuv==YUVENCODE) dstSize=tjBufSizeYUV(w, h, subsamp); + else dstSize=tjBufSize(w, h, subsamp); + if((dstBuf=(unsigned char *)tjAlloc(dstSize))==NULL) _throw("Memory allocation failure"); - jpegSize=tjBufSize(w, h, subsamp); } for(i=0; ix{+-}{+-} + * [f]x[f]{+-}{+-} * where width, height, xoffset, and yoffset are unsigned integers. * Each of the elements can be omitted to indicate a default value. * (A weakness of this style is that it is not possible to omit xoffset @@ -804,14 +805,22 @@ jtransform_parse_crop_spec (jpeg_transform_info *info, const char *spec) /* fetch width */ if (! jt_read_integer(&spec, &info->crop_width)) return FALSE; - info->crop_width_set = JCROP_POS; + if (*spec == 'f' || *spec == 'F') { + spec++; + info->crop_width_set = JCROP_FORCE; + } else + info->crop_width_set = JCROP_POS; } - if (*spec == 'x' || *spec == 'X') { + if (*spec == 'x' || *spec == 'X') { /* fetch height */ spec++; if (! jt_read_integer(&spec, &info->crop_height)) return FALSE; - info->crop_height_set = JCROP_POS; + if (*spec == 'f' || *spec == 'F') { + spec++; + info->crop_height_set = JCROP_FORCE; + } else + info->crop_height_set = JCROP_POS; } if (*spec == '+' || *spec == '-') { /* fetch xoffset */ @@ -996,10 +1005,16 @@ jtransform_request_workspace (j_decompress_ptr srcinfo, else yoffset = info->crop_yoffset; /* Now adjust so that upper left corner falls at an iMCU boundary */ - info->output_width = - info->crop_width + (xoffset % info->iMCU_sample_width); - info->output_height = - info->crop_height + (yoffset % info->iMCU_sample_height); + if (info->crop_width_set == JCROP_FORCE) + info->output_width = info->crop_width; + else + info->output_width = + info->crop_width + (xoffset % info->iMCU_sample_width); + if (info->crop_height_set == JCROP_FORCE) + info->output_height = info->crop_height; + else + info->output_height = + info->crop_height + (yoffset % info->iMCU_sample_height); /* Save x/y offsets measured in iMCUs */ info->x_crop_offset = xoffset / info->iMCU_sample_width; info->y_crop_offset = yoffset / info->iMCU_sample_height; @@ -1161,6 +1176,7 @@ transpose_critical_parameters (j_compress_ptr dstinfo) * We try to adjust the Tags ExifImageWidth and ExifImageHeight if possible. */ +#if JPEG_LIB_VERSION >= 70 LOCAL(void) adjust_exif_parameters (JOCTET FAR * data, unsigned int length, JDIMENSION new_width, JDIMENSION new_height) @@ -1310,6 +1326,7 @@ adjust_exif_parameters (JOCTET FAR * data, unsigned int length, offset += 12; } while (--number_of_tags); } +#endif /* Adjust output image parameters as needed. diff --git a/transupp.h b/transupp.h index 122d448..cfbaca4 100644 --- a/transupp.h +++ b/transupp.h @@ -1,7 +1,7 @@ /* * transupp.h * - * Copyright (C) 1997-2009, Thomas G. Lane, Guido Vollbeding. + * Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -57,6 +57,7 @@ * corner up and/or left to make it so, simultaneously increasing the region * dimensions to keep the lower right crop corner unchanged. (Thus, the * output image covers at least the requested region, but may cover more.) + * The adjustment of the region dimensions may be optionally disabled. * * We also provide a lossless-resize option, which is kind of a lossless-crop * operation in the DCT coefficient block domain - it discards higher-order @@ -106,13 +107,15 @@ typedef enum { /* * Codes for crop parameters, which can individually be unspecified, - * positive, or negative. (Negative width or height makes no sense, though.) + * positive or negative for xoffset or yoffset, + * positive or forced for width or height. */ typedef enum { - JCROP_UNSET, - JCROP_POS, - JCROP_NEG + JCROP_UNSET, + JCROP_POS, + JCROP_NEG, + JCROP_FORCE } JCROP_CODE; /* @@ -140,9 +143,9 @@ typedef struct { * These can be filled in by jtransform_parse_crop_spec(). */ JDIMENSION crop_width; /* Width of selected region */ - JCROP_CODE crop_width_set; + JCROP_CODE crop_width_set; /* (forced disables adjustment) */ JDIMENSION crop_height; /* Height of selected region */ - JCROP_CODE crop_height_set; + JCROP_CODE crop_height_set; /* (forced disables adjustment) */ JDIMENSION crop_xoffset; /* X offset of selected region */ JCROP_CODE crop_xoffset_set; /* (negative measures from right edge) */ JDIMENSION crop_yoffset; /* Y offset of selected region */ diff --git a/turbojpeg-jni.c b/turbojpeg-jni.c index 1ff9bba..634bedf 100644 --- a/turbojpeg-jni.c +++ b/turbojpeg-jni.c @@ -1,5 +1,5 @@ /* - * Copyright (C)2011 D. R. Commander. All Rights Reserved. + * Copyright (C)2011-2013 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -29,6 +29,9 @@ #include #include #include "turbojpeg.h" +#ifdef WIN32 +#include "tjutil.h" +#endif #include #include "java/org_libjpegturbo_turbojpeg_TJCompressor.h" #include "java/org_libjpegturbo_turbojpeg_TJDecompressor.h" @@ -41,7 +44,11 @@ goto bailout; \ } -#define bailif0(f) {if(!(f)) goto bailout;} +#define bailif0(f) {if(!(f)) { \ + char temps[80]; \ + snprintf(temps, 80, "Unexpected NULL condition in line %d", __LINE__); \ + _throw(temps); \ +}} #define gethandle() \ jclass _cls=(*env)->GetObjectClass(env, obj); \ @@ -88,13 +95,14 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_init return; } -JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIII_3BIII - (JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch, - jint height, jint pf, jbyteArray dst, jint jpegSubsamp, jint jpegQual, - jint flags) +JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIIIII_3BIII + (JNIEnv *env, jobject obj, jbyteArray src, jint x, jint y, jint width, + jint pitch, jint height, jint pf, jbyteArray dst, jint jpegSubsamp, + jint jpegQual, jint flags) { tjhandle handle=0; - unsigned long jpegSize=0; jsize arraySize=0; + unsigned long jpegSize=0; + jsize arraySize=0, actualPitch; unsigned char *srcBuf=NULL, *jpegBuf=NULL; gethandle(); @@ -105,7 +113,8 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3 if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) _throw("Mismatch between Java and C API"); - arraySize=(pitch==0)? width*tjPixelSize[pf]*height:pitch*height; + actualPitch=(pitch==0)? width*tjPixelSize[pf]:pitch; + arraySize=(y+height-1)*actualPitch + x+width; if((*env)->GetArrayLength(env, src)GetPrimitiveArrayCritical(env, src, 0)); bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); - if(tjCompress2(handle, srcBuf, width, pitch, height, pf, &jpegBuf, - &jpegSize, jpegSubsamp, jpegQual, flags|TJFLAG_NOREALLOC)==-1) + if(tjCompress2(handle, &srcBuf[y*actualPitch + x*tjPixelSize[pf]], width, + pitch, height, pf, &jpegBuf, &jpegSize, jpegSubsamp, jpegQual, + flags|TJFLAG_NOREALLOC)==-1) { (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); @@ -130,26 +140,38 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3 return (jint)jpegSize; } -JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIII_3BIII - (JNIEnv *env, jobject obj, jintArray src, jint width, jint pitch, +JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIII_3BIII + (JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch, jint height, jint pf, jbyteArray dst, jint jpegSubsamp, jint jpegQual, jint flags) { + return Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIIIII_3BIII( + env, obj, src, 0, 0, width, pitch, height, pf, dst, jpegSubsamp, jpegQual, + flags); +} + +JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIIIII_3BIII + (JNIEnv *env, jobject obj, jintArray src, jint x, jint y, jint width, + jint stride, jint height, jint pf, jbyteArray dst, jint jpegSubsamp, + jint jpegQual, jint flags) +{ tjhandle handle=0; - unsigned long jpegSize=0; jsize arraySize=0; + unsigned long jpegSize=0; + jsize arraySize=0, actualStride; unsigned char *srcBuf=NULL, *jpegBuf=NULL; gethandle(); if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF || width<1 || height<1 - || pitch<0) + || stride<0) _throw("Invalid argument in compress()"); if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) _throw("Mismatch between Java and C API"); if(tjPixelSize[pf]!=sizeof(jint)) _throw("Pixel format must be 32-bit when compressing from an integer buffer."); - arraySize=(pitch==0)? width*height:pitch*height; + actualStride=(stride==0)? width:stride; + arraySize=(y+height-1)*actualStride + x+width; if((*env)->GetArrayLength(env, src)GetPrimitiveArrayCritical(env, src, 0)); bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); - if(tjCompress2(handle, srcBuf, width, pitch*sizeof(jint), height, pf, - &jpegBuf, &jpegSize, jpegSubsamp, jpegQual, flags|TJFLAG_NOREALLOC)==-1) + if(tjCompress2(handle, &srcBuf[(y*actualStride + x)*sizeof(int)], width, + stride*sizeof(jint), height, pf, &jpegBuf, &jpegSize, jpegSubsamp, + jpegQual, flags|TJFLAG_NOREALLOC)==-1) { (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); @@ -174,6 +197,16 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3 return (jint)jpegSize; } +JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIII_3BIII + (JNIEnv *env, jobject obj, jintArray src, jint width, jint pitch, + jint height, jint pf, jbyteArray dst, jint jpegSubsamp, jint jpegQual, + jint flags) +{ + return Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIIIII_3BIII( + env, obj, src, 0, 0, width, pitch, height, pf, dst, jpegSubsamp, jpegQual, + flags); +} + JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3BIIII_3BII (JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch, jint height, jint pf, jbyteArray dst, jint subsamp, jint flags) @@ -216,7 +249,7 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___ } JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3IIIII_3BII - (JNIEnv *env, jobject obj, jintArray src, jint width, jint pitch, + (JNIEnv *env, jobject obj, jintArray src, jint width, jint stride, jint height, jint pf, jbyteArray dst, jint subsamp, jint flags) { tjhandle handle=0; @@ -226,14 +259,14 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___ gethandle(); if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF || width<1 || height<1 - || pitch<0) - _throw("Invalid argument in compress()"); + || stride<0) + _throw("Invalid argument in encodeYUV()"); if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) _throw("Mismatch between Java and C API"); if(tjPixelSize[pf]!=sizeof(jint)) _throw("Pixel format must be 32-bit when encoding from an integer buffer."); - arraySize=(pitch==0)? width*height:pitch*height; + arraySize=(stride==0)? width*height:stride*height; if((*env)->GetArrayLength(env, src)GetArrayLength(env, dst) @@ -243,7 +276,7 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___ bailif0(srcBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); - if(tjEncodeYUV2(handle, srcBuf, width, pitch*sizeof(jint), height, pf, + if(tjEncodeYUV2(handle, srcBuf, width, stride*sizeof(jint), height, pf, dstBuf, subsamp, flags)==-1) { (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); @@ -350,12 +383,12 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress return; } -JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIII +JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIIIII (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jbyteArray dst, - jint width, jint pitch, jint height, jint pf, jint flags) + jint x, jint y, jint width, jint pitch, jint height, jint pf, jint flags) { tjhandle handle=0; - jsize arraySize=0; + jsize arraySize=0, actualPitch; unsigned char *jpegBuf=NULL, *dstBuf=NULL; gethandle(); @@ -367,15 +400,17 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress if((*env)->GetArrayLength(env, src)GetArrayLength(env, dst)GetPrimitiveArrayCritical(env, src, 0)); bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); - if(tjDecompress2(handle, jpegBuf, (unsigned long)jpegSize, dstBuf, width, - pitch, height, pf, flags)==-1) + if(tjDecompress2(handle, jpegBuf, (unsigned long)jpegSize, + &dstBuf[y*actualPitch + x*tjPixelSize[pf]], width, pitch, height, pf, + flags)==-1) { (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); @@ -389,12 +424,20 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress return; } -JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIII - (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jintArray dst, +JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIII + (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jbyteArray dst, jint width, jint pitch, jint height, jint pf, jint flags) { + Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIIIII + (env, obj, src, jpegSize, dst, 0, 0, width, pitch, height, pf, flags); +} + +JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIIIII + (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jintArray dst, + jint x, jint y, jint width, jint stride, jint height, jint pf, jint flags) +{ tjhandle handle=0; - jsize arraySize=0; + jsize arraySize=0, actualStride; unsigned char *jpegBuf=NULL, *dstBuf=NULL; gethandle(); @@ -408,15 +451,17 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress if((*env)->GetArrayLength(env, src)GetArrayLength(env, dst)GetPrimitiveArrayCritical(env, src, 0)); bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); - if(tjDecompress2(handle, jpegBuf, (unsigned long)jpegSize, dstBuf, width, - pitch*sizeof(jint), height, pf, flags)==-1) + if(tjDecompress2(handle, jpegBuf, (unsigned long)jpegSize, + &dstBuf[(y*actualStride + x)*sizeof(int)], width, stride*sizeof(jint), + height, pf, flags)==-1) { (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); @@ -430,6 +475,15 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress return; } +JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIII + (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jintArray dst, + jint width, jint stride, jint height, jint pf, jint flags) +{ + Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIIIII + (env, obj, src, jpegSize, dst, 0, 0, width, stride, height, pf, flags); + +} + JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompressToYUV (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jbyteArray dst, jint flags) diff --git a/turbojpeg-mapfile.jni b/turbojpeg-mapfile.jni index 9c046ce..ca39c9e 100755 --- a/turbojpeg-mapfile.jni +++ b/turbojpeg-mapfile.jni @@ -53,3 +53,12 @@ TURBOJPEG_1.2 Java_org_libjpegturbo_turbojpeg_TJTransformer_init; Java_org_libjpegturbo_turbojpeg_TJTransformer_transform; } TURBOJPEG_1.1; + +TURBOJPEG_1.3 +{ + global: + Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIIIII_3BIII; + Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIIIII_3BIII; + Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIIIII; + Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIIIII; +} TURBOJPEG_1.2; diff --git a/turbojpeg.c b/turbojpeg.c index f2485eb..9117273 100644 --- a/turbojpeg.c +++ b/turbojpeg.c @@ -1,5 +1,5 @@ /* - * Copyright (C)2009-2012 D. R. Commander. All Rights Reserved. + * Copyright (C)2009-2012, 2014 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -26,7 +26,8 @@ * POSSIBILITY OF SUCH DAMAGE. */ -/* TurboJPEG/OSS: this implements the TurboJPEG API using libjpeg-turbo */ +/* TurboJPEG/LJT: this implements the TurboJPEG API using libjpeg or + libjpeg-turbo */ #include #include @@ -92,10 +93,22 @@ static const JXFORM_CODE xformtypes[TJ_NUMXOP]= JXFORM_TRANSVERSE, JXFORM_ROT_90, JXFORM_ROT_180, JXFORM_ROT_270 }; -#define NUMSF 4 +#define NUMSF 16 static const tjscalingfactor sf[NUMSF]={ + {2, 1}, + {15, 8}, + {7, 4}, + {13, 8}, + {3, 2}, + {11, 8}, + {5, 4}, + {9, 8}, {1, 1}, + {7, 8}, + {3, 4}, + {5, 8}, {1, 2}, + {3, 8}, {1, 4}, {1, 8} }; @@ -160,12 +173,17 @@ static int setCompDefaults(struct jpeg_compress_struct *cinfo, cinfo->in_color_space=JCS_EXT_XBGR; break; #else case TJPF_RGB: - if(RGB_RED==0 && RGB_GREEN==1 && RGB_BLUE==2 && RGB_PIXELSIZE==3) - { - cinfo->in_color_space=JCS_RGB; break; - } - default: - _throw("Unsupported pixel format"); + case TJPF_BGR: + case TJPF_RGBX: + case TJPF_BGRX: + case TJPF_XRGB: + case TJPF_XBGR: + case TJPF_RGBA: + case TJPF_BGRA: + case TJPF_ARGB: + case TJPF_ABGR: + cinfo->in_color_space=JCS_RGB; pixelFormat=TJPF_RGB; + break; #endif } @@ -189,9 +207,6 @@ static int setCompDefaults(struct jpeg_compress_struct *cinfo, cinfo->comp_info[1].v_samp_factor=1; cinfo->comp_info[2].v_samp_factor=1; - #if JCS_EXTENSIONS!=1 - bailout: - #endif return retval; } @@ -229,10 +244,16 @@ static int setDecompDefaults(struct jpeg_decompress_struct *dinfo, #endif #else case TJPF_RGB: - if(RGB_RED==0 && RGB_GREEN==1 && RGB_BLUE==2 && RGB_PIXELSIZE==3) - { - dinfo->out_color_space=JCS_RGB; break; - } + case TJPF_BGR: + case TJPF_RGBX: + case TJPF_BGRX: + case TJPF_XRGB: + case TJPF_XBGR: + case TJPF_RGBA: + case TJPF_BGRA: + case TJPF_ARGB: + case TJPF_ABGR: + dinfo->out_color_space=JCS_RGB; break; #endif default: _throw("Unsupported pixel format"); @@ -273,6 +294,149 @@ static int getSubsamp(j_decompress_ptr dinfo) } +#ifndef JCS_EXTENSIONS + +/* Conversion functions to emulate the colorspace extensions. This allows the + TurboJPEG wrapper to be used with libjpeg */ + +#define TORGB(PS, ROFFSET, GOFFSET, BOFFSET) { \ + int rowPad=pitch-width*PS; \ + while(height--) \ + { \ + unsigned char *endOfRow=src+width*PS; \ + while(src=NUMSUBOPT) _throw("tjBufSize(): Invalid argument"); - // This allows for rare corner cases in which a JPEG image can actually be - // larger than the uncompressed input (we wouldn't mention it if it hadn't - // happened before.) + /* This allows for rare corner cases in which a JPEG image can actually be + larger than the uncompressed input (we wouldn't mention it if it hadn't + happened before.) */ mcuw=tjMCUWidth[jpegSubsamp]; mcuh=tjMCUHeight[jpegSubsamp]; chromasf=jpegSubsamp==TJSAMP_GRAY? 0: 4*64/(mcuw*mcuh); @@ -367,16 +531,15 @@ DLLEXPORT unsigned long DLLCALL tjBufSize(int width, int height, return retval; } - DLLEXPORT unsigned long DLLCALL TJBUFSIZE(int width, int height) { unsigned long retval=0; if(width<1 || height<1) _throw("TJBUFSIZE(): Invalid argument"); - // This allows for rare corner cases in which a JPEG image can actually be - // larger than the uncompressed input (we wouldn't mention it if it hadn't - // happened before.) + /* This allows for rare corner cases in which a JPEG image can actually be + larger than the uncompressed input (we wouldn't mention it if it hadn't + happened before.) */ retval=PAD(width, 16) * PAD(height, 16) * 6 + 2048; bailout: @@ -413,6 +576,9 @@ DLLEXPORT int DLLCALL tjCompress2(tjhandle handle, unsigned char *srcBuf, unsigned long *jpegSize, int jpegSubsamp, int jpegQual, int flags) { int i, retval=0, alloc=1; JSAMPROW *row_pointer=NULL; + #ifndef JCS_EXTENSIONS + unsigned char *rgbBuf=NULL; + #endif getinstance(handle) if((this->init&COMPRESS)==0) @@ -432,6 +598,16 @@ DLLEXPORT int DLLCALL tjCompress2(tjhandle handle, unsigned char *srcBuf, if(pitch==0) pitch=width*tjPixelSize[pixelFormat]; + #ifndef JCS_EXTENSIONS + if(pixelFormat!=TJPF_GRAY) + { + rgbBuf=(unsigned char *)malloc(width*height*RGB_PIXELSIZE); + if(!rgbBuf) _throw("tjCompress2(): Memory allocation failure"); + srcBuf=toRGB(srcBuf, width, pitch, height, pixelFormat, rgbBuf); + pitch=width*RGB_PIXELSIZE; + } + #endif + cinfo->image_width=width; cinfo->image_height=height; @@ -464,6 +640,9 @@ DLLEXPORT int DLLCALL tjCompress2(tjhandle handle, unsigned char *srcBuf, bailout: if(cinfo->global_state>CSTATE_START) jpeg_abort_compress(cinfo); + #ifndef JCS_EXTENSIONS + if(rgbBuf) free(rgbBuf); + #endif if(row_pointer) free(row_pointer); return retval; } @@ -502,10 +681,11 @@ DLLEXPORT int DLLCALL tjEncodeYUV2(tjhandle handle, unsigned char *srcBuf, JSAMPLE *ptr=dstBuf; unsigned long yuvsize=0; jpeg_component_info *compptr; + #ifndef JCS_EXTENSIONS + unsigned char *rgbBuf=NULL; + #endif getinstance(handle); - if((this->init&COMPRESS)==0) - _throw("tjEncodeYUV2(): Instance has not been initialized for compression"); for(i=0; iinit&COMPRESS)==0) + _throw("tjEncodeYUV2(): Instance has not been initialized for compression"); + if(srcBuf==NULL || width<=0 || pitch<0 || height<=0 || pixelFormat<0 || pixelFormat>=TJ_NUMPF || dstBuf==NULL || subsamp<0 || subsamp>=NUMSUBOPT) @@ -527,6 +710,16 @@ DLLEXPORT int DLLCALL tjEncodeYUV2(tjhandle handle, unsigned char *srcBuf, if(pitch==0) pitch=width*tjPixelSize[pixelFormat]; + #ifndef JCS_EXTENSIONS + if(pixelFormat!=TJPF_GRAY) + { + rgbBuf=(unsigned char *)malloc(width*height*RGB_PIXELSIZE); + if(!rgbBuf) _throw("tjEncodeYUV2(): Memory allocation failure"); + srcBuf=toRGB(srcBuf, width, pitch, height, pixelFormat, rgbBuf); + pitch=width*RGB_PIXELSIZE; + } + #endif + cinfo->image_width=width; cinfo->image_height=height; @@ -535,10 +728,20 @@ DLLEXPORT int DLLCALL tjEncodeYUV2(tjhandle handle, unsigned char *srcBuf, else if(flags&TJFLAG_FORCESSE2) putenv("JSIMD_FORCESSE2=1"); yuvsize=tjBufSizeYUV(width, height, subsamp); - jpeg_mem_dest_tj(cinfo, &dstBuf, &yuvsize, 0); if(setCompDefaults(cinfo, pixelFormat, subsamp, -1, flags)==-1) return -1; - jpeg_start_compress(cinfo, TRUE); + /* Execute only the parts of jpeg_start_compress() that we need. If we + were to call the whole jpeg_start_compress() function, then it would try + to write the file headers, which could overflow the output buffer if the + YUV image were very small. */ + if(cinfo->global_state!=CSTATE_START) + _throw("tjEncodeYUV3(): libjpeg API is in the wrong state"); + (*cinfo->err->reset_error_mgr)((j_common_ptr)cinfo); + jinit_c_master_control(cinfo, FALSE); + jinit_color_converter(cinfo); + jinit_downsampler(cinfo); + (*cinfo->cconvert->start_pass)(cinfo); + pw=PAD(width, cinfo->max_h_samp_factor); ph=PAD(height, cinfo->max_v_samp_factor); @@ -609,6 +812,9 @@ DLLEXPORT int DLLCALL tjEncodeYUV2(tjhandle handle, unsigned char *srcBuf, bailout: if(cinfo->global_state>CSTATE_START) jpeg_abort_compress(cinfo); + #ifndef JCS_EXTENSIONS + if(rgbBuf) free(rgbBuf); + #endif if(row_pointer) free(row_pointer); for(i=0; iinit&DECOMPRESS)==0) @@ -773,7 +983,7 @@ DLLEXPORT int DLLCALL tjDecompress2(tjhandle handle, unsigned char *jpegBuf, scaledw=TJSCALED(jpegwidth, sf[i]); scaledh=TJSCALED(jpegheight, sf[i]); if(scaledw<=width && scaledh<=height) - break; + break; } if(scaledw>width || scaledh>height) _throw("tjDecompress2(): Could not scale down to desired image dimensions"); @@ -783,6 +993,21 @@ DLLEXPORT int DLLCALL tjDecompress2(tjhandle handle, unsigned char *jpegBuf, jpeg_start_decompress(dinfo); if(pitch==0) pitch=dinfo->output_width*tjPixelSize[pixelFormat]; + + #ifndef JCS_EXTENSIONS + if(pixelFormat!=TJPF_GRAY && + (RGB_RED!=tjRedOffset[pixelFormat] || + RGB_GREEN!=tjGreenOffset[pixelFormat] || + RGB_BLUE!=tjBlueOffset[pixelFormat] || + RGB_PIXELSIZE!=tjPixelSize[pixelFormat])) + { + rgbBuf=(unsigned char *)malloc(width*height*3); + if(!rgbBuf) _throw("tjDecompress2(): Memory allocation failure"); + _pitch=pitch; pitch=width*3; + _dstBuf=dstBuf; dstBuf=rgbBuf; + } + #endif + if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW) *dinfo->output_height))==NULL) _throw("tjDecompress2(): Memory allocation failure"); @@ -799,8 +1024,15 @@ DLLEXPORT int DLLCALL tjDecompress2(tjhandle handle, unsigned char *jpegBuf, } jpeg_finish_decompress(dinfo); + #ifndef JCS_EXTENSIONS + fromRGB(rgbBuf, _dstBuf, width, _pitch, height, pixelFormat); + #endif + bailout: if(dinfo->global_state>DSTATE_START) jpeg_abort_decompress(dinfo); + #ifndef JCS_EXTENSIONS + if(rgbBuf) free(rgbBuf); + #endif if(row_pointer) free(row_pointer); return retval; } @@ -827,14 +1059,15 @@ DLLEXPORT int DLLCALL tjDecompressToYUV(tjhandle handle, JSAMPLE *_tmpbuf=NULL, *ptr=dstBuf; JSAMPROW *tmpbuf[MAX_COMPONENTS]; getinstance(handle); - if((this->init&DECOMPRESS)==0) - _throw("tjDecompressToYUV(): Instance has not been initialized for decompression"); for(i=0; iinit&DECOMPRESS)==0) + _throw("tjDecompressToYUV(): Instance has not been initialized for decompression"); + if(jpegBuf==NULL || jpegSize<=0 || dstBuf==NULL) _throw("tjDecompressToYUV(): Invalid argument"); @@ -891,6 +1124,7 @@ DLLEXPORT int DLLCALL tjDecompressToYUV(tjhandle handle, } if(flags&TJFLAG_FASTUPSAMPLE) dinfo->do_fancy_upsampling=FALSE; + if(flags&TJFLAG_FASTDCT) dinfo->dct_method=JDCT_FASTEST; dinfo->raw_data_out=TRUE; jpeg_start_decompress(dinfo); diff --git a/turbojpeg.h b/turbojpeg.h index 7610221..a563c81 100644 --- a/turbojpeg.h +++ b/turbojpeg.h @@ -1,5 +1,5 @@ /* - * Copyright (C)2009-2012 D. R. Commander. All Rights Reserved. + * Copyright (C)2009-2013 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -59,6 +59,10 @@ * perceptible loss of image clarity (the human eye is more sensitive to small * changes in brightness than small changes in color.) This is called * "chrominance subsampling". + *

    + * NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the + * convention of the digital video community, the TurboJPEG API uses "YUV" to + * refer to an image format consisting of Y, Cb, and Cr image planes. */ enum TJSAMP { @@ -85,6 +89,7 @@ enum TJSAMP /** * 4:4:0 chrominance subsampling. The JPEG or YUV image will contain one * chrominance component for every 1x2 block of pixels in the source image. + * Note that 4:4:0 subsampling is not fully accelerated in libjpeg-turbo. */ TJSAMP_440 }; @@ -246,10 +251,11 @@ static const int tjPixelSize[TJ_NUMPF] = {3, 3, 4, 4, 4, 4, 1, 4, 4, 4, 4}; */ #define TJFLAG_FORCESSE3 128 /** - * When decompressing, use the fastest chrominance upsampling algorithm - * available in the underlying codec. The default is to use smooth upsampling, - * which creates a smooth transition between neighboring chrominance components - * in order to reduce upsampling artifacts in the decompressed image. + * When decompressing an image that was compressed using chrominance + * subsampling, use the fastest chrominance upsampling algorithm available in + * the underlying codec. The default is to use smooth upsampling, which + * creates a smooth transition between neighboring chrominance components in + * order to reduce upsampling artifacts in the decompressed image. */ #define TJFLAG_FASTUPSAMPLE 256 /** @@ -262,26 +268,26 @@ static const int tjPixelSize[TJ_NUMPF] = {3, 3, 4, 4, 4, 4, 1, 4, 4, 4, 4}; #define TJFLAG_NOREALLOC 1024 /** * Use the fastest DCT/IDCT algorithm available in the underlying codec. The - * default if this flag is not specified is implementation-specific. The - * libjpeg implementation, for example, uses the fast algorithm by default when - * compressing, because this has been shown to have only a very slight effect - * on accuracy, but it uses the accurate algorithm when decompressing, because - * this has been shown to have a larger effect. + * default if this flag is not specified is implementation-specific. For + * example, the implementation of TurboJPEG for libjpeg[-turbo] uses the fast + * algorithm by default when compressing, because this has been shown to have + * only a very slight effect on accuracy, but it uses the accurate algorithm + * when decompressing, because this has been shown to have a larger effect. */ #define TJFLAG_FASTDCT 2048 /** * Use the most accurate DCT/IDCT algorithm available in the underlying codec. - * The default if this flag is not specified is implementation-specific. The - * libjpeg implementation, for example, uses the fast algorithm by default when - * compressing, because this has been shown to have only a very slight effect - * on accuracy, but it uses the accurate algorithm when decompressing, because - * this has been shown to have a larger effect. + * The default if this flag is not specified is implementation-specific. For + * example, the implementation of TurboJPEG for libjpeg[-turbo] uses the fast + * algorithm by default when compressing, because this has been shown to have + * only a very slight effect on accuracy, but it uses the accurate algorithm + * when decompressing, because this has been shown to have a larger effect. */ #define TJFLAG_ACCURATEDCT 4096 /** - * Number of transform operations + * The number of transform operations */ #define TJ_NUMXOP 8 @@ -439,8 +445,8 @@ typedef struct tjtransform /** * A callback function that can be used to modify the DCT coefficients * after they are losslessly transformed but before they are transcoded to a - * new JPEG file. This allows for custom filters or other transformations to - * be applied in the frequency domain. + * new JPEG image. This allows for custom filters or other transformations + * to be applied in the frequency domain. * * @param coeffs pointer to an array of transformed DCT coefficients. (NOTE: * this pointer is not guaranteed to be valid once the callback @@ -459,7 +465,7 @@ typedef struct tjtransform * 0, 1, and 2 in typical JPEG images.) * @param transformID ID number of the transformed image to which * coeffs belongs. This is the same as the index of the - * transform in the transforms array that was passed to + * transform in the transforms array that was passed to * #tjTransform(). * @param transform a pointer to a #tjtransform structure that specifies the * parameters and/or cropping region for this transform @@ -562,7 +568,7 @@ DLLEXPORT int DLLCALL tjCompress2(tjhandle handle, unsigned char *srcBuf, * the given parameters. The number of bytes returned by this function is * larger than the size of the uncompressed source image. The reason for this * is that the JPEG format uses 16-bit coefficients, and it is thus possible - * for a very high-quality JPEG image with very high frequency content to + * for a very high-quality JPEG image with very high-frequency content to * expand rather than compress when converted to the JPEG format. Such images * represent a very rare corner case, but since there is no way to predict the * size of a JPEG image prior to compression, the corner case has to be @@ -602,13 +608,17 @@ DLLEXPORT unsigned long DLLCALL tjBufSizeYUV(int width, int height, * uses the accelerated color conversion routines in TurboJPEG's underlying * codec to produce a planar YUV image that is suitable for X Video. * Specifically, if the chrominance components are subsampled along the - * horizontal dimension, then the width of the luminance plane is padded to 2 - * in the output image (same goes for the height of the luminance plane, if the - * chrominance components are subsampled along the vertical dimension.) Also, - * each line of each plane in the output image is padded to 4 bytes. Although - * this will work with any subsampling option, it is really only useful in - * combination with TJ_420, which produces an image compatible with the I420 - * (AKA "YUV420P") format. + * horizontal dimension, then the width of the luminance plane is padded to the + * nearest multiple of 2 in the output image (same goes for the height of the + * luminance plane, if the chrominance components are subsampled along the + * vertical dimension.) Also, each line of each plane in the output image is + * padded to 4 bytes. Although this will work with any subsampling option, it + * is really only useful in combination with TJ_420, which produces an image + * compatible with the I420 (AKA "YUV420P") format. + *

    + * NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the + * convention of the digital video community, the TurboJPEG API uses "YUV" to + * refer to an image format consisting of Y, Cb, and Cr image planes. * * @param handle a handle to a TurboJPEG compressor or transformer instance * @param srcBuf pointer to an image buffer containing RGB or grayscale pixels @@ -694,14 +704,15 @@ DLLEXPORT tjscalingfactor* DLLCALL tjGetScalingFactors(int *numscalingfactors); * image. This buffer should normally be pitch * scaledHeight * bytes in size, where scaledHeight can be determined by * calling #TJSCALED() with the JPEG image height and one of the scaling - * factors returned by #tjGetScalingFactors(). The dstBuf pointer may - * also be used to decompress into a specific region of a larger buffer. + * factors returned by #tjGetScalingFactors(). The dstBuf + * pointer may also be used to decompress into a specific region of a + * larger buffer. * @param width desired width (in pixels) of the destination image. If this is - * smaller than the width of the JPEG image being decompressed, then + * different than the width of the JPEG image being decompressed, then * TurboJPEG will use scaling in the JPEG decompressor to generate the * largest possible image that will fit within the desired width. If - * width is set to 0, then only the height will be considered when - * determining the scaled image size. + * width is set to 0, then only the height will be considered + * when determining the scaled image size. * @param pitch bytes per line of the destination image. Normally, this is * scaledWidth * #tjPixelSize[pixelFormat] if the decompressed * image is unpadded, else #TJPAD(scaledWidth * @@ -714,11 +725,11 @@ DLLEXPORT tjscalingfactor* DLLCALL tjGetScalingFactors(int *numscalingfactors); * parameter to 0 is the equivalent of setting it to scaledWidth * * #tjPixelSize[pixelFormat]. * @param height desired height (in pixels) of the destination image. If this - * is smaller than the height of the JPEG image being decompressed, then - * TurboJPEG will use scaling in the JPEG decompressor to generate the - * largest possible image that will fit within the desired height. If - * height is set to 0, then only the width will be considered when - * determining the scaled image size. + * is different than the height of the JPEG image being decompressed, + * then TurboJPEG will use scaling in the JPEG decompressor to generate + * the largest possible image that will fit within the desired height. + * If height is set to 0, then only the width will be + * considered when determining the scaled image size. * @param pixelFormat pixel format of the destination image (see @ref * TJPF "Pixel formats".) * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP @@ -735,16 +746,20 @@ DLLEXPORT int DLLCALL tjDecompress2(tjhandle handle, * Decompress a JPEG image to a YUV planar image. This function performs JPEG * decompression but leaves out the color conversion step, so a planar YUV * image is generated instead of an RGB image. The padding of the planes in - * this image is the same as the images generated by #tjEncodeYUV2(). Note + * this image is the same as in the images generated by #tjEncodeYUV2(). Note * that, if the width or height of the image is not an even multiple of the MCU * block size (see #tjMCUWidth and #tjMCUHeight), then an intermediate buffer * copy will be performed within TurboJPEG. + *

    + * NOTE: Technically, the JPEG format uses the YCbCr colorspace, but per the + * convention of the digital video community, the TurboJPEG API uses "YUV" to + * refer to an image format consisting of Y, Cb, and Cr image planes. * * @param handle a handle to a TurboJPEG decompressor or transformer instance * @param jpegBuf pointer to a buffer containing the JPEG image to decompress * @param jpegSize size of the JPEG image (in bytes) * @param dstBuf pointer to an image buffer that will receive the YUV image. - * Use #tjBufSizeYUV to determine the appropriate size for this buffer + * Use #tjBufSizeYUV() to determine the appropriate size for this buffer * based on the image width, height, and level of subsampling. * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP * "flags". @@ -771,12 +786,12 @@ DLLEXPORT tjhandle DLLCALL tjInitTransform(void); * to another without altering the values of the coefficients. While this is * typically faster than decompressing the image, transforming it, and * re-compressing it, lossless transforms are not free. Each lossless - * transform requires reading and Huffman decoding all of the coefficients in - * the source image, regardless of the size of the destination image. Thus, - * this function provides a means of generating multiple transformed images - * from the same source or of applying multiple transformations simultaneously, - * in order to eliminate the need to read the source coefficients multiple - * times. + * transform requires reading and performing Huffman decoding on all of the + * coefficients in the source image, regardless of the size of the destination + * image. Thus, this function provides a means of generating multiple + * transformed images from the same source or applying multiple + * transformations simultaneously, in order to eliminate the need to read the + * source coefficients multiple times. * * @param handle a handle to a TurboJPEG transformer instance * @param jpegBuf pointer to a buffer containing the JPEG image to transform @@ -792,9 +807,9 @@ DLLEXPORT tjhandle DLLCALL tjInitTransform(void); * -# set dstBufs[i] to NULL to tell TurboJPEG to allocate the * buffer for you, or * -# pre-allocate the buffer to a "worst case" size determined by - * calling #tjBufSize() with the cropped width and height. This should - * ensure that the buffer never has to be re-allocated (setting - * #TJFLAG_NOREALLOC guarantees this.) + * calling #tjBufSize() with the transformed or cropped width and + * height. This should ensure that the buffer never has to be + * re-allocated (setting #TJFLAG_NOREALLOC guarantees this.) * . * If you choose option 1, dstSizes[i] should be set to * the size of your pre-allocated buffer. In any case, unless you have @@ -806,7 +821,7 @@ DLLEXPORT tjhandle DLLCALL tjInitTransform(void); * dstSizes[i] should be set to the size of the buffer. Upon * return, dstSizes[i] will contain the size of the JPEG image * (in bytes.) - * @param transforms pointer to an array of n tjtransform structures, each of + * @param transforms pointer to an array of n #tjtransform structures, each of * which specifies the transform parameters and/or cropping region for * the corresponding transformed output image. * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP diff --git a/usage.txt b/usage.txt index 2abfbea..775a544 100644 --- a/usage.txt +++ b/usage.txt @@ -1,3 +1,6 @@ +NOTE: This file was modified by The libjpeg-turbo Project to include only +information relevant to libjpeg-turbo and to wordsmith certain sections. + USAGE instructions for the Independent JPEG Group's JPEG software ================================================================= @@ -77,6 +80,10 @@ The basic command line switches for cjpeg are: saying -grayscale, you'll get a smaller JPEG file that takes less time to process. + -rgb Create RGB JPEG file. + Using this switch suppresses the conversion from RGB + colorspace input to the default YCbCr JPEG colorspace. + -optimize Perform optimization of entropy encoding parameters. Without this, default encoding parameters are used. -optimize usually makes the JPEG file a little smaller, @@ -250,10 +257,11 @@ The basic command line switches for djpeg are: djpeg runs noticeably faster in this mode. -scale M/N Scale the output image by a factor M/N. Currently - the scale factor must be 1/1, 1/2, 1/4, or 1/8. - Scaling is handy if the image is larger than your - screen; also, djpeg runs much faster when scaling - down the output. + the scale factor must be M/8, where M is an integer + between 1 and 16 inclusive, or any reduced fraction + thereof (such as 1/2, 3/4, etc. Scaling is handy if + the image is larger than your screen; also, djpeg runs + much faster when scaling down the output. -bmp Select BMP output format (Windows flavor). 8-bit colormapped format is emitted if -colors or -grayscale diff --git a/win/jconfig.h.in b/win/jconfig.h.in index be4b5c3..ddcf97e 100644 --- a/win/jconfig.h.in +++ b/win/jconfig.h.in @@ -5,6 +5,7 @@ #define LIBJPEG_TURBO_VERSION @VERSION@ #cmakedefine C_ARITH_CODING_SUPPORTED #cmakedefine D_ARITH_CODING_SUPPORTED +#cmakedefine MEM_SRCDST_SUPPORTED #define HAVE_PROTOTYPES #define HAVE_UNSIGNED_CHAR diff --git a/win/jpeg62-memsrcdst.def b/win/jpeg62-memsrcdst.def new file mode 100755 index 0000000..4511c8e --- /dev/null +++ b/win/jpeg62-memsrcdst.def @@ -0,0 +1,104 @@ +EXPORTS + jcopy_block_row @ 1 ; + jcopy_sample_rows @ 2 ; + jdiv_round_up @ 3 ; + jinit_1pass_quantizer @ 4 ; + jinit_2pass_quantizer @ 5 ; + jinit_c_coef_controller @ 6 ; + jinit_c_main_controller @ 7 ; + jinit_c_master_control @ 8 ; + jinit_c_prep_controller @ 9 ; + jinit_color_converter @ 10 ; + jinit_color_deconverter @ 11 ; + jinit_compress_master @ 12 ; + jinit_d_coef_controller @ 13 ; + jinit_d_main_controller @ 14 ; + jinit_d_post_controller @ 15 ; + jinit_downsampler @ 16 ; + jinit_forward_dct @ 17 ; + jinit_huff_decoder @ 18 ; + jinit_huff_encoder @ 19 ; + jinit_input_controller @ 20 ; + jinit_inverse_dct @ 21 ; + jinit_marker_reader @ 22 ; + jinit_marker_writer @ 23 ; + jinit_master_decompress @ 24 ; + jinit_memory_mgr @ 25 ; + jinit_merged_upsampler @ 26 ; + jinit_phuff_decoder @ 27 ; + jinit_phuff_encoder @ 28 ; + jinit_upsampler @ 29 ; + jpeg_CreateCompress @ 30 ; + jpeg_CreateDecompress @ 31 ; + jpeg_abort @ 32 ; + jpeg_abort_compress @ 33 ; + jpeg_abort_decompress @ 34 ; + jpeg_add_quant_table @ 35 ; + jpeg_alloc_huff_table @ 36 ; + jpeg_alloc_quant_table @ 37 ; + jpeg_calc_output_dimensions @ 38 ; + jpeg_consume_input @ 39 ; + jpeg_copy_critical_parameters @ 40 ; + jpeg_default_colorspace @ 41 ; + jpeg_destroy @ 42 ; + jpeg_destroy_compress @ 43 ; + jpeg_destroy_decompress @ 44 ; + jpeg_fdct_float @ 45 ; + jpeg_fdct_ifast @ 46 ; + jpeg_fdct_islow @ 47 ; + jpeg_fill_bit_buffer @ 48 ; + jpeg_finish_compress @ 49 ; + jpeg_finish_decompress @ 50 ; + jpeg_finish_output @ 51 ; + jpeg_free_large @ 52 ; + jpeg_free_small @ 53 ; + jpeg_gen_optimal_table @ 54 ; + jpeg_get_large @ 55 ; + jpeg_get_small @ 56 ; + jpeg_has_multiple_scans @ 57 ; + jpeg_huff_decode @ 58 ; + jpeg_idct_1x1 @ 59 ; + jpeg_idct_2x2 @ 60 ; + jpeg_idct_4x4 @ 61 ; + jpeg_idct_float @ 62 ; + jpeg_idct_ifast @ 63 ; + jpeg_idct_islow @ 64 ; + jpeg_input_complete @ 65 ; + jpeg_make_c_derived_tbl @ 66 ; + jpeg_make_d_derived_tbl @ 67 ; + jpeg_mem_available @ 68 ; + jpeg_mem_init @ 69 ; + jpeg_mem_term @ 70 ; + jpeg_new_colormap @ 71 ; + jpeg_open_backing_store @ 72 ; + jpeg_quality_scaling @ 73 ; + jpeg_read_coefficients @ 74 ; + jpeg_read_header @ 75 ; + jpeg_read_raw_data @ 76 ; + jpeg_read_scanlines @ 77 ; + jpeg_resync_to_restart @ 78 ; + jpeg_save_markers @ 79 ; + jpeg_set_colorspace @ 80 ; + jpeg_set_defaults @ 81 ; + jpeg_set_linear_quality @ 82 ; + jpeg_set_marker_processor @ 83 ; + jpeg_set_quality @ 84 ; + jpeg_simple_progression @ 85 ; + jpeg_start_compress @ 86 ; + jpeg_start_decompress @ 87 ; + jpeg_start_output @ 88 ; + jpeg_std_error @ 89 ; + jpeg_stdio_dest @ 90 ; + jpeg_stdio_src @ 91 ; + jpeg_suppress_tables @ 92 ; + jpeg_write_coefficients @ 93 ; + jpeg_write_m_byte @ 94 ; + jpeg_write_m_header @ 95 ; + jpeg_write_marker @ 96 ; + jpeg_write_raw_data @ 97 ; + jpeg_write_scanlines @ 98 ; + jpeg_write_tables @ 99 ; + jround_up @ 100 ; + jzero_far @ 101 ; + jpeg_mem_dest @ 102 ; + jpeg_mem_src @ 103 ; diff --git a/win/jpeg7-memsrcdst.def b/win/jpeg7-memsrcdst.def new file mode 100644 index 0000000..8c9f517 --- /dev/null +++ b/win/jpeg7-memsrcdst.def @@ -0,0 +1,106 @@ +EXPORTS + jcopy_block_row @ 1 ; + jcopy_sample_rows @ 2 ; + jdiv_round_up @ 3 ; + jinit_1pass_quantizer @ 4 ; + jinit_2pass_quantizer @ 5 ; + jinit_c_coef_controller @ 6 ; + jinit_c_main_controller @ 7 ; + jinit_c_master_control @ 8 ; + jinit_c_prep_controller @ 9 ; + jinit_color_converter @ 10 ; + jinit_color_deconverter @ 11 ; + jinit_compress_master @ 12 ; + jinit_d_coef_controller @ 13 ; + jinit_d_main_controller @ 14 ; + jinit_d_post_controller @ 15 ; + jinit_downsampler @ 16 ; + jinit_forward_dct @ 17 ; + jinit_huff_decoder @ 18 ; + jinit_huff_encoder @ 19 ; + jinit_input_controller @ 20 ; + jinit_inverse_dct @ 21 ; + jinit_marker_reader @ 22 ; + jinit_marker_writer @ 23 ; + jinit_master_decompress @ 24 ; + jinit_memory_mgr @ 25 ; + jinit_merged_upsampler @ 26 ; + jinit_phuff_decoder @ 27 ; + jinit_phuff_encoder @ 28 ; + jinit_upsampler @ 29 ; + jpeg_CreateCompress @ 30 ; + jpeg_CreateDecompress @ 31 ; + jpeg_abort @ 32 ; + jpeg_abort_compress @ 33 ; + jpeg_abort_decompress @ 34 ; + jpeg_add_quant_table @ 35 ; + jpeg_alloc_huff_table @ 36 ; + jpeg_alloc_quant_table @ 37 ; + jpeg_calc_jpeg_dimensions @ 38 ; + jpeg_calc_output_dimensions @ 39 ; + jpeg_consume_input @ 40 ; + jpeg_copy_critical_parameters @ 41 ; + jpeg_default_colorspace @ 42 ; + jpeg_default_qtables @ 43 ; + jpeg_destroy @ 44 ; + jpeg_destroy_compress @ 45 ; + jpeg_destroy_decompress @ 46 ; + jpeg_fdct_float @ 47 ; + jpeg_fdct_ifast @ 48 ; + jpeg_fdct_islow @ 49 ; + jpeg_fill_bit_buffer @ 50 ; + jpeg_finish_compress @ 51 ; + jpeg_finish_decompress @ 52 ; + jpeg_finish_output @ 53 ; + jpeg_free_large @ 54 ; + jpeg_free_small @ 55 ; + jpeg_gen_optimal_table @ 56 ; + jpeg_get_large @ 57 ; + jpeg_get_small @ 58 ; + jpeg_has_multiple_scans @ 59 ; + jpeg_huff_decode @ 60 ; + jpeg_idct_1x1 @ 61 ; + jpeg_idct_2x2 @ 62 ; + jpeg_idct_4x4 @ 63 ; + jpeg_idct_float @ 64 ; + jpeg_idct_ifast @ 65 ; + jpeg_idct_islow @ 66 ; + jpeg_input_complete @ 67 ; + jpeg_make_c_derived_tbl @ 68 ; + jpeg_make_d_derived_tbl @ 69 ; + jpeg_mem_available @ 70 ; + jpeg_mem_init @ 71 ; + jpeg_mem_term @ 72 ; + jpeg_new_colormap @ 73 ; + jpeg_open_backing_store @ 74 ; + jpeg_quality_scaling @ 75 ; + jpeg_read_coefficients @ 76 ; + jpeg_read_header @ 77 ; + jpeg_read_raw_data @ 78 ; + jpeg_read_scanlines @ 79 ; + jpeg_resync_to_restart @ 80 ; + jpeg_save_markers @ 81 ; + jpeg_set_colorspace @ 82 ; + jpeg_set_defaults @ 83 ; + jpeg_set_linear_quality @ 84 ; + jpeg_set_marker_processor @ 85 ; + jpeg_set_quality @ 86 ; + jpeg_simple_progression @ 87 ; + jpeg_start_compress @ 88 ; + jpeg_start_decompress @ 89 ; + jpeg_start_output @ 90 ; + jpeg_std_error @ 91 ; + jpeg_stdio_dest @ 92 ; + jpeg_stdio_src @ 93 ; + jpeg_suppress_tables @ 94 ; + jpeg_write_coefficients @ 95 ; + jpeg_write_m_byte @ 96 ; + jpeg_write_m_header @ 97 ; + jpeg_write_marker @ 98 ; + jpeg_write_raw_data @ 99 ; + jpeg_write_scanlines @ 100 ; + jpeg_write_tables @ 101 ; + jround_up @ 102 ; + jzero_far @ 103 ; + jpeg_mem_dest @ 104 ; + jpeg_mem_src @ 105 ; -- 2.7.4