From 9f2cfdb81c9b40ea164bc25daca45c77ebe376a6 Mon Sep 17 00:00:00 2001 From: konablend Date: Sun, 1 Mar 2009 17:03:11 +0000 Subject: [PATCH] BuildSystem: conversion from jam-based to make-based system. KNOWN ISSUES: 1. OSX + Xcode builds do not support parallel builds; attempting to use them may cause unbounded number of jobs. However, disabling via configure --disable-xcode avoids the issue. 2. OSX ppc binary produces binary which has audio-scan problems. 3. OSX ppc64 binary has not been runtime tested. ADDED: 00-BuildUserGuide.txt contrib/*/module.* doc/ make/ libhb/module.* test/module.* macos/module.* gtk/module.* DROPPED: BUILD BuildContribDarwin.sh DownloadMacOsXContribBinaries.sh Jamfile Jamrules MacOsXContribBinariesVersion.txt Makefile Makefile.config jam libhb/Jamefile libhb/Makefile test/BUILDSHARED test/Makefile contrib/Jamfile contrib/Makefile contrib/patch-ffmpeg.patch contrib/patch-x264-idr.patch contrib/patch-x264-linux.patch RENAMED: contrib/*.patch -> contrib/MODULE/[AP]??-*.patch macosx/HandBrake.plist -> macosx/Info.plist MODIFIED: libhb/decavcodec.c Patched to use cleaner include "libavcodec/audioconvert". Second part to support this cleanup is ffmpeg A02-audioconvert.patch . MODIFIED: libhb/hb.c MODIFIED: libhb/hb.h MODIFIED: libhb/muxmkv.c MODIFIED: libhb/muxmp4.c MODIFIED: libhb/update.c Patched to use "project.h" for project metadata. Renamed HB_BUILD -> HB_PROJECT_BUILD. Renamed HB_VERSION -> HB_PROJECT_VERSION. MODIFIED: test/test.c: Patched HandBrakeCLI to support I/O on Mac OS X ZFS filesystems. Reference r1803 as similar patch for HandBrake.app . Unpatched behavior is crash/buserror when using ZFS. MODIFIED: macosx/Growl.framework/ Upgraded 0.7.6 (i386,ppc) -> 1.1.2 (i386,x86_64,ppc,ppc64). New architectures facilitate x86_64 and ppc64 builds. MODIFIED: macosx/HandBrake.xcodeproj/ Bumped compatibilty mode from 2.4 -> 3.1 . Dumped old configurations Deployment, Developer. Added configurations standard, sebug as replacements. Added standard.i386, standard.x86_64, standard.ppc, standard.ppc64 . for explicit architecture build. All configurations settings cleaned up and normalized. Build output directories adjusted to support new build system. git-svn-id: svn://localhost/HandBrake/trunk@2180 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- 00-BuildUserGuide.txt | 375 +++++ BUILD | 85 -- BuildContribsDarwin.sh | 72 - DownloadMacOsXContribBinaries.sh | 34 - Jamfile | 98 -- Jamrules | 101 -- MacOsXContribBinariesVersion.txt | 1 - Makefile | 162 --- Makefile.config | 22 - configure | 164 +-- contrib/Jamfile | 494 ------- contrib/Makefile | 49 - .../{patch-a52dec.patch => a52dec/A00-dpl2.patch} | 0 contrib/a52dec/module.defs | 6 + contrib/a52dec/module.rules | 2 + contrib/bzip2/module.defs | 24 + contrib/bzip2/module.rules | 2 + .../P00-cygwin.patch} | 0 contrib/faac/module.defs | 8 + contrib/faac/module.rules | 2 + .../A00-libtool22.patch} | 0 contrib/faad2/module.defs | 7 + contrib/faad2/module.rules | 2 + .../A00-latm.patch} | 431 +++--- .../A01-mpegleak.patch} | 18 +- contrib/ffmpeg/A02-audioconvert.patch | 12 + .../P00-cygwin.patch} | 0 .../P01-sunos.patch} | 0 .../P02-darwin-h264dsp-crash.patch} | 0 contrib/ffmpeg/module.defs | 32 + contrib/ffmpeg/module.rules | 2 + contrib/lame/P00-darwin-xmmintrin.patch | 28 + contrib/lame/module.defs | 5 + contrib/lame/module.rules | 2 + .../A00-general.patch} | 0 contrib/libdca/module.defs | 5 + contrib/libdca/module.rules | 2 + .../P00-darwin-css-vlc-dylib.patch} | 5 +- .../P01-cygwin.patch} | 0 contrib/libdvdread/module.defs | 5 + contrib/libdvdread/module.rules | 2 + contrib/libmkv/module.defs | 5 + contrib/libmkv/module.rules | 2 + contrib/libmp4v2/module.defs | 5 + contrib/libmp4v2/module.rules | 2 + contrib/libogg/module.defs | 7 + contrib/libogg/module.rules | 2 + contrib/libsamplerate/module.defs | 5 + contrib/libsamplerate/module.rules | 2 + contrib/libtheora/module.defs | 13 + contrib/libtheora/module.rules | 2 + contrib/libvorbis/module.defs | 7 + contrib/libvorbis/module.rules | 2 + contrib/mpeg2dec/module.defs | 7 + contrib/mpeg2dec/module.rules | 2 + contrib/patch-ffmpeg.patch | 18 - contrib/patch-libmpeg2.patch | 33 - contrib/patch-x264-idr.patch | 17 - contrib/patch-x264-linux.patch | 194 --- contrib/patch_mpeg4ip_cygwin.patch | 262 ---- contrib/version_a52dec.txt | 1 - contrib/version_bzip2.txt | 1 - contrib/version_faac.txt | 1 - contrib/version_faad2.txt | 1 - contrib/version_ffmpeg.txt | 1 - contrib/version_lame.txt | 1 - contrib/version_libdca.txt | 1 - contrib/version_libdvdcss.txt | 1 - contrib/version_libdvdread.txt | 1 - contrib/version_libmkv.txt | 1 - contrib/version_libmp4v2.txt | 1 - contrib/version_libogg.txt | 1 - contrib/version_libsamplerate.txt | 1 - contrib/version_libtheora.txt | 2 - contrib/version_libvorbis.txt | 1 - contrib/version_mpeg2dec.txt | 1 - contrib/version_mpeg4ip.txt | 1 - contrib/version_qt.txt | 1 - contrib/version_x264.txt | 1 - contrib/version_xvidcore.txt | 1 - contrib/version_zlib.txt | 1 - .../P00-cygwin.patch} | 0 .../P01-sunos.patch} | 0 contrib/x264/module.defs | 11 + contrib/x264/module.rules | 2 + .../A00-nasm.patch} | 0 .../A01-fdct.patch} | 0 .../P00-darwin.patch} | 0 .../P01-cygwin.patch} | 0 contrib/xvidcore/module.defs | 20 + contrib/xvidcore/module.rules | 2 + contrib/zlib/module.defs | 6 + contrib/zlib/module.rules | 2 + doc/module.defs | 41 + doc/module.rules | 20 + doc/texi/BuildUserGuide.texi | 280 ++++ doc/texi/base/article.texi | 6 + doc/texi/base/glossary.texi | 7 + doc/texi/base/handbrake.texi.m4 | 30 + doc/texi/build/command.texi | 27 + doc/texi/build/platform.common.bundled.texi | 3 + gtk/INSTALL | 5 +- gtk/module.defs | 14 + gtk/module.rules | 34 + jam | Bin 203788 -> 0 bytes libhb/Jamfile | 40 - libhb/Makefile | 101 -- libhb/decavcodec.c | 4 +- libhb/hb.c | 4 +- libhb/hb.h | 2 +- libhb/module.defs | 47 + libhb/module.rules | 28 + libhb/muxmkv.c | 2 +- libhb/muxmp4.c | 2 +- libhb/project.h.m4 | 33 + libhb/stream.c | 0 libhb/update.c | 12 +- macosx/Growl.framework/Versions/A/Growl | Bin 140048 -> 330764 bytes .../A/Headers/GrowlApplicationBridge-Carbon.h | 58 +- .../Versions/A/Headers/GrowlApplicationBridge.h | 87 +- .../Versions/A/Headers/GrowlDefines.h | 51 +- .../Versions/A/Resources/Info.plist | 6 +- macosx/HandBrake.xcodeproj/project.pbxproj | 1466 ++++++++++---------- macosx/Info.h.m4 | 15 + macosx/{HandBrake.plist => Info.plist} | 22 +- macosx/module.defs | 29 + macosx/module.rules | 20 + make/configure.py | 752 ++++++++++ make/include/base.defs | 50 + make/include/contrib.defs | 276 ++++ make/include/function.defs | 19 + make/include/gcc.defs | 146 ++ make/include/main.defs | 75 + make/include/main.rules | 39 + make/include/report.defs | 53 + make/include/select.defs | 12 + make/include/target.defs | 14 + make/include/tool.defs | 10 + make/variant/cygwin.defs | 8 + make/variant/darwin.defs | 61 + make/variant/darwin.rules | 20 + make/variant/darwin.x86_64.defs | 3 + make/variant/freebsd.defs | 4 + make/variant/linux.defs | 11 + test/BUILDSHARED | 36 - test/Makefile | 36 - test/module.defs | 41 + test/module.rules | 20 + test/test.c | 41 +- 149 files changed, 4047 insertions(+), 3087 deletions(-) create mode 100644 00-BuildUserGuide.txt delete mode 100644 BUILD delete mode 100755 BuildContribsDarwin.sh delete mode 100755 DownloadMacOsXContribBinaries.sh delete mode 100644 Jamfile delete mode 100644 Jamrules delete mode 100644 MacOsXContribBinariesVersion.txt delete mode 100644 Makefile delete mode 100644 Makefile.config mode change 100755 => 100644 configure delete mode 100644 contrib/Jamfile delete mode 100644 contrib/Makefile rename contrib/{patch-a52dec.patch => a52dec/A00-dpl2.patch} (100%) create mode 100644 contrib/a52dec/module.defs create mode 100644 contrib/a52dec/module.rules create mode 100644 contrib/bzip2/module.defs create mode 100644 contrib/bzip2/module.rules rename contrib/{patch-faac-cygwin.patch => faac/P00-cygwin.patch} (100%) create mode 100644 contrib/faac/module.defs create mode 100644 contrib/faac/module.rules rename contrib/{patch-faad2-libtool22.patch => faad2/A00-libtool22.patch} (100%) create mode 100644 contrib/faad2/module.defs create mode 100644 contrib/faad2/module.rules rename contrib/{patch-ffmpeg-latm.patch => ffmpeg/A00-latm.patch} (92%) rename contrib/{patch-ffmpeg-mpegleak.patch => ffmpeg/A01-mpegleak.patch} (82%) create mode 100644 contrib/ffmpeg/A02-audioconvert.patch rename contrib/{patch-ffmpeg-cygwin.patch => ffmpeg/P00-cygwin.patch} (100%) rename contrib/{patch-ffmpeg-solaris.patch => ffmpeg/P01-sunos.patch} (100%) rename contrib/{patch-ffmpeg-h264dsp-crash.diff => ffmpeg/P02-darwin-h264dsp-crash.patch} (100%) create mode 100644 contrib/ffmpeg/module.defs create mode 100644 contrib/ffmpeg/module.rules create mode 100644 contrib/lame/P00-darwin-xmmintrin.patch create mode 100644 contrib/lame/module.defs create mode 100644 contrib/lame/module.rules rename contrib/{patch-libdca.patch => libdca/A00-general.patch} (100%) create mode 100644 contrib/libdca/module.defs create mode 100644 contrib/libdca/module.rules rename contrib/{patch-libdvdread-css-vlc-dylib.patch => libdvdread/P00-darwin-css-vlc-dylib.patch} (54%) rename contrib/{patch-libdvdread-cygwin.patch => libdvdread/P01-cygwin.patch} (100%) create mode 100644 contrib/libdvdread/module.defs create mode 100644 contrib/libdvdread/module.rules create mode 100644 contrib/libmkv/module.defs create mode 100644 contrib/libmkv/module.rules create mode 100644 contrib/libmp4v2/module.defs create mode 100644 contrib/libmp4v2/module.rules create mode 100644 contrib/libogg/module.defs create mode 100644 contrib/libogg/module.rules create mode 100644 contrib/libsamplerate/module.defs create mode 100644 contrib/libsamplerate/module.rules create mode 100644 contrib/libtheora/module.defs create mode 100644 contrib/libtheora/module.rules create mode 100644 contrib/libvorbis/module.defs create mode 100644 contrib/libvorbis/module.rules create mode 100644 contrib/mpeg2dec/module.defs create mode 100644 contrib/mpeg2dec/module.rules delete mode 100644 contrib/patch-ffmpeg.patch delete mode 100644 contrib/patch-libmpeg2.patch delete mode 100644 contrib/patch-x264-idr.patch delete mode 100644 contrib/patch-x264-linux.patch delete mode 100644 contrib/patch_mpeg4ip_cygwin.patch delete mode 100644 contrib/version_a52dec.txt delete mode 100644 contrib/version_bzip2.txt delete mode 100644 contrib/version_faac.txt delete mode 100644 contrib/version_faad2.txt delete mode 100644 contrib/version_ffmpeg.txt delete mode 100644 contrib/version_lame.txt delete mode 100644 contrib/version_libdca.txt delete mode 100644 contrib/version_libdvdcss.txt delete mode 100644 contrib/version_libdvdread.txt delete mode 100644 contrib/version_libmkv.txt delete mode 100644 contrib/version_libmp4v2.txt delete mode 100644 contrib/version_libogg.txt delete mode 100644 contrib/version_libsamplerate.txt delete mode 100644 contrib/version_libtheora.txt delete mode 100644 contrib/version_libvorbis.txt delete mode 100644 contrib/version_mpeg2dec.txt delete mode 100644 contrib/version_mpeg4ip.txt delete mode 100644 contrib/version_qt.txt delete mode 100644 contrib/version_x264.txt delete mode 100644 contrib/version_xvidcore.txt delete mode 100644 contrib/version_zlib.txt rename contrib/{patch-x264-cygwin.patch => x264/P00-cygwin.patch} (100%) rename contrib/{patch-x264-solaris.patch => x264/P01-sunos.patch} (100%) create mode 100644 contrib/x264/module.defs create mode 100644 contrib/x264/module.rules rename contrib/{patch-xvidcore-nasm-2.00-configure.patch => xvidcore/A00-nasm.patch} (100%) rename contrib/{patch-xvidcore-fdct.patch => xvidcore/A01-fdct.patch} (100%) rename contrib/{patch-xvidcore-macosx.patch => xvidcore/P00-darwin.patch} (100%) rename contrib/{patch-xvidcore-cygwin.patch => xvidcore/P01-cygwin.patch} (100%) create mode 100644 contrib/xvidcore/module.defs create mode 100644 contrib/xvidcore/module.rules create mode 100644 contrib/zlib/module.defs create mode 100644 contrib/zlib/module.rules create mode 100644 doc/module.defs create mode 100644 doc/module.rules create mode 100644 doc/texi/BuildUserGuide.texi create mode 100644 doc/texi/base/article.texi create mode 100644 doc/texi/base/glossary.texi create mode 100644 doc/texi/base/handbrake.texi.m4 create mode 100644 doc/texi/build/command.texi create mode 100644 doc/texi/build/platform.common.bundled.texi create mode 100644 gtk/module.defs create mode 100644 gtk/module.rules delete mode 100755 jam delete mode 100644 libhb/Jamfile delete mode 100644 libhb/Makefile create mode 100644 libhb/module.defs create mode 100644 libhb/module.rules create mode 100644 libhb/project.h.m4 mode change 100755 => 100644 libhb/stream.c create mode 100644 macosx/Info.h.m4 rename macosx/{HandBrake.plist => Info.plist} (70%) create mode 100644 macosx/module.defs create mode 100644 macosx/module.rules create mode 100644 make/configure.py create mode 100644 make/include/base.defs create mode 100644 make/include/contrib.defs create mode 100644 make/include/function.defs create mode 100644 make/include/gcc.defs create mode 100644 make/include/main.defs create mode 100644 make/include/main.rules create mode 100644 make/include/report.defs create mode 100644 make/include/select.defs create mode 100644 make/include/target.defs create mode 100644 make/include/tool.defs create mode 100644 make/variant/cygwin.defs create mode 100644 make/variant/darwin.defs create mode 100644 make/variant/darwin.rules create mode 100644 make/variant/darwin.x86_64.defs create mode 100644 make/variant/freebsd.defs create mode 100644 make/variant/linux.defs delete mode 100644 test/BUILDSHARED delete mode 100644 test/Makefile create mode 100644 test/module.defs create mode 100644 test/module.rules diff --git a/00-BuildUserGuide.txt b/00-BuildUserGuide.txt new file mode 100644 index 00000000..3dd30412 --- /dev/null +++ b/00-BuildUserGuide.txt @@ -0,0 +1,375 @@ +HandBrake 0.9.3 Build User Guide +******************************** + +Table of Contents +***************** + +1 Introduction +2 Quickstart +3 Build Process + 3.1 Checkout Sources + 3.2 Configure + 3.3 Build + 3.4 Clean + 3.5 Extra Clean +4 Make Targets + 4.1 Global + 4.2 General Modules + 4.3 Contrib Modules + 4.4 Contrib Aggregate +5 Platform Requirements and Notes + 5.1 Mac OS X + 5.2 Cygwin + 5.3 Linux + + +1 Introduction +************** + +This guide documents the recommended process to build HandBrake from +the official source-code repository. Building from any other source is +not unsupported. + +2 Quickstart +************ + +This chapter is for the impatient or those just looking for a quick +summary of the commands used to launch a typical build with the fewest +commands possible. For more control over the build process please skip +this section and jump to *Note Build Process:: for full details. + + svn checkout svn://svn.handbrake.fr/HandBrake/trunk hb-trunk + cd hb-trunk + ./configure --launch + +The above is an special streamlined invocation of `configure' which +performs the following steps automatically: + + * assert scratch directory `build/' does not exist + + * create scratch directory `build/' + + * change to directory `build/' + + * launch `make' + + * capture build output to `build/log.txt' + + * echo build output + +3 Build Process +*************** + +3.1 Checkout Sources +==================== + +Checkout HandBrake from the official source-code repository. + + svn checkout svn://svn.handbrake.fr/HandBrake/trunk hb-trunk + cd hb-trunk + +Sources are checked out from the `trunk' branch. This document was +generated from that very branch, and for example purposes, we will use +exactly the same branch. + +If you have write-access to the repository, then you may add the +appropriate login/password information as needed. It is recommended to +use Subversion 1.5.0 or higher. Lower versions should also work. + +3.2 Configure +============= + +Configure the build system. + + rm -fr build/ + mkdir build/ + cd build/ + ../configure + +Create a scratch directory which will contain all files created during +the build process. The directory name is arbitrary but we recommend +something simple and descriptive. One directory is required for each +distinctly configured build. We name our directory `build' for example +purposes. + +The `configure' utility accepts many options. It is recommended that +you specify `--help' for the complete list of options. The following +options are detailed: + +`--help' + List available options. + +`--debug=MODE' + Select debug mode. Must be one of `none', `min', `std', `max'. + This generally maps to gcc options `-g0', `-g1', `-g2', `-g3'. + +`--optimize=MODE' + Select optimize mode. Must be one of `none', `speed', `size'. + This generally maps to gcc options `-g0', `-O0', `-O3', `-Os'. + +`--arch=MODE' + Select build architecture. The available architectures vary by + platform. Most platforms support exactly one architecture except + Mac OS X which has support for various universal binary + architectures. The available choices are hard-coded per platform + and no sanity checks for the required tools are performed. + +`--gcc=EXE' + Specify the `gcc' executable to use where EXE is the executable + name which is either absolute or environment `PATH' is searched + accordingly. + +Clean-room procedures dictate that when certain factors change, old +builds should be scrapped and new builds configured. This is the main +reason for requiring a scratch directory; to promote consistent, +reliable and clean software builds. The following is a short list of +some of the reasons why someone may choose to scrap an existing build: + + * configure with different options + + * subversion working dir is updated and you want configure to + re-evaluate working dir metadata. + + * build corruption is suspected + +There are generally two methods for scrapping a build. The `build' +directory can be recusrively removed which has the effect of loosing +your existing configuration but does guarantee no residuals are left +behind. The other method is to use ask the build system to perform an +`xclean'. This is known to work well but will leave empty directories +behind. However, the configuration is left intact. See *Note Extra +Clean:: for further details. + +3.3 Build +========= + +Build main product. All necessary dependencies are also built if +required. + + make + +Parallel builds may optionally be enabled. Be aware that while a +parallel build may save time on systems with additional cores, the +output is often mixed, overlapped and sometimes even corrupted with +binary characters. Thus if you experience a build issue, you should +clean and redo the build in default serial mode to produce a readable +log. The following command allows for up to 4 concurrent jobs via make: + + make -j4 + +3.4 Clean +========= + +Clean all build output excluding contrib modules. Configuration is +retained. + + make clean + +3.5 Extra Clean +=============== + +Clean all build output including contrib modules. Configuration is +retained. + + make xclean + +4 Make Targets +************** + +The build system supports passing many kinds of targets some of which +become very useful in normal development cycles. The targets by +convention are lower-case words passed to `make'. Global targets are +one-word targets. Scoped targets are usually two-words seperated by a +period. + +4.1 Global +========== + +`make' + Alias for `make build'. + +`make build' + Build main product. All necessary dependencies are also built if + required. + +`make clean' + Clean all build output excluding contrib modules. Configuration is + retained. + +`make xclean' + Clean all build output including contrib modules. Configuration is + retained. + +4.2 General Modules +=================== + +General modules such as `libhb' and `test' have the following scoped +targets: + +`make MODULE.build' + Build MODULE. + +`make MODULE.clean' + Clean build output for MODULE. + +4.3 Contrib Modules +=================== + +Contrib modules such as `a52dec', `bzip2', `faac', `faad2', `ffmpeg', +`lame', `libdca', `libdvdread', `libmkv', `libmp4v2', `libogg', +`libsamplerate', `libtheora', `libvorbis', `mpeg2dec', `x264', +`xvidcore' and `zlib' have the following scoped targets: + +`make MODULE.fetch' + Download source tarball from the Internet and save to + `TOP/downloads' directory. No checksumming is performed. + +`make MODULE.extract' + Extract source tarball into `build' tree. + +`make MODULE.patch' + Apply appropriate patches (if any) to module sources. + +`make MODULE.configure' + Configure module sources. This usually invokes autotool configure. + +`make MODULE.build' + Build module. This usually invokes autotool build. + +`make MODULE.install' + Install module products such as headers and libraries into `build' + tree. This usually invokes autotool install. + +`make MODULE.uninstall' + Uninstall module products; generally the reverse of install. This + usually invokes autotool uninstall. + +`make MODULE.clean' + Clean module; generally the reverse of build. This usually + invokes autotool clean. + +`make MODULE.xclean' + Extra clean module; first invokes uninstall then recursively + removes the module build directory. + +4.4 Contrib Aggregate +===================== + +For convenience, the following targets aggregate the all contrib +modules' respective targets together: + + * make contrib.fetch + + * make contrib.extract + + * make contrib.patch + + * make contrib.configure + + * make contrib.build + + * make contrib.install + + * make contrib.uninstall + + * make contrib.clean + + * make contrib.xclean + +5 Platform Requirements and Notes +********************************* + +The build system supports various platforms of interest to the project. +However this does not mean it supports all plaforms. If the platform is +not listed in this chapter, then it is not supported. + +The following tools are used on various platforms and it is recommended +you use these versions or newer: + + * python - Python 2.4.6 + + * curl - curl 7.19.3 (or wget) + + * m4 - GNU M4 1.4.6 + + * make - GNU Make 3.81 + + * patch - Patch 2.5.8 + + * tar - GNU tar 1.15.1 + + * wget - GNU Wget 1.11.4 (or curl) + +5.1 Mac OS X +============ + +Building on Mac OS X is well supported. It is the reference platform +for HandBrake. The following are the recommended specifications for +this platform; but is not necessarily the only configuration that is +possible: + + * Mac Intel hardware + + * Mac OS X 10.5.6 + + * Xcode-3.1.2 + + * gcc 4.0.1 (Apple Inc. build 5490) + + * yasm 0.7.2.2153 (for i386 or x86_64 architectures) + + Note: It is recommended to use the platform distribution's bundled + compiler for maximum C++ compatibility. If you build with a custom + compiler it will likely introduce non-standard runtime + requirements. There are of course many valid reasons to build with + unbundled compilers, but be aware it is generally unsupported and + left as an exercise to the reader. + +5.2 Cygwin +========== + +Building on Cygwin is supported. The following are the recommended +specifications for this platform; but is not necessarily the only +configuration that is possible: + + * Intel 32-bit or 64-bit hardware + + * Cygwin, gcc 4.3.2 + + * yasm 0.7.1.2093 (for i386 or x86_64 architectures) + + Note: As of this writing, Cygwin has available to it several + versions of gcc; only one of which may be found and used in the + path as `gcc' and `g++'. Configure will thus find what is probably + the older version of gcc in a typical Cygwin environment. If you + desire to build with the newer gcc, it is found in the path as + `gcc-4' and `g++-4' respectively and you must indicate to + configure the desired versions. The following syntax should do the + trick: + + ../configure --gcc=gcc-4 + +5.3 Linux +========= + +Building on Linux is supported. The following are the recommended +specifications for this platform; but is not necessarily the only +configuration that is possible: + + * Intel 32-bit or 64-bit hardware + + * Fedora 8, gcc 4.1.2, yasm 0.6.2.1985 + + * Fedora 9, gcc 4.3.0, yasm 0.6.2.1985 + + * Fedora 10, gcc 4.3.2, yasm 0.7.1.2093 + + * gcc 4.0.0 or higher is reported to work + + Note: It is recommended to use the platform distribution's bundled + compiler for maximum C++ compatibility. If you build with a custom + compiler it will likely introduce non-standard runtime + requirements. There are of course many valid reasons to build with + unbundled compilers, but be aware it is generally unsupported and + left as an exercise to the reader. + diff --git a/BUILD b/BUILD deleted file mode 100644 index edd841e6..00000000 --- a/BUILD +++ /dev/null @@ -1,85 +0,0 @@ -$Id: BUILD,v 1.11 2005/10/23 01:35:59 titer Exp $ - -BUILD file for HandBrake - -Building HandBrake with make -============================= - -Step 1: get needed tools -============== - -+ gcc and g++ - There are usually included in your OS' dev tools. On BeOS/Zeta, the - default gcc isn't enough, gcc 2.95.3 is required. - -+ nasm (Only for x86. On Mac OS X Intel, Xcode 2.4.1 include it) - -Cygwin: - See Trac > Windows Compile Guide - -Step 2: configuration -============== - -The HB_BUILD and HB_VERSION are defined in a single file, the Makefile correct the values in Xcode too. - -The file where the informations are stored is Makefile.config - -Step 3: build -============== - -Run `make'. This will build libhb, Handbrake and HandBrakeCLI as Universal Binary. -This build method use precompiled contrib libraries. Script to build those binaries are provided too. -All the build is handled by Xcode 2.4.1, should work on powerPC and Intel Macs. - -# To build under Cygwin simply use the command: -make HandbrakeCLI - -This will download pre-compiled libaries and build the handbrake source. - ------------------------------------------------------------------------------------------------------ - -Building HandBrake with jam -============================= - -You can build HandBrake on BeOS, MacOS X, Linux, and on Windows using Cygwin. -If you'd like to port it to another OS, email me (titer@m0k.org). - -Step 1: get needed tools -============== - -+ gcc and g++ - There are usually included in your OS' dev tools. On BeOS/Zeta, the - default gcc isn't enough, gcc 2.95.3 is required. - -+ jam - I use 2.5rc3, earlier versions might cause issues. - On BeOS, you can download it at . - On OS X, you cannot use the modified jam shipped with the developer - tools, use the one included in the Handbrake svn checkout instead. - On Cygwin, get the jam source from - http://public.perforce.com/public/jam/index.html, - compile it with gcc in Cygwin, and put the jam executable somewhere on - your path. - -+ nasm (Only for x86. On Mac OS X Intel, Xcode 2.4.1 include it) - -+ libtool, autoconf, automake - To build libdca (the DTS audio extraction library) on Mac OS X via jam, you'll - need to update the default Mac OS X versions of libtool, autoconf and automake. - Compilation has been seen to work with libtool and libtool-shlibs v1.5.22-1000, - autoconf v2.60-4, and automake v1.9.6-3. You can update these tools using Fink. - Download the Fink 0.8.1 Binary Installer for your platform (PowerPC or Intel) - from http://www.finkproject.org/download/index.php?phpLang=en and install Fink - using the installer. If you want to use a GUI to run Fink, you can install - FinkCommander. Download the FinkCommander 0.5.4 installer from - http://finkcommander.sourceforge.net/ and install from the disk image. You can - install libtool, libtool-shlibs, autoconf and automake using FinkCommander. - -Cygwin: - See Trac > Windows Compile Guide - -Step 2: build -============== - -Run `./configure && jam'. This will build every library HandBrake -requires, then HandBrake itself. diff --git a/BuildContribsDarwin.sh b/BuildContribsDarwin.sh deleted file mode 100755 index 736d7cd1..00000000 --- a/BuildContribsDarwin.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/sh -# This script build the contrib libs -# This used on MaxOs X to generate a universal version of the contrib libraries -# The new building process for HandBrake is to download a precompiled universal contrib folder -# and use them to build universal binaries of HandBrake -# pri: 01/28/07 -# ######################################################################## -# Parameters: -# Package Version (Version must be incremented to ensure that each of trunk/branches use the correct version) -# IP of the other platform host -# Username to connect with (passwordless must be setup between the 2 machines) -# -# ie: ./BuildContribsDarwin.sh 0001 192.168.0.150 toto -# -# ######################################################################### -# The script will connect to the other computer, download and build all of the contrib libraries -# and in the same time download and compile the contrib libraries on the native system -# My setup to do that is Mac Pro Intel as native and a Mac mini G4 ppc as foreign -# -# Native is the master computer, it sends compile commands to the foreign, get the library, then do a lipo -# to assemble both versions and put a universal binary version of the library in contrib/lib folder -# -# Once all of the contrib libraries are builded, a contribbin-darwin-${version}.tar.gz file is created, this file must -# be uploaded to the ftp server so Xcode will be able to build universal binaries of the HandBrake, HandBrakeCLI and libhb -# -# ########################################################################## -# SSH passwordless setup instructions -# 1) log on native using terminal -# 2) ssh-keygen -t rsa -# 3) leave passphrase empty (hit return) -# 4) copy the $HOME/.ssh/id_rsa.pub to foreign machine $HOME/.ssh/authorized_keys -# ########################################################################## -export VERSION=$1 -export IP=$2 -export USERNAME=$3 -export REPOS=svn://svn.handbrake.fr/HandBrake/trunk -# ########################################################################## -# Launch the build on the foreign system -# ########################################################################## -ssh $USERNAME@$IP "rm -rf HBBUILDTMP ; mkdir HBBUILDTMP ; svn co $REPOS HBBUILDTMP ; cd HBBUILDTMP ; ./configure ; cd contrib ; cp ../config.jam . ; ../jam ; touch BUILDTERMINATED" & -./configure -cd contrib -rm -rf lib include *tar.gz bin share man native foreign -cp ../config.jam . -# Use the new UB jam to be shure to use the correct version to build libraries (native on each system) -../jam -mkdir native -mv lib native -mkdir lib -mkdir foreign -# wait until the foreign build is done :) -wait -echo the foreign build is done, transferring files to native computer: -cd foreign -mkdir lib -cd lib -scp $USERNAME@$IP:/Users/$USERNAME/HBBUILDTMP/contrib/lib/*a . -for lib in `ls *.a` -do - echo ... lipo contrib libraries: $lib - lipo -create $lib ../../native/lib/$lib -output ../../lib/$lib -done; - - -cd ../.. -echo $VERSION > DarwinContribVersion.txt -echo Creating contribbin-darwin-$VERSION.tar.gz -tar zcvf contribbin-darwin-$VERSION.tar.gz lib include DarwinContribVersion.txt -echo Done.... -ls -l contribbin-darwin-$VERSION.tar.gz -cd .. -echo $VERSION > MacOsXContribBinariesVersion.txt diff --git a/DownloadMacOsXContribBinaries.sh b/DownloadMacOsXContribBinaries.sh deleted file mode 100755 index 29e28282..00000000 --- a/DownloadMacOsXContribBinaries.sh +++ /dev/null @@ -1,34 +0,0 @@ -#! /bin/sh - -# Incremented every time a new contrib package is available -VERSION=`cat MacOsXContribBinariesVersion.txt` - -if [ -f contrib/DarwinContribVersion.txt ]; then - if [ "`cat contrib/DarwinContribVersion.txt`" = $VERSION ]; then - echo "Contribs are up to date." - exit 0 - fi -fi - -HOST=download.m0k.org -#HOST=download.mediafork.dynalias.com -#HOST=sr55.ashosted.com -FILE=contribbin-darwin-$VERSION.tar.gz -#URL=http://$HOST/contrib/$FILE -URL=http://$HOST/handbrake/contrib/$FILE -# Check for internet connectivity -if ! host $HOST > /dev/null 2>&1; then - echo "Please connect to the Internet (could not resolve $HOST)." - exit 1 -fi - -# Look for something that can handle an HTTP download - WGET="curl -L -O" - -# Get and install the package -echo "Getting contribs ($VERSION)..." -( cd contrib && rm -f $FILE && $WGET $URL && rm -Rf lib include && \ - tar xzf $FILE && ranlib lib/*.a ) || exit 1 - -exit 0 - diff --git a/Jamfile b/Jamfile deleted file mode 100644 index ac3e7948..00000000 --- a/Jamfile +++ /dev/null @@ -1,98 +0,0 @@ -# $Id: Jamfile,v 1.86 2005/11/04 13:09:40 titer Exp $ -# -# This file is part of the HandBrake source code. -# Homepage: . -# It may be used under the terms of the GNU General Public License. - -SubDir TOP ; - -# libhb + contrib libraries -HANDBRAKE_LIBS = libhb.a - contrib/lib/liba52.a contrib/lib/libavformat.a - contrib/lib/libavcodec.a contrib/lib/libavutil.a - contrib/lib/libdca.a contrib/lib/libdvdread.a - contrib/lib/libmp4v2.a contrib/lib/libfaac.a - contrib/lib/libmp3lame.a contrib/lib/libmpeg2.a - contrib/lib/libvorbis.a contrib/lib/libvorbisenc.a - contrib/lib/libogg.a contrib/lib/libsamplerate.a - contrib/lib/libx264.a contrib/lib/libxvidcore.a - contrib/lib/libmkv.a contrib/lib/libswscale.a - contrib/lib/libtheora.a contrib/lib/libfaad.a ; - -if $(OS) = UNKNOWN -{ - OS = CYGWIN ; -} - -if $(OS) = CYGWIN -{ - HANDBRAKE_LIBS = $(HANDBRAKE_LIBS) contrib/lib/libbz2.a contrib/lib/libz.a ; -} - -if $(CSS) = 1 -{ - HANDBRAKE_LIBS = $(HANDBRAKE_LIBS) contrib/lib/libdvdcss.a ; -} - -# Interfaces -CLI_BIN = HandBrakeCLI ; -CLI_SRC = test/test.c - test/parsecsv.c ; -BEOS_BIN = HandBrake ; -BEOS_SRC = beos/HBApp.cpp beos/MainWindow.cpp beos/ScanWindow.cpp - beos/PicWindow.cpp beos/Stepper.cpp beos/QueueWindow.cpp ; -WX_BIN = wxHB ; -WX_SRC = wx/hbWizard.cpp wx/wxHB.cpp ; -UI_BIN = $(CLI_BIN) $(BEOS_BIN) $(WX_BIN) ; -UI_SRC = $(CLI_SRC) $(BEOS_SRC) $(WX_SRC) ; - -# CLI app -# Don't build the CLI from here if MACOSX, let xcode build it :) -if $(OS) != MACOSX -{ - Main $(CLI_BIN) : $(CLI_SRC) ; -} - -if $(OS) = BEOS -{ - Main HandBrake : $(BEOS_SRC) ; - - BeOSPackage HandBrake-$(HB_VERSION)-BeOS.zip : HandBrake ; - HB_PACKAGES += HandBrake-$(HB_VERSION)-BeOS.zip ; -} -if $(OS) = MACOSX -{ - OSX_SRC = macosx/main.mm macosx/Controller.h macosx/Controller.mm - macosx/PictureController.h macosx/PictureController.mm - macosx/HBQueueController.h macosx/HBQueueController.mm - macosx/HBAdvancedController.h macosx/HBAdvancedController.m - macosx/HBImageAndTextCell.h macosx/HBImageAndTextCell.m - macosx/HBPreferencesController.h macosx/HBPreferencesController.m - macosx/HBPresets.h macosx/HBPresets.m - macosx/English.lproj/InfoPlist.strings ; - - OSXApp HandBrake.app : $(OSX_SRC) $(HANDBRAKE_LIBS) ; - - # Package - OSXPackage HandBrake-$(HB_VERSION)-OSX.zip : HandBrake.app ; - HB_PACKAGES += HandBrake-$(HB_VERSION)-OSX.zip ; -} -if $(OS) = LINUX -{ - # WX UI outdated - #SystemLibraries $(WX_BIN) : -lpthread `wx-config --libs` ; - #ObjectC++Flags $(WX_SRC) : `wx-config --cflags` ; - #Main $(WX_BIN) : $(WX_SRC) ; -} - -if $(OS) != MACOSX -{ - ObjectHdrs $(UI_SRC) : $(TOP)/libhb ; - LinkLibraries $(UI_BIN) : $(HANDBRAKE_LIBS) ; -} -# Packages -NotFile package ; -Depends package : $(HB_PACKAGES) ; - -SubInclude TOP contrib ; -SubInclude TOP libhb ; diff --git a/Jamrules b/Jamrules deleted file mode 100644 index 490aa870..00000000 --- a/Jamrules +++ /dev/null @@ -1,101 +0,0 @@ -# $Id: Jamrules,v 1.59 2005/11/04 16:06:21 titer Exp $ -# -# This file is part of the HandBrake source code. -# Homepage: . -# It may be used under the terms of the GNU General Public License. - -include config.jam ; - -if ! $(DEFINES) -{ - Exit "Please run ./configure first." ; -} - -# This line needs to be manually bumped for each release. -HB_VERSION = 0.9.3 ; - -# If the user configured with the --snapshot argument, -# generate version and build numbers that include -# the svn revision and are marked as unstable. -if $(SNAPSHOT) = 1 -{ -HB_VERSION = "svn$(SVN_REV)" ; -HB_BUILD = "$(BUILD_DATE)01" ; -APPCAST_URL = "http://handbrake.fr/appcast_unstable.xml" ; -} -else -{ -HB_BUILD = "$(BUILD_DATE)00" ; -APPCAST_URL = "http://handbrake.fr/appcast.xml" ; -} - -DEFINES += HB_VERSION=\\\"$(HB_VERSION)\\\" HB_BUILD=$(HB_BUILD) ; -LANGUAGES = fr de it pl ru nl es pt ja ; -RM = rm -rf ; - -# Build HandBrake.app using Xcode -- -# Getting the right version and build numbers -# requires editing the .plist and specifying -# extra CFLAGs. -rule OSXApp -{ - Depends exe : $(<) ; - Depends $(<) : $(>) ; - Clean clean : $(1) macosx/build ; -} -actions OSXApp -{ - $(RM) $(<) macosx/build/HandBrake.app && \ - ( cd macosx && \ - xcodebuild HB_BUILD="$(HB_BUILD)" HB_VERSION="$(HB_VERSION)" APPCAST_URL="$(APPCAST_URL)" -target libhb -target HandBrake -target HandBrakeCLI ) && \ - for i in $(LANGUAGES) ; do \ - ( cd $(<)/Contents/Resources && \ - cp -r English.lproj $i.lproj && \ - cp ../../../macosx/i18n/$i.strings \ - $i.lproj/Localizable.strings ) \ - done ; -} -rule OSXPackage -{ - Depends $(<) : $(>) ; -} -actions OSXPackage -{ - rm -rf $(<) "HandBrake $(HB_VERSION)" && \ - mkdir "HandBrake $(HB_VERSION)" && \ - cp AUTHORS "HandBrake $(HB_VERSION)/AUTHORS.txt" && \ - cp COPYING "HandBrake $(HB_VERSION)/COPYING.txt" && \ - cp CREDITS "HandBrake $(HB_VERSION)/CREDITS.txt" && \ - cp THANKS "HandBrake $(HB_VERSION)/THANKS.txt" && \ - ( echo "[InternetShortcut]" && \ - echo "URL=http://handbrake.fr/" ) > \ - "HandBrake $(HB_VERSION)/HandBrake Homepage.url" && \ - ( echo "[InternetShortcut]" && \ - echo "URL=http://forum.handbrake,fr/" ) > \ - "HandBrake $(HB_VERSION)/HandBrake Forums.url" && \ - ( echo "[InternetShortcut]" && \ - echo "URL=http://handbrake.fr/?article=development" ) > \ - "HandBrake $(HB_VERSION)/Contribute.url" && \ - cp -r HandBrake.app "HandBrake $(HB_VERSION)" && \ - zip -9 -r $(<) "HandBrake $(HB_VERSION)" && \ - rm -rf "HandBrake $(HB_VERSION)" -} - -rule BeOSPackage -{ - Depends $(<) : $(>) ; - BuildBeOSPackage $(<) ; -} -actions BuildBeOSPackage -{ - rm -rf $(<) "HandBrake $(HB_VERSION)" && \ - mkdir "HandBrake $(HB_VERSION)" && \ - cp AUTHORS "HandBrake $(HB_VERSION)/AUTHORS.txt" && \ - cp COPYING "HandBrake $(HB_VERSION)/COPYING.txt" && \ - cp CREDITS "HandBrake $(HB_VERSION)/CREDITS.txt" && \ - cp THANKS "HandBrake $(HB_VERSION)/THANKS.txt" && \ - xres -o HandBrake beos/HandBrake.rsrc && \ - cp HandBrake "HandBrake $(HB_VERSION)" && \ - zip -9 -r $(<) "HandBrake $(HB_VERSION)" && \ - rm -rf "HandBrake $(HB_VERSION)" -} diff --git a/MacOsXContribBinariesVersion.txt b/MacOsXContribBinariesVersion.txt deleted file mode 100644 index c978718d..00000000 --- a/MacOsXContribBinariesVersion.txt +++ /dev/null @@ -1 +0,0 @@ -0022 diff --git a/Makefile b/Makefile deleted file mode 100644 index 6295bb7a..00000000 --- a/Makefile +++ /dev/null @@ -1,162 +0,0 @@ -include Makefile.config - -SYSTEM = $(shell uname -s) - -# Special case for Mac OS X: everything is handled from the Xcode project - -# -# Darwin -# -ifeq ($(SYSTEM),Darwin) - -snapshot: clean unstable-libhb/hbversion.h snapshot-app -official: clean force-hbversion app - -force-hbversion: - rm -f libhb/hbversion.h - -all: clean app - -all-chunky: clean app-chunky - -test: clean cli - -dev: clean internal - -ub-app: libhb/hbversion.h - (./DownloadMacOsXContribBinaries.sh ; cd macosx ; xcodebuild -target libhb -target HandBrake -target HandBrakeCLI -configuration UB HB_BUILD="$(HB_BUILD)" HB_VERSION="$(HB_VERSION)" APPCAST_URL="http://handbrake.fr/appcast.xml" build | sed '/^$$/d' ) - -app: contrib/.contrib libhb/hbversion.h - ( cd macosx ; xcodebuild -target libhb -target HandBrake -target HandBrakeCLI -configuration Deployment HB_BUILD="$(HB_BUILD)" HB_VERSION="$(HB_VERSION)" CURRENT_PROJECT_VERSION="$(HB_VERSION)" APPCAST_URL="http://handbrake.fr/appcast.xml" build | sed '/^$$/d' ) - -contrib/.contrib: - @$(MAKE) --no-print-directory -C contrib all - -snapshot-app: contrib/.contrib libhb/hbversion.h - ( cd macosx ; xcodebuild -target libhb -target HandBrake -target HandBrakeCLI -configuration Deployment HB_BUILD="$(SNAP_HB_BUILD)" HB_VERSION="$(SNAP_HB_VERSION)" CURRENT_PROJECT_VERSION="$(SNAP_HB_VERSION)" APPCAST_URL="http://handbrake.fr/appcast_unstable.xml" build | sed '/^$$/d' ) - -app-chunky: libhb/hbversion.h - (./DownloadMacOsXContribBinaries.sh ; cd macosx ; xcodebuild -alltargets -configuration UB HB_BUILD="$(HB_BUILD)" HB_VERSION="$(HB_VERSION)" APPCAST_URL="http://handbrake.fr/appcast.xml" build | sed '/^$$/d' ) - -cli: libhb/hbversion.h - (./DownloadMacOsXContribBinaries.sh ; cd macosx ; xcodebuild -target libhb -target HandBrakeCLI -configuration UB HB_BUILD="$(HB_BUILD)" HB_VERSION="$(HB_VERSION)" build | sed '/^$$/d' ) - -clean: - (cd macosx ; xcodebuild -alltargets -configuration UB clean | sed '/^$$/d' ; rm -f libhb/hbversion.h ; rm -f contrib/config.cache ) - -mrproper: - (rm -rf libhb/hbversion.h contrib/*tar.gz contrib/include contrib/lib contrib/DarwinContribVersion.txt ; cd macosx ; xcodebuild -alltargets -configuration UB clean | sed '/^$$/d' ) - -release: - (rm -rf HandBrake HandBrake*dmg ; mkdir -p HandBrake/api HandBrake/doc HandBrake/doc/pdf; cp test/BUILDSHARED AUTHORS BUILD COPYING CREDITS NEWS THANKS TRANSLATIONS HandBrake/doc ; cp -rp pdf/ HandBrake/doc/pdf/ ; cp -rp HandBrake.app HandBrake ; cp -rp libhb/libhb.dylib HandBrake/api ; cp -rp libhb/hb.h libhb/common.h libhb/ports.h HandBrake/api ; cp -rp HandBrakeCLI HandBrake ; hdiutil create -srcfolder HandBrake -format UDZO HandBrake-$(HB_VERSION)-MacOS_UB.dmg ; rm -rf HandBrake ) - -gui-release: - (rm -rf HandBrake HandBrake*GUI_UB.dmg ; mkdir -p HandBrake/docs ; cp AUTHORS BUILD COPYING CREDITS NEWS THANKS TRANSLATIONS HandBrake/docs ; cp -rp HandBrake.app HandBrake ; hdiutil create -srcfolder HandBrake -format UDBZ HandBrake-$(HB_VERSION)-MacOSX.4_GUI_UB.dmg ; rm -rf HandBrake ) - -cli-release: - (rm -rf HandBrake HandBrake*CLI_UB.dmg ; mkdir -p HandBrake/docs ; cp test/BUILDSHARED AUTHORS BUILD COPYING CREDITS NEWS THANKS TRANSLATIONS HandBrake/docs ; cp -rp HandBrakeCLI HandBrake ; hdiutil create -srcfolder HandBrake -format UDZO HandBrake-$(HB_VERSION)-MacOSX.3_CLI_UB.dmg ; rm -rf HandBrake ) - -gui-snapshot-release: - (rm -rf HandBrake HandBrake*GUI_UB.dmg ; mkdir -p HandBrake/docs ; cp AUTHORS BUILD COPYING CREDITS NEWS THANKS TRANSLATIONS HandBrake/docs ; cp -rp HandBrake.app HandBrake ; hdiutil create -srcfolder HandBrake -format UDBZ HandBrake-$(SNAP_HB_VERSION)-MacOSX.5_GUI_UB.dmg ; rm -rf HandBrake ) - -cli-snapshot-release: - (rm -rf HandBrake HandBrake*CLI_UB.dmg ; mkdir -p HandBrake/docs ; cp test/BUILDSHARED AUTHORS BUILD COPYING CREDITS NEWS THANKS TRANSLATIONS HandBrake/docs ; cp -rp HandBrakeCLI HandBrake ; hdiutil create -srcfolder HandBrake -format UDZO HandBrake-$(SNAP_HB_VERSION)-MacOSX.5_CLI_UB.dmg ; rm -rf HandBrake ) - -endif - -# -# Linux -# -ifeq ($(SYSTEM),Linux) - -snapshot: unstable-libhb/hbversion.h all - (rm -rf HandBrake HandBrake*.tar.gz ; mkdir -p HandBrake/api HandBrake/doc; cp test/BUILDSHARED AUTHORS BUILD COPYING CREDITS NEWS THANKS TRANSLATIONS HandBrake/doc ; cp -rp libhb/hb.h libhb/common.h libhb/ports.h HandBrake/api ; cp -rp HandBrakeCLI HandBrake ; tar zcvf HandBrake-$(SNAP_HB_VERSION)_i386.tar.gz HandBrake ; rm -rf HandBrake ) - -official: force-hbversion all - (rm -rf HandBrake HandBrake*.tar.gz ; mkdir -p HandBrake/api HandBrake/doc; cp test/BUILDSHARED AUTHORS BUILD COPYING CREDITS NEWS THANKS TRANSLATIONS HandBrake/doc ; cp -rp libhb/hb.h libhb/common.h libhb/ports.h HandBrake/api ; cp -rp HandBrakeCLI HandBrake ; tar zcvf HandBrake-$(HB_VERSION)_i386.tar.gz HandBrake ; rm -rf HandBrake ) - -force-hbversion: - rm -f libhb/hbversion.h - -all: libhb/hbversion.h - @$(MAKE) --no-print-directory -C contrib all - @$(MAKE) --no-print-directory -C libhb all - @$(MAKE) --no-print-directory -C test all - -clean: - @$(MAKE) --no-print-directory -C libhb clean - @$(MAKE) --no-print-directory -C test clean - @rm libhb/hbversion.h - @rm -f contrib/config.cache - -mrproper: clean - @$(MAKE) --no-print-directory -C contrib mrproper - -endif - -# -# Cygwin -# -ifeq ($(findstring CYGWIN_NT,$(SYSTEM)),CYGWIN_NT) - -snapshot: clean unstable-libhb/hbversion.h all -official: clean force-hbversion all - -snapshot-release: snapshot - (rm -rf HandBrake HandBrake*.zip ; mkdir -p HandBrake/api HandBrake/doc; cp test/BUILDSHARED AUTHORS BUILD COPYING CREDITS NEWS THANKS TRANSLATIONS HandBrake/doc ; cp -rp libhb/hb.h libhb/common.h libhb/ports.h HandBrake/api ; cp -rp HandBrakeCLI HandBrake ; cp /bin/cygwin1.dll HandBrake ; zip -r HandBrake-$(SNAP_HB_VERSION)-Win_CLI.zip HandBrake ; rm -rf HandBrake ) - -official-release: official - (rm -rf HandBrake HandBrake*.zip ; mkdir -p HandBrake/api HandBrake/doc; cp test/BUILDSHARED AUTHORS BUILD COPYING CREDITS NEWS THANKS TRANSLATIONS HandBrake/doc ; cp -rp libhb/hb.h libhb/common.h libhb/ports.h HandBrake/api ; cp -rp HandBrakeCLI HandBrake ; cp /bin/cygwin1.dll HandBrake ; zip -r HandBrake-$(HB_VERSION)-Win_GUI.zip HandBrake ; rm -rf HandBrake ) - -force-hbversion: - rm -f libhb/hbversion.h - -all: contrib/.contrib HandBrakeCLI - -contrib/.contrib: - @$(MAKE) --no-print-directory -C contrib all - -libhb/libhb.a: unstable-libhb/hbversion.h - @$(MAKE) --no-print-directory -C libhb all - -HandBrakeCLI: libhb/libhb.a - @$(MAKE) --no-print-directory -C test all - -clean: - @$(MAKE) --no-print-directory -C libhb clean - @$(MAKE) --no-print-directory -C test clean - @rm -f libhb/hbversion.h - @rm -f contrib/config.cache - @rm -f HandBrake HandBrake*.zip - @rm -f contrib/.contrib - -mrproper: clean - @$(MAKE) --no-print-directory -C contrib mrproper - -endif - -# -# Version Data -# - -libhb/hbversion.h: - echo "#ifndef HB_BUILD" > libhb/hbversion.h - echo "#define HB_BUILD $(HB_BUILD)" >> libhb/hbversion.h - echo "#endif" >> libhb/hbversion.h - echo "#ifndef HB_VERSION" >> libhb/hbversion.h - echo "#define HB_VERSION \"$(HB_VERSION)\"" >> libhb/hbversion.h - echo "#endif" >> libhb/hbversion.h - echo "#ifndef HB_APPCAST_URL" >> libhb/hbversion.h - echo "#define APPCAST_URL \"http://handbrake.fr/appcast.xml\"" >> libhb/hbversion.h - echo "#endif" >> libhb/hbversion.h - -unstable-libhb/hbversion.h: - echo "#ifndef HB_BUILD" > libhb/hbversion.h - echo "#define HB_BUILD $(SNAP_HB_BUILD)" >> libhb/hbversion.h - echo "#endif" >> libhb/hbversion.h - echo "#ifndef HB_VERSION" >> libhb/hbversion.h - echo "#define HB_VERSION \"$(SNAP_HB_VERSION)\"" >> libhb/hbversion.h - echo "#endif" >> libhb/hbversion.h - echo "#ifndef HB_APPCAST_URL" >> libhb/hbversion.h - echo "#define APPCAST_URL \"http://handbrake.fr/appcast_unstable.xml\"" >> libhb/hbversion.h - echo "#endif" >> libhb/hbversion.h diff --git a/Makefile.config b/Makefile.config deleted file mode 100644 index 4ae9bccd..00000000 --- a/Makefile.config +++ /dev/null @@ -1,22 +0,0 @@ -# This line needs to be manually bumped for each release. -HB_VERSION = 0.9.3 - -# Use the current date for the build number -HB_BUILD = $(shell date "+%Y%m%d")00 - -# Do the same for snapshots but mark as unstable -SNAP_HB_BUILD = $(shell date "+%Y%m%d")01 - -# For snapshots add the svn revision number to the HB_VERSION -SNAP_HB_VERSION = svn$(shell svnversion) - -# The working path is needed for editing the MacGui .plist -FULL_PATH = $(shell pwd) -BUILD_DATE = $(shell date "+%Y%m%d") - -HB_DEFPPC = $(shell uname -a | grep ppc > /dev/null ; echo RES$$?) -ifeq ($(HB_DEFPPC), RES0) -HB_DEFPPC = "-DWORDS_BIGENDIAN" -else -HB_DEFPPC = -endif diff --git a/configure b/configure old mode 100755 new mode 100644 index 224b2b28..8ea57efb --- a/configure +++ b/configure @@ -1,151 +1,25 @@ #! /bin/sh +# -CC="gcc" -CXX="g++" -CCFLAGS="$CCFLAGS -Wall -g" -OPTIM="$OPTIM -O3 -funroll-loops" -LINKLIBS="-lz -lbz2" -MAKE=make - -# System-specific flags -SYSTEM=`uname -s` -case $SYSTEM in - BeOS) - CCFLAGS="$CCFLAGS -Wno-multichar" - DEFINES="$DEFINES SYS_BEOS" - LINKLIBS="$LINKLIBS -lbe -ltracker" - - RELEASE=`uname -r` - case $RELEASE in - 6.0|5.0.4) # Zeta or R5 / BONE beta 7 - SYSTEM="$SYSTEM / BONE" - LINKLIBS="$LINKLIBS -lbind -lsocket" - ;; - 5.0*) # R5 / net_server - SYSTEM="$SYSTEM / net_server" - DEFINES="$DEFINES BEOS_NETSERVER" - LINKLIBS="$LINKLIBS -lnet" - ;; - *) - echo "Unsupported BeOS version" - exit 1 ;; - esac - ;; - - Darwin) - DEFINES="$DEFINES SYS_DARWIN USE_PTHREAD" - LINKLIBS="$LINKLIBS -lpthread" - ;; - - FreeBSD) - DEFINES="$DEFINES SYS_FREEBSD USE_PTHREAD" - LINKLIBS="$LINKLIBS -pthread" - ;; - - NetBSD) - DEFINES="$DEFINES SYS_NETBSD USE_PTHREAD" - LINKLIBS="$LINKLIBS -lpthread" - ;; - - Linux) - DEFINES="$DEFINES SYS_LINUX USE_PTHREAD _LARGEFILE_SOURCE _FILE_OFFSET_BITS=64" - LINKLIBS="$LINKLIBS -lpthread -ldl" - ;; - - CYGWIN*) - DEFINES="$DEFINES SYS_CYGWIN USE_PTHREAD" - LINKLIBS="$LINKLIBS -lpthread" - ;; - SunOS) - DEFINES="$DEFINES SYS_SunOS USE_PTHREAD _LARGEFILE_SOURCE _FILE_OFFSET_BITS=64" - LINKLIBS="$LINKLIBS -lpthread -lsocket -lnsl" - ;; - - *) - echo "Unsupported operating system" - exit 1 ;; -esac -echo -echo "System: $SYSTEM" - -# Check for endianness (we need to define WORDS_BIGENDIAN for libdvdread) -cat > testconf.c << EOF -int main() +inpath() { - int i = 1; - return *( (char *) &i ); + IFS=: + for d in $PATH + do + if [ -x $d/$1 ]; then + return 0 + fi + done + return 1 } -EOF -if ( $CC -o testconf testconf.c && ./testconf ) > /dev/null 2>&1 -then - echo "Endian: big" - DEFINES="$DEFINES WORDS_BIGENDIAN" -else - echo "Endian: little" -fi -rm -f testconf.c testconf - -# -# Use Gnu make when available over the built in make -# -if ( make --version | grep GNU ) > /dev/null 2>&1 -then -MAKE=make -elif ( gmake --version | grep GNU ) > /dev/null 2>&1 -then -MAKE=gmake -else -MAKE=make -fi - -# Unless the user wants a release build, configure for SVN snapshots -if test "$1" = "--release" || test "$2" = "--release"; then - SNAPSHOT=0 -else - SNAPSHOT=1 -fi - -# We fought the law and the law won -if test "$1" = "--libdvdcss" || test "$2" = "--libdvdcss"; then - CSS=1 -else - CSS=0 -fi - -# Generating the HB_BUILD and HB_VERSION for snapshots requires -# the build date, working path, and current SVN revision. -BUILD_DATE=`date +%Y%m%d` -FULL_PATH=`pwd` -SVN_REV=`svnversion` -# Generate config.jam -rm -f config.jam -cat << EOF > config.jam -CC = $CC ; -C++ = $CXX ; -LINK = $CXX ; -CCFLAGS = $CCFLAGS ; -C++FLAGS = $CCFLAGS ; -OPTIM = $OPTIM ; -DEFINES = $DEFINES ; -LINKLIBS = $LINKLIBS ; -MAKE = $MAKE ; -SNAPSHOT = $SNAPSHOT ; -BUILD_DATE = $BUILD_DATE ; -FULL_PATH = $FULL_PATH ; -SVN_REV = $SVN_REV ; -CSS = $CSS ; -EOF +for p in python2.6 python2.5 python2.4 +do + if ( inpath $p ); then + exec $p `dirname $0`/make/configure.py "$@" + exit 0 + fi +done -echo -echo "Don't run configure by hand, make runs it automatically." -echo -echo "No, really. That's it. Just type 'make' and hit return." -echo -echo "You're supposed to be building with make, not jam." -echo "If you were going to use jam--which you shouldn't--you'd run:" -echo " './jam' on a Mac, or" -echo " 'jam' on Linux or Windows" -echo -echo "To make jam, boil fruit with sugar and an acid until pectins are released." -echo +echo "ERROR: no suitable version of python found." +exit 1 diff --git a/contrib/Jamfile b/contrib/Jamfile deleted file mode 100644 index d0450cdf..00000000 --- a/contrib/Jamfile +++ /dev/null @@ -1,494 +0,0 @@ -SubDir TOP contrib ; - -# Use curl on Mac OS X since it's always installed, and assume wget -# is installed for all other systems -if $(OS) = MACOSX -{ - WGET = curl -q -L -o ; -} -else -{ - WGET = wget -O ; -} - -if $(OS) = UNKNOWN -{ - OS = CYGWIN ; -} - -if $(OS) = SOLARIS -{ - PATCH = gpatch ; - STRIP = echo ; -} -else -{ - PATCH = patch ; - STRIP = strip -S ; -} - -# Wget rule: downloads $(<) from the link in $(>) -rule Wget -{ - Depends $(<) : $(>) ; -} -actions Wget -{ - $(RM) $(<) && - $(WGET) $(<) `cat $(>)` && - ( touch $(<) || true ) -} - -# liba52 -rule LibA52 -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibA52 -{ - - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf a52dec && (gzip -dc a52dec.tar.gz | tar xf -) && - cd a52dec && $(PATCH) -p1 < ../patch-a52dec.patch && - ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache && $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/liba52.a -} -Wget $(SUBDIR)/a52dec.tar.gz : $(SUBDIR)/version_a52dec.txt ; -LibA52 $(SUBDIR)/lib/liba52.a : $(SUBDIR)/a52dec.tar.gz ; - -# FAAD2 -rule LibFaad2 -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} - -actions LibFaad2 -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf faad2 && (gzip -dc faad2.tar.gz | tar xf -) && - cd faad2 && $(PATCH) -p1 < ../patch-faad2-libtool22.patch && - ./bootstrap && ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache --disable-shared && $(MAKE) && $(MAKE) install -} -Wget $(SUBDIR)/faad2.tar.gz : $(SUBDIR)/version_faad2.txt ; -LibFaad2 $(SUBDIR)/lib/libfaad.a : $(SUBDIR)/faad2.tar.gz ; - -# libavcodec -rule LibAvCodec -{ - FFMPEG_PATCH = "$(PATCH) -p0 < ../patch-ffmpeg.patch" ; - FFMPEG_PATCH += " && $(PATCH) -p0 < ../patch-ffmpeg-latm.patch " ; - FFMPEG_PATCH += " && $(PATCH) -p0 < ../patch-ffmpeg-mpegleak.patch " ; - if $(OS) = CYGWIN - { - FFMPEG_PATCH += " && $(PATCH) -p1 < ../patch-ffmpeg-cygwin.patch " ; - } - else if $(OS) = SOLARIS - { - FFMPEG_PATCH += " && $(PATCH) -p1 < ../patch-ffmpeg-solaris.patch " ; - } - else if $(OS) = MACOSX - { - FFMPEG_PATCH += " && $(PATCH) -p1 < ../patch-ffmpeg-h264dsp-crash.diff " ; - } - - if $(OS) = SOLARIS - { - # - # Not all of ffmpeg works on Solaris - disable the bits that - # don't. When we get new versions of FFMPEG we can try enabling - # then again. - # - FFMPEG_EXTRA_OPTIONS = "--disable-vis --disable-demuxer=mpc8 --disable-vhook --disable-network" ; - } - - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibAvCodec -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf ffmpeg && (gzip -dc ffmpeg.tar.gz | tar xf -) && - cd ffmpeg && $(FFMPEG_PATCH) && - ./configure --prefix=$CONTRIB --enable-gpl --enable-pthreads --enable-swscale \ - --disable-shared --enable-static --disable-encoders \ - --enable-encoder=mpeg4 --enable-encoder=ac3 --enable-encoder=snow \ - --enable-libfaad --disable-ffmpeg --disable-ffserver \ - --disable-muxers --enable-muxer=ipod --disable-bsfs --disable-vhook \ - --extra-cflags="-I$CONTRIB/include" \ - --extra-ldflags="-L$CONTRIB/lib" $(FFMPEG_EXTRA_OPTIONS) && - $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libavcodec.a -} -Wget $(SUBDIR)/ffmpeg.tar.gz : $(SUBDIR)/version_ffmpeg.txt ; -LibAvCodec $(SUBDIR)/lib/libavcodec.a : $(SUBDIR)/ffmpeg.tar.gz ; - -rule LibAvUtil -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibAvUtil -{ - $(STRIP) $(<) -} -LibAvUtil $(SUBDIR)/lib/libavutil.a : $(SUBDIR)/lib/libavcodec.a ; -LibAvUtil $(SUBDIR)/lib/libavformat.a : $(SUBDIR)/lib/libavcodec.a ; -LibAvUtil $(SUBDIR)/lib/libswscale.a : $(SUBDIR)/lib/libavcodec.a ; - -# HandBrake does not include a DVD decrypting library, -# so if a user requests it, let them download and compile it from a 3rd party -if $(CSS) = 1 -{ - # libdvdcss - # We need libdvdcss.so for libdvdread's configure to work... - rule LibDvdCss - { - Depends $(<) : $(>) ; - Depends lib : $(<) ; - } - actions LibDvdCss - { - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf libdvdcss-1.2.9 && (gzip -dc libdvdcss.tar.gz | tar xf - ) && - cd libdvdcss-1.2.9 && - ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache && $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libdvdcss.a - } - Wget $(SUBDIR)/libdvdcss.tar.gz : $(SUBDIR)/version_libdvdcss.txt ; - LibDvdCss $(SUBDIR)/lib/libdvdcss.a : $(SUBDIR)/libdvdcss.tar.gz ; -} - -# libdca -rule LibDCA -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibDCA -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf libdca && (gzip -dc libdca.tar.gz | tar xf - ) && - cd libdca && $(PATCH) -p1 < ../patch-libdca.patch && - ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache && $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libdca.a -} -Wget $(SUBDIR)/libdca.tar.gz : $(SUBDIR)/version_libdca.txt ; -LibDCA $(SUBDIR)/lib/libdca.a : $(SUBDIR)/libdca.tar.gz ; - -# libdvdread -rule LibDvdRead -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; - - if $(OS) = MACOSX - { - DVDREAD_PATCH = "$(PATCH) -p0 < ../patch-libdvdread-css-vlc-dylib.patch &&" ; - } - - if $(OS) = CYGWIN - { - DVDREAD_PATCH = "$(PATCH) -p1 < ../patch-libdvdread-cygwin.patch &&" ; - } - -} -if $(CSS) = 1 # Include CSS support in libdvdread if requested -{ - actions LibDvdRead - { - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf libdvdread && (gzip -dc libdvdread.tar.gz | tar xf - ) && - cd libdvdread && - ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache --disable-shared --with-libdvdcss=$CONTRIB && - $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libdvdread.a - } -} -else { - # Cygwin/Windows doesn't use CSS as of now, so don't include it on the - # configure line. - # MacOSX uses a dylib for CSS, so it doesn't need including there either. - actions LibDvdRead - { - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf libdvdread && (gzip -dc libdvdread.tar.gz | tar xf - ) && - cd libdvdread && $(DVDREAD_PATCH) - ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache --disable-shared && - $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libdvdread.a - } -} -Wget $(SUBDIR)/libdvdread.tar.gz : $(SUBDIR)/version_libdvdread.txt ; -LibDvdRead $(SUBDIR)/lib/libdvdread.a : $(SUBDIR)/libdvdread.tar.gz ; - -# libfaac -rule LibFaac -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; - if $(OS) = CYGWIN - { - CYGWIN_PATCH = "$(PATCH) -p1 < ../patch-faac-cygwin.patch &&" ; - } -} -actions LibFaac -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf faac && (gzip -dc faac.tar.gz | tar xf - ) && cd faac && $(CYGWIN_PATCH) ./bootstrap && - ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache --disable-shared --enable-static --without-mp4v2 && - $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libfaac.a -} -Wget $(SUBDIR)/faac.tar.gz : $(SUBDIR)/version_faac.txt ; -LibFaac $(SUBDIR)/lib/libfaac.a : $(SUBDIR)/faac.tar.gz ; - -# libmp3lame -rule LibMp3Lame -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibMp3Lame -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf lame && (gzip -dc lame.tar.gz | tar xf - ) && cd lame && - ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache --disable-shared && - $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libmp3lame.a -} -Wget $(SUBDIR)/lame.tar.gz : $(SUBDIR)/version_lame.txt ; -LibMp3Lame $(SUBDIR)/lib/libmp3lame.a : $(SUBDIR)/lame.tar.gz ; - -# libmp4v2 -rule LibMp4v2 -{ - LIBMP4V2_PATCH = "" ; - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibMp4v2 -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf libmp4v2 && (gzip -dc libmp4v2.tar.gz | tar xf - ) && - cd libmp4v2 && $(LIBMP4V2_PATCH) rm -rf build && mkdir build && cd build && - ../configure --disable-shared --disable-debug --prefix=$CONTRIB && $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libmp4v2.a -} -Wget $(SUBDIR)/libmp4v2.tar.gz : $(SUBDIR)/version_libmp4v2.txt ; -LibMp4v2 $(SUBDIR)/lib/libmp4v2.a : $(SUBDIR)/libmp4v2.tar.gz ; - -rule LibMkv -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibMkv -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf libmkv && (gzip -dc libmkv.tar.gz | tar xf - ) && - cd libmkv && - ./configure --disable-shared --enable-static --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache && - $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libmkv.a -} -Wget $(SUBDIR)/libmkv.tar.gz : $(SUBDIR)/version_libmkv.txt ; -LibMkv $(SUBDIR)/lib/libmkv.a : $(SUBDIR)/libmkv.tar.gz ; - -# libmpeg2 -rule LibMpeg2 -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibMpeg2 -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf mpeg2dec && (gzip -dc mpeg2dec.tar.gz | tar xf - ) && - cd mpeg2dec && - ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache --disable-shared --disable-sdl --without-x && - $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libmpeg2.a -} -Wget $(SUBDIR)/mpeg2dec.tar.gz : $(SUBDIR)/version_mpeg2dec.txt ; -LibMpeg2 $(SUBDIR)/lib/libmpeg2.a : $(SUBDIR)/mpeg2dec.tar.gz ; - -# libogg -rule LibOgg -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibOgg -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf libogg && (gzip -dc libogg.tar.gz | tar xf - ) && - cd libogg && - ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache --disable-shared && - $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libogg.a -} -Wget $(SUBDIR)/libogg.tar.gz : $(SUBDIR)/version_libogg.txt ; -LibOgg $(SUBDIR)/lib/libogg.a : $(SUBDIR)/libogg.tar.gz ; - -# libsamplerate -rule LibSampleRate -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibSampleRate -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf libsamplerate && (gzip -dc libsamplerate.tar.gz | tar xf - ) && - cd libsamplerate && - ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache --disable-shared && - $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libsamplerate.a -} -Wget $(SUBDIR)/libsamplerate.tar.gz : $(SUBDIR)/version_libsamplerate.txt ; -LibSampleRate $(SUBDIR)/lib/libsamplerate.a : $(SUBDIR)/libsamplerate.tar.gz ; - -# libvorbis -rule LibVorbis -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibVorbis -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf libvorbis && (gzip -dc libvorbis.tar.gz | tar xf - ) && - cd libvorbis && - ./configure --prefix=$CONTRIB --with-ogg=$CONTRIB --cache-file=$CONTRIB/config.cache --disable-shared && - $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libvorbis.a -} -Wget $(SUBDIR)/libvorbis.tar.gz : $(SUBDIR)/version_libvorbis.txt ; -LibVorbis $(SUBDIR)/lib/libvorbis.a : $(SUBDIR)/libvorbis.tar.gz ; - -rule LibVorbisEnc -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibVorbisEnc -{ - $(STRIP) $(<) -} -LibVorbisEnc $(SUBDIR)/lib/libvorbisenc.a : $(SUBDIR)/lib/libvorbis.a ; - -# libtheora -rule LibTheora -{ - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibTheora -{ - cd `dirname $(>)` && CONTRIB=`pwd` && rm -rf libtheora && - (gzip -dc libtheora.tar.gz | tar xf - ) && cd libtheora && - HAVE_PKG_CONFIG="no" && export HAVE_PKG_CONFIG && - ./configure --prefix=$CONTRIB --with-ogg=$CONTRIB --with-vorbis=$CONTRIB --cache-file=$CONTRIB/config.cache --disable-shared \ - --disable-oggtest --disable-vorbistest --disable-sdltest --disable-examples && - $(MAKE) && $(MAKE) install && - $(STRIP) $CONTRIB/lib/libtheora.a -} -Wget $(SUBDIR)/libtheora.tar.gz : $(SUBDIR)/version_libtheora.txt ; -LibTheora $(SUBDIR)/lib/libtheora.a : $(SUBDIR)/libtheora.tar.gz ; - -# libx264 -rule LibX264 -{ - LIBX264_PATCH = "" ; - if $(OS) = CYGWIN - { - LIBX264_PATCH += "$(PATCH) -p1 < ../patch-x264-cygwin.patch && " ; - } - else if $(OS) = SOLARIS - { - LIBX264_PATCH += " $(PATCH) -p1 < ../patch-x264-solaris.patch && " ; - } - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibX264 -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf x264 && (gzip -dc x264.tar.gz | tar xf - ) && - cd x264 && $(LIBX264_PATCH) - bash ./configure --prefix=$CONTRIB --enable-pthread && - $(MAKE) libx264.a && cp libx264.a $CONTRIB/lib/ && cp x264.h $CONTRIB/include/ && $(STRIP) $CONTRIB/lib/libx264.a -} -Wget $(SUBDIR)/x264.tar.gz : $(SUBDIR)/version_x264.txt ; -LibX264 $(SUBDIR)/lib/libx264.a : $(SUBDIR)/x264.tar.gz ; - -# libxvidcore -rule LibXvidCore -{ - LIBXVIDCORE_PATCH = "" ; - if $(OS) = MACOSX - { - LIBXVIDCORE_PATCH = "$(PATCH) -p1 < ../patch-xvidcore-macosx.patch && " ; - } - else if $(OS) = CYGWIN - { - LIBXVIDCORE_PATCH = "$(PATCH) -p1 < ../patch-xvidcore-cygwin.patch && " ; - } - LIBXVIDCORE_PATCH += "$(PATCH) -p1 < ../patch-xvidcore-nasm-2.00-configure.patch && " ; - LIBXVIDCORE_PATCH += "$(PATCH) -p1 < ../patch-xvidcore-fdct.patch && " ; - Depends $(<) : $(>) ; - Depends lib : $(<) ; -} -actions LibXvidCore -{ - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf xvidcore && (gzip -dc xvidcore.tar.gz | tar xf - ) && - cd xvidcore && $(LIBXVIDCORE_PATCH) - cd build/generic/ && ./configure --prefix=$CONTRIB --cache-file=$CONTRIB/config.cache && $(MAKE) libxvidcore.a && - cp ./=build/libxvidcore.a $CONTRIB/lib/ && - cp ../../src/xvid.h $CONTRIB/include/ && - $(STRIP) $CONTRIB/lib/libxvidcore.a -} -Wget $(SUBDIR)/xvidcore.tar.gz : $(SUBDIR)/version_xvidcore.txt ; -LibXvidCore $(SUBDIR)/lib/libxvidcore.a : $(SUBDIR)/xvidcore.tar.gz ; - -# zlib -if $(OS) = CYGWIN -{ - rule Zlib - { - Depends $(<) : $(>) ; - Depends lib : $(<) ; - } - actions Zlib - { - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf zlib && (gzip -dc zlib.tar.gz | tar xf - ) && - cd zlib && ./configure --prefix=$CONTRIB && - $(MAKE) && $(MAKE) install && touch $CONTRIB/.contrib && - $(STRIP) $CONTRIB/lib/libz.a - } - Wget $(SUBDIR)/zlib.tar.gz : $(SUBDIR)/version_zlib.txt ; - Zlib $(SUBDIR)/lib/libz.a : $(SUBDIR)/zlib.tar.gz ; -} - -# bzip2 -if $(OS) = CYGWIN -{ - rule BZip2 - { - Depends $(<) : $(>) ; - Depends lib : $(<) ; - } - actions BZip2 - { - cd `dirname $(>)` && CONTRIB=`pwd` && - rm -rf bzip2 && (gzip -dc bzip2.tar.gz | tar xf - ) && - cd bzip2 && $(MAKE) && $(MAKE) install && cp libbz2.a $CONTRIB/lib/ && - $(STRIP) $CONTRIB/lib/libbz2.a - } - Wget $(SUBDIR)/bzip2.tar.gz : $(SUBDIR)/version_bzip2.txt ; - BZip2 $(SUBDIR)/lib/libbz2.a : $(SUBDIR)/bzip2.tar.gz ; -} diff --git a/contrib/Makefile b/contrib/Makefile deleted file mode 100644 index 1855ed06..00000000 --- a/contrib/Makefile +++ /dev/null @@ -1,49 +0,0 @@ -# Contrib Makefile - -SYSTEM = $(shell uname -s) - -# Special case for Mac OS X: everything is handled from the Xcode project -ifeq ($(SYSTEM),Darwin) - -all: .contrib - -.contrib: - ( cd .. ; ./configure ; cd contrib ; cp -f ../config.jam . ; ../jam ) - -clean: - ( echo "Do a make mrproper to remove the contrib libraries ) - -mrproper: - (rm -rf lib ; rm -rf include ) - -endif - -ifeq ($(SYSTEM),Linux) - -all: .contrib - -.contrib: - ( cd .. ; ./configure ; cd contrib ; cp -f ../config.jam . ; jam ) - -clean: - ( echo "Do a make mrproper to remove the contrib libraries ) - -mrproper: - (rm -rf lib ; rm -rf include ) - -endif - -ifeq ($(findstring CYGWIN_NT,$(SYSTEM)),CYGWIN_NT) - -all: .contrib - -.contrib: - ( cd .. ; ./configure ; cd contrib ; cp -f ../config.jam . ; jam.exe ) - -clean: - ( echo "Do a make mrproper to remove the contrib libraries ) - -mrproper: clean - (rm -rf lib ; rm -rf include ; rm -f .contrib) - -endif diff --git a/contrib/patch-a52dec.patch b/contrib/a52dec/A00-dpl2.patch similarity index 100% rename from contrib/patch-a52dec.patch rename to contrib/a52dec/A00-dpl2.patch diff --git a/contrib/a52dec/module.defs b/contrib/a52dec/module.defs new file mode 100644 index 00000000..470ddfa1 --- /dev/null +++ b/contrib/a52dec/module.defs @@ -0,0 +1,6 @@ +$(eval $(call import.MODULE.defs,A52DEC,a52dec)) +$(eval $(call import.CONTRIB.defs,A52DEC)) + +A52DEC.FETCH.url = http://download.m0k.org/handbrake/contrib/a52dec-0.7.4.tar.gz +A52DEC.EXTRACT.tarbase = a52dec +A52DEC.INSTALL.strip = liba52.a diff --git a/contrib/a52dec/module.rules b/contrib/a52dec/module.rules new file mode 100644 index 00000000..cecab72f --- /dev/null +++ b/contrib/a52dec/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,A52DEC)) +$(eval $(call import.CONTRIB.rules,A52DEC)) diff --git a/contrib/bzip2/module.defs b/contrib/bzip2/module.defs new file mode 100644 index 00000000..dcc878ad --- /dev/null +++ b/contrib/bzip2/module.defs @@ -0,0 +1,24 @@ +$(eval $(call import.MODULE.defs,BZIP2,bzip2)) +$(eval $(call import.CONTRIB.defs,BZIP2)) + +BZIP2.FETCH.url = http://download.m0k.org/handbrake/contrib/bzip2-1.0.5.tar.gz +BZIP2.EXTRACT.tarbase = bzip2 +BZIP2.CONFIGURE = + +BZIP2.BUILD.extra = \ + CC=$(BZIP2.GCC.gcc) \ + CFLAGS="$(call fn.ARGS,BZIP2.GCC,*archs)" \ + PREFIX=$(call fn.ABSOLUTE,$(CONTRIB.build/)) + +BZIP2.BUILD.ntargets = libbz2.a + +define BZIP2.INSTALL + mkdir -p $(CONTRIB.build/)lib/ $(CONTRIB.build/)include/ + cp $(BZIP2.EXTRACT.target/)libbz2.a $(CONTRIB.build/)lib/ + cp $(BZIP2.EXTRACT.target/)bzlib.h $(CONTRIB.build/)include/ +endef + +define BZIP2.UNINSTALL + rm $(CONTRIB.build/)lib/libbz2.a + rm $(CONTRIB.build/)include/bzlib.h +endef diff --git a/contrib/bzip2/module.rules b/contrib/bzip2/module.rules new file mode 100644 index 00000000..456bb121 --- /dev/null +++ b/contrib/bzip2/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,BZIP2)) +$(eval $(call import.CONTRIB.rules,BZIP2)) diff --git a/contrib/patch-faac-cygwin.patch b/contrib/faac/P00-cygwin.patch similarity index 100% rename from contrib/patch-faac-cygwin.patch rename to contrib/faac/P00-cygwin.patch diff --git a/contrib/faac/module.defs b/contrib/faac/module.defs new file mode 100644 index 00000000..2b032fee --- /dev/null +++ b/contrib/faac/module.defs @@ -0,0 +1,8 @@ +$(eval $(call import.MODULE.defs,FAAC,faac)) +$(eval $(call import.CONTRIB.defs,FAAC)) + +FAAC.FETCH.url = http://download.m0k.org/handbrake/contrib/faac-1.26.tar.gz +FAAC.EXTRACT.tarbase = faac + +FAAC.CONFIGURE.bootstrap = ./bootstrap; +FAAC.CONFIGURE.extra = --without-mp4v2 diff --git a/contrib/faac/module.rules b/contrib/faac/module.rules new file mode 100644 index 00000000..5c311304 --- /dev/null +++ b/contrib/faac/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,FAAC)) +$(eval $(call import.CONTRIB.rules,FAAC)) diff --git a/contrib/patch-faad2-libtool22.patch b/contrib/faad2/A00-libtool22.patch similarity index 100% rename from contrib/patch-faad2-libtool22.patch rename to contrib/faad2/A00-libtool22.patch diff --git a/contrib/faad2/module.defs b/contrib/faad2/module.defs new file mode 100644 index 00000000..04b9e0b8 --- /dev/null +++ b/contrib/faad2/module.defs @@ -0,0 +1,7 @@ +$(eval $(call import.MODULE.defs,FAAD2,faad2)) +$(eval $(call import.CONTRIB.defs,FAAD2)) + +FAAD2.FETCH.url = http://download.m0k.org/handbrake/contrib/faad2-2.6.1.tar.gz +FAAD2.EXTRACT.tarbase = faad2 + +FAAD2.CONFIGURE.bootstrap = ./bootstrap; diff --git a/contrib/faad2/module.rules b/contrib/faad2/module.rules new file mode 100644 index 00000000..2b9bdd01 --- /dev/null +++ b/contrib/faad2/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,FAAD2)) +$(eval $(call import.CONTRIB.rules,FAAD2)) diff --git a/contrib/patch-ffmpeg-latm.patch b/contrib/ffmpeg/A00-latm.patch similarity index 92% rename from contrib/patch-ffmpeg-latm.patch rename to contrib/ffmpeg/A00-latm.patch index 84cd6a85..a286f4c1 100644 --- a/contrib/patch-ffmpeg-latm.patch +++ b/contrib/ffmpeg/A00-latm.patch @@ -1,8 +1,7 @@ -Index: libavcodec/Makefile -=================================================================== ---- libavcodec/Makefile (revision 14016) -+++ libavcodec/Makefile (working copy) -@@ -322,7 +322,7 @@ +diff -Naur ffmpeg.orig/libavcodec/Makefile ffmpeg/libavcodec/Makefile +--- ffmpeg.orig/libavcodec/Makefile 2008-12-01 01:40:36.000000000 -0500 ++++ ffmpeg/libavcodec/Makefile 2009-02-21 08:25:13.000000000 -0500 +@@ -338,7 +338,7 @@ OBJS-$(CONFIG_LIBDIRAC_DECODER) += libdiracdec.o OBJS-$(CONFIG_LIBDIRAC_ENCODER) += libdiracenc.o libdirac_libschro.o OBJS-$(CONFIG_LIBFAAC) += libfaac.o @@ -20,10 +19,171 @@ Index: libavcodec/Makefile OBJS-$(CONFIG_AC3_PARSER) += ac3_parser.o ac3tab.o aac_ac3_parser.o OBJS-$(CONFIG_CAVSVIDEO_PARSER) += cavs_parser.o OBJS-$(CONFIG_DCA_PARSER) += dca_parser.o -Index: libavcodec/latmaac.c -=================================================================== ---- libavcodec/latmaac.c (revision 0) -+++ libavcodec/latmaac.c (revision 0) +diff -Naur ffmpeg.orig/libavcodec/allcodecs.c ffmpeg/libavcodec/allcodecs.c +--- ffmpeg.orig/libavcodec/allcodecs.c 2008-12-01 01:40:36.000000000 -0500 ++++ ffmpeg/libavcodec/allcodecs.c 2009-02-21 08:25:13.000000000 -0500 +@@ -291,6 +291,7 @@ + REGISTER_ENCDEC (LIBDIRAC, libdirac); + REGISTER_ENCODER (LIBFAAC, libfaac); + REGISTER_DECODER (LIBFAAD, libfaad); ++ REGISTER_DECODER (LIBFAAD, libfaad2); + REGISTER_ENCDEC (LIBGSM, libgsm); + REGISTER_ENCDEC (LIBGSM_MS, libgsm_ms); + REGISTER_ENCODER (LIBMP3LAME, libmp3lame); +@@ -303,6 +304,7 @@ + + /* parsers */ + REGISTER_PARSER (AAC, aac); ++ REGISTER_PARSER (AAC, aac_latm); + REGISTER_PARSER (AC3, ac3); + REGISTER_PARSER (CAVSVIDEO, cavsvideo); + REGISTER_PARSER (DCA, dca); +diff -Naur ffmpeg.orig/libavcodec/avcodec.h ffmpeg/libavcodec/avcodec.h +--- ffmpeg.orig/libavcodec/avcodec.h 2008-12-01 01:40:36.000000000 -0500 ++++ ffmpeg/libavcodec/avcodec.h 2009-02-21 08:25:13.000000000 -0500 +@@ -264,6 +264,7 @@ + CODEC_ID_MP2= 0x15000, + CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3 + CODEC_ID_AAC, ++ CODEC_ID_AAC_LATM, + CODEC_ID_AC3, + CODEC_ID_DTS, + CODEC_ID_VORBIS, +diff -Naur ffmpeg.orig/libavcodec/latm_parser.c ffmpeg/libavcodec/latm_parser.c +--- ffmpeg.orig/libavcodec/latm_parser.c 1969-12-31 19:00:00.000000000 -0500 ++++ ffmpeg/libavcodec/latm_parser.c 2009-02-21 08:25:13.000000000 -0500 +@@ -0,0 +1,128 @@ ++/* ++ * LATM parser ++ * Copyright (c) 2008 Paul Kendall ++ * ++ * This file is part of FFmpeg. ++ * ++ * FFmpeg is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * FFmpeg is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with FFmpeg; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++/** ++ * @file latm_parser.c ++ * LATM parser ++ */ ++ ++#include "parser.h" ++ ++#define LATM_HEADER 0x56e000 // 0x2b7 (11 bits) ++#define LATM_MASK 0xFFE000 // top 11 bits ++#define LATM_SIZE_MASK 0x001FFF // bottom 13 bits ++ ++typedef struct LATMParseContext{ ++ ParseContext pc; ++ int count; ++} LATMParseContext; ++ ++/** ++ * finds the end of the current frame in the bitstream. ++ * @return the position of the first byte of the next frame, or -1 ++ */ ++static int latm_find_frame_end(AVCodecParserContext *s1, const uint8_t *buf, ++ int buf_size) { ++ LATMParseContext *s = s1->priv_data; ++ ParseContext *pc = &s->pc; ++ int pic_found, i; ++ uint32_t state; ++ ++ pic_found = pc->frame_start_found; ++ state = pc->state; ++ ++ i = 0; ++ if(!pic_found){ ++ for(i=0; icount = - i; ++ pic_found=1; ++ break; ++ } ++ } ++ } ++ ++ if(pic_found){ ++ /* EOF considered as end of frame */ ++ if (buf_size == 0) ++ return 0; ++ if((state & LATM_SIZE_MASK) - s->count <= buf_size) { ++ pc->frame_start_found = 0; ++ pc->state = -1; ++ return (state & LATM_SIZE_MASK) - s->count; ++ } ++ } ++ ++ s->count += buf_size; ++ pc->frame_start_found = pic_found; ++ pc->state = state; ++ return END_NOT_FOUND; ++} ++ ++static int latm_parse(AVCodecParserContext *s1, ++ AVCodecContext *avctx, ++ const uint8_t **poutbuf, int *poutbuf_size, ++ const uint8_t *buf, int buf_size) ++{ ++ LATMParseContext *s = s1->priv_data; ++ ParseContext *pc = &s->pc; ++ int next; ++ ++ if(s1->flags & PARSER_FLAG_COMPLETE_FRAMES){ ++ next = buf_size; ++ }else{ ++ next = latm_find_frame_end(s1, buf, buf_size); ++ ++ if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { ++ *poutbuf = NULL; ++ *poutbuf_size = 0; ++ return buf_size; ++ } ++ } ++ *poutbuf = buf; ++ *poutbuf_size = buf_size; ++ return next; ++} ++ ++static int latm_split(AVCodecContext *avctx, ++ const uint8_t *buf, int buf_size) ++{ ++ int i; ++ uint32_t state= -1; ++ ++ for(i=0; i @@ -649,182 +809,51 @@ Index: libavcodec/latmaac.c + .long_name = "AAC over LATM", +}; + -Index: libavcodec/latm_parser.c -=================================================================== ---- libavcodec/latm_parser.c (revision 0) -+++ libavcodec/latm_parser.c (revision 0) -@@ -0,0 +1,128 @@ -+/* -+ * LATM parser -+ * Copyright (c) 2008 Paul Kendall -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file latm_parser.c -+ * LATM parser -+ */ -+ -+#include "parser.h" -+ -+#define LATM_HEADER 0x56e000 // 0x2b7 (11 bits) -+#define LATM_MASK 0xFFE000 // top 11 bits -+#define LATM_SIZE_MASK 0x001FFF // bottom 13 bits -+ -+typedef struct LATMParseContext{ -+ ParseContext pc; -+ int count; -+} LATMParseContext; -+ -+/** -+ * finds the end of the current frame in the bitstream. -+ * @return the position of the first byte of the next frame, or -1 -+ */ -+static int latm_find_frame_end(AVCodecParserContext *s1, const uint8_t *buf, -+ int buf_size) { -+ LATMParseContext *s = s1->priv_data; -+ ParseContext *pc = &s->pc; -+ int pic_found, i; -+ uint32_t state; -+ -+ pic_found = pc->frame_start_found; -+ state = pc->state; -+ -+ i = 0; -+ if(!pic_found){ -+ for(i=0; icount = - i; -+ pic_found=1; -+ break; -+ } -+ } -+ } -+ -+ if(pic_found){ -+ /* EOF considered as end of frame */ -+ if (buf_size == 0) -+ return 0; -+ if((state & LATM_SIZE_MASK) - s->count <= buf_size) { -+ pc->frame_start_found = 0; -+ pc->state = -1; -+ return (state & LATM_SIZE_MASK) - s->count; -+ } -+ } -+ -+ s->count += buf_size; -+ pc->frame_start_found = pic_found; -+ pc->state = state; -+ return END_NOT_FOUND; -+} -+ -+static int latm_parse(AVCodecParserContext *s1, -+ AVCodecContext *avctx, -+ const uint8_t **poutbuf, int *poutbuf_size, -+ const uint8_t *buf, int buf_size) -+{ -+ LATMParseContext *s = s1->priv_data; -+ ParseContext *pc = &s->pc; -+ int next; -+ -+ if(s1->flags & PARSER_FLAG_COMPLETE_FRAMES){ -+ next = buf_size; -+ }else{ -+ next = latm_find_frame_end(s1, buf, buf_size); -+ -+ if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { -+ *poutbuf = NULL; -+ *poutbuf_size = 0; -+ return buf_size; -+ } -+ } -+ *poutbuf = buf; -+ *poutbuf_size = buf_size; -+ return next; -+} -+ -+static int latm_split(AVCodecContext *avctx, -+ const uint8_t *buf, int buf_size) -+{ -+ int i; -+ uint32_t state= -1; -+ -+ for(i=0; i= 0x1c0 && startcode <= 0x1df) || + (startcode >= 0x1e0 && startcode <= 0x1ef) || +- (startcode == 0x1bd) || (startcode == 0x1fd))) ++ (startcode == 0x1bd) || (startcode == 0x1fa) || (startcode == 0x1fd))) + goto redo; + if (ppos) { + *ppos = url_ftell(s->pb) - 4; +@@ -441,6 +441,9 @@ + } else if(es_type == STREAM_TYPE_AUDIO_AAC){ + codec_id = CODEC_ID_AAC; + type = CODEC_TYPE_AUDIO; ++ } else if(es_type == STREAM_TYPE_AUDIO_AAC_LATM){ ++ codec_id = CODEC_ID_AAC_LATM; ++ type = CODEC_TYPE_AUDIO; + } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){ + codec_id = CODEC_ID_MPEG4; + type = CODEC_TYPE_VIDEO; +diff -Naur ffmpeg.orig/libavformat/mpeg.h ffmpeg/libavformat/mpeg.h +--- ffmpeg.orig/libavformat/mpeg.h 2008-08-31 03:39:47.000000000 -0400 ++++ ffmpeg/libavformat/mpeg.h 2009-02-21 08:25:13.000000000 -0500 +@@ -53,6 +53,7 @@ + #define STREAM_TYPE_PRIVATE_DATA 0x06 + #define STREAM_TYPE_AUDIO_AAC 0x0f + #define STREAM_TYPE_VIDEO_MPEG4 0x10 ++#define STREAM_TYPE_AUDIO_AAC_LATM 0x11 + #define STREAM_TYPE_VIDEO_H264 0x1b - /* parsers */ - REGISTER_PARSER (AAC, aac); -+ REGISTER_PARSER (AAC, aac_latm); - REGISTER_PARSER (AC3, ac3); - REGISTER_PARSER (CAVSVIDEO, cavsvideo); - REGISTER_PARSER (DCA, dca); -Index: libavcodec/avcodec.h -=================================================================== ---- libavcodec/avcodec.h (revision 14016) -+++ libavcodec/avcodec.h (working copy) -@@ -259,4 +259,5 @@ - CODEC_ID_AAC, -+ CODEC_ID_AAC_LATM, - CODEC_ID_AC3, - CODEC_ID_DTS, - CODEC_ID_VORBIS, -Index: libavformat/mpegts.c -=================================================================== ---- libavformat/mpegts.c (revision 14016) -+++ libavformat/mpegts.c (working copy) -@@ -611,6 +611,7 @@ - case STREAM_TYPE_VIDEO_H264: + #define STREAM_TYPE_AUDIO_AC3 0x81 +diff -Naur ffmpeg.orig/libavformat/mpegts.c ffmpeg/libavformat/mpegts.c +--- ffmpeg.orig/libavformat/mpegts.c 2008-10-02 12:28:58.000000000 -0400 ++++ ffmpeg/libavformat/mpegts.c 2009-02-21 08:25:13.000000000 -0500 +@@ -625,6 +625,7 @@ case STREAM_TYPE_VIDEO_VC1: + case STREAM_TYPE_VIDEO_DIRAC: case STREAM_TYPE_AUDIO_AAC: + case STREAM_TYPE_AUDIO_AAC_LATM: case STREAM_TYPE_AUDIO_AC3: case STREAM_TYPE_AUDIO_DTS: case STREAM_TYPE_AUDIO_HDMV_DTS: -@@ -832,7 +833,7 @@ +@@ -847,7 +848,7 @@ code = pes->header[3] | 0x100; if (!((code >= 0x1c0 && code <= 0x1df) || (code >= 0x1e0 && code <= 0x1ef) || @@ -833,7 +862,7 @@ Index: libavformat/mpegts.c goto skip; if (!pes->st) { /* allocate stream */ -@@ -948,6 +949,10 @@ +@@ -968,6 +969,10 @@ codec_type = CODEC_TYPE_AUDIO; codec_id = CODEC_ID_AAC; break; @@ -844,10 +873,9 @@ Index: libavformat/mpegts.c case STREAM_TYPE_AUDIO_AC3: codec_type = CODEC_TYPE_AUDIO; codec_id = CODEC_ID_AC3; -Index: libavformat/mpegts.h -=================================================================== ---- libavformat/mpegts.h (revision 14016) -+++ libavformat/mpegts.h (working copy) +diff -Naur ffmpeg.orig/libavformat/mpegts.h ffmpeg/libavformat/mpegts.h +--- ffmpeg.orig/libavformat/mpegts.h 2008-08-31 03:39:47.000000000 -0400 ++++ ffmpeg/libavformat/mpegts.h 2009-02-21 08:25:13.000000000 -0500 @@ -50,6 +50,7 @@ #define STREAM_TYPE_PRIVATE_DATA 0x06 #define STREAM_TYPE_AUDIO_AAC 0x0f @@ -855,39 +883,4 @@ Index: libavformat/mpegts.h +#define STREAM_TYPE_AUDIO_AAC_LATM 0x11 #define STREAM_TYPE_VIDEO_H264 0x1b #define STREAM_TYPE_VIDEO_VC1 0xea - -Index: libavformat/mpeg.c -=================================================================== ---- libavformat/mpeg.c (revision 14016) -+++ libavformat/mpeg.c (working copy) -@@ -281,7 +281,7 @@ - /* find matching stream */ - if (!((startcode >= 0x1c0 && startcode <= 0x1df) || - (startcode >= 0x1e0 && startcode <= 0x1ef) || -- (startcode == 0x1bd) || (startcode == 0x1fd))) -+ (startcode == 0x1bd) || (startcode == 0x1fa) || (startcode == 0x1fd))) - goto redo; - if (ppos) { - *ppos = url_ftell(s->pb) - 4; -@@ -439,6 +439,9 @@ - } else if(es_type == STREAM_TYPE_AUDIO_AAC){ - codec_id = CODEC_ID_AAC; - type = CODEC_TYPE_AUDIO; -+ } else if(es_type == STREAM_TYPE_AUDIO_AAC_LATM){ -+ codec_id = CODEC_ID_AAC_LATM; -+ type = CODEC_TYPE_AUDIO; - } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){ - codec_id = CODEC_ID_MPEG4; - type = CODEC_TYPE_VIDEO; -Index: libavformat/mpeg.h -=================================================================== ---- libavformat/mpeg.h (revision 14016) -+++ libavformat/mpeg.h (working copy) -@@ -53,6 +53,7 @@ - #define STREAM_TYPE_PRIVATE_DATA 0x06 - #define STREAM_TYPE_AUDIO_AAC 0x0f - #define STREAM_TYPE_VIDEO_MPEG4 0x10 -+#define STREAM_TYPE_AUDIO_AAC_LATM 0x11 - #define STREAM_TYPE_VIDEO_H264 0x1b - - #define STREAM_TYPE_AUDIO_AC3 0x81 + #define STREAM_TYPE_VIDEO_DIRAC 0xd1 diff --git a/contrib/patch-ffmpeg-mpegleak.patch b/contrib/ffmpeg/A01-mpegleak.patch similarity index 82% rename from contrib/patch-ffmpeg-mpegleak.patch rename to contrib/ffmpeg/A01-mpegleak.patch index 74907258..36179ba5 100644 --- a/contrib/patch-ffmpeg-mpegleak.patch +++ b/contrib/ffmpeg/A01-mpegleak.patch @@ -1,8 +1,7 @@ -Index: libavcodec/h264.c -=================================================================== ---- libavcodec/h264.c (revision 14820) -+++ libavcodec/h264.c (working copy) -@@ -3355,7 +3355,7 @@ +diff -Naur ffmpeg.orig/libavcodec/h264.c ffmpeg/libavcodec/h264.c +--- ffmpeg.orig/libavcodec/h264.c 2008-12-01 11:24:19.000000000 -0500 ++++ ffmpeg/libavcodec/h264.c 2009-02-21 08:23:58.000000000 -0500 +@@ -3298,7 +3298,7 @@ * stream. Need to discard one frame. Prevents overrun of the * short_ref and long_ref buffers. */ @@ -11,7 +10,7 @@ Index: libavcodec/h264.c "number of reference frames exceeds max (probably " "corrupt input), discarding one\n"); -@@ -7557,7 +7557,7 @@ +@@ -7556,7 +7556,7 @@ if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){ if (avctx->skip_frame >= AVDISCARD_NONREF || s->hurry_up) return 0; @@ -20,10 +19,9 @@ Index: libavcodec/h264.c return -1; } -Index: libavcodec/mpegvideo.c -=================================================================== ---- libavcodec/mpegvideo.c (revision 14820) -+++ libavcodec/mpegvideo.c (working copy) +diff -Naur ffmpeg.orig/libavcodec/mpegvideo.c ffmpeg/libavcodec/mpegvideo.c +--- ffmpeg.orig/libavcodec/mpegvideo.c 2008-10-01 20:27:09.000000000 -0400 ++++ ffmpeg/libavcodec/mpegvideo.c 2009-02-21 08:23:58.000000000 -0500 @@ -779,19 +779,18 @@ } diff --git a/contrib/ffmpeg/A02-audioconvert.patch b/contrib/ffmpeg/A02-audioconvert.patch new file mode 100644 index 00000000..5062e343 --- /dev/null +++ b/contrib/ffmpeg/A02-audioconvert.patch @@ -0,0 +1,12 @@ +diff -Naur ffmpeg.orig/libavcodec/Makefile ffmpeg/libavcodec/Makefile +--- ffmpeg.orig/libavcodec/Makefile 2008-12-01 01:40:36.000000000 -0500 ++++ ffmpeg/libavcodec/Makefile 2009-02-23 07:03:23.000000000 -0500 +@@ -3,7 +3,7 @@ + NAME = avcodec + FFLIBS = avutil + +-HEADERS = avcodec.h opt.h ++HEADERS = avcodec.h opt.h audioconvert.h + + OBJS = allcodecs.o \ + audioconvert.o \ diff --git a/contrib/patch-ffmpeg-cygwin.patch b/contrib/ffmpeg/P00-cygwin.patch similarity index 100% rename from contrib/patch-ffmpeg-cygwin.patch rename to contrib/ffmpeg/P00-cygwin.patch diff --git a/contrib/patch-ffmpeg-solaris.patch b/contrib/ffmpeg/P01-sunos.patch similarity index 100% rename from contrib/patch-ffmpeg-solaris.patch rename to contrib/ffmpeg/P01-sunos.patch diff --git a/contrib/patch-ffmpeg-h264dsp-crash.diff b/contrib/ffmpeg/P02-darwin-h264dsp-crash.patch similarity index 100% rename from contrib/patch-ffmpeg-h264dsp-crash.diff rename to contrib/ffmpeg/P02-darwin-h264dsp-crash.patch diff --git a/contrib/ffmpeg/module.defs b/contrib/ffmpeg/module.defs new file mode 100644 index 00000000..b4129101 --- /dev/null +++ b/contrib/ffmpeg/module.defs @@ -0,0 +1,32 @@ +$(eval $(call import.MODULE.defs,FFMPEG,ffmpeg,FAAD2)) +$(eval $(call import.CONTRIB.defs,FFMPEG)) + +FFMPEG.FETCH.url = http://download.m0k.org/handbrake/contrib/ffmpeg-r15974.tar.gz +FFMPEG.EXTRACT.tarbase = ffmpeg + +FFMPEG.CONFIGURE.deps = +FFMPEG.CONFIGURE.env = +FFMPEG.CONFIGURE.host = + +FFMPEG.CONFIGURE.extra = \ + --disable-bsfs \ + --disable-encoders \ + --disable-ffmpeg \ + --disable-ffserver \ + --disable-muxers \ + --disable-vhook \ + --enable-encoder=ac3 \ + --enable-encoder=mpeg4 \ + --enable-encoder=snow \ + --enable-gpl \ + --enable-libfaad \ + --enable-muxer=ipod \ + --enable-pthreads \ + --enable-swscale \ + --cc="$(GCC.gcc)" \ + --extra-cflags="$(call fn.ARGS,FFMPEG.GCC,*archs) -I$(call fn.ABSOLUTE,$(CONTRIB.build/)include)" \ + --extra-ldflags="$(call fn.ARGS,FFMPEG.GCC,*archs) -L$(call fn.ABSOLUTE,$(CONTRIB.build/)lib)" + +ifeq ($(BUILD.cross),1) + FFMPEG.CONFIGURE.extra += --enable-cross-compile --arch=$(FFMPEG.GCC.archs) +endif diff --git a/contrib/ffmpeg/module.rules b/contrib/ffmpeg/module.rules new file mode 100644 index 00000000..7f475b3e --- /dev/null +++ b/contrib/ffmpeg/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,FFMPEG)) +$(eval $(call import.CONTRIB.rules,FFMPEG)) diff --git a/contrib/lame/P00-darwin-xmmintrin.patch b/contrib/lame/P00-darwin-xmmintrin.patch new file mode 100644 index 00000000..de19e55b --- /dev/null +++ b/contrib/lame/P00-darwin-xmmintrin.patch @@ -0,0 +1,28 @@ +diff -Naur lame.orig/configure lame/configure +--- lame.orig/configure 2008-06-29 17:40:05.000000000 -0400 ++++ lame/configure 2008-10-14 05:01:29.000000000 -0400 +@@ -21031,7 +21031,14 @@ + + + +- ++case $host_cpu in ++powerpc*) ++ check_xmmintrin= ++ ;; ++*) ++ check_xmmintrin="xmmintrin.h" ++ ;; ++esac + + for ac_header in \ + errno.h \ +@@ -21042,7 +21049,7 @@ + sys/soundcard.h \ + sys/time.h \ + unistd.h \ +- xmmintrin.h \ ++ $check_xmmintrin \ + linux/soundcard.h + do + as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` diff --git a/contrib/lame/module.defs b/contrib/lame/module.defs new file mode 100644 index 00000000..dd89cd68 --- /dev/null +++ b/contrib/lame/module.defs @@ -0,0 +1,5 @@ +$(eval $(call import.MODULE.defs,LAME,lame)) +$(eval $(call import.CONTRIB.defs,LAME)) + +LAME.FETCH.url = http://download.m0k.org/handbrake/contrib/lame-3.98.tar.gz +LAME.EXTRACT.tarbase = lame diff --git a/contrib/lame/module.rules b/contrib/lame/module.rules new file mode 100644 index 00000000..058bc7b5 --- /dev/null +++ b/contrib/lame/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,LAME)) +$(eval $(call import.CONTRIB.rules,LAME)) diff --git a/contrib/patch-libdca.patch b/contrib/libdca/A00-general.patch similarity index 100% rename from contrib/patch-libdca.patch rename to contrib/libdca/A00-general.patch diff --git a/contrib/libdca/module.defs b/contrib/libdca/module.defs new file mode 100644 index 00000000..b69d1fb3 --- /dev/null +++ b/contrib/libdca/module.defs @@ -0,0 +1,5 @@ +$(eval $(call import.MODULE.defs,LIBDCA,libdca)) +$(eval $(call import.CONTRIB.defs,LIBDCA)) + +LIBDCA.FETCH.url = http://download.m0k.org/handbrake/contrib/libdca-r81-strapped.tar.gz +LIBDCA.EXTRACT.tarbase = libdca diff --git a/contrib/libdca/module.rules b/contrib/libdca/module.rules new file mode 100644 index 00000000..0f33e218 --- /dev/null +++ b/contrib/libdca/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,LIBDCA)) +$(eval $(call import.CONTRIB.rules,LIBDCA)) diff --git a/contrib/patch-libdvdread-css-vlc-dylib.patch b/contrib/libdvdread/P00-darwin-css-vlc-dylib.patch similarity index 54% rename from contrib/patch-libdvdread-css-vlc-dylib.patch rename to contrib/libdvdread/P00-darwin-css-vlc-dylib.patch index 70c5bab9..cb018151 100644 --- a/contrib/patch-libdvdread-css-vlc-dylib.patch +++ b/contrib/libdvdread/P00-darwin-css-vlc-dylib.patch @@ -1,5 +1,6 @@ ---- dvdread/dvd_input.c 2005-09-19 09:43:08.000000000 -0400 -+++ dvdread/patched-dvd_input.c 2008-03-19 12:47:16.000000000 -0400 +diff -Naur libdvdread.orig/dvdread/dvd_input.c libdvdread/dvdread/dvd_input.c +--- libdvdread.orig/dvdread/dvd_input.c 2005-09-19 09:43:08.000000000 -0400 ++++ libdvdread/dvdread/dvd_input.c 2009-02-21 10:22:42.000000000 -0500 @@ -332,7 +332,7 @@ #else diff --git a/contrib/patch-libdvdread-cygwin.patch b/contrib/libdvdread/P01-cygwin.patch similarity index 100% rename from contrib/patch-libdvdread-cygwin.patch rename to contrib/libdvdread/P01-cygwin.patch diff --git a/contrib/libdvdread/module.defs b/contrib/libdvdread/module.defs new file mode 100644 index 00000000..99b70923 --- /dev/null +++ b/contrib/libdvdread/module.defs @@ -0,0 +1,5 @@ +$(eval $(call import.MODULE.defs,LIBDVDREAD,libdvdread)) +$(eval $(call import.CONTRIB.defs,LIBDVDREAD)) + +LIBDVDREAD.FETCH.url = http://download.m0k.org/handbrake/contrib/libdvdread-0.9.7.tar.gz +LIBDVDREAD.EXTRACT.tarbase = libdvdread diff --git a/contrib/libdvdread/module.rules b/contrib/libdvdread/module.rules new file mode 100644 index 00000000..6a9b42b0 --- /dev/null +++ b/contrib/libdvdread/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,LIBDVDREAD)) +$(eval $(call import.CONTRIB.rules,LIBDVDREAD)) diff --git a/contrib/libmkv/module.defs b/contrib/libmkv/module.defs new file mode 100644 index 00000000..102aea03 --- /dev/null +++ b/contrib/libmkv/module.defs @@ -0,0 +1,5 @@ +$(eval $(call import.MODULE.defs,LIBMKV,libmkv)) +$(eval $(call import.CONTRIB.defs,LIBMKV)) + +LIBMKV.FETCH.url = http://download.m0k.org/handbrake/contrib/libmkv-0.6.3.1.tar.gz +LIBMKV.EXTRACT.tarbase = libmkv diff --git a/contrib/libmkv/module.rules b/contrib/libmkv/module.rules new file mode 100644 index 00000000..7f443fe0 --- /dev/null +++ b/contrib/libmkv/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,LIBMKV)) +$(eval $(call import.CONTRIB.rules,LIBMKV)) diff --git a/contrib/libmp4v2/module.defs b/contrib/libmp4v2/module.defs new file mode 100644 index 00000000..5a8063f3 --- /dev/null +++ b/contrib/libmp4v2/module.defs @@ -0,0 +1,5 @@ +$(eval $(call import.MODULE.defs,LIBMP4V2,libmp4v2)) +$(eval $(call import.CONTRIB.defs,LIBMP4V2)) + +LIBMP4V2.FETCH.url = http://download.m0k.org/handbrake/contrib/libmp4v2-2.0-r224-repack.tar.gz +LIBMP4V2.EXTRACT.tarbase = libmp4v2 diff --git a/contrib/libmp4v2/module.rules b/contrib/libmp4v2/module.rules new file mode 100644 index 00000000..8169e603 --- /dev/null +++ b/contrib/libmp4v2/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,LIBMP4V2)) +$(eval $(call import.CONTRIB.rules,LIBMP4V2)) diff --git a/contrib/libogg/module.defs b/contrib/libogg/module.defs new file mode 100644 index 00000000..0edc4106 --- /dev/null +++ b/contrib/libogg/module.defs @@ -0,0 +1,7 @@ +$(eval $(call import.MODULE.defs,LIBOGG,libogg)) +$(eval $(call import.CONTRIB.defs,LIBOGG)) + +LIBOGG.FETCH.url = http://download.m0k.org/handbrake/contrib/libogg-1.1.3.tar.gz +LIBOGG.EXTRACT.tarbase = libogg + +LIBOGG.CONFIGURE.extra = --disable-sdl diff --git a/contrib/libogg/module.rules b/contrib/libogg/module.rules new file mode 100644 index 00000000..956fe078 --- /dev/null +++ b/contrib/libogg/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,LIBOGG)) +$(eval $(call import.CONTRIB.rules,LIBOGG)) diff --git a/contrib/libsamplerate/module.defs b/contrib/libsamplerate/module.defs new file mode 100644 index 00000000..c0717df3 --- /dev/null +++ b/contrib/libsamplerate/module.defs @@ -0,0 +1,5 @@ +$(eval $(call import.MODULE.defs,LIBSAMPLERATE,libsamplerate)) +$(eval $(call import.CONTRIB.defs,LIBSAMPLERATE)) + +LIBSAMPLERATE.FETCH.url = http://download.m0k.org/handbrake/contrib/libsamplerate-0.1.4.tar.gz +LIBSAMPLERATE.EXTRACT.tarbase = libsamplerate diff --git a/contrib/libsamplerate/module.rules b/contrib/libsamplerate/module.rules new file mode 100644 index 00000000..ef633856 --- /dev/null +++ b/contrib/libsamplerate/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,LIBSAMPLERATE)) +$(eval $(call import.CONTRIB.rules,LIBSAMPLERATE)) diff --git a/contrib/libtheora/module.defs b/contrib/libtheora/module.defs new file mode 100644 index 00000000..be40ab57 --- /dev/null +++ b/contrib/libtheora/module.defs @@ -0,0 +1,13 @@ +$(eval $(call import.MODULE.defs,LIBTHEORA,libtheora,LIBOGG LIBVORBIS)) +$(eval $(call import.CONTRIB.defs,LIBTHEORA)) + +LIBTHEORA.FETCH.url = http://download.m0k.org/handbrake/contrib/libtheora-1.0.tar.gz +LIBTHEORA.EXTRACT.tarbase = libtheora + +LIBTHEORA.CONFIGURE.extra = \ + --disable-examples \ + --disable-oggtest \ + --disable-sdltest \ + --disable-vorbistest \ + --with-ogg=$(call fn.ABSOLUTE,$(CONTRIB.build/)) \ + --with-vorbis=$(call fn.ABSOLUTE,$(CONTRIB.build/)) diff --git a/contrib/libtheora/module.rules b/contrib/libtheora/module.rules new file mode 100644 index 00000000..c30224bb --- /dev/null +++ b/contrib/libtheora/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,LIBTHEORA)) +$(eval $(call import.CONTRIB.rules,LIBTHEORA)) diff --git a/contrib/libvorbis/module.defs b/contrib/libvorbis/module.defs new file mode 100644 index 00000000..9946bb53 --- /dev/null +++ b/contrib/libvorbis/module.defs @@ -0,0 +1,7 @@ +$(eval $(call import.MODULE.defs,LIBVORBIS,libvorbis,LIBOGG)) +$(eval $(call import.CONTRIB.defs,LIBVORBIS)) + +LIBVORBIS.FETCH.url = http://download.m0k.org/handbrake/contrib/libvorbis-aotuv_b5.tar.gz +LIBVORBIS.EXTRACT.tarbase = libvorbis + +LIBVORBIS.CONFIGURE.extra = --with-ogg=$(call fn.ABSOLUTE,$(CONTRIB.build/)) diff --git a/contrib/libvorbis/module.rules b/contrib/libvorbis/module.rules new file mode 100644 index 00000000..418dfe0e --- /dev/null +++ b/contrib/libvorbis/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,LIBVORBIS)) +$(eval $(call import.CONTRIB.rules,LIBVORBIS)) diff --git a/contrib/mpeg2dec/module.defs b/contrib/mpeg2dec/module.defs new file mode 100644 index 00000000..5d608cc0 --- /dev/null +++ b/contrib/mpeg2dec/module.defs @@ -0,0 +1,7 @@ +$(eval $(call import.MODULE.defs,MPEG2DEC,mpeg2dec)) +$(eval $(call import.CONTRIB.defs,MPEG2DEC)) + +MPEG2DEC.FETCH.url = http://download.m0k.org/handbrake/contrib/mpeg2dec-0.5.1.tar.gz +MPEG2DEC.EXTRACT.tarbase = mpeg2dec + +MPEG2DEC.CONFIGURE.extra = --disable-sdl --without-x diff --git a/contrib/mpeg2dec/module.rules b/contrib/mpeg2dec/module.rules new file mode 100644 index 00000000..78ce10ac --- /dev/null +++ b/contrib/mpeg2dec/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,MPEG2DEC)) +$(eval $(call import.CONTRIB.rules,MPEG2DEC)) diff --git a/contrib/patch-ffmpeg.patch b/contrib/patch-ffmpeg.patch deleted file mode 100644 index e52731f1..00000000 --- a/contrib/patch-ffmpeg.patch +++ /dev/null @@ -1,18 +0,0 @@ -Index: libavformat/tcp.c -=================================================================== ---- libavformat/tcp.c (revision 9814) -+++ libavformat/tcp.c (working copy) -@@ -88,11 +88,13 @@ - break; - } - -+#ifndef __BEOS__ - /* test error */ - optlen = sizeof(ret); - getsockopt (fd, SOL_SOCKET, SO_ERROR, &ret, &optlen); - if (ret != 0) - goto fail; -+#endif - } - s->fd = fd; - return 0; diff --git a/contrib/patch-libmpeg2.patch b/contrib/patch-libmpeg2.patch deleted file mode 100644 index d5ab5bf6..00000000 --- a/contrib/patch-libmpeg2.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff -ur orig/header.c mpeg2dec/libmpeg2/header.c ---- orig/header.c 2003-12-22 12:24:02.000000000 +0100 -+++ mpeg2dec/libmpeg2/header.c 2004-08-02 18:07:50.000000000 +0200 -@@ -100,6 +100,9 @@ - mpeg2dec->decoder.convert = NULL; - mpeg2dec->decoder.convert_id = NULL; - mpeg2dec->picture = mpeg2dec->pictures; -+ memset(&mpeg2dec->fbuf_alloc[0].fbuf, 0, sizeof(mpeg2_fbuf_t)); -+ memset(&mpeg2dec->fbuf_alloc[1].fbuf, 0, sizeof(mpeg2_fbuf_t)); -+ memset(&mpeg2dec->fbuf_alloc[2].fbuf, 0, sizeof(mpeg2_fbuf_t)); - mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[0].fbuf; - mpeg2dec->fbuf[1] = &mpeg2dec->fbuf_alloc[1].fbuf; - mpeg2dec->fbuf[2] = &mpeg2dec->fbuf_alloc[2].fbuf; -@@ -551,6 +554,7 @@ - if (!(mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)) { - picture->nb_fields = (buffer[3] & 2) ? 3 : 2; - flags |= (buffer[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST : 0; -+ flags |= (buffer[3] & 2) ? PIC_FLAG_REPEAT_FIRST_FIELD : 0; - } else - picture->nb_fields = (buffer[3]&2) ? ((buffer[3]&128) ? 6 : 4) : 2; - break; -diff -ur orig/mpeg2.h mpeg2dec/include/mpeg2.h ---- orig/mpeg2.h 2003-12-22 13:13:35.000000000 +0100 -+++ mpeg2dec/include/mpeg2.h 2004-02-18 13:50:13.000000000 +0100 -@@ -82,6 +82,7 @@ - #define PIC_FLAG_COMPOSITE_DISPLAY 32 - #define PIC_FLAG_SKIP 64 - #define PIC_FLAG_TAGS 128 -+#define PIC_FLAG_REPEAT_FIRST_FIELD 256 - #define PIC_MASK_COMPOSITE_DISPLAY 0xfffff000 - - typedef struct mpeg2_picture_s { - diff --git a/contrib/patch-x264-idr.patch b/contrib/patch-x264-idr.patch deleted file mode 100644 index df4294f1..00000000 --- a/contrib/patch-x264-idr.patch +++ /dev/null @@ -1,17 +0,0 @@ -Index: encoder/slicetype.c -=================================================================== ---- encoder/slicetype.c (revision 665) -+++ encoder/slicetype.c (working copy) -@@ -379,7 +379,12 @@ - return; - frames[0] = h->frames.last_nonb; - for( j = 0; h->frames.next[j]; j++ ) -+ { -+ // if the app wants an IDR, give it to them -+ if ( h->frames.next[j]->i_type == X264_TYPE_IDR ) -+ return; - frames[j+1] = h->frames.next[j]; -+ } - keyint_limit = h->param.i_keyint_max - frames[0]->i_frame + h->frames.i_last_idr - 1; - num_frames = X264_MIN( j, keyint_limit ); - if( num_frames == 0 ) diff --git a/contrib/patch-x264-linux.patch b/contrib/patch-x264-linux.patch deleted file mode 100644 index 3f1752d4..00000000 --- a/contrib/patch-x264-linux.patch +++ /dev/null @@ -1,194 +0,0 @@ -Index: /common/ppc/quant.c -=================================================================== ---- /common/ppc/quant.c (revision 601) -+++ /common/ppc/quant.c (revision 621) -@@ -18,8 +18,4 @@ - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. - *****************************************************************************/ -- --#ifdef HAVE_ALTIVEC_H --#include --#endif - - #include "common/common.h" -@@ -54,29 +50,29 @@ - temp2v = vec_xor(temp2v, mskB); \ - temp1v = vec_adds(temp1v, vec_and(mskA, one)); \ --vec_st(temp1v, (dct0), dct); \ -+vec_st(temp1v, (dct0), (int16_t*)dct); \ - temp2v = vec_adds(temp2v, vec_and(mskB, one)); \ --vec_st(temp2v, (dct1), dct); -+vec_st(temp2v, (dct1), (int16_t*)dct); - - void x264_quant_4x4_altivec( int16_t dct[4][4], int quant_mf[4][4], int const i_qbits, int const f ) { - vector bool short mskA; -- vec_s32_t i_qbitsv; -+ vec_u32_t i_qbitsv; - vec_u16_t coefvA; - vec_u32_t multEvenvA, multOddvA; -- vec_u32_t mfvA; -+ vec_u16_t mfvA; - vec_s16_t zerov, one; -- vec_s32_t fV; -+ vec_u32_t fV; - - vector bool short mskB; - vec_u16_t coefvB; - vec_u32_t multEvenvB, multOddvB; -- vec_u32_t mfvB; -+ vec_u16_t mfvB; - - vec_s16_t temp1v, temp2v; - -- vect_sint_u qbits_u; -+ vect_int_u qbits_u; - qbits_u.s[0]=i_qbits; - i_qbitsv = vec_splat(qbits_u.v, 0); - -- vect_sint_u f_u; -+ vect_int_u f_u; - f_u.s[0]=f; - -@@ -114,16 +110,16 @@ - temp2v = vec_xor(temp2v, mskB); \ - temp1v = vec_add(temp1v, vec_and(mskA, one)); \ --vec_st(temp1v, (dct0), dct); \ -+vec_st(temp1v, (dct0), (int16_t*)dct); \ - temp2v = vec_add(temp2v, vec_and(mskB, one)); \ --vec_st(temp2v, (dct1), dct); -+vec_st(temp2v, (dct1), (int16_t*)dct); - - - void x264_quant_4x4_dc_altivec( int16_t dct[4][4], int i_quant_mf, int const i_qbits, int const f ) { - vector bool short mskA; -- vec_s32_t i_qbitsv; -+ vec_u32_t i_qbitsv; - vec_u16_t coefvA; - vec_u32_t multEvenvA, multOddvA; - vec_s16_t zerov, one; -- vec_s32_t fV; -+ vec_u32_t fV; - - vector bool short mskB; -@@ -133,15 +129,14 @@ - vec_s16_t temp1v, temp2v; - -- vec_u32_t mfv; -- vect_int_u mf_u; -+ vec_u16_t mfv; -+ vect_ushort_u mf_u; - mf_u.s[0]=i_quant_mf; - mfv = vec_splat( mf_u.v, 0 ); -- mfv = vec_packs( mfv, mfv); - -- vect_sint_u qbits_u; -+ vect_int_u qbits_u; - qbits_u.s[0]=i_qbits; - i_qbitsv = vec_splat(qbits_u.v, 0); - -- vect_sint_u f_u; -+ vect_int_u f_u; - f_u.s[0]=f; - fV = vec_splat(f_u.v, 0); -@@ -156,13 +151,15 @@ - void x264_quant_8x8_altivec( int16_t dct[8][8], int quant_mf[8][8], int const i_qbits, int const f ) { - vector bool short mskA; -- vec_s32_t i_qbitsv; -+ vec_u32_t i_qbitsv; - vec_u16_t coefvA; -- vec_s32_t multEvenvA, multOddvA, mfvA; -+ vec_u32_t multEvenvA, multOddvA; -+ vec_u16_t mfvA; - vec_s16_t zerov, one; -- vec_s32_t fV; -+ vec_u32_t fV; - - vector bool short mskB; - vec_u16_t coefvB; -- vec_u32_t multEvenvB, multOddvB, mfvB; -+ vec_u32_t multEvenvB, multOddvB; -+ vec_u16_t mfvB; - - vec_s16_t temp1v, temp2v; -@@ -172,5 +169,5 @@ - i_qbitsv = vec_splat(qbits_u.v, 0); - -- vect_sint_u f_u; -+ vect_int_u f_u; - f_u.s[0]=f; - fV = vec_splat(f_u.v, 0); -Index: /common/ppc/dct.c -=================================================================== ---- /common/ppc/dct.c (revision 604) -+++ /common/ppc/dct.c (revision 621) -@@ -61,6 +61,6 @@ - VEC_DCT( dct0v, dct1v, dct2v, dct3v, tmp0v, tmp1v, tmp2v, tmp3v ); - -- vec_st(vec_perm(tmp0v, tmp1v, permHighv), 0, dct); -- vec_st(vec_perm(tmp2v, tmp3v, permHighv), 16, dct); -+ vec_st(vec_perm(tmp0v, tmp1v, permHighv), 0, (int16_t*)dct); -+ vec_st(vec_perm(tmp2v, tmp3v, permHighv), 16, (int16_t*)dct); - } - -@@ -95,12 +95,12 @@ - VEC_DCT( dct4v, dct5v, dct6v, dct7v, tmp4v, tmp5v, tmp6v, tmp7v ); - -- vec_st(vec_perm(tmp0v, tmp1v, permHighv), 0, dct); -- vec_st(vec_perm(tmp2v, tmp3v, permHighv), 16, dct); -- vec_st(vec_perm(tmp4v, tmp5v, permHighv), 32, dct); -- vec_st(vec_perm(tmp6v, tmp7v, permHighv), 48, dct); -- vec_st(vec_perm(tmp0v, tmp1v, permLowv), 64, dct); -- vec_st(vec_perm(tmp2v, tmp3v, permLowv), 80, dct); -- vec_st(vec_perm(tmp4v, tmp5v, permLowv), 96, dct); -- vec_st(vec_perm(tmp6v, tmp7v, permLowv), 112, dct); -+ vec_st(vec_perm(tmp0v, tmp1v, permHighv), 0, (int16_t*)dct); -+ vec_st(vec_perm(tmp2v, tmp3v, permHighv), 16, (int16_t*)dct); -+ vec_st(vec_perm(tmp4v, tmp5v, permHighv), 32, (int16_t*)dct); -+ vec_st(vec_perm(tmp6v, tmp7v, permHighv), 48, (int16_t*)dct); -+ vec_st(vec_perm(tmp0v, tmp1v, permLowv), 64, (int16_t*)dct); -+ vec_st(vec_perm(tmp2v, tmp3v, permLowv), 80, (int16_t*)dct); -+ vec_st(vec_perm(tmp4v, tmp5v, permLowv), 96, (int16_t*)dct); -+ vec_st(vec_perm(tmp6v, tmp7v, permLowv), 112, (int16_t*)dct); - } - -@@ -312,6 +312,6 @@ - void x264_add8x8_idct8_altivec( uint8_t *dst, int16_t dct[8][8] ) - { -- vec_s16_t onev = vec_splat_s16(1); -- vec_s16_t twov = vec_splat_s16(2); -+ vec_u16_t onev = vec_splat_s16(1); -+ vec_u16_t twov = vec_splat_s16(2); - - dct[0][0] += 32; // rounding for the >>6 at the end -@@ -342,5 +342,5 @@ - vec_u8_t perm_ldv = vec_lvsl(0, dst); - vec_u8_t perm_stv = vec_lvsr(8, dst); -- vec_s16_t sixv = vec_splat_s16(6); -+ vec_u16_t sixv = vec_splat_s16(6); - const vec_u8_t sel = (vec_u8_t) CV(0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1); - LOAD_ZERO; -Index: /common/ppc/quant.h -=================================================================== ---- /common/ppc/quant.h (revision 601) -+++ /common/ppc/quant.h (revision 621) -@@ -19,4 +19,8 @@ - *****************************************************************************/ - -+#ifdef SYS_LINUX -+#include -+#endif -+ - #ifndef _PPC_QUANT_H - #define _PPC_QUANT_H 1 -@@ -28,8 +32,7 @@ - - typedef union { -- signed int s[4]; -- vector signed int v; --} vect_sint_u; -- -+ unsigned short s[8]; -+ vector unsigned short v; -+} vect_ushort_u; - - void x264_quant_4x4_altivec( int16_t dct[4][4], int quant_mf[4][4], int const i_qbits, int const f ); diff --git a/contrib/patch_mpeg4ip_cygwin.patch b/contrib/patch_mpeg4ip_cygwin.patch deleted file mode 100644 index 0bc19cda..00000000 --- a/contrib/patch_mpeg4ip_cygwin.patch +++ /dev/null @@ -1,262 +0,0 @@ -diff -Naur mpeg4ip/lib/mp4v2/mp4.cpp /Users/pri/t/mpeg4ip/lib/mp4v2/mp4.cpp ---- mpeg4ip/lib/mp4v2/mp4.cpp 2005-03-30 20:41:58.000000000 +0200 -+++ /Users/pri/t/mpeg4ip/lib/mp4v2/mp4.cpp 2007-02-09 22:39:28.000000000 +0100 -@@ -1678,9 +1678,9 @@ - extern "C" bool MP4GetTrackH264SeqPictHeaders (MP4FileHandle hFile, - MP4TrackId trackId, - uint8_t ***pSeqHeader, -- uint32_t **pSeqHeaderSize, -+ u_int32_t **pSeqHeaderSize, - uint8_t ***pPictHeader, -- uint32_t **pPictHeaderSize) -+ u_int32_t **pPictHeaderSize) - { - if (MP4_IS_VALID_FILE_HANDLE(hFile)) { - try { -diff -Naur mpeg4ip/lib/mp4v2/mp4.h /Users/pri/t/mpeg4ip/lib/mp4v2/mp4.h ---- mpeg4ip/lib/mp4v2/mp4.h 2005-03-30 20:41:58.000000000 +0200 -+++ /Users/pri/t/mpeg4ip/lib/mp4v2/mp4.h 2007-02-09 22:39:42.000000000 +0100 -@@ -631,9 +631,9 @@ - - bool MP4GetTrackVideoMetadata(MP4FileHandle hFile, - MP4TrackId trackId, -- uint8_t **ppConfig, -- uint32_t *pConfigSize); -- -+ u_int8_t **ppConfig, -+ u_int32_t *pConfigSize); -+ - bool MP4GetTrackESConfiguration( - MP4FileHandle hFile, - MP4TrackId trackId, -@@ -654,9 +654,9 @@ - bool MP4GetTrackH264SeqPictHeaders(MP4FileHandle hFile, - MP4TrackId trackId, - uint8_t ***pSeqHeaders, -- uint32_t **pSeqHeaderSize, -+ u_int32_t **pSeqHeaderSize, - uint8_t ***pPictHeader, -- uint32_t **pPictHeaderSize); -+ u_int32_t **pPictHeaderSize); - bool MP4GetTrackH264LengthSize(MP4FileHandle hFile, - MP4TrackId trackId, - uint32_t *pLength); -diff -Naur mpeg4ip/lib/mp4v2/mp4container.cpp /Users/pri/t/mpeg4ip/lib/mp4v2/mp4container.cpp ---- mpeg4ip/lib/mp4v2/mp4container.cpp 2001-11-19 18:06:58.000000000 +0100 -+++ /Users/pri/t/mpeg4ip/lib/mp4v2/mp4container.cpp 2007-02-09 22:10:23.000000000 +0100 -@@ -207,7 +207,7 @@ - u_int32_t numProperties = m_pProperties.Size(); - - if (numProperties == 0) { -- WARNING(numProperties == 0); -+ //WARNING(numProperties == 0); - return; - } - -diff -Naur mpeg4ip/lib/mp4v2/mp4container.h /Users/pri/t/mpeg4ip/lib/mp4v2/mp4container.h ---- mpeg4ip/lib/mp4v2/mp4container.h 2001-11-19 18:06:58.000000000 +0100 -+++ /Users/pri/t/mpeg4ip/lib/mp4v2/mp4container.h 2007-02-09 22:06:42.000000000 +0100 -@@ -1,24 +1,3 @@ --/* -- * The contents of this file are subject to the Mozilla Public -- * License Version 1.1 (the "License"); you may not use this file -- * except in compliance with the License. You may obtain a copy of -- * the License at http://www.mozilla.org/MPL/ -- * -- * Software distributed under the License is distributed on an "AS -- * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -- * implied. See the License for the specific language governing -- * rights and limitations under the License. -- * -- * The Original Code is MPEG4IP. -- * -- * The Initial Developer of the Original Code is Cisco Systems Inc. -- * Portions created by Cisco Systems Inc. are -- * Copyright (C) Cisco Systems Inc. 2001. All Rights Reserved. -- * -- * Contributor(s): -- * Dave Mackie dmackie@cisco.com -- */ -- - #ifndef __MP4_CONTAINER_INCLUDED__ - #define __MP4_CONTAINER_INCLUDED__ - -diff -Naur mpeg4ip/lib/mp4v2/mp4descriptor.cpp /Users/pri/t/mpeg4ip/lib/mp4v2/mp4descriptor.cpp ---- mpeg4ip/lib/mp4v2/mp4descriptor.cpp 2004-02-12 03:06:02.000000000 +0100 -+++ /Users/pri/t/mpeg4ip/lib/mp4v2/mp4descriptor.cpp 2007-02-09 22:24:17.000000000 +0100 -@@ -149,7 +149,7 @@ - u_int32_t numProperties = m_pProperties.Size(); - - if (numProperties == 0) { -- WARNING(numProperties == 0); -+ //WARNING(numProperties == 0); - return; - } - -@@ -194,7 +194,7 @@ - u_int32_t numProperties = m_pProperties.Size(); - - if (numProperties == 0) { -- WARNING(numProperties == 0); -+ //WARNING(numProperties == 0); - return; - } - for (u_int32_t i = 0; i < numProperties; i++) { -diff -Naur mpeg4ip/lib/mp4v2/mp4file.cpp /Users/pri/t/mpeg4ip/lib/mp4v2/mp4file.cpp ---- mpeg4ip/lib/mp4v2/mp4file.cpp 2005-03-30 20:41:58.000000000 +0200 -+++ /Users/pri/t/mpeg4ip/lib/mp4v2/mp4file.cpp 2007-02-09 22:44:08.000000000 +0100 -@@ -1431,7 +1431,7 @@ - return trackId; - } - --MP4TrackId MP4File::AddCntlTrackDefault (uint32_t timeScale, -+MP4TrackId MP4File::AddCntlTrackDefault (u_int32_t timeScale, - MP4Duration sampleDuration, - const char *type) - { -@@ -1682,7 +1682,7 @@ - (MP4Property **)&pLength) == false) || - (avcCAtom->FindProperty("avcC.sequenceEntries.sequenceParameterSetNALUnit", - (MP4Property **)&pUnit) == false)) { -- VERBOSE_ERROR(m_verbosity, WARNING("Could not find avcC properties")); -+ //VERBOSE_ERROR(m_verbosity, WARNING("Could not find avcC properties")); - return false; - } - uint32_t count = pCount->GetValue(); -@@ -1692,7 +1692,7 @@ - for (uint32_t index = 0; index < count; index++) { - if (pLength->GetValue(index) == sequenceLen) { - uint8_t *seq; -- uint32_t seqlen; -+ u_int32_t seqlen; - pUnit->GetValue(&seq, &seqlen, index); - if (memcmp(seq, pSequence, sequenceLen) == 0) { - free(seq); -@@ -1724,8 +1724,8 @@ - (MP4Property **)&pLength) == false) || - (avcCAtom->FindProperty("avcC.pictureEntries.pictureParameterSetNALUnit", - (MP4Property **)&pUnit) == false)) { -- VERBOSE_ERROR(m_verbosity, -- WARNING("Could not find avcC picture table properties")); -+ //VERBOSE_ERROR(m_verbosity, -+ //WARNING("Could not find avcC picture table properties")); - return false; - } - uint32_t count = pCount->GetValue(); -@@ -1735,7 +1735,7 @@ - for (uint32_t index = 0; index < count; index++) { - if (pLength->GetValue(index) == pictLen) { - uint8_t *seq; -- uint32_t seqlen; -+ u_int32_t seqlen; - pUnit->GetValue(&seq, &seqlen, index); - if (memcmp(seq, pPict, pictLen) == 0) { - VERBOSE_WRITE(m_verbosity, -@@ -2472,9 +2472,9 @@ - - bool MP4File::GetTrackH264SeqPictHeaders (MP4TrackId trackId, - uint8_t ***pppSeqHeader, -- uint32_t **ppSeqHeaderSize, -+ u_int32_t **ppSeqHeaderSize, - uint8_t ***pppPictHeader, -- uint32_t **ppPictHeaderSize) -+ u_int32_t **ppPictHeaderSize) - { - uint32_t count; - -@@ -2490,15 +2490,15 @@ - (MP4Property **)&pSeqLen) == false) || - (avcCAtom->FindProperty("avcC.sequenceEntries.sequenceParameterSetNALUnit", - (MP4Property **)&pSeqVal) == false)) { -- VERBOSE_ERROR(m_verbosity, WARNING("Could not find avcC properties")); -+ //VERBOSE_ERROR(m_verbosity, WARNING("Could not find avcC properties")); - return false; - } - uint8_t **ppSeqHeader = - (uint8_t **)malloc((pSeqCount->GetValue() + 1) * sizeof(uint8_t *)); - *pppSeqHeader = ppSeqHeader; - -- uint32_t *pSeqHeaderSize = -- (uint32_t *)malloc((pSeqCount->GetValue() + 1) * sizeof(uint32_t *)); -+ u_int32_t *pSeqHeaderSize = -+ (u_int32_t *)malloc((pSeqCount->GetValue() + 1) * sizeof(u_int32_t *)); - - *ppSeqHeaderSize = pSeqHeaderSize; - for (count = 0; count < pSeqCount->GetValue(); count++) { -@@ -2513,15 +2513,15 @@ - (MP4Property **)&pPictLen) == false) || - (avcCAtom->FindProperty("avcC.pictureEntries.pictureParameterSetNALUnit", - (MP4Property **)&pPictVal) == false)) { -- VERBOSE_ERROR(m_verbosity, -- WARNING("Could not find avcC picture table properties")); -+ //VERBOSE_ERROR(m_verbosity, -+ //WARNING("Could not find avcC picture table properties")); - return false; - } - uint8_t - **ppPictHeader = - (uint8_t **)malloc((pPictCount->GetValue() + 1) * sizeof(uint8_t *)); -- uint32_t *pPictHeaderSize = -- (uint32_t *)malloc((pPictCount->GetValue() + 1)* sizeof(uint32_t *)); -+ u_int32_t *pPictHeaderSize = -+ (u_int32_t *)malloc((pPictCount->GetValue() + 1)* sizeof(u_int32_t *)); - *pppPictHeader = ppPictHeader; - *ppPictHeaderSize = pPictHeaderSize; - -diff -Naur mpeg4ip/lib/mp4v2/mp4file.h /Users/pri/t/mpeg4ip/lib/mp4v2/mp4file.h ---- mpeg4ip/lib/mp4v2/mp4file.h 2005-03-30 20:41:58.000000000 +0200 -+++ /Users/pri/t/mpeg4ip/lib/mp4v2/mp4file.h 2007-02-09 22:35:21.000000000 +0100 -@@ -329,9 +329,9 @@ - uint8_t *pLevel); - bool GetTrackH264SeqPictHeaders(MP4TrackId trackId, - uint8_t ***pSeqHeader, -- uint32_t **pSeqHeaderSize, -+ u_int32_t **pSeqHeaderSize, - uint8_t ***pPictHeader, -- uint32_t **pPictHeaderSize); -+ u_int32_t **pPictHeaderSize); - void GetTrackH264LengthSize(MP4TrackId, - uint32_t *pLength); - const char* GetHintTrackSdp(MP4TrackId hintTrackId); -diff -Naur mpeg4ip/lib/mp4v2/mp4file_io.cpp /Users/pri/t/mpeg4ip/lib/mp4v2/mp4file_io.cpp ---- mpeg4ip/lib/mp4v2/mp4file_io.cpp 2004-07-15 20:09:48.000000000 +0200 -+++ /Users/pri/t/mpeg4ip/lib/mp4v2/mp4file_io.cpp 2007-02-09 22:44:47.000000000 +0100 -@@ -86,7 +86,7 @@ - } - - ASSERT(pBytes); -- WARNING(m_numReadBits > 0); -+ //WARNING(m_numReadBits > 0); - - if (pFile == NULL) { - pFile = m_pFile; -diff -Naur mpeg4ip/lib/mp4v2/mp4property.cpp /Users/pri/t/mpeg4ip/lib/mp4v2/mp4property.cpp ---- mpeg4ip/lib/mp4v2/mp4property.cpp 2004-08-23 20:28:21.000000000 +0200 -+++ /Users/pri/t/mpeg4ip/lib/mp4v2/mp4property.cpp 2007-02-09 22:47:04.000000000 +0100 -@@ -636,7 +636,7 @@ - u_int32_t numProperties = m_pProperties.Size(); - - if (numProperties == 0) { -- WARNING(numProperties == 0); -+ //WARNING(numProperties == 0); - return; - } - -@@ -670,7 +670,7 @@ - u_int32_t numProperties = m_pProperties.Size(); - - if (numProperties == 0) { -- WARNING(numProperties == 0); -+ //WARNING(numProperties == 0); - return; - } - -@@ -709,7 +709,7 @@ - u_int32_t numProperties = m_pProperties.Size(); - - if (numProperties == 0) { -- WARNING(numProperties == 0); -+ //WARNING(numProperties == 0); - return; - } - diff --git a/contrib/version_a52dec.txt b/contrib/version_a52dec.txt deleted file mode 100644 index 86617fd3..00000000 --- a/contrib/version_a52dec.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/a52dec-0.7.4.tar.gz diff --git a/contrib/version_bzip2.txt b/contrib/version_bzip2.txt deleted file mode 100644 index 7a90c841..00000000 --- a/contrib/version_bzip2.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/bzip2-1.0.5.tar.gz diff --git a/contrib/version_faac.txt b/contrib/version_faac.txt deleted file mode 100644 index b53bcc4d..00000000 --- a/contrib/version_faac.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/faac-1.26.tar.gz diff --git a/contrib/version_faad2.txt b/contrib/version_faad2.txt deleted file mode 100644 index ad74c36c..00000000 --- a/contrib/version_faad2.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/faad2-2.6.1.tar.gz diff --git a/contrib/version_ffmpeg.txt b/contrib/version_ffmpeg.txt deleted file mode 100644 index 8ca79d70..00000000 --- a/contrib/version_ffmpeg.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/ffmpeg-r15974.tar.gz diff --git a/contrib/version_lame.txt b/contrib/version_lame.txt deleted file mode 100644 index 6790bfb7..00000000 --- a/contrib/version_lame.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/lame-3.98.tar.gz diff --git a/contrib/version_libdca.txt b/contrib/version_libdca.txt deleted file mode 100644 index dfa4de6a..00000000 --- a/contrib/version_libdca.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/libdca-r81-strapped.tar.gz diff --git a/contrib/version_libdvdcss.txt b/contrib/version_libdvdcss.txt deleted file mode 100644 index 4821730f..00000000 --- a/contrib/version_libdvdcss.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.videolan.org/pub/libdvdcss/1.2.9/libdvdcss-1.2.9.tar.gz \ No newline at end of file diff --git a/contrib/version_libdvdread.txt b/contrib/version_libdvdread.txt deleted file mode 100644 index ef686d66..00000000 --- a/contrib/version_libdvdread.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/libdvdread-0.9.7.tar.gz diff --git a/contrib/version_libmkv.txt b/contrib/version_libmkv.txt deleted file mode 100644 index b5f851c7..00000000 --- a/contrib/version_libmkv.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/libmkv-0.6.3.1.tar.gz diff --git a/contrib/version_libmp4v2.txt b/contrib/version_libmp4v2.txt deleted file mode 100644 index 33509b29..00000000 --- a/contrib/version_libmp4v2.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/libmp4v2-2.0-r224.tar.gz diff --git a/contrib/version_libogg.txt b/contrib/version_libogg.txt deleted file mode 100644 index 25bcb92c..00000000 --- a/contrib/version_libogg.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/libogg-1.1.3.tar.gz diff --git a/contrib/version_libsamplerate.txt b/contrib/version_libsamplerate.txt deleted file mode 100644 index 038fcbb1..00000000 --- a/contrib/version_libsamplerate.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/libsamplerate-0.1.4.tar.gz diff --git a/contrib/version_libtheora.txt b/contrib/version_libtheora.txt deleted file mode 100644 index 8595fe99..00000000 --- a/contrib/version_libtheora.txt +++ /dev/null @@ -1,2 +0,0 @@ -http://download.m0k.org/handbrake/contrib/libtheora-1.0.tar.gz - diff --git a/contrib/version_libvorbis.txt b/contrib/version_libvorbis.txt deleted file mode 100644 index ad9df271..00000000 --- a/contrib/version_libvorbis.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/libvorbis-aotuv_b5.tar.gz diff --git a/contrib/version_mpeg2dec.txt b/contrib/version_mpeg2dec.txt deleted file mode 100644 index 248ce7bf..00000000 --- a/contrib/version_mpeg2dec.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/mpeg2dec-0.5.1.tar.gz diff --git a/contrib/version_mpeg4ip.txt b/contrib/version_mpeg4ip.txt deleted file mode 100644 index f60e5972..00000000 --- a/contrib/version_mpeg4ip.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/mpeg4ip-1.3.tar.gz diff --git a/contrib/version_qt.txt b/contrib/version_qt.txt deleted file mode 100644 index 5f679e32..00000000 --- a/contrib/version_qt.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/libquicktime-0.9.10.tar.gz diff --git a/contrib/version_x264.txt b/contrib/version_x264.txt deleted file mode 100644 index beb28f14..00000000 --- a/contrib/version_x264.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/x264-r1109-75b495f.tar.gz \ No newline at end of file diff --git a/contrib/version_xvidcore.txt b/contrib/version_xvidcore.txt deleted file mode 100644 index 5d8c1971..00000000 --- a/contrib/version_xvidcore.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/xvidcore-1.1.3.tar.gz diff --git a/contrib/version_zlib.txt b/contrib/version_zlib.txt deleted file mode 100644 index bbb84c29..00000000 --- a/contrib/version_zlib.txt +++ /dev/null @@ -1 +0,0 @@ -http://download.m0k.org/handbrake/contrib/zlib-1.2.3.tar.gz diff --git a/contrib/patch-x264-cygwin.patch b/contrib/x264/P00-cygwin.patch similarity index 100% rename from contrib/patch-x264-cygwin.patch rename to contrib/x264/P00-cygwin.patch diff --git a/contrib/patch-x264-solaris.patch b/contrib/x264/P01-sunos.patch similarity index 100% rename from contrib/patch-x264-solaris.patch rename to contrib/x264/P01-sunos.patch diff --git a/contrib/x264/module.defs b/contrib/x264/module.defs new file mode 100644 index 00000000..6476d19f --- /dev/null +++ b/contrib/x264/module.defs @@ -0,0 +1,11 @@ +$(eval $(call import.MODULE.defs,X264,x264)) +$(eval $(call import.CONTRIB.defs,X264)) + +X264.FETCH.url = http://download.m0k.org/handbrake/contrib/x264-r1109-75b495f.tar.gz +X264.EXTRACT.tarbase = x264 + +X264.CONFIGURE.deps = +X264.CONFIGURE.shared = +X264.CONFIGURE.static = + +X264.CONFIGURE.extra = --enable-pthread diff --git a/contrib/x264/module.rules b/contrib/x264/module.rules new file mode 100644 index 00000000..182ede88 --- /dev/null +++ b/contrib/x264/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,X264)) +$(eval $(call import.CONTRIB.rules,X264)) diff --git a/contrib/patch-xvidcore-nasm-2.00-configure.patch b/contrib/xvidcore/A00-nasm.patch similarity index 100% rename from contrib/patch-xvidcore-nasm-2.00-configure.patch rename to contrib/xvidcore/A00-nasm.patch diff --git a/contrib/patch-xvidcore-fdct.patch b/contrib/xvidcore/A01-fdct.patch similarity index 100% rename from contrib/patch-xvidcore-fdct.patch rename to contrib/xvidcore/A01-fdct.patch diff --git a/contrib/patch-xvidcore-macosx.patch b/contrib/xvidcore/P00-darwin.patch similarity index 100% rename from contrib/patch-xvidcore-macosx.patch rename to contrib/xvidcore/P00-darwin.patch diff --git a/contrib/patch-xvidcore-cygwin.patch b/contrib/xvidcore/P01-cygwin.patch similarity index 100% rename from contrib/patch-xvidcore-cygwin.patch rename to contrib/xvidcore/P01-cygwin.patch diff --git a/contrib/xvidcore/module.defs b/contrib/xvidcore/module.defs new file mode 100644 index 00000000..0ec291a2 --- /dev/null +++ b/contrib/xvidcore/module.defs @@ -0,0 +1,20 @@ +$(eval $(call import.MODULE.defs,XVIDCORE,xvidcore)) +$(eval $(call import.CONTRIB.defs,XVIDCORE)) + +XVIDCORE.FETCH.url = http://download.m0k.org/handbrake/contrib/xvidcore-1.1.3.tar.gz +XVIDCORE.EXTRACT.tarbase = xvidcore + +XVIDCORE.CONFIGURE.dir = $(XVIDCORE.EXTRACT.target/)build/generic/ + +XVIDCORE.BUILD.dir = $(XVIDCORE.EXTRACT.target/)build/generic/ +XVIDCORE.BUILD.ntargets = libxvidcore.a + +define XVIDCORE.INSTALL + cp $(XVIDCORE.EXTRACT.target/)build/generic/=build/libxvidcore.a $(CONTRIB.build/)lib/ + cp $(XVIDCORE.EXTRACT.target/)src/xvid.h $(CONTRIB.build/)include/ +endef + +define XVIDCORE.UNINSTALL + rm $(CONTRIB.build/)lib/libxvidcore.a + rm $(CONTRIB.build/)include/xvid.h +endef diff --git a/contrib/xvidcore/module.rules b/contrib/xvidcore/module.rules new file mode 100644 index 00000000..76600608 --- /dev/null +++ b/contrib/xvidcore/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,XVIDCORE)) +$(eval $(call import.CONTRIB.rules,XVIDCORE)) diff --git a/contrib/zlib/module.defs b/contrib/zlib/module.defs new file mode 100644 index 00000000..66db2f49 --- /dev/null +++ b/contrib/zlib/module.defs @@ -0,0 +1,6 @@ +$(eval $(call import.MODULE.defs,ZLIB,zlib)) +$(eval $(call import.CONTRIB.defs,ZLIB)) + +ZLIB.FETCH.url = http://download.m0k.org/handbrake/contrib/zlib-1.2.3.tar.gz +ZLIB.EXTRACT.tarbase = zlib +ZLIB.CONFIGURE.args = !sete @dir !env !exe @prefix !extra diff --git a/contrib/zlib/module.rules b/contrib/zlib/module.rules new file mode 100644 index 00000000..5767ee68 --- /dev/null +++ b/contrib/zlib/module.rules @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,ZLIB)) +$(eval $(call import.CONTRIB.rules,ZLIB)) diff --git a/doc/module.defs b/doc/module.defs new file mode 100644 index 00000000..16929f03 --- /dev/null +++ b/doc/module.defs @@ -0,0 +1,41 @@ +$(eval $(call import.MODULE.defs,DOC,doc)) + +DOC.in/ = $(PROJECT/)doc/ +DOC.out/ = $(BUILD/)doc/ + +DOC.out.api/ = $(DOC.out/)api/ +DOC.out.articles/ = $(DOC.out/)articles/ + +############################################################################### + +DOC.m4.srcs = \ + texi/base/handbrake.texi.m4 + +DOC.m4.in = $(foreach n,$(DOC.m4.srcs),$(DOC.in/)$n) +DOC.m4.out = $(patsubst $(DOC.in/)%.m4,$(DOC.out/)%,$(DOC.m4.in)) + +DOC.texi.includes = $(wildcard $(DOC.in/)texi/*/*.texi) +DOC.texi.articles = $(wildcard $(DOC.in/)texi/*.texi) + +DOC.texi2html.out = $(patsubst $(DOC.in/)texi/%.texi,$(DOC.out.articles/)html/%.html,$(DOC.texi.articles)) +DOC.texi2txt.out = $(patsubst $(DOC.in/)texi/%.texi,$(DOC.out.articles/)txt/%.txt,$(DOC.texi.articles)) +DOC.texi2xml.out = $(patsubst $(DOC.in/)texi/%.texi,$(DOC.out.articles/)xml/%.xml,$(DOC.texi.articles)) + +BUILD.out += $(DOC.m4.out) +BUILD.out += $(DOC.texi2html.out) +BUILD.out += $(DOC.texi2txt.out) +BUILD.out += $(DOC.texi2xml.out) + +############################################################################### + +DOC.M4.exe = $(M4.exe) +DOC.M4.flags = -I$(BUILD/)project +DOC.M4.deps = $(BUILD/)project/handbrake.m4 +DOC.M4 = $(DOC.M4.exe) $(DOC.M4.flags) $(2) > $(1) + +MAKEINFO.exe = makeinfo +MAKEINFO.flags = -I$(DOC.out/)texi -I$(DOC.in/)texi +MAKEINFO.flags.html = --html --no-headers --no-split +MAKEINFO.flags.txt = --plaintext --no-headers +MAKEINFO.flags.xml = --xml --output-indent=4 +MAKEINFO = $(MAKEINFO.exe) $(MAKEINFO.flags) $(MAKEINFO.flags.$(1)) $(2) -o $(3) diff --git a/doc/module.rules b/doc/module.rules new file mode 100644 index 00000000..f318cf2a --- /dev/null +++ b/doc/module.rules @@ -0,0 +1,20 @@ +$(eval $(call import.MODULE.rules,DOC)) + +doc: doc.articles + +doc.articles: $(DOC.texi2txt.out) + +doc.clean: + $(RM.exe) -fr $(DOC.out/) + +$(DOC.texi2txt.out): | $(DOC.m4.out) +$(DOC.texi2txt.out): | $(dir $(DOC.texi2txt.out)) +$(DOC.texi2txt.out): $(DOC.texi.includes) +$(DOC.texi2txt.out): $(DOC.out.articles/)txt/%.txt: $(DOC.in/)texi/%.texi + $(call MAKEINFO,txt,$<,$@) + @echo $^ + +$(DOC.m4.out): | $(dir $(DOC.m4.out)) +$(DOC.m4.out): $(DOC.M4.deps) +$(DOC.m4.out): $(DOC.out/)%: $(DOC.in/)%.m4 + $(call DOC.M4,$@,$<) diff --git a/doc/texi/BuildUserGuide.texi b/doc/texi/BuildUserGuide.texi new file mode 100644 index 00000000..7fb3a4d6 --- /dev/null +++ b/doc/texi/BuildUserGuide.texi @@ -0,0 +1,280 @@ +@input texinfo @c -*- Texinfo -*- +@c %**start of header +@setfilename BuildUserGuide.info +@include base/article.texi +@include build/command.texi +@paragraphindent none +@c %**end of header + +@majorheading @value{HB.title} Build User Guide +@contents + +@c %**------------------------------------------------------------------------- +@chapter Introduction +This guide documents the recommended process to build @value{HB.name} from the official source-code repository. @b{Building from any other source is not unsupported}. + +@chapter Quickstart +This chapter is for the impatient or those just looking for a quick summary of the commands used to launch a typical build with the fewest commands possible. For more control over the build process please skip this section and jump to @ref{Build Process} for full details. + +@example +@COMMAND.checkout{} +@COMMAND.configure.launch{} +@end example + +The above is an special streamlined invocation of @command{configure} which performs the following steps automatically: + +@itemize +@item assert scratch directory @file{build/} does not exist +@item create scratch directory @file{build/} +@item change to directory @file{build/} +@item launch @command{make} +@item capture build output to @file{build/log.txt} +@item echo build output +@end itemize + +@c %**------------------------------------------------------------------------- +@anchor{Build Process} +@chapter Build Process + +@anchor{Checkout} +@section Checkout Sources +Checkout @value{HB.name} from the official source-code repository. + +@example +@COMMAND.checkout{} +@end example + +Sources are checked out from the @samp{@value{HB.repo.branch}} branch. This document was generated from that very branch, and for example purposes, we will use exactly the same branch. + +If you have write-access to the repository, then you may add the appropriate login/password information as needed. It is recommended to use Subversion 1.5.0 or higher. Lower versions should also work. + +@anchor{Configure} +@section Configure +Configure the build system. + +@example +@COMMAND.configure{} +@end example + +Create a scratch directory which will contain all files created during the build process. The directory name is arbitrary but we recommend something simple and descriptive. One directory is required for each distinctly configured build. We name our directory @file{build} for example purposes. + +The @command{configure} utility accepts many options. It is recommended that you specify @command{--help} for the complete list of options. The following options are detailed: + +@table @samp +@item --help +List available options. + +@item --debug=MODE +Select debug mode. Must be one of @samp{none}, @samp{min}, @samp{std}, @samp{max}. +This generally maps to gcc options @samp{-g0}, @samp{-g1}, @samp{-g2}, @samp{-g3}. + +@item --optimize=MODE +Select optimize mode. Must be one of @samp{none}, @samp{speed}, @samp{size}. +This generally maps to gcc options @samp{-g0}, @samp{-O0}, @samp{-O3}, @samp{-Os}. + +@item --arch=MODE +Select build architecture. The available architectures vary by platform. Most platforms support exactly one architecture except @value{OS.osx} which has support for various universal binary architectures. The available choices are hard-coded per platform and no sanity checks for the required tools are performed. + +@item --gcc=EXE +Specify the @command{gcc} executable to use where @b{EXE} is the executable name which is either absolute or environment @samp{PATH} is searched accordingly. +@end table + +Clean-room procedures dictate that when certain factors change, old builds should be scrapped and new builds configured. This is the main reason for requiring a scratch directory; to promote consistent, reliable and clean software builds. The following is a short list of some of the reasons why someone may choose to scrap an existing build: + +@itemize +@item configure with different options +@item subversion working dir is updated and you want configure to re-evaluate working dir metadata. +@item build corruption is suspected +@end itemize + +There are generally two methods for scrapping a build. The @file{build} directory can be recusrively removed which has the effect of loosing your existing configuration but does guarantee no residuals are left behind. The other method is to use ask the build system to perform an @command{xclean}. This is known to work well but will leave empty directories behind. However, the configuration is left intact. See @ref{Extra Clean} for further details. + +@anchor{Build} +@section Build +Build main product. All necessary dependencies are also built if required. + +@example +@COMMAND.build{} +@end example + +Parallel builds may optionally be enabled. Be aware that while a parallel build may save time on systems with additional cores, the output is often mixed, overlapped and sometimes even corrupted with binary characters. Thus if you experience a build issue, you should clean and redo the build in default serial mode to produce a readable log. The following command allows for up to 4 concurrent jobs via make: + +@example +make -j4 +@end example + +@anchor{Clean} +@section Clean +Clean all build output excluding contrib modules. Configuration is retained. + +@example +@COMMAND.clean{} +@end example + +@anchor{Extra Clean} +@section Extra Clean +Clean all build output including contrib modules. Configuration is retained. + +@example +@COMMAND.xclean{} +@end example + +@c %**------------------------------------------------------------------------- +@anchor{Make Targets} +@chapter Make Targets + +The build system supports passing many kinds of targets some of which become very useful in normal development cycles. The targets by convention are lower-case words passed to @command{make}. Global targets are one-word targets. Scoped targets are usually two-words seperated by a period. + +@anchor{Global Targets} +@section Global + +@table @samp +@item make +Alias for @samp{make build}. + +@item make build +Build main product. All necessary dependencies are also built if required. + +@item make clean +Clean all build output excluding contrib modules. Configuration is retained. + +@item make xclean +Clean all build output including contrib modules. Configuration is retained. +@end table + +@anchor{General Module Targets} +@section General Modules + +General modules such as @samp{libhb} and @samp{test} have the following scoped targets: + +@table @samp +@item make @i{MODULE}.build +Build @i{MODULE}. + +@item make @i{MODULE}.clean +Clean build output for @i{MODULE}. +@end table + +@anchor{Contrib Module Targets} +@section Contrib Modules + +Contrib modules such as @samp{a52dec}, @samp{bzip2}, @samp{faac}, @samp{faad2}, @samp{ffmpeg}, @samp{lame}, @samp{libdca}, @samp{libdvdread}, @samp{libmkv}, @samp{libmp4v2}, @samp{libogg}, @samp{libsamplerate}, @samp{libtheora}, @samp{libvorbis}, @samp{mpeg2dec}, @samp{x264}, @samp{xvidcore} and @samp{zlib} have the following scoped targets: + +@table @samp +@item make @i{MODULE}.fetch +Download source tarball from the Internet and save to @file{TOP/downloads} directory. No checksumming is performed. + +@item make @i{MODULE}.extract +Extract source tarball into @file{build} tree. + +@item make @i{MODULE}.patch +Apply appropriate patches (if any) to module sources. + +@item make @i{MODULE}.configure +Configure module sources. +This usually invokes autotool configure. + +@item make @i{MODULE}.build +Build module. +This usually invokes autotool build. + +@item make @i{MODULE}.install +Install module products such as headers and libraries into @file{build} tree. +This usually invokes autotool install. + +@item make @i{MODULE}.uninstall +Uninstall module products; generally the reverse of install. +This usually invokes autotool uninstall. + +@item make @i{MODULE}.clean +Clean module; generally the reverse of build. +This usually invokes autotool clean. + +@item make @i{MODULE}.xclean +Extra clean module; first invokes uninstall then recursively removes the module build directory. +@end table + +@anchor{Contrib Aggregate Targets} +@section Contrib Aggregate + +For convenience, the following targets aggregate the all contrib modules' respective targets together: + +@itemize +@item make contrib.fetch +@item make contrib.extract +@item make contrib.patch +@item make contrib.configure +@item make contrib.build +@item make contrib.install +@item make contrib.uninstall +@item make contrib.clean +@item make contrib.xclean +@end itemize + +@c %**------------------------------------------------------------------------- +@anchor{Platform} +@chapter Platform Requirements and Notes + +The build system supports various platforms of interest to the project. However this does not mean it supports all plaforms. If the platform is not listed in this chapter, then it is not supported. + +The following tools are used on various platforms and it is recommended you use these versions or newer: + +@itemize @bullet +@item python - Python 2.4.6 +@item curl - curl 7.19.3 (or wget) +@item m4 - GNU M4 1.4.6 +@item make - GNU Make 3.81 +@item patch - Patch 2.5.8 +@item tar - GNU tar 1.15.1 +@item wget - GNU Wget 1.11.4 (or curl) +@end itemize + +@anchor{@value{OS.osx}} +@section @value{OS.osx} + +Building on @value{OS.osx} is well supported. It is the reference platform for @value{HB.name}. The following are the recommended specifications for this platform; but is not necessarily the only configuration that is possible: + +@itemize @bullet +@item Mac Intel hardware +@item @value{OS.osx} 10.5.6 +@item Xcode-3.1.2 +@item gcc 4.0.1 (Apple Inc. build 5490) +@item yasm 0.7.2.2153 (for i386 or x86_64 architectures) +@end itemize + +@include build/platform.common.bundled.texi + +@anchor{@value{OS.cygwin}} +@section @value{OS.cygwin} + +Building on @value{OS.cygwin} is supported. The following are the recommended specifications for this platform; but is not necessarily the only configuration that is possible: + +@itemize @bullet +@item Intel 32-bit or 64-bit hardware +@item @value{OS.cygwin}, gcc 4.3.2 +@item yasm 0.7.1.2093 (for i386 or x86_64 architectures) +@end itemize + +@quotation Note +As of this writing, @value{OS.cygwin} has available to it several versions of gcc; only one of which may be found and +used in the path as @code{gcc} and @code{g++}. Configure will thus find what is probably the older version of gcc in a typical @value{OS.cygwin} environment. If you desire to build with the newer gcc, it is found in the path as @command{gcc-4} and @command{g++-4} respectively and you must indicate to configure the desired versions. The following syntax should do the trick: +@end quotation + +@example +../configure --gcc=gcc-4 +@end example + +@anchor{@value{OS.linux}} +@section @value{OS.linux} + +Building on @value{OS.linux} is supported. The following are the recommended specifications for this platform; but is not necessarily the only configuration that is possible: + +@itemize @bullet +@item Intel 32-bit or 64-bit hardware +@item Fedora 8, gcc 4.1.2, yasm 0.6.2.1985 +@item Fedora 9, gcc 4.3.0, yasm 0.6.2.1985 +@item Fedora 10, gcc 4.3.2, yasm 0.7.1.2093 +@item gcc 4.0.0 or higher is reported to work +@end itemize + +@include build/platform.common.bundled.texi diff --git a/doc/texi/base/article.texi b/doc/texi/base/article.texi new file mode 100644 index 00000000..7ff6c748 --- /dev/null +++ b/doc/texi/base/article.texi @@ -0,0 +1,6 @@ +@ifhtml +@exampleindent 0 +@end ifhtml + +@include base/handbrake.texi +@include base/glossary.texi diff --git a/doc/texi/base/glossary.texi b/doc/texi/base/glossary.texi new file mode 100644 index 00000000..1a998f4b --- /dev/null +++ b/doc/texi/base/glossary.texi @@ -0,0 +1,7 @@ +@set OS.cygwin Cygwin +@set OS.freebsd FreeBSD +@set OS.linux Linux +@set OS.osx Mac OS X +@set OS.solaris Solaris +@set OS.unix unix +@set OS.windows Windows diff --git a/doc/texi/base/handbrake.texi.m4 b/doc/texi/base/handbrake.texi.m4 new file mode 100644 index 00000000..efcfa8d8 --- /dev/null +++ b/doc/texi/base/handbrake.texi.m4 @@ -0,0 +1,30 @@ +changequote(<<,>>)dnl +include(<>)dnl +dnl +dnl +dnl +@set HB.title __HB_title +@set HB.name __HB_name +@set HB.name.lower __HB_name_lower +@set HB.name.upper __HB_name_upper +@set HB.acro.lower __HB_acro_lower +@set HB.acro.upper __HB_acro_upper +@set HB.url.website __HB_url_website +@set HB.url.community __HB_url_community +@set HB.url.irc __HB_url_irc +@set HB.url.appcast __HB_url_appcast +@set HB.version.major __HB_version_major +@set HB.version.minor __HB_version_minor +@set HB.version.point __HB_version_point +@set HB.version __HB_version +@set HB.version.hex __HB_version_hex +@set HB.build __HB_build +@set HB.repo.url __HB_repo_url +@set HB.repo.root __HB_repo_root +@set HB.repo.branch __HB_repo_branch +@set HB.repo.uuid __HB_repo_uuid +@set HB.repo.rev __HB_repo_rev +@set HB.repo.date __HB_repo_date +@set HB.repo.wcversion __HB_repo_wcversion +@set HB.repo.official __HB_repo_official +@set HB.repo.type __HB_repo_type diff --git a/doc/texi/build/command.texi b/doc/texi/build/command.texi new file mode 100644 index 00000000..db6b0b49 --- /dev/null +++ b/doc/texi/build/command.texi @@ -0,0 +1,27 @@ +@macro COMMAND.checkout{} +svn checkout @value{HB.repo.url} @value{HB.acro.lower}-@value{HB.repo.branch} +cd @value{HB.acro.lower}-@value{HB.repo.branch} +@end macro + +@macro COMMAND.configure.launch{} +./configure --launch +@end macro + +@macro COMMAND.configure{} +rm -fr build/ +mkdir build/ +cd build/ +../configure +@end macro + +@macro COMMAND.build{} +make +@end macro + +@macro COMMAND.clean{} +make clean +@end macro + +@macro COMMAND.xclean{} +make xclean +@end macro diff --git a/doc/texi/build/platform.common.bundled.texi b/doc/texi/build/platform.common.bundled.texi new file mode 100644 index 00000000..f5af0fcc --- /dev/null +++ b/doc/texi/build/platform.common.bundled.texi @@ -0,0 +1,3 @@ +@quotation Note +It is recommended to use the platform distribution's bundled compiler for maximum C++ compatibility. If you build with a custom compiler it will likely introduce non-standard runtime requirements. There are of course many valid reasons to build with unbundled compilers, but be aware it is generally unsupported and left as an exercise to the reader. +@end quotation diff --git a/gtk/INSTALL b/gtk/INSTALL index 5458714e..d3c5b40a 100644 --- a/gtk/INSTALL +++ b/gtk/INSTALL @@ -2,7 +2,7 @@ Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006 Free Software Foundation, Inc. +2006, 2007 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. @@ -67,6 +67,9 @@ The simplest way to compile this package is: all sorts of other programs in order to regenerate files that came with the distribution. + 6. Often, you can also type `make uninstall' to remove the installed + files again. + Compilers and Options ===================== diff --git a/gtk/module.defs b/gtk/module.defs new file mode 100644 index 00000000..d3b86310 --- /dev/null +++ b/gtk/module.defs @@ -0,0 +1,14 @@ +$(eval $(call import.MODULE.defs,GTK,gtk,LIBHB)) + +GTK.src/ = $(PROJECT/)gtk/ +GTK.build/ = $(BUILD/)gtk/ + +GTK.CONFIGURE.stamp = $(GTK.build/).stamp.configure +GTK.BUILD.stamp = $(GTK.build/).stamp.build + +############################################################################### + +GTK.out += $(GTK.CONFIGURE.stamp) +GTK.out += $(GTK.BUILD.stamp) + +BUILD.out += $(GTK.out) diff --git a/gtk/module.rules b/gtk/module.rules new file mode 100644 index 00000000..3cc65592 --- /dev/null +++ b/gtk/module.rules @@ -0,0 +1,34 @@ +$(eval $(call import.MODULE.rules,GTK)) + +build: gtk.build +clean: gtk.clean + +gtk.configure: $(GTK.CONFIGURE.stamp) + +gtk.build: $(GTK.BUILD.stamp) + +$(GTK.CONFIGURE.stamp): | $(dir $(GTK.CONFIGURE.stamp)) + set -e; cd $(GTK.src/); NOCONFIGURE=1 ./autogen.sh + set -e; cd $(GTK.build/); $(call fn.ABSOLUTE,$(GTK.src/))configure \ + --with-hb=$(call fn.ABSOLUTE,$(BUILD/)) + $(TOUCH.exe) $@ + +$(GTK.BUILD.stamp): $(LIBHB.a) +$(GTK.BUILD.stamp): | $(dir $(GTK.BUILD.stamp)) +$(GTK.BUILD.stamp): $(GTK.CONFIGURE.stamp) + +$(MAKE) -C $(GTK.build/) + $(TOUCH.exe) $@ + +gtk.install: + $(MAKE) -C $(GTK.build/) install-strip + +gtk.uninstall: + $(MAKE) -C $(GTK.build/) uninstall + +gtk.clean: + $(MAKE) -C $(GTK.build/) clean + $(RM.exe) $(GTK.BUILD.stamp) + +gtk.xclean: + $(RM.exe) -f $(GTK.out) + $(RM.exe) -fr $(GTK.build/) diff --git a/jam b/jam deleted file mode 100755 index 12884f5d20cac3ce47e8c6d33e48df1d12a5ed13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203788 zcmeFae|%KcnLmE+WC9ZiI_TI964(g_4dq8-i=R%I1Sc_chX!n@alsZOKb2^J06_sw-83;5FXNT4aAiq zj2O~Z@}1Y^zsnT3Oo7W3xJ-e|6u3-*%M`dwfy)%QOo7W3xJ-e|6u3-*|HmkB{*yob z8&KABf9VGpB*XwX0lW_(-N5CWJGZRpZ>D^A%6GnPZyd7p|K~(9$~k7uom)O-R=GVB zeG7RiLEY(JNX6x1;@r87wV_5nslN-$kFFQuUowTb26u_8%xDT$ss859U9xO`)x!F@ zOB$C}A?ZRG@3pC%zu=vI5BX7cXaL$G zX@NBN+_}|D8W-0sxEnA0>j#f+A!Z*34BV4#u|M0|LW3vID)s$RP~&h5XZa zq~OIncW!-MW9{O~`ibh>g)naJ!5616a(PeC6wfR#{}M2K)_Wh`Fm6UWzz0Sy?}>7F zPS6I=;49DZ$dZYC$a~weC5^T7ClpUWnL0^TNv8}|pYc^;ENVa%r1D@~ zU@ZCfxA@O%HLj0v72)dt&scC4A3FQ__!XqNg)#p$?krDv+lGs6%MpV5?egDc3S6eZ zWeQxTz-0dMZm>;v5f&|G#mbo6+$$PDh&nJ3m?nnk9n^fFbl$UDNly$hlg%8 zomoNnXmd@GTeM!J`-+8u@9FuYgu!xc@cM+sz(#x*f%WktgdMr-z0j&r0fBrj-_L~8 zgl9{CKgI9xDZ!74=QKTGq!r_+E0c??JKs8kHyDHc>xeUjU;* z7`~_|@KwLJ5BN_t4YVl@b)=`LI@I?7zMsPPF$L<~=c_*A!uv4&9>lvB?`isd8s2?D zVVu$LWq6;3_m9jX5m0S0#-T2s!pZRBIjEmKc%G)8U3f0jc%QY}esdRS(<6j`*O4&k z9&R2U0u2ulUgUS5hwS(xJp<)?^@*%97v<205z~!66czbngi#ugA13a7>&p_^FWOG@58I~jzT%v2Yrr>B z1dv{Uer-fMq^v`poos&uyazs;W=nS=J*?9w%5=~oK{L>RX`~PCJ}vV(ka^JeiZK=( zAM&wIt32fkI%zpz2Z&$TnG!<&7xAv;Q?M?=OV_fPX}z1x!be@9X^_Qtl%4bE)BlPB zJN+)~pG$ooa*6&K(qV_+w|`h)pfO}c!CdOoo7SM6E=kj5`!m?yF7RWya84d; z3P(|=$V7hOt2$Q^G}1p&&*y`HWBmDTPw%ngc46Do6SCGnZ}u*~`-AuqC1Zaut#+|Z zzT$1cSdq);e>EQWZxYVPtA7kpCl&0$x6Rw8`SzmEggZ^@o-VPaAcFMjZD`k!NA>e^ zNgtKI6VFXL{S=-Tspsd$;ki~nm*M#i{T#;gbp5;y&qezAIG%4(&;Oi(=P~-3G#sIy zS$3#?ej3lI)EA)l(a3ct%gQU+O;_>F5VQ!s%k4|4^l@A(&-%OOR5>B1(Zk=z2 zm9I}d>3+yG%lS86-R2KqtR&rp;bPwdW>anlWnQ?~fsfbC5yNo}9os6d2y}`JMVsd{ zBKwe6{A4I})9Y;`rTs9LWx}`o-m|VsxRL&XuD{%ug7m=eWqWB8wNpnI$K%BT5yKdH ziaN#rK2{@5Q4M`G8}gHf=R7=fe6Ga3K-W7lD7JR8K8&?X11<6WsE78zeB_ykdr04F zptBC*TgJL3;NK*MqMp}rABp=u+(+QP6Zflee*yPQ+@JP$fEN_M)I=Wo9ol#05ZDjP z0xjo{`!~1>B2Rn_`V88o?>B{OhKGhyDH_b|}HwQjF#mVd7cdK2R>=%xDQ z$}E=C?I}}fU)`W+KPW0`)*)uGj4zrVP~Wfk#1|cGJ%8Yf4zix#_C?dI=L5+)uGnR( zW0tN%^YztF2gUVS?0>U(Vz*gE{=R;wzZ-ne#b=Qbt8@icZ*Z0Pa1V;npRsQ=U6w>% zW4{miOxYsw!$EP?8!U@*=|Pb_)Ry-yo%evwdn|Xo;w#htd_U z=P18++09)mam?g*U)1Gm{_thAcUUyCTiTHsw3{N%S3^3zPNk1c3yRcbL6J5kCIZFQ{oqL#@Omw8WIP_O_|)yo8e&@Z$4k)5mi@6O8b7J+pqQnj!{Ol}A8c2om)-mu z;5ss|9ehst%m9uVs@6-1+5!I zS)`Tx?Rq2D1bcvGUJ*`xcjx(F@0=r!NEascj7aNb zU8~V1@=0Xp$05xt`!C=X8^79Y-)*`+FX1bg*?YkgE*sw+@5K|gIaHGGZIbw%r@ge(u^#}2@R=t+)QTlIeMNr&0LqB7@ zxp9geMk~rC@T!cTP%u9CS}-UV>9myb=t~LbsTMIn*=5Eiz%u}M zfaIYl?elLu zd4IkIea`n5;ws;5xH`9JT#Y2I&MgX8M^xeJ+|q?MH#me5K;L4#-U1p4-*U&(w6V?2 zW3$l@O9`9#z_x6Q6LL^PxEN zBjB8O+w!&17qkU^y2Xk9!dwt~VWNrXCf{=M^^K~JI|Oav z6pI(27uQC{U=DiZd3&;x`wXSpF*+CvucI5TP;KTe1 zd}2!}&%nQg_?HX!B=Whh`j0j2BV`v|>kMxc6M~}iZOCHMmaw(u;_`e$dr*vzURs82 zG)US{1`#PR4@u-rrUqBnZKU%Txt^U6_&90w^woO-fWwW0wyu56?x%~Qih2N)L;pKnZ z5MFMq35t&Vi_+ML_h?<)mC%#)kv|Sz+W}sCA7k#T;5QREce!9YogYt|x~S6#QFbxU z?9%lGePHCESoem%D;`IB+srP^*(-kO34d2i0G{+oj}NRj8t`m{QwBDcSBM*-Q@rI> z?n$)UqhqqoaPhZ1rbA3D7yo)5a^z7k&kxJH1-7ag z_<1E-*O_F?73fO~DZm^UG%vnXY;{8vObOZ5h_wSmYpYnfYDdmZ0T%GxEK+LVnPl zeF58Y3-M=LVgFHTA9PLgwtChXy zs}`nac9)ldyehu#)t7U9d2HIuuvRl#P|H4(q1o(fBr7tIhMB`y>64vn@PI^dAFN$uG<8D60s52ZDJX;0rT3=r_vVC zev$OZ5z0H-I~%s)D;STCXnPrauo`gWn3W}xG_>iqUUrtU^D|B8cj_3>Kh>Kic{~_prME&O{TARmvd+fRK+~$Mq`hUc0~2~g z&E>u98(-5W^N3eaJob!*6L_>YP4rwu+W$7a6n+4_(k|yvuea_%f6#9u&eTRaul1k} zgOpAFrM5Ue_b%&s;MBj1Q1+w#s+rvt*ewANhAef4mI4 z>gfJ5DMKdUNnL*C6V5Ny*b(2xZ`xilG|WeAa5muCtKmP|3R%u=m$F#^x+nR`lF5J& zq&3Fe3?H5$fAFh854FlNr^2^zEs(Mc+9MyI(I;H5bWQIR-rGk(w-jIN!FgZ{Ge zNP61lAjIE9dFoQ=q-;6vbqlc^^A6~cRQhYoOw2VXcOB>>)`$0gd8JOlLOTU@$TZ+l z-ao6>U;3xX+iPmQsCv}yrMLIZWVc1;%G`8 zf4CPt?edAW-@fCU(k;I~TpIsBb4UyQ-h=n)qy_75eb9Z3W4Idk(DrUzJs4*ME-(3b zDCcF)SQs*a{J!enA4mBiHh3pX z`hkz}>clx4yga;rVuN?^3*Z%5@O0aKDEpiZRterW5Y`va6h5*m&-8&)hH`Z_IJ5A6 zhlF$SzJ~AnO4`o0zW%rZ<+5yW=HY#)t!;-c-nJ`i`@m`_jeq>M4OR&6uU!Hs2XGqE z2abtyk5E@?nziA*$p$xu_xYEA>kNu3UbEoF9!T&?JIdZ@gS83oS(kw21*~NjEREB) z()jN`vccJj_jfM=2mN@(jTW3;$aS#YZTNwnb1vKub^Fo@$zHJdj|YV8Sn#nXxpRDuR)r}HlFRE9_)pq zO&4iBw2i(sh1Z{6D~+Fi4P^!e#UHopvI+mA)wX`hJ%Vx^XIQQYchKn5?UD|*ahUC~ z)pZAGVDm%%euOzfWVGFawH$GEh`vl)J9_%!V)xG^?Um0>8B=4`gSjZy9uCOy0{3f6x}bIipsml^Yco`+>x{ygR{jemB4eNLOrhS%$uFPo;d z)^D>{_9WY#v@vO4CTM+z?YHs3nW-Ajf>h z?mc$fY?j@X@z+&ffi7$8b)P;usRwrUeUkns_&f=9n)h)W8G9fc8XjtHeS$mz-aP#r zbTa#CTk`|!LX$v?NXn}rb1m~0NWVGg*A{WS3cFtnLK_Crjt8A`q&?dS-_S^WlRN>R zr9)(6ZSJh%<9H9}Ot2kKAb$z$F(-U=<06}mmr;*KHq)*;`AG9iA3fXryO%?>TU1}1 zDh%I`vH3x)F=7mktm}c@5Z~8|!BDNQ#4CtnQ2d`6E$<-hhm@IkHeuNN>m|^~;^{p} zc{LOEBK^F(#)fpiaE+t@R{&QDt{|>y&>hPHQ8CfqEyT=j*clIs38nG>m_d0Wu3X=a z{Fv=9h^rClI7wU%tNHR*oS0(_)${nU8HMjx%?tH>;~3@$j|@S&uTOe+P^|n6=>>h# zdysw<>4DzqAA;XkzJ~OYKIvYhKLh>^Xuaa0y@U4>zN24VcsF!E=Jamk|DGQd-y9#= zg?>o3>zLGOSt2PDHhr_ZD83&wlW}ed8gt&Y8g$-{x&1qs+yB9@=U<*K(B^7Qn~CAB zu_4Sa+^`Sn8*(eZ%I{8KE~07myCY%KTW0R0Y(M-i@)+%z0uy-Z%8$6t3jO%evbIb` zZ_LSkcy>3W2`BxCT!-;>h|HjvQAryLwp=D`-V{w27oLsw*l&qW$Amq;*VZ5 zINf>#KKGr;7>c0y#9D**HFrG~%6;^U=yObvKAbZ|o+Lkhe>?HuI(LyNI)JkSw530T zc&&sy2Aen9UM8G{cqpDoia_FePPn|_ME^Xi~j@f>uHtIdfyhg|Q+*bV(G^~`o*H2>`RQ1jocM!%fHx+~VA zRKLo30BGd)H6AN7A+LZ_*ZRI1OCZ~g;H3vg9be9Pn}$?w3NWE z_#vdFAr0%^h70h?lbMvshzb4KA;#f5WfEhMIF9f1gJ+mmtM5e};`PYGz^PO0llY_w z7i9eD+#g6h(;@T3uS3Ia1HJ~{iH8#~ImWNiGG0#^4yQ>!TLtSkZ(|*9&Qr^fKLzH3)OUg#(32Q-U4UFb_IUd~OPL453Z@{7g|`pV&o z{x9&z82E>AFA(mk3NihyaGLmGSp2Vsrcvh`!VXcEDN>Hh{>OSG<&UuCn5Af9jZ@GU z|M4Mw_gqWxnAlk@W0i168)}d~NT<7WI{R%J(g!2mi?+E)JID*m%J}6N?#Pql8y^20 zF>g-vCHvpX=SDuKhUL_4q8`rx%oOqzarL#V4gf|uzEdZs0KQKDN5&5ou#Zu{JuQcH zw)L_8b_}{*q$`;JDAP0@uGYLU4RuIak$RDJ7Y{tab%+b}-EZ*iXBfABhI%7-u0GZk z?#?SS&yrRT>9`q5Rf;JtzP2$EnTf_wFx1d=5HgL}7ct!pW zw4A}5@JyRU!@&A;%c0k%VQ!EZt6#$SOnWFlknsDoN9mXOzU-R-^#^6#{Fc-skb_y2 zgPf+Rw}ql(kPmtSG|n`q_WDlW-ZAD`bscQS6=kHkD|`=pR@5ta=C{cAGgvkqWo3+j ziE)|h`>{H#3AHJ?ZA!TXdN1D4bjxkh@6>0Wm52*LJjL6vMTH->F@1elpY+jp0{_7s zt2>7r35sdAYrW}fJv!uw*2CjC_C{*pW7&YvDCj{et`u{vs9J*&+fn}upjk5J!)D*u zeU$V|#;S(Qw(QGfd}KT(=RqB?dAN4Q7=knYP*cV&p{8$?hA_|Z2E~W@h*=P;TjBqO zuY2_^B7OCB!o500cz*CZ_~KyOfHs-HBeA|^#rdF*GNoMLZq?n(Ck#7C<%!2*$V1(Y zK9~)??$%?Lt2F+$BxUdY`stuJHb>QCc=i0b5cHa=<}yaQ z|A+Cjke}oJ7 zN&a^*|EK_;2_c#ve*!iYe7d{g&#eT%VLejKUyi*Ix%Q)H<@#G<{_-D9^a=QnsI|T3 zV~hbi_K=)Qw8Xn*UX(}On0Nli4Cx1W5jquc!<)b}o41uA|59@p*GjgPMIJStZGPe@ z8CT0P(Dl##{fp?YPWJ8jeVFqk`2=*g_+s~l_#thNC;NbN=f}XCw8b}l)#IrMs&oyHo(C<(4f(e9_;lkfenpQU+{>t~PY^|Ju*`|Z2-^)uK^TQm%;R~gXF zh7WT()|DgEmEDj{{lNM_=Zuvjum%C!1iCPXI>i57X`f>aE`bl%iUSv}>0K13DR!KS z*2m4<$E9qfN7hS!J!MnISu%E$wxO?ww4Sq<>oxFmagH3s{Mg$%32Op~;|q!pW^gVY zY5jvowFf*&9h1#(J=e5;7rc%-&@OlLj!&N@KS00iV?F5iA*@%nU)rYUI~4tehqU*N zMEma--~;G`3a)Qr{Rw#Z11uX)@1+~i&sLw?)^QVl37;Y3{{r+o$T7akwN3MT8GIrE z#Z!al>$C!yr+8o{?0^hCMrE2sBEWTI*s#t5=v?3CU(H58p3&*Fsa$Lq@TxGizoh^8 z7~7g0{btmYSd#-R=?_zN4_J=6|4P@LA>{@BFIDe5`;j*aovvc2)(aIwMY|SqPoEC- z*>i|rB2E)6A5Urgce}KI#|uA{6MV(|={ldBr=i?3JN_@*bid7ikf5vd`vHH{GlTO_ z=r*UqKXu<1;7{9V?`rr$^jtbYuU_@_=U+k{R$p@5Ge-+LoB> zV=hBKsIq(Bc1c~9ngaTS$FQxK(@X`Pu#JDyD?Y&P>$CB10xsd1)u|_gV(@FgCo$gG z`Rl^5IW_6~*_+rOlz_?p(tXv%F%mMGq45rb$KB>e+SCuq{Rd{X6FO^PUAWfrb-%q* z#bP`-gK-4r)YL6hF~2Bk&)lt8q`v!n0hHSA2hH7TT3%Z&&L^ z$03x-ChzGy&{@Cc8Wv*mVT*!RpzC#=d}c*6mhyLDcU!cIkT0$#tdNP8nC=jjTV&J%?SC zndlf*p8Ggrz~5)&_@r+FF*8aIe|Ze?6jOX69#=Fp%Avo68VghQ(`N~K>e#4Xo<-ha z7#9!0c9yma^<(QUqa1N3xiQ!;w5>|xzm{uQ@J+~mAr1eGHW;L*ZbQk;E)_#GbE6eQ zWR&%>fijfcN;~M?H|;hD?4XsP=XIcG@aEru29y7s`p-s_^~b{~KM1x|Tt$svW(Bh{{)8g~blDLR2 z3kG3-2^i1WV9eJ29)QoMOvT5Umx&@(RB@Nymp-aABCt*;p6gpq3+ z6UZA%E`F8Dn0;N>H0Tm5F3PLMUZWiK)g|`?y;TwvjkhOotD>DOCh|Rh)TzT})v3c8 zhnS?xh=GkwlS?uF$ID3L!1~WuLSBQutem9nV~bz!&j#S0YBMDHsy`uNx zoja>^{J*tf>;`=rD}hs(?F7GL{lmxw4Gtr%tUyfpc7^z+*4O9GBCTBMoCJ*78pa5G z^Y!`GpubU`^uC}(xv=`SNp-Z_?YjSRF`#vh`e zGBAc-gZkV^qo10(@5IALA@i^NQO4)v-CO95oT(i1cTa>zPJJiReU)eB94NmQ@@M=c z)|o~4&Xga9i;Z`}#n|6i?4A_$!v-DoEl*@)a02uKVNRrNto3jvWB*`3({GLbJ@lID zQ&D5v^KeMZQbp^_7{7;$%rN#$#)jkhd*ChVcHI3~)1m!gVlHI9%(fg_i~SHz&Tpxk zS7YwG8sA_Wl8-WcBd|yITKP^IUofwD*}e{+w38XjM&C!aeSxxR1l#i?JVT)>nB@PVQ;Y zbii2t=9_@yMIKkU+IRD z$;*km8+2t{-{6_M#H8w7()P^c7>&Hy_|90d!FWzz-HHL-ZVTJ(Nn31KV(x%-R`7g{ z(kZ98Heu-?&X+3T<4*Xeg5uyE@N-I9Vl5zt^Jsq;XxS`)`@ur`5UBT<)D$eb@h!c*V&Fg{9{x^nO+FqUDRn%Mf*TU$|d8hF#*cP~& z`2qAL(woMh579?Af=JqkK><)?rO`wta#dG-28xs9S zzR~-oIF^v#(RSFD2bW@xMUb`-p2xuVFirb<7%we-?f#7ie2^u%UWB=7kTxvj19}>3 zSm-Z(wuOv^i`2gtiqy$7AF>q8U)}_HC(kTbJoBI3C~xf{n5Eixpnx!fV*Xb23(mMe z2UXIi^6zVLFZW}w3vssU!Ct6cUsx~Z#*mFdy_fU_Wxv1q3H)y{i(b9v@X2{+8GUSO ze13BdaKQn*)cTLKo!TXVytfB8>=1nn6&-wyxDPZ7hQ=nnmP zuoL6SvLZ9319p9*junLr9i;wtk+zC9|9U9-?cXi`r<=YOeg^$f{%+1|946b)ZivOSz5ToX^%Q6ul(gO8Y(yV4;eDQdXP?ZcZJ_$wu?Eli z+TX|i??!)BzW&w z|KFp;$uyks`AHe>(6l@q6tBO=Z@{}v`xT|XPN&h2=|#KjX%(PHKFUoG--100DF>fr z`v^N z0P6P##V_8V?w9RM__Y6RZKPAK*XT8@{TayjVYo={!58fgXSmI9hOPChi}T6;iM}Xl za?cpZT4Qn^zJFR|^e;j_;D&E6%Ge)uj*VgNbv8!QUkydj-#mW@d!s@e56g?uKgGZG z_+P=+1;#k+JKvD(r+-@^pQGTFF4F9cchSZI@;chMShu|#-?0ArMyHg$_2rK4IS?ZJsYHwcC<$ zYh9<$T2~ii7NuToRXnM5>MydeR!AMmw#ju2@atss=@=cy?OBcaNH{a23^th458Xo1`FSEybQL?dDwpABBmOfLDO{lB*Js94oN*{iV5MalhDP#7(&}#@npP5 z+iafIFC$iC#7VXzoAm(ajBuuW=ek&O-eC99_OS)&i!@V|uNSgZ2HViu%Tj=MH`-j# z?u3kN0-Z2Und>ol@8;a$z!}(2&d4r@hwTKtC+qx^v2Pn^Lvij7pONxs&BmQ$m8(QJoB5|8sG3P_XeOoSJUWH@Z5nFs4u;#5a*2qL~eMF@vMI|}?n@X)+Y?uEJv8An!&)qOfV>xJg8cwJDCf*r zZ{of?(C230JqvS5X@BF{hqSL2tv4$4x=bVcnr9-xudokuFrF{=J)Lhh=2b_K=3-v@ zrKk@BErt*E9by{Gsxjz+B8|svFtRGzNCC7jr=|tE>qzJmD!p&>A``b*en0P1+VL$JmGt%(toqx+`sUTWkCKh;MtQD8n^F;+`qW z5g#=Roi-;ZGAd`BY7pA|?Tu$G0wGVcMA z$s_f|ptt21Eb|XKp!z8-&GudHGeykXXSTE~(0#wgrLj-lgLPetkY|&E=aT2W$aOjAtA7B^s?YDGYr}jU*_&UxFdz1Y_SiR;0_O(;Y4K9d( zqHYsPCS=`JL-xz_SUL9|%d-@Q><6!ei#nZ+_zs&>Ok*4-#_|dD0n-n`b4cMHeI4w8 zA^B3*pPTPea4z-Tff2x-C#6f_n9_qgF6*1alYF+)zUCKLO`GsrLfB!xl`Hd;PE$A}WA1=C9B(sb284WwT}@ zA7Z~#N3)z7PloJQi?F}uNFCZL?b-btOPMF;VA<3g zQT_$xlltin?Ad%q*&5C+l%xIImS3mxuOi=5*1-4B#|oyY=8&j=JYoYr1gv>&FwWs~ zF&=&jvM>TR^?Ky#be8BkHldEGx{d5FLSrU`!ePJ z(!8=A1*#4I6ZroncsQU_jG>ksA>IM{!7#vMkO6UqGEotL9vKcjMHyc&>XBZiV!PCS z#?`M3*^fEOL8KojjKHQX9kM@v6ykBAgR~xjEX21#J|PS7Ex6OS(Y0zU%bg1XzSf7Z z8Q1e1h0hV=^ZDx+%z11+J-ZKxd!-n6Z&nS+P`habw^}{jM?(E*8vW6R%~$UPQq1n zrFJWwo!V{9$L+8PBRVRzLBpyitR$YPjA;X&sf{cPohdIBU|iT4lxMg5 z(%@%ZF4TGl7>M@AN~CoRmiuZ?x7X-4I?+a_a9FtX8=nbZ82z*40bj9G#-sr!=p^{o zN2cg`Yg!iR%y~X^>@Wv#d68J+J1jF8}{c`#p6ag z`~b62PY2pzeV>T$E3^!pz~0Mp?SC%eK0)cn8qV{PupWuAjdMfny_pphFRUef04Edi zf(G}LAZ@drD`LzLYuLus#ZJ~aL;KpKFI}C@A|6GaaOBRnxL34H``9K@4wOAEWK1sL zV=Y6SwW`zSsD2Rz9An!MGex}A8BQ;Z*7YAk84vr7d9;shi*BO}ccYiRY@b6W=U9n8 zBfrR)UfLKfj;F)-D*lO8IbO)W4zYSjUp30HgElpMSc4e1z_Z5NF$XrMV+XDiFyq>h#^-W%PhlD^ z(F2tC!7eo~ex-Pk_YxP&r(lNt#TRJ}S~+PaAb!#nX$e9`Q}QD4`6@k~atN}c_c;j+qGc0>8SGL|tXc^=wftg)%{&>BQ4Y$S28TwJO5b);gPc+RlLtWlrY zVM4a%2G%=BW5%aic(|bZpwr^8pWq{BjNF&5ciW2I^*Zz(1-4PH&!FD(XR!vIZO7*? ztZPK?x{QN%n5vEE;jb}vD0@xQS)SE~vo$dm#?r7r3Op&ZU;ROi|lN>Q>288 z;d_SPfa9h5tp!7_V+O@P$@p%_2K^M7mXAuE0kv(6l6#{hJmL?u>oA5n5T`|7|9RKV z5x{>L@CjF*31?6*VJ@<5sFF1!owj>yxK-xdp$p517$0$&=lBU^_~puPdE%2D>WwzBffOz5{pTUq$N6J@=& zvWf8l`O~4(Fg~2~-25Z7d8flkoMA)Ayog&r6)ER6QuSRj!pkjS=RuElzEJU(HV z@~0L30P#29)BM2xHTQGOmwF#K7HPVc_;LIuL)SThz63~lh zgAq^d3w#=5jzOOd(|YOfXeDC7_&X$siECN<74Mc$PuBTC-B=J9Qd;KE`U$h`#+^qn zPg8ucc~ejXKe(t}l#Hn}t^TGC(q*A14t$7yV!V|84UWww(%#f|leAaN;y1G~HdrxK z+Sj(Z&0J3&2-ecqS{i>&@+Q-KUEI(1tn?Y`ZyzECRq;&$S$)8F9TXEOgk>pq06 zgu%<0qXQ1$=btH!|I-ZU&JL3N3mCIZ>^swEJWK<8dDe~GyD87Q*}5U} z((gTwA9dz%|6uc`r}Q4sXQuO9G@QL@(H>_{Y}&@}ID_RA%0i^$Fzrq38;LKM?Liws zs|ug#6zaDGe)5pkFXeho!wdP~{x{I}$75&T6yLT(z@l^PiK4$#+nnv+n43)vijyF+kR8~K4hzJI7a%Wo|ds;v9!}> z4C`vRT)5J~55P^l85AXNYx$RJkgc!$TNh;3Iyc9pOqwmHO-)y=6Q9TliYaf}^37sC zU-4cv%|ya4Q& zDx=p~{Pw+G_PAP$4%CtQT>b#`!szmVT$4zF-pvaK;8O}f-xZ6zhJYACeS!Vj*q6}N zgnfA9u!fc+=bE@FNX1F9LGw?rHgWj z{;X_$U(NB^Rx=a%&=1t9fagFw#%Q&!DTdi~O|Rc-NX9kxnkOK>26)1Eg**K9v;nq7 zuLEAnCnoor`8ICAnzF)?&(S)>%nTOSqfL$I%j>0GWV+!y#QvLucVH z8;E{5i@xUE;8_3uGBHlbpQ?_!`WBp&o0GN8(!DA zU=3WXwBav#+*d5|cllPJUt18cPQEXea4cDvSRiJ6Tp=F%>#&pOcuZ&rw^-+Rh#GYc zuf@L`js!*VbLjVU@KGiEA9H}$5SN~((;fxRDZqKO8pr$ew=MRxUta>o7VLMGx&wT4 z3ga95kTG$`72ZFm&)Pa$g?maQE%4oA&VejBga_xe@Z6R>zAO4Xb{4V=oltbf*91Sf z$#ME={PxaIhGLw=zR}InZ)_Gz*qNHP>B#E~iYKO6^#X=h>k9qt$7zXg4r%jIPCRV4 z(n0vWH(|)}&aD3VA^0F>1;vw(5-!FS#OoMmX@{Ff=_@Jx0DX5nIyteQaUS+fG45+f zKRoQ}!@q|i%Pz_W>d%w>h*%WxtP8&7A&U2Bk@sC|>%Umr%^(cpWYlT#wg z@mwdYxocU-15TOLwfSRCZ2>;&j1}CG?qRw)^_1SDiaRE&?Dy995%;8YMh5ug?j_$bEvn(20IG7igr}q&6H0mSDRMovDfW; zV7&`64q3bTCL1k}tb18pZ)U=19xn3e=Lrh`P};Ph`3BIr!WvJlcn=F-DMM1O&Yyzr zo=4k$cUF9#Ue`?8dWmyeJK9U*d(MOx4-ZYMKwqvUuQ@XKY~F$2;HbiVxJ3iw6yRgd zCgawQOC5%H=A&H-x;m9@W_*hCH$t{_mx=v8=*xF`P9NZTKqsz!&uV=Ub#_Yrp62fc zeUz+=$U5>d;-nJw2`_CB)M3GTM8ZP;b+3qYX`2BKc)vUMFbG>3 zz@Gjt&X;(63-v-acwn~T>yAw(Xc|dnodt{=0Pn8PQgqq$oT9;|to~_r*x4_EudKO9n7%eG=a#RHvGUj>MBaa)eB*D|=QV*JDvJIAzRD38i`86|=O0Zg z`aXV(?QzLN<64{0e)vf#XUfmIzL2s8{h4i(uVaiIq3sQR#T;Y9IpW&dfwtlT57q0~ z5-DeiIWyYVwAk=AEy87=JKOY|KY+Oe_fue>37^4h(33mYa(G{> zwVyUFbxI{=-iDuCGq&NsPvS>7FQc7*N59Tv^JNti0XhWO54RX#8Jgxrf&-Uj0 z54iBWHtODTty}fHu6-Ny6vo;~j{tYr2Ll~Mit%OOfnzS0i8V$GejZ@;~qzq6+NXZc&P|3Ln(jXFoSeFkmZ z(s&2fUkw>Uf@k*ADUC}_Y5b+_dcJJ>v2TU-w2peEeR3Rgu?OA@VV|VJuSw!JmH2V) zD$kdaJox6KwqXgJJihze>m@$;4PDH2hmoh*p9-JH_Ht~%Sk8WKwCTPMO(%IK>4oio z^NZTA>VxirPU_SC$8`JG4Z+@}E^F-RwHLuA1J)cy(Ry!2(k{W?PE+iMp5G7JW#_is za3$>M?(*3fn(347xPj++Vn6l`Zh!X;(*AF)+FJk_5|W-9_m+W^z`#S@M{iEvW&W=Ib~ZD{`{lLcDQDohLaNoKKi+UxM`S2SWc(&EEm8RVjI?2V7Exz zad*$`a>@ChuXuY;q{{KE(j7)S%eB7JoyQnW$!8rRqcpy21LRzt_XwMFHJ+2@e~OqV zlsBns4XfTf;uh)t)-^?@IFY;Fs7HSvo7rvExwDI9^m&4>TWv_TXU`$F0pD>B1lxX2 zuA>Fkd-CjgvDWHf`;u^9{8?n9>3C5_NKu`#Qr;7U!q^4qxKwz-K^~G&htAlFN|~j3jMP!Ns}G* zNt(cqM*FY0Thb&fBu&;}pE+r=vV5?OCWEiCXd?ZKzGAfJ-m9LSSz+bberx0v$FqeI ztef1s=WNzwq31c>0klPo7z4hZ`W?icl}!LGlkFRfeYs=NzEZSrux{UA;U2qA1dBR{ z!X`383P-dJv{Cv6=RBewU-hFsrSTmf(gu%?>CR@`l^tyHSfUJmj~KoV%oW)ugad9T{DpZ920cMj%BVhiZV{nz0^7C(uOZ*&;~JhUdaQ_+hw zhKzyVp!D(E-7Iew_vM$*wV(JZLAa7nM%sBc$tO|hQy+pi8MjKAk7BQT6k~Vvd*BO~ z=Be1jj)?&E%4@@JrP=r*jqpO>-BfC0b83BrQ?W$|jBMbo17Lzl}v z(4Y@sn7|$RofD;>@q)O)D;tI2Wn|+jz}0{&hHD$HlW@VH7DorJow&||>;<^OxbU8W zcPHMRcz5F6iTBibxVGRrF2sNwTzDS<_yZuh1G;e?!o_dMJJ5|Qglh+`(^Pl3@b1F9 z3-4)oPs4i}-qY|dkNfVz9dHH#&R~=uJPlU`t`1y>5en|XRfY@Y(qF)JN{As7aRqQ8 z-;gdLu5jTB;+l;MEA&^i<9ZrbH?Bjtj^hG;SAr&2NHMp5ALu17c1{T`9AF*++X`IRvv4j zPxWd4pnlrlJ<(1-^SAM?q%1wvr~QNaYk!8lyhT4Hi$Cep{z1Lk-wK*T9;Chf#WMYq z&75azemh1VHqU45Q&+TiUk#GBW^cLOb1d1{eP!ti8{>TIcYY)q75mANuGH@ctILZUg&4>o%9PTl(Ci%?H}-E z+MiY$f3i>e2Yi|KgKwYg)BXWpru{76r~L!IO#7jGpX}5A)GyP1l;7N^{i$E3{ew`x zPy17Qwg1nPlg;xlAt%rYo2T~XGv{GDpIvAJIQz;!Y$)d@dl~AQi|eUPa=%YfE}gyP zUzLSCb}8Eqy68w!M{erugX=ix6Wy;;#}Jo{3vsz9yy?B+r5x#7)^2BFzUj2#GPF4%nk?Tm-kb?=i;>8xV=yL65WmwfaSBpx{yB|z4~8| zCA2XwGH!0{!~aGv{)dfX+3Q~fBQ+^!-I@K2N9eZ=AM|dM(O_?f#*^cFf8!C$Z|GA# zuMh8I99Da(tuY4U_gV0RyJ<{H$SMn83G#_kDBEYe7Cje^&Ej>WIjyp43>TDtSD&;^ zNOSi|!rA_ zk-i7OV%y<^bC|!^{;01ebrSISv;0xSuXQ7Qb0h4&xu2xcrzw4d^vxZ$;36O3DqqeC z+IjH(87`ZzY`x7#RS+KRps#MC_DhW`PqTbZ@YSWkFQwWgeWubcwe_lJK~GN--cPTh z?@iIWyC6Es!lSQm=A$?C8mOhuWM0dccM0DedG*ht6@IJ1Oa6fW>LkYL(P+P1v*o?l zI;t&RFO0P;Yt2-xW&Ky4<!D*RY0F245l1 zAh?n1S@L%cI>c=3O$A@8=o%8EdPguiU-1SozG?0)BA-d(>CRHAPQ&<5;W<#g|L`ro0v6Z&Oe5!YBB6 zP5|q#+`}ihhokvP^hFQ*;@k$VJ5OSI$8okz#&lZqR9n7fTnElw#d=bF&EI%9G%4x~ zPYOUE;d~bU9-sLbeNvI5)^GC#MGJplfNPJQ$7g{KA@oty3AbiSozCMxp7C6#3bcqE ze>Y>AWjn)CPjwpQkpn4Dsx?pp^e}w>qv!(__kx(0=%+gV)Ajgl;E#0FzsvtB&Uit; z=(9b?A@+g4!DXO77;{2?mA|!vysILUGs-|$7wdg|4$jCha4wh=drFrJo>7&J_a+?| z6iD)KTOrriQLYC0z~8;{WhD8y?HZl00KZNB@8zb9nRB84y*9WW<}Z!^z5Ja|z{Huh zJZEeDXDrKeym(Fx_6MBQagN7x+Xdfy0{?LSh_!xS8ehIy@v70rb>rdy+KD@4@07|f zGC;pslR#sYF7m)9$IYm-UahMd-2W^6lBMz1CgxMLHF6?9{9R~52Fk5P-y^Q=8~NDa zWEyU)g_AyYI*v)k!^+<#+aUWmine&TMrcC+2Sw9s$Um>kaNYy@bN$;b*MlWLI15{G zZW{X>=_O{S)I%Jn+~!}YXQYo~{-9{?jJ$+%y|DhN_7pYESMh$$4@Kt4819*Q~^m@@9AX+&=w(6WeSTi*vBa_o#Bw$|l=6V{#2 zpO7@gZ#eQ@#V@pe+VWq>FXKMW9#=68tw(iz>5N+djo(mXlG4+fhB|iLEDws|+ldGA zy^VfB>{#<_pl7;@FaCU@#4*ct&_s-}6%WAphYMl>FplV0o36x|p<+1`zx4?nSc3j} z$dCR9k8DBQn1S`9-H0o^8fzz;fG5{h$}SRD2tT+1pSakBE2N*-sJl#Gsng(N7dvg~ z^K^O#(qGWevwe6#Y}eO-N2Y%MI-a?H!}J?*<>6iU5kJY8bnsFk_#_6}Y(iQAcv_wx zi1!@4OWO)}+Km~wLk6(si*XEh7w$P0TniTZa5mQ*8B-0o<01#JRu2Rf4Mr9~*AHl_ z!yYl5O^@r5?2{LOE`rTqYUjV$1Li%y5Fh~IZLsmq(>`J2!~+59HQE{v(M zOpX^g_bwALAQ;P#KNDkyWA#qxHF=)JgPZaDXwGocweoy?j@3#poiD$b-C&D*G^LGz z-ziah%D3Ilb8U1SAJ4sU!mg0947T__rl%uauH7TuZOiXLy8L}nr1MM?DbL8CiS#n? zTRGCbw)AYI&qDfaq|4Y^(3$YZA-w|WHHZn!(=woW{Ga#Acm(>#x}^V)dj}G+KK66g z?6D&AXLf1E)Yi~xN9`|sl-+7Qc1Nlnrlg?PB6XXk>&x7|P z)_VZ!5*LdfvEq)nzmM@W@*KpM#`0`uCx4SZ3VK<;-9;VG7&E3b_9B8YyVrN@L164n zX}oDyuYR`2&LsCvY?JlD7VNJs*ykDKvtD@H_9oc)B^ej3bp>cw!u=9@U>h^ zxzh21%W8GpoJ+=kKv$xVU9Inf&ssSS!Pe=N zJ`Qm&z4`_H2E6yPtk#cDUqnBSgP2p)r{UU%>jP-p45uwG~s;3|i^*{yIg$fx|B z1JKVHr^o7P(0N{sb3msdpCQk&GNqooU+y6T%@e<`jpq}9cI-j%v%}{ufn_sbA+Y!%4YD~p=2t&OpUGg*J+;g$umJEpNbL{10;EO zRub;gMqd}}dO-d@Ht;E6-KxLTSyH9(2S1f*9a07|Rb3Ba{Q^2v!am;)yCEd)*nVPX zWsK|x@gsWNj>)*ib~VTAm)F(rU$3#*O>L3MzXC-Mao`t_{C@mS6X~z~y zj9s?*=k^%!9!pmz`i}Z)E!wwZEa-XnX!4fos~^s@^%Z?Bh8mMxiymptIBw(F$$2xL8UKv2to{h&=Me++h?TDh=VPHPY_f$i{$J`^oF9$z6J5B{S63^& zOP&WmER*|NEBHLGiE|6NH`1i+-#^FpjlVbVYCVGbm7dS0ERlXnmg?|ZecH~$claBQ zwSEtIAD8srA#s2YqxC)c`_&fTm5~Q6xn#Wx)_or)>s|8pg)&+<%#u;=DJ4FruUpCI zimgiC?zxHYJm2590mr@q4@>9EF)!s+^vB{w@^>%g{Q92hx?HV>v#6hb!uSdQA8-ze z0S6+0VVCEZ(f8-%|S^$UMh{6uMd z3D2FDa|WrKp{MNp&ap1xb0?1gR>b5!+xUKzoiE2e>U5R^tt>k9l21Dy_Y*TsdVkTl zOWP!&D==4MY>OR7%9Wz$YVKRLbd)?7P1$MH$Kd;2s%XFXBk*zt?P$g0_vEpxuXy$B zFn%{0x@?2eGmG~s8JYi_=Cg^B*>8oocZ0O0Je9^5Ju3Sfy4QS}vBE10Ex!$T=CH1B zs+Q}dzOv7&`s+*DK-G->t(L!g3%+*R^l1*CsXI)}Z7zy5Cj;G3|03is@q04xQ}4pN?e~!vEuv09%()Z4 z59(HXKK@Rg6LitOx3#rbpUbvZ)k-@BaxKTb{`#5oEsQ17PDk4@hScF5c1^>Fs2_9Z z`rBdCxcFOz>|?~GN}J^J;%S73d_C<2+gWGvZIvCeZcYWY-B6 zJ-DyYP7jL~(#Jy`N&OC6#@_|q9gu4?0oaNkY5VAdgpQ;>?rXPDc1FrELC&jI--&jr zca8@+D4QGu`jq9o2fnCwwE4n$7GSXcUNUCaZ~dK@g}H&^{hxM~7rP4J_jMGA-(OK7 zx<1C*GWPl53|a2mo{D|jTSZxBs<yt(_lf z`%T*}-<5HYNPkn-<@jk=cqI17;0|2-Jv+;8A5))NKDF>sta+aCV_##AFDUNfInW{e zF1`FsS#AFa{}a}{eEu2IgMK#jje3TCi|0>F*f`ib=A*64IS~BrQOQp`QC6-ii7d$@ zckf*VITveVf9I!=KG9MCg8e=`6X0Jo{i^l_ zMeQ|qIQBEiSv7NC%-$QTxW$`TXv=!b|U8iUg*Gf+6sW{nc3x@#NVNaIE)F*KXWVI1>^^5 z;k2Q!Gvv8&kf*90ppg&w^0^z&1*@^WL-Lg&O4yF*sO<+;-)!e^G|{)nHCBhB1N~w1 z<}+WcY6td&&oiXFZWI}2CC-hBa*M~jA;=%WeROVXJRaB$e_{mnRm(n}p=ey4Mi|%= zb%=eEiM>EgUdUmUF~Ky@r&xP(-}5U$+W^=0$%hf?Q^fBf;_MgAe+u} zMs5z*E87ITFmDyw02^yw6#1gaA4NG6ZMbIqcX8bVUmNEhmhPntftTjOR%n2%m?)=JoYvkg8#mmB)rS-LQ>lV~C)>YQmJy5%NZgpjS{SsULy7`rN z*Uqh8xO72d0><67jdNA{g39@|N!ZEsd9{@_wTrDfZ@q2W!iD!PZMbdO{HlfZQx{An zOj{kd-d0pov$%H2l5gLovhZ7dUDd*>d#VA0x2ZreQ9sb0+gQ7J{@lBkE~qB5x8FK- zR$=4fr3Cuz+X|-_-SX|*X36KWX+`CQWo5Sr@vWlie>>$nw@v-_t%YBka1%Dh*Vl`h zN%u^;Ytr3ICN)l~T(EG`qWe&0(9$KqZj$$&%K6^!c^5V`)-7DH#5>2^Sh*POTQXt7 zgh66_rC0tHFRiPu@dA?db)2{MzS;%ey1TrM^Jz64U7AW{73m4qb=tXmvf?mtKwV~STrHyFHyjp;&scfuUa5uk_ z+N#__RoBeLbr;FT`tPc%ul0slVEiIg&y1yYjow8|>#FZXEtN~qiiHb!uhf0yy{od0 zHJzPiN=7tGfkIKI)MXO-;v zP_n;KY26aEWPIbo@n{Vx3!Ls#IF&7~ThJ(*3eZc?M0Nog44nr`)HQ;q&?DZ_OD4#R zWyz$sENob|xbE(Gjousc^S?g+Yk7HJ^WHLVaov)}g$?s+7X$aY`zz~fWL;Ai+y@b^ zu`_}9hS5uI0BF(s+gE=O+Z2}d7J7-=guI(3&)PccgEk0Gvmy)9Xew>Xc=KTwnJN{L+A3Frj}}G zXr-36)T;S?*IN5|IUx|+``7*aJh0ER_TFo+z4lsbul@4uv!iibQ@m(%(St6nbj2D? zZfmM-Xp0xMTSi6M;)>;(UR5QC6_rcNRxHtk+4v1DOWNusAGS0+h@X~NpRhCxP}7vx zB_$<%N8%I&_wiHxV6RpEMg-wVx<;nQ3(H-8*@{*73@jvRgB22? zR;(>W4&{s2E*Ej<7x>Mps`90xILk}d7~fHhhUS{aj#`t+s@03vRFo`UB~-+%3Ol=@ zk6)=1=ayfvvf|znRj=pdrQ&LCX>8fj;@WHSszII64Ah4<_uFT-_kfwRk zZW>o1JW1T~piQf)YNGy{I#K?Gc`c2#GETKyt`LjTlKATKwJXg0j1S}(k&(8wswyI& z%2lO_rJ@93W=c^7=Gg`;&+;m zS69gJHJ$FYVlh_uadH;M8>(-gCsrTd9oOnCbqWl`MMY74sN5Ets++3Yn{J(dyRRFw zAZ6dlKCrdMhUTpUbe3UrQWX`M{Ar`pKz_lB>7s;89c1QbYGQC2TkG1I>l$yp#qY?W zZmi-9b)$7ev}1NEvPi67u{OTCIlgM`tav+q-t~uBaVK{JB)6qa)5O)uh}727l7awU zT4GCD+8V`E3sOT(TT6S(=2RSiR9BN~X=8|r~l^n);T}qo=H7C|P&w zEhabTN4C_|I9)iuuw~{kZyK6>Utyva(TrRi%HukwA|l(y<-L~ZoKdRJH6Lapl- zuPs?^#++ZUy*kCntnP+xI~iNFZ155cJ0crOnQ$y8Dgha#r2XrZO3>n++FsZ1x5J3? zw`9dC-&t2xwY1+-RaM>E+V0wDzF<4P(>K9PKk(3l@uE^Vi5IO1Sgfk5$EI(JKlI>2 zhVwenhwnqTx3&g^N>^KFQl`*3@gT`h3v7FPO`~5h!={U1U_f2bF)PzYXt(k*#w%;4 z_}_@%aH7_BMD63=l@-X}Z%fUN9a=g%7Dx@wPJA=TkeB8!U%9$e-H2GW%!7(r+gef! zg;->4Eo!S{s##-xy<|bZHElRAvKb!S>=hfBagyqRcXI zgQU0l>46a7C6K-P72%xuz&*aH)U?$xSt^pjoh&DF=F9kNV<#f#I_7~^eof^ngs5yc z)o4k^wdIMjGUd{ksdLsR&PHss)^BaYd?QQy2?)MIae<|Aur{R;TKPgz;6r&X>R1 zqu=ffnjsHsSo}6L)fJP{t|D1kzOKY2CRtp{P?f=3hWtz}lr09;Br1iH5SdM?aYUae zU$?3(!j;d{`=wQ|s%(0c9xL6-_0AHc(Hb9w{`+n7|3Q1TY88~WH?)QK)3#`ve4p90 zy{5G_96y8UaN%}_tj*Rjod1lXX86zyTw9COcC+XMJzF%=yaKNsf8Mzy~%lTsChFc+VJv3Y%KDr&?MXSxQv5H8UgRgLMYZLb^G0 ztxLHoM4wdQP$PboCH!V)TdWbqV`lnQYg{;fiC?v}&{z5`&Rj3tiQ~&ySDC0IK1!V9 z!uXN|ef;K|)mi#eSWI5~nwvKuiQ0JKjwYIG3x>%2p=cA+ucG>vrn(}w6E-(&DcaP4 zKxEBjKA(w%)|{~hYi_}pw$jawspxoGI5005J8SCMOfp)_m#uM2()ulJtuAf#x>Z^w z6S?img12<_nzhWuG}UIL=qRyXd6Y%%0^I2YmsfnwHLLvv^UsX|PEA)f5qF{ts0j<1rS*K{HD=~HH z0)>s6+I@K$&dL?b77LauQ*z%jS%VkTdHg}y=F-Vz&CV^`8=8|z5gGd(I%N==?e+0O zf2@wk*H^FcQo5{CnV}x0QL9U2<3kDuGbva9^6~&r`CGASZDNhJ!{RRD^SiPb53q~Z+Lhkc3KtF_sunK9TT->;ZEl*MeX(Mi559i zc6F7k3F<9htHhL_kE~KSkb&s_BlxEUs19;sJCJTc4!T@ zywzok*Q`)^IDf?|pGMTww2Ln)s&0$7b=a7o_?R(*Py+tm$w1rCb!=RFLE-8-)@l8+ z>(?z_ld$RoU*cRzWN)HywUi3_?#}99ZQyuRt^~)e`Pua(!e?O2t zHn%nT`78b5B)?$IN}E%xaXX-GI4@}jTd~^yb|)2eZp#ykOA~8EWK(XMtd`qeZ)Tgh zUb^G9+k{9s{udd|$a;35i>auTF;2y+rmj3#TB0JcR@0o_#dVJ456Hn%NlL(XGHIhPmnwyDp*#= z8d$3De0Wd6+mvGWRz(cCJubE=yVd?KHhUZqTzmg=A!f0?w^8D&T2f2pMTyYXw>cN3 zkA=3!YZ~jAYjiZbZf5)~ZronI^CEfDvEqx{Ri8d@`2`E6(~$gvyUbpFTVTGSS&Ulw z1ujtpVfGXxsBy5%FH2d!$UP04aMAci!gjKu8ewlF;9aY;wxR=Bh^ zbb~f*GrM{XcoYiUB{LBfRDMB2ap^+g)7sErZBQB|HQG+y2KOfd6fCJ(xeXc_jrQjs zegm}4E-~aclAwcx)m384c)zH$-G`$x$Y^9q3H#ES@(Rk7)@^QR#+vdAz*(^>frwNz z)~1;=rBOi_^-CGUZdX3SaU>D>mr?YddiE~Xpwo$G1im<8Jw;8iy zF&e~(1(<@Z-I$SB%mAIMnRv486G%s}{K3XV>1pi&RnPcb$_4~8Xlb|dvaGIIbx(rX zM>0i?Sllvs;Z~t9Lj^%Z2z$O=Iox)`UEC^fZYw%AZ)U2EMQxaSzgdvEIakbYZ+<~C zW!cGgk?vg^ZYcy`8|By$nOzjAL_4Z=SCN_^O5tdG<`Q4YOXD)$EwIoFEYxPOLFdsr zwcPURw%RgQsXm?MwQXzY-$b2Uq^a;)yo?Tl`RS-!oS>&DjY$7=eSxNt6V)XtLPBg; zyRa+jt!gP@dPt5H@d5->?x4j4hgVe>V34L{$(KQDV7{dJ`Pzbk2%6{^Q@O0LNe3HJ zEukzL;wfvkC&uDSB|2a6<>KqycdDWS>7*|?N z#ON(sv%0c8pvU6d=#}W|JEWy(nY3IE-#I_^qg^x0AqbF@D18nM#cS}@MF$8Dw@ ztg#!4IYE3y1U! zxmCzn7U;YWeFU!?oQp6zWpz7589XkW43Iw1U;F)7^@$?oJ%pAwa4CmzR&V+kuNmE# zBYxqo;tE<}yKug536ad8qVys}gtXr`8sf>uc+xEpd4?mMKgL1IALBq38(iR5&6>%t z+WPW6i9|W4EySpNKPR(Q9h00d_tRxItLcq_Z;|(s$;RSRG0DuaDhZP0O)ucPy_n5T z>%4C8TDy47vc%ee4rfl>!3A?A0WV4-gPU;95y{J_M!bv64U=wi$Ox_S^V<=y)ey3k zG`D(zo~0Q=PyMJZmUU9pR)^B9fsQ+!FX#kmaa&D2FKjY$eOt4+r*7~Foi+M8*kQV3 z08-cFcmau_O!P29xCb;nu7#V{)-~~>HX;Ynm>wo@cBFHGuuovM105cE3vkVjd6VP6 ztMcbj1N^Xau^AI1=tSh}#-zaF1G8I|NXS7KH`5g-trOJ?5q-W^R_n+hk4S%@&5ntn zBu4BkTiY|BfEYk9-=kTg)8C|ZsyAVGvUVpmsIa|`7dPhkYc}PPihMj-32Og=jMVR^ zqdzAvnM+E}z`o?N2kAR9-4g>CNWjU!pFAo}ZG*0q@N>2c>aP~0QEo(w^5x4I+h*`& zg{kbV+*-;@UkYRuYW-CTanrTUcNY{hK>;ZkL!Cd+F>OY%zStE^q2tmxremX%q$%HS z2D<>whx#>jg?r-d(l|;CB15NHUv|EtRZlhuXt|6zqZ9uiYS;O-O|3u@?G0F6$v7js zJTk`?M{G}N4Zqol&a2V-!nj)~INKB4U|z2ITHfuqn7jo?7XZeDVhQm9jIg*6-UeZX zRNJBo=tbu8VWrWzyj%SS%~sD5EQzgcfsXMDq6wR~aDobbE{=}HR;|mg;hjTC4V?N0 zuenyXMDo}fACO5~EuXF2iy*lC)>i5sjDqEFrnpuAAddrXG2X)7RKlKZ!vs2woveSvpv{wAn|EyZ&$zSA5MzcT?MBIqx&os9h(>t zl{Y6tPI;?WUSP9A-7>RlmFx;1jk24Xoi+ zbsOiY6h|5tm>2H{WCTh&(iymstPp=`MXIf#wL}js#r;Z(;}KkAK-&~abvqHRgv}r1 z{3fR#+t>-;0trHhl76?d$Koci@e#NeyXm-|5V73w*8r^BdS=$jx} zP#_KW>I6PqT`p5J9~@f-4)*)}7j?QqcV(vQPK#Qo&u2*Y{T0Y;SHMl7$y)0%V}mh= zyLR*z~~2pzu-ZXV{|;!7Xq&1Q1I?98_cS12P_X%1b+ zDoEOVC|uoBUq(v<#x2#)T_f-CWQ5Vq8l=k0R557UD;er{BZfzkzdmX+DXpn%bQVb= zabtzjBg9ksabFh;%#*1Y+i=qyfkHuT&LXU=+Mbh%)@?Q)%mb_q{%k-;PRFV5x3vq) z@E(lyu8e!5VZ*IoC{jl-b{f8ppj1G=!)dRQgqXaTHn%!1O9dKuuNQO@LJEE2Pn90`fPn)tLZWsg{m88^#yveUOUzTc5@cat~a?3 zTt{J$5rh2!`ydYQd{LRCGnS<;f8Va4!*-&J4 zBD`w%b^TP|W2r2I{NFBkhY!lHkXU;|r#16Z8#_2wh{s zfOIj5NLwUBxl)YqeWiB8069$0n2%{;=|7Qv&g4(W2#CA(voUSwR{ecv*A$OrsUhe` z8MHwzb_KOuFeRddY{0q!T4`js?IasgmZ@@(sFONcmnMh(z-{FEa~R1C<;A1`BMks;Y|f;S2cfmHc!r+^Y>%fdOV=smeTx z6L^XciC^8wm>1fv8`MIb*m5Iculmja$u{T+&7PxEQYa55@tC&C)P9=e`o+MuSW7b7 zaUqZL%OIb}aIcKte!-*lH-7~jG^^;swqJlVrO-yM_%tCu&F8|Wc_AMvc--c!>4E4k z)~>24PD?xkY>Y?18&x~SrV&oN(bOv)>LPz~>Rn>+WRaN(2G(RZ0VYVx)9W33`s|PmzYX9RjNl7e1dsWWqo+&E;9Yzsy-?Jt7AO6>9UOd- zpTXln$=r53mzHi}pZEf6tlO=kTlcqv6IB^OQ-v-qgm6Wf>mqc z3+0@_$7N;1jR<)D$T3yi9djoi2Za?qu;HfS`-?ztuG^8)QI7j~9=PeIXp&EhqTaOl z0-A|_@A6w4+F)e64VheM7lkr&4oxGlN1dyyPIYn*lAbD+-~O96$n)E5b9a?F`gfS} z+llFB1>qb@>?0#zHf@;B`ExAa57Db4XYDTLf5fk-&k?|N5CLT+CiU39ZoqE9Z^M@6 z7S3DA(M3^@w?UY2@73;-g^(=#=D_l;DMw ztC1oyreqSiq)s!a6s>JFLWBB;u&MmgQy1Q*WEwN5hoDs%b0?=$|1t-YpSHAcX2}0< zBm-a2zeT(KrVhrVf0c#Pi}}jJI;WM0%M1lkSY|Ra-keVSq57yL2h;%(L;Snh)ge#`E3WfO^62*FJvR1QVFDe{>aQVvGjWRX#D zNLffpe;iRp?wk=1Sh;hC+NtmRg0}esX^EcvQ5^i*=KS`$YL5F9=t_vq{n>R7a;XGA zhhP%iEa(4=?052LRz02k=v`VZhl>MQ*j4~MseXz$C*n&Xqj%h8YYSKnJcRz(oCLws z&LWImz`L_RYq!}zA*|_ZwgIy-@y>;H@s;aJSf9wPGBUQhK}cw;o+4AYLDi&|JqYfg znlWVGHbZtYn=aA{S}n7WpvC(0Z5w;|@!*H%%ZL-oVBkbpE-7-Zz}9|CD$DL+nj$|h zAcG;)-{Y`Ji(9{O3i;#lrSe0Ji{Y@S(8J0f4-QjYfT^_H0a3`gsq2Ll6%TE$S-j>x z@a$BUybvA0osUgtzqFP%;W)61{6vJ7$m|tLiJTAwlE{ekohRPMCVA)Gq z!;9=w=*&>E^@6d%`BrBmKV|?g*n_^X#;DBrtsBTrY#bN{+kXCLN<%sk9-N#JV^{_O zQHCU5OJ1T3zkdwNa3Gg5_LIoL%2e0Z`mYf_ZtM?yw}64Ogm!aaZBG-2`rT_ztSYjh zX9S`asQ7yI-}@|p?FV%XU~IrUkHPuUt!A39TFZF(bP4>rT78dlL8-{LG6bUp0v`R> zOj_1$Te8RJC&PyA(>kH}k_^g=^jPNxRZ~szhkZ+k$ilt+2=J&Q`aa}By84=e9gP8u zMYjd5O~RSZ|9v$(&q*@xI^~^??xqaAQ+!LM4E@q2YT3Hh?zq>Xx?pxkD`+0d!&oB%E6Ad8G;NVkxcg z>Ud`_wB_BsKKZSJJn`Y&AZhQt^vT^&@?6%~vPqw1tCz^r-(^#HRY_T8X@XkhOn3FR zI;2;YSbVRfaG^*|J?SgCZ;5+I-MehjLkU0Tl_z(K$0ySr^GqwRF_f*VTHQOlTKGk!Ol5 zZh`P@jzyW4%~*jv#d&yMNAo5w_N?_<`PEHxs$FE%&cox9%gvG@nm0S+7dd+KrRH@= z1)4|Q0}(*e>Uy6Do9~vkP3o)VR4XrNgiETIC^Tk*{$BG6ZsNZh^_lL zzI}_$50xfmv9l>t+oxb^`p|`-T*yItgcSEH$}hay<@i)Xs=cmpGuBzFcU#Jv$vD4+ zkt?)}dFfcRhf66MxXiN-(DPt2J{ zvjm+L+WQ`Ga2JjIIMHh%FIe)B?xxG`9gF!sp=tZoV)M3BDQRvU;cc&Hf<^q}gk2K& z+RbxndoeTVW-%$eh{~%vWn%XViA!IyHpe&N`L?3PmiVRydYtr=Ch6_s$9IeKi{eSX zIm56-h(ATpEnD!gd{-qj-J5K^6qi);eeWkRM^lW@+gi7CdrKR=1tgTL9spykovHuh zc-(sc*=6IZ)TZ{Cnm@C?y1jl@eClQ_wz<6_B|j{Yi$ax$T6cNfPDqkId4ViH?gDc8 z5|tkxSQqoA;zR847)GEMqxvm2Uv$%4bgqZX{CuAPZl!G}?J{zDtrrbY=R$2$+Y6?) zW0)I(SIMuaeF4BnTiuqr9dgI4(}J9b;66HTc&SnQ3&x#-=@I=9;qx(sD;<=M>dlzR z$W+GL zBRbmD=iWVY25n)W+}<8k&ipi=X50RBRFsEpUd{_)|Yr-axSi-_kAJ` zNp8c1pNqR}aN4&v@UzxIoHco_+g<3W%}?sEB0eynA=+whK6m!qd2*TW9Yu5J6x}i>KIhird2@^B-X3r4*jm>VPhj!F8DV_U_hr%jzbqg^)FEsmBLeWVOdVY&cxO;3h}u$|8F=;YUo2d)Jb{~PzF z&VV2>WU3}-1}k%hcza_DzeE%D(VZJ>Cwo(wOVDMvZJ1hnKXu4;!>UVn(}Y)8<9XY_ zmvLizH9H+z&bq&hQ5K~ya1~v9L0voVOj_DglLc4jJo=V^v7_Aq?PATu^UF$?l+C?G zuKAaJp^BY!<0f%#7x~EFM36h(ch?X5^Mx=Y_o?sgnm*CLAARurf_H||e2Dz4OXpAR9U}kLA@ZLe zBL9gY@^=i8Uo}Mjq9OA0hse*qbbkJsA@Yw6k^jOF`A-g!ziWv6jYH&@4v}9lM1Ibt z^KUvkME>z1@(&J?|I`rqj|`DtJ4F8SA@XMpk)LG@_0h)2L(p!2hjKd<$v%T;YISG`vWQC=>Fi8=kebYx~Jgr6#1v% z@zgHDW8gY^r=B-@rw)>S-s+Hgewc6RKb#LtT|cZMG!mdEa!{P791cAE@UVlATi)x` z`8qUSN1m^*CF~;|enqygQ|@)jyncuv`0)MuIcx75S)TXC1n~CrEZ|99zWjZj-zX(* z0r}8+qn3~&>>)fspgnI;=8cntGoIIr40NxaXaL&okwOeFW&8A@9sl0_Dz}_q-ox6DASh;m7Lgy z?9FU8_u1owGvFV!{GWOj|7o7*{S+Q0@2B%!8HfARy_E`L}Ll^ zf1YrNAh@*eoCi(#_xsg3>Nyvu9ZwOS1D->Gk8|*Gu95yC@ka;;2nPwr2q&$L=iV_M zexBobKc7TcKq!YceE)nSp_M?{pFcr(hJZ|dew@%tIPZDCm_R5XR1v@xd;Y~9!c&B2 z3DozCql6O#%KVZ#epyS{PdMax=c(s>+-&FkEZ|bY4wKvY!!G?8X(t_g#_~k2zse5F z{R%$B{(hBj`M;VEoFc%3;`-&O;{sgxisHUqV6@(zXJy}B>*B~mczhfF-abHpf1&+0 z{7K!Cr|}+#f7bJUJ&90GfR|rCY5Bi?-tvDUCHS(ma@ZyK}p0ax0qaE*^^1Ob^OI|-^r49Ym+rQDJ?H?rV8JBi2EcA8A(z5cceAav~meoi=mQrWdi!S|W*p{qwmNp{C z+A?C27aKv_rOhL%2-u&L9kGY-6ajv*$JmG-m+tBx39nLS}?%y8sw{jNRwbojx=jS&Z$q^qfhCpEJvg<;-_5Jm>5R>&$U& z%%Oc!N6uk~ciiIRoE*nZ4E#cD+#HojU?=0swM^7^1a?1eqtP3OoW|`VJmcaoIQqw2 z9Q}>=3?82cjQqyWGd_Kr9>10}WI6sh_mnt%;wNI`(Y^4Wn@=bsP+#toE)BWo_7Ki_ zu{`9S2mg8CMoRKS3I8m~h^UU72rbS0axq%L$DHlSk~zXRO?nha3)ik~*(E<>ItM z;#awPuR>Q+-&JKUy~@RFNlQ5xUKHmE(w9AO$LL(`i+Ydk_8VNzJ`8rN>$Z(S8>?={Pf<~3^#-{<)n_(ygbZTIt>{50>HUDWjq;V8k$ zMf&nJ?}ReFc7oBlc9wh6CTYjD%L$DxZNE!95TyBQ6T>@9`Z>k*+}bI2UEGUZS4P0@ z{kpHi{;xZ1w5~g5w6CgiaVOjB&U&#)$aj+CXOfeF<5Sz^cvX1PMk_z*F{3vL{R#h* zo^$aNF5YYL>*E%`-qF7vSqlF3DVGl&jX&k$FSs~-i@jcd(&9H{Tl@y(C-^tyyZC$; zFLQB6|Arkd{*22%=;DsQ8_rn#M$htZ%yV(a?~QX@+{xoc=n6kKKIiaXbn#bR+_m?{ z^R7O}Z+w=;U+{03?{KPs%dAdm|CB~oW~0mBLz-)c zZwph9iR#YrG6k7P+~@Ts>Qz}THyStX3F+TNS*hQ*vzv_XnBT6O-pQnuKkwqS@{!44 zv~G0u=Im|O`Gb*VdXaq4l)_v^Yj$Kt*{IQtdaK_9+( ztO@nO?X zda)VVgjs}gLMwqWX~rSKIWIP|fKWx)Path3X|qV1wVuG3FzbXD;{-;m5MB#Yo_u13 zPZ6FWJV&68!WTK2wT~P9(bMu-oZ13jUQ2*x(JlgZUIafy)LTT^BFYv~wurJtFA}J? z=qTYBf%-JBhi9)BoBKQ!#(2KKa~RKqJcsk7&R7=DLp(?DJj`<>&!ap?@qCqMHqT=` zNAo<+a}3WDJje1p$uoy%56^KtPw^bj6Zyt+d7j~!$MY=D%Xp$gCPT5g@9@0Bi`|mN za{^D=9J`X|1fEy%jPtyjX93TNJm>JdhUWsF*YaG%^E#fTJSXui<9R*La-KKvT+j1H zo*Q|_dDios%(Ic_6rMYH-o*0}p7}iY@tn$YKhK+aKFM<$&u4g|$6KD`Ii07-ZwAkU zJZJJ0`OV^ah$jlRPk+BYhj~ca{TuFG>fbnTJo%&CztP^s|7CmGUamJr|BduUdRbl` z|3-M16E4$#W4*E76&e3>yc{@zK@BnBEJ_+bAv6jKBj8|!=1Bw4xBin>49@*9(mkc; z0SUHzONxAFX$~6JxGxE*Us62pLmbMwoqzJNr@$7U4c5h~Y3ozg#Z}@Nbu12!{XS8>Nrj6BvJ2_&u)YUXgkGo0o z6z?X!^S!Bx;~~q;&+XnkG$Acr?oD)AbM<*S$Cj=HTIgZl`pNdL;yKQ{2Axjuih!?$ zo2eXkyPTt3lfW&@*S-=Eh%vH!CEtNC|L{}=l6`xkms`e*l#>%XD@Unn`*r`5lP*oOWpqt;)c zbUzg2e$8|H}Rvi}im;OSSed^QrV#_TQ^%U-KT|AD{lO z>Gwu&J^#G^6da!DZ|LuU#zT@5en{Ucbo+Pr|Cy!s|CK!ZKi%JrjsyxM1pNCX(9(;2 z`v1V?4DS~W@#+6vdjkEb4*?$t;SlQAvm#+Ug!-Qj;lZJxX0dNR{rI5%zY9_=@q+LE z+xz4FctLRg)-vDg?-%=lLo3_=ca|Q0lOChDUgFb##RZwy_WyH#58h%}|9^OCuaSQC z-~~9I_Yw6(Bk&6a=+R+RUH0Y;;n(A{Hq}3@~<2G&j8=<)eu|l)p?a( zxl+3ss_W>hzsIx7o5sI3LX6mS{kI5zv7SSfM(?9ul0%~pdmHg1rCx$Vm$hEC_j#`! zFR+Z>yu$l1^sn$zUI&LVh1xXllU}Fy3GWf_cSwJnu-V(<)q4%z$GojbtI2!RYw=o1 zFY{LNeVhK<>z)?#zduFljrwmN-?w@Dz0bP1q{j8%@ACaQ$K4aaRyO30IS8^a?&rX> z(F^khx<%Vz^mZcULhl~sZo2nrG(1DK8{>NzVL1LX%ez=8@^X4-unUo}<7??ko66iPz#|1$?v60@~*lhUDLSCa)3ae@VcrPb5J2o1B zeXlnmHaZr=KQjl4jfiCv%j4f@FCH5n%K{onxH2{)Hj}x;<>X%PeKa;1In2SLipag5 zv|)-no7ik>dxY7>Cu7v$-L17Op>&R;a1VLou#wf?ZYkrH3w`fimwT;u9W%E3Ee0=_ z!ACVTjD9}2*emH{Vq>8=E;gPzQea;R56U6Ji_IK3Gi{1%fB{uo#x#TyOEs93g^eB#%?AyDmFbfLsQTKait=0`#>e6 zcqJ6C5FuH3X(fl0~b z4kI^^QWO@GW?nCA0Os*`@!56hFYN^xU$I53DHbu8=M#JUfISzL0Ymd~)+&#m^SmQF zJnxlR1oB^|Hy%3WdB>RVe}gs6<2|1D(psL!Jnvtby?pB^&v!iU-=FlnZyp4m=y_j% ziu^-_!_Yd+^92TS%D>tJ{3_u*?&r+^U&3d4@;pMe%KC$^4QSAlmqnDy=0PZ|E&R^ZPYo#OStPdl9B zz<=rB6TmMx_$2UG41f7K;BPuQPXYh8gQc!M!zq*Ww+xow+>d?N(dqHLoRJP@4W5&0 zI2(F_uQj-8A8@|Ik@Oi3Mh-di9DEk|ZU@6p&I&7AD>T;_yan0jJYaAGZOo}RI3;D< zt!!5|@NNg^0DsEC6M;YDV4?E|4o3bte`<8LBmbPgF!&+C|9c0Y2Y%7u-LruI#o#?s z?>7wITMm5O!N@A-dj@~10Jzt|&jSC<)f)%?wWaT?;$_Wnmp%!2oP+a$Cps89<0dr0f=he=h~xV(^oa zzTMzI%mV(T!B5o#cN_diwZKmq{Kv>`++U0zA$EJmJmBXo{ea+q+2Aj?0)O4$e{KXm zY4D-7z-P?%s?puJUt0Q0$aCDgE*<*g$GEmE0=~*{zWo^RRF_@~Jk!C;f#*B840w^j zj|;ra!RT)I5$l^LdPpyK>F_h^Pb~erLjOLOzMk}7TKa#@XS;g0gHO@wtlZJOYl|() z0nTx7HgHX@_ILeV&;*xGviH^D9{BR#%eu>O=A8%ru)()cSJpa%Z^1UQsvUfS*Osdd zmUsOlHySMO{zo=D7`=?#<>39mT?WfJfsub;u$&k0zLz^*cz%2%@Gl%p+1M2ht_S{* zgBv|BdybVoeiFFY!N?)|D+bG6T=q8%W*^SW{(lXYeY)&EgJrKR`yGR2A8&NFgAV{- zW3cS;jh^PWT_5(*h zW$ChaIQnl4mOaAJt}U{6nC0l)o)7#T!&y)c{BeVC-G_Y2oP1h=H#;~5{HTLzOYDyw zybJiCgC7C@u7mdg|JuRO9Co9FAHzQHwYu&=p2M9D+zCI!9d8TPqq{quU1cHL$%g;6 z{b|3@uwnZf^w97Z@};S8Igk7gOW!|{^xIrna7Jx3c%mbck@JHj|-00wgq|Y{Z{VeFO zFnGfba0(2*ADq$Op&wy~vd5p@WVZCc9Mb>WrGt~b&C=Jk0zYE#dfw2Fe#7CsNL?Ru zG=-nb9gIw}I}LxsY~arseD8mQ({4CP^qBpJF1?I&=ZhXl0soz&e*pNCj^;$_eaodE zB7KsjKfMb&PaB>4-U0qAgV%GqVYK)SY2#sRDdym#z+)VYUdCMJ;A52if|cFCNr^Ex zxbz<2sSZ8|Jk!DFp?tsbFcqDS`7E#2bu zk#~pisIP_au$91$pApl;^pO#MMnz;b;!`2ch`Av=>bns*BF|C3AEuA|#}FQVB7{fv zM&O@>@aV6H@R<4#&dv_uQNiB0NT*Z^r0Lv0va{a|kyRWPF%KxScScun>QE zAK^{HTlg+~Q`P~((*%6S2u@0kC?|Y`u$91>r4f%1{+jTQ1bowomkHF7&4F-!E97OT z3Ev?6J3;#Ux9}0q5&nko&-BR}LOo$O;b8*!WA7*6^TtAVEO=x8j_?)2R|)u)vH!}H z7C5Jm0AKPOopGJCjWNjk2?3wv{hIJ|0=#&?BH%kX>&cIq2=4*M3E2dZ-@801%Q*lq zHkE*EI7jNmCKEXC!C3-1hbd=1`Qa%~^WNoD1df5>FnSF_rV5UM!z5k}!=hhHxF3KO-Rf*mRyh=829t?C}gkRog+oFw!R+6Z4KG!wQFUL(8#PyZ)+_`ggC{Ee1X>le3esd3M3 zUNV`KOT**}HQ?HvjkU?m9nCe##+H_?9jzpBKU7=FOV%}SYiQ#ZF~w+4b! zqsv8TTr8(}(5Py{;z3Wo7N4)THX=+BZrxq>^pi(C6i6{N$#Mo=}6U4GZ!AVc}f11x7@;+ zw#T9pukgNNW)s59{P4L>`Qs;j*qQwk+pxZhE8+Up){ZfUpD-o#r~Z^-T3EcmL7u z0H(stSdZA@W-bgwJaA_h)PiI1Hj#;3Oq=BPRiGA3X;Vi-BNh*i-l>}8y1(|iBYV$p3itym_{MybfS(+gbfsyi>)VHU~-pO_str3%j)p$P`b z{h!I5JGpsRZ(bz-W7SQYDnZL^|5*!1wVXY^Kwx z*oA@vP0dYC>D;0SH=gJPshWtJ@QNa{_U+X`B4pJ#)uWuG+)3Hab#gAsjhK;`X#}FG zC%JZ2^$Z&d+kLrVM1-C!wM$UfbTrqMwP1{rhE23@Z6n1ojk>p_>Rm*wBMLw0BJCZU zOkj;IjiNx30j$9SVT_h!0+S?1YcmEWU0{0~62u~DKt0lMHi{|f-L+wYUX~nWo4fFl zH_M+$4N;{-g)zMk)q0tTK}_D6KMd4YQzuTNrbSc$Amack)=>bGf;kr*>5YkgaciED zYOC8U!-YlKxp!GCeX~Xda)9VoMWIU8>#I%i(qyclxkjp2K&(cv?2<%JJd0eY3NJgY z`v}0_Ytn}fUpsd;wbZH#+m|9x>H(SIlfR%1%?mm95Av3JhF-(UETpAo?`WFTV3BE(IitzhU zQvCg%2w~=dd!sF|tB6ItHZqBzrE4JF zx=kHh1VEkA&je&_l9|WOo$cl__QMlkC*MGJ*JfwX=CAV|uHpSc~2uc1>HrIkm zw-K-d(F3+{ZM6=iNoO~1N+2!SMyYmgWfsZVC7nq#6PZdfZN%h-b4(LLt11@r`3?RHz6TYTncRfh{0fqrbt-GM>1b@uaE^Pl>qG_z zXFd;)WtFJwvWf+)?GVGHPlyH?!pu`eW&)c!HqX9w-kkYl?`$$`A=KttE3kPM;ZST+ zgi*J}`Bk81Kut1(BLyl=I8mS)^@{)++r(wbV)MlH=5B?Ubz!SU@0 znBv}H1(;&_;HDN!k}IPP9Y>`Q+_t4?Ed}wM2Dl-JBqsWG;wJ&+55)x|4P%U%KNmmC z_4YRKRJ$jmnGQs-rcd0S#hYYYP|(z=U^v&&s2GX#%C?&J1_idXaS60^Q8&=kvKESr zQ*{!zNuerJqV4q!n_(8px*nm@Mjf#rjg`%wH|MrHNUGab*C_Dq7`S*1--q z7cWbEG_hti5&y$Z#$X>=$V<5_zLLqciS=tESW;$=98CWrDO zyTLxTa0_#oz-I7ps@nKJ^%46~YKR#^$>b&+WB3_J!`sBgPBSe($_K3qKIo#Qsfj__ zeFoC#>5h4ESHN$-phjs3e29=tu8=>R5n9uJa>SlC+EZ*vg0DxmRD%1}NglNP6Otk2 zBOf-`f=@E}G2AgDi2hZM3u!z753*tS!~h!ES>B$hq>EgHy7eLX<4TFr6@Cj2kP|1f zHRj3fLt+CyCn5_r>iD@UyOo5Zj`lYBLtaI)WOr%vc(U>39otfq$Qr&LC>G*{7iTY- zO__#GCKth%`mUv-`cK5XXCN;9UCdEFYh3tUo~H=66E612V^{y)K{DCQRJF|C9n_5v{6!SV4X3O{WS$ucp?)}$} zQC|`t)^|eK^7bA|4eLMlbao`t``L$LUU#CWvot^JNLKz~sQ0p;?)6vpbSF-^)N_)$jMT2g zDQIMOX65%jK)I*0pmap_(wWN7k>+&n%Flv(!4S_U&lzCu-(N2l&_7k&&;I_Yy*&Ij zFX(OLjZSy^5%z`!zy5D|9_dc+bMf^Of8|JN{zUP+JSRwvJk_LlN;i?XWXn_CNq725 zsCFsE>c^n4G^=ZAR_C&;?(}{~xc_ggq9~J7k}uttaMLMX*#G>wcFzePj(fZaq-K7 ziloP3Ccm+Eug$FJyd!+@Ict&k4W8KVvl3S`5(9nz6@~Wtcf6g7*sHt{6T+)qMR_iM zcTmx9X0Q7K(JjxcXrd$h`d?8YI*PmacOxgWwfZk5#H@8n&aY45>K4! zPS1Aw=oQDo?3Np7Kp{k*nmFe`(DvbMZGMuFZ}AmX)6UbVhU6JHn5< zifUc_;h>`5%p^lg`E<0R^x*{?9!TE*RUB*jOaa1DN7$9f5#u?wMMT>xsZyCs{YOnb z)0OD$Oq}i8+?6=nwMd=!9|&uSbGY)ZMHBJ)H+K;csN)JCA$WtR=4FYLPqa+MKi5@0 zp(}AlMvl%2`MtYBERxUSj}vFpyU%(ZPaK2`?_Z7Ci36CuN!X$eIr_z@GzQGxx7zh~ z(TkRObF-CsI#T8 z>GsBe01~tWX_da@N4z(UhoDzBiSon}ucJj0whwVz7bk_IJ;+HNk)^Up4bNXMj z1wDcb=VH6a@mEiYlydhRkUA1)#bo-%3DcFmU0I(*ewSf(vD`m-xf=s4i0%1S$7{4u zn%!65RVh87t8{-s=SvRG+TZ!L=`VL46PsRn&LvLR-@W&wsP9PUci#EgGf4WCJtHI` zqF&8cwoVCK4{Vf{oa#m(UJS9^nK=9K{;ouiSW-`VcaN95cP^rIjkw}LrYuN-%#-Qe zC&}#PCKF~|j~*5gy3T!X`pi76dVT>`{W?>6;jvP>YUh${1txSZ$$_~eG)|;?E`2CZ zcv)9Ntnys?WlT9Ro{C6fp0Cln!o-eq=~w1UFIb-4xi%lN6U6|S?qzl6+%cr^t5P43|2jcd2{&@mjGRX?1#cwwD^K6!8Nm`bKxBAAMO=f1)dKLVaG2=I4mjCQgR=C(*Yk5Mim+ zoE1*5Z4s@WQKDmnD6t-qC}n%Fo=&8=8-nEJNZu*Q%Q0zpCUVld&v+dZq;&4y8mvoj zbNAk-c1FjXXB`u-P}=*`>!ls%Xn`r?l5$L(I+ExOP$zaKj-_`W8l>fmeah>|?wg^{d=tr~6iCk#B}49bdiU`$xu5>N_=3vgFTFObJB=guy0V7FPW1Qe z-~S&(`UqnMf$;YP4rqD5CS1$Zy-tgYvI?~v~xX#a)O6&&TbWFsm}ke$?r~& za~c0hh7QuB83=?_-#uatsa(^b@1SlMHA`ZzjDcp@eUs6E4bpk0@p55TA@Jg((s5^ZZBU;o79~u`(bQ!gGr*9VoTKOOar4y&NOUJfZ zbIqTSr_S6BYd`o?O3RQtN%ZOYYI^LiO@+*z>BJ~n$H1Qmvcx92X*PW$FZU~lzS*1Z ziIJpJyG5$!w;l?(O5f+nt^3$vFyq3pn|T;7UqWyF3=WF*PS@^JZ~aZ@(O(`*_r^M3 z9$tA48_E+Kvr#n%9#!0tp7=Z`6R~JpS}<(P>;1>8W!MPEf=i2;+11c?*q#2ymWV2r zcc))}F;f+9juj@=#9mx4s`!Z@po-U}Ak$yKKhuowxQwrB27T&O-(o?CwCR7YGZmZ? z)iJRlPkNj4zS@`nw`!Bo>6DJKI-Y&W)iaKI952HZ)Dq_oNUB(_8}OJfMGckdJTn$C z5Ji7i(G?u=w3Iv-49@8@*$2^yO@ws*zU->^WzxNFR??l`usI@5Ec+AqhNuJ%Fh_Qb zG$D-cbd4Y&!{4W%I<+liJIn5Tiac=^n7SJ4?**nVMSe}}eJB}2(0-hy4OcKHl);zS zQ%0tN9jDK%{|#)+t*6>l8)9zAx$i^TpLG5x3#-AjfzDmgKweUZeAZw6 zh_o;hx5$&V*(_AVLPf+P;?b3@tbRl$KdMBiw#d6$Dfil}7H!Vy-8n(EDR?{nP-w6l z*j*b@*et~9v?ZOh_bo;x>7f*u1GVn-=f7myIxVGi<%ElvtWXxv)wYh1)}_DTP`?sE z&D|r*D8^dZr0V?>a%}o&Bft?Zvy$vZIu;($p9SK`PRV3-SlCUJoo&*SB0a0~e-LMU zI)!r+RNuG2`8@+r9|%#=4P6n*_w-Gd^-(JcvcyxZof7&Y@3*DEQq6+j9$7$jeA91p z?w-@|Y%y6q+VuQL;)FCslk;?>*V%60y<&@ybwYg}nK z>taay70m0Dpo7U1gK>BI9QA$Z<<#?jIvP~MZ}3)0Q8GK8n6@@rJRv^M?G(rhka%zM zGVK{d4c&iy@n~e1x~k zNE_~gbZyE%mszYnn*mQhNbna?+<^ zfH|2zar={ImA4z)<~Vj1O^{aZAkS^DvAx0&c&>9vjxZ+s0_?d>I4GSd;@kg-%`9d7 z(v0*d&ZTDxINTwvyth03cl?|xu<}%Q`se>EQ-NP#Q7qdAwC0o8086D8OoPu!L7R*; zkYTOrPRp;{1M~lt5ToQHimS_>g-Ya0E@O)$k~q`XrrMR>-Mj7yiXmXxthBB z-Morito@uidM8T}e;HG;NDo;jMs9nX$UM?h{#I%d``0D*KG(W!kag|Zsvw(B5%)K* zmrF6Vl|vW_>p^vq-RUdukBF98R0myFx|H7#*(DG&pvBXuu{(XeAQ1bA6g2ZqWcO{= zr2;D)wK(RZY!LnH^I*yjncD24Jb6Lk9K(;V);-@@ejXj0u5r!-P3AZaaq{*SxK^A{DCd_a=E5EY58EgWqv#UoOm5VJV zZ3QW#!kpd}?D=%3KT;^lh#l%)K8#g--+}QzV%G4>)7@EPI$wV2?Gc?vUpjwd=Xa*R z(s>q%Nb6o^6Djs`ch-MM7oC1A*wYme?YOx+y%(}*Q%s8oEbEk@JN+-B8btHh2AK-8 z({`mBubE7_tOv>RIg)i0o8rP=XXb!Aq4zUm1n(ba3FqDAF#|gpG_P=kDy5FY6WpfU zqh}7oYVUoNaub-o8*zu-T~9-y^H}Uq?AS{^!@9D>f#uk?GCkn#hyORdPGY~f50NrD%8vR3aRL*haVhrg&fb{& zxV)NB`?_L4ZC2py5u+>?(KoX@eT@)x>`qp=9s$MRLB$JZm-OuOiwuvhq0|2O7hc}!%-$oLvHsGuNSbxd~O=-#=I!M^gt z_TBx7ANktkC6u53p_d>2_M?ZzV9k21ul~^}vG{-0x6G_Wa@>a7X@&{Zrpw*C;GV$& zh4pvj^cG87*n`SSF{3A?pgaAb?2urFW65Ho>taR3e4GCEIx$dvN7WbC2K|s4qdkOo zEg4N6g!URMD=~w zOG8ql&;@doR8d-=Y<}`I#bvO2BuiIXgR~=+ZR*NE?^>JfJ1f~!_zohL3h;(*yxT9Q zYbqW+a}2V*IU{M?-h=YyDsfO8S>na+bo^e|HD&vCa#v*@8PgeQb)_TYPWvzRH7lsG%G~KZ8@!C+|xoA66HGR^k zI}>?ryn{OUitGeW^ior)Qul1T5-*CSIKC=N1HNuCzEt5(Eg@cEh&M*?5{E^x!b5@M zfx0>qhfaUSWU34w5{3`?vaO}@Y&--^r@t&I#i_*(_{0PQ3Q{*3Fg0T$ zc~u_pe`n%Q`z+*?XYmQhi6Qt953Ks2>tB-BdmHZ@Iul17OEfdo+uXZJl z@`mcPyqtG?0L~GysRV1d_+zph(@`&lfW&&fT_HV1V!q)>>NiPsZ)8(9u#teOIbX%G zJ5b%*eA%4%7&V23#SKW|C$un*jd#6!#6dGvrK<@2LWlC8qUcOE#f!W%LSK=j{D;Yu zty;RayiCHE=#jy`J8b+$>GWSV>18k%yBw}4(m+v?4)IXQg33&Jfz=CT=;wY>Te)CC z$IXBpG?>$a*9lW1Lf5sPlJ1c>e)>_8`~r7%+!Pkja~tM(w0mu}0(})e_MC_B@WBs# zVpdpivP)$$k?x%|~C!H&Ch+h@MKAn&-vETe;2=W!#W zUf{@LDU*G=0xfWk5gR05W(vpq=%uH;hez_N(d$5@$FbDQ!P3|5d$NJL_CAYJ<%P%F zG|gfNM!Rd&G}DWeFR3_j;`BGbm63f18$7+#Cvfh*mo@dImy)*sPspmTg%vsE;cUk@ zc`>0!5Pu(Y&Ew88r8gjg1sv8E22(R3^A}2{V=UmG8^tRFT8L2#Ts6XP(c_}dz0bQA zJt8rY1miOO_L!atZKjaDBiOqhL(t{yJ6&HEIP#_d7Zl4gN+xKn=ugXKXz+`#jT9Gn zU~xB-6rb5K#g}QfjZA6-s=OI@tMd9%A>r}}VSxj}!^Igg)qj=QMBhTUyi!uSv>6V2 z7p>>zyR;rDgk{*~?U$o=BDPV$0gUwS6Z*>Ugy`Z5)UJ}V*WaN0F~UvnKB_231?4Oa zNbi1C6JC{s?~yQI#GTfiE^x!^G%j9oqr@piERaJ}6dUg{bU5qM??(^Ih`zyI#jMk% z(d_rc!S$k9sN{6Me6SP<6$P&|#IQy~>hw6V?u47frxV$+bng=NE2pl={q%cc?3JhV zt@}rXmc4b4lboR3l|279$pQ~^X#&gOFVDZ^d3z-NWtYx6#+&KV*)9_nUs-fZ?DV6g zDST_}bcYYmrJFJYm(S&~uYAtwD$7V8nx{Jn!uf)QxqA*n=k)(HV(CK*MD?#xLY}wr zOdn#8@@yY20Z_JlW#9tjguz+yiGXnd=>UKQfB>&7lFF@y)DzN&WiPik)^UrQv-RDi zXKQkflpZr5DaV3xy3@aST9oxQfA{y?h=>0Zi?VI>)9et_%Cp^{Q!EDQvugUh=aJ;N@!Xrpkc3w$}qkjEN8`pnVJN`~1y+fHKx zf^<9Ja;&rRxMs*kpJlLoL>DJIIhZUZXdeqQ4nOz zB7)XB<*+FtBcPnEayQKo&0=T@dAm|-J z>fi1`ABa19U!ICstpmLO>MQ8GIRo**_rn5*D#Up^KJ>Uz=iV2{?#t=^r{@nq?8_4C(lp&MIxZ{I zS-30dIYsJorP7FmbOMAJX)u!L7apYTzx=S+qWZ+#Jugv$^YkR?TK=j%jE%oTn&66j z(=Qy5K9JvgKPY|e?4oEFJi*Z?*PiDh?GZTAo|C?|x(6PO+@4fMGZ+q$B0S4HT(_@2 zs$A>4yWG7UI>*!W`J_L3SajeF{LwS}q)mw@BR1Z@LeB2&WPF#xG;NED^DL?9@XV({CA+stUobbeioF||4vT#-aXX7)ajMP zD@67g-)tI96in@3kGV5_uTTc`!7=7YGoJw?_lt?g`0+}zJMoyEk5eywvX57mCv-V; zd>@mjbljti3>QXzwN#{lvpq$tn1-r$!}k4*>^l>uQscYR z3tYoKMH1*7b`@L%t7UMyJGwJ0DK#;q)}5|$rI%AWNY61l!+KJZE!JZ_0mf!aHNJf@ z&e}3M+Eeo2-@KG6MZ@PoXT#}g}%XhaV4=VHAJ#yqNV;*=bwKy|60Ql%( zaUBoJ_(#vG`!wBZ? zsRsK<;wahP=>|p8X_jMIkPivRkY>lv(3U9L**g>2sqb3L7Tn+Q?}BANIitV1@#m~q z=ER`tL%nPr9m@S;>4=`(uP`PtL}PY`I$uhEe^lqOZ=bgVQ9(WbrTP>`Pydr1nAW-A zNaNjaamU%dt;Pf_(gk&HAPi9RZc5>&*+|r?OgzVZ@f?Rd&19ViE5}%G_@@hxN=9E& zqB3r1qx&$S99?j-%sJc9eR{fbBx;51O+Q@+Cyuk9dHkjG!#g<`-?cI?_EP7{6P?F~%N)$xm%wSA?R@#s*G75XBb}AU zI1cRX%t<#Li=|f{JD*M*i*>C$b`TD{Z}*G=dF6?HSb^=y!-LxyL}a^v2Vo5FYcUxa zCn6r@$%RC)3~sWQ833A5vlv0eNql%w?gCYSD-=XG4w)sfw`lxeW+ocD-@oo3%3 z`#UR&p%d`3@5B5kq4TJ`-WoamYx0ikYn{9n`u~V~7x*f#D)0Y5u?31IwWzhCp3=~U zOQ08eOQ8kA;bOU@gp_s)rXe{%+K|xXoC3DA;vq^VJzA~IbY?nQovKx<)0tkTqv%T! z3)86%j#WDjYG!2g#Kal2%;;!e`~Uvd-upSvISGY2^M3yMT?katR+~2^o19<_E7}hw}ipwv3;ZE_8#y3uCwb8tRCkL^W;vk4yo~IZa)=$ zLNAU~zsi5W^elU{@A6)az_42Uab-NyX)>9pwrTm;zUwEN945gl;k^qcDsX-!wvO=L zMT|xxz;iT*j9|s@Q8}H_&J398ollz$yM5WCy&6{2{Hi8dW9&$}G{*FN{N9Q+Y&w`{ zsH>vopmnM+wRA!+Ifv^VV|y1@8t;{sW>Upp?w56$ z&zS)}59~&+U~K{Dz%`(RuQd*MER+O% zhG0iiS|a_IM3Ea*;7(Ex2Fj#Dy48>dqVH~s;!8pIUKf?g~e@>Ki*}oK);-!%RRK6C@5WRnydc76t*%R zZne(5h39jLF-&UERLbABwe1sZV3iQ(dmq)>M5>5}H2V|xJo!?^wB;}GgRfrwt(Pj^ zeYm1}|4S8ruIwO;eW@p& z`89L*0+27zx5Z$eRyq8#qB8X~NEcR7cn5IR&cQ*S$oh~tu$NP5{RRzA#^St%3|Q5;soszOIA)k%zTW9Kp$6u7#vwcQ9WD22?ga z^S*G`Rz--SjL9wR5PQRE6KLQu1Kx zh|>EuCZC)9VaEWu5R!Aqn{WHGjK}r&_B_nM>%eAJkt~X313kc92r;fp`U?Y%O|qm82FKqdQlYp2EG^jR`)!b@6m8TkiqPlvg*o87f-Sa5iM$LixE((bH={_F8DQjfo$!fBZ z>d)uiP#Y_BIy8m{xP0yc2?)@wSEC0TU znm<}ezQafVpOzIMul^SGU?<(Ca+(r{F_D0T$|6` z?S;ff4`H{0ul02926sO9F8{WLw}UVu|P;q41!N`PrK{i76tjI-SuaM+OPcFUP5W-l45>d?^4owQfnjK zSDNOMG|OXYF#H<(juW`G1UMN3elu>5H04ta{cEL*Wu~}ES(G-GB>wT@5xARR+<9O3 z12QlU>q=qOASA22FLKC{5Jhk*5@G>HVjI(Z$KG)Fxx!~9d515%CoW@f>n)BF-tV00 zY-?u~k}HITqbo-Z{06p#BKu}`$(2OOZB}DQ+)oC+4H($vnQL9t0klE$jWnfS(Q`}1 zuAM^UUhbLW9xlpU=pLFgi%IOd?@Dhxe#G-w36Bmn&iS7Ww!0*oGuOF?ZJ8DBp*2%8 z__skiZ!79gQCS9`4$Y4 zp7Cr?fv`w*^9~Pk3Qg<(om^CGC%-Rx`5oG&3K;0FgDy6Bw^|_Ym<1JgK(CX{76#lx zG5RowaX!m|@LFO(_lyiQx&-JCMg~IrVwf%)2`Co-rqXyZY1;CX&+YefX1OsPVt&!x zdV3dk(K?-k%qGM)_1eyIw72K5+KZkS_(dd=lrKS@t3Ry#yGzS|A!MA*%syVYl+JKK zeU?x|?s_1GA=yxZ^JC7)&% zD{Wma6GsJ7j?G(pEgYfc`dk&%=_(D4tJH!vTwDXxQY`P1?JhzTen@#2Cf>%+m3Q&; zlWUQQnJ;57b5`_Xr2#`)J>vTX)@b$F@6H4ABQz^=-+fv$hR-~^a0F*9pPO-!*B-xQ zQ7calA-=(BJ9iW+E=(luW_;qP#z6+&jxN(|d@D&zrD7PmvWI-GHDIB2s1MKPvVH5< zu9umg2(c*2FMxg=P&55l*@%qhk0a2=W7?8GL_eIxx0r56NFDrw^+s)-tcp*keUylVm=($3sb#8iS#d%pg6%;B))6GxaK zkE1XxJ05NA(;~@vg>64nUJ5e>c2FR^Jy7y?+`mb}`P`7b*}{$27aB0RawtE^ry`;# zI7@h{`P_pJoUkzwC)OJcKz)e~B8%6m%soV0#ovsnf56MUqGw1&nsYpe>h_w#4eh3& zK2VZ~MN@YJ!^(_dP5xII)?F9Gu`(jSuz(uUirud#V&{%y?c6Fpl;GFe+ex;@jL@mv-^V5PRY^<>HN38mzPTwmdO+nI^Phq->s^%oPsLo@YWuK(g%_Xa*9!*vhWX%(Cm$u*tpTCN7JA>Atz zi7#=TcUB^?o9jQgZg?ZOxvI{FRjyxh-87Lq*BjrINL;|x%QeK6crzcr7ZJ*AQ0%Sxn@r=32@1F|HtPS|%2u zQUe~onkw=TlyOtQX?OUtJNd9Xa7=v3*iZ<@f4a>hrUu3lURT$Mk zVv)&X5tA1WV{&XMlS`0doP?xWe6N2slG@)E$)!m0t5=oFWe>_3$2w7KMq_1{9TtD` z5(%PnrSeFW;d#TTzhxNq(mcMJSfOHyTFmDQ5vA{5S)R`?P$A>_tnOQa1uII^<-7Pk zNA+b{m6jflSUrkVk498)8AkPrlTzJMQl@iE`b92UPryZ~N<9&A@WU(0^Zg_SsWhLi z{M788C~u|ZcOb(4-eK6+oB%sL)7OlB@-XcGjX@fTceTc^mG=XemrLf)%CNUGD_Kgd zR2QWYP%SZq@No>V1s#D6Sj-+?xRCq5j%|+ci5>YyOS$Y1xO!IUyOvIni z$bUo_pLwkk3B1}4+sFbv9Pv447@uduXORjAz!hI|g^?=6i86H}l7Bb5Tr>~SqQ|NH z&kEsil)0v1lrAr$RR6!GWKTy_2QDqo-#)yTV*bi(%4=&=`y(>%8%E|P$b?~q$v5Ly zEO7y9E(>QV;EEDPYVIYX%j+^jgq=tQ2`AR#Pgt*NJ%=HW-mJWuQ7cyXN283s zba8n`pTmbeVX23fRK6Tso}^7HlDT&nnU+%_gG>IJ$V?eV=4HI|lja6b|22{M>P6*3 z+jA;p=t#UKGHZsBnRzN?q%yCiY>v$;&&@%)HzySuFt3SB?=UjAoC=v&^DstI=*h## z{5JwQX>MLCnJ>>Q7urWoh0LpYG$Z9^^)NEi|6h>#c};n44xp?j6&l+3npEKZ!^o_I z%>Tp+&h{9~tRQ^7CdPg~V_5#N3B~-Y3t8HsdD!Az&y^WV5gfR$B+dVzy$sVuHw^XD+S#fHx1>?sQiLjGSMd)F|s4J9O4NKvj9G||JF zZD4FvA>?MtFtjfdUo6KF1O$pwuh`EanhN&=N^;80Og2vfP1PcB-&P*uRWN5ffl(XXdpz zfsaLA$BuH61FK8Pytd+JN+3c#c^K;dCNn```|HV4fq-I`hS%*wCGr1*dYsP{#}fXq zx=hLg&HpdRobSoR>+0|hXSsS5o1UVh{!bT{GyE8hWKnKqatWTH)ti%ghD9=6!^p7z z2QtC5TIC#IbwP}@6{7U3rb+{{cArm8XUTq&HY z&A?NoVd81vlcixvg?-S%g6uJ38s@xwqGo1U{2VgHM8n`lilAf+pu9+UKVgl%=7O@K z8RWQ+h-yhg6~@nX3N6!*QxQ{fKs`1S!CV?MYaR#lOz|m2&Xx~Rnr%Fm&)xD;aq30; z2`YNNNzQH3w&ws(tXYtZ0xivvj1Dic`7F)qRmRHogtJ$!g!(E^K6~Y7|8At7YiQX` z0*Iu0vgoqezj$25uCq~=fjvLgoEEbT5B)mIC@Xt7KX>z)ftEMWrc z0WCClYjon1b%SRa&i?<5a3XSF25|UMvtgPt>>5{i$G>R0CVP7XZ~_rhtjqu++)(`g z0~ro{>|ZrAbL_jw4!!;2bt*_ZszqnP9Hl_r)bKoi%pb?T+Hq4;Y^{K;)MJOQEj`s@ z(Fwhy`O)TE)@a(VZ7{G&`wRC;JFc$OgfbgiwMe;mXw~CSI|lX=ZENkx|M(nQY;zl{x=w81}IY#p8X1MH)pYl)FDFCumbO`9IT*iP;a}i1ac$@ znK{m$)IqJBwj3NMGprA1Adv44SRzE9K5S1E+~`nf6AN8{ zYtxa4y8)9Qwvagr=8Y8;q$g_f`+jsr*c#So46H&5P9(O9V#x3M9^sJZ)0o567I%J? z4UwUI)X^xcaYTI3I0Y>%37V{+iwWW^cx}Tz?pNDt#Wty;O?tF;Dnl{;yEho)9_Lyi zI93v5IDcS4L)yUySMF5B?@c|}`)ksvkjDthV|)r&GU;rg?do;#ZsG5%u+lx8Zn`8W zDehKTP*Hg*dLE|CQNFMj{+ysew!U8)6gK^E&Ypx4N*|#(Esh1~T&uD7SPi!A5GeP; zKOB?4p2c-zd)@vZeXOT^tH6EM&V7d6V8yKhY|A`;&kxIqXuCrnQ4{WF!!nD8#`diy zapUpgVN=ELR#X*6v49{Do1u0_`#k^r38!-(V!y#R4LKw1L3KBJna`^%vq>?(rhouZ!JZ%akR8j%my$ZYu zZFd{lK*DyyyB^QyzILWJb!V~n&@T`_imAft`L$VJ^Z9yKkf|43oX9Y+`6D0qIg5MI z#l7g_Uh#1sw74TK?ud(f=aWuWT^85x;`&|OwLb2KkS@z6HG!~n%8qeTnW!;`n*-Fz zAQ^01iDV|tcQo41RwcJ8+BN%dSQJ5`SUJmxP#2nJ;n*ARqCg z&g64fjrUSIn+Bo7bfvdvtt~0~&f~z?fq#8_bnIV#Rb{U|^kpl1pKK+BqoDY$ynFmX zJEu+#NS{5q1o}V@n_&TA5ZK$V0U@PySBY+F?6dQ#r0IR`(D3FuafL0i?Viu_MjVY5 zC7AsK_oxH!pDB!X8$1`$K-k&&GQNKKR{aWaSf#fH&`!(GjC;1{HrP0AkOiZ95Y39G z_UMtt($=K12w0>X{?oyaJlGY+PSF=Fes(e5MY2`Xc$+gSOC8f85ogUArIVJ()LCkW zZS%SVIgM?6NS=J}`i3ow(BnHSf0oq?cq}c8id|nc3+~#&SpMEI&K9cf+GT2j@>ps<5qM}X2@P&kACy4H?jxLaqHc)jgZ_|^lL?D4_0(~;_v`|bw+029vyIq zTqpEBsY4Eng&2-}&C}L;DcJJnyMW4lMZYZB`gc&em(h1~M4LiS%VY+==lGVm*t(m~ z?f5>WJn_EX#`n4$q;}gO1XJ zec1<0AdUB#G_oHpisC$P3*HAMq2)~A)bj&Bjxs5I%Jt8~kj2XP?dVp$_FQp(Is822 z`FYq3?wR@ApS)Z3;1Ldiy??158z1S*K4h6pJ&Y-#p?E~Z*~HGwdDMX46U3ESQh5pIUC-=-D`Ztx;c)XsmwM=}mL{{q(nq$&^;s4rXSeR829dY16p*Q4jF>{(n{%pQw*Qop^~LR>r* zJ#SYcDW^)vyp(z8U>JK-kE+Fa6ai4AkK*UYGxIu^8N8b#4q)s-HdpZHCCKSV=VUU1(1ed8&0-#lL;w1!PJrh*?~+bD!N`-q6^_uTO1PG^qNkF03=rc+9C9p6R4;qPobth**>LvlP(qlahuPqQPN8=ubYcsh}NN8nC6hq!QEd%SRdJW3tg!Wey$ zfFprD50!)K2ppefSAxb>17~9g7ZH4B*7|666ubkN5CA3&(g81wx%-{`j=RT-*uV_= zyfFa`lT{RicUf>Ys3h3y@x=unWcorXyGb-pE z(xhpZzu_b1nD%HNw~>Zp8a4@!c#Rrk;Ohco)UU4S=`!Ov^mkwL`yVD2j(kzx+C?v5 z3dJvl+K!EKJDPsJ#Og?r3N=0?g^|H zww>eAP=k#ued7zVrD$%0(}XGV1#S1wX})s73U+%Ji>Ir=CkuI7&Y*J!NE5pxS2}7P5tcwS4^RiI_nX~;LR{N@C_d) zn_02z|5$35O_|`3P1G(zsanDYECX6H7O(N0J%iWd?y0ee9qZ4TA*rL*SR9SD5u;rj zVVi5SD7+`-D$04DvHicb{P>RObtt4O1W8rjR`qS$MHXs9p-m13MLdl_!O8RBpo-!r zS!Ngh>T@2^MP`H8VzsNzNiLKT`wkJ_*MH-Mr<}IM-VvrgsXS!%ZQ?TpIWp9uMLx*; z0B^7N_ec!R zZ62ex2`qoVas9@=RY~YX~@zTT;R6a%fY6^%jm8&-_8 zFqYa^SqDGw_0(ERZT3Xyb}s;NS!%+k;J-3xWfUWmm(Yh!kB-W`b#NLVBsdJ8^W-+T zXLh{|p6!F>gZNOW$)3qw=$ki#W^a(DO{PMUX>s@Qd3 zX&B0)L62jRvV7<-oU+`hRKem|OLV`FX?8JXs(BMCsa&2pAl3W}4|^G~fdj;VAv^)M zi3~2f&!(#wv_WuHqW=H+Gr7RW2RRE`MJ#f82vCd2f`u5PpZCO{{*|&2EAB&TsW8t& zk;&FeZ#}la25%O8K)tIW;eFl98X1nhY|Y5qy$G)GdAcJ9Q+Phg)>}U5MD_S$?y08- zz8M-3=gjq`_F9%Jc6}j=K-nh9p8r`C^6b0`uK7b_qHlhyj)ZCV`vC1t9S}Bki~-ZX z`u=gKTMdc~LUUs1WvmxCiJu=_P3h{)#p&!d2;0|%7wg`ZHrA2$<8q#4>r4c9)LTLC=AYO`qAz-VpdxOO|s zh7Tpb=x{QolH2i+9R&8!wSB3Fp7}LL52^J_WX{^TqyLo)*&Kwo(BGSSSRJv46V;UY z@`rnu_tV>m3+QA22JVAyxP$~YIPA0dRYg53wqs)NP$25jPhcgd&qN<9f-iBuZkKqq zrikwraMn%sT{f5Y#Ncwr`7;F#B3S?O4>(tP)ZMH58aYIbo=$!OyG1{`al?iUoHVM2 zZ?x+rxoHl*DNQHy3G-)34ZM>`Lw3WSqMn9K0Z z{{$%wbyvrh*#K{nk^W~2t_xoAQ9Gar!TLJZX&T|O}b{l4#fT$Xsqc4IT3v;XPDSU?eDP&4^!kCBW~DM@X>dA@}( z$)|%=I92lfNF9X?q3*az{3*jioQU7fU3~>U7iIH&I$woz;wA?eyxKo=kiYp4(K||A zd}V<18OksRgQN2dUpGL%m3W5zkIUhr-XVD%c6jCf3=?WPx6wicOc4{WCl1FDj2u3b zkIrxxi#ub4|JD#YgcJ4c6^@#-Lo{nMZ|4hGd{0Y4UBJoX6LSe>i*?H7K#SQAoEJf2 z;-KnF|bTetld2Q-w_ARmH6K-5`47F_VTtBa#8asC9j^m7oB<}wEgQ1J5X=guVE`nQqj#bu^ zGCHKF}sBKXeC0@KaM4x?UPE(v9uH61{W2*AJ5ald8{i` za*q!huePj4-Ai$c3I>v&87y*3PLI2zo#sr%s;Jvbnc0|^N_xmGrQx&?3!I@4@VOyU zC}YY7$*smVodGemIM!RTN(QG4(&i!DXQW*h@{s%knIaGj^)5(S(xIvNt&qn}vO!WO zOSDYf1Yu5!*1fE`fl!3}#Y388A+GHZjLemy-$tp)**=%H5=3d%yegOAq^C zogFR5bb^<{H9qk*vBXlETMT}JK2@L&J{l%cGc!x`5KYA2(bh&*x!Ugg1)W#CnD{$_xk9vfv*9n0hlpR~FxDJLctr7|@nAaNo(b#-iE z;Ez!ztpCn0T&>m%9JrVIwJ9Q=VTfm$nuGIZpn0gC8|Wp}Ol-&2{bkNO*z-kNF z82SFu{UD}hzWeR6+6;-~G+Z$nLwf%!dtDu3+2v_pk?B@N%;zfXS#bIL&*V9uJA+?7 zK|ZDm`djP#SfNe?dx0jF~`(|9iYUM16_5zq^Mv1xEhEGxD8DMMkt9BLL?1 z-6B4B|5VkP^&u}ZU7pXq;!}M*mTH?)jm$nyXm0=7d`^sW5|C&4W0k{L=9t?OmaBNj z4SaT9J>~J@vkR{0sNWY4E?zA;5Poppjs7XOZ>?FrBbtB48S8l)>tN+vRP=lwkX-7> zX?;76R6KRYoUxh%JCfU{FY-HRD`Js!rCDt3Js zM7|OBD^>^FAXo9!XpjObq~1y%4$kx8$a&^V0$np4konOu=;s6U^AWUpCr2dtFP|&P zAF*RGKis#Y9}aupv)UZy7kd}n2%o(>UZBsb;aIm$50`aeVe%eHXo6E8TZegLKKDmo zB9LWx<5cpWBtIhX&k#76IxImBTqYItV6YG#&0|+$dF-4nZO!BMH;AzpHLCEU5=;9) z_gjiA@Qdm>ygwk&z8y6Y2{`xSMFHPcfjfaW=EgIQyMZm{7AN4GxbGQoShimIA$H6- zGu)MfTk^S&SYC`XJ+chj(Z6#f`Wo9Wr92wShErqAC#M+b$?)El*%^NwU$Lu$7T#ox z3x{~#!Kw|3#j2f#Qpo9bua{W*@!n$D-+>5GW38Y_Mln|EzqA;8{L(o^f%4%_*4);5 z@)+FFd{lDJGx`9Z38c5O_mGXKyd|IeqA%aylHQlY;EiT~mc`h|{hk|prGbtm-4{#x zc1}a}7(W{ertskZa9`?h60H(*8D0^YW(SFNMX?g%Zjf=gRQ>EC_ZH4W-U;e z7o|-DvTCxbuH;9l^zr=k$;#P>xv3=vyJUeTUxj6PZ zXKH40{B^v>UL)W+cU9QxK%+Q;9E^jZ!mcxg*Qx7^@!{!(g~yPN&(LF3qgWkq=Jz93 zw~~M3nc1EC@q2gtcv|M2{7%ojmEUVKEbBjR*)$R_3^b7>QqrV>P;qbkAlS*{!FQWA(Lrg{`vD2~_fXxPrOi5_JtTK{0TLgU*nH%^Zi468mnNo%b zLg8IaEYD|13_E~#(l!-cNV$4wp@g?f2nh-61F$pAyB!`A=Vc+vrP?e8bO4&NGK|@X z9iS40M@c&HFFYA+CJ_5Ec+Ge^ZEz&t6k~lq0G?Md`Ww)Mw4YI0>-!v4)Q?=0F?w%^ zatIF)HMkMV*JhiGLNpzp7(;kNX{ry#5MHe)>w+3ZhjudnL62R?&j`uqoYI)B)1$VW zM0zx5T87mi#n2r)XmSZ-gn<#VlH^y$*)s|I~8272D6+h5|7^j zf1>?ee}y=0oeR&u?_D^5-?YC^x?S*m%+tK;e}VtshX=`$nk1W3SVvXBHyBvNoiI2` z6qfoh`{?hOs?!v9nG2IWSA+kY%`aCDR1oY{&pKQ0&Q^g1T}l*Ab16cs)d{DMw%G?;2`)q_%YXYa{bAQ`M#;{D)XQ>_^0!?CI zfGm5XyBy?rx_l?G|Ek6#cMk+)F)jzs^MNDh`Ajej#xsn2P$IZ>6+J&^Fplhqc;TNR z9;nDQT9=`H`iAH7efal*%eoj~jGgj=f3v`B97@fOsnYcS)C`2{dEgwlOdm&klosdU zSg!wd-Z>cf9>MwC4?O+RG5TM#n4kNY0?uDR^;wIt!ivn?^D$Lm!^+Xpx4p85Oy{igeLxke8@7chK-q(PzG z;J)ef3w&F8PUc~LugQE&-WqYxz|GT^{2T(AaO!x5t_eAuY|FH1b z0!cS{685eYzTYD%tAwvIzjK91?8ngg5ZK#2S_Z@3>5814-+6_D%Vn<9#}K)+5Mn_F!ahC_Gx8lo&_QAtCnI;Muv&$42Eg4`Kg@aM+ks z*^TU206JmoztM+glJR(Hro%h}>!x<897N#ZQnJslMK=IrtzwTGABib6&^ zm9sx_B<7r<5tAX1+Ys*ZYXs9Cg$|4z8IFz-)F+A8=aDP-D7pIbXRt&e8D- zxlvzkx_&i2ysa*fia}$>cQlNZsm`U2Qy5CU+C!9}wRr_*?h8lM=v&T}j*eg@6+`@L@$`Tg?Xq>$iT@S$sr zv+dcZw2E-7gl^gr_8X; zz#7~ILg>0e+X?@CF3)qhbpHYGx~2g06|VP@?nGCP^e4NN z_CJ9;*_F?&{|wC1r`({sP8HuZ6Z(D`*T5t2Mm<4+$yhu-qL6UqM4us#8m`Y zVi{m#EvgYQU%W}5#l&4g)t40$$LYWSi$sPbZqB3(@7o>TH)tOovK5G1Y*iJvGdJeSJIj zRXjyUJQ4yE?-9nuf=uo6L&uLYT4n1l9*qqK@6GMlJL>M4eT{nqjI1s!jKz(;Aj?xAOaOWy6(;Gb+`*;o=KnstgT>zCwHr9vc4Or zQf8cMc*KrFy;oA)C_10vimChG@*JbcSnl&hiibVLe`0FbQGDK0>?o%=JYvV;BE^On z#l@m%i!SDzu6g69nMc6D415+fDw1ZT#v-UxH#_Po6OtzUi8NM*jW3{zJD%>H!)KNe zDW*&Ng)-w^j==xLpyJ;m<+G`O4wT1cX}4Ltp=pubseg9XZO-_x-hrtArz19o9T;Kx z6C{odE_m;be@?KHq^L)=seiULr?LT$+UfAx(q-%p{y}ateN?{s)!1LuONPC!qLcfS zXK(Pb06l}xjWJgxL>H5z5dWrpuGR;iTMX{wvwG2XaBFnVy-UI^S<>;v=Lt%jd`ZVz z{Mi#M=}`M{QQ@n1ik~5bKwVq#31JNlmkJQFzS+0$hK#A$^*$iAo$8*X_C{sM+Duwz zW$gyj2SYU=(@6a5BKWbHO9m|ook0ygS{6 zsQ>YMkkQUFA2MG~`w7j}8C<8Lv1LFQo+(=AqQi`6tqJwt!L?96=i2Cer6}oSb9P4K zg4&YxM&|8%8;|Kw6}dr5fD3UfxVRGwXTbq@HQJibeR!)A`%}*$>fktPKg>mi0ZN4L z^`O@5*#5Z66bq8f=e8>eiRmIS{gEi#e6L$(Cm4A!ay_)nE=opoQ?ktN<=wXWW`TV( z(7dwbi=fc#SM&u>p2mV4MtM>X-#syq;h!e@CrS6+>%PW!YV6yXYYUec+fT3oGM{_y zV@0-~yCY(IHfakF_c^u&Beoy&Y)8q;*-kmOS!?iEv|2^u4870v9)9WbeOW_*1~+`q zG9!eKQ4d()lX@(7U~O2u$ATA);TaEC{~gIyKaP)t(Z&KnI9}3W*5|l2t~L*3OI%QE zHn8u1?{f=@+pW!&T51&?QKI~i`d?`{diUeUR!$hZdqFr}Bsx7uApb`oQhb-<&B_$S zZSqmyZ7e@M$B((Npxe0DRE^H(u_-l@(YZY7nLg3-#cD$@MQ0LVaC*QoL2s-UA8V_3 zhaYm}W(<7CR7Mc^fY#*3y1&7`Ycxm7B+bn zSYwD}7k?)do!?`~@-DZ|iz?zJMb%esZ41eT{Ep7dvyZNh9;_1wZV~Zgf1~CfK?{Kv zbHf@!)9!v_?b}aAgiQ7}F@2{J6(#L0^x#c_*S+-moq5)h9oT&+&MvZtwyWp}H&N($ zsz}3l8S;6+^95sCMiHubMZ&MMeTDftDKwoAi;=cj!T)1Or#Se5|5rj8 z4_@Y}AOu53{BK`y!y`^c_rjk~_=B&@Oh^$8@7E0pR&8S8?5x_T&oJ^#-2}xHYIQ#M z`RM&kyhnzRv$qOA$&lc~9~1yg#SUuvJ4NJfx0GlFZJ2vz^F{PX{q)-}^0}qmNc&tvEivsD44%`lJ$oNR#Gjet4WdSv`5m}zmhL`>{F{wG2fnrO?cS;IMn zD&i^bbMOob-#9>WX4)F@VTM!$GEGM#L(7vlv?lwHe%qDyQQNjnXl%r7+!GPG{pU!$D%F%?BDNYYz)u;mg;K1c)yqkUzoOfCtBvt zR;tz2=&<`<0Ov*&|n7CuIA zqSu1@?AIKe35Jv)*|qn|>fpiJ5(IX3jEZ6vW5(EQea)^h#!;%kb;8OX=!Vf5iv7(RGXAGkzw4%Dx3- z7!jZnmx5+l*^$^nxggr>=^wGi`56i9U_#X;yrG&sFFkR4F{ zv=1S{K^>tOiUHJ{zbW$&VpY8^15+rbLhx%-rzDaCagqEE>U=iUM514}e&m(RTTFZB zNsDY{#W~QUt}&2)bgxza0ESiMwLgUYsMIs{H;W zx}!frGYFZSeY1Tv%8b#SyAN4xGLmN zkX30S?K!>DtJT+jjlOM0;q8o1B9{1w&nZIZ%1Pq-PGy;blgScI)S#Tau8JPbK~_9v zwjqp*5hvCE4KbKEK6f0d_UO#5`P`uo6U~VJ4IBj~i-NCWE26I4ug#7_7&T{Tyt#dt zb(-kdWJS>m_^Kq6C(!U(KW4DPj-sP^038WF5#m^2DsCC~b9mwG(!WQ<@tTv*Wu8$D z#hup?os&aaWrH;+X8ZHGTfDF)*qT>Yr$a5~lZ{rJcOHXYiXFuYp$5%77p=@T@{K;1v+AS?V9H5G?+%jeD)R^q;S zCU+;3id~Nq<-K^e(waN(1}}OZ!~FOW&adb>HpqFH>SaCVe2+eo!Ww#!d34iHJ zDniud&8W*eBcP%OIo-3;FF-d{;-TR0e&k$y`_v(sm?t1JaH}G6SNpVQ#In&t6P*~K zXLEwQXyZu8i=Iy@FP}$-r;wLA&(Fk>^5R&UpgNa%YcW%Y4@Q}ig^=8%BI&tG_AB)~ z;gsEByPZhfV_zGKxBu-3;;w>1k+aJq&iYK~I}b?1V#hW2u5QVyQQ9^`%=3%*gy&ok$114)4|I5dLCs^vd}9_Z?$2W z%D$|jK~s941wF$uyDR=?-su}K@I4RVJUaAD;zS#ytV&$;ylnqn($}7C{PwYZio^9% z&-bPtWKnEy>LD!vPCab%*N^nkI;I|#2go3amZv^pJJFuTfO5JK<5j(>eH0s`+y_$+ zs*Lif2UNLQRq-e;3+mY|YO*XY@+KX$xJShEE^2h2vErp+&p{v|LNaklP9T;QcbHh- z-1lS*F`Tr2-GpO!kk6P0+?wsHgLvT!+xM3^DaN5=h;+ZZEimbrQ`+32Q5&o`c3iEf zot4qkZj#*ezc0yPw@xI*vnj~FJtAC`qTYfO^&CmjN0<~X$qA%5HXEd9P?0n)IN+qH z(AOfx53~m+`+7p!NQzEh`82GKEZCh_uWdI5z>hvul9Z1ZGd^l{;=?n=v1i=X1)Q^~1)22RMCUo+7txs4jBmar z)OT6mga&c={j*QVT==$O21Jz~`vUGCzMq&e_en29n~?hhm=*QEAyvsSHWLd!Yat)G zXa7p*1oATVAR2n0d%kn1U8d@5fDPo#EYO+G-+vG9c<++Vo_+it?Agoj8xY&eeNQU5 z?<)%K%PV-qj&H@Tivl|2G-fVIMZXCa8C=k^nTlO+0K%`2e>U~gr235oHd2o5d*fAy zE8aI`g`}YT{U0)Zo`zWO9<_1@t>J}p@uT3ruPC@LuQvDu{5%lD_s51$ja=`ZNBBM1 z^Dw_2pMv|oqTs%~f=9%cS?1Wy-~VyL^$>u)dmiNXV9x{mdRz+b`-+15@(LaiSC)M!%zBYn&|FdSQqDTE)_Dn*-h#EVHl|F>Ll28efnTmhjsZ>AL78 z439+&{tkqF0n`q^va-jE%almew;sk*Yk+ z_8(G12ec7A42w=BUVD?Gk)=-%2};`|K0)2M2^s`Qjb(($&u2+L6Z4#Y-UT!j_)A8m zFu153nTxUu!-pcF6@Jwo>Kj z#)c<|8&iXVM26p>xWX@QQkfpJCU?SMH_a`E&QGe1uw%={h>s(+67jsxs3@f?Ya8YH z)MFxjJlb1WJnhWy^h|m&YVp(u)Xr0W-+l-sx9n+~T05OcFFfYBY>{-b;YK;lZdPFS$0-m$$unl~T19Awb+qVg&7Y%9ROjQ20%`k}(oqx6 zET*BYHSPG>$JB<*j&)FXt&6yS7r8T~)Cnw>jR(Hqh2^txgnI6@*{%L^*?34&(Hy63 zrjK<~)gC7clcC@Wjh^V|h0y!bg!?+7vMPMEQ@L<3@}-9)C0gwvKPPF$>kz1TkzM3b zOgE20ZMP*tv@5?1GCXG{f0MICq^yV#{UCmwF^_*H>zjD?5RX6c0 zPh&bi*K)OOU@h8|)~QLt#&ccF)#mt3w09yp-jj2aiO!BhVrz3(M_b3n+GMulwvNuN z9my_4ot)CGblvGpg2yC}2?gt}*UpY)qI+wbWo*i{nbQO@bLPyp4oaXayCsuu<$Ly> z$?o>fOm}iaXIHXiQ(JrMd5I~6H+OBk!5$(l_!YvZ;>q@s|I=i;J%$_%=xvOQM7k*6Ny{w*iYMPVww;+pJB*7G7XC%{iq&t$7YGzYpVtZts#+~NpSw@htm&UUA}lhv(LTdl6AJ6hUY{dCll$?DBhWml4! zu5>zCy=`hs=jP2Q3u!K@xoRqcT%X;TY=?#RZbxr}qqhnfDfgSM%oe z&E09BYBt96vZ1SUbFw47HQk*_c6VmGP~PN*wyti^|E(Thwj-I{B8}XZ?B0|n{}CrG zogF^M?b{s>9S;A(&W;N+NwS+oUfYxDZRwV5hOBH#g9<|-RrJDe={g;)HC-sph+v|> z0h5#5rUW&&J37~A+cL@9vu!Q6L8ZByTu|G&H~TV5ZfI_kcxt-0&D~CthIA%*M{`%3 zYC)2q8OhE&s0VFUMbaI2v~_iMZ1x3MlL_)%ZzaF2Sl$qA>n0~Pna&!SJ(q_&98dLB zw2b8e)ZHkQia-jcnl6KlPDv>#6*PLLUDB7j&Mn)!+BR;=Brm?|s!MAwx#*%xl69N9 z+PX8HTQ*TK8q#fBo7-FU$z1ID9W*ViaV0PVrO48_4eiYviE6pf(orwWG;?oUF<+J( zJIu9}YZ0PymS?Lgh0dbQ1Af8$hLqA`3dP#Yi!Pga(N)Q-$78>fRn;q2PZeKx^0WMg zapSI?o7{|Kle4x9g1psRSPNOSfK|)wohCCmYs0MDeb~aKt1P%{Gv+QitJ_61ESul3 z#KPCE6<|Z-qGd}LSisEow)K{lu$2qm<-$7G-x|VFH>O+|3TR=*>w>zvRV!B-!}A@% zjPT5=OU|mle73>W)mggrEiIQ`qJX-(Ma$+dZm__bJCZe9Ym%s7&B8THS0rmPYgXxJ zxqj*_d7^Imbc3y`uB)5sf)wVEARL9;%hY5|y^mkEbj5Y$i4-2o*NbA3SC13l=G!EfCa-ovUfH1LYbw=i>3p>CPGaUJ+nO(* zEv--PNE$g8IvEC%Dx!FKnB3;OqTbxxz4_8BFArtoG|1TZvX6AFy{+T6vN9{tIgx^p zlRtU%B~VqpbgBxWv9UgG5D>&3>F7GDCJ&qEhoG;k@J9m$4N zPB<Klz^9=hB>~RUW~HZr!paLbPzDt4zieWzKsP6v86i z-rCY05|-%nEEp)G6>qajZG=^;L`i$)vMKu;vm0L2mXEl8+_1a>`G>r;Y};n3<86T` z1pDdLq(oj8zhwE!g=R*i+46&C(b>q%6|z{{I;$&aDfu(0-|-XAzh|!n;CvBm{VgWN&swoZ}B%7gVK%&PXObON~2G zUgr4A>R>q7qMXzCfj+Ep1wu5oH@8?y+O;LAWy@mBq&+u9U%_cZyo_4YEiF|ju)3r4 z&aFc%5^;Z`v)$>p>n~D+RyIsk1Jr{1oLos?98Qw8$xv;P#H{WN)?)4*&D%oR8LZ&+ zSDTbb)RZLw?%v)VIH*;Mu1xz(NX`n?DsETitI2h31Xj_@qHc{@@jL6*>@b5s=SSiP z_xQx*s_I7nKDD;7gWh0QcXNB~QuT8;pcLJ;bxZv)z+@E+@O5jZ)-G>YrmLyW{nE+k z>>!be=frT!n_E^kL}11pw0%B}7sD;6WJ7ifg8-QrPs^+nFs8K)ne6)FTf{2@DWUxu z@i2_BNhlm&^=pFsO&>$POK=u>Se5O_v~5n;64GrVSzf=U&IdNt*Vn13D&eg}eoii= ztp(IcREe5EGLulp5p|+|&5C6)t^!Y|imQ6XvZ--=^mH3<^qOEgt@jb|pK6}}2l+Kt zOi-5JqAr|D-r{)*HgogVmMvR~?Puf;*KDQ9+TbdNx1Vv)5*u0q>-r+C*)8pDE!d-E zjq8&H+c>$_l~T+$POkM~CgR}Exwr2#>$3<;t%O=KVEkWIq#jAXm zbkoMJEk11JniW>IIC2avN|uXOu3C*RW}(g_rHoQH+WUs~v^C}wOK9MR=LKUSL~)&P z98ga4BOhvbI!1bwF6IY1H_*5$Ehm?_RRcktTV}Ztv+h}2I=kDPuW{3SFUj?7-3&%} zZBHZ=zBuLbHq+NHg{hslj@R~?jNLhc7H&OY^s>g~AnuDsdf;`~1mwNmBAiC+N zx33DYHgo>c8^^9AM8)ZMgLeehZ;PiT~#FWuDCvVG&$ zwvMJI<$&=Ea~XuQdsDI|wAC^BhT?U+EL_}Z%s>Y>iqUTdK9o4}q&)p4^%0!$w{*qo z)GC(`_wHW;zsu`WF1G03hR#8x-_{pss$bc#^v0%!m5rQG2~;~J(?9QnwWcvBJ^o2Xf-R8igC-W5TygQmMkC%=xO}!7 zQ;XZu4Od*@;GBJp+H@gYx}stA{AJ4)QzWaUxf;l36q%t(mp|&V(3@}>L$yI+#SpG} z1hX52YYNCj6702L;?DpKU`q;yfE)nODnnhQ2qH~%smvewPp7;-;1 zYw$Lkb3*)RXm_%uJ&muCWm?s$nd8sRM~@t5Q?B!EDlW`ZleIZh>FZWiU*q&O=mP$R zMbTO zU6DdWCK{Kg>C=^|sEUSEj$vPMV;sjqVk|ou*U6>!b3k=+w5Kw1ZGjg%`M7~qbiM$^(QY3^!WMlUtsS<>3IiiVR{FBfGMUTYUqK~O(ym1|Sf6vGj#pS~`THDcmr zNr+HLcdZKhq<(D)F)oR%2QUCvxFaSL64ne1gCNY%60b(8JYHcT-f~b5V1b@7lgm

sf2G2JuP`ck)|jy<>+(@CNDxDijio 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 V-M3y>Lhq9f. -# It may be used under the terms of the GNU General Public License. - -SubDir TOP libhb : hbversion.h ; - -LIBHB_SRC = -common.c hb.c ports.c scan.c work.c decmpeg2.c encavcodec.c update.c -demuxmpeg.c fifo.c render.c reader.c muxcommon.c muxmp4.c sync.c stream.c -decsub.c deca52.c decdca.c encfaac.c declpcm.c encx264.c decavcodec.c encxvid.c -muxavi.c enclame.c muxogm.c encvorbis.c dvd.c muxmkv.c deblock.c deinterlace.c -denoise.c detelecine.c decomb.c lang.c enctheora.c decmetadata.c ; - -Library libhb : $(LIBHB_SRC) ; - -ObjectCcFlags $(LIBHB_SRC) : -I$(TOP)/contrib/include ; -ObjectDefines $(LIBHB_SRC) : __LIBHB__ ; -ObjectC++Flags $(LIBHB_SRC) : -I$(TOP)/contrib/include ; - -# turn the version number, etc., into an include file for cretinous build -# systems (XCode) that can't run shell commands -rule HBVersion -{ - Clean clean : $(TOP)/libhb/$(1) ; -} -actions HBVersion -{ - echo "#ifndef HB_BUILD" > $(TOP)/libhb/$(1) - echo "#define HB_BUILD $(HB_BUILD)" >> $(TOP)/libhb/$(1) - echo "#endif" >> $(TOP)/libhb/$(1) - echo "#ifndef HB_VERSION" >> $(TOP)/libhb/$(1) - echo "#define HB_VERSION \"$(HB_VERSION)\"" >> $(TOP)/libhb/$(1) - echo "#endif" >> $(TOP)/libhb/$(1) - echo "#ifndef HB_APPCAST_URL" >> $(TOP)/libhb/$(1) - echo "#define APPCAST_URL \"$(APPCAST_URL)\"" >> $(TOP)/libhb/$(1) - echo "#endif" >> $(TOP)/libhb/$(1) -} -HBVersion hbversion.h ; diff --git a/libhb/Makefile b/libhb/Makefile deleted file mode 100644 index 9992d7cd..00000000 --- a/libhb/Makefile +++ /dev/null @@ -1,101 +0,0 @@ -include ../Makefile.config - -SYSTEM = $(shell uname -s) - -ifeq ($(findstring CYGWIN_NT,$(SYSTEM)),CYGWIN_NT) - SYSDEF=-DSYS_CYGWIN -endif - -ifeq ($(SYSTEM),FreeBSD) - SYSDEF = -DSYS_FREEBSD - LDFLAGS += -pthread -lm -endif - -ifeq ($(SYSTEM),NetBSD) - SYSDEF = -DSYS_NETBSD - LDFLAGS += -lpthread -lm -endif - -ifeq ($(SYSTEM),Linux) - SYSDEF = -DSYS_LINUX $(HB_DEFPPC) -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 - LDFLAGS += -lpthread -lm -ldl -endif - -SRCS = common.c hb.c ports.c scan.c work.c decmpeg2.c encavcodec.c enctheora.c \ - update.c demuxmpeg.c fifo.c render.c reader.c muxcommon.c stream.c \ - muxmp4.c sync.c decsub.c deca52.c decdca.c encfaac.c declpcm.c encx264.c \ - decavcodec.c encxvid.c muxmkv.c muxavi.c enclame.c muxogm.c encvorbis.c \ - dvd.c deblock.c deinterlace.c denoise.c detelecine.c decomb.c lang.c \ - decmetadata.c -OTMP = $(SRCS:%.c=%.o) -OBJS = $(OTMP:%.cpp=%.o) - -CONTRIBS = ../contrib/lib/liba52.a ../contrib/lib/libavformat.a \ - ../contrib/lib/libavcodec.a ../contrib/lib/libavutil.a \ - ../contrib/lib/libdca.a ../contrib/lib/libdvdread.a \ - ../contrib/lib/libfaac.a ../contrib/lib/libmp3lame.a \ - ../contrib/lib/libmpeg2.a ../contrib/lib/libmpeg2convert.a \ - ../contrib/lib/libvorbis.a ../contrib/lib/libvorbisenc.a \ - ../contrib/lib/libvorbisfile.a ../contrib/lib/libogg.a \ - ../contrib/lib/libsamplerate.a ../contrib/lib/libx264.a \ - ../contrib/lib/libxvidcore.a ../contrib/lib/libmp4v2.a \ - ../contrib/lib/libmkv.a ../contrib/lib/libswscale.a \ - ../contrib/lib/libtheora.a ../contrib/lib/libfaad.a - -ifeq ($(findstring CYGWIN_NT,$(SYSTEM)),CYGWIN_NT) - CONTRIBS += ../contrib/lib/libz.a ../contrib/lib/libbz2.a -endif - -CFLAGS += -I../contrib/include -D__LIBHB__ -DUSE_PTHREAD $(SYSDEF) -Wall -g -O3 -funroll-loops - -CXXFLAGS += -I../contrib/include -D__LIBHB__ -DUSE_PTHREAD $(SYSDEF) - -ifeq ($(findstring CYGWIN_NT,$(SYSTEM)),CYGWIN_NT) -all: libhb.a libhb.dll -else -all: libhb.a - -endif - -libhb.a: $(OBJS) - @echo "Library $@" - @ar ru $@ $(OBJS) - @ranlib $@ - -libhb.so: $(OBJS) - @echo "Shared library $@" - @g++ -o $@ $(OBJS) $(CONTRIBS) -shared $(CFLAGS) || \ - ( echo "Compile line for $@ was:"; echo $$CMD; false ) - -libhb.dll: $(OBJS) - @echo "Shared library $@" - @g++ -o $@ $(OBJS) $(CONTRIBS) -shared $(CFLAGS) || \ - ( echo "Compile line for $@ was:"; echo $$CMD; false ) - -%.o: %.c - @echo "Cc $@" - echo $(CC) $(CFLAGS) - @CMD="$(CC) $(CFLAGS) -o $@ -c $<"; $$CMD || \ - ( echo "Compile line for $@ was:"; echo $$CMD; false ) - -%.o: %.cpp - @echo "Cc $@" - @CMD="$(CC) $(CFLAGS) -o $@ -c $<"; $$CMD || \ - ( echo "Compile line for $@ was:"; echo $$CMD; false ) - - -clean: - @echo "Clean libhb.a" - @$(RM) libhb.* - @echo "Clean libhb.so" - @$(RM) libhb.so - @echo "Clean $(OBJS)" - @$(RM) $(OBJS) - -.depend: $(SRCS) - @echo "Checking dependencies..." - @$(RM) .depend - @$(foreach SRC, $(SRCS), $(CC) -MM $(SRC) $(CFLAGS) >> .depend;) - --include .depend - diff --git a/libhb/decavcodec.c b/libhb/decavcodec.c index 5dd22244..e5c8fd10 100644 --- a/libhb/decavcodec.c +++ b/libhb/decavcodec.c @@ -61,9 +61,7 @@ #include "hb.h" #include "hbffmpeg.h" - -//#include "libavcodec/audioconvert.h" -#include "../contrib/ffmpeg/libavcodec/audioconvert.h" +#include "libavcodec/audioconvert.h" static int decavcodecInit( hb_work_object_t *, hb_job_t * ); static int decavcodecWork( hb_work_object_t *, hb_buffer_t **, hb_buffer_t ** ); diff --git a/libhb/hb.c b/libhb/hb.c index 08bea4bf..0e36465f 100644 --- a/libhb/hb.c +++ b/libhb/hb.c @@ -257,7 +257,7 @@ hb_handle_t * hb_init_dl( int verbose, int update_check ) */ char * hb_get_version( hb_handle_t * h ) { - return HB_VERSION; + return HB_PROJECT_VERSION; } /** @@ -267,7 +267,7 @@ char * hb_get_version( hb_handle_t * h ) */ int hb_get_build( hb_handle_t * h ) { - return HB_BUILD; + return HB_PROJECT_BUILD; } /** diff --git a/libhb/hb.h b/libhb/hb.h index 4ea05097..5d517d3d 100644 --- a/libhb/hb.h +++ b/libhb/hb.h @@ -5,7 +5,7 @@ extern "C" { #endif -#include "hbversion.h" +#include "project.h" #include "common.h" /* hb_init() diff --git a/libhb/module.defs b/libhb/module.defs new file mode 100644 index 00000000..4015ae1d --- /dev/null +++ b/libhb/module.defs @@ -0,0 +1,47 @@ +$(eval $(call import.MODULE.defs,LIBHB,libhb,A52DEC BZIP2 FAAC FAAD2 FFMPEG LAME LIBDCA LIBDVDREAD LIBMKV LIBMP4V2 LIBOGG LIBSAMPLERATE LIBTHEORA LIBVORBIS MPEG2DEC X264 XVIDCORE ZLIB LIBHB TEST DOC)) +$(eval $(call import.GCC,LIBHB)) + +LIBHB.src/ = $(PROJECT/)libhb/ +LIBHB.build/ = $(BUILD/)libhb/ + +LIBHB.m4.in = $(wildcard $(LIBHB.src/)*.m4) +LIBHB.m4.out = $(patsubst $(LIBHB.src/)%.m4,$(LIBHB.build/)%,$(LIBHB.m4.in)) + +LIBHB.c = $(wildcard $(LIBHB.src/)*.c) +LIBHB.c.o = $(patsubst $(PROJECT/)%.c,$(BUILD/)%.o,$(LIBHB.c)) +LIBHB.d = $(LIBHB.m4.out) $(LIBHB.h.out) \ + $(foreach n, \ + A52DEC BZIP2 FAAC FAAD2 FFMPEG LAME LIBDCA LIBDVDREAD LIBMKV LIBMP4V2 LIBOGG \ + LIBSAMPLERATE LIBTHEORA LIBVORBIS MPEG2DEC X264 XVIDCORE ZLIB, \ + $($n.INSTALL.target) ) + +LIBHB.h.in = $(wildcard $(LIBHB.src/)*.h) +LIBHB.h.out = $(patsubst $(PROJECT/)%,$(BUILD/)%,$(LIBHB.h.in)) + +############################################################################### + +LIBHB.a = $(LIBHB.build/)$(call TARGET.archive,hb) + +############################################################################### + +LIBHB.out += $(LIBHB.m4.out) +LIBHB.out += $(LIBHB.c.o) +LIBHB.out += $(LIBHB.h.out) +LIBHB.out += $(LIBHB.a) + +BUILD.out += $(LIBHB.out) + +############################################################################### + +LIBHB.GCC.D += __LIBHB__ USE_PTHREAD +LIBHB.GCC.I += $(LIBHB.build/) $(CONTRIB.build/)include + +ifeq ($(BUILD.system),cygwin) + LIBHB.GCC.D += SYS_CYGWIN +else ifeq ($(BUILD.system),darwin) + LIBHB.GCC.D += SYS_DARWIN +else ifeq ($(BUILD.system),linux) + LIBHB.GCC.D += SYS_LINUX _LARGEFILE_SOURCE _FILE_OFFSET_BITS=64 +else + LIBHB.platform.D = SYS_UNKNOWN +endif diff --git a/libhb/module.rules b/libhb/module.rules new file mode 100644 index 00000000..91e47a46 --- /dev/null +++ b/libhb/module.rules @@ -0,0 +1,28 @@ +$(eval $(call import.MODULE.rules,LIBHB)) + +libhb.build: $(LIBHB.a) + +$(LIBHB.a): | $(dir $(LIBHB.a)) +$(LIBHB.a): $(LIBHB.c.o) + $(AR.exe) rsu $@ $^ + +$(LIBHB.c.o): $(LIBHB.d) +$(LIBHB.c.o): | $(dir $(LIBHB.c.o)) +$(LIBHB.c.o): $(BUILD/)%.o: $(PROJECT/)%.c + $(call LIBHB.GCC.C_O,$@,$<) + +$(LIBHB.m4.out): $(BUILD/)project/handbrake.m4 +$(LIBHB.m4.out): | $(dir $(LIBHB.m4.out)) +$(LIBHB.m4.out): $(LIBHB.build/)%: $(LIBHB.src/)%.m4 + $(M4.exe) -Iproject $< > $@ + +$(LIBHB.h.out): | $(dir $(LIBHB.h.out)) +$(LIBHB.h.out): $(BUILD/)%: $(PROJECT/)% + $(CP.exe) $< $@ + +libhb.clean: + $(RM.exe) -f $(LIBHB.out) + +############################################################################### + +clean: libhb.clean diff --git a/libhb/muxmkv.c b/libhb/muxmkv.c index 79d8f235..83a7daa4 100644 --- a/libhb/muxmkv.c +++ b/libhb/muxmkv.c @@ -228,7 +228,7 @@ static int MKVInit( hb_mux_object_t * m ) free(track->codecPrivate); } - if( mk_writeHeader( m->file, "HandBrake " HB_VERSION) < 0 ) + if( mk_writeHeader( m->file, "HandBrake " HB_PROJECT_VERSION) < 0 ) { hb_error( "Failed to write to output file, disk full?"); *job->die = 1; diff --git a/libhb/muxmp4.c b/libhb/muxmp4.c index 1c82211d..3f9b2314 100644 --- a/libhb/muxmp4.c +++ b/libhb/muxmp4.c @@ -390,7 +390,7 @@ static int MP4Init( hb_mux_object_t * m ) /* Add encoded-by metadata listing version and build date */ char *tool_string; tool_string = (char *)malloc(80); - snprintf( tool_string, 80, "HandBrake %s %i", HB_VERSION, HB_BUILD); + snprintf( tool_string, 80, "HandBrake %s %i", HB_PROJECT_VERSION, HB_PROJECT_BUILD); MP4SetMetadataTool(m->file, tool_string); free(tool_string); diff --git a/libhb/project.h.m4 b/libhb/project.h.m4 new file mode 100644 index 00000000..7889afb4 --- /dev/null +++ b/libhb/project.h.m4 @@ -0,0 +1,33 @@ +changequote(<<, >>)dnl +include(<>)dnl +dnl +dnl +dnl +#ifndef HB_PROJECT_H +#define HB_PROJECT_H + +<<#>>define HB_PROJECT_TITLE "__HB_title" +<<#>>define HB_PROJECT_NAME "__HB_name" +<<#>>define HB_PROJECT_NAME_LOWER "__HB_name_lower" +<<#>>define HB_PROJECT_NAME_UPPER "__HB_name_upper" +<<#>>define HB_PROJECT_URL_WEBSITE "__HB_url_website" +<<#>>define HB_PROJECT_URL_COMMUNITY "__HB_url_community" +<<#>>define HB_PROJECT_URL_IRC "__HB_url_irc" +<<#>>define HB_PROJECT_URL_APPCAST "__HB_url_appcast" +<<#>>define HB_PROJECT_VERSION_MAJOR __HB_version_major +<<#>>define HB_PROJECT_VERSION_MINOR __HB_version_minor +<<#>>define HB_PROJECT_VERSION_POINT __HB_version_point +<<#>>define HB_PROJECT_VERSION "__HB_version" +<<#>>define HB_PROJECT_VERSION_FORMAL "__HB_version_formal" +<<#>>define HB_PROJECT_VERSION_HEX 0x<<>>__HB_version_hex<<>>LL +<<#>>define HB_PROJECT_BUILD __HB_build +<<#>>define HB_PROJECT_REPO_URL "__HB_repo_url" +<<#>>define HB_PROJECT_REPO_ROOT "__HB_repo_root" +<<#>>define HB_PROJECT_REPO_UUID "__HB_repo_uuid" +<<#>>define HB_PROJECT_REPO_REV __HB_repo_rev +<<#>>define HB_PROJECT_REPO_DATE "__HB_repo_date" +<<#>>define HB_PROJECT_REPO_WCVERSION "__HB_repo_wcversion" +<<#>>define HB_PROJECT_REPO_OFFICIAL __HB_repo_official +<<#>>define HB_PROJECT_REPO_TYPE "__HB_repo_type" + +#endif /* HB_PROJECT_PROJECT_H */ diff --git a/libhb/stream.c b/libhb/stream.c old mode 100755 new mode 100644 diff --git a/libhb/update.c b/libhb/update.c index 599d82ec..6b0d7af9 100644 --- a/libhb/update.c +++ b/libhb/update.c @@ -42,7 +42,7 @@ static void UpdateFunc( void * _data ) int i; /* Setup hb_query and hb_query_two with the correct appcast file */ - if( HB_BUILD % 100 ) + if( HB_PROJECT_BUILD % 100 ) { hb_log("Using http://handbrake.fr/appcast_unstable.xml (primary)"); hb_log("Using http://handbrake.fr/appcast.xml (secondary)"); @@ -148,7 +148,7 @@ static void UpdateFunc( void * _data ) goto error; } - /* Stable HB_BUILD */ + /* Stable HB_PROJECT_BUILD */ stable = strtol( cur, &cur, 10 ); if( cur >= end ) @@ -280,7 +280,7 @@ static void UpdateFunc( void * _data ) goto error; } - /* UnStable HB_BUILD */ + /* UnStable HB_PROJECT_BUILD */ unstable = strtol( cur, &cur, 10 ); if( cur >= end ) @@ -323,10 +323,10 @@ static void UpdateFunc( void * _data ) hb_log( "latest unstable: %s, build %d", unstable_str, unstable ); /* Return the build information */ - if( HB_BUILD % 100 ) + if( HB_PROJECT_BUILD % 100 ) { /* We are runnning an unstable build */ - if( unstable > HB_BUILD ) + if( unstable > HB_PROJECT_BUILD ) { memcpy( data->version, unstable_str, sizeof( unstable_str ) ); *(data->build) = unstable; @@ -335,7 +335,7 @@ static void UpdateFunc( void * _data ) else { /* We are runnning an stable build */ - if( stable > HB_BUILD ) + if( stable > HB_PROJECT_BUILD ) { memcpy( data->version, stable_str, sizeof( stable_str ) ); *(data->build) = stable; diff --git a/macosx/Growl.framework/Versions/A/Growl b/macosx/Growl.framework/Versions/A/Growl index a0572a332e2a96e1a4a21b5688b1bd4b9688ea92..aacc25fe3dbdf74bf8bc0b78e66eb544fdba844e 100755 GIT binary patch literal 330764 zcmeEv4Sbzb*6))Df{-96ildWKL_a9g$rNdu(+}F}w279MG)+$0kS3YroVKB*^(6Fo z`cRXG4jsyrDasg%4jrO0NzEHXr>L2XiIL${!W13Kl-&P+@AaIsPnu%hx$phm`@0Fd zYwfSK)?Rz>ZCS^q!;9wP8BKR*~)6x6tm z$JdYGRN-%hmPMEtD@FoKy=Z=ZVO6lQq-?Gv^pv4xfo1hS!?FlX8YZ5fUs@6jR2GyD z*F<{Kh}>&g$;cu!>){Y2`Ug46%c^3H=}BW3>hiFJ&})CRvLG=%=8Vc6W#p~}&dLJ4 ze(>nz=NAKgqCII$e8{pgCEt`I!Kg!g7dj_D|I*PHk1;YH2TnZ-^z?Xy6oLE& z!Tb_*WB&X=a9*$Vm5NZGcHG-vKB`t#70eCfR|bmFke)IWp>7uhBsAqW=|PUtDydH% zJ!wpN!m?%{ozSFV%0n6jh9-N`Xh2=6fzad~PXlTwh!N^ZW9gHc2I2l`uq{fRigZsJ z*&8jZ9r_^LKaGmY@?d#kd8wAJCk@}zmNf`jg!|XW{PLnuX#m|@T#m9mX^cnRY@`$J zpGH;n{5j>No_+SDv0P{n?w^rRv}Ha=i*(CAa@3$MeJ|nu zXmGqYAmryym^9_mskuP)UjqP@DUjox!K0I(Ur}CC2G1`Y+FO0)Yf#^-gX(JjBjjIx z{?(!R75Tw}Ii&#|kC!34!LmL>Wx|74K>pCCBut-5x0HVbLVo_l36n4J=S=Wg&wF;2!{0ww?F;Ia( zURv+R0!y%lOslR62Idc$STd)wpt9O*)2NDy(h^uB+A%FqxuB#lP}O@2dnu^+d3x0R zmMYHQ!f#AL<(%@e-dX58P+&Xa=$<(Ov(nk$(T+<>g1yllGX$a|Pw37DjOyp4A42TR zgl~~|Y4vA$X7paZDEc;4C!29NeCu@2|us6Nzn)VJEpnDWZN zw;PIC0<_6vp2?$s1sZe5xAi3{#Pr&m-bW3IF9Z60e|;M0(?FjF`ZUm|fj$lVpVvTy zEN65-eza>@&eG%XZ+ClM`0vv%o2GJR+Fc`^P@1zO*|D$ug=K|vGLjs-8izXJq>RWX zzec6HpWIU(a-ZyJOFf z@|c7|bV(7EIJ1%wGCmLRYNDc_JL?k*q`Fs$0#J(ZX7xD zs{EICE_{sqW2`0!s{y2#*B;I#tB}F!kbPKv0TN-G6i|e|>Xi0!!9A}{HK)!ciKGmYj%1N;lVjhm$)d6KQ3mWAN_i~G)HDP$qYVqP zVXDS{8rJDU*)*kuU`7g?@7O>0=;rN!QAA#Rl!{j-A_nnmm9lU9?nJs#O)jkTO3AuFe5o?479?!29_4{dk*DlyTeVvV_ka%OKZ(1 z!AV5&vHOAIY8!&bQ-8`zl3jZZi_xWA#QY^~wcX5bi{@|e@=sy@q}JM(nco`C-|Xdg zPe*>UEniDCzst+N7xmeC$8PlW zyL>q?lsJVY-a-k-9_LA7 z|3mkDJhpGC7S#9k^o_QC|ghNQV3&{N~C?U2~B=m%Gwsp{l-K6c52O2 z=m^K2Mm^~kpfp|D$Lnb@H=+qa5DboR?CIny?yVKMPQ7XzhJkM2Op(h`HK@0T6%E^p z))r^+GgVu)`CDq2vXuSBo#aFr*bYjTi*)wB{QgkF?sh_ZoF#j;lZvno76|E%y{X<~kxgb`@#e2+TdDO8 zc4KYhL%JlaUd z9;@lX{d`^r4j4LM61f=UG3oV}d_UGCtP=KPMTE}Td8TGRtU-5_-8BgQ2dloAJ6f{0 z_VdsQj@?13%9LiX$I;IpQ>z%Cz8cFKM%%-3YbbDFkRrnJG8P(D*96DvoUSOPT%oj1 z<%gR?8IHZnsJDU~z|*y}Nf$hyp*`%0w?+yb^`1-iV!=uuIuf+}!YMLFGiVCUa_k96 z^t!{Fn}6WtLy_l2#e0Y<1=9nO>(q^6x-8E=qZmrC`)pn2WTZIu87zZ2z@z(LOx@qm z@uxwI6lKCnV-H{rK%!z9x1p{%f;eMiIUb#~m!!k@VOFl$jFVQ!K8v+Q-?^yj)-~S< z+vpBsUFdHOo~*{TJ(s1##|%cPnugSxTOop8J#ys`6{3|*KNMv!PZT)zuWwP;1N@6UO}Av`cKwLJ5p=HY`NX(wZ(ppHishlAmP@10V!ZsdNEGPvHVsZ{V?iW zJo<1H<#PEYkBHu$oP=ZwNCWPz(O=(3&Z?3&w9ezA?YYM5QmvnDv7)r-yzT7g-yyNK z+kNt2+p>Z_4Rz0$>beu9;IiiGoM_i-y4R9KLnzy|j{^~{>u3?(`_omC;7O=2&bvq7 zoiAdXE@BYwD@K|YV_Xk0G>^~LDlyKC%)CcwH8O#4e+++*(vJNalS4#Yd0xugdUg}j-SO7KNcmOx(}ErgE>jn4Xc{L6JqV0X3%fP_SAjy z3yJ~m@w^+6r+NQZPu^d|^S%ou<9RPvb;CAm?vHm7dE2LJ74+aeUe!;ndBS3u={G<= zZ+B*@=Tu#+)7uSTkfKfVHl~VG zeu1e?+}f~rlt(o6x0Yn=_oxo3aH~rB2U9Smao>=s_6-Y=9=8l|?TeP65TxA1{g^km zKZ^*;#g22*IDgdLScA?`ONP;02`Go$gl2n7hT}k9FBv2sT3{X0{}=YN=*UZ5`;Nt4 z-A`FpMESIpU{q!qAo;567xGV9eb_LG7331sZf9mb?K9%rO+@hZvgV(a+^Z~U3<@U zN_5c35k_1Yg22~nbfMtIj-Bmg*%7t~xqn5j9&D&NUa})EBNZY}a_lKglEL_-Pzs$F zIW7aqO^U$jRM0NYl43|JND`{WQ0~x^XHsMl((K0m;XR(mz{)jl*=m=esPp7KmJfZ5764F)H2l;Q}9*wyv zTtg|#9w5ad*(m7PA4ci^ZJDM!2WBjulePW5rxOWxH1-oiWt?2+Y7(tYOj+9uB66kgAokFYN8q(d+TIVRV7@EUq z^-+E`k8@5&$5oI5lo~1Ljt-lf-P~mZ{tFOebB1GQL{+qknj6c4Sf{6G*9Cb8v49NO zLF8}GAXP~@mgQAjUH@7VSOdzPr%U7(vV;Czd&eSR$o>IRnpJsf&{3G)3-uh*nd&fk z=grt?+y8_oPSAbiM*>MYcEVCkvJNCMYWg`g3&-azM4n?Gj&%3QHx@*5*(3;aIdkhi zLaw(8igpa$u2|!_Q5u@|8B+U1ReOR_TTOO6rIMOo!YYj`L{Cy7nsd+=7Wrb3KYmhs+P4B8+59YEAY5G_0nDssy%EZ)yx(b`NW%XRu-< z6fK{I^4Rbhd6y&4RVN&1cQP1S;d&pp)FS^-7#dCZ%|z7nrva_0CTc%{y_hqUhV(j) zC}|7LirH4i(88w3*}zc6$@7Mm!S-(;>(;$bag~*R#XMozggmECr5IiCxT^6cJFq@O z3kd7}hV^8XdMipOIU-L|HapSKbtUpH=tk=nOp^@SPpu*ZjZQ=Mv&@F%XKZoogIE=U zsTQ4&OlLnlPax0c$Q5jA-Jz^y^!?XV1zeC4L1%Vx&9W=g<`d&D?t;sysDuyaahB$MvgRZe(dcK=8w^dOP!}?Kvuogj*y@} zlAn8>I+E8ZJe5gazU*?97A=HRnX$UmumNVBV z400&g96FTcN=Uq!*cD9gPOX`a@~(X{Sis)Zh1z89Dsf~s0ws2iKsL_QO^P8+(Z4-( z1W(&x0!Nc7JEjAz#RS|c=X+lFo3%eai)CA2JkSoETC(HcP9?eaU%clWgO|x;5Z%YC|!uTOuV0o9N<`% zwAfOOB0cf+og+{|_AepQ(l|sG-_0EH%*)6i?dnu2` zB3CeZUZ-zMtw~kRydK*M_qmcv@Pfngl%~z*T*^zer9f>*19-i)1{s(yZ*XuN!wyWx z=^W@_u+MVp{)xd0Tg-GuCqaeBX_GwJtIBeqb_9i=0x~d@rqE%L(~j3DOjxNV*(<*l z<*AKRP}W(J;?`AD)V%FDTK745n6p$|>yUCJDA7`D?$$b@gtT7dOw_8^3=$m`zaxtgTpEPz5OAGnyG9S`8;?s`h@&A>j=+7kwfVV z0G&{Z`&<~(qv%OcrjB^+Buk#!{GM{h)OsftQAn=656O|4n!mp_wFcd;OsZ<65@}1Y z#I=7;&F~WU=j58#j?UzlMbK~J;QSX%guS_XJF3SGyaWwEclUYV#qJ1Zq8vtu?pw4p zM{g@5cLR2&8q%GH1R0Ju5S^6bKKT$^$V)MFj*2Kh5B<+Y2^h^p-N9Tf zy7q4=zUXZ$GH7$2AToD6hh#ipco4bQ+e0}4di5JS$E;EAq%d%0!3AbqBc_Els;Ly0)>h8dl}7VJSBt0Hy8^>-xj zhG8Y{7s6l7OnrJw&vTt+U7!$k&aT~E1`__2j{S_@GGeXw2r#`AYXIivt#0-&M;(|@ z4SYfhT9M2sTT@n0Q4#j9YEH^HaA|jUWV~h{Dt7!ekWV$ILpP^6_!B3OcYsW!Yl++h z;z|QUsm&|Mo;~1S;pDAw{L9J8$y>$l;AlOK`DpU#AV)8F3Lv=j6b6zU07+0QCGsqa zKpCMjX;NMdTE#^G$V`q&g*!$_MYqMC=l(Y)RU>yv-y+pY=7Zerlnzpb0ehD!$&)JM zTcp~A>R?V?#Y=TXoK%CqL#nUz{wne>mV;EE0XqIw%NoHtx-N;H^eyXJ!_M`u2q`b(Or}Px-794C6wAuXY5%O zgYV8;$qqV@^u?7fP%Q~w9^Ug~|LVohHv7q((y`vf6m-&>+Lu#n$~YV4t#R$c=i_?k zbM}pEp9CBPQ&@%kX&C2e&i=KbqjsK7dC?sQv*G?Vo$H;v<+a;F*eHET2hosP^BI|C zXADZHy6JjbSy8oJs@-R-;Uym%u{-+`w8iZ>&WTA>) z6GB}0T^3dfT!;Y_R%KoL0x;usw10T;U$~UI&BtcrR#rO`(4}@Qf4)WUIdD+{R=G|CZDBh7($9HWN4=S z71O0u6xBwON`0~dxt0Y%%ij_C6lA%WqkgpL*D+Hado55@R>a&kN+}<=mCDz1LS(ff z&<@W!7}*d<(Q@raMP>Jr2u6_76N30 z8B*EV+~8orsJ1ufuwLF;*WVakvQ<`e&Hh$yQo?zS&HnAu{^)+>K+2Q17HUPOufiN2 z`3LA>jl`?L$a}yY{~EH{K{lUap3oZ?4n}X|VmOEuNOt|J^d5>EVk&UiI*bNE&j{0qCGh*bk_AJ~F{%OEAl|+vaKWP>u+FM8ENo$`AG5IRT># zEF#-T&A(#jV8oj_C3~`ah6Si5Ja3LcPem>RU(PY5`l*ZROxKsIEjyTp303jP5Q5mlB;HwQOs_vbk*sQ z*M*DiXv^3RC$s{qVXW3v7gizj+gf&}YB{!>=&HzZUtp`RyA5^xD}zB=!2uxQ*0KLN zyZKjP=JKmi%9(2=OT2%hV$u{mi!n>F44#6CgIYQel#xu^jcis~sWq*bA31xiTKu$U zCYsU;6u`@lB`YjEK8c@f^#Qh%*Dpe|n#t!K_D$E2aqx7fVkp||bM32(!Az`ET|j^0 zJ?Th(x%*w?NV7L;BcjxXYij)sYGJf7ynkxO`vvv-%dtPYTFG{*lg;x3nONLq=pZ#i z__WTNLq}mOutkxL|4@sD=3sveNN6rerQZIDdQ1cNQ$Y#7*!Sr~KmFb;!skQSF7R-# zDRLFMQa!9n=D0kMRlm~Df8eNk9_r#%f+}`5q{CoJ&emhFZ7GCR=ZQ;@0gGr(t$70@ zAaW=;(Lh>KYbGP^+K(5aqQ60D9?tPR6vv8sfn$%2hQ&VTHoTGA)zT+LMv)?vu^LdAxIpm&C!krOVB|xbv15l<;M&6hW z^}5OkjgK6OzNNJsVllr%Z$hzhiiw#Ds%%p5M6I>0o&+y|1|>Ka1#q-sUP!^7_e2NU z(&q+X^z((Ae)04?hi_Blm#FU64TG}5UoZ25vAvC&tkC)!QOX#2#+0}LG;y7P_XPIN zIUtWE+3)94RIaJML<-yL+CL%&Lf1peod+hO&Xgqg$sZM<8-?;Yi+D={j3~eDGu8^&+JwYMZGheQdR@W|3$ad_aDS&$K=Q`CY zvCSRF13_px08VaQn5m)7VOKr(o3sO?MoroJ#6Wiq^n4QvV@h+z^@G;gX9q(AFGfyT z?*G8`e?WqfLRAE>KGh4yOOu_2NzQaUAXpXVnm!y_?To|YgAL98$59n?>_&pHe=TOZ zX8$G~S;wuTe|_)}oI|FCC#~*03@eq|&r|(PSkOD6wMae$&10)jQR&=XvLV44pK|;* zd&|K%X*kN!Ety!q8N(!;Q@?7oGp;{|%Te;~F$Wpr@O)WiV1dLMT%&|pV;n{&Gwc#J zhKn(ES~8z8by}i!q^^H6Vi-?Uq4tRfFF^^lqFh7^gT@vkg_Ah?^ru9za7oXI6a!t> zNb~U)T6WiXp0N8{2O+W9zl(}!_U|UZ*#XU#520~qjeUZCAl(mRWmv<~CH**!TQRpv!R}6rcAp#ySqCNjC}QFclWTDhi$_u{{5)CesM8` ze7_qK;LT-t7o4w0&U5(pLSa2!F+Q&WtNKk5&OUbq&jh~|XUZTP%Nz)H-P_iG-K|j8lPnAJi;`-)Ll-(zl2N!HKGtxRQno(u;7K;Tcjy$?uAQyZQ6e80+Hg9Q zIjmu4SpppU?}58@53o#LyIWUJ1RqSmN`uRJH6gJF`2s>&|4%?!&kzTqwcIAyio#P; zk?*g}y727Wfq_J1JF4|j7KgwrjsS0b}sOz9cVVHpoUD&JIaJ+~Vdhp)@dOiLqjB2_4G`Oce-C(?5jXFiUD>E{YjOzZ$ z(ZuyWx+n)Jj=cc`w#j}9|0Zx7T1z>RSyW9^Z&zZ&{oA`|A)OoJq$`QEbzY>q3nPsb zSmk_F;p`+&=#wHFn7}0_pXF1bcQXMN_f|JQOwjQofBWL!#_GRMmWmp=E`4qz=vu*} zy;e5kRIkZaiN-Bz+#63>BULX_ou4W5$~#IfO2|7IHCL(|Ov!#6*_|cik_Z#|fi@A< z6X>^Or2sTQSp<9!NNcb16s2Xyq86+%b^xh7&3(wlTIEo56?U2TvD08CNt9%tN2()Y zk5p9yB6orbNrN(BGNEkm?e(~zb4Jht`lA%Ji{Y_>Qb9y-0n?$hZLxr|ZZtj2$gcP& zr*LmzjfyfQFWHO3ONfBt_kW|;VjZb9uYxHAQL#aTaT+=;P z)BW@cP4_0GV$X&9hO!V+P*!X1)dgstda&+IEV2=}8LlJRfz2d*3yRX_nj&Wr+l3h^ zHXqG1mwIk!y>zNNN+FpFd>;-5T>?+1A4YW^PQ1{{&;Jx_3E2gacI0R&w*^fp2O+&T zDKXfthn#9%dO}oMs*#PPFN)ki3{TmkA6l@xj1h=QHM9qpjTfO1q!g=AuMwJuHSkLG zXWEd}sEl%eUA#yg0KNo>^mv2Ur(O3@YCV9SV`-VhlpV*Wq2x%Zkji6uTis~t{!zxx z(T&;sG$=%O*#X4j9+RU<+Tdu`Vm*+_^J;pKf{N!`1JubDv~OE#j(@jwJbKV@4$3vL z*YB!A*{0N|vlB)p;=S$IBzH*zX%FIPmAMOaX@QYe&~@uxoS_W++SF&pCbG?tA5RB< zgVfIPBTshgJ^>b*<&I76ozlsqbd#d=uBJ3Jp3>_`)jByGvUz=?b@LLX-2&}|Ta7MX z)-@hFF#Rs~s_1(-tY>j<4Cp@f!M`w9Hb;JqIB52x(g4!|2-V^NFeQPMxB-K?u>W5{ zZw%Xp?FQZx4%Ky&`L#E(A?DkUOshc|)<;o{k1b${U2`l<#9gui%2SJm3qgQakX#13 z{`bMTf7~f)KgxMP4>=K~+&%3wG8V+(cGND;wQrfOC1p<+B4_8_iU;R!oC3D<0fwfd z@5@l?6qJ&|dxC4T< zNqWrLSXeFV%7lW^RS^=Li6!&^8qX`B$9lD0Sgk~kXWeEvjoRB$sIwAN1vGs)XAJPT z4`n+skUz#%qGK)VN`oP}_(*NEKEzGp6QM{5twt)vr>}_IM=jKo1&xZc5cC*1S#eVn z609%0^JEM`*G{|)=J>fHg{tJc0_AolAQQ(r*p;d00&FrxuiXuzotbK$qiQr0eX6T7 zBkNgCdHwTDEr+y0dl%C6-}wEh=M$lEG` zPC`*ljoY!4P~h2an0Rq>?Wd^N-F?9~h~03Uql9EjzJlh$TZ+RfKV08|QjYr9eJT-a z;^x|Rq@dL}T_wgTh*l{)C?&(1pMt}j>DD6U^J!J-qVT+E_9?*t2jXXp-4s&RCl3kpF=Gq zk*((QKCQy+Rp7G z8`vG*qj7kYVF3z3D*v1{?m3&c8t>U+GG@TYY$;@P+d!^ ziYH?SA*LM79=xHbXGs!MZ|LfGQ#vddI0mml%P`D1D6pd&J`&7O4m#4Zt06^tmnoT< z>e{QOp%ir|N6Pa+W9MrJLPh?y;o9xGrm_dK)fOq_CA+oBRFS_C?{`9*oBa*%odOBA zg;Fu5IRe}nP z)<7dWS8=50q5Y}{-&8i5Xg4J~^=wu+)DkmP8K>|kwOg6zZ;Pw|`_vcqz=zduvAf^E zsYXp}YE2>swVi$eSl1?@BQ)`z&FCTxb_&FMvs5<&Ce2jUHJPlBu8B4Sqwz)XbL`># z7czrUMap17)?-Kp&n80i9Y^ChBTC(4w8o!9}z6 zl)RZzqsk0Q#@)@H)S8J9OLq{QhUvj-+cjHdo)6*LH8$owbz&0Jf=4~rDo}RnnTi7% z-DlDF5D)U|7K$IpGRj~$Q0_&ll4V!$YU$7(p0tf}h*C}!IWW^{>EKU2X-uW0C?2Xz zR4GZh;17-`lSX%H&NogyCl4y*1Vad|23VwKkfdEuw0A&Y%{;9Pr(Vh!PTdsZW>Ce% zOgd2^(nW}$lLm$0j2HcYO!RyVPp`O`gD3Z|#?!@c?Fy~|WZb=u%LBFEacjq;_rkR` zk{Nl1IiJ?R(PNjz;+SnF!7&_xb>mA;qaxG{LR~k~#HEgT67EUf4r%B0obi z$MT8A%f4CoRWRSRi&&YUu{uA2Hm)LgC)ZLmjgld!Eo95MQ#FS1g}j z0-4Sf^*Z+bMQE2g{dySpR?6e|XSdl0O#};VwKxKJ7%X-^P2Y)T-GY+n5Xz``0eH2} z(#X1zE zpPWhCi^J)ove8yt6bwL=b=z6dP2z(zoYAGhLR6EpSlzy(5dY?NpeW3OTSfhV3ZJOH zo;j+25>V1O&yKz2^f~t5>F+S+sC|fkt=L0wx?>;WW!Z1b_@9Mbx9*sWQAK?t62Eq# z9~FcszTRS>&cG#i8fZ}(r|t|Afkj1ps2d)egb#pmt*p*QOhIt5av8R+Gp3>x#u_Aw ze9Q)3hGmMG__j(!^UTCXrHb8<(#_iy4(%cZ|8B=Fl@>(SD-HOBFWQPLZzY04ljWpl z5Jn5X-2kT?>Ps55jX2YjfAlF{G1$-kBqrNb#qoKj4A;_TBPBczUs7Ryk%uCm@*U(; zH2IkZ`OnyQcD_OWU8ID^rNoohC(l|;eZ1&Ac?voKXC1YFzu zA9^+Q-Fha4#x>H9nXFFLlOp{zOMDpX71Va^g_KZ#pGtUT>8QHJV><2hvELf*x<ccod>}#VV?Rp zMv7{ok_q~|RG39_RngSi0i4K`#&;G$HT$+7<#0m3^EA#^`)O&iDzihYU|M{0x(Zmo zV`noog>S!Mrf6{+a@@K*qxzZ2Jkih7$m6lr?Wz_v=RB!8T;_9LEkTX9k+^C*nx@pn zL064bYA84=UONRkeM|6+Z`DkeDwbOFzM8S}qs{3c$CHpL#=u_DC%DO)aC2(y393t! zt*GpF*4a5*$+HD7?m%+iW2)%Y08Zdf8ppD!wJVfiJ>*CGlwl3KRAI3DBe4@8)jCa8 z)dKz!lHtRsa<6H*(DV+>Bhe?*7qWq^6oXD4e*`YlPbK zOrt*RS1BZn?kC7`>W)H;O;+-BRV$i-s0*JE`r0CK0cq&uW_%XQZq@13NK}6ht2&)Q$KDZ7>~>wTDR{YSXN*#OFb&KwNS6z{ zrCvpQCAEOI=OG7Q9>H|9Iof_{`wx)|PnGkarvD|L*d4l}YWk0|6(2PHN`rJz*wuO!?RqvAO}_#;PTku~ z@1^M@k=tw2W3!YeBEE8FykhM&(L!Bwiiofez3+&%uk;Gr^T`{Mv|f(p_kQFEUp~;9X3IHw$2@)COH3HI}Lx_;{RAx|C_kA-v2~QT%00<(K9Z z7)3{^>YZmf_A5+PPA(~OR+PYfOjWk57HUT!15y}NEu<)S^*gujCl^`P^K>WpaxHwS z%->F3IQ9je(AaN51Fzz~(rn2jY01;P#|)}{7CtuCp+|KI>&mQM&jPaPwBL;qRf1I` z53crbyD7nb3zzYy?#T|-8m#g4P4KqU6zd7Bim!a*_AmMkxFe9IzR`o%XAugH*U;)K z->|u``$xGc$9fngX~vguUI3^RT{IS$DEcE@0^+t+eXU0Y)A3co*k0g%mEVE)8gju1 zr!U;qdaqA#SciRlHt2O;fkbynhkQ(!8apcw1l1lFj}4ATga+cBTO@*>oM{a~O_u)` zc2s)fsxExkf37`+vL^98&MmkbQLb5U`k@FgYiE;T<>>;|4AzBhu;@Yz{!^nwXr`}7!mk(05WN(0gplM7w5Li*alGK|!aY0^z z>Uw?gC#12n!2Cs2id$YXysN6LWl zP#Fl;Q@LFN-7e&-}v zHouS3f;I!CrVvHjImYZc*tcmtWN-)PY5D0`rK^GVcI~^Yi}J^tu3YK6_D_DSI3-1n zCsnrEwF|to1CfTF;nqJ=gsVQT#GeH%=%nUxw%q=y6s6wY!q$MpJ$RhFiKb~BLe>~w z7Rh5WFMK=x1_0UgYGBaDHbVgQ@Hes?G5dFXV&5Gc@8W$el@R?7&>&kKjg4Upo#4&d za^8jsfEy*H=u^R-9~bJm*&d+=vT?$uzPs@h9RFoO8t`=OATh{S4iY%1Y^T6#Nu$g@ zaxXVT%38wIkmuTXqm|cz!=!K%o{rS}|9YtZuc5{)%IPSpi3>i3j zjg@4>&LB&@b6cX&_ING5yz^irN59g@^~)}Y#PF#Qua_M=9UCnz`{AgdE@WZBTmgGC z;`1m$Q#powVo#~2;dm`VfoI~lap{sYi{DSxj$IAEKeP=HRPpkRXK-ow2F^vG0&!m6 z8PEt`I>xh^gmh(z$GhrrnYu^wEO7xc`5gnh$A|C8Q_@3Gif>hdhfzh>LWb0* zTVD>h_V|996`=81YMMU{|4d5%EcHl#1OAzW?b*p#fib5)bNG$Z)By`@XMwGx+72zS z2vX7}ZDn46X9>z5IjJAMUm7LU+LO3$@vqKzv0GEDx z~I=Bkqaxl=e5IK_NW3(DHtt(7gTi?F20k6K$EE;|SgfyCW9ZEX( znO>Xi$B03iLZ;UZmP%?U%4&B4a(1qkj@^ouw=NjWhM|>5`YE3MxoQ~O^b!n%k~h44 z68<@I5@ba0pkj-z*usiXlv$B`c2;bB`^rtMh<{)<;U)AM;ZQqAIXaYm>zR-c zf$cc{3{{nR4QOg69@4XVI#a1KoG9mHU`*^_DoL=1AQDnxFKtY1XEE3s`WC4?uxA1t zgirg444zBVpuF!%mv2p{mEmCK98aNoS#b=S)AQqF+!}z0H?Y(7aVBZfJRSS63*$O! z+hlggXIvRbM>HUX7KtzI=a**k69xQcPW6c^W$LM zYWWm^T2f8K2#iU?k161T9_=xKYROv-RP`~UQJ@Gff@7=?VGQ_Pf%xnJO5VS4CKq|r zkdivRp~?T}1S%5}cXZCja+dWlLr}_(a03LT=e4683_NcQ!a?l@AbCXkZt<=FUE<8$A+_K;pR%^omU2qt9K|5c7Erfhm7BZeg z2S2o-DOF9D_{741W`7!5gOc?Wi%Z?@YN@NgTyql2#~mz0ZvySE{*HZFl)73>o`TX& z-NRf1hzbrz3f5>tVIV9jt^Pvqu&Hm9;~kF}LF5?Zz^UO|%N`>Y+0ry4l~RW`@oW2{ z?{IoNN97mr>o>O)>&M6#WEzm{rO;*E)M)O(roS`M>3@aF zEy2&Ls$X%-DJkTSx#3svvaI~M{6W77RZ{~6MTn}{l*;l&)fRq|wk)6u=9CoWlmsMm za(S?%Sbi-pw`6{x=+Y3DK&qaZHNBu}41QGangCZy`S?7w_X~RyKsN`!I6JnyQng@O zprEpF9)5#&e-g4?M*Ye7DZ=kvH~Kq;6Y#^Gv1YT+%8Yizaz=1S~zaluHcyb_61p6(iQi4nkm6h=)nI#&tZ`EVfJt@ahb4!9yK~bQpu(G6r2A*a1 zG3_R+M2s)1qOzpCvLslYRZ=xA2s5qDDx|fJDaS8*E(&Iq6a~s?=7CDp_x~e2^q7fu z3iPg;?kFFk7Q4uIBf^w(ehdswY`Q>G3XO>kJnxl*4mQN@v3M|U9N&{tc zgY!_e_qzT?!9W>*_Y-y14`>^-r>TT2s~B?YA6uLnsKAH-C)MkqSy5gUoNSCg)i?N2 zNVuDeMW2jv9$n zuvHZGv!tMGt1MV`X|d{2i$AUkB2xoZ<)O;LKvsEiZgmBQ@O)6y!+C$>T|B4ftOLbU z3d#af<@@QjC{S9m0D7Je|6Kx?K(m4YN*ju$X}J@|j_uKR^Yt&ojw!FG#sIyfq^#)D z;xYWKXivLQwJ?$P)3dL8j$co~ns?QxvLerCYF)z|AZb<^hi|zy5$L4~rdw2%TRsgw ztuR=QVd~L=02~Gu#!7ji*Oe2Z<2jnbUve%eD!O!zFsSk<_29(LwTc481)-dva<4^&zn1Za{`407>T~%ynxRbh(4;{x3Hkf z$I?|HYBf;gD<~`S6_$rei&XNQfUhWko|s=!rq(?Z;njST0={YGs5>n*x1jRJz6rij z^L>|NX!#}wO6Ja+Q(k$hR)8!^PPGPRpFObX?19-j*;~t;YMISfK7hSps>GNn;&b#= zvTwf{=BG3FF@`K(U{PT}&04;N^WZss@R#(|Y;SbEmF0u9rYN98&$TZ{OB*R>dD?-_ z_vtxbuK|6zT$}~P2z!wy7yY7rnXe!SzEHn*biM-VL?IOOa+#v zAN;AZ7GEhWda!RwX`p}|A1EzF@1v~I{ij!IbvcztPnw$9M1J zgrjp|K{cl)U1EHo6skb~SZD9APL|KlIp4?i0xd=lv3+_+cjJEe{#!JZ8TKxJR=knL zY{OSv4u`z3>QGqler531KK~=VxnG@U`NqL;)Vc|}D^Q~@&SbUbRIC5D%Z||!=hsTh z3$PaU6=QYB!M=Zfaf8{^Go6PXu^1C&r<1-KxEK>gu|WnN#Ja;bA&0~E^nux@!vSI8 z1P{zn!d09{0dg__j2~mzMHkt=@?xK!m(4CV9Ex(GMqD{8#3z>PpIlc9#k0AjwQ}?{ z+hY`&b&J%PQnoi({Tmw}SYxV%kSZ}(jXEY(U~NrEJAQmVSShO96ex^*|dH#Oer8Jg5rN`D{em12S3MEL+>q#UwDC8 zRS@I(Kb5~Awz7+@PKwL1&S!HtNIdc4R|9H48aG`V+p@UyDY6@7-Ns^*MpgfBh+a9z!WtSwy`p+dsIn3(U0Gjp{Ia2A#ww+cDk{P>Q(jhuC0%rw%tbH3 zWpX*HRphPixKS|aR0e{fN-WxZ14~Qx!;iN9J=mE|!%APRKGAMjRgMdI;_LOT=WO8M zV*(sXeM_5jz41M^ytF7#$$9v@q)=SBj`2JLrZ`lM$}o1?Sa=UjFOIKOX$`E(8dzja zn6hBFFI0ARS+KmKU`}bknmMrQO364sE~89_18SU)!CC2JRZn)Bi5#izS9!5XhJ96n z8gSQ@%BetCq%bv5%rgaUPPwIslNg#3J^hEggb~gez;SHB{F2h@9*oEbvrjO9ri`wh zRB#QJG&!Ej9Th|>NBRDZvZ8>tYj|m;k}B=i235qZJ!7j#S#nmL5w(f`M20dB8O)2Z zsRG_kw~CXj^041Wl>by0u}&A}W2d2)Rmbn6CcR|%K2qUBWTVF@^+fw6udJl7ya>lV zWrg(6Q%0lT0*aZLV~)Kat67K3)iGnyLzQf=L{vtOhg*sJ!$<*T+o*v+6arALb z?@nvV=u2_($9&aAgXGA`H?ZoAIDtV-#`(9=g2NbtRT(wvH(+ulgUP_bmfZ>>=jYXpwM~G#ffd zc*|VeWyvN)&2GIe&gfP#QpM#LptdaW#j~&`HYn7^{~Rx)A7m3le>G+F1PnIJ@$9fF ziIMw!%FlP%Zh!m13C_g#d34_g0u`{Ly=Wi@@ZXjJ=9rBf_@qvxd3cfMX*5#2f# z$lhP}VIXPR!}q5bU7G90`*4&TD44IL1)|P4ih0KHpU52Lfku{n7l){w{Wsb`iQ`WZ z^#O?%-Zw~}-SD)$Y%Vv+oD{PM@C4nv=pLZr+V5+e3+4gdWj!v{<(}OZ+muWCe+#${@53=37ZWoW1WtHudZ3We7byc*Gh4Uw=ZY0j-sn0ar8I)HB zV@25yd}AP@MKiKW%5uti+eVdrcbWO2s^I7V=NWF*vaEUD$*gySVp#|5y z2enm>uBN7WJWDB}*Qe2*9aB(IP{{jeYSYui7@kz&#&A@Sm5`;!a3(Ygj08qMoCOtxFX~Am%4PtU7pu4PBR|Eg38JQb>SWp53AL(pjCBENktCM z0C7h_0a4xm(@;Sv?&IY0w<4~UfwIti`up-qk1|fixw6hGS63boTwgU97bQA@7Ni@$ zPg9^N8j5Z~)CMONl;NtYQs}XIjHa@^$8-_#vfK@}dz z=w+JM>As%hqqq9s*5Zz=ZO)DE_cL5TY?H9m%D zClwPMM>3@$eQl&$U|G{gO`SYp^0+KnAy8XzxoT9GmK0Rcg~lBos*NqKd~}vE5B65m zJU>!?4(kDR7RdU(dAO#*$+McH28Mids)M+k!IoN4_Z5-zAoZ`@E1VHMc9{~a%q<_! zTOM3X>wqpmZ(@A^Ta8`%2&Hj8>3IY3n99XWw`6|3Mun8moxHO?z((jT9;fKxS+Ur30~2e zQT?3GOu=J1yp_YO!^EjLKfZv-l=70YAnTh&myE#Uy5e*AFt0LzCr5>W`S4MC&_g{_ zFgJ|BSp}X9AR8TxOtss*w3yPs6RG!CW)5oUtb(GeF$oaI3cRvl;V6Y?Sw+C7;pjC` zGy%tGc*Me0pCX!tJ3qAs!2^Y=(bZH??+kJR3rg?^guPm>e6m04GkeHc#bt$-hkS)2 z2g-g~qk?(?fJZEW%8K$*Et*xR&w14}g9{OoWh1KiCJaW6X5#T4fp&L_MD+OAf`=Se zSx_;rq_E1P0O4OixCo!hxPdK+`%7!TEg6AnTMxFZE|mDG6kvSMO_r5t#Ah$HtkaG7 za>Nfe;&&jPY{c(H{0Jld7~<+FE7C}xzf*jqk-r!5#E&-O1&EvSOho%lenI4?80D8Ce!LN1gZSM>e8i2G^{^5D zv=&c;jd&vHn{oc!=wU|w$%r3f#0Md6wwFIDV(RBYT@;X`9{3w`2831 z&HnnjM?AAmDg%(7b+ct%V$kc^f7|Ygw}+ngv}I|$z4f%mp5v_o{O}-O{gHnI;?EoL zrSK2)jQGFnPrl1v^z=79{X7)AjCeMbW$I@g;^ufw zx+C77eV4!Q=})#`Jeu=K&+*yQANBNC-{p_~2Kt8??fDpS)80Ps5$9yM)F{6UadW=B z8*x+KM-VsZZ$ccO7gB$;=RJtSgrf1~Yb*;>S~Q;Wi+KB(f_RdVKLha*M*Mcf&H4Nu z#7%h~L);u+4Tw)P>YM&mlKViP2KqG6r-42V^l9M#Y7HC!>0Z0uvVOeKvi2^)ya~wP zgd_C+xYk^Bk7aGV6YJasmUSoaBM{ySS=OV1-xI{z6nF+g8t`_&9E46RoL;=%vUab= zH{S!EU5)RX2cEr%M6pi>pVdfTfp9HC5TOX+Z%Cg4I2@rF_&kJJ*IHJ8#K!_YjQA?l zr_7%r{2k#!0Y71m2d2!rnhT|m~!0UVC-1B9axEQC*gZdvalypF(ju^s;fd=tX`2zMe> zBdi1Ms{zL&%mbc=Fb!ca;?(a6fO`?A4AeE-%|028K-o7#4)*1PfOjG+rCbQ?>r0si zcoCo{?-9TcM4*klb^~;W@F>DM2DI@mz?%_nK)42>`+Cco1DK029D!vR--tFofWWeM z0Z_r{{?XV zZWrZufb)mDJ_5cFILGxDz{dfn4`I7LJrOo`txo?4_-Vjd_fp{J34RK2`YE=hw4e4} z7TWgLV{x8=^izOe3;fvYv?-Zg*}e$yerN}Ez6v;fKGVa%Iad(B9yt9pZGhhmnGKva zw&Y4po%81-C>KPa-yw|}gk<1<0$ho}z2%GWVf24KLx(V_zP~;V^l6|^1AQ9k(?FjF z`ZVzWoCbFH{qEtff)ja3(OIiE3imlP+*O~RRY%u+$gY7;C6u>0(T2c`jzk(m?3bu zz#M_O0*eF&1=a{$C2*a1A2}~B4A}~#0y1;${`wR35%n&$8V5Y#K0*4D6A#kL?Y=Jof#|xY& zaEicOfinco5;$96k-&KZO9fU43<_K%aIwIp0&4^=7q~*;N`b2ct`@jP;97y}1g;mj zLEz&8HwxS&aI?S$fsF#U3TzSBDsa2N9Rk|~whQbK7!lYdaF@W{0`~~qE6~E550397 zfyn|>1f~g07uZi=e}O)M83G3h%oI3O;BbK>1dbG#Eigymc!3iIP7#> z5;#v_slW<>L4k_|E*7{{V2!}#0#^uJDR7m*)dJTDTq|&$zy`p>q0dH%Zxv|a?F`eC z0F^%#*bgur>HPtZ2Fw6F3XpGYSUv}k<;M$LDzHZ2a)E0Ak3hKwi8l(|DzF2PbS=DX zQ~fP4Szv!a)*mnNi2|np(tqble1^bTl0IAFMFQtZda1-K1O_F2k;E4ZTq@}`5??NG zg`}^P_$q;`C4G&=*9u%G>FXuFLEz((zER?v1a6k}28lNc+$!lU5^oi_UD9_*yiH)c zq<2U>BCt!+cS(G=z&(<_SK|D@r0Neq>N#2BDFV|ZJze7c1ooG7pTsi+4wCdti4PSx zT+&BKe5Al^Nzak^c!3ioeTu|$1m|NH;Nz0MQR15fZkF^0i8l(|D(Ni}Zxy&*(sxL_O<=pEcSt-UuuIZ+ zNqo1!J(9jx;?~pBzksTLC7vQMP14gP-cMkENzagYCg35kj}a1|A}|;5NTkn}c#*^_ zBp#IbQi<0{d=((x$0e;3xKUsu;4w&V1;l5uk|Kb#&n|(x0NIY+65k_mucTXe6R7N2 zU@{=fr${_aV7jFDlX!oDK1t7z_#lCql0H=8!v&6z^c;zg7dS;=uE1FWXA9)pMao$! zumX_!y+7TuPKLnz+bDPhj`J1ZMRiG3W_6|De9PJ*IN!K_BRJo_o_Cz4!#A-Ng7dBHuLS2C+77|_w$=xJLI-67kmovb%N&te^l@pz@HI(7Vy^v zpAGykf)@e*Oz?TYzZSd{_;IIdUh{#UCU_a}F@jeB&lNlfJjsfErvbX&N`({RnrW8c zTqj*8IM+b;5>LSAatFgU1V0z}mtOjX7=y@XnNu&atSbbsJJ+)61fM+=pS2KtFKq80 zg4brj2fzui?qeu_wBQlY%oP0NF&KA(uO0>63Vs3b#{}m$jJJ4YfWIU72H>9vemG?A zcYw$Ve5BxSOhCU2KICG2K3VWjfL9A12EJ18UtWsOY6w1avSs~N@H_EA=xu@z0{)@k zznTb}fzsK=pOxbCzk+WpgZ&78`#5|KTJTG*f&K-*Yd+rS3*I~lpU)ATKYjkD;2(ni zXM*!buaAZelGjw=X9ylb=UyiGE0^Qv@&rF<3f}w+{yc2{dBLv(-YR${@OK5@j&^kl zJ`(9)3;td?cpjwr{t37bI7EO{_`VARpJCt&4E$FH-lTD85B|r%6AzBj9AMz%3_M`q zj)6a5;4c{XI|hCj#;YguK!qn9LK%K!;FAn|mVs9qxNYEf8~9@e{(A#|$G|@}@T0&z z!O}9EYv30fc)-9H8+g5e|I)ypGVpB%-eKVXH1L!|V=@dg@QV%nDg$3&;I|w2;|AVj z;D0gj&kQ`}uo&L~27Z=-|JcCC8~Bw5e!YROH}F>t{0jp=5x&sV`B?^jfq`FX;MW?s zYv2zV_;Uu{WZz!90Sic@TCU6&cL5H@NEXZQ{kh~m41BYJzh~fwV=?RL_6G(&(ZH`U@M{fxje$RG;LjWQHUs~MfhVRZ zz8Ko@jT*-&v#bFIo@wA082BXyKHb2J4LoGvH5ymE))@E(18*|QzhdBT8f7{S{6K6j zpf^RcpMjsHaP4C+(do+HUT)yC4ZPOC@7B1|!v+KYgMq(i;9nZ};aGn|9#wasfuCpK zegnTu<4XQTM!IdJ*J)hI|4RdZ$-v)Kxc)k*JvtrU8?qd&s`g4E)CiKH9)182A(epJCtu1D|i;ixjTg;u`pU2L7ahHyZeM1Mf2M1JbDnO>=;O zk5PDn($6IZKFz>qY8=L+FV9I^MUtp%dkpd?QoF%YS;9`L*1g;UdLEvVAEdtvFb_v`o zFy(&XFECT!NP!at&JtKEaIwG@0@n!KAaJw57J+R7y9DkPnDR^EFECT!NP!at&JtKE zaIwG@0@n!KAaJw57J+R7y9DkPn6ggz3(OQaQs6{^vjmn3Tr6;fz%>Fl2;3~NMPQr2 zE`fUmraU101!f8yDR82|SprK1E*7{#;2MD&1a21CBCt(hm%zOOQyvul0y71U6gW}f zEP56y2H_V7_aJcpycXd;1PodJWn<`AFkcHMWT6`^sM11nEQqYW zFYyt;4G51SJcfY3>|f)b#}R&m@C3q>2pbWeLUSgclLEAiRXoi12%aCWK~$tq9c39}xZvp#|X;gjW$>Luf^K9bp>+{<8mwf3_pM zf$%26TL?Q4-bVNn!k-b^5dMPj4g&tN|B8Rw5#B}k8^U`C9SDC%cpu>dgb2b;gbxw$ zm)(hfx)44>_y@u+gijDYMfeP1H^M&=K1cWh0e{(h@XwbBUm^SpVK2hh2;U%dBXGjx z%IW}wB!mMI4njB>AsOKighLSyLr6h59D!$4++U|5;4k|~z@rfQBb6)?EBd+miQ$CCkmV-aI(Nl1x^w86M<6&P7|0bFi+rR0;da{A@Fj6R|uRb zaF)O;1zsgEU*K$k1p?;?EEHHIFd(p4;9P<81eOTATHrMTO9jpsSSGMsV1>Y+3ak`Z zB`_#3ByfSig#s4|tQL5!z*XtGZ_brCZIypsf34EdxPOtCH~|5Dn27#MMBgQ%-xASh ziRiCH^i?AIDG_~?i2g}L-z1`66457#=#ND7MI!nk5q*#d{U<{AiO_o@be;%(C(cHI zo)e+tMCdmWx=n;$6QR>Y=ra+zOoSd2p~FPzFA=&+gx(UNvqb1C5xPo*o)V#>MCd0G zx=Dmy5}}hs=pzxjNQ52|p@YQh(6Yq{OAxL{xB+1)!ZLp0ASgj$4~5N<|Tju1w; z1;N1(T7lpq+=_4;!b*hO5q^eHhX5TW)Fa%1a3{iQgr6hag>W~*8iZdU+=Fm0!dis; z5bj6#CBiy{2M``a_!Yu>goh9wMtB5a1Hz*Sk0JaT;co=12Ap#kAVge?d!Av7ZV9-#@L8DT5J%Lso!_%DPOgjWz=MR*ON z72$P+Z3urv*pBc9!kY+hA?!eS8{tm~e@19S_zS{22!BOrM|c4 zp&Nn!!7nCYT~FVb0N{4FJX+qU}t=X~|G@jbo@TFUb$zjfjN#oqgeM^#;W<0m2B##`Ep zZG10Q)Ip&JMSdu4ha^A}0#0hg0I`J{NG3BA5}jnyWFkp#ASY&2Y_SazHEO`1#Dawu zd+}bZfS~9XD?VTPls*r(^cLUJ@1;-idG&kg^V0iL^Zk6*UT5ZHGRfH9d*464FL^ku zv-jG2?X}llYwfl7IcK&Ma{cJMo_L+QT>K1*)M)1i^UZM;i2jd2RIcdx!0vQM!W?_df_L`ol>PO%UT;7(FrG`%-`A=s4J}< zQBs5;=S0Ynm#!a(m!my!(w}p{r8yv54ls3oGhD@)d?=~YXmUP(a(<*tjWk2eqhZad zE;trKTf>Ywitscg(=Ytue^PbiBvnVwu<9e6^pfT3 zZc|_&$VQxpfa7AFIVCYi3_EZrMcooQ-+G)V9}2p?>_VK^07Fhufqilgb4h_tKCB=` z5t-Ifk=CPN%*ik*Dk|RPm_{!IN0X|FPu9mJtqnD)dv69Q6=m2159Z}@BBP+=XOt}u zHP`#Y_1}^?FI8bjofj?^S-@}L2p}UCoGIeU`a85RJ;{A= zc13ESfkWAN{B%UbI;<%kI&CylPt<0Ok#>$L?5>)YQ1ktaPf`^CQI|7R2bi*Ca5A}Nvg3NraG({ z$sI#_WH7EBDf7_CBl1cXuPaGj5ce``~%2s!X_bEq!kfgBPvvD^ zs*~KAFT&6R#hG5lRfQ`pD(A{b1fh&Eup*#=CZ=7GaL(-9!FzTeJ7V97+rI$BZy+9b8kZvR$p=&Az-LJ z3{4GCGqP(VGUe35oUmmAz%nhN5Ol2;t-w3gMnmDStjGduQDjXh%8j&o zhT%*!)g!aMF%+$8j7HGxeTbEvP@=?~>pDF1PUXv8a7inhK#sGH^M}c7BBP?2VK~zg zZzjT1iO`VG$VlS$g&<$-58MY$)$GLRpzv5|nN?i{8kEz9P(y&xDIkPvRYkb1*wC_O zITj7WQ#h28(T|a7OJfsG@{K~sEzxEi<&HDx8rR@3$c9L;mHwxyp{^>}9#@PkRTQz#wH9WS{DL6*C#z?fjHn9zc!+GOp zAm$0K-Z&@v)VzAQHwN)}=xPLK%C_g#x0v0ryZ}xbz7M(@g{K>fum6(v>Up4ReQiC? zNBl%xP3Xv2*=7NT%Xld<|P$(D*j#1ay z50phrd_gc)51Qd7xE&la2S2<0e9IUOLC?n8F&wK!9vwQ`ZsZs(8a9)6tvQo@0u>&; zvT+|{@oUb_OtoeH7jv6(8+@#`Q}dmg47LkpSKRE0k44pOv=O?8Yu;t0@&&{|B5 z3@s9L#;8%{Pn;UA`!K15iq=O6SQ zfB8tHrnL&wT7XNIaJanL2}*d@v@twP%6~Bvs4_y%iQ!3wbwc4YZcEM{aucw|?=@3t;zKyvq7RFjQnWZ~hIlglUc zi|Zhs04@(SJu*Zb^2A`rRd#sEqyy(iDV6rD`=oR1|5`Gm)RXS$5##Yy$tYzJ9)&`U zEp?G-;#B%kibfFLBhk7}FotO5_bM;of3iOQGz@5d?d*oBHT zn}gEn2a!&13wW{za)Mej%#p2T6B?(-Tz$FR% zA0dH{KlpdNuE(Ebk-xt&_n*eAiSl|k-Z{(ISXEWAXhnr7koX^O7s{W&PvQ15y%3^u zf5c$<|H%5E!>g0kcpZ??%5+NF<})ryR#i3C2U^-2Y9e9o9?c#}qooq{3vqfL;4m85 zO3#C^o$E=wCT0Fc(s-~RU(L_NTb+Oj8t!|B{@5B(3aR??BfR!#<>ItJ!gyce6>x*~ zK|OXS{NXt!cO)M_IuFcv&>(cv7-wq8{}_wRoT{plqKYC{uDlID0T~Yg=mw4ea8@lb|_*2h``0S9=KE{KqSCjZ|gEv#N>Dxku7K|1*7{ z0XU2X`|%hFRaG^H$ENY)3KYXw2z2uSz0R0oXaukaoKT99eEhfrZ@d?R2H-G0SY7@` z>O`_UUfqv^v+$)lp_>mw0RLB2)wHz4Q%sMbaSmwEkUuvK=t2As_v1dSs=BNAs|(|K zxH*K2y5PXLPJ9-bXbZcY*xzo6V*8h`7^JLkRh#;w@!xA$~$fQqVwszLI+g za2O5x3Hbvb;TEmWjFB{6FGF@EzS1Cc%Yen@k2LVGz)7Z}u>;5+&>$Rz2E^b`5E{wH z8(u?0;3zcM7ZIoMl7hxj$OErDzX3QJA5G1XXe1B`3yBncd2;}mTzsiQI0_$TD;~p( zhZ(74`X<{i1dTEHP{)gc{2SSqx3ZC4h_7V`N8y7ymXJvb8a~v8lD0&HQZEfi>t`fI|WswS+OXU>>0bFs4{+A>qt#xvquq%*%3YHq>9!Iqgt1_g4~ z)ub8P@Y$QDf9{F{uYGpI{~hi)eiV7+eo!~u zupo7>%ea_t4+g}VFe@%CNn9;PS=;?kbTQQF%e|Buz)LVt5jq%n0921lw%bjRT% z4eOS4{kWq(nu_kinP43_AuIe=<5uL8ISBDgACvB4yyb_00mGb{b^@QEKgXdjAFxsW ztu4(n@eGg`pDWHNnjy~wO%?vE7k_Hd8n0+(a~wI=W*ldNND`ffwqaCQKG7~6T~c|Y z0yBzTEwc{w%e3LqI-~2#!bo#yY$b7*06F}zjXGS?20v)w2a;pxBPk?gno8zHGl!P} z$xDBiBydRrmn3jW0+%H4{}%~#WM{rm{H%4^x(%5xbYzcvVVxalo43)*=-Rj?y6%y2 zFLaC_=cJpK*jXNyKbSFer~qX;)?eLL5VkVx*zO&6;73Q-JsW77f6mJ2$*{6J4&2<< zJ9)_VS>OC)$G5I-v)Aq{?Cd^k6>YV03!b$y7A%l@yMX_N{nYL~ozMTF4fk*Npqvl! zIPomk`NqGsEx1m~?p=U1$_(25yZ3ec18BDGEI|5kDHr-x8~E7I^2qBVO~Ce<-B^U8 zT;V}0*E`v=3px#58$5ag&mQr{o;~ps^oM=-Sz+IT*U%Q|&qrJKx}Dzn3#^R!s5AdM zTvgKkR9Ab4w7o0X9(hKamlga5b$fRowcpx(q+kerc=O-dy#M;_nYmD!9?-W-0wTaM3) z{L#hJS;JH0{WwqL!)f!q-DeX#MGlP3Q)CPIFnSZ&B)ntnA-i*(&;_)+PR6?mJYlRk z#(gzA=Wv{t*ytKS+c-RQQf%XX$2MNv2U`8KjgCL(w~1{Wyt%F8)NQnno^@9*Y+Em zZQMZ7*31nup2)LfJ8iTRVjDev%Zqf(Wqa;c?10zvo)`v>~uS0+zQq=ZHFI3o{WXJUJA1^ZLI(NQKXbAZ;|$!~I1auZbO!P>`@NkQOW>{% zJ%oRvZy{~^LfRhW+M7Q>UwEJNzi_LSjkKk@Y06Unx_@iR7E0N7DFZ26i0|#M!Tn>_ zc-6}u(F=}GY-bTnKelEupZ#Im!1Z?@*om>cudDNm@3eJpIEJOYk!r%MC-}VCV<2{58 zqrrZk@vrxOAV_9=rD? z*hcxRg+oIfnO98^pEGV;8|k@y&%Ej23-&O#{_&32x`saNn)Y}{_j7$&3*gV6{Q79B&^Oge}!O_U|DttV2HRErXS> zf|lW-?jmuN0dY>g(_Y8Ho7>qQ`|k9+@HuOeqX(Fqf_7~Chd!(BWr?$>bI>b^En?fx zdk3E!@V@or9`>EKg>sKV9_>XBScTM0(Z|3G)u3?!xNl;g~QF;Ahq zH}K>kpA{%2&-7i%Jd2KQ#P5@!f2dm~V}?1%;T^O-13uY?j16gU3{bWle(WQ~%}LnK z_5wRF2;E-u3*j}k9dpf^w_W^9@>w;nIAiVb#Mp(h1l?Ii&TD#UYi6vU-v=78gYOTW z>cCuq7&I>9j&|^h`GWJV^4wGOz_=*u&A?MCp&xs`3H29I-i1Gg&Q)0%`87}2(7)UT zxMx~?*3-}LV!nwp)?BH!VlTMPmQJLuxA2fR&pc(cJ5`2%k~hPPUYe_>A>$eRtG zNJDX}l$RCCTd$_Yr@DBS|BqwqLj_z3-i^g!#>NFGD4 zC{KuqrnO=Wso$XY)u*tg;C&O@r~b|#qQ7{47Iez;S)ne;|Bd98cOsr)?Bspx3FuoW zWIy?QHsdD~hllQFS;|FZ3|X`9C^wJgs28}OjXp?U$+MQ-!#07tQp#Z*aesNd-_Jd9 zC}qEqZ|Dbqt^KYW)^BM$cv$=G<(Sd#*`{~!iQ_&iI5>SA1`SY=!t4tR=aIRJ$DjooyU5;P)~P z;24odgU5@*? zEZ2kb!*u;2#x2k4S~GB^(%h?Q!&l_1IsT!?#*jv1buS`#(ee zSWkEaUv_NEal>czhjHFranNi2p>v72QvLo-6MI7|&|ed-`{H=;5x5* zn~wDad;OE=?Jdm19QB%(Vcvl)@Y~hK{~xp_X*uSFSXbt_gC-u3eoBnnf5mASr&xa&c%A?ItHoZ$-&P%_o;bebRmh2Q9OfTHzR#Sa%pCc2Jb!arcmETI z9G&St@C@v^s+DcAk9O>tjp!f7s>;vtpdNFq99?!|RNxEae#o>FOVQ2>S34H!nDv!u zXNq_5yXgDsKaJha>XV}HSQAh;JKCH*gQu}B?3Wm8!E_V5ckI7ed>r%{{%`d*+PKKD zcw;$zqghKmVJ102VQdn~X~0z zRgYib`b1>n?30uk+mg7i`0*8#gV@#sw5^LhSPyN$T6<&R!HlRAyB1Ja1JCU64nBH< zu^HMy48H0ES#xJN>+6gX8JAAjIoh{lPwnGc8ufOWb?&MIi9UX3Pr+|MbKAHLD0i|8 zH0-yY-eCWC_H)(aW{zHUr-9#iQ1vjDSesY=EU`9UHC4;4VoVGj*R^@&Ze5#i6yMjy zwfQs9^U9Z%p2tQWao)hjy*_KjHRNyebC0ip?X4KTMz4GydD1_#Mt^!E=zNgS!>4<^ zgIg~cTc{NMCr{|xA(VTQbbD$ZC(WeweB~pcJKn74E9YTN*(AK``oa!8E`HRp6Z#kG zRop(fXBzACaxLVHBV?aJow7SN_t^*fPW5GOCa*=(XY39dyYmbnr4CT3c8fb*=;#k;;KGU1#U zdoq{ts?Yky0sEOgi+&4yRU^HdX%ky~L+sz~>&wc2{oB=C69NCI#6r^6U6bvn`m)Ww z$2VGU?zV;s55Q)S$FZYd?LN>q9(7iFp0|d?KS0(+Z*eH;fa;YXZtl zB^~mP`>Ss5&azU|UioLw^I4YA7M@mqkf6QteJ92c+UPIF%7V@u^}f$Nt-c(eweo=4 zoy@iDxA7%?6M>WYukfH%M&0U+0T=jA6UK!0;kCC}URS=2{BKIS1nYpncY2Wavt47G zPmdJtc9R9}Vu;rT-~{cgrA>NEE`ojESCchS26er7M{ z2zf^1GtX!W?xoFr?}TIL!*E~4K1a>>_K$|!Q1iV3H;z24bLgV3UHmnYXR#-XzQCXKV7`Zb`Q}pRDQoI6b=@1= zFwr}>A(vz6vubsWmp89TUr8tD~1mr+6a`K%>#p(pK~hpaE6OpYm27IN}5{iV*6 z86MQ}IAfj<+TOqhFKn*ejA_{w*ayurH1GT!^qOr>FzdgvE2-y{ImefIEayEedt{(7 z?RV5C#wOgel9-%27lhvmY`~Z)Ek9+xi9uwG52b$YV-|v`f`gg}{)@8rJ z$5dnYcU)uocgK~~HIWI{UMwg6lVj(^RNO1U-qCA_#htP2c;*J#FQI<8#}#`fIrM8Y z@WwIaWUuVrZ}j2z56EkL?fJk%yU?zOK9T(7BTYNS+FjN+=z9`xRw zw0{_%NO!_dfZjD~_dA4!J56U+1-a=vl$#~_T5|j&?(q@0sNZRXD!;K z{g^JYLi=W(TCDcx+XNmbkO$&@*5V?go4$5eKh7of`Q7t#3vUXw5H4a zA%5i{%+HJ7RypTLOdoG=(MO4P9v(luorlM3JF>qGna^_i;Im4eQh81CSqmF*O=DT1 zE&W*Z6w4weX%d@){Uq=0(?;$Xx;Wt26=Smef#EhaZ-J31V~4r*>rQn)U{`icTX)JH zzE@wt{dMlwv%b%|Yo6+Of!)t^$-642iQZ?rkDv_pLl#{n{Oj`Hgk*E8slD! z-5q~4^@g^yAMB6xB`Ln*97F%W{A@&X#qgeJgI(OKEoqO}QS%uxNoBrfq-#yW^ zS@<*P41)Wnrn%Rz%e9Nw<$Sxom?g%8qS%Q#hE-PTcSY|7AFp!UC5d=ljIC-Q{$$FY6#LLSie zWNo{S{bJkflj)0ZQEDCv-*xeTwaTbGgbbZU>x`dX)T%sW4dd?kmf)b@(;dTwzDa=jB;k{&UpL`F~cQF~w&s z_?gi`Yohn*t}@8sGU)RG%`5MG4)eqVA6iBILx=JUF%A-|mdrD8_qYl1_=0nHtgF&H z*cJ93qD{>IQ$AqFTAA-B`mD?o#=n+K=9>AAp`m>JIC!zYr3vQ zum&tHj*nI~7T z+hq@~+h^v=d53$}JzN2qWV1}y{B^tNQ{i_lZ}G$9?SEaj7k;;}3%(Y!!(89rDAQ4_lR+yR4wkDtJ`r%UYq> zFYzMm4r6)Dv|0SFtIZ3b;>mUw>`(M$(c|bZ^l#B_)Hy0K9`@=f zBgA-op98+8=$o*W0*&vcur6f-xtv0L_9cnuro4mLs|$0KZz|kHrJZB`lLz`0y6bRN1Y zXZ>$qMIVYv>ANvUjW@C{nrr6KB8mT~Pi9SF?V%lWO_4kwaUNpaPJga`M|^Jw?3w;A z*`^^QFZy|f_`|Ih_0(d&?Be#5-OqtHnFkj#ex+aD$hm-Hg0aE6b$zbt$j>+iW^4){ z)Yzt)IHRlid_Jl1Z(&ILSYqntJNqwO2U^r8Z)_c8QRvJMlc2NbO&pY++vr|M{ku>4!Z_aPi@{$eeG%PS@Jc*RW2_acd$uIoo`!1fpGz!nxXg>Vt|9qeFRvxfEnVZ45KzzUK6S#c;>-7C|GteIO1-^go zFO&{^|2nS2;QQwvmb`->Pw#vka(&>m@%?DS*!27&%vXD6U4!=_s((L0<}B!RDqWYj zh0hCqo8RV&TlUZ&bv?AL!gWGbVk^wPRS% zoBK)BBfI$iY%?EW{LP$@L;rEd(1+8Q#`ws)9h|@J82aefj*h@rAMQLTac?>OpU6Pp zdvNv^_*{nNJNmJXGOsEJlBvo6tM@|Ddjw=_<7WE;ISV4+eN&GJSU0G zF>VEaD8EvD+&AOAyx!(9Ht7}n0xx|@yi5TvTl{1etI5*HoqhBux zU*fC3a+#LH`txrmtIcBl`PplbuRbF0ef7bHU(ynOy*mxRd56usllKa3g?;kI+IxJ~ zSL)T4E93onu6@A7?q9i6Wm|~YZX0=oUR};-0*GF3!T3a}UT8KN7e<47$58H&0nW9c}OMiX8AvE~(6Z#KCWKF6-`w zuJuC?4?->hvj>McpYQy^FST~~tS@u_l)9DN&N0~7e(YBlNZA3r^Bnt!^Nbx9Tu1pX ze8gVSypeME;ytd!{O!HMz80~!ZGDPyF~@`BTw#6cj3R zUGt%X-$8#?TN4<+ZNj)9cIkkvZ`f31)ot=4wkxut7+>1IjVp#ekuNF53M< zyWW~EWg$<-?eidC`(K-T<@vxiE7+CY++%clPAl~ddgnK`^OXmU?R-Voe_v^ZejTSi z^L+@nuUnUG9p@Z6x7xCnX8zsBkRkV=bFtR4A=g5#-;w8qEGv5uzxH5F&~q5E89QW#7|2sq+EZ2d&Vt@z|MGu8wO?$HLFI z@%w|0%W30Tlhr3pv9H1SfG^qv+jo~Cf16)zpJe|-`=stSU`Ja;-wH?CQFFD=y6q|Y z8`u%|j@4dU%Du7ZA1x+v!kae zEBZgvb&u4f0RM_4_O}NUhe)?`y{SyG!_Uh_zliDySDv$wS|80`H}dj z#a!QBX!D+iPTGuYU-CZHbdEAMHaL4*=SIZ7_`ZdD)w%T~f)@GS;SUcX)N7KKHZxi2l?b`9sfAcI7eR1r{nGg89oNarnGu``TdwkZs-?2ZO z6Yb(~2klDc9Q4Qdi!Vh(pyr*vv-ram49{ZWbAluE@FT-4!-v!!?mo}*X!5&NgyQaSdmua5(B$Jo_ zlEz$*a9%{c5|okeZp?mO{?g8^6FHxXpJzDIT? z$`R`d;mtLc9LKrWui0f6^u0a0_?4LF@JK8qtIu~c^6|$+2qjIc>|HXnAcab z4EH72u8iF%YZ=#=m1}#2Xs?j%!CC2NjgbvQ)_$20|q;&(|t2cWd(Gd1~ zGoa@g>{E5Dp-E|1o3-|wsl)kh>;>Pm-F%zjlL7r>D>x@*arPRWMRGIE!DVA{J_A+R%XF#oY&V(@(zYi34e#3waCnC z;0Ky018+_E9PWdld#%#F7Id={bieY^7<4ZVr#s_K&=URk)-;UA{dm(x!z9Sg9@Pe^ z&-4{>yZ>JUcsAXhnA4^`YWT^L=k(swurK%;?itVZSeVzoBJ-!pR@VP!fAVk8|JvzB zmv4dp$ufSxWk0f(hhKH{Fu}u6dC_y$x%_QbiSb`EA5l4+4h9 zi=i*$Gx`obyT@EfA0y);&tmYrasH>U|g^EB#((5%PtO1?9PPj@EadqJIm_L_+KAltP2gTIU0X_`DKp1_YiE4@*MXD z>fchtb_yRG>SLb}Lm!bj$2QL)yn%atK5N#mk-tm7Nz5^G>`jj_oPyK{%NiL7I=&Uq0VCN^Wa?+iHUAr*->+KTgA7s=I0;GxT#~& z=i5Z@v6nzRbw7W;RoHW_<<0vS>txSr>e9_l{Nm%cAOE;I1Ab}F6;cmrv^n(H$9N{P z+N#@p&1XcG?8(NSsrREjS2*Y&IwpF_=Y-hz z<9m11PxS$nj*fQx3g6&BPdolCzb)@iR%Y+yKZ(9VM#uS0DB>oG`M1GYJW@079AuMW zXp9^3uFt%x?^^2*o91Uscxrv-#LZi+bB}$Tkpr85*VLW)ChY-!sXQNe_QN}X_t0d2 zZ~9JoKY-7^Uc;OP*-@{(gG)+GKRxY~k?iMTj`IfUuy;4(OFkaa4|u!QY6EXU@L2uWK`RPA z)`^@Ruuja}GW3h0t=2L6ro0F4nv#Dl*yVLatjkzo;8pmG zV!v%-1%FRB;)Cu|$Q1U#SR3zt4@&>(AAT(FpT}|D*j*dE1AhbkyU|bo!E)^DdVc$K z*&7^>SzO!l8*$k37RYbB(bF%^Hs6b8Rzjzzu+NamJoc{;^NREZ@eO@4;)Kg)ZicpUlRjkw znSj6Pe7=XddZ>+j#ruvrpnqj*`slmRpY*#V`c076HY1l?o-*Tc^A*q++I$&pK2Be3 zKKJEO>4QJKclDsqrw=r;wL!ng`TlsuBX!rC^V`Dxo@L3+d-@tYz@*M_8Cg86cG}`t1`SIwpx91D+&4_2k z&arnYzw3Z^33}Q^53)h)_r|U~T?*eryqkDu)cw2#^E!RpYqIxc-cM%iDD(Oj=qJ8c zN$4lu2mY}&KHumY);!nqxl`LM{m{!FBEL}DpJ3X&{xaFC8aR8Q!pfT8fgc^Lu>S7j zj;k|sI`cAfzJ5bC`h3$iuJcG!$2*tv5amQYm2Wh$rsX7)8Aac@m=yB^zX2)3-}F* z%z<{Sw$~2S1%Vrsyx(9fW3_v^w=90^t?C@w%G~VgDRVtC&#miOkF_uNM4&^|`Q$Y@ zdBAsNvX^3S37v7i3E`R?`{h_O-ZapYLisE!T&PtF0*f4nbo!_VwzLWdYLq0ED{4ZAON zg#07js`k$J)6Bb?TSC3w!PSTXb5~+adl?HO9Yea5ZG*>S-$6c_D_$A@8)g`6xSo z0j}$Cy+$3r@s$qzjt>0bNxK(3zf7KQl<^0xQ}h$UBWxA<^8E|S_Su_4r;%RAw!M2+ z_o6KH_r?b4!$AwbeH7}YEVvKceIRt4b58f>+CG#il{GB&4 zqQ6b$)?<7#YB{!QU%ToQpWSIJ7o|Omt^wMyK$&;2(rd2^P6rRt|DN@$P9YX3BY&JL z>{tzcyDK;g_&X&JazWnyg5OXlD)FvkD!}Lt0`JfXTK;KX-83(20)i zH@Ash!@oJdf8_XK+D9k9sW@OA=eL_3M{eW%hG#dEGiX1YBk-M;Jj-5y_Bm$Y?bLkm zwqOC)75#xdw2kfqH5l)y{QV0VHxqA6mGP&JXg{~xfxteL3$ZWkH|@m4k5l=62y_U~ ziJz)DL%T70KXtC^Ope`GbC!7~CY?IjexhcV(UGa5|Ah|>9qqh_dYG}X0PEFiT++9# zR$0*&_^(7-_{m2BZ{VJDKI^()pw0@dlc{wIG(C>#!mUHFGw2}vhxfUA_RBbRN*_8v z1O92sCiW9$rf3F}Q)>e;ZkI4@&g^hTo~I%j_p>I?T6j@Lx~Woa6pG z{Z2yuH@xE5+6J^u9mn&^9Q$z{3)ySB;qk;++#vgpkk^jRs}T>-j?gA`^C#3reUHd{ z+SrI4tFD0WtSEra!9U42|Sk-aw;L393$@5$CV|2ahf*tTch{WZW-G}UPye+!T2{p)egVp z)sd0PMCLV#S1_;Iv8q|L z67i5LR!H67)rH#M%+&pzd==ZXW2>iYe~tggZyeGu3NIRai7rTgSC^RndQJ&m`nwwQ zpvU=sz}4SX$I#zNz{&IdM1NPEM}HZwKb7e3YM<$^=fR}$P1#@aV`8dR)u2-@aVhkj zdGyr8U{4;tU&e3#%)1cme{9tX z`W5;d`WX6b^SuAM_w2{-xkw)(dK*}UvAyn1*6lv9sv7mC(^nY3aoukEb;rM;+!kp! zR(XMP(K3AgOF!tbpI#O0-nWYWs#WT6PM3J-x{&=;rGD#qovy!zP83wZKUU+iu?P10 z*SIH=A^vbE!LR+)JtwrC$>iH!y9#srbywPbmDc(Z)bhh zwI8T0OuFp=Y`#CEcV_?45Pa1x>_HK37y82EwTGcUP0~O35w=PHWykK3_Y6R5AijcL(q(>cM8=xBnUHm>Co(pwhO>ExnoI*XIZNQfB9pW9^&2yR@?yrGo z^X#1TP#^K~#H-Bnp)1V$50IV2L8+b#89BPw#PHjn7yCtf_^xDmCHePRSG*}YFEYAf zr9P|a!*iDc(IxQjvvTD7B=pJVGe7o;>tL?EeAbl@LdKM<*>}MD6uJz4mxq1U-`ArL z?`l>;;)7i&&94BlriF7qwp~PWtUv1nYuaKKqp)1rh6X7exqM5y(y$#dt=KW zzt4*Qr2Qh@YufwlWojoA@ZQ>k+*5;|^~$?Z2dxdP%W^2c-DiE~J*TXf?=(UdKI`w~ z`>H#JPPHRX#?r|3YS;H8SNUmske?SiSzzM0s~$CQ;-JU{v}~OI&hY>OWuyn6Cw)6}RA2+Iz_}bf8FN2D`Xr z3*X1XJFE1!KeTeV=aP>y-1|UzTlUDSK<_nNzd=T^FA5st>_K0L{g$uI=S*<{wEu^cVU1?Yng+_NqNjzSvA`X)o#wsy!c|yg1Kszk_n1?sKn$ z^P978iSkkUD(+h{wxUnuvmuU`OD+Q<^Wxj<@E#*|+BSTDrd^)@QGejGOiVsrf4}3i z`27prUvR}O&hHAcJ?Fc2jPnG1zYf{lo&%YU*ZT?fbCmU`PvGhyj|so|=`Q^qmis@d zSD*O|$DV$THsG}F#7nOFh=V>Y@w4hC#wmL?=!vX4#*Gsn;jRa{nBPr;9k0v3qpbrv zD7{l6a!oXs5?uzJqja{61akEKI) zHewHJdf|R6_uRD?r0ls2>sFTkVBo{tp+hWtl4Yk3RcH5z-qKINx7xA0F;D+}1M_Hm zNT0I#V@IRCdvpitt+_7*ELg zJmh=57xX0E5ed+D^fAZV#&Tt>-mP)KJxO^|?U+n2&EdN_8+9{`;z+(k%9(0cL z9S!o+u^9SOB=hfQP|iz#f^r4muc_x6!~v_UEa5Y0PJAt6==iS=|v&Ii?T){nx zIr6T-R?BnIs+sWTfq$PcWY^)nQELM6h5c4e;ZwLjUES09Ys|Uu=l0Xfdd!@XW4^C> zV8~|d4Eve|`51jbKhUmOD?%pdPsuxw3&-;v$OC$}mt{q+9B-5%o;bG;p&aR7?by<@ z9B=vv?jNc=ZOC!}vc#O3qwDvjh?#Qa{WIu%q5bO8BMI5$bb+UGjyH610J^x{`Sn?_l4Yc+%O!5?*C3w6u)#oaiU_e-eAY1Mo!$ zNT2U_lMeknK5Mla`MoI zUltAZ{L(+v_sg!KfnRPL+VRW7LwkPt{?NW(VV~_+lZTG}st9`NA3FJ~uA$Sv+BS5S zI_l^p`F|Vq-Uhv&g5FO-@28;mQ_%Y<==~J*ehPX&1-*Ab?;X&42lU~$G9nhmZ z+~e!WM4s#U%o`Ux_WIl=z8k>y z8OO}6FF4mVt>9e#0|gg4R((N!*X5Br@SFj^cfk36-Mo)xJXMUj7S9t9KRhlm-~-@g z-A6wp-oz~9@qBFjT-t`{SeLOGw>;O?Wxg=)KD3EGJouf09qv9zd@vlpF%7;c4Zb1` z-kSzLDGlBl8=rqB4gP2v{H`?ko-}wlFT&B0k@C%7k*0n@8oVbBK5J}z-q|$xV`=bv z(%^g3;M>yRE7RZ$)8MD1!Do++pL;G1{&*Vv-Zc2WH297*`06zHk~H|-H2CpjRj7LK^(3H26bl@Y~biH>AOb)8Na~;OC^lPaGTnrHg6sr_xJA4`MZlLp_L z2H%zjUzrA9m0DVY4Dyj_^h$<)6b^CA9L^lZ{e&woN^tQ zeJgJY`HbU!*L|Vl3*C9Mzii4P6UCkK0jaCy@1HX(UZxP`Z=F?t>zu%?-oo2%Exhf^ zsB>F_MiSn-OB?-~GJ>=f_O~_$>g2fi(%RC-mZ(1*4h69hmm2Z)`e@y<(3<*|XtSI& zUQ!?6f#W!-Jr8x(G)LBkOIwzO{6VHAS>7CJYlj>njg28GTT&k^sSg2d@Jk}m`r7({ zP^+kK2nFwIjXHJRxUc(L7KZBs_l1J2iqjXGnvj%gr66A7kNOu!nx!MlL;mJKU47%4 zQ8^u6e~G^V2YG+;y0y)yur|_sUuk1)Bq0H-(bbhic5(aS`fwQBlr|Rf9z>pm_~V z(bC!_p-_-2ZPm93N6T6p8!;U5v`gzPGluQS)ZO_N^-+i<7-|VL*Edo5^W5W3UCOIh zh0JSeu8%a=N89u2Tb4(myzO}b>hQuyV>Hwj&8rWF8maxEX6d`ok+%O6+d#j?4im$~ zaS%Z`S!{eQ*bG%fpsJxfe>Bnn(+Y=S#6j8>1PNg_g_@)7Wib7`+DLPQKbjY6ZjLmU zxC8+@)Y8T^#qC8+O`*mhZp;1Ax`h~sNF(~1XSKA}m?9OC(#Bw@jctcRjccNHqtsp0 z77aDFP|PD~FPFwdcC}!9d3#GV)UYhn1Y<#Cq68psHAPyYZbgzYiqzZ-f0WnS5^AOy zlZePk-52XYPUvkGJTg{OO5p-)Vzm{-~q2^Ff+NeXrs9~D2ET=8f9>aYl z;~dvyH8n>9p_Uesc9&r~UZ%dW9!3_eE2XgU*Boky+#kA2I*USZ9(m+B>aTBXF}ZnG zjaWGc3O`T~cj%-dirN@$xvN$b1N53u3Uro*S|Y8@flywgwxYcW9-;vRjkj=YG5JxbmR3mOmK0t414Xai|Sz z4Z7BfCV=y|gwQsJo?~Rv!BDNgH5^?CdkHmzw%EYeLd~=|BvFo&eW)4s>`b@GBCy1n zxC#_E*9X^NK3KBcNQHEyjN1rdKw?=$;%~|F5(X9ZHLXz?k82`T&Xz1k1!_NyRmvOV zH+AncBb%5IKyOi7ASC`7_oWSfFeE%s&F_xZhwG#DAq?=6<&M@G9-MH-&|T8nP$ObN zxfDzZAFvUPY)l>S8TXXSL(TR6aQ(N8E1FuUau^}2JkLUZV`C)ham4MZ2?hM{7oKQc z$m8-A9uBQ%t-r;?(k-nVl~B;*Zwz_@k=AffvTH(~UG=gyF4c?5Nr zx32Lw=X**$MGc;nuwl=VQ2m;^nn?3xYii*wQ-imVOXX7oEoApgFoAIP zqCDf_X`aW(#@$a0rLaFjzrkD}(lA5v&Huho7>a=kQvuyDzT4xEf;XsuaqJ$yDw6TRo`h4MjtWsvJ^mRD@_X)weg-{oGorMfFsyKf zr(B$a2Oc&I4MbU&3f|ZP?Ych{W`!B1AEWSQ`Us~j@gcY{>M2^=J{FHuXI1>+9SlZ7 zhVMH6{UHxRiob+a%f+UstSc>Jh;&)REGaC;6SpwKUvC{ z)73_KX^GJZ8Q&T5e|#yyaaMDSYrV+NMZow~Iwk$xjUm6=;c_MB zh3x#|9fp~Wk(@e-(fa*Y@(zm~=HJ5+Kh`v!T14i?DUH_NFc0IFGo76A8nDa88%bZB z2kg>SEZ21(MWE*?EurhUacbd>aFhsiF%!{JX)X>0@J0NzeE5m@BFPh}^_ci)*bpPW zF<~IYZY@O6Q{xZdZ5!O1C6YxSx`zI621_;}U<{9{n+xMJU@c-h;S1}5rbsikC(x;8 z3ANfi3}L4e3xbG?Jb~d;?+j}u+Mj`IG?{)f8;C|ccP}f$=p^hw`oN%fblTEpRe4g> z2_CsE<5`QC90RoE?y|CBGt*y5&&&pm5e$_2XpC)rqbF2b3t4&41IJf4x@Q0rgxul@ zftye>rphRlMoCQfz{fChN!^p-!6O<&aOsDm98K1#si-{S{KNA((P<(=s*PY>!|qT) z9rmbOW4EbnLKg==BBYr5k^gIv0}=^&bKZAOsinHt8K9x2+!DmfLjqRxTcgn1WhG30 zOtkDwlW>Fy2L6_^RURrFyIULy2Sd%Av(j-Pts>xcYSK@jYMh6~%NN6{4ZUIQT3okG zZONO;`L?wD{yCo3##cj0x4Y3_~>}UvG zDQ>^he;>kt62~nTMUhME99==1{M2KYCl!&j7g41 z?ZC>5@4`+e@iIiYx-aIL+A?hz!z$A>wBRrnV$l(f;Auf^Bn`#Xx_}=f8>Qa}#}N68 zYfsou8VMxPVw@)?NIAOc5rHXevDuX|14wVOu+HD?4`4H*Wl4myS3)K<)oG6J8(qFr zTRge0h7e4(%$!;{Lbi_G(8szABR&1(@nc&_)RSbu_)+wTML&rased26kEwXjfntA? z*!d)VT85zNKT9XS&PM|YVo8IM#M~$7>%wrP<-d^L=mt34=TjTuB&jfTj_{Nfc$lY) z1ew`V25EGuuu^sRe$>{mT)hfwV)6Q4+m>q#bdf<{RgP~>Ls-y@a9hNAxcwP-a}q+}_!g^$no%D~i)P{(UnuIr zGZuyCQCu)&o{BinN|N{A@K9DBW(?bu!?PWh2TNw%=dA6Vw5v6@Qo|+;Z$iGI#)^W($||o{KCyAmpHR^OXSgI4Cg^ zZ&^{<6mE$ZV?VH|qBMr*ui-w)ay%1=G)LVPTI78QWigJ(t8Xlc@Ua~qe?jhiXJU*p z4XrKF;t=NoE~}(Jb(i2-PQKM56M%OrHFLpBAS(oCFdL z`v~v$_RRi1HOh!(ME_8RdgDB4GxAszZxLumPw(_M;wcyw%L$r^ zwkVq=SYd}l@nT5pbG0H0gm_J3i-dH`n?tqOL~9H{{TuNxEuq^jma&8ut32Gg1}bJP zTDI)2WqD@)VNdu7PM%}=TkuMc38x%Y@XTtP+GaLgucP6c0eK z{59AhTh5jLb>Dnie7mGP+FTLw@kxq%UX^|I_?(fBA3Ugzgz=!ow3h2?bVPHEhoo>3 z`#r2p&n?)uA*7a_DUjw`{)exMIdT~G`rC3CFGT44^>N+FR%YrXkKmYI==E}xiidE~42Y^6^Tk5!G4L%U;4$jJ$};h;S~5i6P$Tb;xpAnd zNPqBNOb$#Sf^PP&Es}e@JB0h?*g_2jOR)upmu(oe3EezA_mUWbq~Sx0+bJvFr);Mr zbbmeGH6eaDe=Up`92TWLZHWdmYLloVF9hHnnNV|6By3p1vpKU-D>D(FI+HfpZ{f>q zP;YclUOwavc@f_sl!}~PT=>Y_oBd67^?{Z+8LOoc?}0T&x%FaADJv;1n=M0Oh3jj~ zD@)>?h#mDWQ!$yZ;Rc^U$N#=}dV+;3JDzdr=8^>dw@KhrM=k4nd(fQfr=<5H{Y}FH z(>=MkztNR0$Gz&S;46{-j0+#e{byb24%|<0rF(FHg)6-s_kZt7@5jBn{Bfiwy71?4 zpOZ*$%EJBUTxpiQ+LfMz`$AW`4fmgSr8nZ<#m}Yzq+RW8B0pE*!XNv)=_GE(OVXsz z;{KUL`mq@9UreMo&%*uRxzdG6>2jn$?ZQ)@m%Gw+xOeq;vyHS%KAU@ycFBJ;<>`|D z=DkR}`m>qxbmLDWjbCZuANxmgZhSA>8plk@p2;lzgym$2GF)kzE2!MIy=G76O^|*eG2JMx$tLj z@6yL~@=vzMWcz*M0_fpaHu%T!e3J5Wjn|VLA6NRjDC7J|`D&!@FgcIcK z7H`jXS>pruge~L!brR1_0#~; zjkxf~_MRrMHdC6W0<=g{@XwH+%Uo&p-PONma*=lF(=)S@@FhrJi3@*h?-}xUuOv+x zdDfalx}WuJS9&k*A5NsV6yW}GSNa6*{fYEe%E#kMv%NPG>1TtuFLkB&;Qp>edf*7| z7bVi$rr_S?U$*T)+BII=E+Flq_go3mE_%;Vp6>J+q`!&_f0W1b?617DqUnC5n}{{( z?Gtcwog}6Fc9wV9$Mz1SUGwGk50SnzQGT!x_b&MiZb#Z>pD$z~?eb?M{Cgen9CQ4U z-zUhwOP^n~k#@~5$@ZD-k2VdUJZ%7fq(||%^)uPuzt{u3Ykqo>@^R_gi|mg(y$fj@ z7yd~92b7m<{`^51(k^~~K>cvh{{j0u9~b_l{tn!HSCW$6Mg4lfmEMngmwxOfiZaC? z>+jCS4eQ`f(j~Z|P2o?{6}WNnvpb0N1Y!+7*}v{?0|I?``4p~mxN!eZ7cJ|bLGzy{ z;hK)C02lKAxe~ZzfMFqb>Ay=7xFmr~5=cm399$dx&qMH$kHYUf1V8m%g;EIf{txF^ z)`LedC0)Qh%I=0wYl3h2A$$t&8{vC?xB>U4aSwmlpG0_u=Zt{UKbHIDrpsJsJZfub}@h>XP3_fqS$J zR{<{eVG=I1yAgCYg2uxa(e8QN_u<-zD~by=Hu{hcni~KgMjIQwxTfIBv8?Z)&UZe< zbrRQpTzhcsz=if7+6CB#s~T51u3XSK0XW{WzKuHHK91`suD!T=ae>Egms!^LQBL{? z8kENiC`*~Vh<0BD?!_Ej*{06U^Om*q3@*^xiS~Eyz}1Hfb$3R=<33z~JHh|X6}Sp< z&B2v}-XvVvXm10q zi@46=I)*%yWBSD=T&#!kFCve1zdL|-LH7;viF?+SzYP2jen$Iyqt2B7K4{4w%TKVZ zxAx*%VY1%x8OZsbtDIe#@Ro*G*=Eo@?=f_q4 zO^;I}2|~UPL1qv3<0oo)Uy1wemNl&m_dU4ZV_CV?xF5j%e#`pe4&3iD`CrV&{ULKd z6?obp%TI;eX{)sVDOtvLd4B_B_i!8XLFa~vxF>z&Pv$-89LJKr68Bp78t_2-XZcB> zy8-oC{%YW9hs?ivBkoD3ANL)&N4W=213Nxvv>8cF24`+S!42zF&>|4&0aFzR9vypT<4v zv&?GnNc-mfJx4A1`|d6S4;di;f4|U`;4S0d3D8H>c`G|9JuxW_9)^|oB5nSt_15b< zG^MNb*G~>lzd`!WA8NdHN)xz$bFYH{1Wzv@P1)ZQhL1#_q+dbgpU`~JqQ8}VRH2{d z{WmTcAIUNQhK+lqsZ%Qfxfk?8Kdvb5vrPRLVz?(Q)P11`_v7I=Z1|8|{Ce^vq@6$a zy_0tdUXs8i30#uEB?(-Tz$FP>lED8#5?ozl%;a-LN6z*4eNZ}EMM-?7ZcwFHLg(nrB zQg~Y78HHyRo>Tat!t)9*D75JgV@R!s7~0C_Jg~l)}>r&nP^r@SMUA6`ogk zLE%LMe{3ntQkbo9yut|za}-WgI7y*L;S`0r3a2ZarErcyufhU_g$hd)`V^KaEGM+A zAIGrFL)jnqD%`Gcufih=PbfU2@VtTln58gB;S_~)6qYEgP#9DgRTxv)t8lx*y$X*g zJfZN6!t)01%~F`7aEih?3QH7LC=4o$DvT-YRk&T@UWG>#o=|v3;dujJ&Qh48aEih? z3QH7LC=4o$DvT-YRk&T@UWG>#o=|v3;dul9DNA9F!YK;pC@fJ}p)ja0sxYRoSK)Sr zdlep0ctYVBh35_Y=PZRe3a2QXqp(C_g~Fi1sKS`SUWMBg?p1h1;R%Ij6rMM5UzWlg zg;NyHQCOm|LSay0RAEeEufpvL_bNQ1@PxuM3eOw(N|wSLg;NyHQCOm|LSay0RAEeE zufpvL_bNQ1@PxuM3eOw(lPrZf3a2QXqp(C_g~Fi1sKS`SUWMBg?p1h1;R%Ij6rMNm z)hvZM3a2QXqp(C_g~Fi1sKS`SUWMBg?p3%S+k)^Up{+2caD&2)3VRgxD(q9(uW&%&c7;0>?ozl%;a-LN z6z*4eNZ}EMM-?7ZcwFHLg(nrBQg~Y78HHyRo>Tat!t)9*D7z2YSh1m+nE1aP4 z|6}iMz@sX%{NdXnXdHtEjZPRN2E|>_$cKVnk_btN*o+ZDP+>%q&}m49e31|BKtlq? zUEF1M;|$IQ4G0Jh&foxw3JMVGcHi!F()$0; z`#kUSK8EK|b?f8QsZ-~iI#qT1R-%MS5++NSBH>^Ohe((z;Rp#wNoY!#Az`M3ITE@h z%$0DmgwrIPF5yfG^Cc{lut>rZ2`eP5me41mU&49`8zfvR;W7yuC0s6HlZ4F@u9k3} zgd6bc9{TjgMtR;W;bBQXD$mCx`~t5cvHWSA4>9aCjLQ-7jDvXg#Orc<5+pPw%#aXe zXeakfgWt+f`oBl|zo$a-(I16Z=-(ss?^!MRTc!R%d45kq&`tZhN9f*jOwvzCx+Tx2 zB>Y0sPs?+MgyN)kHC96OQ>9BkTN5NbQPPv-Ia$IKNgpiFLnKU<^bztrN2&62)Oo;Tu^TJ+`3ZSs6j!uN1y%=BaOd_tbTkmu9-d9R_L_r}U|B93cO zZ|`6UM@g82R~4B)8LwC}%$ItF5~Baq*S+XJ^=NN}gw>Lc{;PE9|K55@Z;*89|6cT8 z;c1lgvf#(hFtLo?+49S{zT$v>&kzWcnRX$B)$*v zKk7K&ix?Ou@neV!5BVO&K&i|3D+a!(%kaI6fx;iYk8xFBonBav_%Mkx-J|2PGZBAQ z$NApcRqZ-nhVe?dM&g}_Kd9q;|1D*?#L>r;ceSj}D?1@5G%pL*j{u=Sn;Y4aD{#nfhOFtcOFE1y^iN@M0~rHKZf`riI*V$nU4SX6j<)k@j2j0 z>;N4vhU~@OqT{!L=dpP@K6?Y=3v|2)IAd4pcrNIPeND&jTZZ_5==dEb;(yig3Bcc1 zcsK!l>^oGaPY2)n-mByHqK|za(eX*B+jpam&qcrbwn)4Y@q-daTYZn~_>WT&ZRe-h_^c8f9hx0(t7@Rj`&r_pX`Xwam3NzK;0FN_zRBsE=T;3BmQ5(_zzr;_$7|`P)B@{BkrK# z2MZkOzi`BV>xjSYh+}+hntyOM7{4&V5qGqEA;#J+f1%qEhg=2Hy^i>NNBk*A{7px^ zJs6Kqbi_?Z+|gG2PaNqE{PF+hNdL7XzSj{y?1(%19{+hTy`O{s{T%%7H_B1QK~KK| zN4nn;U+IYNcEpc3;*N2@2>NC7@S*{Zc!nc>k0U2-JNcNL&9sj`(p$9C~Wge+l$75C;u`IAkUe&vnFSI^w0leq92a z87TjxBb|CA^T;J_LHaLw-x2@V5kKLGL$B@rUh-E*{9G`8X^bO&fg^sgBYwFf4tcO~ zUW)z(;*gC%e2gQW<%ok1c3&=~&Pu;7t#QQv(GjO?+hsO5;#nwIO0`~_|F{iXC3jaj`;5!aoCwayO5ti9CpBtzu-4q z{U+ngd6|UG5^j`mhlFhs9+mKvgq=EkFx*!e$9KO1MM9HVKbPcuK-f9ljhdVX}m&5@tx4E8$EDOCFx%#biw!kH45Na&YvnS{*}Zj^9`gl!TYmGG2=ojTkeFJZET zsS;*Lm@DB-2}>mOOSnwJW(hY+xI@A=36Dy6O2SSZz8WuKvV^G;W=NPT;YmOOSnwJW(hay&}f38T>*F! z@D!jKuoAEe@HAjGU=3g`;28kciN<=svw&X#u$D8P1N<8B8^A^Yf2_umyT2Ji(j zz9jS_U@L&%wRjou3Sb*xJK$BoYXEK#>;$v`UI**~>;~{qYY(6mzzt_^e*O-y53nC_ z0Pq%|4e&PL-vPe|V9jT|12_bD7l1XX@jl=`03QGj13mRS@CU#rfMbB; zfIkBM1ULcs6!2%jUjSGO8Ycmt0onmrCmNpv{uA(DfG+@F0{$EDSHNk&SAhQk{4byb za0YM=&B4V`T-dR3#RITM;<^}+ z0O$|61aK)J5pWsca=;G(Nq_->9|5iaBm=Gl{5@a@U?|`^!1aJszzu+5fZ>1+76AAB^aHfP0NcfCmuw23l3Fk>zDPfg_)e_c7_>hDTOX!oZR>JubE|AbK;X(-)NmwUgy@ZP;Tq5Bk z5;jQqsD%HZ!$jITjt%UB`a3S6JzmS@*%3^GeY*#6FW^4FbifS2PXPA=W&$1nJP61G z-2Urhy7Vs;;2EcQGUju#v z*a&zY@LRwpz-GV}zzcvE0b2nt0bT~Y0@w!F4tN#t8ej)tC!huJI$#%IH{cDx9zZML zO~78j?*RJ%`vC_4Zvol>Zv*}v@O!{Pz&n6LfOi4!0p17v2jBz1VZeugj{rviM*$xL z{s8y{a13x9@JGO(04D&S0{#s63%~-L1bhZ)2b=wFjXnOr{rTnLB< z^n=;L$qskPT?v5xfJ*?E0ulk20WJsp5Re2I0QeE$3P3X8N&rnFO<)RO5a4P6%%w7q zG?O%!e~)rQ07C)S0j>w60&V~d0}Ka@0E`6O2)GF_3jM;}Qus)(Cl7b*c;}Q?*5>g( z1$?Vxaq>T9Brt`Rpv$~nK}9i$=R4cVa;BNP9(t%xsz;+xO7+oDik z%577C+X2FRJrUQI+E=Sf2XW7^+(Ru1x#}i%=Oyftp_mZ77TWQ_S@j8VPkEVrA*Q|n zGvw+_!4ZC;m`!VVIzM3>WVBsMa}$?(_mHbU_Kr_WOKbQ(bT|i))Z5+PcFo?)@FTI~ zY>}!T1JF)ig=`SetuUKcYKCESk{pkC>Y^dD~%y6BTxYmd?(kTswl2BAn=7@ z`Dn169{H2Pb}m2I9O;&8e5Y4^e%x6OO%r#Zp$K_ljoBsKynRl8c^@CP#pi(4C$8<> z2p0|5S(*sdYWI4(j^jae1$ z?Gh{_Z;rP*ySyCtTJe4#-0Q4T_|;&1M%|GT_>i(H!dn$MPDUQS9~@R4DPh%-5>maJ zkq%r?93cmcw67kHkn7Onh`Ckr9sNkxEk~#jyiYkoCOd3@I6gvl_&1Rw6j9TkJv9cW zy1+N*^*87vRP28DbI*lfg(5ZKoMz;{=?FOFGUy07dITe3hO+S1JauVxgo;jG3cV{j zLSb9h$4^kafKkCE1ez`Qin$~0-hz@Eh@Yg5SN10CQJ5A;#hf)>-Ed&nLV`jgH!HB9 z$g-WIlGM%d)Hv-EK&L{JF-NL<;zKh66zN);LLIN7gAus$A&3mE>H@Sb!D|ab3iOnW zo3tFdz@8|wf%4Aat@TJ|KlqLJi8+ormM!p;@!jrWOuoZ12Q8#cI3(YF8^H5eOBqP9YM`4u~=s*yO zN_U7ycooU&UK4!`h)}Q+QZ-9eKLgDmIUuFM!gqU1%OCPa$bjAkQq_GM#0DI=0j3;& zbh%<{NK?F_vcyX&<@!z5=&t9O-|m`K<*j^(&P${MKa?)u|bUA7hWCnK>ksN2fy46cvTOyfvW8Tt5)dgKF??_T& zLAldYn=_C1-|5oo21p&HBr=APv*j`{f?9~j>l;v1A?3ViiaCLo&canOWpi}7s_+uF z=n0wtWlHbD3zOu4%NXH$I*lZ#t>H)m&W1yy!^>#Z4YrIS>DDCE0$1UM6b+gIjTa^F zEbtYV)|B#M1K_@`3>QFx9jpaA%I*jKK<%#vGI9&5)crYRF0Mz%l{LXiQ$0nv_rXq3 zY$Gl`kH~dB-RcF3(V^$1K0UUeN>bj`)o3BjsMH=@*N}p?fN3As(Kj%~iI$JO;k##I zPEb$o2|Q^AvqdHSc!cZ+q}`dOI%884Rzc()tdrTDzOs=AGf{zy?Re!1oxcf_^tuhP z(7Q~S5WLBjPxc)pjI+?!E;by`N`@T?LHCp11@4)q z#s?={ps=qAGV<<*h8I+MMF@<%Jm?9=3Hugh)nfAKmt(B;rB5h<)yq#yE3l%{7qjJg zyu~GuTMzkVP%4y`dP_ZYDiMOY zMxNR#^!hwrbx&9x^qM#4bW6wJdf-Zim98$rjd0ylvFC`HfgVqIdFJ?VS)R@)t(r3x zON`JbT$~lCDFyPXU`Sa>4KE&44-n$6SfdJa25zt_EibI0S+1Tu*U?Jwpl7d>nsW^)%sp>;#75AFG`XWi^TvOFcLy)uHwj+Dv8Sgs_Y?|WoD9u5b&Vs_)URu;- z>MOE>UE>7%EkwBI%G!?gMz6kgE7E@accwPt9(!+XN2WV68tg@?EqA@)-Wyh@(gs-> z8EY?n#64xD-iI;4(&Gu@>7_wf$3w=U?sM!APd-{r1miie!X57Bm`6c^_P z?sy!U@@+1*jEba(TQj59i+DpOm&!^9dZjz`@=UqhGirmqUm5y3>X$K$6IV}B33UD@vEtO#-Z@FpM$dMz=8%Oi$mJ!2l89ipy&5WD3 z47=s#5o1O%e)A~CM~qbQ(TtD0NiQ1mN(($i_A-LCfZ^s5qsOr1XcO3O!5!V&jOw#> zFP1W}3buBu2O1G0uMkV$IqK9=+b$e+hk0#+NKH#dUUfkwI#V^RTp7+Qj7K@Cp-w9o!b|bz8#yEbXq5tXw-*3^+d3hDZo+@>s%Y&bhk@4|P zGXC|?*Y}f!;KT3n)L#n!$L<@qh4F@j{)>#S=?k5EeJpA9$xZjrfq!0T~ z-pYcKQTB7B@%{ZVolEAcxU-J|+$OF~OX`7- z@!s%-*{MkS*0D|FGko~H7300&o8$4|1pvNmfGw_Bk?A{Q_qP$h-HOuRvXbcfab}m$ zmk)f5JM{x|8h=Nv|3p8k_y$7H<8d}cieo%fyqErJ{V1rWwDhEJXQ{LNBR!qXMfpF;4d$4R+arDR3`R-k21o)={g9ZPyOCZ(iy-m8}7Wk+=-L! zxGiVmG)GRL~4X z4Od&~!vZI&!|(N0R^gS3s^M8W3rN(Zph@+373f%Ff@@XFA4U~kcELELlSfJT%^uow z-D0@RgZK{NX{22Um<-_G6oD}a`Ge5s0g?Y)qujuAHGa3Z6rrhm7Q^4^;)j1m0)8ua z48u&m#sew<>}QN|HU39GhwIl9hvyd0sw}9ib@tJ5Jcal9A1cPn|B-tfp&*c}_NF7$ z?SVS>yqEUI7gWwFFN@rS&Lh?^ynS9m$_>5Z1$lQAS4YA-ez?w4XcfKrh$?zx)`LB% zz2cpK9~od$$FN7n9n1&PdVI(efobDcUxgt5YpN=T;}s$THF#LoF!f3i%GrM$w_rVy zPiH+^x~ja23J=Z~Mh2^g*5fb4!`jnBKP)>~MK#HKMF2f+DTwthC*#X2y}b*Fvjot| zUr0Nyqe#V1nR}BDv=iiMB%WstXG_5{c1z!f|DWK1KQ89k?5B;s3zx<`>yPX6?817F z?^b+a=H#-sQWrkf=UIPzA9;QwaZ-J3N(S;+=iKhDFZ_$H@MV-3uCs%>mYy5bwGY3x zPOxI%ooP0_JM-L{F3Z33df&O@T^$Rb_V~t*GhAnOcU2Id|AIcxo;lv-JL~GIKbzIn zc($Oc>FnaJ)o0gqZ8*ETYxCLTUE9vNx^|t*>N6hYO-^qH9-&>~x$@oQy22wq|9sH$ z@TpPGJcZ}BcYUBCp7?+#K7SXg_yv4|={Y>u zY&e|L4ql!l4>3+B!N1SIzt6z?&%ndaz{AhL!_UCO&%ndaz{7U%upQ&l4nDSnkL}=N zJI19QW9K#+Mp@_s`^tV;3s0qvMVn*sJm#;5PL2Hp@uxA?(&sV%acCp^O`2{UNB$n_ ztV18ohC`ia1{oFXXQV!IENmQ#Z&MGQ%J>9*>jI9wAGFrJ3I6=$a3Lqv4$xrZsJrGZ z-@+3Me0H1UhZTG1DB3#;S(xU;srVFos112-&UEXtLpw6^Aj_c7zX0R32^2u)pRn z4{fyj%08m+t@aow-shpr@zG!tNX4yDpA(pl&j)HRPbbss)Cfi&M?mr+3;n}du-(n#E-&&Eew zw1@tO#Lhye7v4A3N83o8R;+G=ws+x}JAAgiqrvKw{rMvjy&%XJMSp+77u^bkq7%C^*WK~9ljlT zEr!N!rTaI5(HW$22@n;%;r^dy91!Pg?QH)7rmJx@q zle_HslH&gSlUZ=+#idFL? z=J`5~7v~no+}plWmrMKOp;p>;mSq_=?i)e>b9%0)oN<1pEmnQ=K-M5PpkX6u*qFXL zbZ(*z%Uor|A>9x;)b%K9<1wF0Jtr;DYnNS*IzH@H;P|Au&&u5iq=ek*uD z@3+CT=+Cc3#1o|VEy%%JA#$MnJ{eQ!OfqyP+43ArcJ_(&GxT_unClNguMU*d{SNkF zmtlm@f7GwV1xB1xj~32zrG)F!!ivQyP9KJPXxmEL_MU9`U7QJ^9$B8YCh8GwE_7uv z`GdCVNA&6H^5+jo=w@@Ff7Hn_SN|rCI!YZI2i>CGB%b=1-vo4Yaj_8#oCWP`j~#A= z9e=#QsK!`NGwZv$%mSmr*I=Z$4gVBtrPeREQQ24K$RTF)?~6>xgxjdzqGYGVNYuJg zon_`5F5pR#=aIzaHfoD?-L7@WH_(UGigxkm6rVt&%@6WqIM&LxeIYM6X7t0^5Ap&! zp?rBO_DzhO%``7RD!I zBkjuGQJ`a#wf?PYn+A@z@O%{Ik#rLm`Wy>7Vtb>RWyx#BXW^~xkEYGva(%7hFZxZs zDtoMXJ1=vsF+|Z-Lb_U~n+>hgEzf}zCtU#@f{y69w$*K}e>)##-R9o6>&aKzp^!S> zD{8Zr7}J$*)hXO2%A3HQ6jE;C6}6y2+b(5uT8E(AkdQI~+x_-xx8WO#{x))cQ~i}S zf|4ur&(<;3U*vHv;rKYm#ERWB*lgG{7~?W8q@6{ImTF~BIA5brD4U3~i4n@>2K%H2&;C?rIp(82#(K{vXL@ihYHM>F56@t^K%ZjwEa#ktI?L6Vvkx+#*y9@_tGg(x zZ@{j-k!;JVpYt~B?UZqc59arQ54Mjba&XqUhIP)@;1_j|^E`MoGHXd+rGMo4FnsRI zihbh*+6&P`%1Gu5Mgsl$^jUA6f?k^A5a%=JaqCCBPcuC|ZTIQA!I-1qOWFN$$o{r* z<4_)Qzx;}fL@2wcO){t@29gA6%_q^v$o<>J z{;^Ni53x?5JzB9RHd0ymEq>|WDCwV`bA$bhML%Ml^!3y~)<+*l!Hy33j{Su1)MGzW zd+w(z_uKc=73Vf?9N@1}_M+2mJn%LAAli=2q*eK1S1CPeg-*1l9d5-sW#8cNervn5 zr%fTsGnjrHZLHmA+E;r|ivAnzti4w1 zZJk8C_WVnn#G&ds_O_Hi*u(x7X$YCOP>%bC=VVWjw%Ceo@tX}Te%sem`<1ZMTtC}$ z8~efaHuqg%x2L50cdC6O_T7rznacHr*|0N}GHmymw%1DDnVXRZTef!ZD78-rTdri^ zA>(3${FG_S_d!F5P2$=Y`zWAsCTN`L#I4(I!TO+OnKND4B;X0LN!UjMow5(PGu~O= zx0CM z{y_KAvwx?2YTB;wve46gwsPDIdgLH-T$PjEP#C>oE%FzbXgW0`6wuZg%#CdC-&1 zTK`%~kYA$w8~P?9XUe}39Z~*V*gi05QTtf-TEXWWy_Q;AaB(A17;!L5iN@KF?Cul)Zo*BMtO{>q?IJxc3pz zVbBPC!SlEPZCg)i+P0pGPTN+D&DOT|=7WK=9ZlQI*t6MHZ8p4I^0%e!l@aLg2+pTm zJ5gQ~?_i%4@5X_5jx#@5Z*h-$isgCrSb%?dJp-=OMV=bK7;!3sm3iLk4i^=Bt*JI6w z7qO?d{RH>RoH7lWr@nP4IRgKz*q1XfP8leB%2`h3gHKlMOKtSyA**dx_P;mRaW8%Y z=99gz2K3naqvjLqs6Bw#7vs@>d^dcr!`4IRtk@TzYcF(K>tF4rZ@T`=$)G9OS-)e^ z@720T_K)#`%-pYnYxW)VIoB&*gFnbS1ACUJ^?UB;#OXGQy~^$aj~WZ`mS>r2EMQBW zy2^bej>E~pFLsirwoOK#Iw@b28;%9{Zh5w6j}OoK?DJ;MWlb?}H(;C!to7Rqt%Ywl zQ&z-=rjS=mvtqZvhHfcw_LVjuU<;GC?nw6oc5ZJ~=d7M>CF4E;eGWfR@g3_T;F`(t z<~a*+&UBV(Z{E6tI0eU!a6g>qg;vgsr}R14i>K6CjpN*V>A<(w@eBd;hgz?y{p_4A zxo9WXxgO&fG@&eQk>az+x#F|%oIZe)-?q%t&Z_qTa8BiaB{=6PxsTnl3~ent>p1JT z`*#*Ty*lrQZgG49V}S9sJg+3<+&?S8`&E7XO157IkHJUqEW=#C1N%V;_wEQ;7izz- zPwu#@ux4Crth16fwWawswJj=qD#RyT)bNbjmx52Tm~}E&^+{6aNvmSidBiyIeJtC` zers#`{hM~Ay}W57Z42$P+bH;)a;j`J>@}Xhrp{}beQ=%{Tly$DFLd&Jf_lU8PanIf z*~xe7icLFcd+T!E#kz4vwapv$yM4i?9ZXlc>#$qa<(t&mb$a%z)r;2s#ux7Es{OOkg*i!7)>2nMl+xha{SWpM=SJ&y^G|Ic{byx z;DzURf%9}md^T}nxk=+u+^DQ`WF&6>RZ{rTh02z*BZv1 zI1906842Vas zYNyF_zq-S&6x2yk@&(^N9k@-;Hk^IuPti7N#z{9Wx6nB6{~Ef+HWR4pZezyh)IE*| zWrk@iXYMvCATv078h!(1m$sc}N^1QPkne3cL(lu1G7CJ9@_m3zp3evK{m7^MtM`Mz z$2EFRzxTtsok_$s9Xvw*Jr^jO2|I~03*E-FGdwF)`zGWc@zHPLJ29SZ&A?f!`#z(; z^zQ=t@$9$TnEo|&1mRb@f73sw>?)qvYh}o<{Z3R*^O_&~{qVtSIkq8VPXF(zYkZWY z!1!ZcqfI zuKm!5d7{tCztw5eK2~;y>m-!7vfs?741<>@aL1{2eKc4Ga zRUa=9`Zp{3Roc`Vp>dhp_|e9BA9_C>IAMc|Ku3-6IZ>@ONr!H4rK6ptVeKr{?cDRB zv@^od&TZ08vfG$4z->%^pJf$pjrTT|ga5^;O;#(Q-EJ(cwGkI~s}l%znm8x?b06^jXQ3 z@~1&}U>zUU&p`j^2V;I=zuCueXyLo@0tDzq&AQzO?u`3(hSW`2ENW%qX*74&CeZHpo*|GNv|KdCuZ$wF`Y363?EEf@AW$^Y{8K7Z3SK0nW-sY5*1z_?RpC@*LE z{xsK75$C0E-npae>lK=(ePGXWZ{V3I{XyDP=zFF==Te`Vht^Wob8is4I~aYo{mUft z$t@ee!@kh<&qY5b*R93;vGxlitGR1eI`C|3-7~3vp^4{OC1&=QalU1zA5gnz_EQu53BXdXTvxT#r$&)Exa_iyM2V`FfuI z@s}M7TMmOKaV&FkY>S&ZM4NAB?=-Eyv`mMr)}Mr(huzsdB)E%tls(B{)< z)AIt}<9NXhovejFS4djG3wJx(xAlvDtI|Q`15KT${3>OC@A{PG`R;amOiMoFV}`!4 z)XaXN2z}VbvBdnei|NE=W^dZScg)V<91iJ+&+Rt0om*_|a~l(PD*S3)dDr9Q8`p*A z`WH568t!tefA5+{J>wWFze3S;_X8aT@CSAMDHe2HXz#1#Z|aq(vrqY=IR7G#;EQs< z2C_M64SZ4C4;{?9QYVz-R<7He&wRfN=HM<3{7THAWNW?&r8xTJ)#ae0A{E z@B0JSOOt9iA3!eS^}IUCtLO1a4`^Bf>!}g61?r5G@04;q<#=~r&4;x0GH=-L@7rrB z+6L-9*FV&Gv2T6-v<;|38%sMtyTGxC;HUNne_?~~*7Nr&L+vS$Csy{WL)zD3?3DaW z_KF=?rp6q8BE}VGa=*1CUyYw0*E?&)C(CD^mUFjP$qmK?dN4zHlcVdppA#E0O3687 z(QJ5rDat*r>~f0%pTc!om%Z~=;=%J#j&0=mWJ;~nQ+`08FH6uDEq7x7@UA4~muq#q zFFJn=Wl_sz?(+fvl0K5kzg_w7dK`0q#&S?#vSiFXdWv3 z52v}mq{9aPub2E58j9S;ZC?fE4eWP?%o}e|mu~wC?Q!15yfI?DOBD7x=);{=o`}=>B_TdNGeOEr@l9%oN&%<6k?b8se0ec@h zo~-ATmy`7ThqaELgA%#ky`$?tzveT>G=;Ly`SOmgFFv&83UkBax)$Z*H!@%GMtoc~ zX5fdtA48kuZ@xzVHUauf+JrCjFyCjXy+-2n54v_z>}cTK!1OnMHA3rsj$Z%aj5&;!!Js8c zXh|YJ^q7z5{7!l%GmSV%6XyZ6lcnfV^TGHhq}&kD^}N^xtj#a}8tGy?Z=WZ2Ueill zn%*&*-rJ|>{@y;3cAtGR8-9&`jz1&zVkT);yj}b25tIq!+4~=v@ICvJM#$j>jRk7$ zT_JKiK;%@ni+XxbAZNGc>4XmOnv%RzM2PnHeosnq0`Q~wq znc92PzT&eu6WM@$W@9jA-l~1!l#)rzr9ppEmBHR~?ojyLM*Aa>%^k`o#yiD&KNR|= zes5zoteXbjXHotmv~wCdyCdzmq4qjq-zUSrpGJRZ+*OsJ|qtRwdz+A@(+S134BI+9O@j# zI2;>}vB|`5Nhxn;_On}o^Vmu7%mQxfLL+I=)v!PN`zNOCHO^;Q)J^s6ziO}vI$3Ao z(3nIsdqcH(9?rBU8gah!um^XCk%ahk&^kiaD?{u$s=O{co%LDX%>LCh*0mNHnIivz z@{Tr^t2T;_>8zv5gSWwbs22*=nZg=l-^sWaW@>%Nq}_lW{rXm|cjG_QdN=+ZJ=c!k zk9BDU<24I6s>Do`N;%WRaOf|M*Ko&Tqs%4z{i|+)^fq zW8^&JQSH38smNNesi=JqbQE(TWHqz9j;@Amk5l_s&{1_Bpl!k0&1S>;M))-ReF^N3 zD}(Z+*1_4oJ(#|8{bs%YbH{G(Wvcfi_Wl*W1zmrTJfzL0t#ljN$Em0A-BviuF^^?X z{tK2zx$W&oz#sU9q!qj<xMHgt7>rvBFa=LfT&s{NSf)t)-|S>iU*YSKYB?JI5LxN)?z zMh44s&QAXWpVQ`#tdDlL)9!Zs==s5V z+@2pLbDQ{qoeP=YH1PRR;0N_P!TznevKvv>s{!AbJ|OAA+{XSXy~_Sgv#rZpq-R!STpDmBJ9fO}cMSQz;)El$m0j&KdaQ#a^bg9@_?5$1sRP*ch zDzzxKOsUxPleUJlB*=#%Mv;t9odElIQsscP()uEy`z+CChE|1yhXa_e!9 zC+$0F*0^tbThCz=Zc}`)$0-sYWSvGEujUYxp*>UMg)=?pc{E>0AdW zJD77uokz~bSv7Ra%56Niz+QllbLqL= zhA((_k$D;9hP+IqKWBQL-Uc}?U>WRR@tmbm$%FLSo<9S23F-EjgXea;IcRqf+Rb6R z>A=Nysbh|IzgF#vuZebNLN`z9c?G^Abr0pO>|b^2F&ldWXgSssEn)J;wO;|{hq90H zo)VPv^lRCtfSfz@(B>)oL%wFzS9@{B;DX+}$k+Ua(h8C1k$SId+>FpZtXfU`;_QRo zfB6;P3!vN;qiyAfP?wy%q|HiSt>yB+xB{bilg$ac_Q=;3(TUmX90q$wMx+a8~#btY$kvY(jaQO2cto&BjU zlf95*$bDkcX=Oh@`L` z&vn6*demLRcRFA*)f$*}SqF7HQ14pQbE6*1jUoRTx3ZsU!n)Yd`yc77@0f>goJYP( zoojWNwh|%e9Qy?D#VPze^RwsY2z(3Y7ySX~vO4=E9h{@B?6pOZS9Lxl@;y&vvY*(1 zM9kHTmAzDJoY7o61?{E7&N%%6;y%mwHF;hDAC@^!c`y=cOzH?^Q$6|gu_a)>;?GJ#rA8I?6Ig)Y&zNp`sa=*cC z-10Ho$^1FiZx|b_b?~7m=u*Aro#}ZJI-foU>F>#RND{UGFpB%@Y(G`c@i%{^WD9A6 z_cp~_HUE!VQMaSr$NJFyFj;!i4Zr(C;4dK_*aXyvOHl5fEJE4mQP$Kn z-0Y$r&;J(;pw}^1nFHwe;MBu4?q9VE7~Osb+)!*h^tu zq`l4O;m;}?ZrWpkaexer*~0gSG=FdIOa5wK=E)7(K8$%BebzkVUMJUTo+tNFr%<;> zkJC;4bf0hPyLfS*<&=ws_2Zwl1}WLm=W3L1?AhCE6z=t@GXuvNLiqfo^a9`3qF$WE z_qA-jIO}+S`7F-ss5?FF%LVnNV@sp!y!XQOg}Rcq$YtVpx;{UAasSrqZTq)mk>@F& z|Hw@~|Cj0DVa9W7Myq!{@Q$AA=al8gX5H0@Gkf?reYzHobzPS}8uOarn%(rE%WE!* zc?aYCWZi?V>*~h#zi!2%80-sVc!?8ydw_ZhJ3KjkRm?&9uI6gIHw#5I?g?4oPsPR(hhXEzWy@305%{W@5rq( zc0mqDXu8ay!>$3nkRRBS2>lwpzxRHn?+@$OVf5=Vx6!Bd>?-3F=}9|h#6T~*(xC%v zbM^h0WCprY&wk^IgH9OG2iUt?cz(?J<-Or6yWY=QWwgP58)@0oeQAG)Ik@PNXB4mb zTW9ztqa)Kay^-G|f{hwY+fP4iHF#-dukvwU@8r-`t9jnvJ`wW+)`r|aaT_Cb|7rJL zFb1pr4aqYbrXS-R?lwkzO1nrtv9J7Q*rGRIF}5Iw`^i| zK?euxw42wkf0>wjRbSvca-M?i-amYcwuLA=1bsi4)zbBa?)!|T@P}g;UGvZCn|mlf z88Wy%{Xy5OGS@HBdoE+%TyvRWEQpD{8vKq~aA8Brf(sh1Uhww_|1S3G1=luQUHgNE zl%|2Mzp(t~2VI|WTp(}8mPIaW%UIW`Ef2;dZXOtO`Q`^>lC}(t`O)TYVv;xiA!gv_ zmY9?m$HrU@JN2LF;{&#=Xj{{iq;1XUYXhB~oMu>>Cu4pVDmzUk{4U!6 zr5X9`tNA>AqO2vZga!5J%M$eEv4*QR4|IJ2eJx9eZlW*$osnrwMjuW$KInR=Zk6l0 z7gxFdN9*h8w_#J&85{HwQJHoFSQ>rs){FeBvj6A=@30QTjKay~{^BiC^&rb%0;LKiJJyfG-+-!h2d`k{sQ^_Qv9$C=*P-G`7{r2damboMm`_89h*eOI2oA?Fyi#({rEABjFS=O_Ov z>{%S|()&vA+roXejzQ;k(}z!Y@!g~0ebqNFVI%cAZ`fDddxlJ@`Bj}6cz(VCeY?`k zr%t;J<+IrS4c7Fg=jZ!iYrfX`#|Zto--{gjK4ltpw10$rsR#KSF$485 zmP6kO@jHWM4x`Lyl<`v*Xh->d4*CGF&j#1uV_fz-S3}kMg0%77E5%Ft+@8lfAX8t; zchcg)tBQ^vVV=U;N7*Bs8>;X1;r*wMTFR4w@f%v8^?%429S)s>HOem1KwjJ5gHXO& zPre!bF}^4DkYk-G>lE@>@fSR;+lBRv=thW-CTkh;T)xFaz9-O@rl%-6A-~tv(wFep zp1*Zi8gvBT;7L2C=Nj}QQQNNT?x8OFXPv*bF8^?c&%n3+;NSR+i;ww@1Brg)l0;vU zk+PuA#p|F`&+#`J7%v~%iszgKJcIeJ1lv{L9|TX;ekjg4z^CmCuErYOP-}s%x~J3` zN}@0G;&o;=WWnEOm@nH%!F-kCn{e?u;vh|w5z4s#=#7cMQDgfL`&I zC-TYf#r)=)?Byt)gI}M4x5`ez<~aT3@H0TSF=Q)#x2n(LxbC;VGs$oMicDLv3vlkV zU^B--eR~XhJ0a&<`dyMj`YVtt{HAIFet*AUwdJXs?kuPBKf!uDc0nW0olvGx`Ja3L z)uir^iTl^-V^Tni<2PIMJ*@1qeE*{U*Qs@|Eo090H|Vt2!uZW-;9PMW-V0K?inSkg zG=1g#t&|t?&(W7DCy{PtmoDe;m;9cD>-bwewkzq&SYG8V=$6;eEss2ao}X-(zm9vZ zCPFLw7o*N0P8>K7Rlku(U-W*E=!Y6NuI<5N?!mAhR(467rYG>c)qduD!am`zVrx1f`@e4PBgnD)N?)yJ!C znK*-Q%yRxZV}IKkJ^rq zmoNNuLCEm7Cz3T>8{pTO0ymml7ttE{i-vpzbBzQ)_N z%(`@bv$74pnBPoZIm@6f*1cUt)+O_onLnQ&^4nHbzojeJx@f-N{FnKD@)*8FUuS)m z$z0Vnr(HScA7!a23(J>WfR?p@mH#L042>_gKy zo@jGgc$;ib*>;4=hwEvd8R`CY+Bfijo$mAh0e-RcoAZtB>zu_m?CT!I@0Ok4QN+5Z z``V^!P}WY@V1Dbw-+B}MR+rnjb}{WQ&vdg^_2D;njd6t6*@x=GW<&Miv52?(tM{ch z11_s+YTx;=d)zqaX;-NKpnN6#)?UeRG2|HgisZ58N6j|s8hsY<1s#-l1>&uYr~Pp$ze}imKs{D9+sIdr z9eK+!?n8YhZPgxvE;7MVPy>X2m)= z;#kA(Ed|}`JsXaDqGQ~bhmAYFcc|nhY}{pj^3~0Utl-R@az~x~OzwqH`w{T(?KQ2v z-U|2a1HL5ej(H4xh0l1hq2izkpw3cXl~0Oy=*c6rRj+g(d2B=Zp&XN4nB(YgLid$V z4c{sKfr{n8>7qV!@1MA=D=U^e{cYusUJ(2)3&$J&=oHFBdPaqsm#pN96Y5(QnA@E4 zpyme1ImaG!$+yue8XzOk)rto8O?|^h#z@f(y2u0NON)QX^8oZMg|wNwy1GcKZ!g~Y z$8Q%%KlRbsZWMYNNspS3K!+6zdO(Y_zLI}skLN8n*Ehhv&kONgv@FkSmHiC#WnQc0 zsVWS|!8IiCSA+NLZ^(Bh`XqZm_;C;7oK+;i|v-=XwKe0SY?guGZ*ok%^=kUw;?IktOS+R51 zfu40Jx5LKCveX;Zf6n>bvxuDwIi9$0?|a~n86(pO3UVQDP=7S3hP`qrg$8`OO; znD6MH0RKj3K5@4%oLg123e{KZKBO<7o3m*B zZ`3(@$QlWLmif!Mqu4jKSB-P%a2nxTC8Y1f_jh)7b-_n!uzrO0(YNsLEs_76n=!8H zObuf@n0m)^0vo5Av*kV~HD|*Y{_I=K+qPV*ITtu-i%&Kb;afsQ8Ju4^*K)6cI$+B@ z>_-9lPr5Q*r=Aq4Z=IU!7dFt2qHZc>u6^ZClhb$p)czhi=ls?D))Hy8eJ1up^%>tg z4WCa*o0`|de%nHNcn(f_NFV9pUNdDk9b;;G{2gv%0N;=5ppS<#@a-<1K|P^7P-de2t|{NGA#T&NFbQ}^0`F?IerH>&0lV?e<1u|l#knaWo65M44-@fmud{FEN{&N$xcd|o5zi|SOAagH~e|L1f(;sPS>@~ly z;P+pojRB7jZ^n-u@$DYSuv&9KCU?@ehYY;0_yt^6_QE8!&e;Y2VZYvOTsi=JwZF%e z(5r0ly)ODk5%i9-qGSX7kh2ipU6I0ZRC3~(zZ!doyD)YaaJMk3GF(@_RzCh;g=uiiJv)3zn!6VRXS=eLmhSnK@>)?UASUn{Jf0y;Q5E0u5_aGsx64LE8iIN-if%0NupO3#=$AJ+Fq9N*=JUR8pQMrFTc&E}|&bJh#*p}iHk z##qMP27Fvs*8BVPQT9mt+<|YNZi9~P@>AXlx>hetzXN?f??doxLsxxDqv+%2u474! z`3a4b342aFjI-v$S+1hP1+I$2i(SfR zID+uVar|y=x65a(aY5%UwZC7Z*c&w6U^!`PAzw!JUrt|r#8 z%N=$ZO@Kz0!(R91w{{zwI~F5cV{GnP)nQ;iCH|W$j~SVd8?9ZdEPk_aL}$t|zRPQL zy1p3PwbHl|I9GRO#0}{jbU3XuB`yiy_88NZAJ>Sn7?HWdNbOANkn+~xu5YCLIF>(X zm%o5Kv1J|dkA1tsM)WD*GX&=FI`k#BupW8!mdD%8_eR}5$ge^4O6RyQ zhLCp9yrFZDaigX;acI|1;;zfwjQk8MQvL;93*xTps<#@uj(wr%JXe6<&THQ1ccvU9 zt@%f?T=|`uhZ{TdI|6if)*ov;Qs64;M7^&KtMTiUeU0|G9$8~-II`PVy>E@txNo=7 zL^`o2n?jkTPQ%AojX7WgK7)ZSQ)i(+Q*3^oY?zg40%YAV$Pb@~<3L>izJq!WK=>H+bU&bPAD{nBH!QWv{J|psW>J5RbmZ zkE?thOPM|sKbG#m0e z(+A`q#a^I`=Rh_tn-6L(ip|GaQvRtuf6Og$=2K50KNZ#$1 z?FSuQS4}rM2Nn(ay5302+-AggEt_s+?KDR5Jp#PrpVDc}O89#9*@Uk8BK#iBNML?u zvyqs&0`X({jddTxzsLm5@X3{ZUy*+_gci(mnRs7`ep)8JW5s^LW*uW+(a$!{9q2MTw1Yt*c-`9RPzts0p+~Ixw_lE6rhLW$9*x%Z2Eu) zPut@K9I?O=vX-K3W1Ld0?6qU_qASg8G{v%xdvGA;Axvr#7|!W zJl+Am>isp)Y`-g@cp&>}wtoiR1<%>-ezQOFt^j=p?&Cwo^?L$}2M-*@Z_SRPUj@## zNgL;Pj4i(v!!vXI?iR8a`#_ua8y>)SuJdM^kT<)YCAy`4gk$kBpK(AWFWg_x#Bx zqvXF6C4YOA{54VXAB&Q&?sSD-q(tWb8}C^2bEU9~343g5L8deHkVH!zlT?qvSsqCI9g#`L$8<3!>ytjFLYx zO8$T-`L5pc?>reL|D7oL+oR;KiIV?Vl>B*7@@GWJ&x(>iG)jK|-t%+MM9DuMC4YaE z{4G)PS47EQ93{UvO8%56`D3Ew4~mk1LGSr@d>JMG!zlT?qvSsqCI9g#`L$8<3!>yt zjFLYxO8$T-`L5pce|$1Z{yS0fw@1le6D9w#DEafEGfs^0!3EUlApLag_YxDEU*OytjFLYxO8$T-`L5pcb52IdeJp{RJ{>=23m#2cu49!bc>^0CMt~@Q9R1@jJ`2*^v#(!k1`&* z*>0aLgys{|T{Zz4t#Pjq$aE%^6x5V?if*qgf4F4g?1^Pn)deLb-a^C3i=1&^adpw% z-Z{lp)s+R+#pPu=#U2I)m9=TQfxI~iRn^_zfO?e>Q&3$n zp}bOcY^t}Q(ov3bu3<#RH=(k;G`ps(up}^k zJ(tVzmU!nBRC_hPhtY4{p11P8B5#=*pov;sSfa{XeP1s{Y;gfyx<#)ZVy9$O5s#fq zferFK%_uCcswgR_6-ig(0_iNRsGc}`lGj^E(N}-PRf@8^Ys$(nOok!P4h_-e)cDqh zw_@mVSLxG=tHGv1Zt5k+y5K3gRUuka||8EMKQ!qvI$V-9OKuE8Y+f`<=bjzIMSW! z*OUB-X5*tu-q{5;CDr4>7;hz7sD!i?RCy6r7ZjHnMnO$=xt&G=3JMGFnpNekd_04&hW zit@6;s%hm@?N(HcN^fcTL*4)h-CDNs+@+|g$|@_=x?NFTRqYh=aEbGj6jV|0buT~# zsT*wc z3CK`6s^qugFNm0p{!Xo}s`i#f8a>!i%nW67vTL&{D!gTdh)z`rLQRBxvg|frwYRK_ zCdw%Bmdzm#t7>LxRMW~QmKAz^HiB;WS${kXX?Yn03FE~17lsu*tMFD<*XF`ypeRu} zyp@&Zl{pTBi2ghbv*(>wu77N}lCSDfGf@l@^x;=AB%OR?3~;l&R&YKec8~L1lW% z#FVVklo`;2lu6#=IYqO|D+htj8?G(9!KPOFB@PijXQcaS`%p-5b~zx_DCbO9Gl=ef zNV;RFLelAHN%4?$MTSyMUv;GX$ui3^&)L47@^p=E<1{hU^7b@7UZ2OSX4#a7i=ZMY zFl&_l|A)PA0gJ1;+CCEo9SsR%Wa_Aij!JaYm=Fz$Q4|8iK}n>6D6O$TU*IA<+U}Ho(3L*o?48->7GI{L3$9CYvHxXYjE2$n&6Sk{IxV@r;8?y zrJqPc0lB{ORH81JS$g~OvGk;2zyrqI$jW-Z)V;cVncss@@;_BqL04#TLAber7JUo4 zpk8hhMEfX?oe~Eh+!5_ zj%kGGKJ2Ng$AaqmrlYkH8n3*z4*g&8I?c|8&Xn`VY|mwIa4~y@xj50`;DS3kuM4QI8Swrt8*-CtvVO3oW|>=uO8rp6js|MF-Ab zSWsY^`Qqz4raU>b)Ya>;9(`X^=kZrn!G0dJLacBQ^XrVWiChGoSpK6wb$8Lf$3u-HAK{k$T+Ozdz-AGxp7rdulzbJD{{4PnjHX_MsR$`Z73)IHbh`ymL?gpybY!`D#r+nO^r-;ROty?BI1xb)MV)`w9(w0<<#UVB+rj}xnMzLAhoTk!L)DxdVV-E;EUbfP zRpRWRu7VQg#+khmKvy{DN}S+Oy67@5pNDy-Hl1lwoCWguA4?vBNe(tVwe@)VP*r~rsj>Y7 zf4DVH`?1u+4ns@@`j|QdOIYO5I#LWxvZ+xfC1Bc{E042ehf<`;sV;9UufSnS)BJjx z@pRkJ5I$3j!}0AhwaMc(RD=at(~PNEqin2=CyK#_0dsKq)_$bAMoAyru7~1PhtU6K zf3mdMs?s6ITY!bxf6_m%rlUYz;MfWtf_^!*^-cea^2Q#Jq@Nz|$TJa0$$2P%BAOQC zVIglq#0(g7kw;+{qn4+Ha+KyJK1UlW$s6YX-TDlD!5bGXjup`~PFUpNR3p!QMa!xpv+(V{gmXnnB+(4dq>E*=pX2U5DEq9G? z4$P+KG=_9q&%(ilC(9=xm458F@dQwNZf89w#IrE*fYNk$h@zCA^c14BJ)}k(YLw?r zdWNiXGw3~$nwjT+``k2Yr+kk@(iP{@f5R0YuC@s0sI>Ti(()LZ=1PNjYLIA19iA^2 z!J+W{r@B5sYRG%HuH;J}AvnbVfg`F9bXhtxL)jD?!SI~uHN zG+}m4U2Z)+8sxVdsK4l4jxq8rZEgz8@zWea+c()sP^wxxsON`_@@$=~p+8ul%xt%L z<#pvt=z+34tIDfuUP{reUfV7Td&oE@TTJVcycQg=H)RJ%JFQ~99?6xoUZ-X+oNLj# zb#}dYcoA)`;*ZvBmfL_jqL1q!q^2qF2hHWRc-(Ax&Ual+LoSZr@E8R9ttJJ_wmNdW z^2Ww;@p?i|c|&;xy>cKmscF(oN0XFZr+98|ctAd?y)}A2lPGDo?11*rP{yig$Fkt^ z0JOzZ3xBl1m734x&^r&%SXV(PsEsp=+R^8oG*ak@o2+fLj~HjfTo|aS#p#J(oa$qL z)ab9mpzjyA!Q z)-tt49th#wmY!|U`Ra9b_1ELf6q`6bV}Qt-ChOCV(Hr0B@uOi3<1wKaPBVm3vKtNU zz&THCvwV&!8zXXDoxNaw{`|{k^Xh~;8{t+&huWI*CJKV4!$h$W#^WTJWS9qIl{B79 ziSUSZfjAqa@}6ou{=q4+n4_jPdloN8_tO?!NcU7y&0g`%&jQYj9_17U8jI_F^z_I$ zSBqx_(fQ|K`ru86`dU0(lC^mam5!>8)>|TTw$R&Hr{^4;vC;!HoFdauj6Sb8h#uI3 zV$mVwnNM(dQ9!ap|IqlNo2WcdhPnlz96d!_s`>uwrDj#)n8;)lAp~EgVq-3Y0`Vjr z6=q7OH!QSr(Ry?1E3Tse!Y?n8hluKP%Wi5%uV) zIr8N%#T111QT&Y!^|ewY<|ow0HPHZyTP4-QO`~cp?QV+Q-dz8(8oX;m`D>cyET_Ju zd-{mjA~ed@PM>AMp?#0zY=o2P-gZM_!2q>?YK!=H}0rxh3-<0$-a5@k#{Bw?%D(b$9fw;w+hdEGccN!61k_L4Cc!AjF)eOLZd)|XJs z^_|xz@~^QUHCL3>E#f$4?kxsc4roARDrBxrpxRd-Nd^H6?YD9J7Ys}JiqF&@@5EL^ z`*V?>+h3$*>(_2%Z>&v#MzUv;P_b-P%EV4c;R*n=@RL1u*{-4=GyBITInMRAXb(G~ zgY1EeQSM?{t~iCutud9e%L-APmCy?#Kb60c%WLmzd>N~JlA(M%RlYWXszdw7ar+mh za{a2QeA3zkt@YFbvb$#gB)AfnLBA$&`xm|~d5JwHIq(XtUppKu(ZLQQU1ZwC0UJ76 z*jRR|^l=hb4EdF^o!7wD^hroH$xm8+q-G#U&|K0Q19Ot(%%W0D8|KZ50bLQHkrSUqoH7WUD zKxtQ9dK>3N!yNQY^# zi_O>e&2Oo#ygZYM`Gv4j^5Y&x7q2#=l9vngIbch`oGS}KC2neo+at~NMC%k{AXne zQn`;&K`DGHLe6HudR_1#oo}tO_HSbqDi(5?7~5 zoWkSj{x;@&Bu@TP;{83$XL*yg{DaK*NIa3#*GMvIpA&ABj5S_~n*C3xWxl3QmZVQ8 zV}66g)rHLGd~4bz-7zBZ_$?CGbV=0mAK%0L0f}0@?qTK+S@>Lj4a?Q~#Z@fxt#wLV zT_W*VZr9ot<})5Ujq`K8TE86YVg8UrP5#6bNo(Jmxt$t)NN6nM<`S&0HfDE^j4f$* zH>W#*p3!+XXGq@b+|JjlCH;nXblyYZyzW7+F~+%8pC(JIPoqbnnD`ZCH|aw*I8x@= z)FV-|cQyChI%+3ATK`nDKW-XiKBq6)E$MYx%qQ9SEaCCAu0+zBoFz|5deaE=3nf;4 zByqC@MH_!r9x&+QxW2m;_xNn;6rgNs08$$3v%5v|HGMXot0ld~Y32u#m{0A&N6X)Mv81#nBLqX z)9ZYkzf+rLS zGk-;Z=^@4piMRDKJ;GQbu@(B?5-IH^^9giF{)BfABU#|E9S-}!VL$lKjRWaT*e_*i zcM>1u_^ojt7}oA2J}_vZ2P|~Ag>JXd4Q6_cg?_+iPG8G$QsX|5rrk+=z+M@9cKD|OZ)F1G^ejIlS*fs znbBEop$jc^mYLSpX&P7CM`*OR|Iuh|p4I5}s&*%Fy~Q5udo1Z)7TVJO^_KRmZ?)tv zGt=6BPUGI^*6t)~`xcG6-lyG3)b=kLcePc2ua+Wlz0*RQNoC!LnXzujLR;jov)Du1 z=W3(%ZguCv%n+lOko*0pPQoZn*4buE^3OMY#AuH{;1DQ~r(wY{6uw2~4Z=r+^Z zx>4g=+tX=jAO0A(>0{MrYpW?)*;;L;t@>^CnbWoPs>apU!5Y2AtKCW5>aoyHGp(&# zHSTl6+MUGbhAecyg|^u1xh`{hXQ73*==Yq(e$Ta<^FP;Mp-U`umW8&;cU#iUq+*>f zwpiM~Wzbw;i>3WrEbZ6U;aaKf1KOR$?Uwupt8aU!x%@VZeYdw;(tFMH_G$}VXrZ$# zw8ehghAinGGkvJk8x}paas!>(-M@zM1Sq~{(WSK z)8qKhBO{z1$NwL7aC#j7f7H$C8iF+H_h`mJ%KJEd3Zu1r^+C$Fa5|qe5@o8tmDBkg zbyRvAr{^#NOyxEIyexKlm)36aE}hI{EdTHNXIBZ=+Z?BUO~35e>A%qQTN)=_YyZ=+ z)Bk_>?}Npc$FkTij@b5jtneV|Wt@IwobuJoj}sps)zagQzk~SyLq3)tXMQ}`{QFod zm&Y&aXdk10KQ_eNIOFRv^&siPnp7Q4@<*6|MeOv0jlW-N?T=@_43--w{b2L!!Q$fv zZG6U=-yZ7Z`kk@c_fQY>2-_%qkd0l z_G^uu{$v*O<$qEUgt7dSy_}xN2r#AhGe1uMJvqebapKdH>e%If#mS0GyD``QD>w7M zA1A$y`Ag!Y4>P|tc6xUU^M4dO{nr}%Ztcdb->*BEUmiRCHyYcc-I&Y&#>@QevD1H> z!TkI<>00}*jGg{eC-d`Sr$?vlIO~_EHTiMI*VBV6H;#TAwf4o)Z=+`ac5K;*?jJKQDIrvl+~f<3G=K za(bNkbCV`E&id?;AE_#j)@6otz#=|L40o{Sroi zss3T+|0H&LZ!7a}i=F<0)^Bm*#|wpA&K{?H3G=ma0Me-63mu#uXaD^|7pKRu&kH@A z?qmcQ?GbS!zce|EK$dCz-MGm` zRuAOZNIK-$sHrw^#rs0I#ohn)k9Mv&NXn+(ha~^iG)cc&$TZ}V{8zdBt6cuo4ynhhkdr{^ zU5wq#?_s)^v7h+^Ob;>+F<)hRm~lk%cPWzI;v6%x67bhaL%(Z;<&zOskB; z%pZ~T8w#UC^51YW?Pl~aKTYcUMh5e<7z>$S!gLv91M^#$Ze?s|emCQQ3&AkOZI$okm(^tmHER=k4Qu| zk$=#^w3E@zd=JxJ#x&+}t&DAq?Tj6aos3Po%wqI07BZGFmN8Z{HZZm@ zwlcOcwlj7xb~1J`b~E-c_A>S}4loWf4l$~X!;B*m-%=PIj7~;3qleMUn8ujFn8oO0 zEMzQUEMu%@Y+!6*Y-Ma?Y-j9X>}2d>>}Kp?>}Bj{9AF$|9AZ=%hZ#pCVhb+D@!JkY zC!?Fu!{}v9W6WU8V)QWr} z2N_ky5s80sFuEDNj2VnR#uCPA#umml#tz0V#vaCg#z97vaYW)C2cw(O%b3CFV=Q5; zW^7?>W9(q;V(ek;XB=cy8Al`zIT+oHUd9YYA7cq)HDe278)FA!7h?}&KjR>y$~YqN z9S5VE(aV^@=wmEltY&OsY-8+T>|*R;>}MQgR2fGk{?)- z7`qsI82cFq8CAv+iGOo2x*5HU8H_&062@xA7RENl4#qCV9>#vgK}MBvMB=*+MmM9E zF@w>^Si)G%*uvPx*umJv*u&V*ILN3nj!1mZ!H76O>$Uev7&{ny86iic4=}R4_lCGU z%YAQ{X_o)KBI)7j9rZV zjH*QXlR*h(ilTZMeT>zNZH!%v{fw%_y$(h%qmQwgv5m2dv7b?u_@RT*%jjdQW^7~Z zV(e#BCGK-DdKrC;)r@V7U5x#Vs>F{Rj9x|`V>M$NV;5sTqbl)Z2cwtK$5_qS#@NN! z&!|fL#KGug^f6X5wlQ`w_A{yyKXovA8GVe^jBSivjQxzN#9;@cm(j;q&Dh4+#n{iN zO8m^h=w7j9rZVjH<*h9E@H@A7eFR8)Fw^Kcgy< z{=^aa|Ce4yA7eFR8)Fw^Kcgz~?+!*UqmQwgv5m2dv7b?uxZlC(W%MytGqy2yG4?a6 z5)U{Sy^KD_YQ{FkF2;UFRpN+)(aY##tY&Ou>|*Rul<~0FNH1f*q8vjs;-f&sM}b3( zDkI{f;3GZ~ex)!v7!e-@AMsJ3htVtR`5H9E;jckE%50n45|nX!??~uzC{+yrhg;Z<0N2n$t7c zo0Q}QrV{4bku57LB@Oqp1ZP^>2Aj{B>ZJ_yHO=d_+b26Gr+Fv)E}mvjO|?T@;Vip% za;g`%_S`hLZ<@nxFA!fIXR6(uQ9R8~jj%hslkJ{ah4v&z;bgnr?ex0S3Y?X8yZ2(d zJtM_EtGLitU{CY9ole!3iZ*)+?UmJ@!YwvWQd(_N+Dcne0qROho0jyr&GE7=$+-iq z%u4k*?H-4{!Jd+4cevA9ZAty(Jc|lFi!wZmrghs=7p0bXhit`@8z!%@x!2fW38$0H zn&RxX%|dDWyW=`+DR#F##hX@E=F4z9N~#Ms*gD2NHLfM4+m_Ng&iqeV-c3klV@=*-L!K17H_83DEyH0? zO-gc5A-iLmd)hy31-aAOZRqGE_o9N-j8wWQh~BvE0lOy!S?!ZkvRdr0OQ)?Y!|o0& zDopiMFY>Ikxzj3J>;F;BF>olD{)&u$q13eA&W&?erq8xX=PSfA-IIc>k z-CdyXG|-3%$8FN-<9k5wH_%(~c-X7cC-^{@8t5|6_ZjF~(61V3=yUu;ojwt<<@n2W zn*N^3@wXW0FG26rY5MytCrs99`a3QsROmGQy_Xa2*6Gt>pA%G_roSI^;-xx$rUUdc z1HA$CFLnB?EYNT2H2r;>6aT5x^mlM3Pt|GqdpVOEb(;RJ&g6%5`oad#+jRP(Hqd|9 z={d0Xlw)-|Cj;~hot}3w=u33^yCa}|I$eeKPH8jHAAx>Ar|Iu;OfmEa{oRf!UmMbQ zE6Pb{=rsKukdulHH2UwPRXR<7Z{eh0=`{UahLc{`Y5MyOCmZ^!Q2}j`M}H6ECrzj6?^<}8bh_0Gx<{vP>jgcm)AaWmPB~kr z>F+w6Qm)hV_a9E_)W_rPu;(d{>hzDG|0z#Sw4+(#vmO0$%4VI0y2>ei2HFAoH3RJi zy~jX%K<}G~T=FvjIOV@5PSWU+enmO;C<8qR+BFeUpDH-NrZ zr!(3?cj}7jFr!V*5J)A_Hz6|~~Zi<11{^N3V`trL#mmBC2&`mmh1=JsRyH20` zW6)0+=q}K&COeQ#dMjQ2!?f89_B`bItd#vah? zbb8?$&|7r60{SJssnf;qpTsY9`pNc!xs8+3%$)k|ItE!YNn62=yx=xKV$okKEpy^ zV4-s@^mi=u4HkNXh5ns|{=!U;Kh8p1^cjDlCEZg0_+^&#poM8gQ z7WzT6{U`m_LceOEF<%<{?^wk`Tl(|ZX_oYhEp&l}zSitN$6~%W)pv)5zR#u{VepS* zA2YY_Sj1Dqe^XPA{hNi}Z>Ccazm7D>OF{pe=;JN4$3lB8bee_6{AQAOiG|L!&{tUK z1r{3fkx5>;g|4&Eh;OF+7XM7S$85h8i#=1eSkhmy(0{hje>c;vBnu7yHI5G#{K2T7 ztJp$gyqnT7-VzP{Tk{FBhDDE|!{ zK)v4pcehJ?qeJ3*)ru0Kd`=8V!ZL($!d8ipZ5s#rs~(Bii`f!Dzv`BVy_le1$Ci}% z*o#SYNPIs-u^j{c`z4Gmj2(QH)95431bUm2V)Q8AmfNc{2wFHZy#qcmN2$3b};rZ4l<5N{KU9BF zC5$bM9gIDUgN!2*KX)@`FqSa3Fm^EZFb*<~Nc_Uhn88@W*uvPs*uyx;I3n>&H)954 z31bUm2V)Q8AmfO{zq=VT7)uyi7&{ny7zY_gB<^=JW-yj8wlH=u_Am}Ijz~PqsYjqf6qOZi(--E4FjNe;4uz|Jsr`miQNi z(aGpxOk>PqEMzQWY+!6}Kp`9AF$`9G198VRSNj7}FTD7z-K87#kQ{8QU2< z8M_&K83!1L7>6YeDU41=4`Ui*7Goh}8Dj%uD`PujCu28bFXI5?5aY1KcN9h^qlYn# zF^jQ~v5c{Sv6Zotv751%ae#4%aaiJC6-FnchcS&Yi?NWgjIn{Sm9d?%ld+qzmvMk` zh;dlr-xNkCqlYn#F^jQ~v5c{Sv6Zo%v6Hczv6pdxafoqP;=2l?lQE4ki?NWgjIn{S zm9d?%ld+qzmvMk`h;dlrdx}Km4nnvq8uKRG&-|fQLt+E!^I$Y~eye*Mqno!nFa{!?+&7^(Zc^+mv76qQB|& zOI$cxRi420B(7iK>c;hJT))BfTU<}!dK%Y8T+iUb`cZin*Ct$>ac#l%9Imanp2yXT z>jhlfaBau61J{eVcH-*8)sO2XT))HhU$|bz^$M=va<`L8ZXK6*!srkHs*$@;v&uz;5rf4WL#5lorLRTTpnDf;5rr8X}He8H67OsTxqyw;+lmk9oPBL=?+{WTtCJY z#`P0iKgHFK>rPyUedVyPu&>xA!Dr5dPkana#WfAr*|^RE4`a`EI&cNjbPnnJ% zv92hsz>gO%sc&3fT8AG+FP&c`egw5N*6*Q8W-0x`?*ji4{1&+UAz1zA=I7!UTlx3L z4=Hc-XWzBljeaOI$KMo)EnhL^GydefuEU(=_=V(J{6aSUzPtE++VaNb=7O<>|7Q#0 zr*HAo-xUFWWpVu#{^d=Y2ABB*)>h{?<<~U@@H^7}N-bA@(}L!@Iy6FK6qGmDRaEC! zjmjyEAb#k)xF%5RH~f;Z_>KFD`ntl#ntJ?N{PH6DDf{I)wfNS4g_q4)Sl<*d8dIy( z%BSB(9&J-;O@Cv&)JEYd_^o-at!T6bz`7cp7L|mb4wnAcw7_3p8STBX^ISRS@|@C~ zg6yKA(o|WM;WxzRG}cru@hhdHGwHoCI!*flboqPgvT*)Y*$cD^w6fF78ya9&@f*hZ zFggE>wP*v^d9Y&CTlhuhgBFq2v<^J3WL{oz_90ndR7R~O@dQ~cLBE`w!#}!RDhT=W z&V`Nj75=6sYK#(tPf}v>@q^ovZ7`mm*T9TsEcP#LsBgr`o?BmwAHLQzTN0uLa0Bxi zJOUMpXcPUZaQ@|QjUW4W!L?NS751X#O#wfCq1yPP+W5h340{^4QhKakYmbp;sZ7h^ zqk$E2~IPO|G5} zKaRnb>DhIaIo0L#6X5S%_!|wJ=r5v+EU-kSY!`kk+)^AIOL1__ z#dGFnH#U|phs*fuD#b1Rn7n~^Re5bQ%)`7KVR#EUuQ^b@m@Lbg5dCxNo9hBbh7gkt zbt?TW#Ai*BHCln3Q^}t4P8bh4o9ilT{lvy>Q{UWJ;WsBlHR6ndmiJB6BT;LMYK1V= zDl?Gn^DFTy^EFj96uY(BkRcwst_t0&&$xyX^U7=Lq*xL}3KuVL@aN|mW-Cgdu&J9- zr>KBAowS>?Jm7DdUvEq#?ZGV!2!%-iI0gQ?B@}jqe2TG4%LDLPQ$<#`bqJtrv}H7C z(4HpYW2S_ty$zWKFRG(1MDPvnVJ*T*qf4SiQ5Vt+fh$ca+8M0|?5GpznHTt%)-UtN zNWeTC<>vjMxxAL7K}L3MZ9QhUdSO;mRR!Qn7tE0}0F^MVC34_G2oRN(S1xYyH!hQ| zG&%!>=F)<)W^pr?OtMgHQPxFC>|C;md8lvs*cHo+raa9{7aQGUzMzekGzMPjMl_n> zGyd|Wq>eHDYAn6{#r1mP0z@TA<&~KmoBcMHKt@^g$gmUh{&P2o{<+Fch=055M2$*3xcr_D-+7J*F$jWuJN%3ErdHZLuz zxq*U2UR_0fC2VFYWym6D(s=bCJd;&*Rph!QXD%lcls5&4MSWIZhmk|oa9UACwVzg1 zk`e78IXyw6nB}6`XnhwzuDCUboaDxHix&8+Ow|bP7}g^NMRCnqq9!QE+N&#paO~U79B)Jo=F=^0Uk!^2Ge2{(We2!(N|7Ws!}?4zT8;hu86u! ztP=Av!x3X{O(fNs%>^*IMZ{V2(Y z&>T69jVdYEyrbCca?(>Qnj$T_?b30oSeRggL-Lz69t~G9ZY>hTxG*TPfc6#!T0|cML+*pAHd=0C>`)Lf_AS<^#q|^q zlv1A1dH5=&r3>q>M}z^tshJ{vDIy*m4M#+E0cp{k+VUnGja2y?{dE;0M?Ib7p;wyf z>(Cv6<)zEgP*8BOQwCj8j`_pPTE=@5tl$tpuyym-)FSd%$Yn{DhPCzejbK-y(-Cy4 z&;!sJ0BKcCem??F6;y*yRt5aESTQc~2P&>d7GNFrt~DZPf@r7#v!>1;D6I?BHz=jo zVNay3D|7u-<;}H_VPwu@y^Os1%~SR(zxTNNO-lZv$eVw``~(J5;MHX*V{(78r> zY15J->@ka)(ShfdR@JmL!#pA`H%AMPrQ^__IYCADPh}e>O(4I5(S(#)h_$Z~dt;mmR@z5Z9~tBG!c z53Oq5iN?xb(k;h<&tSY{Tv@bC$<$nvqImDY;qQJ2v~V0b7+(c^#K6R~Ao zi)pPw?7V6V8?~iQVR@Zj4m`}-|6?UkWR#ut?unJE^@5hhrokc!n$dDkIY&;YS}5`0 zL=CVb?CAV)M$G7ph{%TJfN^xe1FX$6 zNVN`{(V5MXt@(BTqHW^BKn>Qd*dcn@Q~gzXXGdMuoKvo8puBX6IJuf)ZAF*QuF-a) zvzInE1?Ko^1y5)7@zgq~m^jso=3r@u$5lAu)V=1=QI2cB+ zV{>z+r?Rp9`XcN_{FV7Q6{!f!rd_63#mvTpAr2r8E~LEj`{+$Njli=e2+S7u2QMe* zYU7hUG={_+ylA8K0pOvQsx7a;iC&%l*r^aMl7szhBPwlzP3IOWG&ciEbEeNsPoI9_ zd9%`I5^?^y)6*|J_rmk&{(=i}KWmoYr(b~k^U^OQetHJoUvRG643sX#22k4`P$`ly zEA4!db0+T7&WAMNtnyt0dKm$uT^qH6ApcQHD{+>%L_8UkF$s_UM?J9TL5%4}DGii2 zV*A%rTrXnZaz6ezWGT8jT6KQfddn9X5G)tVJ)9*ND5dC3LkOYwT@HT^Ti~z-4qM<~ zvA`d`{`ebuAv6Jn@p7ng3@#OKgsx&?cOSe#c<%uFNn8VTGp4VmJ92NKe! zv{W1@OG40Qc`bOWls?ydMVc4?`<8mE&qQHhULUgx8dpM^Jd=|i+p9=fzlB=8q@8F+x(SYDeU8CH2i^yV`@ zcoA59h&IZ@3&o~SRNhQ_y?3q^G8LDIFkIavnfDd0Kw*Ut>G7P%U?d{zmGq+Pge28Yzl41E~ zc@=arPZF)|EqqxP=;m@nk8Qt797yPuSmlW~=aJlrH`B%E6&XjE8U;rEYH@65mDfpc z*yF>)LLqu={lo!vlfO2${d!oQPl{EDJ_LCUjrD>0So(>#{~;^te}jiEFIImzQJy|{ z!C!oc9$UW(Jm$~?mDPT3me-26u<1ke*z%TCRFwL~gD|X+7hC0Zd?@9#OHha&Tb}F> zdWI0Iz21FNkk($J4?!LtQ&4Y=9v^8Ic|;$Ayc*i{(IX*idowKZh&GO2HbWFjOBXj` z*hW8Ad08y4B$~slpUuFhTMX<^W_V%;Z~O>=M9Nj4&W2mVCCG*s1brcDW)iob9QULh{}T*lXhz*bz3~x^^jz)Pj>zEImUuit{Rta2ahZl-%oPt z8~tNDh%pDG(Pwl$Z=+%NjMa}MMYm}zn`h53=aE$%{yuDh!xlJffx{L!Y=OfTIBbE# z7C3By!xlJffx{L!Y=OfT_zznkyQm;M<(79Nk?f+#)ay4WO7h9dLSHz2@)LOO5qvNE z>g=ns7iJgd2me{*3%=%C@sYz9%8Yd5PZ7GldK_6onfLucQSyU3eHZQtq@v(!;6_}p zP+B;BBSCOa#Px)@NvuO&uzw1wAoxMVbvthIgD*l#flTp(5pk7@^be6UPs@2RZa`DI zFW47xEux!My}n@LB$RAE#kXRI1L?19rfiw-1Fp$llznaX_p(c0+WWijf*Z;l`aLD4 z+fX#(`o}Lx2dd*$aR+Vsal`4NjuFs#GhgzBCVUI>3c`uMA_)E!mEJ8y-7bnAh`4T| zqM^*c{7OhD1r>39hj`)iIRvEgg}BKM_95G^WHz_RHi^oI(<>S@n{yf&=~YgM(1I zAP66PG!q-$`4t^(^Aq1JezR;FF5x)iAq*AmJTn$U@7AyUgGO?eW$P@X4w zYqQ(emzzrGX~>kD>I~&MgMn0XE;ob*?Wqx0GH$4JIDH}RNJ#Kn*w{Z*5Zqo6T&flX zn}_p*y9gvSUDhS==3FhrUm0n*kuP1q9p1Un?d&Fgj zK+!*azTltGPvHrhq=iCV)UH+dp10~iYSV^08p|3HFDuk=iEM z`vrSIusp(0*|1rynfCueHzlw93TKg!aG9ti8{ZUEM7^mX zM5s9tH?R*`4v}mda)0#*C4Cxk4dZ6-MiLSE9nzc6hI6Znt|nD?BA8r=2F>hMS6ziS z5(>cG8=|bi?dqi>%O3Sbq@Y`0pb-;J{~4r3TtCJ)M)0*gf>%dWa8EvkfyKDb55l-E z`fFb(@NJnGartnA&P6Z{OeqL{jil4T5!z3|&C1^F=TNiKoRBy3<9Vz0Ynf~!6Gr#Q z!y?o3TBb;DP|bCWB(MAl`EoeDAL-B{;(8u8c`IRyy#By+B&-KbqbD?F749OgpHjx~ zgwAIuKbfkI80gE$Yk4apqDZYMasWjZh$4$*k#nfMqR2(jA}Ie8s3^+2R?=M%5g~IE zMlF(l3kK!~d{dkXP5AmJq0BR6740N4 z_+G^IBPxMeBl+%LG4^R@D+v1siZDvu1)+0(gg^Jzmp1@w0d^DYo4+-J4~(O}f+tq_ zp=LS^%LKC{v-y^-yT$F7leJBEfA=ra^NGh#u;Uea8_w2_y+R0)nbg@?i|` z6+7G_ILTNfzu}($5EJdHU4djsf8imr&}Mw^n*dVUyMXK;nsT>j+8#0c3A3*R;~Ft~ zX6{0IGfJUM9RVU9jjA@+aG#{MFHGK;__rtlgZ*9-zEzRHOa$!}pdtOdpfiV`CYq}M4mn5gPY?t%*{JT&+;MW*M|OApOjz6{GT`4aTtRY?8ccSM#|X z&ozBcl=>8F`dmRbv>@Du<=OrniV`>u3ayorpA?lM)IW?HSSWBZYJEVaZClUgc@{S- zdy`l0QK&7h+hp=@wW5#V1{EZ)!b(R`vriWkB6{*lOxa`;HFYlYb_N>ZGOHg38BRYJ zjfuFX;T!XMK@ih#9~8@#(w~MqJ{&_{CCSNK}n7x6zH}$mu8~9QmnVQyuB= zVTKZY@-}Wz=W~)h5%mamqM^diUNBYop~!;@-=RF=^b@oSk1z^p^s#-o3wN)PZqct1EQ6NXgK{8)E{x3NLs+-LsL&#gS$}X zgEI9rkvc`{c!bCVqx?6C3GNZj_1XQ{M@4pvc_e)|3Zv!liAJh9xGmy(f#ikLFBfI8 z+R4U^^o}EmrA6X`P;IIc`93FALxEJch{>2m@`a%H)SEA-)k3gu@2$9@#i(Hi{BSQM z@ho{fmh+Hv7UV=+srcqu@>a@&@eg$|{_#zAxE!6PN*jKM^rYojA>ANtI;^k;LllLk z2w}$w)us%=wiGqw7IzmYF~f_Uja=w_i>jh&7dnxaff_{4AojTs^)pDvdKBN#>szQ| z@AHCx1LQ-*FiiqYvkqOrfB#s>Gy3u2+EP2$22k3xRwGops0W7cq^tl^aos^J5CqXtK`hO0yk zh4E^*7x~#M(?h~k)PNyNXrj1;#Q{uw97b})MfS#G_6|su20>FYMg14xJ3rWqE%3uX zqcQQhw09ZRA97?zUWbggo+BO8lSCgJL6!C;ZU>J(Q3HsvBL|IGNQ*TU)>gEx!V2OZ z%8!Vdyy`>T&Fb1DI)q(tV3N51 zPEqVQq3DEOOt|^t0HYuTF*f3c(`S=3a=)44h7KK`q1`$BNig6lN779=-6P~8r;ry+ zRJULZlS=tF#*GppStK=0%=Ey{0TDuBAI`o$bY5GFLF=#5Y@@mM73~=#rST`d}}kB zMS(y4H+NGytn&-p>`dH73DHm!PR|j>e2-S7@|fdwxTHAz&=#n-e&n>FNGP*w4JkW` z3eXI(c^q!S6D}8F$yFhv(*{zPhVlJ$L)q>^wu10;S=e?#n-rl9(#PXQ?6C@h->ARD zN{g0a)yRuYee%i_k{z1z#!m?@QuApg7P?5d|4ua<6nQ#&>nC}1OQ(MOpq5zJ{#7`I z>kHbwi(!A~U8Hsh-()7ix>>MVh!uAILYn)#A_Fx0wz$DkV23&b;vstmI26-dr&Cg9 z1QuMD5A}{D68T<6d{Zq)iuT|b zl7iGjB55rZ!+ERBffSqv5-U@&bKN1C<1PW2?+Ks#5r|EcL)KkQXwB@XZwZHWXoicUy^5wDuRqqWe;vv_BQ)4o*u`Ryde0# zdI2o8?*bed^@I70WMZ6ogaI>m3dSd3Bol*9k;3WAg?~4ZpM=x@DFPTw`~_7KetP(u zNJO}Y`qNzUjZJVtB`|L0uHdW58*zkjH)X(qM~5$bQ~S)`l~D1fc3)o}nu+qsdD~|0 z@5}2}#@nEAUMCWsq6GD3AuRc>-hJb+TQ@8$4eLg+(M}>i#r{yZD{tdMiR*g66(@~Z zZJDd11h(BjjuHqO*Mpe3pQb064;$Y4r@oBpM6Mmp z<0;o7&|);14N@o(N`5Y!jsf9kz?=YFdwz4Pi@s?^)-*jI!tv6 zS#Yg+{WEvX+)t~wzC3a!MZN6|YVJZDmF~n+nKl)f7YXs-K)fB|$raR>pfb+CnvbRU z98G=?V)re@kX9E`lQ7uNB)o8YphP`caQf8kS)}0s8boQ#>IMsPQXpquaM%}oL7bI; zgYu~IPEsAszZ#h_M${_>9>|-yU(FS_5%pq$pQ^Kf`*1Rc_6)~!lwMk+@$-}~>Cnl8 z?n++SGY++c5|0m2WnaT+p$xSgYQf5M7Kmo1-wi({1^xs!W{I1@x=pYSs3!|na}^}a z*a!)5A*|c&hqbpZJylCC_z}cwvXie8`>V1>~T}OcX=&0|L zM?^c+AA&(cWe<=VK`t? zpp6CIE(M;8oLc?=l_|RKWcA0mAq%t+hSPtqOZp2q0o`Ma|qlzwX4s6*Co^C9b}$fo*5zxJYw0~h9p&ZpX|sCE$=v2PYC z^kw5$>d;%?Lkj#1;||Y6_Nc!CnYZ%Y<_ToHb!ZozvpxtNo!QA7cUbg96de-V`|#3M z+Tvpot0HSFChDL32o;80>jhk-=3b0gwyPkxcWWK~%l7k$t&s>tC_XAykC7EMUxOt_ zLGTmx38^lkOuz>gJmrmtAuqU7oeDwh3a3-UKD&tOSvVkk_XS_@FL1CybvtpZajiRPEQReg;`lfuYqy8>k&S)ftwm|1lfK{ph-V znQ)MTaFtDMrdkbV`KhEa3*+1j`fp0)7*Hh}5h%f2S8(C}8@KxUR?!+2$xs*ZpVC)| zWvi0B@^q>(#EV$hab$>adKv(aFy2xpX_c<>K|=Gl_P$Ru0NVa{N(c(M`yQKz0DdB( z&3C%Nq?PfTq{@nx63BlUx9TmFJM6k-BEf{u9}=4av@`ozh=ZIr)T@yLVv<*`5k)f- zAxgoXJ(T$PO5_N+o&(4Ur|d#1lK8IJ%O}1FVTft>P_FRZg=E)ob2lEqu;{#QUpTRs zG6kO#sd$Fz3#}r{L;n(jP@+%Nk)f_2(bC5BMBrAj{oSelHG^v0qkfHK8ow(<|Dka~ z3~lxI$B06-PNC^2fVwbEhXI(Eze2nAE=D%QlfSOO(j;_=x)3}d;s*KLJhBa)&+Sm} zqw2$njY8WeNL%cVcgRv$ITC|=St=e*Tq3eQTt-=gd(oh3YEU@w%1#oxssWUG7PN<( z(oA$ADxjLfuK6g4QLJ7{Rm$2Y%S7}$0?7O7T9BexUcYLiT%qQE(*75sgm|*FL9nGW zhv)Tf>KC2)7lfN$+$rjB$Zny9y|h9)gUZ7$e}7Qe9I58;HMBFED+%A^Yx6)?A@V*A-kzIPE z6{EcX)n{K-5d4ZB+0jf=qTUY)h=9qf?n7bp=$~#S%YKs|x=B&brkbS3-9ij>&9ShM zoRZ-k5j2wf=SJL;hF4QQ>Y*QEvWK>a5^9-9+aI`uR+Y`X2$%_PJiXHp845@kLa}@A zc6cOt^mK4ge(x_qV?{_k|CMZzh~4iXnPT^Mp>?W3>t-p4X1+^V>uVn{Xq`{#(yMkt z8PXcvC$)YtJ*xF%B5i-*EYkXU@S$8_3bbxmZ_xT4*_`B+6QQI*LlNRHHE4KSt8UlV zWFe!5n_-HmT_2@%sbQ+n!l2=4x`qyswm)z>X*h*7q=@_bbp{Q;T1!hcBThD`Yh0ZyNv<^4eNH&e% z3b3WR$t!;a|5T5lib?;S$t%wX1E#+1e&O-z$;gW(U;`RI1DiPNl1f+v`=9-RYlO6C zq%^d)ISmE#MZp8A6KpZeFw*bRvrJHrJ6eb#FQ=*Jcv%r`F7}>_6b$goD0?{lWL9Af z*w|OBx(ksAYIGr-ks8!7*zxSghAEVI(M^<=p%#z`5t^FkL&V#NUNj0;2+2E%(+qQmJ0Yo*op&Lous z^w8@&%z8txn&+tb=*3{(+tB6q8>!I3x3{8tp?#{TtXDJ5NwO$57wYd(noKiI)Hf7+ z*(SzLYvxa}^H2h3sei>j0ix86RFL9_We{9Ia!0t6=h{y>u50^E!^!5e31gX*$QUnifh}^p*fn0gl60 z(E^EYX@x|$fr)VV=93_UMD25Fi^5g=amcpQ7nDmxUh1J)li{&QSw&T01xR%u3P>`P z_&sc1j(=&z3rAwv>sIKg{gm;rS@3reY?ju%P75(#D9h~&u6&)ElE31{)HDU-E}U2i zxiZ^Ik&T+2X3Up`e8kLx%r{|MlT4Ne4_djLoMgf(02ac+UZKQW1obpkAH>6r4E2HO zNDhj}Q!e4td(_k!G|(dIWPu0N6kwclA-FSwVPRk1AXzY!H;5yIo|(JyR=$*cH{NEr zsTYf{Zr=-ky%bBYZXdD$RmuuC8qCGz>wzZpxy5%HsJ^^mnTn-haNdCLD4a=vEnY*+ z8&Ws^GZK-zDEJdbjeH%3hRjiz7q0pk-Il1{{S}?3(tf^=*3fOAqp37mByW66%|~nL zU9C#I&Vol`wC{(1y!X=HE~p@OXJV1YZ!v{3J7`sm*MsriN+dAe7rLyFqT{&808M$v z_(C~8qA~jSfJIiEQbi@`J;5ayo$oeZ=nLH5z&UKGx( zzn4a*`WEz?*}E72!(LHu5@w(B-1X><@Pz3ipX)L}cCfb~_zo6ly)=w|19=$g>U@#? zB4o{xS;;^3tm++9?~2S9v6w{u9f9w*W^SkZjRqz zwCfFZr_AsrG8j_dL0c)c3#mI38zIoP4=*>?kmSGx>b;^+`i)X5ov!26&h6^YB)bc2 zdE$=fd$W*`Mg?g;UJnwTCL~}L;J|vPEpZZ3lQ+`pM!p!!J8E$*S)`sNrS3&n(gc47 zk)cd_KWJy-oA|a-C;HV3&Zd@qjHt5jVx&KT6dXb1M_yD9DX5aS)!R3rA_zmM#wzGSq(d-`zc+A8Jn_u-eRV38l$*~jB9lHEV?3H2qS+DK zKQTdK&dd%TfGRla!UC*EJ0`)x3Q>@H?gx2PZJ#=c+9fwpH_qJ8n)Rs@xVgswDMDb_ zQ0w=L)_t;1@C8z_ak$IUy*fT?@83o z;0`)S7YBN`38@Fvp9!Q@1zIZK7&bhCp#Ull^Yr(1vV(soUm!Doa;Bo>;&=>A+KXFX zxWvXP?NObOn;YDVD&ZSgCehKs1!~t3Yi2uzS{^U&JAI^^TEZSt`-X=^Q#W(&oG>+tI*6o^;2)udv3<9&m7Ce zF~HV_rT)P4wpI!P*zts~?Sy(I=ub5jwa~Wv`GEi_bt9BQ2(9>B_3KJqsVnsWRY3cw z(KC*ECzPUomOkc!YM6f(2#ti(zjKDUBS-|^8ObG;=>hZz4ScanK~Jj{)O@)^Y!S{X zCNK4SU{feuOzQ1II1*2s)XOM0+_pv}BRu~}b5j^eox+6@C|4-)(H~G|_{aOk!HriY zkXAuy^n`Bt>2yPz9zS|JI{LpxG}$laM_AB_2d5+Off4Fu^+Ysv<}NHx?KsXE!SZWB zd%CC1%311}Bo!}6Y|OGauPhQQrD5qU`4!Nfh|a2NpA8p zIpaV@eopD{?900NBv3yCqHCd8JTl z8(NDfhvh?Xfaee#&0yBQ^&<}^KDBNtslLY-UOV&;Ixyd%E(Ql@h?o&!&1dPyphYO| zv!~KTss0!GTi64SKoiHKzN$^i5$xO%A#9uP)*U1pHDVU9xYVs5wL=P~C+Lv8@_lMq z*x!myQ>Q~;dhWA}(!+V5h<7I_c4a@CKrH+>4+r=|6jFHz`hxaU^(vI(VO$JD_$shG z`3u^A1NeJaQOOX-ZFu3}R(LYj#&Q9tW+It~2sR#>7gA9S(TZKz&%7m4_hq5vpz1(I zaq|JUj@EvmG_-y~J*8x*?o^qBrqLnFM8$q8Z-&&lD322~oH9^U9HIUYHu;8TFc}mz zPjW(NPaT>6U6T7P5+TRku@n-1OVfayYOX_-#_$)lvUthE@W?qo_$6<-8em0Q7M!H+ zJ`H!Ym|4|vM@i;4(rB!6|@yT+K0X9lgPF2XlQggH1dTMc#IRhx|Lo<;G#av z&`%4ie4y?X?R}0U@<|g`#qX;H5RTQMn18l6-@lih2*KPR-bs!sOuY*^_C5?Y9hKpk z&9qW$PJ9Ydkx7XCA&H$UY7_fA zWXHS##oMXPFQ61w2Ux0Ru9t<>%c;P46o3lZ&y%mH-=VrQzrmhq6K$MsnMm5@5;M4s z{*zdE?Sl|j5PrH7JwqW2n|iz}!Dqk}h{q%IrWQCMr5>ot4L;XN)vrTc*mRL9zTjGw z`Zc^(>|25d`c@@T<){xycHBVcmysho`57#1Rt@1+-3YN&D@Fzo;Aw?(Kz$Aj5O{Mn z9ZjM!M%GoAk*?BsaBlV4Q$dC^KSnZq73M&eB4pV|bKn8uR{Rb_5z{;pW+P$dThs;L zoFa^(?gvUQ9)cIco6T?L(gUA)WR+D7r0!Mu!Qab+;NTaCNwmqHL) z1GW$X)uc&F0%;qX)CMTD)67XTbTSiWCT)W7kaklVNp?^miQ94QnSg zk1k$?v2ATvjG=8U_|*38Qn$7r)Z&-=6WSiQ24$efsnxsJc2sp=b&M%YbgRn!8m91D z^NdCPh(Xt@1U$1V2;cNYec%j&iRExK zfUKxA`k$1_SD1bm|Fk!uxV)Z`YUbOKJ+#3au#;X5NKQY;!=rm8)P+M4Jb@AW>6D0X zOSY9wT2y4{!YGu4!_=xC%X8X`h=*t5u8?dv&CzZdAUj-fHzE*B$ z7{GeH4du#6g!!bb++A`A zdhk`;$9Gii&H{8+?Y;i6wULS_Ue9E28VDz{)=srCVoq?fMe<*pjWpLV4gzun5{pK1E9EDs?$Ksq0UdCUr&oLa)U}*QfTN z1L=4^*l4na8F%lRhy3Fol0waVk-Ia3X0?@dmGkV}giXHt0e3miArsi-+C({GCkRN# z+XSAp^>=FYr zBU#4hFLc*qqABB#UADbYj{-*--4+hHhMf;$u(dHCrsL(34*5788!I9UA;#Ny;sRt?xlIbr05thY$k=xege zkeB8bAzFsT360zTvF-1%dL(HwrGq&G%!3%hw~E?lKf7`_UQ+oT+O>N3KjQyAA{{l> zyL8*%4^e~J%RkdrqQB8?&MvgeC-@W|7 zvwwi+i>N@aa=HmllG)zCT*(cfH#YNpE#@{T!5%SsxHIrD*?)`_K!q)Jta+DauxeH2o!8ToG z_tZ;t?}!3$Q2bQ<>k!52`1MT!YkPEs#8Vc>e$3qRwjhCgq^-BT5eUg``6XLKiNu3L ze4nUy=s07l+Wiu~e-XC1;aG{|zHiCKzk5k0Vh`tg;OngZOeJmwr8YQ!J!LnV4yQ2P z)6Pc-X}@!|bh5+wPXVz$|0)XDJrQ>=a_@5pS~?y#@&_xr=kAik@=-$9q%Wxey8VS& z`2IvQne+)0SJidlMEqWZiM!Srx7@^i81tVrc%_`v;JKf~?p_{0oS!ctyk4evqbOu0 zgyjUhvTI`2v)Cm}TAUK0Ea#zn*Q8lUfIft8Iz+R|^Iwh?qJ-}S#4yjm2hl5l!}0u2 zN}wx$7{@DByC>pP0e+97B|U}MWYJ@kbeD>`OKQ-Pt~4c`YnQaploT3W5;NADLFxZ8 zCFpJ7j@L^oyXHRK1r>MwGpgVu}ho$5tKT%sF(F+og7g?5y z^zOOaKPpo;b}&dJ{R_K_!}(J+%jJUyCMqM}Z!&qw&g405FnLt8NZINSfv)&mEW@q5%^t+CXq*i7bPIgG{Kl|CumHFhx0!q zjP4~9k%7|xFbUD(xx3CWY2y+lze73+5|d3m$&Ux1HkX_Lr^?eg1<^aIMh zTe$c=5p6HA&P>g8s${x*((T9*v%)6;JTgoCz|M2E73gp~UN78^^&Dg3=BK0)8t}Uu z&zm>1CeM~#ix^<%U!@at&6W88?USbpEjeC5Y)blXjY8w7jd?za!rK+Wxc&%n=?gX4R3 zq(%RLuSUe4OD7UMxBB+-?|b53ohgauu0moM@)^raDVTo|Qd>SPf$k*_DQ(-bd&%{p z58ioHtF@>;PankRi+@MjGUdU*#S-XV`F%YQk*;taa#4FOLICzWq2v1Rd+^DZTJ=3r zMA!BGhx5G>!uMPdSF?H~AKa7lR(Cb`W3|EIRouBAuW92#7;rt&+7(@01bR1;c0P^e~pg0JxLs-5?WWLf(&6|^W zuLLYrwp_%!m+TRc2^2YYNEkU@CWn%*f|-km!}&RyGXEzxN=li5vr+HE`Nv4@A=$Nb zQ0=$mB#k~1zWLxyt@T)gr2Q&_Wp_x}p&84x+H6V4&F?HO82>f0bd`BJM_DSSl z;is!3cKKa%zlsFV{EGtY(;)M-2!2U}Cl1&-Exk=G`4`m7KzHbFpT8i^*=O=8q4b|0-YlEtv-iHEzCEV4(F|XaCfE;a~>L zDoEk?fkd`z>Bpq{-Ak_4I6r(m;?V(=|HT`WlZQCjDQ8Ri?j?WN0MNaR&ON^biMc1I z>hRN5JKj3ndOKo~>L8*I=l@#M%DDf$grGlwbB%Na+39cBG>M(QevNFNykoxsUUk>P z_oI4f1XVu&{2Mf<60i>EFO~$mf3tG;L1$+(`-p5vnL==XzqV@k+vZhY{b)#TGxLxU z?i}BmikbdWJll~sU4}fk;yF_!SA89BWU|y&hLYUC&zqJw|2Q29;={tl@5B9vB>Hw` z!*|Vr^aIFJ4tzd}%rFNJVbTt(lw5+hv+Vuu*&=GD53Fkq7eARSuPpe-#->M~AMTlDuS3E?XZw z%k5B8{XBjgB+(P_3oL7g|thSyI0edv>XY?X5BhJJXxWaa2xIDbIz+Wva4H1vAO z55I$=iS!}y#S(+XWrkGxDLE9Et#lU><4!quX9ofhc*zLF=Oj|gQ#%kS>zQ~R0@ zR9qbYA~NQeqxxJ}7LPMfMxc^dDcig0$IFEy2k&fQBd2SAlf6oI3t&q8H9B|l5* zVV>8$hB~9FvM;>#o2YzQ?yb-49>VL)_~|eF)=$@@C)bEp)1Cr+V}jJUEB_lBRUH3w z7J2}t%WvzKX)V`@8Gb1i@njo|Tm^*rJ^_v#yZkl23>nC8fXR!o8#O%+qkbFTkBnq| zEmApY(lqaBJbU0?B;`${_GLZ2)A^$a%Fc#n=+(Q|zJgwveDCx@%^%M(-8elm3Z7Wmn#_2MSp@zENXHP6y(XBo}ldd}p`z ztwgt2ir9l$&n$lnb;fIXZ<&^h4`qrmBso5feI|ZB$lR~)e^#H~V;o*7is7d?@B@HY zo8)P@9MJqJcgFHPf6UEWSpaW&-XC*ktn7iee6PfLC9Y87`XsIwzn_R)B)AVlYM(Ir zB}s4P?&ZUX5yB)bY|Jej622FK7r>57x?$nRX*YPm*cxz zXfD!HNYBAbMd=RY{Pflpl5w9SW6kdu$VE!9V7_FQyO||Sj4a>p$a1flCA*j0cZJpy z^^-u?(vZ{}zuyDuaDF@dM|HsH?(}kvtkZ;R_aDG(Jy1ALECRg>QSj5K*`zsI=#1si z1ciPLeZ$nFURs*X-7EI$*m?$J)Q)0~%clKum1KDNlkpoJLNEs`p!LVZBKFo7Ifp8D zuk}i-7tMpR^H##sLTTl_=p_S^0H=6$rxt;^GEav#8Xiq8Z#;OBWKg8=cza3n76;dN=03>4LU82q@@OTO-`U)a$fYra!re-**8C1@{X`4W2&o1SIobsM;$<_2sU6R;siYD#I-6G5qit5546!L=2*L?B6;mchL*mmSPHSU6@<= zoj)P*ZMk*R9;!x3b(8KBSoGw!nJ6`P(NkOV!C!e>?xMl1Q=q}x+wiG}98%-=g;a4I zv&rF_FuT9OjXOU)*niDSI`2Q)KMP9_J;JgUp5U z-hYwQbidRR?ew^CF#a?FEOk2qvKzVxk!P#1yEk zPma+kPr7soveZ5G*;0sBvGp$WfFj&aCA#CEKd2g_?ahla+AF=7x+{0%_w-%{cjo|h zllZi{Yf_ck49g>afybN!->=eg4t%?YQs0O=yx^0UU>;fUDfK_2{_X1Dss3H+->v?= z>ff*a1L}WX{fE^5qWTZ3|7Gc6V~FVz2)`oC8HH|ify|DgJBsQ-KQ|DgV#)c>>k ze^vi)>iK~{6@#>$b{#^Cv ztACREr>MU`{nOPyL;W+=U#R|j)jwPP_o=@`{qxj6U;PWzU#k8G)Gt%NT>a(hU!;DO z`j@D`QvKEHU#fns`fJr+r~YN?U!ne$>Tgirr+$O_min9352(LI{bu#U>R+RNRQ*=< zx2fN*{)g1RUi}-?->&`+^>?ZN5%qVg-=%)H`ZufpG4(&L{;leNQvFY<{~7gfSN~4+ z?^6G6_3u^xe)S)Kk0(HL+tCXStiM|xj?Wc+57d~j)Z;*f2}}PyP;A07ZVsGf!qch{ z_L}g+5}s|s-4f0=;TJAO_^r=s{#RBae8_~$B>b8QFO=|*37;+D=S;X&WCu)mhJ?Rj z!qX(&XTr})_%;*1Rl<8sxJvTbX~K_Ogm9Y)-zDLo2{((L8%_8ZlD^J_RnJNjK1t#) zG~s(iw#bD4CgD>}_#sJCV8TyI{8STuTf!a_epte9-lcZ(f$)A4 z4v20~oA4Wwf4>R;P0~DQ!jDV1*MvVN;ag1jAqjVy@B@LKEID>F1d6^%9?F!ZSqwi6%T(;zxS5?q^F`ubZ&y zKWxI9&xvPnDAQ3v)F`RSdQ>nCj31KdrkPqQpedQ{A&qkoA3b%zjde9 z{c#B>~22p0Am3x5N*b@RJh%9Mem9z=SWAG+!~{T@v4C!Y7ITx0$foVXq0#5Z!i~ zaI2(gGvN%04>G;vxzU9GP=Ror2``uUN)!H@q`%OFua|O*O!yBHKGlS$N&W?n_^BrR zElJ}s;cF!SH}6n8yd?2)6V`tCiV0sS`Rq607bN}DCj5}Z_nWZx&j(HTXQErL2|pm= zTTJ*733r;XPr}!kaJS^sV#0Tc4t}PWaJ>mXEa7Ssep_TqP52s-U2MXwlBUpv4~U*~ zO!y@U=b3Poq?u^K-ICA9?OONCB>r_1)_yf?!Z{NEq6yEH@Sq8wEqOj>!V4w5&xA81 ze2)oFl5md+KP+YKVZ7wiVZz!UVkW#x(l?oKj-+32!uOUVTw}uRB3og?s!y>A|5(zW zWx{XZoZ^7jgv%s6o9QJ@wh4b-!f)NCb-z`@hY)T!``pr^l44K8Ig15L&7TnmXe<_{ z()XQ1M(H_=JzLKy5(-kDt;sY}|?^$h^ z_ra}34TMW8|c z04n}+Y>8*X=16#3uqwL7^7%n3RTBxfwR;-Ep^&8sD+2zCfJNr2a4gUmz@IEe4t0TM z%fGrcHU?{*FIpZ9G;Fc_CD02$m;*v(s*rC5{_6IMa71fSYxyD#P59gN=`@sjIpkO2 zug)K}Y~pYIR^hK9C#$W-f){esCCOdZz9J9|LZhlsG7`1$cp_sOaqRRFOa78|L#!@* ziPaue@pmNe*@O(nwn>_NRz$+h%kbB2gJ>#qjjgYwtFVIBW?#(mY(rH|DOO}%lNB;O z%X9}%)QYV;0>1=`m?A9Gmd?HrrIyGR-7nRU{y?-P=xb;9)oy`4*W41TYFuSme)Q)+ zR25m%8VaEyY%7eI27h zMwLA(()H5>-)}YgT7$82)XR#nt9X2^G5o3Cpyi8N9-rU8dQ%jCJ{on#AD_o85RR0D z#Ax_y$Dm3)_!IK@%hFL9R*7)JP9Drj;Ra726hQZhHKE*QA7n5hTEZcJv@Tq0=ZU!H z@K!5PSV|eT{Aw*TS{Cx#BdH}EjXC?8yB{QX5>K=F zGvVdomUd5F)ru8stQP18i)e3@o^OgRX{5Z^$z87YBbuZY_7ZcT(**-CTvapX#sG#` zFgdMSjWxcIWyYwd*%t^gD1WOQdakje;nqk4tlU`F-hxr=PfXNOL+y~ESafwG<|lAB z=~%CUtjyIhWEZ8*3A0LLB@Dpks0t<9Pb%QCHK)N)Ph`ibU&^(o2g|SZZG!R9nBj2D ztP?O50vlVtP*YAWK!0Jt3rOO%~oq{`EpD^;ShQN>@MpQCL~m*#frq*tFd%S zN04r8MIzxyg=1pzY{TSX)rGZDe6esd7P?@f(fK##%_y@cOH{~S4&7Z>66&~jq*)dT z_%~Z7+S%=Gv!@X#@s|5SnD)GOvEEHqgAc9kjWtIaVdvfEi+Uw>v{kgT{9a$k z?`;UT2K^en$@2Ow%oojpP-4GPjb`z#w7j)p$k(=R_C+r6R(Z>sy_caMdskV3%}txa zk&}#m+zy=NSx~xgfq&tGQWI_OAx`o*tEL?jrf|k-2094ZV#c0Mu9><=8>uQeEv2=S z)z)C?D&gJMgwE*2JRsdo>Ydo@lz5@Bvp_VE%(|mX^q83(!$wv;!}pp&WcFX)I@uVZ z4r4cTiMI~zV@9{v7el#d1~b0BJ~k#ZN=^`GK_KQ0;J;}_pLeS-81Q>r*oD18^x;L` z8lB+1n3aO)1xV}Y2B$~S!dtDN^!Y_<;3Mg$JP4S5gx8Ojh0x9cdI|rG3oyhIn^Xq})y zSBK5bm#(!7WqI>dm`$K_MvLO*hUCgr<@d;#(zY~yr4_`~fF!a*utyuVO^q$s)dXR` zax8qCd<|PXDYJBXyOt+bmqzT()CMsNt8fIjrZ8YcH=gZY*&dxGToi>ps<$C^SzCk^ z#q(YdrmS@R?&!u{EbLvorW!rL(F0AEi=>jWb@Ol$OVrO{ubL_xTbL`I9vZ))#X364Fq?se zUJKe-5iEr<>CBww&+=j(lpVy_C8us?P*^mEasF=g_a*yea;MT5#_m_DBLl})FLl45 z_hud&3#MS61}`j}fCdm_RDkW^r@sdYk+I(rUS5f1vTh^*1$ zX`&@#V{1#w{0Py69xG~BV1_aIrIhW7cosxU7Wh3?HCq>ZTSE&&v2crTQ_%8Uu^@US z8Rw=jLL3^9I2Qvo;uTS6yGgg<5m#CxCKn=Uvj8NZazrN|*i3R*V>QY>h}>4lePxQ) zv>5xzyDX1|;U)>CuJAPng6*!tq#UeLF$>jM*1poW1>2wsdwMR5Ay!6y`VQLSlYZ=& z(bX(bGu0Kgr0hvKw_r?jD;hl`rGLB|Jwh^su!bg=7R-XCX0jmb%zHHIyjy!D8=r-* zs6}gQ2N-24v%NSPt?)tfvT`*~qHWfO0u5n5?yf@(GIQ4~L)%$en3Lliix=o>B-`Bb z6=)@spY}shkpp!smZQs*I>+<7X|GXsN;aHsp3n|s+pEO8qIPUkIMfUVyyKfyt5TR$ zL}yr;kYu!);~L$!Nr^C!*jMK(r%lgr+5;2uig0Ah*b`dKveh{15WY59AXAYZ0gKY z7+Bs`m~$V~pfb~xH~AvI1{_92SA}I|OWH<;@EM+Q?Xn>1Ep!xw4PW%V3rbx!wnvl9 zz>eVp+mD;SyB(!0SMJh;E<4CRSNoMDKbl_kKhlE@CUthJbQJlm!G`XCvwyCW!?R?D zu10Ywcoh1T2gA{SVSeKbNXNKL&U?~BF`-H~l8F?vY8{?M@#aQX!Z9~>GW}xoa%u2E znzsm?bwrXk`eK)VU3rc+;SCb2iS?!mgAn@yX~3vXF3x#R#)LAk#DOr|(mQ5t61S*6o-gpe4%s^EarF5mw)m!@y*Svm ze9fvc0(zFxDCZdOR_{bPsAy=sQWEX)Kd6Ujoq9TH4q{9NyoKhR$eiEH4Y@3$r6;ed ztw=l*Iaz75Hkhz%x=+UAc>Afk^ch^v1G}WS$8qN(TUYd9?X1pt$IjaDOoq5AE=%5& zx)b5~L<--TxjusMTjl{7`m=dLRu&98Z#$!ShNMsEQX@6FQ2F!sPe96RJro_ox2z=k6^qgV|2F^bB(sPRJ_Z9C(RfOf~8=uM_MY`tJXl$7!Yn9v@mUx=%lQ2HO6JwYId#QTzkpmtj znU-AX3;8zVVXHa4TOMj{mU%PGr?0ZlS>A>N`e<29w6&k@NoGzunXw$e$=0_dtj{e_ z6DyIYokt6DN<0+9^UvkiwEBX0_-a2y+Y)H0z}X_6b>QYKiX2-*F^?}2@#&N8a$k$D zL7s|3(yq8HVRr8NjMzL39;JRD*)}Dta#_sr2+qu5i3VYoz8EyaQw$5W@!P$kT%N*1 zJ-b-3v`olm;3Sna6UDN2>Ev=sFJ?+zccH^kWbo!{LCfK?ey$at(ty!~rO^I3i?BewKnlFkMV$2rLuAsN5 zZ9!Y&>5V)Ck#poNq3|}G4ddo7VF{dcfeb|5Pen%GFfVc*I^qO*5sW;4c%w$-Ob#g38=Q)+mf7mzZ z*`vsNoA6i&r{B7UEok*_YDYJaTXoId>z9%X)#o#gGZIHTHL*xtxKf@fIoEQ129j8x z#?uFn{=-2$bTXwCItm?Cob1OmahdAvEYrIXXSniU4X4*F=w*rLFyrWfdsS>oG{4l7 z9&Q>WFFm=}-U=^~pUOzHVCqFn$*tEaYn#!mQIC^SjN;j#ckX5eAd$!-g(>eJILfIA zH*Ar)f-loZkI>@E%}IO%)b~mnxqGt{X*W;V_K5m?bM8as7u5!?wU+w**W;x&2W4KY zb419ycU#ZZ7wizb21nORfi>YkC??X5l*sAQ#l?+F&c*78*NYmgW=tGr+X?g3U~MSJ zSqR?Z0o(De$LdDW1XHfQZ{_4b%CLO?tFZt`7(4ffZ(Es$F-sv_iz8plUxnj3ycZ+8 zL%kg?!ShFbcMh8Yh{=vX6Gr77D|8^l;l;QHbHJ-}9G+<-QB^aR3A~|UMOwl^lM{?4 z<*)=9AnA)jDO#7*8e&G0rPY{X?0QyMTLXCU1atkec4Q{kSD9@gs>e261gwgHbvez(RmJ@3QEOq4Ud zX_*s+vnR8A(oGX@o-lDDh#gt*DC)IB?`QZC)z0&4GzR2AJw~%u0XZ#p)6Tq65 zNxta)3f%iBw^7u@HHKV@-aE1;9*bl*Pq=Af_ap=)pHm@w$u^_+`|bKaQ3ejKWc^L~ ztiL-Stv~W9Yd86LRd`H&W`LDak9#0@2Icmqmt*;2@;wu~Crr#iV29K}E-C+YlSg$ekH2sA93xO9x?l+XXh4Ev^iK#Iz#H>3e z?h(Kx^4B4J0rl^&<1jikss?J71)tEF&A*tgzkxZOb?a%>;Y@tf0%rZ z2Q63Hd<A_Dqs?J=(PJX2HnYRjW3Fw7)0dhY zN6l|ikE9)>-6|med&)m=q>f-mV}H^AI>_zXZpzJ1-w&z3w2Vy36Qyh1JYi2}VqJL} z`K;M#@;TahW;XTAxK>xa412vh3-NQ{PGElaJmQ$=jXso@^wn^G-C@chnvEXNSBD zSoCKY-Lq#>_r#kf=#sZXXpcwiu^#f@`-qVj<@8FHZ{!&*L$WQ7t<>?PDOCIj>G=29(%shGE?wNFx>2M-H6?NRPoAqTsbjY)OF$8ur zvO4d`G8-HOMZOxW1>Hve6Qk`VGac+j`I)KmVy``5eduN*Uk+NYr2bN0$cx!_Opx@C zA^lB9nO?@{>qvhW({BQ;S2F*!^V_MY`FAN-Gg^*zk#V_a;*LoZrz6lUk#dP${2+cx z`7G$5SF&8E{3OSUpvk13_aMb*<&TNrDmT*3cBQU8N{^S+dG9pvt%+|DdR)Rc@XKhGyPZ4*Yz4@ zN43Kw+4%`y5N1G7NMlu`le7Px7jH0AzAh2V{nGwTD|RrV=6vM^N5 zhQ$a-`LDn|$b7b#=rQt<=^Dm4-C?3^c1%!@yw+}We$q@cvQCFNX)^e;30qodQO)$c2iyX;fOe)yYP<{D*h z5l`K>$h`Oo%FPxt$u&w&rthTPMNgR*BcC?qtq~cyl5(_1svTwgtcTnl%5|V@y^?aQ zpU$V)+;E@cxDUMzDW1c(jB@3f<C)_$Tv_axpA-!ySgrrtV;9zn==-(%$S z#*yc^mVF8bI5NOB+W^ilQulG9-yFE5_nQ2>na)v9$9kaamrfT_dAX#W*Ta33^4ChF zT%+1c?7fF49TRo`a|>dgqnvCP^wO5la}r};M$0&P8t$Q^OfP!933n6Ir=MR^`=69^ z7Hs^*cTkS(^6mR3M?FWK%gFjs&-6DS ztXHz098anH3DHy5k2@bS_8GlI3BBC;GFs|U4Y!Kv#TI(G)9bu7dVZAh_P||D`IC&a z(|#%Y*zxo(KT5r&T+w?j(~q&Q7&X6MhxGH9e*S1ZQ_`o?b1~$^zJF%B%@--TlJ;V| zOMgp_bJ4dB?v*c@cIiY|uTgT+fz7#;%wLPYY|>k!`?aHgbx*>&X!nogc?je$`-+kO ztQH1uRCzj16X%gqzqjDNNx6*(>orPF`(@%B(j*#wg7^WHieGbeTzLZy? zdl+9pEMQ~A5J8V|k~NUd-~|B7KNB$b4TX z4ig_E&Y>QIym6~x{EMXb5g#M^saFB>uOrqo-b?u&Vkh+~qQ2|xa)>W7-P25Wi0Sf3 z_Yxl@jxhaHmOI4s6IqWK`L8klD@^ws>9feckn|kp+fV(UCa!0?VqyhxKhy7}e2n!N zA@;GnJnHix^E-?DAmu8FE#$w#eC0P<<=RQCBfd%gD@@-+ef%sZkMYASXFus4(%Hl& zVg>OY;%uUq*g@PwEMMZVg)J4l*)^J`QzQaj*JnwbsbG0jd$d&#| z7r)9ypYNi3J5tLlblIoIMK5y6=eg(+S#%xO8!o!iRiEcw`44wEgc1C)OTO1df7C^9 zbJ1H|^m-S)%0*YY=t39W;?nO%S9`wa##H^MyW~q<{8E?vA6@qOxr=_@MGv~@ue#{Z zx#&(8J>)9Cz*WENToOo z`nbn~+rDmnE=X(yO}=NiXt#coUHnsA`V71DFLv?ccctq8l8bJ0rT?0X|DcQhgp1zc zqOW(+?(ys%kIk<1>s|CJ7k#0NKGQ{?;G!qH=n+?a-Rs5W_ov$Hm#*|bbkUEy=*s(2 zI254-q>T=Y*|bdQUE$wjBuHa*q*;@G@_?~NUQ zw6W>(O(#F^BdMH?M_GPls@N#105KEbp8v36O}imAiMxv&{dUt%Pw8yjYd3TJ9 z9*>XYa>ppnd1blm;pF{qhI_}+F9U@Y(mBgb==XhR>^l!j`^7O~pq__8dcKRC`AKh;Fw*6ZfznAe}qdoz~+xzXO7=J0_?R}r!URjKf zGaoyB2ID7l-(;72&B;cO<6ZHWGTz>Y+3hmRYtq~Mul>~L%kxZpAM-iH_*TaMlkv74 zcNp4k*P0E6{xIY1 ze((Xt54zI-_f;mneP3p$e~Iyx>^FA&(~P(G!FIpDnDK}1F!|Zz{P8Od?e@Khm;hJ6 zc3ww0FHv~XSMtcW^(%7mv&pyXd!dVuEXKS_Um7zy5jlJm{YCV%`?D>$@w0a5UyB{% z=%23t+4>ESBR`(@(*NW@dLPG|Js;m6Fp|Tr_`)U=f0*%hf68OLecxlppS9VfKc&~8 z9begKX#2jyj<2&!d=1lgv78GSZ{K%(it%r5GU*>+dOIKa3wd(c_YHRZ0~<`d?RVX8 zhYWgOPNm1A#D0_D?ESlKzi7-z+WYQb-D~I_>YjE&OUp)jbOU^4N`t;n*3iP|M)cgL*#!Z4S(-$!}wep{<+jo-WGCRwtZHN z!~Y=p@{r$o+47snmyaHtm(357pRRp_obS^0pBpJZ&6zpEcK%=D_)FLSFZ`$xOxHf2 z9Y=mW<>#g;zlZCo><65et>10rr_=9x=5Ozx>^yAw4)V)w2GQmZl7CSeeqNVhl%(Om z+x}U@{9DuIPkvb%e%>C#XimfLApemx{Quwk_jvQmP3&LUY3%bkj-Pb%+q><*8h)Jobp5C1b|aW> zeceZXbDI3$?f!ne{mC}&Z*tR=Ki>K|-u`I3{nfkOAAO$sPf4Ty*T_#dzdbPye~|o+ zH2GKEZ5Zk9FB`~DXWuCK>Gba)|NUvoA0VIGh(s!T{;j#kMBSL+n1Ib6BELKhe-6)+ zCZ^#Rl3$#L?;}6m{dtJ|boTiV^3$zfd&#d(Q@(rudf2mk!s2t0c#bU~D^Dg|1TN!x zc*nx&sFbDWR(oS>BjV)Je5BHeiQ#4tMR0>~89#(4`TPS;zuQQh@3``@&)%CCc_y()AMii2I2B!~vqtu1LS1^bm2F7$+Vg zju52~DJPpK-yI5FK=cv|iABU>VkxnbSVOEQZX`AlTZnDM4q_*9FR_Q%OY9@=BlZ&q zh=aua#3AA^F-|;093gs+Vf~4D!~&w1SV$})786T}mBboiJ#izkiP%DHBX$rwiF=7X z#9m?_aUZdtI6xdE?k5frhlz3GA>s&89yY@inc2iVVgb=hEF=~Yi;1PgN@5MMp16_N zL~J3p5j%*T#J$8GVlT0exR2OR93T!7_Y;SR!^Al85OIX)!3Iw2Ps}405WU1gViB>J zSW2uU))4E78;MQC7GfK*gV;&jOY9-`68nhzi2cMtApU0#5#z)WV)i7%FCZ2Yi;0!Q zdSVl?jo3--A@&jbiG#!;Vw^Za%*GZ{^eZ415{rqI#Cl>Av5nYC>>>6M`-y|ZA!3|3 zLd?buj+Rd>Bo-4ZiS@)LVjHoO*hB0i_7ew*L&P|7gqWSp@`;7SVqzt+p4dceBX$yd zh<(I<;vjK|7$=Spv+;mT>rX5s785Ip^~5G(8?lqvL+m5=6906AOvO z#7bg4v5DA5>?HOO`-uI-LE;cGP8=a-;|5aePb?%B6Dx`J#3o`Jv6I+C>?8IQ2Z=+( zIB|rSjT<~IpIAsNCRP$VfYUHedWb{BY(%O&Q20%xTZkRRPGS$SmpA~#|IA@x!E}>f z2Tnpc@r9&|h{cRAC0$9Z zVSGL5jl?F#w~%flb}+t^^j=~Q<9kW>5%)2^pY#B6kn#IT4-tnMA18f?IKp@jUNq49 z6Z3##hXT@GVj<&;NEZ`J8DB}dhFH(|jij51EsSp?-9hYR{9e*M#9qb^lJ?Ft{kN3Z z1{D1}NOuzV5{HQevrM`|p!ENGViV(Ah;2Zre+TJK;$Fu0knSb+F@7KEe&PV*2TAWI z4l#b1bewpI@gt<=2R*c1fTB+!Q1mWhd@-?-@inCDiA{`eA>BsoW&8kfgz+2mP5wPV zDYut&ob(~$2vGEq(;U^0mlwe1bQ7_K@ol6#h@Fhz zOS*^H%lJOh`-uIFA0RzQ+|T%7(uaUz??N0@Nj-~*#XzZNDd|dL4dd%cZzMJ`zJ+uf zv4ioQr1uhg7~cz&^81MUi2Xp(XMi|J+)o@L4in?VL&OoHr@-W&P0S+}0ww=SViU2G z*hd^B#);WD@D;g2VkNPO*h%ao4ie+U>=P(YtRyxOJBfY7L1LVkeIn(FmBc1uC$Wz> zNQ@J+asH|L6Dx^L#7<%#agZ1%X3wQOv69$C>?HOP2Z?cF_B_fHD~a;Hy6DwO>>~~m zNQ@J+y_6?b5}Syf#6IF6F;2`riSoosViU2G*hd^B#);V{ zQ=V8!Y$A3N`-p?YI5GPa$`dPzO~g)OA90WvCuW~Yd1588iP%Z(BMuVd#Owu>Csq=h zh@Hef;vg|j%s!3s#7bflv6I+G93;kx*{4&USV?Rmb`txDgTy#7yO8q4N@5eSlh{Wb zB*ux^XHcG4No*o^68ngQ#5ghgJ(MR_5}SyfHvddBZxs!vCR?g(C z%*i=`X<5fIlr>ox;DVJkd2&`ZA~L6B&77GtIaA_YQPVOrkDGmJ&g3O?W@csP9(UYv zbB;gZ*v!eZ7EjNdmNPSFej!A%rXtUoIdgKnIeExr@=WojA*0O6r(~U+mE$eGDl;cD zYesI?^l8&_rL?Sh;6ZNcq3Ncrex(zod(6TaOF%jG*aeB z97v=%J1a9UD|=ezWE7SoDeYtkOt!y)giS%|U4B|}FzPXt97WHWV|8Y_Rs zsfe1Am5GuN$eKPoUrDhWVo`XmBtJHDeoofZSukwY}naW)8BP1{TaJW#z(9`I%W$ z?eOGTnKN>xt-tb*xN%=KKxyjiC&JTYtf z7mqn-&g`rcva(LiI(F)%Ip@z?oO!~`nRBO3&MPd5{yF17#>M#^8TtD&=G>GqefnwB zC%4?3alzuX|Cv$u!6iS;n1AfO$9y5<@r=nQ6n^@c+6Ob5@O%HcSDdnJ?wY(47L-15 z%t`t4VXJ)Uucu9!mL>mkC+E#L=~(GD#~L^X*2@&b&qohHyTXQ9=unxna`Lls@}^4E z6lr>NI&_F>GjnDj8f`Lb@|n{iiMB^eYHMa?T?E@_NgfcGjx=Yy2Pvkaqh)1!A)J*r zEjMRI&TO>lX<5*0YVOn%k#>f31!R$%dD@(;sWbDZNKaMzy)OEstlZhs`gukI8OmVD z%FQ`WI|QnkdmM6_H3t>Voa4QC?ferf)}K?d;Oxd#S!G#Mk3Heox|KOwR;)cKXU5AJ zqE&9@%Nc8DpO}?XFz1Z-%|fxq-u})sMB4ry^={JkcdOqg{pdntk2gu%-@(qs{!{X^zn8t5wEbP}XGk{}8~H~` zpIKt)H%Q-IYUnB0k4k?3P5N}w*H;<-xuoaR8M>6T{asrJ>5H#2{7;d#zmt2GwEaEZ zA4%Ka-OWe8lJf2E^QuYP-|<~f+W!9Ne$w`LO5Y=Gf6p`<`&-HH0?X)AP1^oGs*SY$ z9o5~W?eDF=L)!i>>rbTZ@3#uQCV%@ouPvnQ?~3-3w!c4$leWK8I^`rIZ-38p8EN~w zryij(21*Zl^tzvPCF!q_t|9$6>3Y)7klsl87o?j=zd^c%^aPAUDX)$6G}0ZUPba;d z^tq&OBwb6oleC}oUeXg$iwUMG>Mw?$n}Of&eV>WkNcwN*82TpCXOtQGtE7KQ`uC*2 zb)MlDA}`7BSCTQVYe@fq`Ryb#_KS}x@D-1p97{gysVd%M} ze_3wma?;maWN07h$4N&?KTG<36 z`#aF9N!#Cz-cH*7&h-1FH$HFlmFHtx-VY32fCdxV{yuc6(6Gsc)rNmD>HA4ApLsK(8Z(| zUu@`&q^DkO=<7&NV){EsKe^iQ`aq>h~>S9^h4_n ze;w(wE;sZ}(znqb50SnvWcW{zZYBK!=`EyxN%}O}<8{&(lmAcBziT%6HT=Wet`jamDb1wQx7yT0#{aY73Jv&w3_qym6F52g!+g$X= zT=bnT`e7ISyo(-o(SLB!*|4nBz6)LS3KxC3i;lSHZWsNai+;*Q|JX(U-bH6mPStOo zi$2{&pXZ`0T=Zow`dSx#kBk0}i~f^~K5j~?ey6+W^Ii01E_$nr-tD6Abs)lNi+ca7RAcKXA$a#>LOj z=Yq-l&UVqKo9BjDh0S%5;V0;|E_%I--tMA5sk9tjo9hcM`dLFK`tNHl{!BaC7rN+b7k#Cn6aDW77yqL!`qPHSF2r1)Q`(cL?{kL6 zF3McLa?yWr(UbAK68#^$0&~rD(Z{=JuZx!Fs7`r#p6aB}bJ6d2(G@QG5*NM3MPKHk zeJ(oWqPM!}?Mf%@^$8dKIT!tyi~gRA{+WyZvx}Z;p6@2w=S&w}t#s1>>6OhlnG@0-R&1Jh7fA z=Z+HJL+mFG5l4sxIJZ)HVm+~q*hB0m4iQI)1vqz7d15`Wjo3r%Ck_!uhy^%jQh8!M zv5nY6>?aNpM~DSDM^brWJyFi1B)*5(PaGnS5DUDNC)N|&h&{x9;t+9!Sa1^MiS@)b zVh^#OI7A#F7Mx6ZVm+~q*hB0m4iQI)1*cG+SWj#t_7MAtL&Onc!Ksud))U)^J;Z+E z5OIW9uz>Q!dSV-~huBXXB90IXPNO`rp4dk0A@&o8h$F;;(?Q6a4iNVfhlz)X^22ai zKG91oB9;L5{rnX#2Vs8Vhgc@xR=;V+(#TB z?k5ft4-w@@;k10BmsmtBCDsr(5?hEJ#J$8`;y&U4aX)dGc!=o1_|Wo+USbiklvqP- zA$Ab=5_^gJhy%p^#9`tgq6hmNEtlve77j5E?S=ao+<(G-9PSplTj4$d_er=OxKF`-8tyZ2x53>GcL&^^aJ_JM z!F?9)Zn%5k?uEM#?tZvFxCh`q2lsin2jL!q`vTk-;r78j4EH6tFT;HW?h!b7PVqIk zez>p0Jqq_jWY=@6K)FJRJdty^4v|%&hy}Az|Dl4 z1t))FFdt6-R@HHE1#rj1odS0%+yc1M;Ld=158Rn>@^`6!g`!UYo(y*qoEJ{)cp`8P zoIJ;tzuTM**Ma!$aR2UC|L#{u>R0F@o<-qJS2t{E@Wrgn;Yj<2kgwU=u&TDI*|*u+ za8V?@EvUgVzdsNQghNq}iQG^gZfRd*Z4N|Z5uY$B0u2JbNc)ONxOrJ?$RD(hE^UPs zv^JyoMCynIYMB*{jh%mLx>ey=pfLdTQ*>C?z9J9|211*w9Ezn1j-C1cuHYI}A_Bu$ z{<`obR(ryD7g;fPt*fF{p=it(3|f9$&#LH})=&tQup_E{t)Ygds>V?%)d=nD0C~uU|Qb)@rnK}=IV$s!& zqKlnxk`J?t5o`EmA%A(3FXF=#7eUxW+F3xAW$m&~po2)(RIe^v5r|j~F|0NYWi|0i z-xj1zu*+hI75zwF$RI8lvX??zT%qf^^ZLMl`Rz6-bd-=?jERwh}E0*R{7;RTYl$B@7vbNi!xX z5lH2WcFWphR&-U^$rSAoTN6`-B?H7%TcOP|?P&fo$2R+7=(8yWxue}f0J4di$)G`f zqS_5p7zukj5^G#S$7CiN@8}+G5wb>0qDF}>loUd&F{#!wQ4FFJohX@jjny39YK_6b zI-H1Ieod<{D7hhzvS2Wbbu_GIO)07x@j*+pEH^8FNI3Tr<>*3~ApHK-o1#`^tLaLk z6Cl$H*-!>HwPMR;gvQQl^k!wO0!eK{iH2Q`lY48J8G$?!>}KYzR{G zaj=r3)tzZ#DRGQwcN#NvlO>}`MinV>_NwHl5u(MQW3AXJ`6cHHQ#j;S`q~1`txqIYZueVLeMjBI{ElqLX^pjO zt16PSbCNPmBC6@20*UdK7(~vv6m47r97bq{l+7w;pB4H#vQ>azeHswlK>WrO?r6$xW3uP>UTASRZE8&&~3n^|DkkYoV$sX~m zaBoKCG#$fc1(g|BZtpxBDiPcQSR2CZi~zH%3rk>yuQ`Cf1-zkJwRP-!(TPn#)wN;@ zDI7Y~wpb04*p5P*ny6K%ekg=pmEL6gD*~2t^7i1oKo<(B6UN)B+UhXI#;V#{%NJ>A zl8U1|d!K=uDBP5Xn`QNsM2Wq+odEi#+=Q*FwRa7!=%h}gB$CVA7_6wh!Z<5ouQskS zWR$M-g>V>xWzWUCDB^2r3N%Eahq;k<@%7+jloZ!=?j>C!WFA3%rodD`D(9o9j#ma6A?PH6WwKPD1hl0)4G!@?dD=&OqF9Z7!2c3s4;9OufoOz zH#m}i)Q*$ks^iv`gN_S_B5UN{!a?iocPJ z1S43_%Suo=J*O-QM9ooUNrU68@<@99OUer*Zhnuh=w#TFkVltm2NNn&W57v1Qs^iCOFEPKZ8S^>Rk?P{i zQkGmfCBnk}ZnM?7(K#5_`J(!)#qu9Xn^9tQfo99Ux;1trA!wblBR^7FEdbL&TlBGU~!zh_O-g!%mo!6CE)*AGVD_9e;w>UMvkYxrQR_k}H z1Vl#JIoUj8aqU*Hc{B|+N6<{Rd7g!4LA9q6FHTZ0!O1Cq(Af*3Sp0NrlNx#DD0#o7 zdx+7Du}8GsV@Ib?Gh#+3#Ek6N4md{_dVsrnj$GY?W_04zoZab@{Y!2S6OY%t?5S2` zvau6gHZ`T$(?EICCDNpdj&%##UJ|hHKueliqp@X{?A+yyKAl?QW|O9Ptq!(!cua+( zO+NKVlNQfxEh`jl3df@3C6$M`*7(UnI6|mRks zeEzG^nsN$(XH3YjOvB^LnYG&a1P_&wY{nOjxF7r-tyIw0fRnsX@^MoQx=1OPB*-KLoJfEuL4%^nFf)+oki=vniA=~F z7;4aHUm)600Vg(5M7%d@@PY;$T6D4EUfj~XsMLmS+~O{7af`dyQggr0InO)uCL~PT z?f!A^hqTAY{$dRRa#U5;Mig?c z9M2s_S;#FBIv@6r#^P{kX?|{TZX`b>f{4)7jDdV-Bji{@_im@piEREGzP?CN_02kn zhyflAUbn%4ba0Lgs88|-3C%hPS1K*7^p>jeEUos{498<43X>d!W*%gdb;Jl`;f%t= z4jsX+fnW|MTvmlb!|*tZM|oC<8Dt)Z3Pz8j9irkcJjGIwd8y2z9R7*P~e-fu%XuH zS&>m#v9!in(_rSATV3s~fMtNsLQl;j6)sQh@GT5e&}dKfgWA)O1Wlc%y;;thrB#)~ zH=*)~tLjIXZ>(*y5L3>}7vjyW@D0azR))%p@GS$GJR9=H+2S%6QdeiVqWma$G*_0x$0-M3QKeAdcARd>bDo6R7jt`tA-c2WBUeGNfzAbeinA3#AtE)8G z)+}t`vsbeSTZSe??lzI^9~1im@-5V+=31WvKB=};QHC<{Yr%`;o39DUd++gq-Wa_K2+{PDf2{{?$w6Jz^XbTIa(#ldqAz6mdX&e# z2I9Y>GEJj?R*!P^T;@IEfxP`0YjKc4Ir~15OnsxWHrM0FY=Os5BENa&+u)D(Z<{GB z*?Zd(vp(D$xUCdvjYw;P+{nM}IblKBI#WA-ZpX>(EYA5g>O6xx_;)vJIRlW#^GUr9 z9=6{;es((Sp=s7HNcJ0v2gw0hTcCqZOE#9KjMu5H?^`&XlHHP2=uZqYsxBIj-7 zKfSqa#?_F$>xqQv@lT{Q{oU`uZ^3by*S2|!zY%r1Hn%GsE_jdnjWJC#4 z{~g$Edrm2Ime-aHJJ#EA`rZS(HSCydR&#AAG;EsY3#E}wlWo&{As(8my-W){(~oo; z9hiYR;O{|RIn9rA=0?Xrk1;o9f*;KZ@G8q*rJwTex}n~Gdc+{o)w-kJ7Hfynrpx{Dl3cQ6K%DtLj((>~$);#3AM#SGMy^ zG3a0FtAwEO%HE=%)>3c>VXD{k&hL$SWhncSsoqxIk9spPXQ8Xx22lUrXMEYy+f%as z^O>ObW8_^8Jz)-ICqDxlowq{D0ee$+{EQd+NksZ0=2;E8K>HD7hpcLR=1nI)WTUc< ztKEt+lSoFc(@EnbZS^f7$d+axZp&*avc214ogUwkxq9*w_0#WYv6JnF$01kbfVMkC z;YV7#(v@nj@V$(urTt6WCcdk?UM8Jw2fwnWpV8bY?8;~xQfA#xj55_+ra5ENkTRZU zjWQaSxj$p$kTSD38D(@XGd%;hDY^TEgY=;MR^cSl(dtoaNtSV>2ibqfNP2>tL8{x- zMSgJZ*VI4Nx4Bk zAU;j&egnBSwL8QeA4vbQPh`q;@?C*VTadns;!4MxG_p zY`2AAJAq9>=<{=b*;Ng?CAJv-*KAIj0|iert{~a$+e9JN*POA%sMCpj)qnI6@$I&* z_IR>0q;HkwI%12EzEjy)!FuL}bx#y4+VM-jTaAy+wQe`+%|@P0$_QCecOu5DAL;WX zzvGf$H;o<14fzkMHK$;TEj7;G>=bdZmx+z8X83~J{lpE??ZGd^v)>JF+Ar(~`HoG-Ks$Erd0O`z>t(;Bt~R)BU26kKtE2Kf?#bGk4T+>Hv;`eG7Smc~q#<6wZ8XdB z+Xh-8uUsq07T$u4#u}8d4&#n_^7j6LGltAG53pWzV@@W~I-&*i9_Z*Rw2{bh*w5{s zk&M#EN}JNlk@lgXm$$&rXoKq5f@C{7)`{D9<`j}|eSC2{`bujb#|v7pKKfl3VV^0i zZ#NH|nz`f410n2fwh)Q1e{25b8?X>Uz5 z)<2AcjIh-?qbLn=tgW-ZHpzrBoc$ijMENuaw7^qm$QH>r8#+aq19IFk7m)8qyyxxI zfqp;vmm5=B|k?qWV)uW8J}6fd^!s{V>U#yHV*3 zx|jP}K|f)XV-*zO>D!tek%%<-<3X%zT^n+bzY~_#yig`0=J|-$#2- zVvJ@>9|#&_p8pl?r=?Ez0)H+0m0)|fDL`!?|Cc7YEOJjN<rT-^+Xib+qQ4e}Z(Of@lL4E(VG?}w$FZ-?tr-zk5q?E5}}HT~*6n4>gbI+ZL>`HcG4c=8X7*k=*8SR68jHM_xX(EhH_D)`)5v?$?~?ru z?}vCCN!R_#*77Q3-1ANW(bM#KLZzQs5%8EXW|o4q%X$m?x4$xLz#BXf=xSl`Yv zPYTNnd6muQUe5kf>7M+DlzIITTbCc}oBd0Z&&+g)@ncBO4si|3yPnE?Kx2b;I;kw_ z9%*}wKG2w)(+}ssNwW{9GaGz(a3=hpTm!L(1;6^WtJXT!ZdvbNySL>KczU><1kx>Z z3cIx5iFV{V?_Y+t1Mp?8Po%xSg*Ir+Q6^ok8-HG#acfttIf6Fh(WciSW`3#KY-#5< z;n!#WDtenUcN=RJ^@qmGup?TlvOjHU&)&PHjMitl7r--NTizNsji(lP?1Z$beL}Qj zkBau>{t~_@F=A^o7t6VZ`7ra>B5Vw8RGGWjjS^5fPA1y)T|B}w;?I>f6 z_0VzNcYNTOG0w8Da-6>jQ9u1}-XQl3Xg6PTwX}iXI%%KVV%&!8YR!3UiLL9=WZS!s z!gt^1N7XG;Db z9DvTYH_iS=X|L-<>WKiLS$Li$0U zJ8dCx(01HHHWG4(oL{Li;5`PAV{c7q&p6gKu($~v){x2wA zf_Q`MtCM*C0BbsamTIw6dvC%< zjXg2VS$QV~KSXnuWKes{0P1IdX4v^TXQ14H6LiL=I&}9-I+Xs5=G6nMwWc-6blxw_ zSR>E9So$2m312%+m*5<8ZBIhTOj7C23-L!AD2AdVys@2-s zpNTl$&ssH?h?nEC4`-O?po_pt%KoXh%>_Mi?NsZe$u&ReuL z3oWm<1b0HhzZ^dG-QQzRu(ES{{K_8E>sp*))HvnJ^9Ab7qdMmDl+SezP#u&Rvlj9a ze<=^<2KwpFUb@=Xa#eUgx&^*^Kgrkh1KR)ArrY|2z!^4<`t4tLE#{TIS>}U3^3$Yj zMj4gwgio@xgD32;Fgp+YzpMD??xQq$e5G%F@yMGk3o6xk6%9fD9Xz@ zJ@Xy4znHmK=`2?2%a*q~K=+(So$}}`W;`<> z{g9r>?reGf!j>48f1AMiJF|mqkYuHEi0pr$ZVTBd>B=}O!IzyeY}H7k_V#rQ9HIRt z*}2(X+fu*j!@easVjsREwm{u9=&<~@0m!>@)nPdg)tx@ukSvprGWqAXLm&LY%mR}g zrVMGP*dc5cu))LGn7^`bL6L^`Pt#hC=K&ap+s0(=7aH)mwy1hLY-)_|6n(Z1(HF7D z8ShZKtyd)Z@vK7G=!{pj6p@Vdi|Fiy^3{}HEH3({-6E>tH#d;qz+FW*Jr5zjv&kZQ z=-v%FO+(!{%<0|0cwjFu0ea^%BMm+mWcE}KZ>Z_9fm1$Fdh=pH<`XqSkD)N5d`1(zpTe~P)T z$vHHU$`-$um}PsH_7HVP`~@FPZJhjZ5|!7-2)pJNDeSK&7KakErjw2(|GNH0>%B=- z&p+2PRj)u<=oZgXwufzofzt4*;#!@SIS ziOy@l4)xq6XES_k8hotvO|m)DbF9XAsjK)!@t1vrxjGScu3;=4G~dnhcSwGKe1VZ~JQF1O zXpR$al9R?j%d2;@txSY|mH)T*BQ@Z?y*1Pe5^k=ABWvkt7nb3entIsh+98s+A7!Y642P++`5(a zgk0uB#GhpDY!RG0J)IUZKFIK4v6o9RxBb3JTa z$}n^tp>@KrbIgY>)@cIhuSuV@7l8ezD4t@994C2KGkr|cKCGFBz0;YD?*DjRsxiVk zOLtYczccKK?2FoiABvOvnrE-2eT_~woVzCG1fE}ssd&?x>TCBt*rIIp`}dQ6a9=>@ z1^Eow7O3oWi0`ZO=QgoLreh3M`Ym6`wPl+K$T_jJPTh5G6OOe%!Tx5e9H(LSH^kHS zCH0Z_P4a#i?fl9}!}wwjjHTxmMj1Ni%Jp2{ok+QEnWx6**3SmZTBz3l9cp zO~6{3-yHv-20vnoP0iC=eo1l|^HJU-@xIQuN1}OR%twb9y=S=RCB_`1vNV5M;HC~d zFM&Rxi=xQ$lBrM2`H;8VN^@I-e?))iT!y{<3b#Ytv`Fd#`+d?S_~E(8Evewa^Z%AB z)H9K(>i%Hcz;^US-jz_l%=2H$M$ZPeT&wP;VQaKT%^mpTljM78zf3ZK_l@LZ$QEHo z32F?dy%P2-#MktU!OzbmY2QhDqQ3iAUR59VC!3`|DWYfe*#h&(PJN7R%nqTARb+dy zMGkS}yrv%~3-T%UUg01=t96FijBP{u9jqIpYymH1&U{6sTMC=D z^@-dq10hxa=C3l^$zR5tB%R9j5qlZb!F`>#-3A$;<1g`^0OW`XO&te6^ctSsz-F|( zhnMiWeNc-L>AV-~rS(Pf`ZdY~mf>F3yWQ3&&oD9S{BrYt*mT=WEaUbzkHrS{upnV5rR2V;2dg+z>odN?nMO?XFQ zV+ZCf=H*e0Ir_1l^^~lE7mcYyWGqti?4~a=@LW9GO1iMLI>f~*NcZ;VMS5hP{$LsO z(&rHASpO{Ls@{!tw9lS9@J$ctgw_ITf9+4fU#>Y*9UKdJ{?$={GF3O6`K(WYkM*yJSNGFAFdHBWDvBFB#Q z9$gP@S8YxC+SJxq@Denh@_tatHf0a?oIX|m#xJyH&?>!|fgLoFZUk% zMKyGa^TL!=>@BK!Z!wYTk&bMx6^RaULl@EV9?G@Ciult?Pw5}9zSd!$RLea+o-0uQ zsZI3Nhqf?xr+Da$g8hjPHorIr=U6(MkUhvd4fGqjD8f7{1UfeEhtEhQpOHRK-fP&$ zCDFMBb;r{^iJYHuPk!TAwMV~k6x!d7y+t?eHOQYCdvmitljl*~mmB9%YJVoihja{| zVAmEe)#X@sEe&MfThWR$TTx`pr=;d+)z#S7%lTRsa8}yNv{9u0re%0Pi`E7Ujo%Fo zG$*mnm5~mb+@C=18)mbO7Rog8JF|a5>0@~vNr#Sdp?|yFYn9#?Dbr%9eUgP_K)FA0+vU_3YC9tT_x2Aj!}r!lWJuq89vO0#9cA$TH)8|K z5H~~yqyJu-J0ydaw^TRDLH12+uhIqdpyurNEG9W_8Cj0WdsvRkl`b;IVC)ZK>_en4 z<9Ud2MxlM4u`ZFkye<`)$1mFsA5jK-gxxvB(e%AuPM^EOaG9zNABz8oSZt3_Uf=_yYky={1BIGJ@g7c zzw8)|zmy5*C-|rqo_inCxgPNoLv2CzBkjxc_ap7qDE+vR)& z_5<(9a6i=ZN!<6zH9g#q$;v))FVOVpC-roPjd{{L)Q(tw^?Y|9o)r!|4ru?p<8b}M z5&6?U8%F*cBl4%eGg$t~b)-9t!%+G8{(X@A)!0jP(YgYgz}{tYLv{#uKkT|bc}93$ ze_mi+pFEb^F|F$~-f6#->HEG(9=xunk2m|dbIwpETQ~M!$oXVW-nf%{=E*NxL2 zEk7i6npb`l{>(zpVpMwq`DuHk{M)cE!TA&Wl0qs^_DixOpYFG@PjhFg^(4K3;ZbtXA~lPZ}}nheC~!j$(QQm;e%EB;TF(xzk%mLa|eF6 znDX0^hCa)^-O&C@e~x{p;m`fQ$qwHyHm_NJLf$iP6SlR7L?(}ax{}=m9pA74d`p_% zi+usUqp0bS`P>+1r94U>x|fX7rq9&ov>|O`uW|#8-(TG3+j#%R@L|+f8Xr2V%Du(p z`@FVX>?xW>k-TrO$luYpboLJ1`(b~XIR$qu4Y|+b9MXg_bGb4d;@XcW4|33YT!cPW zzXkpy?d1)BsoJ{tEVY&0A&MHg9rE4OF7{j0$~R3W|1Zai{NkWJI-N^Q zy35gg9_~+BSztvq)^B>3$)fztwfl#WALr9+UNYoYYr(zkYVUfj^e#W9rN?Ky}DZ(7i3@<@Kg}jI`WA{V?5OyiL!0QO~%$Af0eO?Dps3qcFD8u3gR& zTfhlBOZ|%OF|ank&Zm4X^QfNzr@Y63?(5{fN*gDi!9b38GPb}zPzU?u?Ibhxhx&`N z8_v#C)@37)eZ+R`&E-7_=j+IyO?NBQFOr3Ph0Wz`fgCHKJF+t>L-$iU^ey*&(0QA! zPo5vhKfNRCvz>DNcGRDu>ZZ%*5nA5jL-ZVy^snLmSe+Zw3&>A#x$z2bp!?4@-jB*N zq|*1Kz1SPKh4XOE`Uakqr6WpBHe0% z#oJ-$$I&))bzKAbEz}@R}vMiCi5BU!L z;!f~hr`FZ$#y4$6J=i(=Aoo1Ry8z++j>+EHMl|dnx?1qB57T-Goy1_x&Bs{B*tUr{ z$Y{s@B@JcN^JjW5s8sEVgWu4(>mIz{SsK7NI@FvlMIVJ5d?tWTG5AaXpLi3Wacn2) z#D{p0UYSoPjUDM$&ACY*fS0rxd`Hp)I)U3bfc~{$UTNpdDfk4lFC<;!J>VeL(*5Kc zlrAUNDS6^7bk}U_gH1x;bbg#}6>%sl_a|iUct#=nOSWtaj)t6fA5`-@?MuxPhjk~e zY^YB;XAPitST=$d8Bw*>HR#KA4%vV-9z!YapFAmGvd3(iEvDYKNN4odRyV|oF>7gkouFFC{{kL6GZ^u1;MnLY{lKgAw znd)_~(76+G%I8j6Uh$!|*T5EbTdXt|YW+xEuhtY%2pM3TaiY!g$5UA2crSAuKM%St zRi2kam`CtI>Y31_FKEtEeawXfy8nUC4UsQJT-h~^h3o!ghe&ZEuaoC^lA6z{W65_x zzH}waq((Z&QyTN1XZQ-NL#a)@|5{J=4c=51yfJrE@O=xO`NPIB7hx0E%l#v4Tdu=g z&W3i*kZ+>4^$9Vjunv4c@iH;+O%wLJG#|=b0|U8xasP!f$bUs&9dmm6Z84{855)9k z?-Tz->Ddp&3VH^RJwfQkK0wLH$4IRMV>w(Hf7Vk*z^sz#ir>G#M(Dah|Ph&`zmAYz+pNAqpykT`N6gODW35I zIcIIsPiRuN4u`mER8!o~SZ7y#MB||R$o(aBXWd5z;Iqd)Owe|itZZMw3E%ASXZ*qR0U7z)| zh#|YozD)$7JG&awYo`YnL2iL}P$s@l&tjL5&%(P#Z|M(+zD*B^-i_M?^mz4`G?#37 zX=*+PV+ZJYxox$@(muf=U=Lp^Uv~}JFZq_D?0pvb4y`SScVMvBLYaB;j+ovVej9cQ z{gHj!x@K!!cP#0N$|{}Qd&VKg?Qw{>K=!s#ec>^LU4d6K*`7^Y{TqG4XknW$N&w@? zel|TY>MX_y@1DRvS^jhi_a^qHGT6z!QM$A}vIF!HeJ_!J9W`u zx$ldI+&G(9rfvLm)J~Eq>yIJ^b}ipE3f>19ZyR-J=1lCxCX70qJ$?28{ee-tH-0m! z7ki8fmIL#4;Fr1E#O`e9S3M_(9${A~Gin5Rj;Z@6E4}|Of^VriGA-|}!nIiElrOxi zh-_Pkb%+ULVB0xLr&sT#zJPbKlwZT1FG%~qtJjhJqko6dzhu%w_VhU|*i$2o=2J{2 zf18xF+Vw2?kRa+6!N;%2-ZxrjJCJso{lMtV?A0O&IUi;_j*)(m>=^U8eZuIM^#?{D z-neb_kxi>d<2l9n$!h*yeH^m!yu2@s?7|_goJZ|LCS|+OMZ|Wm-Y~q*=LEU0cMh=u zn?ro(Pp|=ZP8rEQ;bHhunir>X@azGy6zLO$d(&!BW?M}@asuub20kL0r0q@+<=OBj z^8ATsVk}oa%_)?JK8!gv;p^e$GUn8TJtP;#41P(J;2ykO`MJ@>&;>nTrSn+fFnl|P z=WFzLf|L1{81ohV9joLV;Cq+x<87-)XJS40O7?yDcBY@do$+4}(JTDq6Q&kgE1ljg&nym+w3pB9){Jd`SP8qFCgqgp znY$B_zZGL@rDsoa3}$2AhA^-3jC}6E*T?1ldK=mEK#=OguHv(iuUTTSSC0wFGa_Uk zsV}sjq32Y1XQ`X^0CX>@_ITD&+53eq`wCf<{8xX;&tcUXk9E!FS_B)zJg56-%yTKb z+#@V<<2mbb))&Z^du{TuycUJu zwb z*nDS~!sHdGS5J2=vkME4tbM_PVgX3JZ$9q$v<{yr$*A;$OaS`6M>ICeAM z2fQzUbE}=-BZABmp62sJKAk^FW-Wkw3D=Sm$UIJ_{aU6SoN+aDNbj+}yYL9DAJgL( z_D{ExyqAB8XK!(k4`&=vCT-LFd@~+*Cy3)6Zz*5)-g^_tR~qusJHdD_GY))SlC+=t zfB9CX6F_gEv6OcYc}wCU-wBeR`h;g)^ga~&G5!Oiee)TM_|kcn-un!nYw1jY^8=j$ zq<;3PZyBge(>nPM%S6&2&es97eFe2keL}ntar*ux9&O39mic^v`U!tV8wo?&usTHI ztC2QJP9WZaHWG$wgXYA{bnL&NQ>|fP5y{__^}g&2>67g#1@CmFZ+def)-DmhY0ttU zwa&%JyP}y1@C89(DGLnzC-&*s@27mIwJ#2mpFrD_Xlzigo972b{22fT=$~>W%T~HP~V{}#+?5*)Np8afCid`{zEuM_e{W=|}`w#t`2Bko}kU5`o3ZkjsX& z6Z~Nv9#-Gk7a^9MKinKG>3E5e;t*GCaD;oTkv@;F$ z_leUp3!%$a+`D^WC-;_M-0lu#uet~K{7A!?WpB9~V>|XkdVikQG|=zRzfD2jJ;p>aUa$$ z@RHwz1n!0%j-4&nYNU}2@{TTW_W{U)?>dTjjToD1YRkcGjirCD!_bvhU(|2b7wL)a zhq1p6e{)H547%!8b8OrS;)yiU(KLrh*h}+U$`)93TIwSecj#U7`;2=klxdfI;jd_( z(-;sxI-gKIWpj)0-OBuSl$HF+uc>*sXt(CNy9Mcss4Ur_7Fg6rdkmzFct0%LgO8yx zrS|ZRtDv@N%*pR$+e!XK4)9KPh)cdE-ljHvNRLDMaqgG8f53T-{tXSJzo%_3E~I%V zWpv#QKXu72F6$>gYOTAZgVW^q@XB{xBF7(X+iCo`Tm#jCui|;LC;)yQuA46JRxmG+ zb|3MJMt8$DgRa z8iV2@`5t4}d>hg~Gq+EB9yJ#){y?P{_eW&7SUw-d-Y_v^>%ceJdvWoyZJ>qPQ~u&& zydNyTZ-mZ^)8yJpdn8`_(N?`2FZIoq94~x7WsH}e{pms<{W}NQWf&v+_ARjR*e0x- zsF$l@ZyC||#W&L4P|5{;;4E+)d34@Mr*cZy7muZLJ@u3BL23MKuEKVQ81qZ$U&CI8 z?-r20A9uoi>OLOrLAO`j$owXvpL8xRqWZ?!1AMlF&yzHcv~QC4;oBn5A~aWVHDvEY znf2^{6S@7}NLvIQMfOGfJ)3zQHf&k0^{^M%GQLf|>mce*kBs46hiqMQ;UC6KB0C_z zh<$Gx*@xOUCw-6|3O~1?cjP0_EwG=)e*Q`5k93x7^v&j)i!~#D7y9LZeyB_VqlKP1 zP}_8mLggXPVa>I$M0=iWExvf`S- z^_-o`9&BBA^h;aB8cFs*Op^)`xku{))UNQIq>;^NdG>g@CNHHvjJZO!QG~O^MHOTpgY3b4M&kGE-bR}AZLLZ- zcuz=vJ3~HB3ltp&AL;)=ADJ49F`_vv=fy>1Xk74qTO!#A=@GWPo5qi1fNzi0Tz96R z-ch{g_$!hn_cgrxggh!k>zWo=P@TPZK_|*3)4PydkJ7gwF89B*CXtV%_j+va7W69r zG5Sf`e^DONj!_!TN7Sh!9;AQpfWIH@G0vT`U6fb*mj#`ucZhkB|5tl;@M)%Re_2oF zcbxF7u>X_e183yC!JH?5(U?8AexNU2C;dTR)i_IbV=rEm-7L!e`_}Csd(*lWbZh(Z zJ;-qZ`~UV8(!PXD?;$y93{l^WP=+(cSNol!e1ERkJ#a~p$lWZGLKflO-ywPjv~pqJ zDz@)$7T$p;%II6YX_QX35V~fD{p8q^i6=$uO z^+Lxpz5e$xhJ((EG}d_Tq0{<~IY8$!jHNEe8Mf|!2WRTN^Q4VwfqAF&{di9K&)N0( z&ZHf@M`?SNeagEFdG~g?+&{y2+cEC>WMimz8t-K<% z2NsHGrsBB z+DH2bsy{kDQ2()IK>Ij#pylJ-0sUj=K>Nqd1Hq3w2DX2^f1vy0;{&@tu?&PhNgX)& zN$$YmPn-isKWQH5`=n#w#3%a)PLZ#n@us!=J@9)E{C*C8KL@{`gWu1=@8{t6bMX5) z`28IG-Uq+;!S8+WdmsGX2fz2h4|2x851ynu(j)PN3zC1dUedFd#`2gK@b44ij1&99 zx+iQ$`TJ4p2>HEH@`F+G15xtJqvRJx$&z;}5_@dM=iISfaCEpq)Kkoeb(@sRmKNKauJ4$|Al>GWA`AeeY+oR-9 zjFKOJ{`{LyM#(=MCBG+1etVRBf0X>PDEawO^3$T^C!9b3rc+V!k3`Ae9VLHDlzc5p zzB@|3BT9aHl>Ef==ihibO8(I(`Mpu{gHiGWQS!^9>RU<*cl%@>y#<%Pa7^Yc%uD3U0Ao=S(9xou;#9?F0QJpvCj8YEH7VLRg)?v*{4i$Pa!E;&RO`Kw}(9L zR3lzovBKkCQ0GH}sSEQVk~v;fkdJ>aq{>&ZjDICg761=(8tNC|*F*=U6<7GYo+0J( zJ+-cyifZ~bwLxWN5tMjx?s8dY4B^Ze3Yk;q_Q+F%I}eT^ggXZnCT%&@s)*w#|~Rvkoh z`XC2PsM6=eZ!KD#Y>3R+4MrFM{0?9`D)_7w_`kA1r}Yt7yW5H%n}lq>2CEn5JJnj` z^*G6RJzg&?7-gLi6TZF{*7=CXOBJS$s5_EP_0jF|dY0pND6MX^1Jx<3Z#bWfG#z;2 z4DO)2%A@2icRu2=R#kfb5>d@IF3k@rEv!;MgeaC_fT!@!1?PK~IqSSW^JvQ7zRdM{ z&q?Dc7Pea1XVXYSar85WBkE~(O-)sebtO!jEK9kMb4E=KuQWBue;8XBWJ!_nwl1sk zdaG8}UOckz!hBk|K>d)dA*Z>QMUkH&J=mgslLcp;gxms^W66QqYASXN{{I_BNs?x|Fxt%iwYsP*{nIZqL42JNVpJZcEc11EipkxK?*Qje&pm95=X zS6K<}7z)EzXj4OzV4A1sh3LHLtW;6}4({&2rH;f<0VT zMR;A6{fe~xH*5p?l2aiv1f*lB2qTFacPl^5-a`myov*3}qlTpm`lgi-X>Rv|rM38( zTTe|Ee(4&Hp{gc}Hep%n$GeFS7Qe99G3anFk&h`|)Y@*-!YhnIkg+Sw1+IlUMjxy(oz zM(_vhIiWLHm9c`*?=_-1HvfLn#c>>v0SyGdrl$D^Od(md3} zh0A8o%$f$fxbY?;?0A1iJYu5lgXr(8GDsx;cCO3iU9zr`HZ3z;)_&vn?Kfps+%(N~ zlg)nfP4=6=k2Y?O@EVdY7BJ(xnK9xc?q{X7l`i!73`cDxWq91`;89s+K1oCl!^`L= zx2+YGa@UU;EDsD(+9(?0Ew~{oSt$+|^A{Bs4mzogya!h@kH9Z1xFHrDogk@a*)mK? ztFJ12o~b;yZ&R!uNQ3JDxID;Yut>LJ&ri1l!?!%xD9{*g6r9*o%F-s|G0uU*bNMeQ z9=0@6Tj62-?>Nn!r`_9eaFlb;S_56sS*hB5WHp_T{^qjdv^?l;##@D>joZ2m9zq@d zN7B_@=F@$|XF(UGuOg*Bdp86rjNA^*rl+K!ilDXarXDuCzgo;Pj7IU0dbmD;-@4`N5 zR$WaE)(ET&v}2@2j(owaIm!gwZXDyQDr<2a7*@@4%zT(C6<7YwxEZ8vmzfWCtaUZG z@Uu?xR*cXd_3zJU&a?-xV&^J%X>enFBYC^reUUtBA7fmBU}8lCxY*R^Vq;9_RC#fx zr-e3}6tY#iKQgQV*AS>0mSN7qIj|VTZ&162p7RH9gRqSmx$nxHXmqSpZII=|;Ec5Z z4A3c>ET+Ew1?|jPIN!5U8VzPq4PCdH753NiBrA|iY4bV)<4Ltyljt6}py-il*1F0m zmAD+=$~NJEk)t%a~<_9TA7S zJj-aWM4KPk1+!9MMSq*NxFPJ}(Bd5DiVAPTAnji)+kr>)dC---hI!71utek=E-2TB zR9aO>p0L$Un%5?;B~?v zJhCx!j@hEJ<*tU7f9b;&KWTp?B5ZrOWRt1bQRKgDE9dAZGGKCXhW>}wQjjm2(UcoUwWJP=Du0Tb33vimEe5u|vKBHPE)lMGN80!OW=zP2|*=J#?^j6{a zZdp|njy&f_<~OMpn;Tr*RaDBg2@7^@#w7b+BiG|pV8M@-m2RFMt&n3Sz2V$&`LskLg`Rc4Y`M<*?~z+K0xj<%=3OS z&D-JqgAgO}Hfby3Q=_ypgcofWq+4DF|77Mz8QA8{QM*PpscD6oRqm{Dy6`lkc77GD z?UA`g?t60B2hw_Ja&qVG!=Iy_qPzk$iuI3-rB+T*v;N3#sSzHzI@FVV6X$uao!b^)2wcYCI&K5!IFCJQvP5<|`Wgby(@SOGG zuk7DoJ)6hEZ1>?t!~MjOAbjb>`W)WDhmTQCK8y052Uwc>@aOXjA6b;bt+*!hI9Et% zLC7=rGCK4AS7Z*iflgLNYvHfZNti!LJmiYNB)m0E-6f!lFkLz@l7o>G#JJ!v;^*AA zL<$UlSB(2bkIz(#wyfr-Z&^d~X-|qtD;vk%qX!3YJZ&)U>T`!YbH@Glxeupt2}$K4 zvanxceyVwmj4L0dXp-a_l%uO~9LOtO@U@kmTJy7Uykb&~L%c6TiiEO-6-((zpJD3M z;4&EtVKTUREwA#?!>mXQXW2S|=d9!$<~b|zfR-NM&R@vSZ*fhCsHpVR`yzEnAJAch zW7wHc+2wR!!2%*flp8Nq@TI)E=a^ktw}QN3m3&@I{FToOKQjsoLw4WtGp)=)r@uFY68W&0mPQpC-*B*SPDLELSI_lfJ@tDp~iN z??9wU(<>lO+>z3?i?tlDc;FIDPRU7i)};;T3LSk^E?vN5he-eB_ZKFIuMUcQHN{m9 zdPBtQQ|0>&@E3o*jCi6|<;6=SN`f?#Am@lcYnCjWEBj)W!#V|v7`-%u8!#IBzg8}s z6R?0t{)11|PHSa_SF)Dpm?y{`7lQ|t=BQdn;7u?L>fVG0dB~kfmb_Cr z#{ghoQirO#kRyyVnr~cIO)j!SSGkAgybBL*@nD-C;rQ?jkDkcT6qCw6>1altdG-o>957yzm5tPKvsK&W6SJLPg=!JMZ;&B(? z8U@pgR(^FNT1J~l`5+6tYf%$G>xL{|OD`e71d;5fwq5E{GAty@$)4aDv8SfG%BxtS z?`V%(qKP+Rlhh7(Ye;|LujKm{L;9KTd87i*KS@S$^=*a$Fbn5{r=#p10@J)ddp#7aMix<4Q)xS8@Ii0)pxHs zykYHITQ;nHvv1>%*615IJ(r@3D?%GLZ4GXGW=)&^lT&?q^Z#zwSKsQ>S6`o?YoF!l z&37)*n||7-?@4xVX!}UlSAU$NuMVBkSNERM*R=?J)u(6mwfCRa{V{QRb9$1#W}jVO z^+l1s>hmSK|4YB#cu}jq>W@Bs)gKP({&_)t^^UVhJEk{%+NU=boY7aWbm)PaIK6Q$ z{=rYj0e#K?5c-;dWPQ!k{rcKjJ^HGz9J)UV?Ou0SU!5J&SLdJ6n_fGlH;r@ajX7KN zZ(kOIoZb4W50*goPQ9tYi%_onlY4YgQ>ObrFVx?z%hcaY+pddy`}Do3{d(^MM|E*S zi@x``Ro}M_{AMTU{(__Wo`-ckW~@E%}dgo-aVl=9xd7s=nigJ_v9(ve`&hj zd41o;w!hoGanlRO^tW!R-uRDXbCr@jnvQ+xG( z#K)P+w(Me>+U^Q;3`N^(dm^l1Toeq`xtycrxOq{yj?iGwI_|;%^#{ zM~jEV-H6AU_?07WF~z-z-)@TcAf6S8KQd%|huYJ+9F%vN${$AjFR-8bA^KhyME&^@ ze(OkI`y%llbR%9KiAS|J(vN98R}QtWAo5N6T{+Z#s*!Kf_sUGf&Gs8WJUJvfixEzT zL{}U_62e4;X$biU$m@bn?t;G!&&zbwgHJZ%(d_Cmnn!h!@{hG4o@;B#d@$e>m`~UK0@=vT&F!8*+&rI#%&+xlkZ;oCH}TtecyN4^74bVF z{Mx9$SDWG|5jWY}(>BB(isV1tiFkD+{!B9BruF!lR>bF-^2t6;`uUL^ag+W3D2TXe z-k-BR5Py?@YbSd#+3)%x_C9nT51k)F=Y6z!zBvKynbynAX^2mW^lvkbmubE|n~wPN zk^E;#|Ib9?Tgnl?I}#r{AGU;$Z_@wJ`FYO#CH*8KT==`7feRYApn?BaHDC#eUF|G< zOh{}^4~aleNR(xQb}0G*@~yF;%R*vZT1YhOK;#Fi2_tpav?1+qNH|MS7iEbqb#Q)M zNNk%H63-Qf#4_xAw-qYdeHwH*Xm3ckmw?87#B;47u{018O(6vEXgU@WjRz1?Lc$N) zuOqELB(!*hBm~H$Wg^%S(5}B1=tDp`tsU_o!jh0!-G_J&0(fcQqn$$9LG(u;Bp`rS z^F)Mc2o40u)Lf4MKF!?-CqrTl$~Ly49%NjD@@r6bjU54fUW2l${^yOK|uodlYMcJ(_2(N#U0{CpRhQ#YOl#3@GY)ckk9Mk6j%7X`$ zZ#ULwDi8j<(B>}MN1(m#a6Oc7SLIjrb7B&O{pG_(+Cm~7`X+l1V7w<|>}b9Ow&N$Wh(?~Ip<|jSl8ys? z40KOOT%V)n8PV6ZC_4^>LgE^XAK5*nU(*Nr0O-S@?Vu5-^wd^m|CFAZ0y+)psFRAm zuXcbw8WPqs%GLw@pih8C9g@=;0Nts|Uyb^!!H?=*O*{{R-X0R;mw=|W(2wsH!w2NU z|0IA$XaWyv_qzi0PF4O&8!KlNY^p`&FY&8+KxLPp-ezhC^nJk12NZoTWTClE=_M)5 z<09Bo3DO|PJs~xRDgU0`NU!H~$VYQrrb9mR50WlabC&viH|n&Ltl)7s*-Q-VBZ=C8 z4UnIuKcux=CB^^2T!5@JC%PR7v^PfiZAhcJ)J=O^;}3qi-Ht%#p*ST^JK0RUlDYj9 zXsSONArbX6L*k9XA@LDlR*vr#6^&IB-A;yE8et_d4#$Ha}&G8;a$R+u(Ts@FW^6%vI zAjh{bwsU$L$92Y5PH*9OfKlUgKga7CeVks+aW7*zr@J{`#<+yjOE_N4Sj6dt9CtA0 zbGn`5IgB<=pT_Y_#&k|k2IE2pP$Jee_x(-S$Kz!=ZzaU2&4Uq7qTUq8d~(~PG$ z{UpavF!pnLAIFa|9_92S96zjZmyTB}(AQlpD*guKNJ0D!mg9{QJW@qG2svrIgDhtd z`4oR~iK_QvA!80>I%5hW>XUuEaF+2TW1kQgQ~EJRmhXiFoZrLP$=JpiVDvG%8H*Y7 z8K*H$WK3d=Q`mKyv7hk>;{nDV#_dYJu1>}v;}*tt#x_RimHO4y%GkmfVDvLzFXIx% zLdG1%bjB3M1cjYv8Ba1EV?4yz%ea$q3u7yzpV7;>L}4&l$rnswOjP*NS(X3NNycN0 zhZuVqcQS5aY-RK_dKs567Bc2ArZc86CMeu~mhmLxF~&oTy^K2juUu$R});!1_^v=HAR zJSD_;3HwyJ*N!nB<#ho3sr>8JD*bil|9ZKK@6yyf-No(is^@ecr*pksTyGcZ(Y)T} z=5l3>OE|rR}xJ9aWM{~fIy_cL<8cP!yJ_hUy6$I}(Qp2(QM7|;6e;dMC3>DW; zv@i8kuk`XV_v>Zu*UK!=%iOOW%zp>-*>OzO-*HG`H~3O}-ORU}`_&CTG9CS*_PV)W z-EK}VdAZ_=b)9HI3sfc=d_e+rs?XReE)J82cGdFrH*Q#dw#$?76Ml0h)#x%xs#!SX( zj5fv`Mmu9Zql2-Kv52vlv4n96V;Q5Hv7FJ%Sk35TtY`EyYK#HK7RFXaow1FvopB3e zkg=0-JL68qZpI$Q-Hg4AA;trY2N@4B9%ekkc$D!NV;^Hb;|a!-jHeh+GoE2QtME0! z7{?gTn829Gn8cXOn8IjfoXD8Qn9i8VIE~T9n8Rpi%x82k7BUtw7BiMGE@3QVbTgJS zdKs%3eT?;tenyQkz}Ujr%BVB8F}5>qVGJ^MDop(J($VzX5y>L))C3FB-#LcYx8s@a z1$`CMJ)m!98tq?Rc$tbaJ_uY3SwhRZQOr`sqt$TlAdy^8Jeb zE@Zg;bEXsUNx@>Kq04U_QS|sF*w@7=`fBv~+ZjwB23?|PD`flj<4m6b&HSxrK%Z6V zsqxs)-pq6g=xV0HGij%yud#zZ&U7F4y=hFJ0=-(%*FpbRe5mN_bA{)Fi=(62D< z2HmT8PKTUV{!Y;|z(4s?MbCt7B(t1(8t7Y9`mAcui}`BItEYCxL#3>15C^ ztMc>uK<`rY!gA0*S2R7RA9pd+he2Pf=z9u5FJv119p`5n{TlZY)4M_cBhw+A3onZ3 zGuXe*K<1L`R;m^eqRsh9g1F(0QxY~e$b~CP48@7#d6X+ zSXa$a>1F84RjU;3#8_O_spzF>>ngTeH{?%ARq5{2pqD6m8FZDhQO%v@aiBLVdKu(N z2`XC9UtFvN`JeR52}axGabbKK2On8A&+H| zqHP!pOF7eLK{qIRI_g?BD*7g{vHYW=Gc?fu#&jZHvq<7HkSFFQMW-JDJ)6_JL3^1- zTQRz#7sZ2qS<(3iLH|_IcMuFL9`cbMo3GO6B!a%5Y3MxmQAN)N zpIDZ^-~{LwIlT?^+lnr5gZ`DG9T>aVKSXpMH_k-cOtjNPZx}1$QlT9D#l38z-!sw2 zP4qy79+hdL7mO9L%x6@MiGIRVrrSjSy@@^@p+{e8qSH+D?Izl1qMtI+U1P;4mSObU zNVm{8hIqy07m~(zgP?yaX?#xz`ae|q=g|2@35xy$#_^)@ivFVy^evLc_ko}b6`dUd z?NRitRHjbS_?8j$W=Z3_M9|b<3w=`v`tKx-ZxKQFsWNTbLH`@my?8Z8DEjGg(3eXZ z-!X#zo}$NLtmAJ}^lOJe-z{l;{|EYEN#lD*(7L4Y%_Ha+RhiEVLGM*%=$;_{A61!) zj)6X@%FGLb{z}moAH`>6qf{Bk0np!)G`@cXeKXULbIkpc#y66n*Gd}Sc!J)^bSLP; zlE(LxpjF@T4JPg;Re$llCupT}e4hzAQt(w?=$fk-FH>pWVCz9G(}&U4tlPt z+gA))$$)Q0L9dkQ_+}IICPg1D0^KQTeB%oGeM#fnPS8rX_}&%wB$vo^eCr8XwS{k8 zK`)f)_+}IIQdM`K9dxy%@eM5KfTZ!QENIn7d@BojmrC!2J`)a(6&4G9?+N-NqUjq^ z&?h9l_qY}Gzbkqz^fNYA()bP+G;9y$@$D#Rj0 zDrm?I8s7keh997GI;V|oRprxngNCla6W^k95%ghx$d| zsDl1X()e~2v>ZG7wixuEWIDcQ#pfW`NE+WHgSN@G@O>`m0!ibWThPlTjqh_oYm&zI zxuBm>W$H3P?@;Mq=Y#&Kr19M@=zowjzVikBPm;!Wzo36lG<^e&Ph_r;>G-x5v{k0# zJ6_Pzw&|N_(00|YHE8#;G9~|WDWGdX^S6DMJv~;8w$OLfNZ%%De5VT{{#9= zqCWqk zhMtj*?~Xz5Q?hLppjqb0Aw*7K&Hf(3%?SA1-7*_tA=cI#5VAnSwk>~$@DB+82jL@x zQwU!oe=@?Y;1OdHu}*}g2+I*F5LO`6Ap8R1w+LS${D(!vjYb%YfUOT92a6cxLU;%Pd`CTu@F>C> zgmnlJ&Mqb@EF2RFB7B2AY6uU1p?X|H3K~E1>O&Q5OrQe=tcMx zKb?$t>@@Iu0CCLaQ9s4nj04o@1qe$KzCjuEC;lUZ;}$Wd1p(tQ<_WAT@v4^pfv5hgn=woy<7Bl8E zPGg+Nn8X;T@cGk>{ftK#4>0yHb~3gx1{i&eZpLE9e8y>v6B&~fzR2ZX@^xfi+I zi$=LPRsMz3jQxy<7%`Tl-xqc=ZeeU?#JI?OFXIx%LdG1%bjB3M1chB^8Ba1EV?4yz z%ea%#$LMA(X3S@t#yF8Ni7`%L=V``%#v_ae7<(8y8QT~Gj6Oy;W3j@QPBZp19$`Gd z*u&V#*v1%O^f9^_iy8A7r!h`sOk#{vxcxL^KjRU`1B^Y4os4aa0Y)FAo3WTNpK%)F zM8+h>IE62sX6$D?!gzqOhq05fjWNLJV{|Lrk;E9s$n|${{T*C?2iM=h^>-Nci@9Dt z<21&J3SZ{<%SJqj)8n|@X~urWBa8G5#B_Ay$kq2u@?bzK&(LsAiRtK|0sTdunytJ z2<-@)5jG&~KzJJANrYz*wjgvN`~(5MS-gPo62j{Uk0G=mv?6Rm*og2v!hawXv6$1Um;+Ai=znt ziSQc2|3c_N*n@Bu;a?G+MffL#|Bdi-gjWzwBIpSJhVVm#HiVxd{5`@`2=5_aY{Ul$ z?;^Z~unXZ3!hVET5xz$F1;Q^8jw8_8asuIVgg(3>dfWh)x6)Y6tJDz&!7ib|`k zTT1~gwun@*rhQ|Jb$LTuv{ZSmmGAdEbMEf!W)rRN+voYd?;#I|b7tnunKNh3{JnSY z0DcA73D^z5lF;b^{0XoZ@H*hnCZO;CjGpz%t0e65VkD?Eoy*o!bDn1F$4@IssUgIvxO91P5CL=T5*~ zfG)slz}EGr-e;DBzcX7XVeLPcuw`+!0JZ|Q1D*vu2iO649)PWk^Bcg+0BnmKYyq6#0bT`k1AY(q0{~kc2U{KI zzX81fY`dJl0uG=q*mgPZ0R9Ph4{#H7{~zEmpcU{U;J1JUh{smU`4Rxz45uF97T{fg z7+@dZT>$Rszy~U;Dyn!JSOq_fTwy*On7Gl%TuS4Z_=@TH#;Caw*N@?M4eg6jO5zuu zOvE?o^edj4dtl!9hgf}X`A+co{x1Yf;!CeX+Di)Ks!IX?Mn-(258vs;*PyG-^@hG6 zeD^q2`N_ES(!V@X^~CL3dh4G?l**No_BE55AeW}e1%Pr1AHOfEckc3Is{8=0e|@gG z(J$$uU6qk~{gJP0YCJ!im}oPf%NPaMBc@HocV1KLi>QI_O!Var%ws-|n&u0~PDK^m zEcvn)e$P^(tq<~=IB8ap1K%5g%n3$%=0G34PN#r;*j6-1bEAqcJ>}z?_=sd&@8s(6 z>zRG(lZZ?y!m8*b-kW8*H;jKAFnMt*e@h55UfA zXj*KB4f(#PalOO`H`6mt=EbgtRmeX4iNR><3>`rFXq0p>Y?@U0Oli9K`0&(s==-4i zY}1IdKZKknIrV#^X;{Pr>2&FPCvKYD)`yqVq}rD+PQZtRLrv)l(u;W0`2_jIvY!hPB1S*qOh)6A95M_gozafQJRvtoCMU#;*ZdMTbTjA5`1frSWuS2D zGu82;5j`bwZzZCs3vafXTw=`?6vJ+is5e8%%kS>uv&()uVsIlpZ&zf7c>mz%XLFgcC4xR@Aod9P%Y z`+Gs5NqpCeH;owr^aIh%sS#4f_{B(=iw~aH&oj}@sT|Z|f=L@7$z0%(mLcVmk90hk zxp7};A_a|}xEmxXI?%;)A#BP5hoHp@rqS#i0mlyWrF4D%6fjSxdn z7QWeU?o_3yKKbHooXYtL_fe9a=ojqkKg!x>IT~+#FkGkN%&)V zJd|iI@jC?Jb#Xtl<3uUHENW^cs;9v)@MPYBXBK7Xj*Yk&ho6OWXT*~c=`+&;c@YoeeaM&NGrv8?5l9dZX63{ zNl9QY!lY!~Lq%b!*VQmC-Bn_Y7lY`nSPW0MZfjy#oCWohYqJoMxEq}P8J}cluS(1$ z;P5XbaIo8z@k^V+sesKe8JKo&xtp!Ep>GgV;nKD%#isW**PW3qG|%Jdl-)^MBxq^oiG=e z2TGO!-eOoFH%B-X3qlL3xKsc}ZJi1^gjmo#ZwAJ;etW1B@_!9s$0qbmnOlK*hd1RwL>(0o#&ii4m5q&N>;XZCkqt;iwSV_< z#XMegVs`u?)UipAQTXY9b5{X;pt5?gbKZ67PhfcEu%!6Av@x^$=as^I#sT>18^X0U ziGv1QMiW127$a%8`kH-&H5*f_wHgDnH{c$##baul&H2NaD%^j46WltCv2Gx}{v+kp z^5&J=n%Yp)hbubay#w*rHk)SgPjLpYqO$7g&H#+@Mo&6b8Ayw!_<5UXBh#3+N%H^& z!B+-4X&I1(-483$ADsR##L75hJLNT% z&2kuti%bSEzZneed^2kogsP{t3^;h0TsTGLI60vBIyqQ1{kJB54$CFvzi+zqvSuen z@DMMDG$*i_-FVkFW|X-tTzO*UD|g=1HshAty2^P-2v;^?wr-x;AhlntrxwPMaNL^G z;hg>_kc#w*^56=u2^XF(>5(a6AS#7q)Wq@C6Be$Z~dM6;($^&1yy zvb~XOkT^feQp3c}kel23L~s!zk<^W=I6X+_qRp(hcv!tf>=Dy6yl2iF1y+3CiHo{+E zaEri`-+=f*vUeaqZV$5EMOQHKOet5oAwx<``eG87!o^3DxX5(3$@S&xdk-CX{+&zD zVEOdy@vE>tl*E*W0MerA<)+^AB?`z9vAL!#`M~^~z=yeViY_sA#sEV4xzFkY^QFBz zN^Y9^z^rMn-I|TtshYzR%be!Qg&`oU-sf{^UOU%c!Sjjbk-sArIAVb#7C2&oBNj-u zz^~u^%lpS5Y7pRPz+k}gGF4Q}49@c3Rzn>AqVkp{DZJ&y{6{G;s-l8t z8l=o$YW|sno#^R!>kZh!OE!tWET_#6U}ep{U%mg*TB?lJ8YepQ9K69(lPtrQXY{CQ zsI0>Q9|Wh$*l~vw%|<+M(%*4Odeq_e`KHRcQHCW|#%{>SLlSUOU1(4LkGljMiTJ@j zdK^$0!1$$2`aibCBx#G1aWltRJS))_Q~>Qj%yJ379Guf((|`#5tElLkpV^t;ww=QQ z_0OF3`61ddSwK$j8P}P< zKvMoPq;-TeGVqKbY=orhPz)Vf!3iw=Niy-jBpJqvJl(||p?&n&%zEGtIQ0*;GJnt` zNl2<5A5O*sJUQY^DcH!MQPRoa8;8`xZi}Om>k_J~sHttm;W7VGWwi2BF!%#b{j=+W zHZeMoDV>Z-h^LJH^^kY@;$@`Dh(eEzNCh6CUEmj$=A}RiN|n)epOFDPfQ*EHrIS&- z-icPjroaQpNcdMe8PWTlC|?)`9zaH;|Go%C^r_2`2TVT$PO@pTpQ69WyG|makBkzP z0X&cld97(-Ws`LKRGZd82Bib1{#pJ(dsNm}g(^f$s*E<(19$*?n8zb{5`rg3eeJOU zGRhDSJV0HV7cZFGQ0I?dsd^kz8NmI@;5ZhQ@+VIzn>KwWNb|Q5(X26@6qxfd!T0xy ziW^%NG~yU-E*|mVucD%F{>#bC{MKJ~mi(4P>{3zD$eV~mrX~8yxco;>v;cX5lm3oI z$geZ?9}TFeD4jg@s$j`vzXnmvp&W~&P#>6MFM0XLdFzl(6_)jV8|<%Z!FX%jL0YABEAGR?!snIyRYqfzCavv6w( zzGs3^hBMqeoF86VJGZH_X|XNSI&Z=|TDmRqix<^^P{Jp9{l0~>2tcx@{Rt_H__>Z=*G?n{3?q1kNh36 zz!3`^vA_`v{C~p&F{(N1@Wuyk#jnBIp1}WydrX|y#<;^h<(;ozbM*{&|JYb5d6s5- zZpljggsh}6%X16w1eH}7yX9NJ!9AW^98X$zyGg1*lIM=~p}{CC&->p*LYEXUvoMR&_amm$WyX$ZOF_h4bt}TqH{z}* z1&%*3kEQGyE#yaxFYoD`$wEe0g?znFA-78*%($(jkkhXdaW|QQ@;rB_$(z%;gp!I> zk{8^=(o3cELO;?Cs1-*^Apyo~P0nB;!M&b4B+fiUnU6tIq-!@zEboqVZ6PtUFyAZR z3zX+|iQQ%v=6L1ZQk^aySNL+DTMK%t=knt~#-cnBF>UHM+ymfgkA{c()$0sHtea!_ z(pIcD0Ny;B0=&wR?aM9S)0tlw`#gktZk9%Njw*~@E-`)UcQ)c9U3>qnYW*F*vu3q; zLeyWiegmGq)p`%-S;+BGt91*6CRb}dV|;f#WTa=&#it=*xw{H}<8B#y-3=A9e}Ntr z+kXq#mzA{R_nQo(zm1A@BQE!6<%KY6A&u$thR9axj}-R-V^c-a{$DZf|LUS3ab( zd=E!J(bO?YWPa7cMV<(R1he@`HORd?AF>_*-4+cO&5gaQz#6Cio@W zA530X4I|aXFK0H%QUvI8kz z*OitMKOwIe?G)vvYpz!b3E5**!dH-jW+`H`M7mD!L2GSRm3h%)|}B08kL= zy3B;~*@q%sQ%xwx>!Pi|pY3&>WN9;$P3;d=C-|Ij zu)nS$XSd<3_c?>zrhYc(7IL=i>3EwmZ}mCRQDykEIqxColpP(-&SGnIgV9Ln+!}GerNWK(*gBlVtVuS>LQLDz7oBiTx}yI4HR(Pt znzD|!?7IUgEb9mTmh})glFM4dnBaC})t|*Ju)VJZ>M31@{f}v@a7>2pmnVb|3(Z2!Y>sMwztvh?QV(#Tot&*)yCq*ypbgCFhQ*NGUU{OfMujwOc= zAC9=ai%5q-8^vx?ZjL;^CEr%mV7j-O+@_i5`5bWgN5O%y@dD4SvSPo9SZ}q+#C&4p ze#uXV+@(m5xSo{UnzrQYKCtAA)0TXulq@pSmOO~*?#q@gZ?0w?JA>_QPoCEXTjsXs zV3&%nnu7qeyrdQB($On4m*;+4?f4k;2HQHKx$PLQok+_{83Y&$+k6KY%ZV>|?sb07 zU>nVUs}vb=hjVNY(bxD2A=@0JdgblL)-$YxE07QguB3!BLH5qmz^5oq7Asd#S0s;Q z@+8lF)i2k5QZ*ig6x2;t9~@fZ_3XNid1YXk#$4LTUR;H518kv>`4bN&n*11__dtAy zDcEz*)78*=u)`Xwqwbb`Yt9%N8;=azf<2G}gcAbPWNA1Hb525fr0cmBU(E-YrfLpF8r<+?&wba*aS~$r!2qZCtmK4$bs;N?%mPCV zTaT_f5=syCYsvL%UTg&p_q>*D^e6NI_2d1RaeI&U+*Yfg?^9k7Yn{=IL|1J=SIxWb zhS~eNkYZ-%{McoXh6-o1_MUqWR>E=L@O&#|66!3f1H`a>1ZVdQwohINK$dN9XxnWZxbEzwN-{(6_=u=aM7 z4T;@B*)4e;Z?~M{xqsrcBP)XmtRfWtF*0#TJUc8YIT4rN3pLI5U&_s9yAyoq1z95x z_f9mauf}CvuCf+T);4ezqHkJx%NZ}8eFbHs)N2@X$lWr;Zzx%l42k{mW+=;@#%KKO zXx@{^jNz;0`h?lfu+rb=!kFo>+(mJv?xy8X)E=aIUFR}hy=*J_MV*JxKIGZX7+JN9 zx8!~cv6hO`QsZux#+N}QzTR5;Wg}31phoi9tuQurEb>V!lJa_tHVYfek0TOTU zyf54W>e&`unY|g8BQE;{*u1X)VWb-9ey*ZjW-@Z&XbhNUzuzih3A2{xckB|io2Yh= zs7=yeqNJ!j33;gYKSb@GzG|Nh26X0*XQY3XQ+0$e32GDlC0Tu0VsGtq4P&^>b65Ke z?z3!7n2Ha+jrI{=dzk%ah(&)o&2u~BIVgoW?qv><>A7MW=`?;Sr-^upr<%o>jw`l# zW`ix>s&9&Ux@jIEb$6E9s^^GOx$W*Lrx6I8SD(4ZP^jJzDsWPht(p*>?hMyb0LyF z_vb1e4&955iLN>?_G96XQdH;kw*tZh2Ap_HvKWhd5!}&nrx;?w4MD; zbOSj1n238i>mk#zo&JKPhfhJyG*x(%Q@AYMKHJAiUt=1!H}MLhDlX#=So=6L(VV#e zm1)5qe9=N^BSZOB=41d}^9@5~aVVdF{AMWEbnMlbhpu-v(omCW5%-@EXKM02KQG+& z7?VESbN{Kap8L+1Oy1rVP@wAy#+T>F#30kxZbX}zjC)KSYZum$mlH8Gz07m(Uh0=N z#xD(;ejQm&C((3hDw8)fU5Ydr@2`!xQ|tZQ?;AP(@^zNa^x4>zr-ElI>sWFI%f6B2 zsE>^lHY~mUvQg7h8E4ND#>zj%N3Fa^2Saf;WtPF zD+aTUcujw+**OaT5a|gcnWCmkQ4e6&^4$95qS~aWTjE9ij>%e7b-bvf<3-(Q6;+Z{ zl(fgt*q`wz26Nw5cNmJxz)HvLHQ+f9`6at!bp9L!0ce$iI2T&QPkZAl)b2FLByDvi$y%DB*30(42lm)sYN>F!=J4G6DHaN!hJ2mRaBMpcQ)a|Hs}5l_V8s2b zp_+QPW#DADMOFG;xr1`6dh}i_KF64?;E6yzyN7e5zC)bI&?Gp@X zI^b`8?aH&+e_gOgx`I?g{OnB@rK09h4U8AR^s~79DlscG1u0(FUo75B$SY%&NPr{L z6VIabCp*wmGA4EHvvM4((qH#02mXIxrGM#Rm~!D2o*PfVFx8EOpD^K^XGBl;H7nQC z+#g6g+Va24*sZZOL^2Wl-YR^BBwA&l@K(fK%17X-g>#?v6DFi9d^{!fDSW8NkKot` zvl5ysXFGI{FSA}z=O*GXW@bpgbL}oUsgu~!+wj0{x z1tjt83k?@>LmK%MBi;M`#xqAyT@o30C{%kHViFED)N-X+NWu7h48L#Y^k$CS<#mXs z;m~BK+mq25+}XY>oE_<49wbL`%C;@IhstjYc00#q#5Y**2F6B^5y~DXVslqTnP=G+ z_8folEGyFoYZ3~1?hLct^|vK2-ezx0_&%byth*s`=2#e;kGQrcpGTY%9u_;-)J|3g z9$X&Ff_P=S4$O!7)Y<$Z=G2J0ixN=1 zi2DpF)NUf=?E4IRTv=ArfRVn@WCF2v4=J6DL^5wD3vq>(K;WlzNY zGK1z|CD=aA#*5m1&?L3eI_Q>%Eq!S_wg$} z6^$LUJorW=_=eAO3{vj z77<+U1=~A=8#>D$-WJ>lF>s+xL^!rP78}33&M9kpkL!5b3$D!#;*4ai*Rl@L$41<{ zq|)o$r4MJEyvuzC11cNIo0Nl``JORC>FUj1G1g40SGvz+cvlQTi{yKH(uAZda1w2j z+z5<-+T>$*V<>j593F4L43XewAk0%@DrxiwxJ8roz`}pQ+Nk?ksJos~<>Tawp($;h zIfbztlBguwKLcd)S%$lR(zf94LR5HJXg~gkearvW_Qx-A&#zdHLVuy!${TxSM4Rhd$5B`Fv>=3(j7?Y!k)@b7X%pqOgVk zjvpc2uZVo^a>T(tpE8ci=0}CUP2Hu!PrFt(lxe>-_P4o6ZOKM^91}ZT3<8JAVe3WQ zMd(IiJNI@&$@H)mQZS03D^=2Fzh@BJ-`sY7v5?-z%&bK%Q@9`h82Nr8AyQPM<8W>} zzx;?n7~Sw|6ptKFe;F7P$2Y;Tj~~AD#d*PF(cpJcQ6z3b$}6x?id&zSBD!al%z42KP^hs|#2jtTzf!SvuAHv6z zzK$jG6y~_tv4ag6{uFGKZHf~+UP~TW<}zTT+HsMt?^PqRe0Ogk;tFZZ>0$o@P2Lbq za@*HIL2XFYajem?HLl}uZ#*k|iqY|OJd5xrsfWSptGNlZsCjzqNlb6-9^p~c|B(}! z!1h{4_P0?>u77-O#4h(RGxWa|*w^2ElKKaCLjNuy%XhL|HSpQsq=DJwo}VJNSb{AZ zQabKKN^FFxlH0xtL8?ce5=?e2QeL$Z6!u!8-YzJ z>9iR{ZC0UV*rTQ1JP|?rCMtMsLMyXUkkJM5Po;dit!Q;VLj!2FfMSsAkHpZ5`|UPSHYxOmT2GHtdih)+8s#S?-wQAWGHlsDVFWbKs5wSmB zE8;rKmv>HSk3Gv(QE(Nf_BRG00c~@(l(%MNG}1Mu0#W5Fd&fmuGuV(G7KY%M!xE|A z*$lNK1o~5)U5`Qurr~AqKFTD0q4Urs!8J>MvMoprU^0=i7KvCcvgkS#jqEv0jks5` zR0xZ>*BT05v6fzOG|LUHLnG&7ZaRzlqTWG?UE90CTe=*RF-``?V=SQ9zq7E$p&f7M zw#Pump1__B#pGjBBgTM;;<|2RAzVau^?pn!I-{t6Klr^V%R8RUZQlS^uj?`j-qlj% zxwGjiN!{rSbWt(j+l!Irk~iYsLg7KI@xLMj)`-hHgB$6h<(neq8zWQpP$4Sfxs^ty z>`JMkbe~d=R0-KHQ8rC~inNE6!bUh1s?r!&Q03qXFciivIgVwohq*o-aqm%6LX+8u zMwW{pYUJU4cVJ+TmtdYc&Xqz;gSV0O0Y+@2{5L>(0j$G&V#x z-oQemaSKU*rCUUT8%1Jy8=Ep{ia;k?4GJyIY#awT1{f`>;)OPW^4$YCo92=!-^ltb z8L^3mut^}zKHQg5&t0l)04|}FU=K5!c}!H>PFXVWte{?V!EV-n!>EqRin!0Qey~J_ zq;tr^qVRVbxu1`xVVpm)EZ}G2LijA}Gng*DE^!!m8TIE>Dz-2cy_ngs4&2KEZe!l^ zb)Dr~I+t$Oh1#~@PP1v>P30jWi#QV8!VGtza5(#_C?*x;LmehSM91N9HVyJQQDrR| zhq9Qravy)j?C#kWlST)bHMU$$!E4Os7doaJZe{R43&mn!%k6j)ay;2iv)gzs&5V9v zHd3$gz!~mp79DIu);;3xxK1pf&D~D*TpCe)j1=?_nI>*$l?F30xPmnbfixa|6%ca{ zVj|ZuV`yCQHFt<9Kn~`<#FO%9%aDCnaW#wf`Gk?S?`(v1wu{#wU4>Y4!5uy}|f= zwUQhgky{$(Jcf3QtnjCO8+w=tb-*vzVqWH~h&gN3lE;1jFmF@Dz`*^JtdOwq!s7|- z?~|umbFBZx8K`49PS0Pxo~nmG<28=JiXS6!*DPoQ?_rC!P%|7Jyy?nI0Eb^Qn8yM} z%qU;Xs<@a@Mog(ChR6B+h>;cQkl6m|P{%DbLQXel2Ren&56r~n^05{cBrPXki3dwN zvCV&jA-F^t0&B^r!!G#iHxVoQm_5w#PSOLEYp&+|5MSnMcdIuAuaRZPmaxILLG5hz zzV*!WF2*6$RbNq*JhJNypAatyO%*~xy+_49OJUnaK09((Y$QcV(X%0D*`E(XOD@)Z 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 diff --git a/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h b/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h index fb705097..e35663f6 100644 --- a/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h +++ b/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h @@ -14,6 +14,10 @@ #include #include +#ifndef GROWL_EXPORT +#define GROWL_EXPORT __attribute__((visibility("default"))) +#endif + /*! @header GrowlApplicationBridge-Carbon.h * @abstract Declares an API that Carbon applications can use to interact with Growl. * @discussion GrowlApplicationBridge uses a delegate to provide information //XXX @@ -323,6 +327,8 @@ struct Growl_Notification { * 0.7. */ void (*clickCallback)(CFPropertyListRef clickContext); + + CFStringRef identifier; }; #pragma mark - @@ -374,6 +380,8 @@ struct Growl_Notification { (notification)->reserved = 0U; \ (notification)->isSticky = false; \ (notification)->clickContext = NULL; \ + (notification)->clickCallback = NULL; \ + (notification)->identifier = NULL; \ } \ } while(0) @@ -417,7 +425,7 @@ struct Growl_Notification { * structure, except possibly the referenceCount by calling the retain and * release members. */ -Boolean Growl_SetDelegate(struct Growl_Delegate *newDelegate); +GROWL_EXPORT Boolean Growl_SetDelegate(struct Growl_Delegate *newDelegate); /*! @function Growl_GetDelegate * @abstract Returns the current Growl delegate, if any. @@ -430,7 +438,7 @@ Boolean Growl_SetDelegate(struct Growl_Delegate *newDelegate); * delegate on your behalf. You are responsible for retaining and releasing * the delegate as needed. */ -struct Growl_Delegate *Growl_GetDelegate(void); +GROWL_EXPORT struct Growl_Delegate *Growl_GetDelegate(void); #pragma mark - @@ -452,7 +460,7 @@ struct Growl_Delegate *Growl_GetDelegate(void); * If the user does choose to install Growl, the requested notification will * be displayed once Growl is installed and running. */ -void Growl_PostNotification(const struct Growl_Notification *notification); +GROWL_EXPORT void Growl_PostNotification(const struct Growl_Notification *notification); /*! @function Growl_PostNotificationWithDictionary * @abstract Notifies using a userInfo dictionary suitable for passing to @@ -468,7 +476,7 @@ void Growl_PostNotification(const struct Growl_Notification *notification); * to using CFDistributedNotificationCenter. The keys for this dictionary * can be found in GrowlDefines.h. */ -void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo); +GROWL_EXPORT void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo); /*! @function Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext * @abstract Posts a Growl notification using parameter values. @@ -491,7 +499,7 @@ void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo); * The icon data can be in any format supported by NSImage. As of Mac OS X * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT formats. */ -void Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext( +GROWL_EXPORT void Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext( /*inhale*/ CFStringRef title, CFStringRef description, @@ -525,7 +533,7 @@ void Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext( * This function was introduced in Growl.framework 0.7. * @result false if registration failed (e.g. if Growl isn't installed). */ -Boolean Growl_RegisterWithDictionary(CFDictionaryRef regDict); +GROWL_EXPORT Boolean Growl_RegisterWithDictionary(CFDictionaryRef regDict); /*! @function Growl_Reregister * @abstract Updates your registration with Growl. @@ -543,7 +551,7 @@ Boolean Growl_RegisterWithDictionary(CFDictionaryRef regDict); * This function is now implemented using * Growl_RegisterWithDictionary. */ -void Growl_Reregister(void); +GROWL_EXPORT void Growl_Reregister(void); #pragma mark - @@ -563,14 +571,14 @@ void Growl_Reregister(void); * @param flag true if you want GrowlApplicationBridge to register with * Growl when next it is ready; false if not. */ -void Growl_SetWillRegisterWhenGrowlIsReady(Boolean flag); +GROWL_EXPORT void Growl_SetWillRegisterWhenGrowlIsReady(Boolean flag); /*! @function Growl_WillRegisterWhenGrowlIsReady * @abstract Reports whether GrowlApplicationBridge will register with Growl * when Growl next launches. * @result true if GrowlApplicationBridge will register with * Growl when next it posts GROWL_IS_READY; false if not. */ -Boolean Growl_WillRegisterWhenGrowlIsReady(void); +GROWL_EXPORT Boolean Growl_WillRegisterWhenGrowlIsReady(void); #pragma mark - @@ -585,14 +593,14 @@ Boolean Growl_WillRegisterWhenGrowlIsReady(void); * This function does not attempt to clean up the dictionary in any way - for * example, if it is missing the GROWL_APP_NAME key, the result * will be missing it too. Use - * Growl_CreateRegistrationDictionaryByFillingInDictionary: or + * Growl_CreateRegistrationDictionaryByFillingInDictionary or * Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys * to try to fill in missing keys. * * This function was introduced in Growl.framework 0.7. * @result A registration dictionary. */ -CFDictionaryRef Growl_CopyRegistrationDictionaryFromDelegate(void); +GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromDelegate(void); /*! @function Growl_CopyRegistrationDictionaryFromBundle * @abstract Looks in a bundle for a registration dictionary. @@ -613,7 +621,7 @@ CFDictionaryRef Growl_CopyRegistrationDictionaryFromDelegate(void); * This function was introduced in Growl.framework 0.7. * @result A registration dictionary. */ -CFDictionaryRef Growl_CopyRegistrationDictionaryFromBundle(CFBundleRef bundle); +GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromBundle(CFBundleRef bundle); /*! @function Growl_CreateBestRegistrationDictionary * @abstract Obtains a registration dictionary, filled out to the best of @@ -639,7 +647,7 @@ CFDictionaryRef Growl_CopyRegistrationDictionaryFromBundle(CFBundleRef bundle); * This function was introduced in Growl.framework 0.7. * @result A registration dictionary. */ -CFDictionaryRef Growl_CreateBestRegistrationDictionary(void); +GROWL_EXPORT CFDictionaryRef Growl_CreateBestRegistrationDictionary(void); #pragma mark - @@ -664,7 +672,7 @@ CFDictionaryRef Growl_CreateBestRegistrationDictionary(void); * * This function was introduced in Growl.framework 0.7. */ -CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionary(CFDictionaryRef regDict); +GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionary(CFDictionaryRef regDict); /*! @function Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys * @abstract Tries to fill in missing keys in a registration dictionary. * @param regDict The dictionary to fill in. @@ -686,7 +694,21 @@ CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionary(CFDictio * * This function was introduced in Growl.framework 0.7. */ -CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys(CFDictionaryRef regDict, CFSetRef keys); +GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys(CFDictionaryRef regDict, CFSetRef keys); + +/*! @brief Tries to fill in missing keys in a notification dictionary. + * @param notifDict The dictionary to fill in. + * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. + * @discussion This function examines the \a notifDict for missing keys, and + * tries to get them from the last known registration dictionary. As of 1.1, + * the keys that it will look for are: + * + * \li GROWL_APP_NAME + * \li GROWL_APP_ICON + * + * @since Growl.framework 1.1 + */ +GROWL_EXPORT CFDictionaryRef Growl_CreateNotificationDictionaryByFillingInDictionary(CFDictionaryRef notifDict); #pragma mark - @@ -697,14 +719,14 @@ CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionaryRestricte * installed. * @result Returns true if Growl is installed, false otherwise. */ -Boolean Growl_IsInstalled(void); +GROWL_EXPORT Boolean Growl_IsInstalled(void); /*! @function Growl_IsRunning * @abstract Cycles through the process list to find whether GrowlHelperApp * is running. * @result Returns true if Growl is running, false otherwise. */ -Boolean Growl_IsRunning(void); +GROWL_EXPORT Boolean Growl_IsRunning(void); #pragma mark - @@ -738,7 +760,7 @@ typedef void (*GrowlLaunchCallback)(void *context); * acceptable for context to be NULL. The callback itself can be * NULL if you don't want one. */ -Boolean Growl_LaunchIfInstalled(GrowlLaunchCallback callback, void *context); +GROWL_EXPORT Boolean Growl_LaunchIfInstalled(GrowlLaunchCallback callback, void *context); #pragma mark - #pragma mark Constants diff --git a/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h b/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h index 7ac315af..4341f3fb 100644 --- a/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h +++ b/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h @@ -3,7 +3,7 @@ // Growl // // Created by Evan Schoenberg on Wed Jun 16 2004. -// Copyright 2004-2005 The Growl Project. All rights reserved. +// Copyright 2004-2006 The Growl Project. All rights reserved. // /*! @@ -17,23 +17,12 @@ #define __GrowlApplicationBridge_h__ #import +#import #import "GrowlDefines.h" //Forward declarations @protocol GrowlApplicationBridgeDelegate; -/*! - * @defined GROWL_PREFPANE_BUNDLE_IDENTIFIER - * @discussion The bundle identifier for the Growl prefpane. - */ -#define GROWL_PREFPANE_BUNDLE_IDENTIFIER @"com.growl.prefpanel" - -/*! - * @defined GROWL_PREFPANE_NAME - * @discussion The file name of the Growl prefpane. - */ -#define GROWL_PREFPANE_NAME @"Growl.prefPane" - //Internal notification when the user chooses not to install (to avoid continuing to cache notifications awaiting installation) #define GROWL_USER_CHOSE_NOT_TO_INSTALL_NOTIFICATION @"User chose not to install" @@ -176,6 +165,40 @@ clickContext:(id)clickContext identifier:(NSString *)identifier; +/*! + * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier: + * @abstract Send a Growl notification. + * @discussion This is the preferred means for sending a Growl notification. + * The notification name and at least one of the title and description are + * required (all three are preferred). All other parameters may be + * nil (or 0 or NO as appropriate) to accept default values. + * + * If using the Growl-WithInstaller framework, if Growl is not installed the + * user will be prompted to install Growl. If the user cancels, this method + * will have no effect until the next application session, at which time when + * it is called the user will be prompted again. The user is also given the + * option to not be prompted again. If the user does choose to install Growl, + * the requested notification will be displayed once Growl is installed and + * running. + * + * @param title The title of the notification displayed to the user. + * @param description The full description of the notification displayed to the user. + * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. + * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. + * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority. + * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. + * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of NSString, NSArray, NSNumber, NSDictionary, and NSData types). + * @param identifier An identifier for this notification. Notifications with equal identifiers are coalesced. + */ ++ (void) notifyWithTitle:(NSString *)title + description:(NSString *)description + notificationName:(NSString *)notifName + iconData:(NSData *)iconData + priority:(signed int)priority + isSticky:(BOOL)isSticky + clickContext:(id)clickContext + identifier:(NSString *)identifier; + /*! @method notifyWithDictionary: * @abstract Notifies using a userInfo dictionary suitable for passing to * NSDistributedNotificationCenter. @@ -371,6 +394,21 @@ */ + (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict restrictToKeys:(NSSet *)keys; +/*! @brief Tries to fill in missing keys in a notification dictionary. + * @param notifDict The dictionary to fill in. + * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. + * @discussion This function examines the \a notifDict for missing keys, and + * tries to get them from the last known registration dictionary. As of 1.1, + * the keys that it will look for are: + * + * \li GROWL_APP_NAME + * \li GROWL_APP_ICON + * + * @since Growl.framework 1.1 + */ ++ (NSDictionary *) notificationDictionaryByFillingInDictionary:(NSDictionary *)regDict; + ++ (NSDictionary *) frameworkInfoDictionary; @end //------------------------------------------------------------------------------ @@ -417,10 +455,13 @@ * +[GrowlApplicationBridge * notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:] calls. * - * The dictionary should have 2 key object pairs: + * The dictionary should have the required key object pairs: * key: GROWL_NOTIFICATIONS_ALL object: NSArray of NSString objects * key: GROWL_NOTIFICATIONS_DEFAULT object: NSArray of NSString objects * + * The dictionary may have the following key object pairs: + * key: GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES object: NSDictionary of key: notification name object: human-readable notification name + * * You do not need to implement this method if you have an auto-discoverable * plist file in your app bundle. (XXX refer to more information on that) * @@ -448,12 +489,25 @@ - (NSString *) applicationNameForGrowl; /*! + * @method applicationIconForGrowl + * @abstract Return the NSImage to treat as the application icon. + * @discussion The delegate may optionally return an NSImage + * object to use as the application icon. If this method is not implemented, + * {{{-applicationIconDataForGrowl}}} is tried. If that method is not + * implemented, the application's own icon is used. Neither method is + * generally needed. + * @result The NSImage to treat as the application icon. + */ +- (NSImage *) applicationIconForGrowl; + +/*! * @method applicationIconDataForGrowl * @abstract Return the NSData to treat as the application icon. * @discussion The delegate may optionally return an NSData * object to use as the application icon; if this is not implemented, the * application's own icon is used. This is not generally needed. * @result The NSData to treat as the application icon. + * @deprecated In version 1.1, in favor of {{{-applicationIconForGrowl}}}. */ - (NSData *) applicationIconDataForGrowl; @@ -461,9 +515,8 @@ * @method growlIsReady * @abstract Informs the delegate that Growl has launched. * @discussion Informs the delegate that Growl (specifically, the - * GrowlHelperApp) was launched successfully or was already running. The - * application can take actions with the knowledge that Growl is installed and - * functional. + * GrowlHelperApp) was launched successfully. The application can take actions + * with the knowledge that Growl is installed and functional. */ - (void) growlIsReady; diff --git a/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h b/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h index 6ff6ee3d..2b971cfe 100644 --- a/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h +++ b/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h @@ -7,10 +7,10 @@ #ifdef __OBJC__ #define XSTR(x) (@x) -#define STRING NSString * +#define STRING_TYPE NSString * #else #define XSTR CFSTR -#define STRING CFStringRef +#define STRING_TYPE CFStringRef #endif /*! @header GrowlDefines.h @@ -48,6 +48,14 @@ * "SurfWriter Lite" are not. */ #define GROWL_APP_NAME XSTR("ApplicationName") +/*! @defined GROWL_APP_ID + * @abstract The bundle identifier of your application. + * @discussion The bundle identifier of your application. This key should + * be unique for your application while there may be several applications + * with the same GROWL_APP_NAME. + * This key is optional. + */ +#define GROWL_APP_ID XSTR("ApplicationId") /*! @defined GROWL_APP_ICON * @abstract The image data for your application's icon. * @discussion Image data representing your application's icon. This may be @@ -74,6 +82,26 @@ * notification names. */ #define GROWL_NOTIFICATIONS_ALL XSTR("AllNotifications") +/*! @defined GROWL_NOTIFICATIONS_HUMAN_READABLE_DESCRIPTIONS + * @abstract A dictionary of human-readable names for your notifications. + * @discussion By default, the Growl UI will display notifications by the names given in GROWL_NOTIFICATIONS_ALL + * which correspond to the GROWL_NOTIFICATION_NAME. This dictionary specifies the human-readable name to display. + * The keys of the dictionary are GROWL_NOTIFICATION_NAME strings; the objects are the human-readable versions. + * For any GROWL_NOTIFICATION_NAME not specific in this dictionary, the GROWL_NOTIFICATION_NAME will be displayed. + * + * This key is optional. + */ +#define GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES XSTR("HumanReadableNames") +/*! @defined GROWL_NOTIFICATIONS_DESCRIPTIONS +* @abstract A dictionary of descriptions of _when_ each notification occurs +* @discussion This is an NSDictionary whose keys are GROWL_NOTIFICATION_NAME strings and whose objects are +* descriptions of _when_ each notification occurs, such as "You received a new mail message" or +* "A file finished downloading". +* +* This key is optional. +*/ +#define GROWL_NOTIFICATIONS_DESCRIPTIONS XSTR("NotificationDescriptions") + /*! @defined GROWL_TICKET_VERSION * @abstract The version of your registration ticket. * @discussion Include this key in a ticket plist file that you put in your @@ -97,9 +125,10 @@ /*! @defined GROWL_NOTIFICATION_NAME * @abstract The name of the notification. - * @discussion The name of the notification. This should be human-readable, as - * it's shown in the prefpane, in the list of notifications your application - * supports. */ + * @discussion The name of the notification. Note that if you do not define + * GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES when registering your ticket originally this name + * will the one displayed within the Growl preference pane and should be human-readable. + */ #define GROWL_NOTIFICATION_NAME XSTR("NotificationName") /*! @defined GROWL_NOTIFICATION_TITLE * @abstract The title to display in the notification. @@ -186,6 +215,15 @@ */ #define GROWL_APP_PID XSTR("ApplicationPID") +/*! @defined GROWL_NOTIFICATION_PROGRESS +* @abstract If this key is set, it should contain a double value wrapped +* in a NSNumber which describes some sort of progress (from 0.0 to 100.0). +* If this is key is not set, no progress bar is shown. +* +* Optional. Not supported by all display plugins. +*/ +#define GROWL_NOTIFICATION_PROGRESS XSTR("NotificationProgress") + // Notifications #pragma mark Notifications @@ -304,4 +342,7 @@ */ #define GROWL_REG_DICT_EXTENSION XSTR("growlRegDict") + +#define GROWL_POSITION_PREFERENCE_KEY @"GrowlSelectedPosition" + #endif //ndef _GROWLDEFINES_H diff --git a/macosx/Growl.framework/Versions/A/Resources/Info.plist b/macosx/Growl.framework/Versions/A/Resources/Info.plist index 6530bd21..ab7194d2 100644 --- a/macosx/Growl.framework/Versions/A/Resources/Info.plist +++ b/macosx/Growl.framework/Versions/A/Resources/Info.plist @@ -1,5 +1,5 @@ - + CFBundleDevelopmentRegion @@ -13,11 +13,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.7.6 + 1.1.2 CFBundleSignature GRRR CFBundleVersion - 0.7.6 + 1.1.2 NSPrincipalClass GrowlApplicationBridge diff --git a/macosx/HandBrake.xcodeproj/project.pbxproj b/macosx/HandBrake.xcodeproj/project.pbxproj index cb2bed5d..dcd6dc77 100644 --- a/macosx/HandBrake.xcodeproj/project.pbxproj +++ b/macosx/HandBrake.xcodeproj/project.pbxproj @@ -3,67 +3,37 @@ archiveVersion = 1; classes = { }; - objectVersion = 42; + objectVersion = 45; objects = { +/* Begin PBXAggregateTarget section */ + 27C7D1020F58AEC400974730 /* configure */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 27C7D1050F58AEE300974730 /* Build configuration list for PBXAggregateTarget "configure" */; + buildPhases = ( + 27C7D1010F58AEC400974730 /* ShellScript */, + ); + dependencies = ( + ); + name = configure; + productName = configure; + }; + 27C7D1160F58B0AF00974730 /* make.libhb */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 27C7D1180F58B0AF00974730 /* Build configuration list for PBXAggregateTarget "make.libhb" */; + buildPhases = ( + 27C7D1170F58B0AF00974730 /* ShellScript */, + ); + dependencies = ( + 27ED6AB70F58CA0A00C905EE /* PBXTargetDependency */, + ); + name = make.libhb; + productName = configure; + }; +/* End PBXAggregateTarget section */ + /* Begin PBXBuildFile section */ - 0D096E010B707D3400A845D4 /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = 526FBC9B0B4CAB100064E04C /* common.c */; }; - 0D096E020B707D3400A845D4 /* deca52.c in Sources */ = {isa = PBXBuildFile; fileRef = 526FBC9D0B4CAB100064E04C /* deca52.c */; }; - 0D096E030B707D3400A845D4 /* decavcodec.c in Sources */ = {isa = PBXBuildFile; fileRef = 526FBC9E0B4CAB100064E04C /* decavcodec.c */; }; - 0D096EA30B70884A00A845D4 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D1125D709D72FD200E0657B /* libz.dylib */; }; - 0DF377980B7BF99A00115CB0 /* fakexcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DF377970B7BF99A00115CB0 /* fakexcode.cpp */; }; 0DFA5C7B0B8DD1E90020BC09 /* HandBrake.icns in Resources */ = {isa = PBXBuildFile; fileRef = 0DFA5C7A0B8DD1E90020BC09 /* HandBrake.icns */; }; - 0DFA5CC00B8DD3FE0020BC09 /* declpcm.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C7E0B8DD3B60020BC09 /* declpcm.c */; }; - 0DFA5CC10B8DD3FE0020BC09 /* decmpeg2.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C7F0B8DD3B60020BC09 /* decmpeg2.c */; }; - 0DFA5CC20B8DD3FE0020BC09 /* decsub.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C800B8DD3B60020BC09 /* decsub.c */; }; - 0DFA5CC30B8DD3FE0020BC09 /* demuxmpeg.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C810B8DD3B60020BC09 /* demuxmpeg.c */; }; - 0DFA5CC40B8DD3FE0020BC09 /* dvd.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C820B8DD3B60020BC09 /* dvd.c */; }; - 0DFA5CC50B8DD3FE0020BC09 /* encavcodec.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C830B8DD3B60020BC09 /* encavcodec.c */; }; - 0DFA5CC60B8DD3FE0020BC09 /* encfaac.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C840B8DD3B60020BC09 /* encfaac.c */; }; - 0DFA5CC70B8DD3FE0020BC09 /* enclame.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C850B8DD3B60020BC09 /* enclame.c */; }; - 0DFA5CC80B8DD3FE0020BC09 /* encvorbis.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C860B8DD3B60020BC09 /* encvorbis.c */; }; - 0DFA5CC90B8DD3FE0020BC09 /* encx264.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C870B8DD3B60020BC09 /* encx264.c */; }; - 0DFA5CCA0B8DD3FE0020BC09 /* encxvid.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C880B8DD3B60020BC09 /* encxvid.c */; }; - 0DFA5CCB0B8DD3FE0020BC09 /* fifo.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C890B8DD3B60020BC09 /* fifo.c */; }; - 0DFA5CCC0B8DD3FE0020BC09 /* hb.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C8A0B8DD3B60020BC09 /* hb.c */; }; - 0DFA5CCE0B8DD3FE0020BC09 /* muxavi.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C910B8DD3B60020BC09 /* muxavi.c */; }; - 0DFA5CCF0B8DD3FE0020BC09 /* muxcommon.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C920B8DD3B60020BC09 /* muxcommon.c */; }; - 0DFA5CD00B8DD3FE0020BC09 /* muxmp4.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C930B8DD3B60020BC09 /* muxmp4.c */; }; - 0DFA5CD10B8DD3FE0020BC09 /* muxogm.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C940B8DD3B60020BC09 /* muxogm.c */; }; - 0DFA5CD20B8DD3FE0020BC09 /* ports.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C950B8DD3B60020BC09 /* ports.c */; }; - 0DFA5CD30B8DD3FE0020BC09 /* reader.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C970B8DD3B60020BC09 /* reader.c */; }; - 0DFA5CD40B8DD3FE0020BC09 /* render.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C980B8DD3B60020BC09 /* render.c */; }; - 0DFA5CD50B8DD3FE0020BC09 /* scan.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C990B8DD3B60020BC09 /* scan.c */; }; - 0DFA5CD60B8DD3FE0020BC09 /* sync.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C9A0B8DD3B60020BC09 /* sync.c */; }; - 0DFA5CD70B8DD3FE0020BC09 /* update.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C9B0B8DD3B60020BC09 /* update.c */; }; - 0DFA5CD80B8DD3FE0020BC09 /* work.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C9C0B8DD3B60020BC09 /* work.c */; }; - 0DFA5CD90B8DD4210020BC09 /* declpcm.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C7E0B8DD3B60020BC09 /* declpcm.c */; }; - 0DFA5CDA0B8DD4210020BC09 /* decmpeg2.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C7F0B8DD3B60020BC09 /* decmpeg2.c */; }; - 0DFA5CDB0B8DD4210020BC09 /* decsub.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C800B8DD3B60020BC09 /* decsub.c */; }; - 0DFA5CDC0B8DD4210020BC09 /* demuxmpeg.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C810B8DD3B60020BC09 /* demuxmpeg.c */; }; - 0DFA5CDD0B8DD4210020BC09 /* dvd.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C820B8DD3B60020BC09 /* dvd.c */; }; - 0DFA5CDE0B8DD4210020BC09 /* encavcodec.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C830B8DD3B60020BC09 /* encavcodec.c */; }; - 0DFA5CDF0B8DD4210020BC09 /* encfaac.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C840B8DD3B60020BC09 /* encfaac.c */; }; - 0DFA5CE00B8DD4210020BC09 /* enclame.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C850B8DD3B60020BC09 /* enclame.c */; }; - 0DFA5CE10B8DD4210020BC09 /* encvorbis.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C860B8DD3B60020BC09 /* encvorbis.c */; }; - 0DFA5CE20B8DD4210020BC09 /* encx264.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C870B8DD3B60020BC09 /* encx264.c */; }; - 0DFA5CE30B8DD4210020BC09 /* encxvid.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C880B8DD3B60020BC09 /* encxvid.c */; }; - 0DFA5CE40B8DD4210020BC09 /* fifo.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C890B8DD3B60020BC09 /* fifo.c */; }; - 0DFA5CE50B8DD4210020BC09 /* hb.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C8A0B8DD3B60020BC09 /* hb.c */; }; - 0DFA5CE70B8DD4210020BC09 /* muxavi.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C910B8DD3B60020BC09 /* muxavi.c */; }; - 0DFA5CE80B8DD4210020BC09 /* muxcommon.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C920B8DD3B60020BC09 /* muxcommon.c */; }; - 0DFA5CE90B8DD4210020BC09 /* muxmp4.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C930B8DD3B60020BC09 /* muxmp4.c */; }; - 0DFA5CEA0B8DD4210020BC09 /* muxogm.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C940B8DD3B60020BC09 /* muxogm.c */; }; - 0DFA5CEB0B8DD4210020BC09 /* ports.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C950B8DD3B60020BC09 /* ports.c */; }; - 0DFA5CEC0B8DD4210020BC09 /* reader.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C970B8DD3B60020BC09 /* reader.c */; }; - 0DFA5CED0B8DD4210020BC09 /* render.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C980B8DD3B60020BC09 /* render.c */; }; - 0DFA5CEE0B8DD4210020BC09 /* scan.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C990B8DD3B60020BC09 /* scan.c */; }; - 0DFA5CEF0B8DD4210020BC09 /* sync.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C9A0B8DD3B60020BC09 /* sync.c */; }; - 0DFA5CF00B8DD4210020BC09 /* update.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C9B0B8DD3B60020BC09 /* update.c */; }; - 0DFA5CF10B8DD4210020BC09 /* work.c in Sources */ = {isa = PBXBuildFile; fileRef = 0DFA5C9C0B8DD3B60020BC09 /* work.c */; }; - 0DFF0B770B6BC72A00549488 /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = 526FBC9B0B4CAB100064E04C /* common.c */; }; - 0DFF0B790B6BC72A00549488 /* deca52.c in Sources */ = {isa = PBXBuildFile; fileRef = 526FBC9D0B4CAB100064E04C /* deca52.c */; }; - 0DFF0B7A0B6BC72A00549488 /* decavcodec.c in Sources */ = {isa = PBXBuildFile; fileRef = 526FBC9E0B4CAB100064E04C /* decavcodec.c */; }; 0DFF0C100B6BCEE800549488 /* test.c in Sources */ = {isa = PBXBuildFile; fileRef = 526FBC760B4CA8F40064E04C /* test.c */; }; 253886010BFE0A5B0064E995 /* HBOutputRedirect.h in Headers */ = {isa = PBXBuildFile; fileRef = 253885FF0BFE0A5B0064E995 /* HBOutputRedirect.h */; }; 253886020BFE0A5B0064E995 /* HBOutputRedirect.m in Sources */ = {isa = PBXBuildFile; fileRef = 253886000BFE0A5B0064E995 /* HBOutputRedirect.m */; }; @@ -71,6 +41,7 @@ 253886180BFE0C160064E995 /* HBOutputPanelController.m in Sources */ = {isa = PBXBuildFile; fileRef = 253886160BFE0C160064E995 /* HBOutputPanelController.m */; }; 25DE1FB60C169A0C00F01FC8 /* HBPreferencesController.h in Headers */ = {isa = PBXBuildFile; fileRef = 25DE1FB40C169A0C00F01FC8 /* HBPreferencesController.h */; }; 25DE1FB70C169A0C00F01FC8 /* HBPreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 25DE1FB50C169A0C00F01FC8 /* HBPreferencesController.m */; }; + 27AC71850F5A0AF600053B83 /* fakexcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27AC71840F5A0AF600053B83 /* fakexcode.cpp */; }; 4D1125D809D72FD200E0657B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D1125D709D72FD200E0657B /* libz.dylib */; }; 4DD93F8F082036E8008E1322 /* Controller.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DF3C8CB052889CD00A80101 /* Controller.h */; }; 4DD93F92082036E8008E1322 /* HBPreviewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1FD381073D19CE00E46515 /* HBPreviewController.h */; }; @@ -81,27 +52,16 @@ 4DD93FA2082036E8008E1322 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 4DD93FA3082036E8008E1322 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DEB2024052B055F00C39CA9 /* IOKit.framework */; }; 4DD93FA4082036E8008E1322 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DDE9724052B7B2B00C39CA9 /* OpenGL.framework */; }; - 5558B5690BE3BADF00E15E27 /* decdca.c in Sources */ = {isa = PBXBuildFile; fileRef = 5558B5680BE3BADF00E15E27 /* decdca.c */; }; - 5558B56A0BE3BADF00E15E27 /* decdca.c in Sources */ = {isa = PBXBuildFile; fileRef = 5558B5680BE3BADF00E15E27 /* decdca.c */; }; - 593034EB0BBA39A100172349 /* ChapterTitles.h in Headers */ = {isa = PBXBuildFile; fileRef = 593034E90BBA39A100172349 /* ChapterTitles.h */; }; - 593034EC0BBA39A100172349 /* ChapterTitles.m in Sources */ = {isa = PBXBuildFile; fileRef = 593034EA0BBA39A100172349 /* ChapterTitles.m */; }; 59CBD2370BBB44DA004A3BE3 /* parsecsv.c in Sources */ = {isa = PBXBuildFile; fileRef = 59CBD2360BBB44DA004A3BE3 /* parsecsv.c */; }; 59CBD2650BBB4D1B004A3BE3 /* ChapterTitles.m in Sources */ = {isa = PBXBuildFile; fileRef = 593034EA0BBA39A100172349 /* ChapterTitles.m */; }; - 7497010F0DC281BB009200D8 /* decomb.c in Sources */ = {isa = PBXBuildFile; fileRef = 7497010E0DC281BB009200D8 /* decomb.c */; }; - 749701100DC281BB009200D8 /* decomb.c in Sources */ = {isa = PBXBuildFile; fileRef = 7497010E0DC281BB009200D8 /* decomb.c */; }; - A20F46DC0EBB5E7A005B861B /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A20F46DB0EBB5E7A005B861B /* QuickTime.framework */; }; A20F47010EBB5EC2005B861B /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A20F47000EBB5EC2005B861B /* QTKit.framework */; }; A22C85EC0D05D35000C10E36 /* HBPresets.h in Headers */ = {isa = PBXBuildFile; fileRef = A22C85EA0D05D35000C10E36 /* HBPresets.h */; }; A22C85ED0D05D35100C10E36 /* HBPresets.m in Sources */ = {isa = PBXBuildFile; fileRef = A22C85EB0D05D35000C10E36 /* HBPresets.m */; }; - A25289E60D87A27D00461D5B /* enctheora.c in Sources */ = {isa = PBXBuildFile; fileRef = A25289E50D87A27D00461D5B /* enctheora.c */; }; - A25289E70D87A2CB00461D5B /* enctheora.c in Sources */ = {isa = PBXBuildFile; fileRef = A25289E50D87A27D00461D5B /* enctheora.c */; }; A25962E10F15077500B3BF4E /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A25962E00F15077500B3BF4E /* Quartz.framework */; }; A266019A0F2A1DC0007EA355 /* PictureFilters.xib in Resources */ = {isa = PBXBuildFile; fileRef = A26601980F2A1DC0007EA355 /* PictureFilters.xib */; }; A273E0510C57B39A00493A45 /* Pause.tiff in Resources */ = {isa = PBXBuildFile; fileRef = A273E04A0C57B39A00493A45 /* Pause.tiff */; }; A273E0520C57B39A00493A45 /* Play.tiff in Resources */ = {isa = PBXBuildFile; fileRef = A273E04B0C57B39A00493A45 /* Play.tiff */; }; A273E0530C57B39A00493A45 /* Stop.tiff in Resources */ = {isa = PBXBuildFile; fileRef = A273E04C0C57B39A00493A45 /* Stop.tiff */; }; - A273E09A0C57C1CC00493A45 /* muxmkv.c in Sources */ = {isa = PBXBuildFile; fileRef = A273E0950C57C19500493A45 /* muxmkv.c */; }; - A273E09B0C57C1CD00493A45 /* muxmkv.c in Sources */ = {isa = PBXBuildFile; fileRef = A273E0950C57C19500493A45 /* muxmkv.c */; }; A27BB4EA0EFAB9310027CDF9 /* PicturePreview.xib in Resources */ = {isa = PBXBuildFile; fileRef = A27BB4E80EFAB9310027CDF9 /* PicturePreview.xib */; }; A29E05800BE1283E000533F5 /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A29E057F0BE1283E000533F5 /* Growl.framework */; }; A29E058B0BE12889000533F5 /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = A29E057F0BE1283E000533F5 /* Growl.framework */; }; @@ -122,12 +82,8 @@ A2D7AD6F0C998AD30082CA33 /* Source.tiff in Resources */ = {isa = PBXBuildFile; fileRef = A2D7AD660C998AD30082CA33 /* Source.tiff */; }; A9AC41DF0C918DB500DDF9B8 /* HBAdvancedController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9AC41DD0C918DB500DDF9B8 /* HBAdvancedController.m */; }; A9AC41E00C918DB500DDF9B8 /* HBAdvancedController.h in Headers */ = {isa = PBXBuildFile; fileRef = A9AC41DE0C918DB500DDF9B8 /* HBAdvancedController.h */; }; - B453420A0EE3619C005D6F26 /* decmetadata.c in Sources */ = {isa = PBXBuildFile; fileRef = B45342080EE3619C005D6F26 /* decmetadata.c */; }; - B453420B0EE3619C005D6F26 /* decmetadata.c in Sources */ = {isa = PBXBuildFile; fileRef = B45342080EE3619C005D6F26 /* decmetadata.c */; }; - B48359A80C82960500E04440 /* lang.c in Sources */ = {isa = PBXBuildFile; fileRef = B48359A70C82960500E04440 /* lang.c */; }; D289A9F30DBBE7AC00CE614B /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D289A9F20DBBE7AC00CE614B /* CoreServices.framework */; }; D289AAC40DBBF3F100CE614B /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DEB2024052B055F00C39CA9 /* IOKit.framework */; }; - D4D49FED0C83355600F01215 /* lang.c in Sources */ = {isa = PBXBuildFile; fileRef = B48359A70C82960500E04440 /* lang.c */; }; E3003C7F0C88505D0072F2A8 /* DeleteHighlightPressed.png in Resources */ = {isa = PBXBuildFile; fileRef = E3003C7E0C88505D0072F2A8 /* DeleteHighlightPressed.png */; }; E3003CB50C8852B70072F2A8 /* DeletePressed.png in Resources */ = {isa = PBXBuildFile; fileRef = E3003CB40C8852B70072F2A8 /* DeletePressed.png */; }; E37167890C92F6180072B384 /* JobPassSecondSmall.png in Resources */ = {isa = PBXBuildFile; fileRef = E37167830C92F6180072B384 /* JobPassSecondSmall.png */; }; @@ -160,32 +116,29 @@ E3C844F90CA6B3F90013B683 /* Reveal.png in Resources */ = {isa = PBXBuildFile; fileRef = E3C844F50CA6B3F90013B683 /* Reveal.png */; }; E3C845870CA6E9080013B683 /* EncodeComplete.png in Resources */ = {isa = PBXBuildFile; fileRef = E3C845860CA6E9080013B683 /* EncodeComplete.png */; }; E3FC10910D1611EC00470E7B /* EncodeCanceled.png in Resources */ = {isa = PBXBuildFile; fileRef = E3FC10900D1611EC00470E7B /* EncodeCanceled.png */; }; - EAA526930C3B25D200944FF2 /* stream.c in Sources */ = {isa = PBXBuildFile; fileRef = EAA526920C3B25D200944FF2 /* stream.c */; }; - EAA526940C3B25D200944FF2 /* stream.c in Sources */ = {isa = PBXBuildFile; fileRef = EAA526920C3B25D200944FF2 /* stream.c */; }; - FC8519500C59A02C0073812C /* denoise.c in Sources */ = {isa = PBXBuildFile; fileRef = FC85194C0C59A02C0073812C /* denoise.c */; }; - FC8519510C59A02C0073812C /* deinterlace.c in Sources */ = {isa = PBXBuildFile; fileRef = FC85194D0C59A02C0073812C /* deinterlace.c */; }; - FC8519520C59A02C0073812C /* deblock.c in Sources */ = {isa = PBXBuildFile; fileRef = FC85194E0C59A02C0073812C /* deblock.c */; }; - FC8519530C59A02C0073812C /* detelecine.c in Sources */ = {isa = PBXBuildFile; fileRef = FC85194F0C59A02C0073812C /* detelecine.c */; }; - FC8519540C59A02C0073812C /* denoise.c in Sources */ = {isa = PBXBuildFile; fileRef = FC85194C0C59A02C0073812C /* denoise.c */; }; - FC8519550C59A02C0073812C /* deinterlace.c in Sources */ = {isa = PBXBuildFile; fileRef = FC85194D0C59A02C0073812C /* deinterlace.c */; }; - FC8519560C59A02C0073812C /* deblock.c in Sources */ = {isa = PBXBuildFile; fileRef = FC85194E0C59A02C0073812C /* deblock.c */; }; - FC8519570C59A02C0073812C /* detelecine.c in Sources */ = {isa = PBXBuildFile; fileRef = FC85194F0C59A02C0073812C /* detelecine.c */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 0D6E35900B6BD5FA005AABB3 /* PBXContainerItemProxy */ = { + 27ED6A910F58BEE900C905EE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 27C7D1160F58B0AF00974730; + remoteInfo = make; + }; + 27ED6AB60F58CA0A00C905EE /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; - remoteGlobalIDString = 0DFF0B710B6BC6E600549488; - remoteInfo = libmediafork; + remoteGlobalIDString = 27C7D1020F58AEC400974730; + remoteInfo = configure; }; - 0DFF0BF30B6BCCB900549488 /* PBXContainerItemProxy */ = { + 27ED6AC60F58CE8400C905EE /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; - remoteGlobalIDString = 0DFF0B710B6BC6E600549488; - remoteInfo = libmediafork; + remoteGlobalIDString = 27C7D1160F58B0AF00974730; + remoteInfo = make; }; /* End PBXContainerItemProxy section */ @@ -205,9 +158,7 @@ /* Begin PBXFileReference section */ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; - 0D096DFF0B707D1200A845D4 /* libhb.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libhb.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; 0D6E35760B6BD4F0005AABB3 /* HandBrake.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HandBrake.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 0DF377970B7BF99A00115CB0 /* fakexcode.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = fakexcode.cpp; path = ../test/fakexcode.cpp; sourceTree = SOURCE_ROOT; }; 0DFA5C7A0B8DD1E90020BC09 /* HandBrake.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = HandBrake.icns; sourceTree = ""; }; 0DFA5C7E0B8DD3B60020BC09 /* declpcm.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = declpcm.c; path = ../libhb/declpcm.c; sourceTree = SOURCE_ROOT; }; 0DFA5C7F0B8DD3B60020BC09 /* decmpeg2.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = decmpeg2.c; path = ../libhb/decmpeg2.c; sourceTree = SOURCE_ROOT; }; @@ -233,8 +184,6 @@ 0DFA5C9A0B8DD3B60020BC09 /* sync.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = sync.c; path = ../libhb/sync.c; sourceTree = SOURCE_ROOT; }; 0DFA5C9B0B8DD3B60020BC09 /* update.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = update.c; path = ../libhb/update.c; sourceTree = SOURCE_ROOT; }; 0DFA5C9C0B8DD3B60020BC09 /* work.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = work.c; path = ../libhb/work.c; sourceTree = SOURCE_ROOT; }; - 0DFA5D060B8DD9040020BC09 /* HandBrake.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = HandBrake.plist; sourceTree = ""; }; - 0DFF0B720B6BC6E600549488 /* libhb.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libhb.a; sourceTree = BUILT_PRODUCTS_DIR; }; 0DFF0C0A0B6BCEC200549488 /* HandBrakeCLI */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = HandBrakeCLI; sourceTree = BUILT_PRODUCTS_DIR; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 253885FF0BFE0A5B0064E995 /* HBOutputRedirect.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = HBOutputRedirect.h; sourceTree = ""; }; @@ -243,6 +192,7 @@ 253886160BFE0C160064E995 /* HBOutputPanelController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBOutputPanelController.m; sourceTree = ""; }; 25DE1FB40C169A0C00F01FC8 /* HBPreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBPreferencesController.h; sourceTree = ""; }; 25DE1FB50C169A0C00F01FC8 /* HBPreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBPreferencesController.m; sourceTree = ""; }; + 27AC71840F5A0AF600053B83 /* fakexcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fakexcode.cpp; path = ../test/fakexcode.cpp; sourceTree = SOURCE_ROOT; }; 29B97316FDCFA39411CA2CEA /* main.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; @@ -334,21 +284,6 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 0D096DFD0B707D1200A845D4 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0D096EA30B70884A00A845D4 /* libz.dylib in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0DFF0B700B6BC6E600549488 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 0DFF0C080B6BCEC200549488 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -368,7 +303,6 @@ 4D1125D809D72FD200E0657B /* libz.dylib in Frameworks */, A29E05800BE1283E000533F5 /* Growl.framework in Frameworks */, A2D0A0AB0D3E5929002D57CB /* Sparkle.framework in Frameworks */, - A20F46DC0EBB5E7A005B861B /* QuickTime.framework in Frameworks */, A20F47010EBB5EC2005B861B /* QTKit.framework in Frameworks */, A25962E10F15077500B3BF4E /* Quartz.framework in Frameworks */, ); @@ -380,10 +314,8 @@ 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( - 0DFF0B720B6BC6E600549488 /* libhb.a */, 0DFF0C0A0B6BCEC200549488 /* HandBrakeCLI */, 0D6E35760B6BD4F0005AABB3 /* HandBrake.app */, - 0D096DFF0B707D1200A845D4 /* libhb.dylib */, ); name = Products; sourceTree = ""; @@ -495,7 +427,7 @@ 526FBC920B4CAA120064E04C /* HandBrakeCLI Sources */ = { isa = PBXGroup; children = ( - 0DF377970B7BF99A00115CB0 /* fakexcode.cpp */, + 27AC71840F5A0AF600053B83 /* fakexcode.cpp */, 526FBC760B4CA8F40064E04C /* test.c */, 59CBD2360BBB44DA004A3BE3 /* parsecsv.c */, ); @@ -512,7 +444,6 @@ A2BEA5FA0F2A1ED1001CE7A1 /* PictureController.mm */, A22C85EA0D05D35000C10E36 /* HBPresets.h */, A22C85EB0D05D35000C10E36 /* HBPresets.m */, - 0DFA5D060B8DD9040020BC09 /* HandBrake.plist */, 4D1FD381073D19CE00E46515 /* HBPreviewController.h */, 4D1FD382073D19CE00E46515 /* HBPreviewController.mm */, 4DF3C8CB052889CD00A80101 /* Controller.h */, @@ -578,21 +509,6 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 0D096DFB0B707D1200A845D4 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0DFF0B6E0B6BC6E600549488 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 593034EB0BBA39A100172349 /* ChapterTitles.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 4DD93F8E082036E8008E1322 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -615,40 +531,6 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 0D096DFE0B707D1200A845D4 /* libhb dlib */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0D096E650B707D5800A845D4 /* Build configuration list for PBXNativeTarget "libhb dlib" */; - buildPhases = ( - 0D096DFB0B707D1200A845D4 /* Headers */, - 0D096DFC0B707D1200A845D4 /* Sources */, - 0D096DFD0B707D1200A845D4 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libhb dlib"; - productName = "libmediafork dlib"; - productReference = 0D096DFF0B707D1200A845D4 /* libhb.dylib */; - productType = "com.apple.product-type.library.dynamic"; - }; - 0DFF0B710B6BC6E600549488 /* libhb */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0DFF0B730B6BC70400549488 /* Build configuration list for PBXNativeTarget "libhb" */; - buildPhases = ( - 0DFF0B6E0B6BC6E600549488 /* Headers */, - 0DFF0B6F0B6BC6E600549488 /* Sources */, - 0DFF0B700B6BC6E600549488 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = libhb; - productName = libmediafork; - productReference = 0DFF0B720B6BC6E600549488 /* libhb.a */; - productType = "com.apple.product-type.library.static"; - }; 0DFF0C090B6BCEC200549488 /* HandBrakeCLI */ = { isa = PBXNativeTarget; buildConfigurationList = 0DFF0C0C0B6BCEE000549488 /* Build configuration list for PBXNativeTarget "HandBrakeCLI" */; @@ -659,7 +541,7 @@ buildRules = ( ); dependencies = ( - 0D6E35910B6BD5FA005AABB3 /* PBXTargetDependency */, + 27ED6A920F58BEE900C905EE /* PBXTargetDependency */, ); name = HandBrakeCLI; productName = HandBrakeCLI; @@ -679,7 +561,7 @@ buildRules = ( ); dependencies = ( - 0DFF0BF40B6BCCB900549488 /* PBXTargetDependency */, + 27ED6AC70F58CE8400C905EE /* PBXTargetDependency */, ); name = HandBrake; productName = HandBrake; @@ -692,16 +574,16 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = 4D4E7BC4087804870051572B /* Build configuration list for PBXProject "HandBrake" */; - compatibilityVersion = "Xcode 2.4"; + compatibilityVersion = "Xcode 3.1"; hasScannedForEncodings = 1; mainGroup = 29B97314FDCFA39411CA2CEA /* HandBrake */; projectDirPath = ""; projectRoot = ""; targets = ( 4DD93F8D082036E8008E1322 /* HandBrake */, - 0DFF0B710B6BC6E600549488 /* libhb */, 0DFF0C090B6BCEC200549488 /* HandBrakeCLI */, - 0D096DFE0B707D1200A845D4 /* libhb dlib */, + 27C7D1160F58B0AF00974730 /* make.libhb */, + 27C7D1020F58AEC400974730 /* configure */, ); }; /* End PBXProject section */ @@ -758,105 +640,46 @@ }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXSourcesBuildPhase section */ - 0D096DFC0B707D1200A845D4 /* Sources */ = { - isa = PBXSourcesBuildPhase; +/* Begin PBXShellScriptBuildPhase section */ + 27C7D1010F58AEC400974730 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( - A25289E70D87A2CB00461D5B /* enctheora.c in Sources */, - D4D49FED0C83355600F01215 /* lang.c in Sources */, - 0DFA5CD90B8DD4210020BC09 /* declpcm.c in Sources */, - 0DFA5CDA0B8DD4210020BC09 /* decmpeg2.c in Sources */, - 0DFA5CDB0B8DD4210020BC09 /* decsub.c in Sources */, - 0DFA5CDC0B8DD4210020BC09 /* demuxmpeg.c in Sources */, - 0DFA5CDD0B8DD4210020BC09 /* dvd.c in Sources */, - 0DFA5CDE0B8DD4210020BC09 /* encavcodec.c in Sources */, - 0DFA5CDF0B8DD4210020BC09 /* encfaac.c in Sources */, - 0DFA5CE00B8DD4210020BC09 /* enclame.c in Sources */, - 0DFA5CE10B8DD4210020BC09 /* encvorbis.c in Sources */, - 0DFA5CE20B8DD4210020BC09 /* encx264.c in Sources */, - 0DFA5CE30B8DD4210020BC09 /* encxvid.c in Sources */, - 0DFA5CE40B8DD4210020BC09 /* fifo.c in Sources */, - 0DFA5CE50B8DD4210020BC09 /* hb.c in Sources */, - 0DFA5CE70B8DD4210020BC09 /* muxavi.c in Sources */, - 0DFA5CE80B8DD4210020BC09 /* muxcommon.c in Sources */, - 0DFA5CE90B8DD4210020BC09 /* muxmp4.c in Sources */, - 0DFA5CEA0B8DD4210020BC09 /* muxogm.c in Sources */, - 0DFA5CEB0B8DD4210020BC09 /* ports.c in Sources */, - 0DFA5CEC0B8DD4210020BC09 /* reader.c in Sources */, - 0DFA5CED0B8DD4210020BC09 /* render.c in Sources */, - 0DFA5CEE0B8DD4210020BC09 /* scan.c in Sources */, - 0DFA5CEF0B8DD4210020BC09 /* sync.c in Sources */, - 0DFA5CF00B8DD4210020BC09 /* update.c in Sources */, - 0DFA5CF10B8DD4210020BC09 /* work.c in Sources */, - 0D096E010B707D3400A845D4 /* common.c in Sources */, - 0D096E020B707D3400A845D4 /* deca52.c in Sources */, - 0D096E030B707D3400A845D4 /* decavcodec.c in Sources */, - 5558B56A0BE3BADF00E15E27 /* decdca.c in Sources */, - EAA526940C3B25D200944FF2 /* stream.c in Sources */, - A273E09B0C57C1CD00493A45 /* muxmkv.c in Sources */, - FC8519540C59A02C0073812C /* denoise.c in Sources */, - FC8519550C59A02C0073812C /* deinterlace.c in Sources */, - FC8519560C59A02C0073812C /* deblock.c in Sources */, - FC8519570C59A02C0073812C /* detelecine.c in Sources */, - 749701100DC281BB009200D8 /* decomb.c in Sources */, - B453420B0EE3619C005D6F26 /* decmetadata.c in Sources */, + ); + inputPaths = ( + ); + outputPaths = ( + "$(EXTERNAL_BUILD)/GNUmakefile", ); runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\nmkdir -p $EXTERNAL_BUILD\ncd $EXTERNAL_BUILD\n\ncase \"$CONFIGURATION\" in\n *.i386)\n args=\"--arch=i386\"\n ;;\n *.x86_64)\n args=\"--arch=x86_64\"\n ;;\n *.ppc)\n args=\"--arch=ppc\"\n ;;\n *.ppc64)\n args=\"--arch=ppc64\"\n ;;\n *)\n args=\"\"\n ;;\nesac\n\nif [ -z \"$args\" ]; then\n exec $EXTERNAL_PROJECT/configure\nelse\n exec $EXTERNAL_PROJECT/configure \"$args\"\nfi"; + showEnvVarsInLog = 0; }; - 0DFF0B6F0B6BC6E600549488 /* Sources */ = { - isa = PBXSourcesBuildPhase; + 27C7D1170F58B0AF00974730 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( - 0DFA5CC00B8DD3FE0020BC09 /* declpcm.c in Sources */, - 0DFA5CC10B8DD3FE0020BC09 /* decmpeg2.c in Sources */, - 0DFA5CC20B8DD3FE0020BC09 /* decsub.c in Sources */, - 0DFA5CC30B8DD3FE0020BC09 /* demuxmpeg.c in Sources */, - 0DFA5CC40B8DD3FE0020BC09 /* dvd.c in Sources */, - 0DFA5CC50B8DD3FE0020BC09 /* encavcodec.c in Sources */, - 0DFA5CC60B8DD3FE0020BC09 /* encfaac.c in Sources */, - 0DFA5CC70B8DD3FE0020BC09 /* enclame.c in Sources */, - 0DFA5CC80B8DD3FE0020BC09 /* encvorbis.c in Sources */, - 0DFA5CC90B8DD3FE0020BC09 /* encx264.c in Sources */, - 0DFA5CCA0B8DD3FE0020BC09 /* encxvid.c in Sources */, - 0DFA5CCB0B8DD3FE0020BC09 /* fifo.c in Sources */, - 0DFA5CCC0B8DD3FE0020BC09 /* hb.c in Sources */, - 0DFA5CCE0B8DD3FE0020BC09 /* muxavi.c in Sources */, - 0DFA5CCF0B8DD3FE0020BC09 /* muxcommon.c in Sources */, - 0DFA5CD00B8DD3FE0020BC09 /* muxmp4.c in Sources */, - 0DFA5CD10B8DD3FE0020BC09 /* muxogm.c in Sources */, - 0DFA5CD20B8DD3FE0020BC09 /* ports.c in Sources */, - 0DFA5CD30B8DD3FE0020BC09 /* reader.c in Sources */, - 0DFA5CD40B8DD3FE0020BC09 /* render.c in Sources */, - 0DFA5CD50B8DD3FE0020BC09 /* scan.c in Sources */, - 0DFA5CD60B8DD3FE0020BC09 /* sync.c in Sources */, - 0DFA5CD70B8DD3FE0020BC09 /* update.c in Sources */, - 0DFA5CD80B8DD3FE0020BC09 /* work.c in Sources */, - 0DFF0B770B6BC72A00549488 /* common.c in Sources */, - 0DFF0B790B6BC72A00549488 /* deca52.c in Sources */, - 0DFF0B7A0B6BC72A00549488 /* decavcodec.c in Sources */, - 593034EC0BBA39A100172349 /* ChapterTitles.m in Sources */, - 5558B5690BE3BADF00E15E27 /* decdca.c in Sources */, - EAA526930C3B25D200944FF2 /* stream.c in Sources */, - A273E09A0C57C1CC00493A45 /* muxmkv.c in Sources */, - FC8519500C59A02C0073812C /* denoise.c in Sources */, - FC8519510C59A02C0073812C /* deinterlace.c in Sources */, - FC8519520C59A02C0073812C /* deblock.c in Sources */, - FC8519530C59A02C0073812C /* detelecine.c in Sources */, - B48359A80C82960500E04440 /* lang.c in Sources */, - A25289E60D87A27D00461D5B /* enctheora.c in Sources */, - 7497010F0DC281BB009200D8 /* decomb.c in Sources */, - B453420A0EE3619C005D6F26 /* decmetadata.c in Sources */, + ); + inputPaths = ( + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "make -C $EXTERNAL_BUILD macosx.fromxcode"; + showEnvVarsInLog = 0; }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ 0DFF0C070B6BCEC200549488 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 0DFF0C100B6BCEE800549488 /* test.c in Sources */, - 0DF377980B7BF99A00115CB0 /* fakexcode.cpp in Sources */, 59CBD2370BBB44DA004A3BE3 /* parsecsv.c in Sources */, + 27AC71850F5A0AF600053B83 /* fakexcode.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -884,15 +707,20 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 0D6E35910B6BD5FA005AABB3 /* PBXTargetDependency */ = { + 27ED6A920F58BEE900C905EE /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 0DFF0B710B6BC6E600549488 /* libhb */; - targetProxy = 0D6E35900B6BD5FA005AABB3 /* PBXContainerItemProxy */; + target = 27C7D1160F58B0AF00974730 /* make.libhb */; + targetProxy = 27ED6A910F58BEE900C905EE /* PBXContainerItemProxy */; }; - 0DFF0BF40B6BCCB900549488 /* PBXTargetDependency */ = { + 27ED6AB70F58CA0A00C905EE /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 0DFF0B710B6BC6E600549488 /* libhb */; - targetProxy = 0DFF0BF30B6BCCB900549488 /* PBXContainerItemProxy */; + target = 27C7D1020F58AEC400974730 /* configure */; + targetProxy = 27ED6AB60F58CA0A00C905EE /* PBXContainerItemProxy */; + }; + 27ED6AC70F58CE8400C905EE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 27C7D1160F58B0AF00974730 /* make.libhb */; + targetProxy = 27ED6AC60F58CE8400C905EE /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -972,220 +800,193 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 0D096E660B707D5800A845D4 /* Development */ = { + 0DFF0C0D0B6BCEE000549488 /* debug */ = { isa = XCBuildConfiguration; buildSettings = { - CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/../libhb"; - COPY_PHASE_STRIP = NO; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - EXECUTABLE_PREFIX = lib; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_INLINES_ARE_PRIVATE_EXTERN = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = s; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../contrib/include"; - INSTALL_PATH = /usr/local/lib; - LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.5; - OTHER_CFLAGS = ( - "-D__LIBHB__", - "-DSYS_DARWIN", - "-DUSE_PTHREAD", + INSTALL_PATH = /usr/local/bin; + OTHER_LDFLAGS = ( + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", + "-lbz2", + "-lz", ); + PRODUCT_NAME = HandBrakeCLI; + }; + name = debug; + }; + 0DFF0C0E0B6BCEE000549488 /* standard */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/local/bin; OTHER_LDFLAGS = ( - ../contrib/lib/libmp4v2.a, - ../contrib/lib/liba52.a, - ../contrib/lib/libavformat.a, - ../contrib/lib/libavcodec.a, - ../contrib/lib/libavutil.a, - ../contrib/lib/libdvdread.a, - ../contrib/lib/libfaac.a, - ../contrib/lib/libmp3lame.a, - ../contrib/lib/libmpeg2.a, - ../contrib/lib/libvorbis.a, - ../contrib/lib/libvorbisenc.a, - ../contrib/lib/libogg.a, - ../contrib/lib/libsamplerate.a, - ../contrib/lib/libx264.a, - ../contrib/lib/libxvidcore.a, - ../contrib/lib/libdca.a, - ../contrib/lib/libmkv.a, - ../contrib/lib/libtheora.a, - ../contrib/lib/libswscale.a, - ../contrib/lib/libfaad.a, + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", "-lbz2", - "-ldl", - "-flat_namespace", - "-read_only_relocs", - suppress, + "-lz", ); - PER_ARCH_CFLAGS_ppc = "-DWORDS_BIGENDIAN"; - PREBINDING = NO; - PRODUCT_NAME = hb; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; - SEPARATE_STRIP = YES; + PRODUCT_NAME = HandBrakeCLI; + }; + name = standard; + }; + 27C7D1030F58AEC500974730 /* debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + PRODUCT_NAME = configure; + }; + name = debug; + }; + 27C7D1040F58AEC500974730 /* standard */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = configure; ZERO_LINK = NO; }; - name = Development; + name = standard; + }; + 27C7D1190F58B0AF00974730 /* debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + PRODUCT_NAME = configure; + }; + name = debug; }; - 0D096E670B707D5800A845D4 /* Deployment */ = { + 27C7D11A0F58B0AF00974730 /* standard */ = { isa = XCBuildConfiguration; buildSettings = { - CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/../libhb"; COPY_PHASE_STRIP = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - EXECUTABLE_PREFIX = lib; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = configure; + ZERO_LINK = NO; + }; + name = standard; + }; + 27ED6ADB0F58D7F100C905EE /* standard.i386 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = i386; + CONFIGURATION_BUILD_DIR = "$(EXTERNAL_BUILD)"; + CONFIGURATION_TEMP_DIR = "$(SYMROOT)"; + EXTERNAL_BUILD = "$(EXTERNAL_PROJECT)/build.$(CONFIGURATION)"; + EXTERNAL_PROJECT = ..; + GCC_DYNAMIC_NO_PIC = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = s; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../contrib/include"; - INSTALL_PATH = /usr/local/lib; - LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.5; - OTHER_CFLAGS = ( - "-D__LIBHB__", - "-DSYS_DARWIN", - "-DUSE_PTHREAD", - ); - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - OTHER_LDFLAGS = ( - ../contrib/lib/libmp4v2.a, - ../contrib/lib/liba52.a, - ../contrib/lib/libavformat.a, - ../contrib/lib/libavcodec.a, - ../contrib/lib/libavutil.a, - ../contrib/lib/libdvdread.a, - ../contrib/lib/libfaac.a, - ../contrib/lib/libmp3lame.a, - ../contrib/lib/libmpeg2.a, - ../contrib/lib/libvorbis.a, - ../contrib/lib/libvorbisenc.a, - ../contrib/lib/libogg.a, - ../contrib/lib/libsamplerate.a, - ../contrib/lib/libx264.a, - ../contrib/lib/libxvidcore.a, - ../contrib/lib/libdca.a, - ../contrib/lib/libmkv.a, - ../contrib/lib/libtheora.a, - ../contrib/lib/libswscale.a, - ../contrib/lib/libfaad.a, - "-lbz2", - "-ldl", - "-flat_namespace", - "-read_only_relocs", - suppress, - ); - PER_ARCH_CFLAGS_ppc = "-DWORDS_BIGENDIAN"; + HEADER_SEARCH_PATHS = "$(EXTERNAL_BUILD)/libhb"; + OBJROOT = "$(EXTERNAL_BUILD)/macosx"; PREBINDING = NO; - PRODUCT_NAME = hb; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; - SEPARATE_STRIP = YES; + SDKROOT = macosx10.5; + SHARED_PRECOMPS_DIR = "$(SYMROOT)/cache"; + SYMROOT = "$(EXTERNAL_BUILD)/macosx"; + }; + name = standard.i386; + }; + 27ED6ADC0F58D7F100C905EE /* standard.i386 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = configure; ZERO_LINK = NO; }; - name = Deployment; + name = standard.i386; }; - 0D096E690B707D5800A845D4 /* UB */ = { + 27ED6ADD0F58D7F100C905EE /* standard.i386 */ = { isa = XCBuildConfiguration; buildSettings = { - CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/../libhb"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - EXECUTABLE_PREFIX = lib; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_INLINES_ARE_PRIVATE_EXTERN = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = s; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../contrib/include"; - INSTALL_PATH = /usr/local/lib; - LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.5; - OTHER_CFLAGS = ( - "-D__LIBHB__", - "-DSYS_DARWIN", - "-DUSE_PTHREAD", - ); - OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; - OTHER_LDFLAGS = ( - ../contrib/lib/libmp4v2.a, - ../contrib/lib/liba52.a, - ../contrib/lib/libavformat.a, - ../contrib/lib/libavcodec.a, - ../contrib/lib/libavutil.a, - ../contrib/lib/libdvdread.a, - ../contrib/lib/libfaac.a, - ../contrib/lib/libmp3lame.a, - ../contrib/lib/libmpeg2.a, - ../contrib/lib/libvorbis.a, - ../contrib/lib/libvorbisenc.a, - ../contrib/lib/libogg.a, - ../contrib/lib/libsamplerate.a, - ../contrib/lib/libx264.a, - ../contrib/lib/libxvidcore.a, - ../contrib/lib/libdca.a, - ../contrib/lib/libmkv.a, - ../contrib/lib/libtheora.a, - ../contrib/lib/libswscale.a, - ../contrib/lib/libfaad.a, - "-lbz2", - "-ldl", - "-flat_namespace", - "-read_only_relocs", - suppress, - ); - PER_ARCH_CFLAGS_ppc = "-DWORDS_BIGENDIAN"; - PREBINDING = NO; - PRODUCT_NAME = hb; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; - SEPARATE_STRIP = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = configure; ZERO_LINK = NO; }; - name = UB; + name = standard.i386; }; - 0D88F56B0B6CDCD400F81F26 /* UB */ = { + 27ED6ADE0F58D7F100C905EE /* standard.i386 */ = { isa = XCBuildConfiguration; buildSettings = { - CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/../libhb"; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = s; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../contrib/include"; - INSTALL_PATH = /usr/local/lib; - MACOSX_DEPLOYMENT_TARGET = 10.3; - OTHER_CFLAGS = ( - "-D__LIBHB__", - "-DSYS_DARWIN", - "-DUSE_PTHREAD", + INSTALL_PATH = /usr/local/bin; + OTHER_LDFLAGS = ( + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", + "-lbz2", + "-lz", ); - OTHER_LDFLAGS = ""; - PER_ARCH_CFLAGS_ppc = "-DWORDS_BIGENDIAN"; - PREBINDING = NO; - PRODUCT_NAME = hb; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; - ZERO_LINK = NO; + PRODUCT_NAME = HandBrakeCLI; }; - name = UB; + name = standard.i386; }; - 0D88F56C0B6CDCD400F81F26 /* UB */ = { + 27ED6ADF0F58D7F100C905EE /* standard.i386 */ = { isa = XCBuildConfiguration; buildSettings = { APPCAST_URL = ""; - CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/.."; - CURRENT_PROJECT_VERSION = ""; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -1193,45 +994,38 @@ ); FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)\""; FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SRCROOT)\""; - GCC_OPTIMIZATION_LEVEL = s; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - HEADER_SEARCH_PATHS = ( - ../libhb, - ../contrib/include, - ); IBC_PLUGINS = /System/Library/Frameworks/QTKit.framework/Resources/QTKitIBPlugin.ibplugin; IBC_PLUGIN_SEARCH_PATHS = /System/Library/Frameworks/QTKit.framework/Resources; - INFOPLIST_FILE = HandBrake.plist; - LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.5; - OTHER_CFLAGS = ""; + INFOPLIST_FILE = Info.plist; + INFOPLIST_OTHER_PREPROCESSOR_FLAGS = "-traditional"; + INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h"; + INFOPLIST_PREPROCESS = YES; OTHER_LDFLAGS = ( - ../libhb/libhb.a, - ../contrib/lib/libmp4v2.a, - ../contrib/lib/liba52.a, - ../contrib/lib/libavformat.a, - ../contrib/lib/libavcodec.a, - ../contrib/lib/libavutil.a, - ../contrib/lib/libdvdread.a, - ../contrib/lib/libfaac.a, - ../contrib/lib/libmp3lame.a, - ../contrib/lib/libmpeg2.a, - ../contrib/lib/libvorbis.a, - ../contrib/lib/libvorbisenc.a, - ../contrib/lib/libogg.a, - ../contrib/lib/libsamplerate.a, - ../contrib/lib/libx264.a, - ../contrib/lib/libxvidcore.a, - ../contrib/lib/libdca.a, - ../contrib/lib/libmkv.a, - ../contrib/lib/libswscale.a, - ../contrib/lib/libtheora.a, - ../contrib/lib/libfaad.a, + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", "-lbz2", + "-lz", ); PRODUCT_NAME = HandBrake; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; - SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", @@ -1239,222 +1033,393 @@ ); WRAPPER_EXTENSION = app; }; - name = UB; + name = standard.i386; }; - 0D88F56E0B6CDCD400F81F26 /* UB */ = { + 27ED6AE30F58D8F200C905EE /* standard.ppc */ = { isa = XCBuildConfiguration; buildSettings = { - CONFIGURATION_BUILD_DIR = ..; - GCC_ENABLE_FIX_AND_CONTINUE = YES; + ARCHS = ppc; + CONFIGURATION_BUILD_DIR = "$(EXTERNAL_BUILD)"; + CONFIGURATION_TEMP_DIR = "$(SYMROOT)"; + EXTERNAL_BUILD = "$(EXTERNAL_PROJECT)/build.$(CONFIGURATION)"; + EXTERNAL_PROJECT = ..; + GCC_DYNAMIC_NO_PIC = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = s; - HEADER_SEARCH_PATHS = ../libhb; + HEADER_SEARCH_PATHS = "$(EXTERNAL_BUILD)/libhb"; + OBJROOT = "$(EXTERNAL_BUILD)/macosx"; + PREBINDING = NO; + SDKROOT = macosx10.5; + SHARED_PRECOMPS_DIR = "$(SYMROOT)/cache"; + SYMROOT = "$(EXTERNAL_BUILD)/macosx"; + }; + name = standard.ppc; + }; + 27ED6AE40F58D8F200C905EE /* standard.ppc */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = configure; + ZERO_LINK = NO; + }; + name = standard.ppc; + }; + 27ED6AE50F58D8F200C905EE /* standard.ppc */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = configure; + ZERO_LINK = NO; + }; + name = standard.ppc; + }; + 27ED6AE60F58D8F200C905EE /* standard.ppc */ = { + isa = XCBuildConfiguration; + buildSettings = { INSTALL_PATH = /usr/local/bin; - LIBRARY_SEARCH_PATHS = ""; - OTHER_CFLAGS = ""; OTHER_LDFLAGS = ( - ../libhb/libhb.a, - ../contrib/lib/libmp4v2.a, - ../contrib/lib/liba52.a, - ../contrib/lib/libavformat.a, - ../contrib/lib/libavcodec.a, - ../contrib/lib/libavutil.a, - ../contrib/lib/libdvdread.a, - ../contrib/lib/libfaac.a, - ../contrib/lib/libmp3lame.a, - ../contrib/lib/libmpeg2.a, - ../contrib/lib/libvorbis.a, - ../contrib/lib/libvorbisenc.a, - ../contrib/lib/libogg.a, - ../contrib/lib/libsamplerate.a, - ../contrib/lib/libx264.a, - ../contrib/lib/libxvidcore.a, - "-lz", - ../contrib/lib/libdca.a, - ../contrib/lib/libmkv.a, - ../contrib/lib/libswscale.a, - ../contrib/lib/libtheora.a, - ../contrib/lib/libfaad.a, + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", "-lbz2", + "-lz", ); - PREBINDING = NO; PRODUCT_NAME = HandBrakeCLI; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; - ZERO_LINK = NO; }; - name = UB; + name = standard.ppc; }; - 0D88F56F0B6CDCD400F81F26 /* UB */ = { + 27ED6AE70F58D8F200C905EE /* standard.ppc */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - ppc, - i386, + APPCAST_URL = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", ); - GCC_MODEL_TUNING = G5; - GCC_PREPROCESSOR_DEFINITIONS = "JOB_GROUPS=1"; - IBC_NOTICES = NO; - MACOSX_DEPLOYMENT_TARGET = 10.5; - OTHER_CFLAGS = ""; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; + FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)\""; + FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SRCROOT)\""; + IBC_PLUGINS = /System/Library/Frameworks/QTKit.framework/Resources/QTKitIBPlugin.ibplugin; + IBC_PLUGIN_SEARCH_PATHS = /System/Library/Frameworks/QTKit.framework/Resources; + INFOPLIST_FILE = Info.plist; + INFOPLIST_OTHER_PREPROCESSOR_FLAGS = "-traditional"; + INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h"; + INFOPLIST_PREPROCESS = YES; + OTHER_LDFLAGS = ( + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", + "-lbz2", + "-lz", + ); + PRODUCT_NAME = HandBrake; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = app; }; - name = UB; + name = standard.ppc; }; - 0DFF0B740B6BC70400549488 /* Development */ = { + 27ED6AFF0F58DE7400C905EE /* standard.x86_64 */ = { isa = XCBuildConfiguration; buildSettings = { - CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/../libhb"; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + ARCHS = x86_64; + CONFIGURATION_BUILD_DIR = "$(EXTERNAL_BUILD)"; + CONFIGURATION_TEMP_DIR = "$(SYMROOT)"; + EXTERNAL_BUILD = "$(EXTERNAL_PROJECT)/build.$(CONFIGURATION)"; + EXTERNAL_PROJECT = ..; + GCC_DYNAMIC_NO_PIC = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../contrib/include"; - INSTALL_PATH = /usr/local/lib; - MACOSX_DEPLOYMENT_TARGET = 10.3; - OTHER_CFLAGS = ( - "-D__LIBHB__", - "-DSYS_DARWIN", - "-DUSE_PTHREAD", - ); - OTHER_LDFLAGS = ""; - PER_ARCH_CFLAGS_ppc = "-DWORDS_BIGENDIAN"; + HEADER_SEARCH_PATHS = "$(EXTERNAL_BUILD)/libhb"; + OBJROOT = "$(EXTERNAL_BUILD)/macosx"; PREBINDING = NO; - PRODUCT_NAME = hb; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; + SDKROOT = macosx10.5; + SHARED_PRECOMPS_DIR = "$(SYMROOT)/cache"; + SYMROOT = "$(EXTERNAL_BUILD)/macosx"; + }; + name = standard.x86_64; + }; + 27ED6B000F58DE7400C905EE /* standard.x86_64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = configure; ZERO_LINK = NO; }; - name = Development; + name = standard.x86_64; }; - 0DFF0B750B6BC70400549488 /* Deployment */ = { + 27ED6B010F58DE7400C905EE /* standard.x86_64 */ = { isa = XCBuildConfiguration; buildSettings = { - CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/../libhb"; COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_FIX_AND_CONTINUE = NO; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 3; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = ""; - HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../contrib/include"; - INSTALL_PATH = /usr/local/lib; - MACOSX_DEPLOYMENT_TARGET = 10.3; - OTHER_CFLAGS = ( - "-D__LIBHB__", - "-DSYS_DARWIN", - "-DUSE_PTHREAD", - ); - OTHER_LDFLAGS = ""; - PER_ARCH_CFLAGS_ppc = "-DWORDS_BIGENDIAN"; - PREBINDING = NO; - PRODUCT_NAME = hb; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; + PRODUCT_NAME = configure; ZERO_LINK = NO; }; - name = Deployment; + name = standard.x86_64; }; - 0DFF0C0D0B6BCEE000549488 /* Development */ = { + 27ED6B020F58DE7400C905EE /* standard.x86_64 */ = { isa = XCBuildConfiguration; buildSettings = { - CONFIGURATION_BUILD_DIR = ..; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = s; - HEADER_SEARCH_PATHS = ../libhb; INSTALL_PATH = /usr/local/bin; - LIBRARY_SEARCH_PATHS = ""; - OTHER_CFLAGS = ""; OTHER_LDFLAGS = ( - ../libhb/libhb.a, - ../contrib/lib/libmp4v2.a, - ../contrib/lib/liba52.a, - ../contrib/lib/libavformat.a, - ../contrib/lib/libavcodec.a, - ../contrib/lib/libavutil.a, - ../contrib/lib/libdvdread.a, - ../contrib/lib/libfaac.a, - ../contrib/lib/libmp3lame.a, - ../contrib/lib/libmpeg2.a, - ../contrib/lib/libvorbis.a, - ../contrib/lib/libvorbisenc.a, - ../contrib/lib/libogg.a, - ../contrib/lib/libsamplerate.a, - ../contrib/lib/libx264.a, - ../contrib/lib/libxvidcore.a, + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", + "-lbz2", "-lz", - ../contrib/lib/libdca.a, - ../contrib/lib/libmkv.a, - ../contrib/lib/libswscale.a, - ../contrib/lib/libtheora.a, - ../contrib/lib/libfaad.a, + ); + PRODUCT_NAME = HandBrakeCLI; + }; + name = standard.x86_64; + }; + 27ED6B030F58DE7400C905EE /* standard.x86_64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPCAST_URL = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", + ); + FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)\""; + FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SRCROOT)\""; + IBC_PLUGINS = /System/Library/Frameworks/QTKit.framework/Resources/QTKitIBPlugin.ibplugin; + IBC_PLUGIN_SEARCH_PATHS = /System/Library/Frameworks/QTKit.framework/Resources; + INFOPLIST_FILE = Info.plist; + INFOPLIST_OTHER_PREPROCESSOR_FLAGS = "-traditional"; + INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h"; + INFOPLIST_PREPROCESS = YES; + OTHER_LDFLAGS = ( + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", "-lbz2", + "-lz", ); + PRODUCT_NAME = HandBrake; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = app; + }; + name = standard.x86_64; + }; + 27ED6B040F58DE7600C905EE /* standard.ppc64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ppc64; + CONFIGURATION_BUILD_DIR = "$(EXTERNAL_BUILD)"; + CONFIGURATION_TEMP_DIR = "$(SYMROOT)"; + EXTERNAL_BUILD = "$(EXTERNAL_PROJECT)/build.$(CONFIGURATION)"; + EXTERNAL_PROJECT = ..; + GCC_DYNAMIC_NO_PIC = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + HEADER_SEARCH_PATHS = "$(EXTERNAL_BUILD)/libhb"; + OBJROOT = "$(EXTERNAL_BUILD)/macosx"; PREBINDING = NO; - PRODUCT_NAME = HandBrakeCLI; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; + SDKROOT = macosx10.5; + SHARED_PRECOMPS_DIR = "$(SYMROOT)/cache"; + SYMROOT = "$(EXTERNAL_BUILD)/macosx"; + }; + name = standard.ppc64; + }; + 27ED6B050F58DE7600C905EE /* standard.ppc64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = configure; ZERO_LINK = NO; }; - name = Development; + name = standard.ppc64; }; - 0DFF0C0E0B6BCEE000549488 /* Deployment */ = { + 27ED6B060F58DE7600C905EE /* standard.ppc64 */ = { isa = XCBuildConfiguration; buildSettings = { - CONFIGURATION_BUILD_DIR = ..; COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_FIX_AND_CONTINUE = NO; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = s; - HEADER_SEARCH_PATHS = ../libhb; + PRODUCT_NAME = configure; + ZERO_LINK = NO; + }; + name = standard.ppc64; + }; + 27ED6B070F58DE7600C905EE /* standard.ppc64 */ = { + isa = XCBuildConfiguration; + buildSettings = { INSTALL_PATH = /usr/local/bin; - LIBRARY_SEARCH_PATHS = ""; - OTHER_CFLAGS = ""; OTHER_LDFLAGS = ( - ../libhb/libhb.a, - ../contrib/lib/libmp4v2.a, - ../contrib/lib/liba52.a, - ../contrib/lib/libavformat.a, - ../contrib/lib/libavcodec.a, - ../contrib/lib/libavutil.a, - ../contrib/lib/libdvdread.a, - ../contrib/lib/libfaac.a, - ../contrib/lib/libmp3lame.a, - ../contrib/lib/libmpeg2.a, - ../contrib/lib/libvorbis.a, - ../contrib/lib/libvorbisenc.a, - ../contrib/lib/libogg.a, - ../contrib/lib/libsamplerate.a, - ../contrib/lib/libx264.a, - ../contrib/lib/libxvidcore.a, - "-lz", - ../contrib/lib/libdca.a, - ../contrib/lib/libmkv.a, - ../contrib/lib/libswscale.a, - ../contrib/lib/libtheora.a, - ../contrib/lib/libfaad.a, + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", "-lbz2", + "-lz", ); - PREBINDING = NO; PRODUCT_NAME = HandBrakeCLI; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; - ZERO_LINK = NO; }; - name = Deployment; + name = standard.ppc64; }; - 4D4E7BC1087804870051572B /* Development */ = { + 27ED6B080F58DE7600C905EE /* standard.ppc64 */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPCAST_URL = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", + ); + FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)\""; + FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SRCROOT)\""; + IBC_PLUGINS = /System/Library/Frameworks/QTKit.framework/Resources/QTKitIBPlugin.ibplugin; + IBC_PLUGIN_SEARCH_PATHS = /System/Library/Frameworks/QTKit.framework/Resources; + INFOPLIST_FILE = Info.plist; + INFOPLIST_OTHER_PREPROCESSOR_FLAGS = "-traditional"; + INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h"; + INFOPLIST_PREPROCESS = YES; + OTHER_LDFLAGS = ( + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", + "-lbz2", + "-lz", + ); + PRODUCT_NAME = HandBrake; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = app; + }; + name = standard.ppc64; + }; + 4D4E7BC1087804870051572B /* debug */ = { isa = XCBuildConfiguration; buildSettings = { APPCAST_URL = ""; - CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/.."; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = ""; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -1463,65 +1428,51 @@ FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)\""; FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SRCROOT)\""; FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\""; - GCC_DYNAMIC_NO_PIC = YES; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - HEADER_SEARCH_PATHS = ( - ../libhb, - ../contrib/include, - ); IBC_PLUGINS = /System/Library/Frameworks/QTKit.framework/Resources/QTKitIBPlugin.ibplugin; IBC_PLUGIN_SEARCH_PATHS = /System/Library/Frameworks/QTKit.framework/Resources; - INFOPLIST_FILE = HandBrake.plist; - INFOPLIST_PREPROCESS = NO; - LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.5; - OTHER_CFLAGS = ""; + INFOPLIST_FILE = Info.plist; + INFOPLIST_OTHER_PREPROCESSOR_FLAGS = "-traditional"; + INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h"; + INFOPLIST_PREPROCESS = YES; OTHER_LDFLAGS = ( - ../libhb/libhb.a, - ../contrib/lib/libmp4v2.a, - ../contrib/lib/liba52.a, - ../contrib/lib/libavformat.a, - ../contrib/lib/libavcodec.a, - ../contrib/lib/libavutil.a, - ../contrib/lib/libdvdread.a, - ../contrib/lib/libfaac.a, - ../contrib/lib/libmp3lame.a, - ../contrib/lib/libmpeg2.a, - ../contrib/lib/libvorbis.a, - ../contrib/lib/libvorbisenc.a, - ../contrib/lib/libogg.a, - ../contrib/lib/libsamplerate.a, - ../contrib/lib/libx264.a, - ../contrib/lib/libxvidcore.a, - ../contrib/lib/libdca.a, - ../contrib/lib/libmkv.a, - ../contrib/lib/libswscale.a, - ../contrib/lib/libtheora.a, - ../contrib/lib/libfaad.a, + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", "-lbz2", + "-lz", ); PRODUCT_NAME = HandBrake; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; - SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = app; - ZERO_LINK = NO; }; - name = Development; + name = debug; }; - 4D4E7BC2087804870051572B /* Deployment */ = { + 4D4E7BC2087804870051572B /* standard */ = { isa = XCBuildConfiguration; buildSettings = { APPCAST_URL = ""; - CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/.."; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = ""; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -1529,138 +1480,155 @@ ); FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)\""; FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SRCROOT)\""; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - GCC_OPTIMIZATION_LEVEL = s; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - HEADER_SEARCH_PATHS = ( - ../libhb, - ../contrib/include, - ); IBC_PLUGINS = /System/Library/Frameworks/QTKit.framework/Resources/QTKitIBPlugin.ibplugin; IBC_PLUGIN_SEARCH_PATHS = /System/Library/Frameworks/QTKit.framework/Resources; - INFOPLIST_FILE = HandBrake.plist; - LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.5; - OTHER_CFLAGS = ""; + INFOPLIST_FILE = Info.plist; + INFOPLIST_OTHER_PREPROCESSOR_FLAGS = "-traditional"; + INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h"; + INFOPLIST_PREPROCESS = YES; OTHER_LDFLAGS = ( - ../libhb/libhb.a, - ../contrib/lib/libmp4v2.a, - ../contrib/lib/liba52.a, - ../contrib/lib/libavformat.a, - ../contrib/lib/libavcodec.a, - ../contrib/lib/libavutil.a, - ../contrib/lib/libdvdread.a, - ../contrib/lib/libfaac.a, - ../contrib/lib/libmp3lame.a, - ../contrib/lib/libmpeg2.a, - ../contrib/lib/libvorbis.a, - ../contrib/lib/libvorbisenc.a, - ../contrib/lib/libogg.a, - ../contrib/lib/libsamplerate.a, - ../contrib/lib/libx264.a, - ../contrib/lib/libxvidcore.a, - ../contrib/lib/libdca.a, - ../contrib/lib/libmkv.a, - ../contrib/lib/libswscale.a, - ../contrib/lib/libtheora.a, - ../contrib/lib/libfaad.a, + "$(EXTERNAL_BUILD)/libhb/libhb.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a", + "$(EXTERNAL_BUILD)/contrib/lib/liba52.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a", + "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmpeg2.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a", + "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a", + "$(EXTERNAL_BUILD)/contrib/lib/libogg.a", + "$(EXTERNAL_BUILD)/contrib/lib/libsamplerate.a", + "$(EXTERNAL_BUILD)/contrib/lib/libx264.a", + "$(EXTERNAL_BUILD)/contrib/lib/libxvidcore.a", + "$(EXTERNAL_BUILD)/contrib/lib/libdca.a", + "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a", + "$(EXTERNAL_BUILD)/contrib/lib/libswscale.a", + "$(EXTERNAL_BUILD)/contrib/lib/libtheora.a", + "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a", "-lbz2", + "-lz", ); PRODUCT_NAME = HandBrake; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; - SECTORDER_FLAGS = ""; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", "-Wno-unknown-pragmas", ); WRAPPER_EXTENSION = app; - ZERO_LINK = NO; }; - name = Deployment; + name = standard; }; - 4D4E7BC5087804870051572B /* Development */ = { + 4D4E7BC5087804870051572B /* debug */ = { isa = XCBuildConfiguration; buildSettings = { + CONFIGURATION_BUILD_DIR = "$(EXTERNAL_BUILD)"; + CONFIGURATION_TEMP_DIR = "$(SYMROOT)"; + COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; - GCC_DEBUGGING_SYMBOLS = default; + EXTERNAL_BUILD = "$(EXTERNAL_PROJECT)/build.$(CONFIGURATION)"; + EXTERNAL_PROJECT = ..; + GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; - IBC_NOTICES = NO; - IBC_WARNINGS = YES; - MACOSX_DEPLOYMENT_TARGET = 10.5; - OTHER_CFLAGS = ""; + HEADER_SEARCH_PATHS = "$(EXTERNAL_BUILD)/libhb"; + OBJROOT = "$(EXTERNAL_BUILD)/macosx"; PREBINDING = NO; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; - ZERO_LINK = NO; + SDKROOT = macosx10.5; + SHARED_PRECOMPS_DIR = "$(SYMROOT)/cache"; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "$(EXTERNAL_BUILD)/macosx"; }; - name = Development; + name = debug; }; - 4D4E7BC6087804870051572B /* Deployment */ = { + 4D4E7BC6087804870051572B /* standard */ = { isa = XCBuildConfiguration; buildSettings = { + CONFIGURATION_BUILD_DIR = "$(EXTERNAL_BUILD)"; + CONFIGURATION_TEMP_DIR = "$(SYMROOT)"; + EXTERNAL_BUILD = "$(EXTERNAL_PROJECT)/build.$(CONFIGURATION)"; + EXTERNAL_PROJECT = ..; + GCC_DYNAMIC_NO_PIC = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; - GCC_PREPROCESSOR_DEFINITIONS = "JOB_GROUPS=1"; - IBC_NOTICES = NO; - MACOSX_DEPLOYMENT_TARGET = 10.5; - OTHER_CFLAGS = ""; - SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; + HEADER_SEARCH_PATHS = "$(EXTERNAL_BUILD)/libhb"; + OBJROOT = "$(EXTERNAL_BUILD)/macosx"; + PREBINDING = NO; + SDKROOT = macosx10.5; + SHARED_PRECOMPS_DIR = "$(SYMROOT)/cache"; + SYMROOT = "$(EXTERNAL_BUILD)/macosx"; }; - name = Deployment; + name = standard; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 0D096E650B707D5800A845D4 /* Build configuration list for PBXNativeTarget "libhb dlib" */ = { + 0DFF0C0C0B6BCEE000549488 /* Build configuration list for PBXNativeTarget "HandBrakeCLI" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0D096E660B707D5800A845D4 /* Development */, - 0D096E670B707D5800A845D4 /* Deployment */, - 0D096E690B707D5800A845D4 /* UB */, + 0DFF0C0E0B6BCEE000549488 /* standard */, + 0DFF0C0D0B6BCEE000549488 /* debug */, + 27ED6ADE0F58D7F100C905EE /* standard.i386 */, + 27ED6B020F58DE7400C905EE /* standard.x86_64 */, + 27ED6AE60F58D8F200C905EE /* standard.ppc */, + 27ED6B070F58DE7600C905EE /* standard.ppc64 */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Deployment; + defaultConfigurationName = standard; }; - 0DFF0B730B6BC70400549488 /* Build configuration list for PBXNativeTarget "libhb" */ = { + 27C7D1050F58AEE300974730 /* Build configuration list for PBXAggregateTarget "configure" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0DFF0B740B6BC70400549488 /* Development */, - 0DFF0B750B6BC70400549488 /* Deployment */, - 0D88F56B0B6CDCD400F81F26 /* UB */, + 27C7D1040F58AEC500974730 /* standard */, + 27C7D1030F58AEC500974730 /* debug */, + 27ED6ADC0F58D7F100C905EE /* standard.i386 */, + 27ED6B000F58DE7400C905EE /* standard.x86_64 */, + 27ED6AE40F58D8F200C905EE /* standard.ppc */, + 27ED6B050F58DE7600C905EE /* standard.ppc64 */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Deployment; + defaultConfigurationName = standard; }; - 0DFF0C0C0B6BCEE000549488 /* Build configuration list for PBXNativeTarget "HandBrakeCLI" */ = { + 27C7D1180F58B0AF00974730 /* Build configuration list for PBXAggregateTarget "make.libhb" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0DFF0C0D0B6BCEE000549488 /* Development */, - 0DFF0C0E0B6BCEE000549488 /* Deployment */, - 0D88F56E0B6CDCD400F81F26 /* UB */, + 27C7D11A0F58B0AF00974730 /* standard */, + 27C7D1190F58B0AF00974730 /* debug */, + 27ED6ADD0F58D7F100C905EE /* standard.i386 */, + 27ED6B010F58DE7400C905EE /* standard.x86_64 */, + 27ED6AE50F58D8F200C905EE /* standard.ppc */, + 27ED6B060F58DE7600C905EE /* standard.ppc64 */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Deployment; + defaultConfigurationName = standard; }; 4D4E7BC0087804870051572B /* Build configuration list for PBXNativeTarget "HandBrake" */ = { isa = XCConfigurationList; buildConfigurations = ( - 4D4E7BC1087804870051572B /* Development */, - 4D4E7BC2087804870051572B /* Deployment */, - 0D88F56C0B6CDCD400F81F26 /* UB */, + 4D4E7BC2087804870051572B /* standard */, + 4D4E7BC1087804870051572B /* debug */, + 27ED6ADF0F58D7F100C905EE /* standard.i386 */, + 27ED6B030F58DE7400C905EE /* standard.x86_64 */, + 27ED6AE70F58D8F200C905EE /* standard.ppc */, + 27ED6B080F58DE7600C905EE /* standard.ppc64 */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Deployment; + defaultConfigurationName = standard; }; 4D4E7BC4087804870051572B /* Build configuration list for PBXProject "HandBrake" */ = { isa = XCConfigurationList; buildConfigurations = ( - 4D4E7BC5087804870051572B /* Development */, - 4D4E7BC6087804870051572B /* Deployment */, - 0D88F56F0B6CDCD400F81F26 /* UB */, + 4D4E7BC6087804870051572B /* standard */, + 4D4E7BC5087804870051572B /* debug */, + 27ED6ADB0F58D7F100C905EE /* standard.i386 */, + 27ED6AFF0F58DE7400C905EE /* standard.x86_64 */, + 27ED6AE30F58D8F200C905EE /* standard.ppc */, + 27ED6B040F58DE7600C905EE /* standard.ppc64 */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Deployment; + defaultConfigurationName = standard; }; /* End XCConfigurationList section */ }; diff --git a/macosx/Info.h.m4 b/macosx/Info.h.m4 new file mode 100644 index 00000000..308e38f6 --- /dev/null +++ b/macosx/Info.h.m4 @@ -0,0 +1,15 @@ +dnl +dnl This file is used by Xcode Packaging for Info.plist preprocessing. +dnl See Info.plist for how the values are used. +dnl +changequote(<<, >>)dnl +include(<>)dnl +dnl +dnl +dnl +<<#>>define HB_PLIST_BUNDLEVERSION svn<<>>__HB_repo_rev +<<#>>define HB_PLIST_DISPLAYNAME __HB_name +<<#>>define HB_PLIST_GETINFOSTRING __HB_build +<<#>>define HB_PLIST_SHORTVERSIONSTRING __HB_version_formal +<<#>>define HB_PLIST_SUFEEDURL __HB_url_appcast +<<#>>define HB_PLIST_VERSION __HB_version diff --git a/macosx/HandBrake.plist b/macosx/Info.plist similarity index 70% rename from macosx/HandBrake.plist rename to macosx/Info.plist index 8217aa78..011848a2 100644 --- a/macosx/HandBrake.plist +++ b/macosx/Info.plist @@ -2,37 +2,37 @@ + CFBundleGetInfoString + HB_PLIST_GETINFOSTRING CFBundleDevelopmentRegion English CFBundleDisplayName - HandBrake + HB_PLIST_DISPLAYNAME CFBundleExecutable - HandBrake - CFBundleGetInfoString - $(HB_VERSION) + ${EXECUTABLE_NAME} CFBundleIconFile - HandBrake + ${EXECUTABLE_NAME} CFBundleIdentifier org.m0k.handbrake CFBundleInfoDictionaryVersion 6.0 CFBundleName - HandBrake + ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - $(HB_VERSION) + HB_PLIST_SHORTVERSIONSTRING CFBundleSignature HB## CFBundleVersion - $(HB_BUILD) - NSHumanReadableCopyright - HandBrake Devs + HB_PLIST_BUNDLEVERSION NSMainNibFile MainMenu NSPrincipalClass NSApplication + NSHumanReadableCopyright + © 2003-2009, HandBrake Developers SUFeedURL - $(APPCAST_URL) + HB_PLIST_SUFEEDURL diff --git a/macosx/module.defs b/macosx/module.defs new file mode 100644 index 00000000..c13958da --- /dev/null +++ b/macosx/module.defs @@ -0,0 +1,29 @@ +$(eval $(call import.MODULE.defs,MACOSX,macosx)) + +MACOSX.src/ = $(PROJECT/)macosx/ +MACOSX.build/ = $(BUILD/)macosx/ + +MACOSX.m4.in = $(wildcard $(MACOSX.src/)*.m4) +MACOSX.m4.out = $(patsubst $(MACOSX.src/)%.m4,$(MACOSX.build/)%,$(MACOSX.m4.in)) + +MACOSX.targs = HandBrakeCLI HandBrake +MACOSX.conf = standard$(if $(filter 1,$(BUILD.cross)),.$(BUILD.arch)) + +############################################################################### + +BUILD.out += $(MACOSX.m4.out) + +############################################################################### + +MACOSX.XCODE.exe = xcodebuild +MACOSX.XCODE.project = HandBrake.xcodeproj + +MACOSX.XCODE = $(strip \ + cd $(MACOSX.src/) && \ + $(MACOSX.XCODE.exe) \ + -project $(MACOSX.XCODE.project) \ + -configuration $(MACOSX.conf) \ + $(foreach t,$(MACOSX.targs),-target $t) \ + EXTERNAL_BUILD=$(CURDIR) \ + EXTERNAL_PROJECT=$(PROJECT/) \ + $(1) ) diff --git a/macosx/module.rules b/macosx/module.rules new file mode 100644 index 00000000..94df6651 --- /dev/null +++ b/macosx/module.rules @@ -0,0 +1,20 @@ +$(eval $(call import.MODULE.rules,MACOSX)) + +build: macosx.build +clean: macosx.clean + +.PHONY: macosx.build macosx.clean + +macosx.build: $(MACOSX.m4.out) + +$(call MACOSX.XCODE,build) + +macosx.clean: + $(call MACOSX.XCODE,clean) + +$(MACOSX.m4.out): $(BUILD/)project/handbrake.m4 +$(MACOSX.m4.out): | $(dir $(MACOSX.m4.out)) +$(MACOSX.m4.out): $(MACOSX.build/)%: $(MACOSX.src/)%.m4 + $(M4.exe) -Iproject $< > $@ + +## target used by Xcode when launching as external build +macosx.fromxcode: $(MACOSX.m4.out) $(LIBHB.a) diff --git a/make/configure.py b/make/configure.py new file mode 100644 index 00000000..1aa85bd3 --- /dev/null +++ b/make/configure.py @@ -0,0 +1,752 @@ +import fnmatch +import optparse +import os +import platform +import re +import subprocess +import sys +import time + +from optparse import OptionGroup +from optparse import OptionGroup +from optparse import OptionParser +from sys import stderr +from sys import stdout + +############################################################################### + +def errf( format, *args ): + stderr.write( ('ERROR: ' + format + '\n') % args ) + sys.exit( 1 ) + +def outf( format, *args ): + stdout.write( (format + '\n') % args ) + +############################################################################### + +## Expand values of iterable object into a decent string representation. +## +def expandValues( obj ): + buf = '' + for v in obj: + buf += ', ' + v + return '{ ' + buf[2:] + ' }' + +############################################################################### + +## Find executable by searching path. +## On success, returns full pathname of executable. +## On fail, returns None. +## +def findExecutable( name ): + if len( os.path.split(name)[0] ): + return name if os.access( name, os.X_OK ) else None + + if not os.environ.has_key( 'PATH' ) or os.environ[ 'PATH' ] == '': + path = os.defpath + else: + path = os.environ['PATH'] + + for dir in path.split( os.pathsep ): + f = os.path.join( dir, name ) + if os.access( f, os.X_OK ): + return f + return None + +############################################################################### + +def computeDefaultMakeJobs(): + ## good for darwin9.6.0 and linux + try: + n = os.sysconf( 'SC_NPROCESSORS_ONLN' ) + if n < 1: + n = 1 + return n + except: + pass + ## windows + try: + n = int( os.environ['NUMBER_OF_PROCESSORS'] ) + if n < 1: + n = 1 + return n + except: + pass + return 1 + +############################################################################### + +## taken from python2.6 -- we need it +def relpath(path, start=os.path.curdir): + """Return a relative version of a path""" + + if not path: + raise ValueError("no path specified") + + start_list = os.path.abspath(start).split(os.sep) + path_list = os.path.abspath(path).split(os.sep) + + # Work out how much of the filepath is shared by start and path. + i = len(os.path.commonprefix([start_list, path_list])) + + rel_list = [os.pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return os.path.curdir + return os.path.join(*rel_list) + +############################################################################### + +# compute project dir which should be 2 dirs below this script +build_dir = os.curdir +project_dir = os.path.normpath( sys.argv[0] ) +for i in range( 2 ): + project_dir = os.path.dirname( project_dir ) +if len( project_dir ) == 0: + project_dir = os.curdir + +############################################################################### + +## model gnu-autotools platform guess +## +## native format: +## (PROC)-(VENDOR)-(SYSTEM)(RELEASE)-(EXTRA) +## +## examples: +## i386-apple-darwin9.6.0 (Mac OS X 10.5.6 Intel) +## powerpc-apple-darwin9.6.0 (Mac OS X 10.5.6 PPC) +## i686-pc-cygwin (Cygwin, Microsoft Vista) +## x86_64-unknown-linux-gnu (Linux, Fedora 10 x86_64) +## +class Guess: + def __init__( self ): + self.proc = 'unknown' + self.vendor = 'unknown' + self.system = 'unknown' + self.release = '0.0.0' + self.extra = '' + + p_system = platform.system().lower() + p_release = platform.release().lower() + p_processor = platform.processor().lower() + p_machine = platform.machine().lower() + + if re.match( 'cygwin', p_system ): + self.proc = p_machine + self.vendor = 'pc' + self.system = 'cygwin' + self.release = '' + self.extra = '' + elif re.match( 'darwin', p_system ): + self.proc = p_machine + self.vendor = 'apple' + self.system = p_system + self.release = p_release + self.extra = '' + elif re.match( 'linux', p_system ): + self.proc = p_machine + self.vendor = 'unknown' + self.system = p_system + self.release = '' + self.extra = 'gnu' + else: + errf( 'unrecognized host system: %s', p_system ) + + def __str__( self ): + if len(self.extra): + return '%s-%s-%s%s-%s' % (self.proc,self.vendor,self.system,self.release,self.extra) + else: + return '%s-%s-%s%s' % (self.proc,self.vendor,self.system,self.release) + + def match( self, spec ): + return fnmatch.fnmatch( str(self), spec ) + +############################################################################### + +# a tool represents a command-line tool which may be searched for in PATH +class Tool: + def __init__( self, parent, optional, var, *pool ): + self.name = pool[0] + self.optional = optional + self.var = var + self.pool = pool + self.found = None + if parent: + parent.register( self ) + + def addToConfig( self, config ): + config.add( self.var, self.found ) + + def addToGroup( self, group ): + group.add_option( '', '--' + self.name, help='specify %s location' % (self.name), default=None, metavar='EXE' ) + + def locate( self, options ): + spec = options.__dict__[self.name] + pool = self.pool if not spec else [spec] + for p in pool: + self.found = findExecutable( p ) + if self.found: + outf( 'located %s: %s', self.name, self.found ) + return + if self.optional: + outf( 'missing: %s (optional)', self.name ) + else: + errf( 'unable to locate tool: %s', self.name ) + +## a select tool picks first found from a list of tools +class SelectTool( Tool ): + def __init__( self, parent, var, name, *pool ): + self.var = var + self.name = name + self.pool = pool + self.found = None + + self.poolMap = {} + for p in self.pool: + self.poolMap[p.name] = p + if parent: + parent.register( self ) + + def addToConfig( self, config ): + config.add( self.var, self.found ) + + def addToGroup( self, group ): + group.add_option( '', '--' + self.name, help='select %s mode: %s' % (self.name,expandValues(self.poolMap)), + default=self.name, metavar='MODE' ) + + def locate( self, options ): + spec = options.__dict__[self.name] + if spec in self.poolMap: + self.found = spec + return + for p in self.pool: + if p.found: + self.found = p.name + outf( 'selected %s: %s', self.name, self.found ) + return + errf( 'require at least one location of: %s', expandValues( self.poolMap )) + +############################################################################### + +class ToolSet: + def __init__( self ): + self.items = [] + Tool( self, False, 'AR.exe', 'ar' ) + Tool( self, False, 'CP.exe', 'cp' ) + Tool( self, True, 'CURL.exe', 'curl' ) + Tool( self, False, 'GCC.gcc', 'gcc', 'gcc-4' ) + Tool( self, False, 'M4.exe', 'm4' ) + Tool( self, False, 'MKDIR.exe', 'mkdir' ) + Tool( self, False, 'PATCH.exe', 'patch' ) + Tool( self, False, 'RM.exe', 'rm' ) + Tool( self, False, 'TAR.exe', 'tar' ) + Tool( self, True, 'WGET.exe', 'wget' ) + + SelectTool( self, 'FETCH.select', 'fetch', self.wget, self.curl ) + + def register( self, item ): + self.__dict__[item.name] = item + self.items.append( item ) + +############################################################################### + +class OptionMode( list ): + def __init__( self, default, *items ): + super( OptionMode, self ).__init__( items ) + self.default = items[default] + self.mode = self.default + + def __str__( self ): + return ' '.join( self ).replace( self.mode, '*'+self.mode ) + + def addToGroup( self, group, option, name ): + group.add_option( '', option, help='select %s mode: %s' % (name,self), default=self.mode, metavar='MODE' ) + + def setFromOption( self, name, mode ): + if mode not in self: + errf( 'invalid %s mode: %s', name, mode ) + self.mode = mode + +############################################################################### + +## create singletons +guessHost = Guess() +guessBuild = Guess() + +makeTool = Tool( None, False, 'CONF.make', 'gmake', 'make' ) +tools = ToolSet() + +debugMode = OptionMode( 0, 'none', 'min', 'std', 'max' ) +optimizeMode = OptionMode( 1, 'none', 'speed', 'size' ) + +## populate platform-specific architecture modes +if guessHost.match( 'i386-*-darwin8.*' ): + archMode = OptionMode( 0, 'i386', 'ppc' ) +elif guessHost.match( 'powerpc-*-darwin8.*' ): + archMode = OptionMode( 1, 'i386', 'ppc' ) +elif guessHost.match( 'i386-*-darwin9.*' ): + archMode = OptionMode( 0, 'i386', 'x86_64', 'ppc', 'ppc64' ) +elif guessHost.match( 'powerpc-*-darwin9.*' ): + archMode = OptionMode( 2, 'i386', 'x86_64', 'ppc', 'ppc64' ) +else: + archMode = OptionMode( 0, guessHost.proc ) + +## create parser +parser = OptionParser( 'Usage: %prog' ) + +group = OptionGroup( parser, 'Feature Options' ) +group.add_option( '', '--disable-xcode', default=False, action='store_true', + help='disable Xcode (Darwin only)' ) +group.add_option( '', '--disable-gtk', default=False, action='store_true', + help='disable GTK GUI (Linux only)' ) +parser.add_option_group( group ) + +## add launch options +group = OptionGroup( parser, 'Launch Options' ) +group.add_option( '', '--launch', default=False, action='store_true', + help='launch build, capture log and wait for completion' ) +group.add_option( '', '--launch-jobs', default=1, action='store', metavar='N', + help='allow N jobs at once; 0 to match CPU count (1)' ) +group.add_option( '', '--launch-args', default=None, action='store', metavar='ARGS', + help='specify additional ARGS for launch command' ) +group.add_option( '', '--launch-dir', default='build', action='store', metavar='DIR', + help='specify scratch DIR to use for build (build)' ) +group.add_option( '', '--launch-force', default=False, action='store_true', + help='force use of scratch directory even if exists' ) +group.add_option( '', '--launch-log', default='log.txt', action='store', metavar='FILE', + help='specify log FILE (log.txt)' ) +group.add_option( '', '--launch-quiet', default=False, action='store_true', + help='do not echo build output' ) +parser.add_option_group( group ) + +## add compile options +group = OptionGroup( parser, 'Compiler Options' ) +debugMode.addToGroup( group, '--debug', 'debug' ) +optimizeMode.addToGroup( group, '--optimize', 'optimize' ) +archMode.addToGroup( group, '--arch', 'architecutre' ) +parser.add_option_group( group ) + +## add tool options +group = OptionGroup( parser, 'Tool Options' ) +makeTool.addToGroup( group ) +for tool in tools.items: + tool.addToGroup( group ) +parser.add_option_group( group ) + +(options, args) = parser.parse_args() + +## recompute values when launch mode +if options.launch: + options.launch_jobs = int(options.launch_jobs) + build_dir = options.launch_dir + if os.path.isabs( build_dir ): + project_dir = os.getcwd() + else: + project_dir = os.path.normpath( relpath( project_dir, build_dir )) + if options.launch_jobs == 0: + options.launch_jobs = computeDefaultMakeJobs() + if options.launch_jobs < 1: + options.launch_jobs = 1 + elif options.launch_jobs > 8: + options.launch_jobs = 8 + +## make sure configure does not run in source root +if os.path.abspath( project_dir ) == os.path.abspath( build_dir ): + errf( 'scratch (build) directory must not be the same as source root' ) + +## validate modes +debugMode.setFromOption( 'debug', options.debug ) +optimizeMode.setFromOption( 'optimize', options.optimize ) +archMode.setFromOption( 'architecture', options.arch ) + +## update guessBuild as per architecture mode +if guessHost.match( '*-*-darwin*' ): + if archMode.mode == 'i386': + guessBuild.proc = 'i386' + elif archMode.mode == 'x86_64': + guessBuild.proc = 'x86_64' + elif archMode.mode == 'ppc': + guessBuild.proc = 'powerpc' + elif archMode.mode == 'ppc64': + guessBuild.proc = 'powerpc64' +else: + guessBuild.proc = archMode.mode +guessBuild.cross = 0 if archMode.default == archMode.mode else 1 + +# locate tools +makeTool.locate( options ) +for tool in tools.items: + tool.locate( options ) + +############################################################################### + +## Repository object. +## Holds information gleaned from subversion working dir. +## +## Builds are classed into one of the following types: +## +## release +## must be built from official svn with '/tags/' in the url +## developer +## must be built from official svn but is not a release +## unofficial +## all other builds +## +class Repository: + def __init__( self ): + self.url = 'svn://nowhere.com/project/unknown' + self.root = 'svn://nowhere.com/project' + self.branch = 'unknown' + self.uuid = '00000000-0000-0000-0000-000000000000'; + self.rev = 0 + self.date = '0000-00-00 00:00:00 -0000' + self.wcversion = 'exported' + self.official = 0 + self.type = 'unofficial' + + # parse output: svnversion PROJECT_DIR + cmd = 'svnversion ' + project_dir + print 'running: %s' % (cmd) + try: + p = subprocess.Popen( cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) + p.wait(); + if p.returncode == 0: + self.wcversion = p.stdout.readline().rstrip() + except: + pass + + # parse output: svn info PROJECT_DIR + cmd = 'svn info ' + project_dir + print 'running: %s' % (cmd) + try: + p = subprocess.Popen( cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) + p.wait(); + if p.returncode == 0: + for line in p.stdout: + (name,value) = re.match( '([^:]+):\\s+(.+)', line.rstrip() ).groups() + if name == 'URL': + self.url = value + elif name == 'Repository Root': + self.root = value + elif name == 'Repository UUID': + self.uuid = value + elif name == 'Revision': + self.rev = int( value ) + elif name == 'Last Changed Date': + # strip chars in parens + if value.find( ' (' ): + self.date = value[0:value.find(' (')] + else: + self.date = value + except: + pass + + i = self.url.rfind( '/' ) + if i != -1 and i < len(self.url)-1: + self.branch = self.url[i+1:] + + # official UUID behavior + if self.uuid == 'b64f7644-9d1e-0410-96f1-a4d463321fa5': + self.official = 1 + m = re.match( '([^:]+)://([^/]+)/(.+)', self.url ) + if m and re.match( 'tags/', m.group( 3 )): + self.type = 'release' + else: + self.type = 'developer' + +############################################################################### + +## Project object. +## Contains manually updated version numbers consistent with HB releases +## and other project metadata. +## +class Project: + def __init__( self ): + self.name = 'HandBrake' + self.name_lower = self.name.lower() + self.name_upper = self.name.upper() + self.acro_lower = 'hb' + self.acro_upper = 'HB' + self.url_website = 'http://handbrake.fr' + self.url_community = 'http://forum.handbrake.fr' + self.url_irc = 'irc://irc.freenode.net/handbrake' + + self.vmajor = 0 + self.vminor = 9 + self.vpoint = 3 + + self.version = '%d.%d.%d' % (self.vmajor,self.vminor,self.vpoint) + appcastfmt = 'http://handbrake.fr/appcast%s.xml' + + if repo.type == 'release': + self.version_formal = '%s Release' % (self.version) + self.url_appcast = appcastfmt % ('') + elif repo.type == 'developer': + self.version_formal = '%s Developer ' % (self.version) + self.url_appcast = appcastfmt % ('_unstable') + else: + self.version_formal = '%s Unnofficial ' % (self.version) + self.url_appcast = appcastfmt % ('_unofficial') + + self.title = '%s %s' % (self.name,self.version) + self.build = time.strftime('%Y%m%d') + '01' + +############################################################################### + +## Config object used to output gnu-make or gnu-m4 output. +## +## Use add() to add NAME/VALUE pairs suitable for both make/m4. +## Use addBlank() to add a linefeed for both make/m4. +## Use addMake() to add a make-specific line. +## Use addM4() to add a m4-specific line. +## +class Config: + def __init__( self ): + self._items = [] + + def add( self, name, value ): + self._items.append( (name,value) ) + + def addBlank( self ): + self._items.append( None ) + + def addComment( self, format, *args ): + self.addMake( '## ' + format % args ) + self.addM4( 'dnl ' + format % args ) + + def addMake( self, line ): + self._items.append( ('?make',line) ) + + def addM4( self, line ): + self._items.append( ('?m4',line) ) + + def output( self, file, type ): + namelen = 0 + for item in self._items: + if item == None or item[0].find( '?' ) == 0: + continue + if len(item[0]) > namelen: + namelen = len(item[0]) + for item in self._items: + if item == None: + if type == 'm4': + file.write( 'dnl\n' ) + else: + file.write( '\n' ) + continue + if item[0].find( '?' ) == 0: + if item[0].find( type, 1 ) == 1: + file.write( '%s\n' % (item[1]) ) + continue + + if type == 'm4': + self._outputM4( file, namelen, item[0], item[1] ) + else: + self._outputMake( file, namelen, item[0], item[1] ) + + def _outputMake( self, file, namelen, name, value ): + file.write( '%-*s = %s\n' % (namelen, name, value )) + + def _outputM4( self, file, namelen, name, value ): + namelen += 7 + name = '<<__%s>>,' % name.replace( '.', '_' ) + file.write( 'define(%-*s <<%s>>)dnl\n' % (namelen, name, value )) + +############################################################################### + +## create configure line, stripping arg --launch, quoting others +configure = [] +for arg in sys.argv[1:]: + #if arg.find( '--launch' ) == 0: + # continue + if arg == '--launch': + continue + configure.append( '"%s"' % (arg.replace('"', '\\"')) ) + +## create singletones +repo = Repository() +project = Project() +config = Config() + +config.addComment( 'generated by configure on %s', time.strftime( '%c' )) + +config.addBlank() +config.add( 'CONF.args', ' '.join( configure )) + +config.addBlank() +config.add( 'HB.title', project.title ) +config.add( 'HB.name', project.name ) +config.add( 'HB.name.lower', project.name_lower ) +config.add( 'HB.name.upper', project.name_upper ) +config.add( 'HB.acro.lower', project.acro_lower ) +config.add( 'HB.acro.upper', project.acro_upper ) + +config.add( 'HB.url.website', project.url_website ) +config.add( 'HB.url.community', project.url_community ) +config.add( 'HB.url.irc', project.url_irc ) +config.add( 'HB.url.appcast', project.url_appcast ) + +config.add( 'HB.version.major', project.vmajor ) +config.add( 'HB.version.minor', project.vminor ) +config.add( 'HB.version.point', project.vpoint ) +config.add( 'HB.version', project.version ) +config.add( 'HB.version.formal', project.version_formal ) +config.add( 'HB.version.hex', '%04x%02x%02x%02x%06x' % (project.vmajor,project.vminor,project.vpoint,0,repo.rev) ) + +config.add( 'HB.build', project.build ) + +config.add( 'HB.repo.url', repo.url ) +config.add( 'HB.repo.root', repo.root ) +config.add( 'HB.repo.branch', repo.branch ) +config.add( 'HB.repo.uuid', repo.uuid ) +config.add( 'HB.repo.rev', repo.rev ) +config.add( 'HB.repo.date', repo.date ) +config.add( 'HB.repo.wcversion', repo.wcversion ) +config.add( 'HB.repo.official', repo.official ) +config.add( 'HB.repo.type', repo.type ) + +config.addBlank() +config.add( 'HOST.spec', guessHost ) +config.add( 'HOST.proc', guessHost.proc ) +config.add( 'HOST.vendor', guessHost.vendor ) +config.add( 'HOST.system', guessHost.system ) +config.add( 'HOST.release', guessHost.release ) +config.add( 'HOST.extra', guessHost.extra ) + +config.addBlank() +config.add( 'BUILD.spec', guessBuild ) +config.add( 'BUILD.proc', guessBuild.proc ) +config.add( 'BUILD.vendor', guessBuild.vendor ) +config.add( 'BUILD.system', guessBuild.system ) +config.add( 'BUILD.release', guessBuild.release ) +config.add( 'BUILD.extra', guessBuild.extra ) +config.add( 'BUILD.cross', guessBuild.cross ) +config.add( 'BUILD.date', time.strftime('%c') ) +config.add( 'BUILD.arch', archMode.mode ) + +config.addBlank() +config.add( 'BUILD/', os.curdir + os.sep ) +config.add( 'PROJECT/', project_dir + os.sep ) + +config.addBlank() +config.add( 'FEATURE.xcode', 0 if options.disable_xcode else 1 ) +config.add( 'FEATURE.gtk', 0 if options.disable_gtk else 1 ) + +config.addMake( '' ) +config.addMake( '## include main definitions' ) +config.addMake( 'include $(PROJECT/)make/include/main.defs' ) + +config.addBlank() +for tool in tools.items: + tool.addToConfig( config ) + +config.addBlank() +config.add( 'GCC.archs', archMode.mode if guessBuild.cross else '' ) +config.add( 'GCC.g', options.debug ) +config.add( 'GCC.O', options.optimize ) + +config.addMake( '' ) +config.addMake( '## include (optional) customization file' ) +config.addMake( '-include $(BUID/)GNUmakefile.custom' ) + +config.addMake( '' ) +config.addMake( '## include main rules' ) +config.addMake( 'include $(PROJECT/)make/include/main.rules' ) + +############################################################################### + +# generate make or m4 file +def generate( type ): + if type == 'make': + fname = 'GNUmakefile' + elif type == 'm4': + fname = os.path.join( 'project', project.name_lower + '.m4' ) + else: + raise ValueError, 'unknown file type: ' + type + + ftmp = fname + '.tmp' + + pdir = os.path.dirname( fname ) + if pdir: + if not os.path.exists( pdir ): + os.makedirs( pdir ) + + try: + try: + outf( 'generating %s', fname ) + file = open( ftmp, 'w' ) + config.output( file, type ) + finally: + try: + file.close() + except: + pass + except Exception, x: + try: + os.remove( ftmp ) + except Exception, x: + pass + errf( 'failed writing to %s\n%s', ftmp, x ) + + try: + os.rename( ftmp, fname ) + except Exception, x: + errf( 'failed writing to %s\n%s', fname, x ) + +############################################################################### + +if not options.launch: + generate( 'make' ) + generate( 'm4' ) + sys.exit( 0 ) + +############################################################################### + +if os.path.exists( options.launch_dir ): + if not options.launch_force: + errf( 'scratch directory already exists: %s', options.launch_dir ) +else: + outf( 'creating %s', options.launch_dir ) + os.makedirs( options.launch_dir ) + +outf( 'chdir %s', options.launch_dir ) +os.chdir( options.launch_dir ) +generate( 'make' ) +generate( 'm4' ) + +outf( 'opening %s', options.launch_log ) +try: + log = open( options.launch_log, 'w' ) +except Exception, x: + errf( 'open failure: %s', x ) + +cmd = '%s -j%d' % (makeTool.found,options.launch_jobs) +if options.launch_args: + cmd += ' ' + options.launch_args + +## record begin +timeBegin = time.time() +s = '###\n### TIME: %s\n### launch: %s\n###\n' % (time.asctime(),cmd) +stdout.write( s ); stdout.flush() +log.write( s ); log.flush() + +## launch/pipe +try: + pipe = subprocess.Popen( cmd, shell=True, bufsize=1, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) +except Exception, x: + errf( 'launch failure: %s', x ) +for line in pipe.stdout: + if not options.launch_quiet: + stdout.write( line ); stdout.flush() + log.write( line ); log.flush() +pipe.wait() + +## record end +timeEnd = time.time() +elapsed = timeEnd - timeBegin +result = '%s (exit code %d)' % ('success' if pipe.returncode == 0 else 'failed',pipe.returncode) +s = '###\n### TIME: %s\n### finished: %.2f seconds\n### %s\n###\n' % (time.asctime(),elapsed,result) +stdout.write( s ); stdout.flush() +log.write( s ); log.flush() + +log.close() +sys.exit( 0 ) diff --git a/make/include/base.defs b/make/include/base.defs new file mode 100644 index 00000000..3b4e666f --- /dev/null +++ b/make/include/base.defs @@ -0,0 +1,50 @@ +## Define module metadata. +## It is mandatory for every module to use this template. +## +## $(1) module name (uppercase) +## $(2) module name (lowercase) +## $(3) list of prerequisite modules (uppercase) +## +define import.MODULE.defs + ## indicates module is defined; useful for conditionals + $(1).enabled = 1 + + ## module name (lowercase) + $(1).name = $(2) + + ## list of prerequisite modules (uppercase) + $(1).prerequisites = $(3) + + ## add to global list of modules + MODULES.NAMES += $(1) + MODULES.names += $(2) +endef + +## +## $(1) module name (uppercase) +## +define import.MODULE.rules +$($(1).name).report: + @$(MAKE) report.true REPORT=module REPORT.module=$(1) + +## aggregate +report.modules:: $($(1).name).report + +endef + +.PHONY: report.main report.gcc report.modules + +report.modules:: + +.PHONY: report.main +report.main: + @$(MAKE) report.true REPORT=main + +.PHONY: report.gcc +report.gcc: + @$(MAKE) report.true REPORT=gcc + +## needed for nested make (which drives each report) +.PHONY: report.true +report.true: + @true diff --git a/make/include/contrib.defs b/make/include/contrib.defs new file mode 100644 index 00000000..772258c3 --- /dev/null +++ b/make/include/contrib.defs @@ -0,0 +1,276 @@ +CONTRIB.build/ = $(BUILD/)contrib/ +CONTRIB.download/ = $(PROJECT/)download/ +CONTRIB.host = $(if $(filter 1,$(BUILD.cross)),$(BUILD.spec)) + +############################################################################### + +## +## $(1) = module name (uppercase) +## +define import.CONTRIB.defs + ## + ## import gcc/g++ support mainly so we can force contrib choice of + ## gcc executable, and debug/optimization flags. + ## + $$(eval $$(call import.GCC,$(1))) + + ## + ## common values useful across targets + ## + $(1).src/ = $$(PROJECT/)contrib/$($(1).name)/ + $(1).build/ = $$(CONTRIB.build/)$($(1).name)/ + $(1).deps = $$(foreach n,$($(1).prerequisites),$$($$n.INSTALL.target)) + + ## + ## target: fetch + ## + $(1).FETCH.tar = $$(CONTRIB.download/)$$(notdir $$($(1).FETCH.url)) + $(1).FETCH.url = FETCH_IS_UNDEFINED + $(1).FETCH.target = $$($(1).FETCH.tar) + define $(1).FETCH + $$(call FETCH,$$@,$$($(1).FETCH.url)) + endef + + ## + ## target: extract + ## + $(1).EXTRACT.tarbase = $$(patsubst %.tar.gz,%,$$(notdir $$($(1).FETCH.url))) + $(1).EXTRACT.target/ = $$($(1).build/)$$($(1).EXTRACT.tarbase)/ + define $(1).EXTRACT + $$(TAR.exe) xfC $$($(1).FETCH.tar) $$($(1).build/) + endef + + ## + ## target: patch + ## + $(1).PATCH.srcs = $$(wildcard \ + $$($(1).src/)A??-*.patch \ + $$($(1).src/)P??-$$(BUILD.system)*.patch ) + + # extra line feed is required + define $(1).PATCH.item + $$(PATCH.exe) -t -p1 -d $$(1) < $$(2) + + endef + + $(1).PATCH.target = $$($(1).build/).stamp.patch + define $(1).PATCH + $$(foreach p,$$($(1).PATCH.srcs),$$(call $(1).PATCH.item,$$($(1).EXTRACT.target/),$$(p))) + endef + + ## + ## target: configure + ## + $(1).CONFIGURE.sete = set -e; + $(1).CONFIGURE.dir = $$($(1).EXTRACT.target/) + $(1).CONFIGURE.bootstrap = + $(1).CONFIGURE.exe = ./configure + $(1).CONFIGURE.host = $$(CONTRIB.host) + $(1).CONFIGURE.prefix = $$(call fn.ABSOLUTE,$$(CONTRIB.build/)) + $(1).CONFIGURE.deps = --disable-dependency-tracking + $(1).CONFIGURE.shared = --disable-shared + $(1).CONFIGURE.static = --enable-static + $(1).CONFIGURE.extra = + + $(1).CONFIGURE.args.dir = cd $$(1); + $(1).CONFIGURE.args.host = --host=$$(1) + $(1).CONFIGURE.args.prefix = --prefix=$$(1) + + $(1).CONFIGURE.args = !sete @dir !bootstrap !env !exe @host @prefix !deps !shared !static !extra + + $(1).CONFIGURE.env.CC = CC=$$($(1).GCC.gcc) + $(1).CONFIGURE.env.CFLAGS = CFLAGS="$$(call fn.ARGS,$(1).GCC,*archs)" + $(1).CONFIGURE.env.CXX = CXX=$$($(1).GCC.gxx) + $(1).CONFIGURE.env.CXXFLAGS = CXXFLAGS="$$(call fn.ARGS,$(1).GCC,*archs)" + $(1).CONFIGURE.env.CPPFLAGS = CPPFLAGS="$$(call fn.ARGS,$(1).GCC,*archs)" + $(1).CONFIGURE.env.LDFLAGS = LDFLAGS="$$(call fn.ARGS,$(1).GCC,*archs)" + + $(1).CONFIGURE.env.args = !CC !CFLAGS !CXX !CXXFLAGS !CPPFLAGS !LDFLAGS + $(1).CONFIGURE.env = $$(call fn.ARGS,$(1).CONFIGURE.env,$$($(1).CONFIGURE.env.args)) + + $(1).CONFIGURE.target = $$($(1).build/).stamp.configure + define $(1).CONFIGURE + $$(call fn.ARGS,$(1).CONFIGURE,$$($(1).CONFIGURE.args)) + endef + + ## + ## target: build + ## + $(1).BUILD.make = $$(MAKE) + $(1).BUILD.dir = $$($(1).EXTRACT.target/) + $(1).BUILD.extra = + $(1).BUILD.ntargets = + + $(1).BUILD.args = !make @dir !extra !ntargets + $(1).BUILD.args.dir = -C $$(1) + + $(1).BUILD.target = $$($(1).build/).stamp.build + define $(1).BUILD + $$(call fn.ARGS,$(1).BUILD,$$($(1).BUILD.args)) + endef + + ## + ## target: install + ## + + $(1).INSTALL.make = $$(MAKE) + $(1).INSTALL.dir = $$($(1).EXTRACT.target/) + $(1).INSTALL.extra = + $(1).INSTALL.ntargets = + + $(1).INSTALL.args = !make @dir !extra !ntargets + $(1).INSTALL.args.dir = -C $$(1) install + + $(1).INSTALL.target = $$($(1).build/).stamp.install + define $(1).INSTALL + $$(call fn.ARGS,$(1).INSTALL,$$($(1).INSTALL.args)) + endef + + ## + ## target: uninstall + ## + $(1).UNINSTALL.make = $$(MAKE) + $(1).UNINSTALL.dir = $$($(1).EXTRACT.target/) + $(1).UNINSTALL.extra = + $(1).UNINSTALL.ntargets = uninstall + + $(1).UNINSTALL.args = !make @dir !extra !ntargets + $(1).UNINSTALL.args.dir = -C $$(1) + + define $(1).UNINSTALL + $$(call fn.ARGS,$(1).UNINSTALL,$$($(1).UNINSTALL.args)) + endef + + ## + ## target: clean + ## + $(1).CLEAN.make = $$(MAKE) + $(1).CLEAN.dir = $$($(1).EXTRACT.target/) + $(1).CLEAN.extra = + $(1).CLEAN.ntargets = clean + + $(1).CLEAN.args = !make @dir !extra !ntargets + $(1).CLEAN.args.dir = -C $$(1) + + define $(1).CLEAN + $$(call fn.ARGS,$(1).CLEAN,$$($(1).CLEAN.args)) + endef + + ## other values used to aid prerequisite dirs and cleanup + ## + $(1).out += $$($(1).build/) + $(1).out += $$($(1).FETCH.target) + $(1).out += $$($(1).PATCH.target) + $(1).out += $$($(1).CONFIGURE.target) + $(1).out += $$($(1).ALL.target) + $(1).out += $$($(1).INSTALL.target) + + BUILD.out += $$($(1).out) +endef + +############################################################################### + +## +## $(1) = module name +## +define import.CONTRIB.rules + +## +## target: fetch +## +$($(1).name).fetch: $$($(1).FETCH.target) + +$$($(1).FETCH.target): | $$(dir $$($(1).FETCH.target)) + $$($(1).FETCH) + +## +## target: extract +## must touch dir after extraction because old timestamp is restored via tar. +## +$($(1).name).extract: | $$($(1).EXTRACT.target/) + +$$($(1).EXTRACT.target/): | $$(dir $$($(1).build/)) +$$($(1).EXTRACT.target/): $$($(1).FETCH.target) + $$($(1).EXTRACT) + $$(TOUCH.exe) $$@ + +## +## target: patch +## +$($(1).name).patch: $$($(1).PATCH.target) + +$$($(1).PATCH.target): | $$(dir $$($(1).PATCH.target)) +$$($(1).PATCH.target): | $$($(1).EXTRACT.target/) + $$($(1).PATCH) + $$(TOUCH.exe) $$@ + +## +## target: configure +## +$($(1).name).configure: $$($(1).CONFIGURE.target) + +$$($(1).CONFIGURE.target): | $$(dir $$($(1).CONFIGURE.target)) +$$($(1).CONFIGURE.target): $$($(1).deps) +$$($(1).CONFIGURE.target): $$($(1).PATCH.target) + $$($(1).CONFIGURE) + $$(TOUCH.exe) $$@ + +## +## target: build +## +$($(1).name).build: $$($(1).BUILD.target) + +$$($(1).BUILD.target): | $$(dir $$($(1).BUILD.target)) +$$($(1).BUILD.target): $$($(1).CONFIGURE.target) + +$$($(1).BUILD) + $$(TOUCH.exe) $$@ + +## +## target: install +## +$($(1).name).install: $$($(1).INSTALL.target) + +$$($(1).INSTALL.target): | $$(dir $$($(1).INSTALL.target)) +$$($(1).INSTALL.target): $$($(1).BUILD.target) + $$($(1).INSTALL) + $$(TOUCH.exe) $$@ + +## +## target: uninstall +## +$($(1).name).uninstall: + -$$($(1).UNINSTALL) + $$(RM.exe) -f $$($(1).INSTALL.target) + +## +## target: clean +## +$($(1).name).clean: + -$$($(1).CLEAN) + $$(RM.exe) -f $$($(1).BUILD.target) + +## +## target: xclean +## +$($(1).name).xclean: $($(1).name).uninstall + $$(RM.exe) -fr $$($(1).build/) + +## +## alias: module name is same as build +## +$($(1).name): $($(1).name).build + +## +## participate with global convenience targets +## +contrib.fetch: $($(1).name).fetch +contrib.extract: $($(1).name).extract +contrib.patch: $($(1).name).patch +contrib.configure: $($(1).name).configure +contrib.build: $($(1).name).build +contrib.install: $($(1).name).install +contrib.uninstall: $($(1).name).uninstall +contrib.clean: $($(1).name).clean +contrib.xclean: $($(1).name).xclean + +endef diff --git a/make/include/function.defs b/make/include/function.defs new file mode 100644 index 00000000..5bf5aaa8 --- /dev/null +++ b/make/include/function.defs @@ -0,0 +1,19 @@ +fn.ERROR1 = ERROR: $(1) +fn.ERROR2 = ERROR: $(1): $(2) + +fn.HEADER = @echo "$(1): $(2)" +fn.DIVIDER = @echo "======================================================================" + +fn.ABSOLUTE = $(if $(filter /%,$(1)),$(1),$(subst /./,/,$(CURDIR)/$(1))) + +fn.ARGS = $(strip $(foreach a,$(2), \ + $($(1).$(patsubst !%,%,$(filter !%,$(a)))) \ + $(foreach x,$(patsubst ?%,%,$(filter ?%,$(a))),$(if $(filter 1,$($(1).$(x))),$($(1).args.$(x)))) \ + $(foreach x,$(patsubst .%,%,$(filter .%,$(a))),$($(1).args.$(x).$($(1).$(x)))) \ + $(foreach x,$(patsubst @%,%,$(filter @%,$(a))),$(if $($(1).$(x)),$(call $(1).args.$(x),$($(1).$(x))))) \ + $(foreach x,$(patsubst *%,%,$(filter *%,$(a))),$(foreach i,$($(1).$(x)),$(call $(1).args.$(x),$(i)))) \ + )) + +fn.VARS = $(foreach v,$($(1).vars),$(v)="$($(1).vars.$(v))") + +fn.TARGET = $(TARGET.$(2).prefix)$(1)$(TARGET.$(2).suffix)$(TARGET.$(2).ext) diff --git a/make/include/gcc.defs b/make/include/gcc.defs new file mode 100644 index 00000000..4ed74639 --- /dev/null +++ b/make/include/gcc.defs @@ -0,0 +1,146 @@ +GCC.gcc = gcc +GCC.gxx = $(dir $(GCC.gcc))$(subst gcc,g++,$(notdir $(GCC.gcc))) + +GCC.strip = $$(if $$(filter none,$$(GCC.g)),1) +GCC.dylib = 1 +GCC.pipe = 1 +GCC.ML = 1 +GCC.H = 0 +GCC.W = all +GCC.archs = +GCC.vis = 0 +GCC.pic = 0 +GCC.g = none +GCC.O = none +GCC.D = +GCC.I = +GCC.muldefs = 0 +GCC.start = 0 +GCC.a = +GCC.F = +GCC.f = +GCC.L = +GCC.l = +GCC.end = 0 + +GCC.args.pipe = -pipe +GCC.args.strip = -Wl,-S +GCC.args.dylib = -dynamiclib +GCC.args.ML = -fmessage-length=0 +GCC.args.H = -H +GCC.args.W = -W$(1) +GCC.args.archs = -arch $(1) +GCC.args.vis = -fvisibility=hidden +GCC.args.pic = -fPIC +GCC.args.g.none = -g0 +GCC.args.g.min = -gdwarf-2 -g1 +GCC.args.g.std = -gdwarf-2 +GCC.args.g.max = -gdwarf-2 -g3 +GCC.args.O.none = -O0 +GCC.args.O.size = -Os +GCC.args.O.speed = -O3 +GCC.args.D = -D$(1) +GCC.args.I = -I$(1) +GCC.args.muldefs = -Wl,--allow-multiple-definition +GCC.args.start = -Wl,--start-group +GCC.args.F = -F$(1) +GCC.args.f = -framework $(1) +GCC.args.L = -L$(1) +GCC.args.l = -l$(1) +GCC.args.end = -Wl,--end-group + +############################################################################### + +define import.GCC + $(1).GCC.gcc = $$(GCC.gcc) + $(1).GCC.gxx = $$(dir $$($(1).GCC.gcc))$$(subst gcc,g++,$$(notdir $$($(1).GCC.gcc))) + + $(1).GCC.pipe = $$(GCC.pipe) + $(1).GCC.strip = $$(if $$(filter none,$$($(1).GCC.g)),1) + $(1).GCC.dylib = $$(GCC.dylib) + $(1).GCC.ML = $$(GCC.ML) + $(1).GCC.H = $$(GCC.H) + $(1).GCC.W = $$(GCC.W) + $(1).GCC.archs = $$(GCC.archs) + $(1).GCC.vis = $$(GCC.vis) + $(1).GCC.pic = $$(GCC.pic) + $(1).GCC.g = $$(GCC.g) + $(1).GCC.O = $$(GCC.O) + $(1).GCC.D = $$(GCC.D) + $(1).GCC.I = $$(GCC.I) + $(1).GCC.muldefs = $$(GCC.muldefs) + $(1).GCC.start = $$(GCC.start) + $(1).GCC.a = $$(GCC.a) + $(1).GCC.F = $$(GCC.F) + $(1).GCC.f = $$(GCC.f) + $(1).GCC.L = $$(GCC.L) + $(1).GCC.l = $$(GCC.l) + $(1).GCC.end = $$(GCC.end) + + $(1).GCC.args.pipe = $$(GCC.args.pipe) + $(1).GCC.args.strip = $$(GCC.args.strip) + $(1).GCC.args.dylib = $$(GCC.args.dylib) + $(1).GCC.args.ML = $$(GCC.args.ML) + $(1).GCC.args.H = $$(GCC.args.H) + $(1).GCC.args.W = $$(GCC.args.W) + $(1).GCC.args.archs = $$(GCC.args.archs) + $(1).GCC.args.vis = $$(GCC.args.vis) + $(1).GCC.args.pic = $$(GCC.args.pic) + $(1).GCC.args.g.none = $$(GCC.args.g.none) + $(1).GCC.args.g.min = $$(GCC.args.g.min) + $(1).GCC.args.g.std = $$(GCC.args.g.std) + $(1).GCC.args.g.max = $$(GCC.args.g.max ) + $(1).GCC.args.O.none = $$(GCC.args.O.none) + $(1).GCC.args.O.size = $$(GCC.args.O.size) + $(1).GCC.args.O.speed = $$(GCC.args.O.speed) + $(1).GCC.args.D = $$(GCC.args.D) + $(1).GCC.args.I = $$(GCC.args.I) + $(1).GCC.args.muldefs = $$(GCC.args.muldefs) + $(1).GCC.args.start = $$(GCC.args.start) + $(1).GCC.args.F = $$(GCC.args.F) + $(1).GCC.args.f = $$(GCC.args.f) + $(1).GCC.args.L = $$(GCC.args.L) + $(1).GCC.args.l = $$(GCC.args.l) + $(1).GCC.args.end = $$(GCC.args.end) + + ########################################################################### + + $(1).GCC.c = -c $$(4) + $(1).GCC.o = -o $$(3) + + # FUNCTION: C precompiled headers + $(1).GCC.H_O.args = !gcc ?pipe ?ML ?H *W *archs ?vis ?pic .g .O *D *I !c !o + $(1).GCC.H_O = $$(call fn.ARGS,$(1).GCC,$$($(1).GCC.H_O.args),$$(1),$$(2)) + + # FUNCTION: C compile source + $(1).GCC.C_O.args = !gcc ?pipe ?ML ?H *W *archs ?vis ?pic .g .O *D *I !c !o + $(1).GCC.C_O = $$(call fn.ARGS,$(1).GCC,$$($(1).GCC.C_O.args),$$(1),$$(2)) + + # FUNCTION: C++ precompile headers + $(1).GCC.HPP_O.args = !gxx ?pipe ?ML ?H *W *archs ?vis ?pic .g .O *D *I !c !o + $(1).GCC.HPP_O = $$(call fn.ARGS,$(1).GCC,$$($(1).GCC.HPP_O.args),$$(1),$$(2)) + + # FUNCTION: C++ compile source + $(1).GCC.CPP_O.args = !gxx ?pipe ?ML ?H *W *archs ?vis ?pic .g .O *D *I !c !o + $(1).GCC.CPP_O = $$(call fn.ARGS,$(1).GCC,$$($(1).GCC.CPP_O.args),$$(1),$$(2)) + + ########################################################################### + + $(1).GCC.i = $$(4) + + # FUNCTION: C link dynamic-lib + $(1).GCC.DYLIB.args = !gcc ?pipe ?strip ?dylib ?ML *W *archs ?vis ?pic .g .O *D *I !o ?muldefs ?start !i *F *f *L *l *i !a ?end + $(1).GCC.DYLIB = $$(call fn.ARGS,$(1).GCC,$$($(1).GCC.DYLIB.args),$$(1),$$(2)) + + # FUNCTION: C link executable + $(1).GCC.EXE.args = !gcc ?pipe ?strip ?ML *W *archs ?vis ?pic .g .O *D *I !o ?muldefs ?start !i *F *f *L *l *i !a ?end + $(1).GCC.EXE = $$(call fn.ARGS,$(1).GCC,$$($(1).GCC.EXE.args),$$(1),$$(2)) + + # FUNCTION: C++ link dynamic-lib + $(1).GCC.DYLIB++.args = !gxx ?pipe ?strip ?dylib ?ML *W *archs ?vis ?pic .g .O *D *I !o ?muldefs ?start !i *F *f *L *l *i !a ?end + $(1).GCC.DYLIB++ = $$(call fn.ARGS,$(1).GCC,$$($(1).GCC.DYLIB++.args),$$(1),$$(2)) + + # FUNCTION: C++ link executable + $(1).GCC.EXE++.args = !gxx ?pipe ?strip ?ML *W *archs ?vis ?pic .g .O *D *I !o ?muldefs ?start !i *F *f *L *l *i !a ?end + $(1).GCC.EXE++ = $$(call fn.ARGS,$(1).GCC,$$($(1).GCC.EXE++.args),$$(1),$$(2)) +endef diff --git a/make/include/main.defs b/make/include/main.defs new file mode 100644 index 00000000..c40e2b62 --- /dev/null +++ b/make/include/main.defs @@ -0,0 +1,75 @@ +.DELETE_ON_ERROR: +.SUFFIXES: + +.PHONY: build +build: + +############################################################################### + +include $(PROJECT/)make/include/base.defs +include $(PROJECT/)make/include/contrib.defs +include $(PROJECT/)make/include/function.defs +include $(PROJECT/)make/include/gcc.defs +include $(PROJECT/)make/include/select.defs +include $(PROJECT/)make/include/target.defs +include $(PROJECT/)make/include/tool.defs + +############################################################################### + +MODULES += contrib/a52dec + +ifneq (,$(filter $(BUILD.system),cygwin)) + MODULES += contrib/bzip2 +endif + +MODULES += contrib/faac +MODULES += contrib/faad2 +MODULES += contrib/ffmpeg +MODULES += contrib/lame +MODULES += contrib/libdca +MODULES += contrib/libdvdread +MODULES += contrib/libmkv +MODULES += contrib/libmp4v2 +MODULES += contrib/libogg +MODULES += contrib/libsamplerate +MODULES += contrib/libtheora +MODULES += contrib/libvorbis +MODULES += contrib/mpeg2dec +MODULES += contrib/x264 +MODULES += contrib/xvidcore + +ifneq (,$(filter $(BUILD.system),cygwin)) + MODULES += contrib/zlib +endif + +## these must come after contrib since some contrib modules are optional +MODULES += libhb + +############################################################################### + +## test module is replaced with macosx when Darwin+Xcode +ifneq (,$(filter $(BUILD.system),darwin)) + ifeq (1,$(FEATURE.xcode)) + MODULES += macosx + else + MODULES += test + endif +else + MODULES += test +endif + +ifneq (,$(filter $(BUILD.system),linux)) + ifeq (1,$(FEATURE.gtk)) + MODULES += gtk + endif +endif + +############################################################################### + +MODULES += doc + +############################################################################### + +include $(MODULES:%=$(PROJECT/)%/module.defs) +include $(PROJECT/)make/variant/$(HOST.system).defs +-include $(PROJECT/)make/variant/$(HOST.system).$(BUILD.proc).defs diff --git a/make/include/main.rules b/make/include/main.rules new file mode 100644 index 00000000..f46d2239 --- /dev/null +++ b/make/include/main.rules @@ -0,0 +1,39 @@ +## only included using special report targets +ifneq (,$(REPORT)) + include $(PROJECT/)make/include/report.defs +endif + +############################################################################### + +.PHONY: clean xclean doc report + +clean: +xclean: contrib.xclean clean +doc: +report:: report.main report.modules + +## legacy +mrproper: xclean + +############################################################################### + +include $(MODULES:%=$(PROJECT/)%/module.rules) +include $(PROJECT/)make/variant/$(HOST.system).rules +-include $(PROJECT/)make/variant/$(HOST.system).$(BUILD.proc).rules + +############################################################################### + +## target which causes re-configure if project-root is svn update'd +$(BUILD/)GNUmakefile: $(wildcard $(PROJECT/).svn/entries) + $(PROJECT/)configure $(CONF.args) + +## target useful to force reconfigure; only helpful for build-system development +.PHONY: reconfigure +reconfigure: + $(PROJECT/)configure $(CONF.args) + +############################################################################### + +## target to build all dependency dirs +$(sort $(dir $(BUILD.out))): + $(MKDIR.exe) -p $@ diff --git a/make/include/report.defs b/make/include/report.defs new file mode 100644 index 00000000..6ff71dc9 --- /dev/null +++ b/make/include/report.defs @@ -0,0 +1,53 @@ +## function: print a var's name, definition and expanded value +## +## $(1) = name of variable +## +define fn.PRINTVAR + +$(1) + ORIGIN = $(origin $(1)) + FLAVOR = $(flavor $(1)) + DEFINITION = $(value $(1)) + EXPANDED = $($(1)) +endef + +## report: module +## +## REPORT.module = module name (uppercase) +## +ifeq (module,$(REPORT)) +$(info ###############################################################################) +$(info ##) +$(info ## MODULE: $(REPORT.module)) +$(info ##) +$(info ###############################################################################) +$(info $(foreach v,$(sort $(filter $(REPORT.module).%,$(.VARIABLES))),$(call fn.PRINTVAR,$v))) +$(info ) +endif + +## report: main +## +ifeq (main,$(REPORT)) +$(info ###############################################################################) +$(info ##) +$(info ## MAIN) +$(info ##) +$(info ###############################################################################) +$(info $(foreach v,$(sort $(filter HB.%,$(.VARIABLES))),$(call fn.PRINTVAR,$v))) +$(info $(foreach v,$(sort $(filter HOST.%,$(.VARIABLES))),$(call fn.PRINTVAR,$v))) +$(info $(foreach v,$(sort $(filter BUILD.%,$(.VARIABLES))),$(call fn.PRINTVAR,$v))) +$(info $(foreach v,$(sort $(filter CONTRIB.%,$(.VARIABLES))),$(call fn.PRINTVAR,$v))) +$(info ) +endif + +## report: gcc +## +ifeq (gcc,$(REPORT)) +$(info ###############################################################################) +$(info ##) +$(info ## GCC) +$(info ##) +$(info ###############################################################################) +$(info $(foreach v,$(sort $(filter GCC.%,$(.VARIABLES))),$(call fn.PRINTVAR,$v))) +$(info ) +endif diff --git a/make/include/select.defs b/make/include/select.defs new file mode 100644 index 00000000..32a65252 --- /dev/null +++ b/make/include/select.defs @@ -0,0 +1,12 @@ +## +## fetch a file from the web via well-known anonymous protocols such as HTTP. +## +## $(1) = output filename +## $(2) = URL +## +FETCH = $(FETCH.$(FETCH.select)) + +FETCH.select = MISSING +FETCH.MISSING = $(error one of the following tools is required: wget, curl) +FETCH.curl = $(CURL.exe) -q -L -o $(1) $(2) +FETCH.wget = $(WGET.exe) -O $(1) $(2) diff --git a/make/include/target.defs b/make/include/target.defs new file mode 100644 index 00000000..64bdde43 --- /dev/null +++ b/make/include/target.defs @@ -0,0 +1,14 @@ +TARGET.dylib.prefix = lib +TARGET.dylib.suffix = +TARGET.dylib.ext = .dylib +TARGET.dylib = $(TARGET.dylib.prefix)$(1)$(TARGET.dylib.suffix)$(TARGET.dylib.ext) + +TARGET.archive.prefix = lib +TARGET.archive.suffix = +TARGET.archive.ext = .a +TARGET.archive = $(TARGET.archive.prefix)$(1)$(TARGET.archive.suffix)$(TARGET.archive.ext) + +TARGET.exe.prefix = +TARGET.exe.suffix = +TARGET.exe.ext = +TARGET.exe = $(TARGET.exe.prefix)$(1)$(TARGET.exe.suffix)$(TARGET.exe.ext) diff --git a/make/include/tool.defs b/make/include/tool.defs new file mode 100644 index 00000000..0ccccd72 --- /dev/null +++ b/make/include/tool.defs @@ -0,0 +1,10 @@ +AR.exe = ar +CP.exe = cp +CURL.exe = curl +M4.exe = m4 +MKDIR.exe = mkdir +PATCH.exe = patch +RM.exe = rm +TAR.exe = tar +TOUCH.exe = touch +WGET.exe = wget diff --git a/make/variant/cygwin.defs b/make/variant/cygwin.defs new file mode 100644 index 00000000..bab73c6c --- /dev/null +++ b/make/variant/cygwin.defs @@ -0,0 +1,8 @@ +GCC.muldefs = 1 +GCC.start = 1 +GCC.end = 1 + +GCC.args.g.none = -g0 +GCC.args.g.min = -g1 +GCC.args.g.default = -g2 +GCC.args.g.max = -g3 diff --git a/make/variant/darwin.defs b/make/variant/darwin.defs new file mode 100644 index 00000000..6f8f6729 --- /dev/null +++ b/make/variant/darwin.defs @@ -0,0 +1,61 @@ +## UB build support +## +## PROCEDURE: +## +## 1. Perform a build (let us call it arch-X). +## 2. cd into arch-X's build/ driectory. +## 3. Launch builds of the remaining architectures. +## We compute $(UB.archs.other) to be the remaining archs to build. +## The entire list is defined $(UB.archs) . +## 4. Combine other architectures into arch-X's binaries. +## +## EXAMPLE: serial method, archs: i386,x86_64,ppc,ppc64 +## +## ./configure --launch +## cd build/ +## make ub.build.serial +## make ub.combine +## +## EXAMPLE: parallel method, archs: i386,x86_64,ppc,ppc64 +## +## ./configure --launch +## cd build/ +## make ub.build.parallel +## make ub.combine +## +## EXAMPLE: serial, archs: i386,x86_64 (assuming i386 is native) +## +## ./configure --launch +## cd build/ +## make ub.build.parallel UB.archs="i386 x86_64" +## make ub.combine UB.archs="i386 x86_64" +## +UB.archs = i386 x86_64 ppc ppc64 +UB.archs.other = $(filter-out $(BUILD.arch),$(UB.archs)) +UB.builds = $(wildcard $(foreach n,$(UB.archs.other),$(PROJECT/)build.$n)) + +UB.BUILD = $(PROJECT/)configure --launch --launch-dir=ub.$(1) --arch=$(1) + +## linefeed is important +define UB.BUILD.item + $(call UB.BUILD,$(1)) + +endef + +define UB.BUILD.SERIAL + $(foreach n,$(UB.archs.other),$(call UB.BUILD.item,$n)) +endef + +define UB.BUILD.PARALLEL + $(call UB.BUILD,$(1)) 2>&1 > ub.$(1).log +endef + +define UB.COMBINE + $(RM.exe) -fr ub.combine + $(MKDIR.exe) -p ub.combine + $(CP.exe) -R HandBrake.app ub.combine/. + lipo $(1) $(foreach n,$(UB.archs.other),ub.$n/$(1)) -create -output ub.combine/$(1) + @echo "" + @sync; lipo -info ub.combine/$(1) + @du -sh ub.combine/$(1) +endef diff --git a/make/variant/darwin.rules b/make/variant/darwin.rules new file mode 100644 index 00000000..c4f4f97a --- /dev/null +++ b/make/variant/darwin.rules @@ -0,0 +1,20 @@ +.PHONY: ub.build ub.combine ub.clean + +ub.build.serial: + @$(UB.BUILD.SERIAL) + +ub.build.parallel: + @set -e; \ + for arch in $(UB.archs.other); do \ + $(call UB.BUILD.PARALLEL,$$arch) & \ + children="$$children $$!"; \ + echo "pid $$!: $(call UB.BUILD.PARALLEL,$$arch)"; \ + done; \ + echo "waiting for background jobs to complete:$$children"; \ + wait + +ub.combine: + $(call UB.COMBINE,HandBrake.app/Contents/MacOS/HandBrake) + +ub.clean: + $(RM.EXE) -fr $(foreach n,$(UB.archs.other),ub.$n) diff --git a/make/variant/darwin.x86_64.defs b/make/variant/darwin.x86_64.defs new file mode 100644 index 00000000..c6e85647 --- /dev/null +++ b/make/variant/darwin.x86_64.defs @@ -0,0 +1,3 @@ +## can enable asm if we replace .rept pseudo op with standard pre-processor macros +## since darwin's as doesn't support them. for now just disable. +LIBTHEORA.CONFIGURE.extra += --disable-asm diff --git a/make/variant/freebsd.defs b/make/variant/freebsd.defs new file mode 100644 index 00000000..c58706ba --- /dev/null +++ b/make/variant/freebsd.defs @@ -0,0 +1,4 @@ +TARGET.dylib.ext = .so + +GCC.args.dylib = -shared +GCC.args.pic = 1 diff --git a/make/variant/linux.defs b/make/variant/linux.defs new file mode 100644 index 00000000..f0babe87 --- /dev/null +++ b/make/variant/linux.defs @@ -0,0 +1,11 @@ +TARGET.dylib.ext = .so + +GCC.start = 1 +GCC.end = 1 +GCC.args.dylib = -shared +GCC.args.pic = 1 + +GCC.args.g.none = -g0 +GCC.args.g.min = -g1 +GCC.args.g.default = -g2 +GCC.args.g.max = -g3 diff --git a/test/BUILDSHARED b/test/BUILDSHARED deleted file mode 100644 index 6b33fb90..00000000 --- a/test/BUILDSHARED +++ /dev/null @@ -1,36 +0,0 @@ -To test the HandBrake dylib on MacOs X issue the following commands: -=================================================================== - -cp ../libhb/libhb.dylib . -gcc -I../libhb -L. -lhb test.c -o test -arch i386 -arch ppc -install_name_tool -change /usr/local/lib/libhb.dylib @executable_path/libhb.dylib test - -Validate that the test Binary is really using the shared library - -otool -L test - ------------------------------------------------------------------------- - -To test the HandBrake .so on Linux issue the following commands: -================================================================ - -cp ../libhb/libhb.so . -gcc -I../libhb -L. -lhb test.c -o test -lz -lpthread - -Validate that the test Binary is really using the shared library - -ldd test - ------------------------------------------------------------------------- - -To test the HandBrake .dll on cygwin issue the following commands: -================================================================== - -cp ../libhb/libhb.dll . -gcc -I../libhb -L. -lhb test.c -o test -lz -lpthread - -The resulting binary test should depend on the cygwin dll and the hb dll. - -I works like that but wasn't tested yet outside of cygwin. - ------------------------------------------------------------------------- diff --git a/test/Makefile b/test/Makefile deleted file mode 100644 index 219d594d..00000000 --- a/test/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -SYSTEM = $(shell uname -s) - -LIBS = a52 mkv avformat avcodec avutil dca dvdread faac mp3lame mpeg2 vorbis \ - vorbisenc ogg samplerate x264 xvidcore mp4v2 swscale theora faad - -CYGLIBS = zlib bzip2 - -all: ../HandBrakeCLI - -CFLAGS += -I../libhb -CXXFLAGS += -I../libhb -LIBS2 = ../libhb/libhb.a $(LIBS:%=../contrib/lib/lib%.a) - -ifeq ($(findstring CYGWIN_NT,$(SYSTEM)),CYGWIN_NT) - LIBS2 += $(CYGLIBS:%=../contrib/lib/libz.a) $(CYGLIBS:%=../contrib/lib/libbz2.a) -endif - -LDFLAGS += $(LIBS2) -lbz2 -ldl - -../HandBrakeCLI: test.c parsecsv.c $(LIBS2) - @CMD="$(CC) $(CFLAGS) -o test.o -c test.c"; $$CMD || \ - ( echo "Compile line for $@ was:"; echo $$CMD; false ) - @CMD="$(CC) $(CFLAGS) -o parsecsv.o -c parsecsv.c"; $$CMD || \ - ( echo "Compile line for $@ was:"; echo $$CMD; false ) - @echo "Link HandBrakeCLI" - @CMD="g++ $(CXXFLAGS) -o ../HandBrakeCLI test.o parsecsv.o $(LDFLAGS) -lz -lpthread"; $$CMD || \ - ( echo "Compile line for $@ was:"; echo $$CMD; false ) - @CMD="rm -rf ../plugins ; mkdir ../plugins ; cp ../contrib/lib/libquicktime/* ../plugins"; $$CMD - - -clean: - @echo "Clean HandBrakeCLI" - @$(RM) ../HandBrakeCLI - @$(RM) ../HandBrakeCLI.exe - @$(RM) *.o - diff --git a/test/module.defs b/test/module.defs new file mode 100644 index 00000000..3eda7950 --- /dev/null +++ b/test/module.defs @@ -0,0 +1,41 @@ +$(eval $(call import.MODULE.defs,TEST,test,LIBHB)) +$(eval $(call import.GCC,TEST)) + +TEST.src/ = $(PROJECT/)test/ +TEST.build/ = $(BUILD/)test/ + +TEST.c = $(wildcard $(TEST.src/)*.c) +TEST.c.o = $(patsubst $(PROJECT/)%.c,$(BUILD/)%.o,$(TEST.c)) + +TEST.exe = $(BUILD/)$(call TARGET.exe,$(HB.name)CLI) + +TEST.libs = $(LIBHB.a) $(foreach n, \ + a52 avcodec avformat avutil dca dvdread faac faad mkv mpeg2 mp3lame mp4v2 \ + ogg samplerate swscale theora vorbis vorbisenc x264 xvidcore, \ + $(CONTRIB.build/)lib/lib$(n).a ) + +## add libs from optional modules +ifeq (1,$(BZIP2.enabled)) + TEST.libs += $(CONTRIB.build/)lib/libbz2.a +endif +ifeq (1,$(ZLIB.enabled)) + TEST.libs += $(CONTRIB.build/)lib/libz.a +endif + +############################################################################### + +TEST.out += $(TEST.c.o) +TEST.out += $(TEST.exe) + +BUILD.out += $(TEST.out) + +############################################################################### + +TEST.GCC.I += $(LIBHB.GCC.I) + +ifeq ($(BUILD.system),darwin) + TEST.GCC.f += IOKit CoreServices + TEST.GCC.l += bz2 z +else ifeq ($(BUILD.system),linux) + TEST.GCC.l += bz2 z pthread dl m +endif diff --git a/test/module.rules b/test/module.rules new file mode 100644 index 00000000..34004b97 --- /dev/null +++ b/test/module.rules @@ -0,0 +1,20 @@ +$(eval $(call import.MODULE.rules,TEST)) + +test.build: $(TEST.exe) + +$(TEST.exe): | $(dir $(TEST.exe)) +$(TEST.exe): $(TEST.c.o) + $(call TEST.GCC.EXE++,$@,$^ $(TEST.libs)) + +$(TEST.c.o): $(LIBHB.a) +$(TEST.c.o): | $(dir $(TEST.c.o)) +$(TEST.c.o): $(BUILD/)%.o: $(PROJECT/)%.c + $(call TEST.GCC.C_O,$@,$<) + +test.clean: + $(RM.exe) -f $(TEST.out) + +############################################################################### + +build: test.build +clean: test.clean diff --git a/test/test.c b/test/test.c index 2c24d4c3..0fd39f52 100644 --- a/test/test.c +++ b/test/test.c @@ -2217,20 +2217,19 @@ static int ParseOptions( int argc, char ** argv ) break; case 'i': input = strdup( optarg ); - #ifdef __APPLE_CC__ - char *devName = bsd_name_for_path( input ); - if( devName == NULL ) - { - break; - } - if( device_is_dvd( devName ) ) +#ifdef __APPLE_CC__ + char *devName = bsd_name_for_path( input ); // alloc + if( devName ) { - char *newInput = malloc( strlen("/dev/") + strlen( devName ) + 1); - sprintf( newInput, "/dev/%s", devName ); - free(input); - input = newInput; + if( device_is_dvd( devName )) + { + free( input ); + input = malloc( strlen( "/dev/" ) + strlen( devName ) + 1 ); + sprintf( input, "/dev/%s", devName ); + } + free( devName ); } - #endif +#endif break; case 'o': output = strdup( optarg ); @@ -2711,10 +2710,20 @@ static char* bsd_name_for_path(char *path) return NULL; } - // A version 4 GetVolParmsInfoBuffer contains the BSD node name in the - // vMDeviceID field. It is actually a char * value. This is mentioned in the - // header CoreServices/CarbonCore/Files.h. - return volumeParms.vMDeviceID; + // A version 4 GetVolParmsInfoBuffer contains the BSD node name in the vMDeviceID field. + // It is actually a char * value. This is mentioned in the header CoreServices/CarbonCore/Files.h. + if( volumeParms.vMVersion < 4 ) + { + return NULL; + } + + // vMDeviceID might be zero as is reported with experimental ZFS (zfs-119) support in Leopard. + if( !volumeParms.vMDeviceID ) + { + return NULL; + } + + return strdup( volumeParms.vMDeviceID ); } /**************************************************************************** -- 2.11.0