diff -Nru python-debian-0.1.21+nmu2ubuntu2/debian/changelog python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/changelog --- python-debian-0.1.21+nmu2ubuntu2/debian/changelog 2014-02-23 13:51:07.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/changelog 2015-07-22 13:44:54.000000000 +0000 @@ -1,3 +1,127 @@ +python-debian (0.1.27ubuntu1~ubuntu14.04.1~ppa1) trusty; urgency=medium + + * No-change backport to trusty + + -- Colin Watson Wed, 22 Jul 2015 14:44:54 +0100 + +python-debian (0.1.27ubuntu1) wily; urgency=medium + + * Resynchronise with Debian. Remaining changes: + - Add .lzma as a possible extension for data.tar. Note that this does + not mean that reading from the .lzma part is supported. This is + blocked on http://bugs.python.org/issue5689. + + -- Colin Watson Wed, 22 Jul 2015 14:11:03 +0100 + +python-debian (0.1.27) unstable; urgency=medium + + * Tighten whitespace handling in GPG Armor Header lines, with thanks to + Guillem Jover for the patch (Closes: #782276). + + -- Stuart Prescott Wed, 15 Apr 2015 00:53:27 +1000 + +python-debian (0.1.26) unstable; urgency=medium + + * Fix FTBFS with binutils >= 2.25-6 by turning off determinism in ar + archives when building archives in the test suite, thanks to Dmitry + Shachnev for the patch (Closes: #781543). + * Require binutils >= 2.23 for building and in the autopkgtest tests to + ensure that ar understands the option to suppress determinism. + + -- Stuart Prescott Sat, 04 Apr 2015 00:39:02 +1100 + +python-debian (0.1.25) unstable; urgency=medium + + * deb822: More encoding gymnastics to support parsing signed files + opened in text mode (Closes: #764380). + + -- John Wright Tue, 21 Oct 2014 22:32:26 -0700 + +python-debian (0.1.24) unstable; urgency=medium + + * copyright module: make Copyright objects iterable + * debian_support.list_releases(): update release list (Closes: #758027) + + -- Stefano Zacchiroli Wed, 01 Oct 2014 16:41:15 +0200 + +python-debian (0.1.23) unstable; urgency=medium + + [ Stuart Prescott ] + * Add sha512 sums to Release and Sources (Closes: #732599). + * Use warnings rather than stderr in PkgRelation (Closes: #712513). + * Expose the list of bugs closed by a changelog entry; thanks to Jelmer + Vernooi and Stefano Rivera for patches (Closes: #634848). + * Add support for .deb with uncompressed data.tar member (Closes: #718355). + * Prefer the internal parser rather than apt's TagFile for processing deb822 + files unless explicitly called to process Packages or Sources files: + - prevents paragraph parsing truncating on comments (Closes: #743174). + - fix parsing of paragraphs when separated by more whitespace than just a + newline (Closes: #655988). (Finally fixing interactions with devscripts' + wrap-and-sort!) + * Parse foreign architecture (package:any) relationships and also other + multi-arch related relationships (Closes: #670679) + * Parse build-profiles syntax. + + [ John Wright ] + * Fix a GPG validation bug. With some trailing whitespace, the code + could be tricked into validating a signature, but using the bogus + data after the signed section (Closes: #695932). + * Drop support for python2.5. (This allows us to do fewer import hacks + in deb822, and probably other modules as well.) + * Add a deb822.RestrictedWrapper class, for exposing read-only access + to a Deb822 instance's field values as strings, while restricting + write access to some fields, which are exposed via properties. + * deb822.Deb822Dict.dump: Add a text_mode parameter for dumping to + file(-like) objects that assume text/unicode input. + * Add a copyright module, for parsing machine-readable debian/copyright + files (Closes: #671485). + * Make deb822 tests hermetic with respect to debian-keyring updates + (Closes: #760488). + + -- John Wright Wed, 10 Sep 2014 23:18:38 -0700 + +python-debian (0.1.22ubuntu1) utopic; urgency=medium + + * Merge with Debian; remaining changes: + - Add .lzma as a possible extension for data.tar. Note that this does + not mean that reading from the .lzma part is supported. This is + blocked on http://bugs.python.org/issue5689. + + -- Matthias Klose Tue, 05 Aug 2014 17:28:46 +0200 + +python-debian (0.1.22) unstable; urgency=low + + [ John Wright ] + * Acknowledge NMUs. (Thanks for your work, Colin and Fathi!) + * arfile.ArFile.extractfile: Return a matching member even if it is + not the first one in the archive. Thanks to Mika Eloranta for the + report and patch. (Closes: #689313) + * deb822.Deb822.iter_paragraphs: Actually work with string input. + Thanks to Stefano Rivera for the patch. (Closes: #647455) + + [ Stuart Prescott ] + * Add myself to Uploaders. + * Change Vcs-* URLs to canonical locations. + * Switch build system to short form dh and pybuild. + * Use nose to run test suite. + * Add autopkgtest test suite. + + [ John Wright ] + * python_support: Avoid hashlib dependency, using the built-in _sha or + _sha1 module (depending on Python version) instead. That way we + don't link in OpenSSL, which has an incompatible license. + (Closes: 747031) + + -- John Wright Wed, 11 Jun 2014 02:25:21 -0700 + +python-debian (0.1.21+nmu3) unstable; urgency=medium + + * Non-maintainer upload. + * Add support for xz-compressed packages. (Closes: #506861) + * Byte-compile python modules for python3-debian. (Closes: #709935) + + -- Fathi Boudra Tue, 29 Apr 2014 20:32:47 +0300 + python-debian (0.1.21+nmu2ubuntu2) trusty; urgency=medium * Rebuild to drop files installed into /usr/share/pyshared. diff -Nru python-debian-0.1.21+nmu2ubuntu2/debian/clean python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/clean --- python-debian-0.1.21+nmu2ubuntu2/debian/clean 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/clean 2014-08-02 02:32:22.000000000 +0000 @@ -0,0 +1 @@ +README.debtags diff -Nru python-debian-0.1.21+nmu2ubuntu2/debian/compat python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/compat --- python-debian-0.1.21+nmu2ubuntu2/debian/compat 2012-01-12 23:42:27.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/compat 2014-08-02 02:32:22.000000000 +0000 @@ -1 +1 @@ -5 +9 diff -Nru python-debian-0.1.21+nmu2ubuntu2/debian/control python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/control --- python-debian-0.1.21+nmu2ubuntu2/debian/control 2012-09-05 10:37:05.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/control 2015-07-22 13:11:03.000000000 +0000 @@ -3,26 +3,53 @@ Priority: optional Maintainer: Ubuntu Developers XSBC-Original-Maintainer: Debian python-debian Maintainers -Uploaders: Adeodato Simó , +Uploaders: + Adeodato Simó , Enrico Zini , James Westby , Reinhard Tartler , Stefano Zacchiroli , - John Wright -Build-Depends: debhelper (>= 5.0.37.2), python (>= 2.6.6-3~), python3 (>= 3.1.2-8~), python-setuptools, python3-setuptools, python-chardet, python3-chardet, python-six, python3-six -Standards-Version: 3.8.4 -Vcs-Browser: http://git.debian.org/?p=pkg-python-debian/python-debian.git -Vcs-Git: git://git.debian.org/git/pkg-python-debian/python-debian.git -X-Python-Version: >= 2.5 + John Wright , + Stuart Prescott +Build-Depends: + binutils (>= 2.23), + debhelper (>= 9), + dh-python, + python-all (>= 2.6.6-3~), + python-apt, + python-chardet, + python-nose, + python-setuptools, + python-six (>> 1.4~), + python3-all (>= 3.1.2-8~), + python3-apt, + python3-chardet, + python3-nose, + python3-setuptools, + python3-six (>> 1.4~) +Standards-Version: 3.9.5 +Vcs-Browser: http://anonscm.debian.org/gitweb/?p=pkg-python-debian/python-debian.git +Vcs-Git: git://anonscm.debian.org/pkg-python-debian/python-debian.git +X-Python-Version: >= 2.6 +XS-Testsuite: autopkgtest Package: python-debian Architecture: all -Depends: ${python:Depends}, ${misc:Depends}, python-chardet, python-six -Recommends: python-apt -Suggests: gpgv -Provides: python-deb822 -Conflicts: python-deb822 -Replaces: python-deb822 +Depends: + python-chardet, + python-six (>> 1.4~), + ${misc:Depends}, + ${python:Depends} +Recommends: + python-apt +Suggests: + gpgv +Provides: + python-deb822 +Conflicts: + python-deb822 +Replaces: + python-deb822 Description: Python modules to work with Debian-related data formats This package provides Python modules that abstract many formats of Debian related files. Currently handled are: @@ -37,9 +64,15 @@ Package: python3-debian Architecture: all -Depends: ${python3:Depends}, ${misc:Depends}, python3-chardet, python3-six -Recommends: python3-apt -Suggests: gpgv +Depends: + python3-chardet, + python3-six (>> 1.4~), + ${misc:Depends}, + ${python3:Depends} +Recommends: + python3-apt +Suggests: + gpgv Description: Python 3 modules to work with Debian-related data formats This package provides Python 3 modules that abstract many formats of Debian related files. Currently handled are: @@ -51,4 +84,3 @@ (debian.deb822 module) * Raw .deb and .ar files, with (read-only) access to contained files and meta-information - diff -Nru python-debian-0.1.21+nmu2ubuntu2/debian/copyright python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/copyright --- python-debian-0.1.21+nmu2ubuntu2/debian/copyright 2012-01-12 23:42:27.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/copyright 2014-10-22 08:37:11.000000000 +0000 @@ -1,39 +1,102 @@ -This package was debianized by James Westby on -Wed, 16 Aug 2006 19:17:30 +0100. - -The original source can always be found at: - ftp://ftp.debian.org/dists/unstable/main/source/ - -Copyright: - - deb822.py is Copyright (C) 2005-2006 dann frazier - 2006 John Wright - - changelog.py, setup.py, README.Changelog and the contents of - examples/changelog/ are - Copyright (C) 2006-7 James Westby - Copyright (C) 2008 Canonical Ltd. - - debian_support.py is Copyright (C) 2005 Florian Weimer - - Debtags.py, and the contents of examples/debtags/ are - Copyright (C) 2003--3006 Enrico Zini - - debfile.py, arfile.py, and examples/debfile/* are - Copyright (C) 2007 Stefano Zacchiroli - 2007 Filippo Giunchedi - -Licenses: - - The following modules are released under GPL v2 or above: - changelog.py, debian_support.py, deb822.py - The following modules are released under GPL v3 or above: - debfile.py, arfile.py, debtags.py - - The Debian packaging is (C) Debian python-debian Maintainers (see - debian/control for maintainer names), and is placed under GPL v2 or - above. - -On Debian systems, the complete text of the GNU General Public License -can be found in `/usr/share/common-licenses/GPL'. - +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: python-debian +Upstream-Contact: pkg-python-debian-maint@lists.alioth.debian.org +Source: http://anonscm.debian.org/cgit/pkg-python-debian/python-debian.git + +Files: * +Copyright: Debian python-debian Maintainers (see debian/control for maintainer names) +License: GPL-2+ + +Files: lib/deb822.py lib/debian/deb822.py tests/test_deb822.py +Copyright: Copyright (C) 2005-2006 dann frazier + Copyright (C) 2006-2010 John Wright + Copyright (C) 2006 Adeodato Simó + Copyright (C) 2008 Stefano Zacchiroli + Copyright (C) 2014 Google, Inc. +License: GPL-2+ + +Files: + examples/changelog/* + lib/debian/changelog.py + README.changelog + setup.py.in + tests/test_changelog.py +Copyright: Copyright (C) 2006-2007 James Westby + Copyright (C) 2008 Canonical Ltd. +License: GPL-2+ +Comment: lib/debian/changelog.py's parsing code is based on that from dpkg which is: + Copyright 1996 Ian Jackson + Copyright 2005 Frank Lichtenheld + and licensed under the same license. + +Files: + lib/debian/debian_support.py + tests/test_debian_support.py +Copyright: Copyright (C) 2005 Florian Weimer + Copyright (C) 2006-2007 James Westby + Copyright (C) 2010 John Wright +License: GPL-2+ + +Files: + examples/debtags/* + lib/debian/debtags.py + lib/debian/doc-debtags + tests/test_debtags.py +Copyright: Copyright (C) 2003-2007 Enrico Zini +License: GPL-3+ + +Files: + examples/debfile/* + lib/debian/arfile.py + lib/debian/debfile.py + tests/test_debfile.py +Copyright: Copyright (C) 2007-2008 Stefano Zacchiroli + Copyright (C) 2007 Filippo Giunchedi +License: GPL-3+ + +Files: + lib/debian/deprecation.py +Copyright: Copyright (C) Ben Finney +License: GPL-2+ + +Files: + examples/copyright/* + lib/debian/copyright.py + tests/test_copyright.py +Copyright: Copyright (C) 2014 Google, Inc. +License: GPL-2+ + +License: GPL-2+ + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 2 + of the License, or (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + . + On Debian systems, the complete text of the GNU General Public License + version 2 can be found in `/usr/share/common-licenses/GPL-2'. + +License: GPL-3+ + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . + . + On Debian systems, the complete text of the GNU General Public License + version 3 can be found in `/usr/share/common-licenses/GPL-3'. diff -Nru python-debian-0.1.21+nmu2ubuntu2/debian/rules python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/rules --- python-debian-0.1.21+nmu2ubuntu2/debian/rules 2012-08-22 15:26:15.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/rules 2014-10-09 22:45:12.000000000 +0000 @@ -4,86 +4,42 @@ # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 +# tell pybuild which module to install into the packages +export PYBUILD_NAME=debian + VERSION := $(shell dpkg-parsechangelog | grep '^Version: ' | awk '{print $$2}') +%: + dh $@ --with python2,python3 --buildsystem pybuild + %.py: %.py.in sed -e 's/__CHANGELOG_VERSION__/$(VERSION)/' < $< > $@ -build: build-stamp -build-stamp: setup.py - dh_testdir - - # Add here commands to compile the package. - python setup.py build - python3 setup.py build - - # run the tests - cd tests && ./test_deb822.py - cd tests && ./test_debfile.py - cd tests && ./test_debtags.py - cd tests && ./test_changelog.py - cd tests && ./test_debian_support.py - cd tests && python3 ./test_deb822.py - cd tests && python3 ./test_debfile.py - cd tests && python3 ./test_debtags.py - cd tests && python3 ./test_changelog.py - cd tests && python3 ./test_debian_support.py +override_dh_auto_clean: setup.py + dh_auto_clean +override_dh_auto_build: setup.py + dh_auto_build lib/debian/doc-debtags > README.debtags - touch $@ +override_dh_auto_test: + # don't run the tests if suppressed with DEB_BUILD_OPTIONS=nocheck +ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) + # run all the tests with both a UTF-8 aware locale and a non-UTF-8 + # aware locale to catch errors related to encoding. + LC_ALL=C nosetests --verbose --exe --where tests + LC_ALL=C.UTF-8 nosetests --verbose --exe --where tests + LC_ALL=C nosetests3 --verbose --exe --where tests + LC_ALL=C.UTF-8 nosetests3 --verbose --exe --where tests +endif + +override_dh_auto_install: + dh_auto_install + # setuputils may produce different files for different versions of + # python and dh_python3 will leave them behind. + rm -rf $(CURDIR)/*/usr/lib/python3.* -clean: setup.py - dh_testdir - dh_testroot - rm -f build-stamp - - # Add here commands to clean up after the build process. - python setup.py clean - python3 setup.py clean - rm -rf lib/python_debian.egg-info - rm -rf build/ - rm -f README.debtags - rm -f setup.py - find lib/debian -type f -name '*.pyc' -exec rm {} \; - - dh_clean - -install: build - dh_testdir - dh_testroot - dh_clean - dh_installdirs - - # Add here commands to install the package into debian/tmp - python setup.py install --root="$(CURDIR)/debian/python-debian" --no-compile --install-layout=deb - python3 setup.py install --root="$(CURDIR)/debian/python3-debian" --no-compile --install-layout=deb - - -# Build architecture-independent files here. -binary-indep: build install - dh_testdir - dh_testroot - dh_installchangelogs - dh_installdocs - dh_installexamples +override_dh_installexamples: # TODO: Enrico would like to keep wxssearch out of the package # but so far, he has no better place for it - #rm "$(CURDIR)/debian/python-debian/usr/share/doc/python-debian/examples/wxssearch" - rm "$(CURDIR)/debian/python-debian/usr/share/doc/python-debian/examples/debtags/wxssearch" -# dh_install - dh_compress -Xexamples - dh_fixperms - dh_python2 - dh_installdeb - dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb - -# Build architecture-dependent files here. -binary-arch: build install -# We have nothing to do by default. - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install + dh_installexamples -X wxssearch diff -Nru python-debian-0.1.21+nmu2ubuntu2/debian/tests/control python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/tests/control --- python-debian-0.1.21+nmu2ubuntu2/debian/tests/control 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/tests/control 2015-04-03 13:30:42.000000000 +0000 @@ -0,0 +1,19 @@ +Tests: python3-debian +Restrictions: allow-stderr needs-recommends +Depends: + binutils (>= 2.23), + python3-all, + python3-nose, + python3-debian, + debian-keyring, + debian-archive-keyring + +Tests: python-debian +Restrictions: allow-stderr needs-recommends +Depends: + binutils (>= 2.23), + python2.7, + python-nose, + python-debian, + debian-keyring, + debian-archive-keyring diff -Nru python-debian-0.1.21+nmu2ubuntu2/debian/tests/python3-debian python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/tests/python3-debian --- python-debian-0.1.21+nmu2ubuntu2/debian/tests/python3-debian 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/tests/python3-debian 2014-10-09 22:46:00.000000000 +0000 @@ -0,0 +1,10 @@ +#!/bin/sh +set -e -u -x +cp -r tests/ "$ADTTMP" +cd "$ADTTMP/tests/" +export PYTHONWARNINGS=d +for py in $(py3versions -i); do + # text mode file opening is locale dependent so try both ASCII and UTF-8 + LC_ALL=C $py /usr/bin/nosetests3 --verbose --exe + LC_ALL=C.UTF-8 $py /usr/bin/nosetests3 --verbose --exe +done diff -Nru python-debian-0.1.21+nmu2ubuntu2/debian/tests/python-debian python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/tests/python-debian --- python-debian-0.1.21+nmu2ubuntu2/debian/tests/python-debian 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/debian/tests/python-debian 2014-10-09 22:46:00.000000000 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh +set -e -u -x +cp -r tests/ "$ADTTMP" +cd "$ADTTMP/tests/" +export PYTHONWARNINGS=d +# test suite requires python2.7 +LC_ALL=C python2.7 /usr/bin/nosetests --verbose --exe +LC_ALL=C.UTF-8 python2.7 /usr/bin/nosetests --verbose --exe diff -Nru python-debian-0.1.21+nmu2ubuntu2/examples/copyright/check_parse_and_dump.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/copyright/check_parse_and_dump.py --- python-debian-0.1.21+nmu2ubuntu2/examples/copyright/check_parse_and_dump.py 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/copyright/check_parse_and_dump.py 2014-10-22 08:37:11.000000000 +0000 @@ -0,0 +1,120 @@ +#!/usr/bin/python + +# vim: fileencoding=utf-8 +# +# Copyright (C) 2014 Google, Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation, either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Check the format and dumpability of debian/copyright filenames on stdin. + +Usage: + + find /tmp/packages -type f -name copyright | ./check_parse_and_dump.py + +The --suppress_warnings and --summary flags can be used to make the program +output less verbose. +""" + +import argparse +import codecs +import io +import sys +import warnings + +from debian import copyright + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('--summary', action='store_true', + help='Whether to print only a summary') + parser.add_argument('--suppress_warnings', action='store_true', + help='Whether to suppress copyright warnings') + return parser.parse_args() + + +def main(): + args = parse_args() + + if args.suppress_warnings: + warnings.filterwarnings('ignore', module='debian.copyright') + + problems = {} + parse_failures = [] + dump_failures = [] + + total = 0 + for filename in sys.stdin: + total += 1 + filename = filename.rstrip() + with io.open(filename, mode='rt', encoding='utf-8') as f: + try: + c = copyright.Copyright(f) + except Exception as e: + problems.setdefault((1, 'Parse failures'), []).append( + (filename, e)) + continue + + try: + c.dump() + except Exception as e: + problems.setdefault((2, 'Dump failures'), []).append( + (filename, e)) + + if not c.header.known_format(): + problems.setdefault((3, 'Unknown format'), []).append( + (filename, c.header.format)) + + invalid_globs = [] + globs_with_leading_dot_slash = [] + globs_with_trailing_comma = [] + globs_with_double_star = [] + for p in c.all_files_paragraphs(): + try: + p.files_pattern() + except Exception as e: + invalid_globs.append(e) + for glob in p.files: + if glob.startswith('./'): + globs_with_leading_dot_slash.append(glob) + if glob.endswith(','): + globs_with_trailing_comma.append(glob) + if '**' in glob: + globs_with_double_star.append(glob) + + if invalid_globs: + problems.setdefault((4, 'Invalid glob'), []).append( + (filename, invalid_globs)) + if globs_with_leading_dot_slash: + problems.setdefault((5, 'Globs with leading ./'), []).append( + (filename, globs_with_leading_dot_slash)) + if globs_with_trailing_comma: + problems.setdefault((6, 'Globs with trailing ,'), []).append( + (filename, globs_with_trailing_comma)) + if globs_with_double_star: + problems.setdefault((7, 'Globs with **'), []).append( + (filename, globs_with_double_star)) + + f = codecs.getwriter(encoding='utf-8')(sys.stdout) + for (_, heading), problems in sorted(problems.items()): + f.write('\n%s: (%d / %d)\n' % (heading, len(problems), total)) + if not args.summary: + for filename, problem in problems: + f.write(' %s: %s\n' % (filename, problem)) + + +if __name__ == '__main__': + main() diff -Nru python-debian-0.1.21+nmu2ubuntu2/examples/debtags/pkgwalk python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/pkgwalk --- python-debian-0.1.21+nmu2ubuntu2/examples/debtags/pkgwalk 2012-08-22 15:26:15.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/pkgwalk 2014-10-22 08:37:11.000000000 +0000 @@ -2,10 +2,18 @@ # # Copyright (C) 2007 Enrico Zini # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # Navigate among related Debian packages diff -Nru python-debian-0.1.21+nmu2ubuntu2/examples/debtags/reverse python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/reverse --- python-debian-0.1.21+nmu2ubuntu2/examples/debtags/reverse 2012-08-22 15:26:14.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/reverse 2014-10-22 08:37:11.000000000 +0000 @@ -4,19 +4,18 @@ # # Copyright (C) 2003--2006 Enrico Zini # -# This program is free software; you can redistribute it and/or modify +# This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# along with this program. If not, see . from __future__ import print_function diff -Nru python-debian-0.1.21+nmu2ubuntu2/examples/debtags/smartsearch python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/smartsearch --- python-debian-0.1.21+nmu2ubuntu2/examples/debtags/smartsearch 2012-08-22 15:26:14.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/smartsearch 2014-10-22 08:37:11.000000000 +0000 @@ -4,19 +4,18 @@ # # Copyright (C) 2003--2006 Enrico Zini # -# This program is free software; you can redistribute it and/or modify +# This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# along with this program. If not, see . from __future__ import print_function diff -Nru python-debian-0.1.21+nmu2ubuntu2/examples/debtags/tagminer python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/tagminer --- python-debian-0.1.21+nmu2ubuntu2/examples/debtags/tagminer 2012-08-22 15:26:14.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/tagminer 2014-10-22 08:37:11.000000000 +0000 @@ -2,10 +2,18 @@ # # Copyright (C) 2007 Enrico Zini # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # Given a file, search Debian packages that can somehow handle it diff -Nru python-debian-0.1.21+nmu2ubuntu2/examples/debtags/tagsbyrelevance python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/tagsbyrelevance --- python-debian-0.1.21+nmu2ubuntu2/examples/debtags/tagsbyrelevance 2012-08-22 15:26:14.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/tagsbyrelevance 2014-10-22 08:37:11.000000000 +0000 @@ -4,19 +4,18 @@ # # Copyright (C) 2003--2006 Enrico Zini # -# This program is free software; you can redistribute it and/or modify +# This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# along with this program. If not, see . from __future__ import print_function diff -Nru python-debian-0.1.21+nmu2ubuntu2/examples/debtags/wxssearch python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/wxssearch --- python-debian-0.1.21+nmu2ubuntu2/examples/debtags/wxssearch 2012-08-22 15:26:14.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/examples/debtags/wxssearch 2014-10-22 08:37:11.000000000 +0000 @@ -4,19 +4,18 @@ # # Copyright (C) 2003--2006 Enrico Zini # -# This program is free software; you can redistribute it and/or modify +# This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# along with this program. If not, see . from __future__ import print_function diff -Nru python-debian-0.1.21+nmu2ubuntu2/lib/debian/arfile.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/arfile.py --- python-debian-0.1.21+nmu2ubuntu2/lib/debian/arfile.py 2012-08-22 15:26:15.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/arfile.py 2014-06-01 05:08:47.000000000 +0000 @@ -134,13 +134,20 @@ can be specified either as a string (its name) or as a ArMember instance. """ + # TODO(jsw): What is the point of this method? It differs from + # getmember in the following ways: + # - It returns the *first* member with the given name instead of the + # last. + # - If member is an ArMember, it uses that ArMember's name as the key. + # The former just seems confusing (and this implementation less + # efficient than getmember's - probably historical), and I'm having a + # hard time seeing the use-case for the latter. for m in self.__members: if isinstance(member, ArMember) and m.name == member.name: return m elif member == m.name: return m - else: - return None + return None # container emulation diff -Nru python-debian-0.1.21+nmu2ubuntu2/lib/debian/changelog.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/changelog.py --- python-debian-0.1.21+nmu2ubuntu2/lib/debian/changelog.py 2012-08-22 15:26:15.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/changelog.py 2014-10-09 22:45:12.000000000 +0000 @@ -140,6 +140,23 @@ changes.append(change) self._changes = changes + def _get_bugs_closed_generic(self, type_re): + changes = six.u(' ').join(self._changes) + bugs = [] + for match in type_re.finditer(changes): + closes_list = match.group(0) + for match in re.finditer("\d+", closes_list): + bugs.append(int(match.group(0))) + return bugs + + @property + def bugs_closed(self): + return self._get_bugs_closed_generic(closes) + + @property + def lp_bugs_closed(self): + return self._get_bugs_closed_generic(closeslp) + def _format(self): # TODO(jsw): Switch to StringIO or a list to join at the end. block = "" @@ -203,6 +220,9 @@ cvs_keyword = re.compile('^\$\w+:.*\$') comments = re.compile('^\# ') more_comments = re.compile('^/\*.*\*/') +closes = re.compile('closes:\s*(?:bug)?\#?\s?\d+(?:,\s*(?:bug)?\#?\s?\d+)*', + re.IGNORECASE) +closeslp = re.compile('lp:\s+\#\d+(?:,\s*\#\d+)*', re.IGNORECASE) old_format_re1 = re.compile('^(\w+\s+\w+\s+\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}' '\s+[\w\s]*\d{4})\s+(.*)\s+(<|\()(.*)(\)|>)') diff -Nru python-debian-0.1.21+nmu2ubuntu2/lib/debian/copyright.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/copyright.py --- python-debian-0.1.21+nmu2ubuntu2/lib/debian/copyright.py 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/copyright.py 2014-10-22 08:37:11.000000000 +0000 @@ -0,0 +1,597 @@ +# vim: fileencoding=utf-8 +# +# Copyright (C) 2014 Google, Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation, either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Utilities for parsing and creating machine-readable debian/copyright files. + +The specification for the format (also known as DEP5) is available here: +https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + +Start from the Coyright docstring for usage information. +""" + +from __future__ import unicode_literals + +import collections +import itertools +import io +import re +import warnings + +from debian import deb822 + + +_CURRENT_FORMAT = ( + 'http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/') + +_KNOWN_FORMATS = frozenset([ + _CURRENT_FORMAT, + # TODO(jsw): Transparently rewrite https:// as http://, at least for this? + 'https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/', +]) + + +class Error(Exception): + """Base class for exceptions in this module.""" + + +class NotMachineReadableError(Error): + """Raised when the input is not a machine-readable debian/copyright file.""" + + +class Copyright(object): + """Represents a debian/copyright file. + + A Copyright object contains a Header paragraph and a list of additional + Files or License paragraphs. It provides methods to iterate over those + paragraphs, in addition to adding new ones. It also provides a mechanism + for finding the Files paragraph (if any) that matches a particular + filename. + + Typical usage: + + with io.open('debian/copyright', 'rt', encoding='utf-8') as f: + c = copyright.Copyright(f) + + header = c.header + # Header exposes standard fields, e.g. + print('Upstream name: ', header.upstream_name) + lic = header.license + if lic: + print('Overall license: ', lic.synopsis) + # You can also retrive and set custom fields. + header['My-Special-Field'] = 'Very special' + + # Find the license for a given file. + paragraph = c.find_files_paragraph('debian/rules') + if paragraph: + print('License for debian/rules: ', paragraph.license) + + # Dump the result, including changes, to another file. + with io.open('debian/copyright.new', 'wt', encoding='utf-8') as f: + c.dump(f=f) + + It is possible to build up a Copyright from scratch, by modifying the + header and using add_files_paragraph and add_license_paragraph. See the + associated method docstrings. + """ + + def __init__(self, sequence=None, encoding='utf-8'): + """Initializer. + + :param sequence: Sequence of lines, e.g. a list of strings or a + file-like object. If not specified, a blank Copyright object is + initialized. + :param encoding: Encoding to use, in case input is raw byte strings. + It is recommended to use unicode objects everywhere instead, e.g. + by opening files in text mode. + + Raises: + NotMachineReadableError if 'sequence' does not contain a + machine-readable debian/copyright file. + """ + super(Copyright, self).__init__() + + self.__paragraphs = [] + + if sequence is not None: + paragraphs = list(deb822.Deb822.iter_paragraphs( + sequence=sequence, encoding=encoding)) + if not paragraphs: + raise NotMachineReadableError('no paragraphs in input') + self.__header = Header(paragraphs[0]) + for i in range(1, len(paragraphs)): + p = paragraphs[i] + if 'Files' in p: + p = FilesParagraph(p) + elif 'License' in p: + p = LicenseParagraph(p) + else: + warnings.warn('Non-header paragraph has neither "Files"' + ' nor "License" fields') + self.__paragraphs.append(p) + else: + self.__header = Header() + + @property + def header(self): + """The file header paragraph.""" + return self.__header + + @header.setter + def header(self, hdr): + if not isinstance(hdr, Header): + raise TypeError('value must be a Header object') + self.__header = hdr + + def all_paragraphs(self): + """Returns an iterator over all paragraphs (header, Files, License). + + The header (returned first) will be returned as a Header object; file + paragraphs as FilesParagraph objects; license paragraphs as + LicenseParagraph objects. + + """ + return itertools.chain([self.header], (p for p in self.__paragraphs)) + + def __iter__(self): + """Iterate over all paragraphs + + see all_paragraphs() for more information + + """ + return self.all_paragraphs() + + def all_files_paragraphs(self): + """Returns an iterator over the contained FilesParagraph objects.""" + return (p for p in self.__paragraphs if isinstance(p, FilesParagraph)) + + def find_files_paragraph(self, filename): + """Returns the FilesParagraph for the given filename. + + In accordance with the spec, this method returns the last FilesParagraph + that matches the filename. If no paragraphs matched, returns None. + """ + result = None + for p in self.all_files_paragraphs(): + if p.matches(filename): + result = p + return result + + def add_files_paragraph(self, paragraph): + """Adds a FilesParagraph to this object. + + The paragraph is inserted directly after the last FilesParagraph (which + might be before a standalone LicenseParagraph). + """ + if not isinstance(paragraph, FilesParagraph): + raise TypeError('paragraph must be a FilesParagraph instance') + + last_i = -1 + for i, p in enumerate(self.__paragraphs): + if isinstance(p, FilesParagraph): + last_i = i + self.__paragraphs.insert(last_i + 1, paragraph) + + def all_license_paragraphs(self): + """Returns an iterator over standalone LicenseParagraph objects.""" + return (p for p in self.__paragraphs if isinstance(p, LicenseParagraph)) + + def add_license_paragraph(self, paragraph): + """Adds a LicenceParagraph to this object. + + The paragraph is inserted after any other paragraphs. + """ + if not isinstance(paragraph, LicenseParagraph): + raise TypeError('paragraph must be a LicenseParagraph instance') + self.__paragraphs.append(paragraph) + + def dump(self, f=None): + """Dumps the contents of the copyright file. + + If f is None, returns a unicode object. Otherwise, writes the contents + to f, which must be a file-like object that is opened in text mode + (i.e. that accepts unicode objects directly). It is thus up to the + caller to arrange for the file to do any appropriate encoding. + """ + return_string = False + if f is None: + return_string = True + f = io.StringIO() + self.header.dump(f, text_mode=True) + for p in self.__paragraphs: + f.write('\n') + p.dump(f, text_mode=True) + if return_string: + return f.getvalue() + + +def _single_line(s): + """Returns s if it is a single line; otherwise raises ValueError.""" + if '\n' in s: + raise ValueError('must be single line') + return s + + +class _LineBased(object): + """Namespace for conversion methods for line-based lists as tuples.""" + # TODO(jsw): Expose this somewhere else? It may have more general utility. + + @staticmethod + def from_str(s): + """Returns the lines in 's', with whitespace stripped, as a tuple.""" + return tuple(v for v in + (line.strip() for line in (s or '').strip().splitlines()) + if v) + + @staticmethod + def to_str(seq): + """Returns the sequence as a string with each element on its own line. + + If 'seq' has one element, the result will be on a single line. + Otherwise, the first line will be blank. + """ + l = list(seq) + if not l: + return None + + def process_and_validate(s): + s = s.strip() + if not s: + raise ValueError('values must not be empty') + if '\n' in s: + raise ValueError('values must not contain newlines') + return s + + if len(l) == 1: + return process_and_validate(l[0]) + + tmp = [''] + for s in l: + tmp.append(' ' + process_and_validate(s)) + return '\n'.join(tmp) + + +class _SpaceSeparated(object): + """Namespace for conversion methods for space-separated lists as tuples.""" + # TODO(jsw): Expose this somewhere else? It may have more general utility. + + _has_space = re.compile(r'\s') + + @staticmethod + def from_str(s): + """Returns the values in s as a tuple (empty if only whitespace).""" + return tuple(v for v in (s or '').split() if v) + + @classmethod + def to_str(cls, seq): + """Returns the sequence as a space-separated string (None if empty).""" + l = list(seq) + if not l: + return None + tmp = [] + for s in l: + if cls._has_space.search(s): + raise ValueError('values must not contain whitespace') + s = s.strip() + if not s: + raise ValueError('values must not be empty') + tmp.append(s) + return ' '.join(tmp) + + +# TODO(jsw): Move multiline formatting/parsing elsewhere? + +def format_multiline(s): + """Formats multiline text for insertion in a Deb822 field. + + Each line except for the first one is prefixed with a single space. Lines + that are blank or only whitespace are replaced with ' .' + """ + if s is None: + return None + return format_multiline_lines(s.splitlines()) + + +def format_multiline_lines(lines): + """Same as format_multline, but taking input pre-split into lines.""" + out_lines = [] + for i, line in enumerate(lines): + if i != 0: + if not line.strip(): + line = '.' + line = ' ' + line + out_lines.append(line) + return '\n'.join(out_lines) + + +def parse_multiline(s): + """Inverse of format_multiline. + + Technically it can't be a perfect inverse, since format_multline must + replace all-whitespace lines with ' .'. Specifically, this function: + - Does nothing to the first line + - Removes first character (which must be ' ') from each proceeding line. + - Replaces any line that is '.' with an empty line. + """ + if s is None: + return None + return '\n'.join(parse_multiline_as_lines(s)) + + +def parse_multiline_as_lines(s): + """Same as parse_multiline, but returns a list of lines. + + (This is the inverse of format_multiline_lines.) + """ + lines = s.splitlines() + for i, line in enumerate(lines): + if i == 0: + continue + if line.startswith(' '): + line = line[1:] + else: + raise ValueError('continued line must begin with " "') + if line == '.': + line = '' + lines[i] = line + return lines + + +class License(collections.namedtuple('License', 'synopsis text')): + """Represents the contents of a License field. Immutable.""" + + def __new__(cls, synopsis, text=''): + """Creates a new License object. + + :param synopsis: The short name of the license, or an expression giving + alternatives. (The first line of a License field.) + :param text: The full text of the license, if any (may be None). The + lines should not be mangled for "deb822"-style wrapping - i.e. they + should not have whitespace prefixes or single '.' for empty lines. + """ + return super(License, cls).__new__( + cls, synopsis=_single_line(synopsis), text=(text or '')) + + @classmethod + def from_str(cls, s): + if s is None: + return None + + lines = parse_multiline_as_lines(s) + if not lines: + return cls('') + return cls(lines[0], text='\n'.join(itertools.islice(lines, 1, None))) + + def to_str(self): + return format_multiline_lines([self.synopsis] + self.text.splitlines()) + + # TODO(jsw): Parse the synopsis? + # TODO(jsw): Provide methods to look up license text for known licenses? + + +def globs_to_re(globs): + r"""Returns an re object for the given globs. + + Only * and ? wildcards are supported. Literal * and ? may be matched via + \* and \?, respectively. A literal backslash is matched \\. Any other + character after a backslash is forbidden. + + Empty globs match nothing. + + Raises ValueError if any of the globs is illegal. + """ + buf = io.StringIO() + for i, glob in enumerate(globs): + if i != 0: + buf.write('|') + i = 0 + n = len(glob) + while i < n: + c = glob[i] + i += 1 + if c == '*': + buf.write('.*') + elif c == '?': + buf.write('.') + elif c == '\\': + if i < n: + c = glob[i] + i += 1 + else: + raise ValueError('single backslash not allowed at end') + if c in r'\?*': + buf.write(re.escape(c)) + else: + raise ValueError(r'invalid escape sequence: \%s' % c) + else: + buf.write(re.escape(c)) + + # Patterns must be anchored at the end of the string. (We use \Z instead + # of $ so that this works correctly for filenames including \n.) + buf.write(r'\Z') + return re.compile(buf.getvalue(), re.MULTILINE | re.DOTALL) + + +class FilesParagraph(deb822.RestrictedWrapper): + """Represents a Files paragraph of a debian/copyright file. + + This kind of paragraph is used to specify the copyright and license for a + particular set of files in the package. + """ + + def __init__(self, data, _internal_validate=True): + super(FilesParagraph, self).__init__(data) + + if _internal_validate: + if 'Files' not in data: + raise ValueError('"Files" field required') + # For the other "required" fields, we just warn for now. Perhaps + # these should be upgraded to exceptions (potentially protected by + # a "strict" param). + if 'Copyright' not in data: + warnings.warn('Files paragraph missing Copyright field') + if 'License' not in data: + warnings.warn('Files paragraph missing License field') + + if not self.files: + warnings.warn('Files paragraph has empty Files field') + + self.__cached_files_pat = (None, None) + + @classmethod + def create(cls, files, copyright, license): + """Create a new FilesParagraph from its required parts. + + :param files: The list of file globs. + :param copyright: The copyright for the files (free-form text). + :param license: The Licence for the files. + """ + p = cls(deb822.Deb822(), _internal_validate=False) + p.files = files + p.copyright = copyright + p.license = license + return p + + def files_pattern(self): + """Returns a regular expression equivalent to the Files globs. + + Caches the result until files is set to a different value. + + Raises ValueError if any of the globs are invalid. + """ + files_str = self['files'] + if self.__cached_files_pat[0] != files_str: + self.__cached_files_pat = (files_str, globs_to_re(self.files)) + return self.__cached_files_pat[1] + + def matches(self, filename): + """Returns True iff filename is matched by a glob in Files.""" + pat = self.files_pattern() + return pat.match(filename) is not None + + files = deb822.RestrictedField( + 'Files', from_str=_SpaceSeparated.from_str, + to_str=_SpaceSeparated.to_str, allow_none=False) + + copyright = deb822.RestrictedField('Copyright', allow_none=False) + + license = deb822.RestrictedField( + 'License', from_str=License.from_str, to_str=License.to_str, + allow_none=False) + + comment = deb822.RestrictedField('Comment') + + +class LicenseParagraph(deb822.RestrictedWrapper): + """Represents a standalone license paragraph of a debian/copyright file. + + Minimally, this kind of paragraph requires a 'License' field and has no + 'Files' field. It is used to give a short name to a license text, which + can be referred to from the header or files paragraphs. + """ + + def __init__(self, data, _internal_validate=True): + super(LicenseParagraph, self).__init__(data) + if _internal_validate: + if 'License' not in data: + raise ValueError('"License" field required') + if 'Files' in data: + raise ValueError('input appears to be a Files paragraph') + + @classmethod + def create(cls, license): + """Returns a LicenseParagraph with the given license.""" + if not isinstance(license, License): + raise TypeError('license must be a License instance') + paragraph = cls(deb822.Deb822(), _internal_validate=False) + paragraph.license = license + return paragraph + + # TODO(jsw): Validate that the synopsis of the license is a short name or + # short name with exceptions (not an alternatives expression). This + # requires help from the License class. + license = deb822.RestrictedField( + 'License', from_str=License.from_str, to_str=License.to_str, + allow_none=False) + + comment = deb822.RestrictedField('Comment') + + # Hide 'Files'. + __files = deb822.RestrictedField('Files') + + +class Header(deb822.RestrictedWrapper): + """Represents the header paragraph of a debian/copyright file. + + Property values are all immutable, such that in order to modify them you + must explicitly set them (rather than modifying a returned reference). + """ + + def __init__(self, data=None): + """Initializer. + + :param parsed: A deb822.Deb822 object for underlying data. If None, a + new one will be created. + """ + if data is None: + data = deb822.Deb822() + data['Format'] = _CURRENT_FORMAT + + if 'Format-Specification' in data: + warnings.warn('use of deprecated "Format-Specification" field;' + ' rewriting as "Format"') + data['Format'] = data['Format-Specification'] + del data['Format-Specification'] + + super(Header, self).__init__(data) + + fmt = self.format + if fmt is None: + raise NotMachineReadableError( + 'input is not a machine-readable debian/copyright') + if fmt not in _KNOWN_FORMATS: + warnings.warn('format not known: %r' % fmt) + + def known_format(self): + """Returns True iff the format is known.""" + return self.format in _KNOWN_FORMATS + + def current_format(self): + """Returns True iff the format is the current format.""" + return self.format == _CURRENT_FORMAT + + format = deb822.RestrictedField( + 'Format', to_str=_single_line, allow_none=False) + + upstream_name = deb822.RestrictedField( + 'Upstream-Name', to_str=_single_line) + + upstream_contact = deb822.RestrictedField( + 'Upstream-Contact', from_str=_LineBased.from_str, + to_str=_LineBased.to_str) + + source = deb822.RestrictedField('Source') + + disclaimer = deb822.RestrictedField('Disclaimer') + + comment = deb822.RestrictedField('Comment') + + license = deb822.RestrictedField( + 'License', from_str=License.from_str, to_str=License.to_str) + + copyright = deb822.RestrictedField('Copyright') diff -Nru python-debian-0.1.21+nmu2ubuntu2/lib/debian/deb822.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/deb822.py --- python-debian-0.1.21+nmu2ubuntu2/lib/debian/deb822.py 2012-09-05 10:17:38.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/deb822.py 2015-04-14 14:50:33.000000000 +0000 @@ -7,6 +7,7 @@ # Copyright (C) 2006-2010 John Wright # Copyright (C) 2006 Adeodato Simó # Copyright (C) 2008 Stefano Zacchiroli +# Copyright (C) 2014 Google, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -35,25 +36,13 @@ _have_apt_pkg = False import chardet -import os +import collections import re import subprocess import sys import warnings -try: - from StringIO import StringIO - BytesIO = StringIO -except ImportError: - from io import BytesIO, StringIO -try: - from collections import Mapping, MutableMapping - _mapping_mixin = Mapping - _mutable_mapping_mixin = MutableMapping -except ImportError: - from UserDict import DictMixin - _mapping_mixin = DictMixin - _mutable_mapping_mixin = DictMixin +from io import BytesIO, StringIO import six @@ -76,7 +65,15 @@ GPGV_EXECUTABLE = '/usr/bin/gpgv' -class TagSectionWrapper(_mapping_mixin, object): +class Error(Exception): + """Base class for custom exceptions in this module.""" + + +class RestrictedFieldError(Error): + """Raised when modifying the raw value of a field is not allowed.""" + + +class TagSectionWrapper(collections.Mapping): """Wrap a TagSection object, using its find_raw method to get field values This allows us to pick which whitespace to strip off the beginning and end @@ -157,10 +154,7 @@ ### -class Deb822Dict(_mutable_mapping_mixin, object): - # Subclassing _mutable_mapping_mixin because we're overriding so much - # dict functionality that subclassing dict requires overriding many more - # than the methods that _mutable_mapping_mixin requires. +class Deb822Dict(collections.MutableMapping): """A dictionary-like object suitable for storing RFC822-like data. Deb822Dict behaves like a normal dict, except: @@ -231,7 +225,7 @@ else: return value - ### BEGIN _mutable_mapping_mixin methods + ### BEGIN collections.MutableMapping methods def __iter__(self): for key in self.__keys: @@ -255,6 +249,11 @@ else: raise + # TODO(jsw): Move the decoding logic into __setitem__ so that we decode + # it once instead of every time somebody asks for it. Even better if + # Deb822* classes dealt in pure unicode and didn't care about the + # encoding of the files they came from...but I don't know how to fix + # that without breaking a bunch of users. return self._detect_encoding(value) def __delitem__(self, key): @@ -274,7 +273,7 @@ if sys.version < '3': has_key = __contains__ - ### END _mutable_mapping_mixin methods + ### END collections.MutableMapping methods def __repr__(self): return '{%s}' % ', '.join(['%r: %r' % (k, v) for k, v in self.items()]) @@ -340,7 +339,8 @@ self.gpg_info = None - def iter_paragraphs(cls, sequence, fields=None, use_apt_pkg=True, + @classmethod + def iter_paragraphs(cls, sequence, fields=None, use_apt_pkg=False, shared_storage=False, encoding="utf-8"): """Generator that yields a Deb822 object for each paragraph in sequence. @@ -348,9 +348,14 @@ :param fields: likewise. - :param use_apt_pkg: if sequence is a file, apt_pkg will be used + :param use_apt_pkg: if sequence is a file, apt_pkg can be used if available to parse the file, since it's much much faster. Set - this parameter to False to disable using apt_pkg. + this parameter to True to enable use of apt_pkg. Note that the + TagFile parser from apt_pkg is a much stricter parser of the + Deb822 format, particularly with regards whitespace between + paragraphs and comments within paragraphs. If these features are + required (for example in debian/control files), ensure that this + parameter is set to False. :param shared_storage: not used, here for historical reasons. Deb822 objects never use shared storage anymore. :param encoding: Interpret the paragraphs in this encoding. @@ -376,13 +381,14 @@ yield paragraph else: + if isinstance(sequence, six.string_types): + sequence = sequence.splitlines() iterable = iter(sequence) - x = cls(iterable, fields, encoding=encoding) - while len(x) != 0: - yield x + while True: x = cls(iterable, fields, encoding=encoding) - - iter_paragraphs = classmethod(iter_paragraphs) + if not x: + break + yield x ### @@ -489,16 +495,24 @@ """ return six.text_type(self[key]) - def dump(self, fd=None, encoding=None): + def dump(self, fd=None, encoding=None, text_mode=False): """Dump the the contents in the original format - If fd is None, return a unicode object. - - If fd is not None, attempt to encode the output to the encoding the - object was initialized with, or the value of the encoding argument if - it is not None. This will raise UnicodeEncodeError if the encoding - can't support all the characters in the Deb822Dict values. + If fd is None, returns a unicode object. Otherwise, fd is assumed to + be a file-like object, and this method will write the data to it + instead of returning a unicode object. + + If fd is not none and text_mode is False, the data will be encoded + to a byte string before writing to the file. The encoding used is + chosen via the encoding parameter; None means to use the encoding the + object was initialized with (utf-8 by default). This will raise + UnicodeEncodeError if the encoding can't support all the characters in + the Deb822Dict values. """ + # Ideally this would never try to encode (that should be up to the + # caller when opening the file), but we may still have users who rely + # on the binary mode encoding. But...might it be better to break them + # than to introduce yet another parameter relating to encoding? if fd is None: fd = StringIO() @@ -521,7 +535,7 @@ entry = '%s:%s\n' % (key, value) else: entry = '%s: %s\n' % (key, value) - if not return_string: + if not return_string and not text_mode: fd.write(entry.encode(encoding)) else: fd.write(entry) @@ -624,8 +638,10 @@ lines = [] gpg_post_lines = [] state = b'SAFE' - gpgre = re.compile(br'^-----(?PBEGIN|END) PGP (?P[^-]+)-----$') - blank_line = re.compile(b'^$') + gpgre = re.compile(br'^-----(?PBEGIN|END) PGP (?P[^-]+)-----[\r\t ]*$') + # Include whitespace-only lines in blank lines to split paragraphs. + # (see #715558) + blank_line = re.compile(b'^\s*$') first_line = True for line in sequence: @@ -872,11 +888,26 @@ # XXX *NOT* a real dependency parser, and that is not even a goal here, we # just parse as much as we need to split the various parts composing a # dependency, checking their correctness wrt policy is out of scope - __dep_RE = re.compile( \ - r'^\s*(?P[a-zA-Z0-9.+\-]{2,})(\s*\(\s*(?P[>=<]+)\s*(?P[0-9a-zA-Z:\-+~.]+)\s*\))?(\s*\[(?P[\s!\w\-]+)\])?\s*$') + __dep_RE = re.compile( + r'^\s*(?P[a-zA-Z0-9.+\-]{2,})' + r'(:(?P([a-zA-Z0-9][a-zA-Z0-9-]*)))?' + r'(\s*\(\s*(?P[>=<]+)\s*' + r'(?P[0-9a-zA-Z:\-+~.]+)\s*\))?' + r'(\s*\[(?P[\s!\w\-]+)\])?\s*' + r'((?P<.+>))?\s*' + r'$') __comma_sep_RE = re.compile(r'\s*,\s*') __pipe_sep_RE = re.compile(r'\s*\|\s*') __blank_sep_RE = re.compile(r'\s*') + __restriction_sep_RE = re.compile(r'>\s*<') + __restriction_RE = re.compile( + r'(?P\!)?' + r'(?P[^\s]+)') + + ArchRestriction = collections.namedtuple('ArchRestriction', + ['enabled', 'arch']) + BuildRestriction = collections.namedtuple('BuildRestriction', + ['enabled', 'profile']) @classmethod def parse_relations(cls, raw): @@ -884,33 +915,62 @@ Depends, Recommends, Build-Depends ...) """ def parse_archs(raw): - # assumption: no space beween '!' and architecture name + # assumption: no space between '!' and architecture name archs = [] for arch in cls.__blank_sep_RE.split(raw.strip()): - if len(arch) and arch[0] == '!': - archs.append((False, arch[1:])) - else: - archs.append((True, arch)) + disabled = arch[0] == '!' + if disabled: + arch = arch[1:] + archs.append(cls.ArchRestriction(not disabled, arch)) return archs + def parse_restrictions(raw): + """ split a restriction formula into a list of restriction lists + + Each term in the restriction list is a namedtuple of form: + + (enabled, label) + + where + enabled: boolean: whether the restriction is positive or negative + profile: the profile name of the term e.g. 'stage1' + """ + restrictions = [] + for rgrp in cls.__restriction_sep_RE.split(raw.lower().strip('<> ')): + group = [] + for restriction in cls.__blank_sep_RE.split(rgrp): + match = cls.__restriction_RE.match(restriction) + if match: + parts = match.groupdict() + group.append(cls.BuildRestriction( + parts['enabled'] != '!', + parts['profile'], + )) + restrictions.append(group) + return restrictions + + def parse_rel(raw): match = cls.__dep_RE.match(raw) if match: parts = match.groupdict() - d = { 'name': parts['name'] } - if not (parts['relop'] is None or parts['version'] is None): + d = { + 'name': parts['name'], + 'archqual': parts['archqual'], + 'version': None, + 'arch': None, + 'restrictions': None, + } + if parts['relop'] or parts['version']: d['version'] = (parts['relop'], parts['version']) - else: - d['version'] = None - if parts['archs'] is None: - d['arch'] = None - else: + if parts['archs']: d['arch'] = parse_archs(parts['archs']) + if parts['restrictions']: + d['restrictions'] = parse_restrictions(parts['restrictions']) return d else: - print('deb822.py: WARNING: cannot parse package' \ - ' relationship "%s", returning it raw' % raw, - file=sys.stderr) + warnings.warn('cannot parse package' \ + ' relationship "%s", returning it raw' % raw) return { 'name': raw, 'version': None, 'arch': None } tl_deps = cls.__comma_sep_RE.split(raw.strip()) # top-level deps @@ -925,11 +985,20 @@ suitable to be written in a package stanza. """ def pp_arch(arch_spec): - (excl, arch) = arch_spec - if excl: - return arch - else: - return '!' + arch + return '%s%s' % ( + '' if arch_spec.enabled else '!', + arch_spec.arch, + ) + + def pp_restrictions(restrictions): + s = [] + for term in restrictions: + s.append('%s%s' % ( + '' if term.enabled else '!', + term.profile + ) + ) + return '<%s>' % ' '.join(s) def pp_atomic_dep(dep): s = dep['name'] @@ -937,6 +1006,8 @@ s += ' (%s %s)' % dep['version'] if dep.get('arch') is not None: s += ' [%s]' % ' '.join(map(pp_arch, dep['arch'])) + if dep.get('restrictions') is not None: + s += ' %s' % ' '.join(map(pp_restrictions, dep['restrictions'])) return s pp_or_dep = lambda deps: ' | '.join(map(pp_atomic_dep, deps)) @@ -1003,7 +1074,7 @@ The encoding of package relationships is as follows: - the top-level lists corresponds to the comma-separated list of - Deb822, their components form a conjuction, i.e. they have to be + Deb822, their components form a conjunction, i.e. they have to be AND-ed together - the inner lists corresponds to the pipe-separated list of Deb822, their components form a disjunction, i.e. they have to be OR-ed @@ -1014,11 +1085,24 @@ versioned, None otherwise. operator is one of "<<", "<=", "=", ">=", ">>"; version is the given version as a string. - - arch: A list of pairs if the + - arch: A list of pairs if the relationship is architecture specific, None otherwise. - Polarity is a boolean (false if the architecture is - negated with "!", true otherwise), architecture the - Debian archtiecture name as a string. + Enabled is a boolean (false if the architecture is + negated with "!", true otherwise), arch the + Debian architecture name as a string. + - restrictions: A list of lists of tuples + if there is a restriction formula defined, None + otherwise. Each list of tuples represents a restriction + list while each tuple represents an individual term + within the restriction list. Enabled is a boolean + (false if the restriction is negated with "!", true + otherwise). The profile is the name of the build + restriction. + https://wiki.debian.org/BuildProfileSpec + + The arch and restrictions tuples are available as named tuples so + elements are available as term[0] or alternatively as + term.enabled (and so forth). Examples: @@ -1030,6 +1114,10 @@ "tcl8.4-dev, procps [!hurd-i386]" becomes [ [ {'name': 'tcl8.4-dev'} ], [ {'name': 'procps', 'arch': (false, 'hurd-i386')} ] ] + + "texlive " becomes + [ [ {'name': 'texlive', + 'restriction': [[(false, 'cross')]]} ] ] """ if not self.__parsed_relations: lazy_rels = filter(lambda n: self.__relations[n] is None, @@ -1085,7 +1173,7 @@ if hasattr(self[key], 'keys'): # single-line array = [ self[key] ] else: # multi-line - fd.write("\n") + fd.write(six.u("\n")) array = self[key] order = self._multivalued_fields[keyl] @@ -1105,8 +1193,8 @@ if "\n" in value: raise ValueError("'\\n' not allowed in component of " "multivalued field %s" % key) - fd.write(" %s" % value) - fd.write("\n") + fd.write(six.u(" %s") % value) + fd.write(six.u("\n")) return fd.getvalue().rstrip("\n") else: return Deb822.get_as_string(self, key) @@ -1131,14 +1219,18 @@ sequence = kwargs.get("sequence", None) if sequence is not None: + # If the input is a unicode object or a file opened in text mode, + # we'll need to encode it back to bytes for gpg. If it's not + # actually in the encoding that we guess, then this probably won't + # verify correctly, but this is the best we can reasonably manage. + # For accurate verification, the file should be opened in binary + # mode. + encoding = (getattr(sequence, 'encoding', None) + or kwargs.get('encoding', 'utf-8') or 'utf-8') if isinstance(sequence, bytes): self.raw_text = sequence elif isinstance(sequence, six.string_types): - # If the file is really in some other encoding, then this - # probably won't verify correctly, but this is the best we - # can reasonably manage. For accurate verification, the - # file should be opened in binary mode. - self.raw_text = sequence.encode('utf-8') + self.raw_text = sequence.encode(encoding) elif hasattr(sequence, "items"): # sequence is actually a dict(-like) object, so we don't have # the raw text. @@ -1146,7 +1238,8 @@ else: try: gpg_pre_lines, lines, gpg_post_lines = \ - self.split_gpg_and_payload(sequence) + self.split_gpg_and_payload( + self._bytes(s, encoding) for s in sequence) except EOFError: # Empty input gpg_pre_lines = lines = gpg_post_lines = [] @@ -1166,12 +1259,25 @@ _multivalued.__init__(self, *args, **kwargs) + @staticmethod + def _bytes(s, encoding): + """Converts s to bytes if necessary, using encoding. + + If s is already bytes type, returns it directly. + """ + if isinstance(s, bytes): + return s + if isinstance(s, six.string_types): + return s.encode(encoding) + raise TypeError('bytes or unicode/string required') + class Dsc(_gpg_multivalued): _multivalued_fields = { "files": [ "md5sum", "size", "name" ], "checksums-sha1": ["sha1", "size", "name"], "checksums-sha256": ["sha256", "size", "name"], + "checksums-sha512": ["sha512", "size", "name"], } @@ -1180,6 +1286,7 @@ "files": [ "md5sum", "size", "section", "priority", "name" ], "checksums-sha1": ["sha1", "size", "name"], "checksums-sha256": ["sha256", "size", "name"], + "checksums-sha512": ["sha512", "size", "name"], } def get_pool_path(self): @@ -1244,6 +1351,7 @@ "md5sum": [ "md5sum", "size", "name" ], "sha1": [ "sha1", "size", "name" ], "sha256": [ "sha256", "size", "name" ], + "sha512": [ "sha512", "size", "name" ], } __size_field_behavior = "apt-ftparchive" @@ -1282,6 +1390,19 @@ Dsc.__init__(self, *args, **kwargs) _PkgRelationMixin.__init__(self, *args, **kwargs) + @classmethod + def iter_paragraphs(cls, sequence, fields=None, use_apt_pkg=True, + shared_storage=False, encoding="utf-8"): + """Generator that yields a Deb822 object for each paragraph in Sources. + + Note that this overloaded form of the generator uses apt_pkg (a strict + but fast parser) by default. + + See the Deb822.iter_paragraphs function for details. + """ + return super(Sources, cls).iter_paragraphs(sequence, fields, + use_apt_pkg, shared_storage, encoding) + class Packages(Deb822, _PkgRelationMixin): """Represent an APT binary package list""" @@ -1294,6 +1415,181 @@ Deb822.__init__(self, *args, **kwargs) _PkgRelationMixin.__init__(self, *args, **kwargs) + @classmethod + def iter_paragraphs(cls, sequence, fields=None, use_apt_pkg=True, + shared_storage=False, encoding="utf-8"): + """Generator that yields a Deb822 object for each paragraph in Packages. + + Note that this overloaded form of the generator uses apt_pkg (a strict + but fast parser) by default. + + See the Deb822.iter_paragraphs function for details. + """ + return super(Packages, cls).iter_paragraphs(sequence, fields, + use_apt_pkg, shared_storage, encoding) + + +class _ClassInitMeta(type): + """Metaclass for classes that can be initialized at creation time. + + Implement the method + + @classmethod + def _class_init(cls, new_attrs): + pass + + on a class, and apply this metaclass to it. The _class_init method will be + called right after the class is created. The 'new_attrs' param is a dict + containing the attributes added in the definition of the class. + """ + + def __init__(cls, name, bases, attrs): + super(_ClassInitMeta, cls).__init__(name, bases, attrs) + cls._class_init(attrs) + + +class RestrictedField(collections.namedtuple( + 'RestrictedField', 'name from_str to_str allow_none')): + """Placeholder for a property providing access to a restricted field. + + Use this as an attribute when defining a subclass of RestrictedWrapper. + It will be replaced with a property. See the RestrictedWrapper + documentation for an example. + """ + + def __new__(cls, name, from_str=None, to_str=None, allow_none=True): + """Create a new RestrictedField placeholder. + + The getter that will replace this returns (or applies the given to_str + function to) None for fields that do not exist in the underlying data + object. + + :param field_name: The name of the deb822 field. + :param from_str: The function to apply for getters (default is to return + the string directly). + :param to_str: The function to apply for setters (default is to use the + value directly). If allow_none is True, this function may return + None, in which case the underlying key is deleted. + :param allow_none: Whether it is allowed to set the value to None + (which results in the underlying key being deleted). + """ + return super(RestrictedField, cls).__new__( + cls, name, from_str=from_str, to_str=to_str, + allow_none=allow_none) + + +@six.add_metaclass(_ClassInitMeta) +class RestrictedWrapper(object): + """Base class to wrap a Deb822 object, restricting write access to some keys. + + The underlying data is hidden internally. Subclasses may keep a reference + to the data before giving it to this class's constructor, if necessary, but + RestrictedProperty should cover most use-cases. The dump method from + Deb822 is directly proxied. + + Typical usage: + + class Foo(object): + def __init__(self, ...): + # ... + + @staticmethod + def from_str(self, s): + # Parse s... + return Foo(...) + + def to_str(self): + # Return in string format. + return ... + + class MyClass(deb822.RestrictedWrapper): + def __init__(self): + data = deb822.Deb822() + data['Bar'] = 'baz' + super(MyClass, self).__init__(data) + + foo = deb822.RestrictedProperty( + 'Foo', from_str=Foo.from_str, to_str=Foo.to_str) + + bar = deb822.RestrictedProperty('Bar', allow_none=False) + + d = MyClass() + d['Bar'] # returns 'baz' + d['Bar'] = 'quux' # raises RestrictedFieldError + d.bar = 'quux' + d.bar # returns 'quux' + d['Bar'] # returns 'quux' + + d.foo = Foo(...) + d['Foo'] # returns string representation of foo + """ + + @classmethod + def _class_init(cls, new_attrs): + restricted_fields = [] + for attr_name, val in new_attrs.items(): + if isinstance(val, RestrictedField): + restricted_fields.append(val.name.lower()) + cls.__init_restricted_field(attr_name, val) + cls.__restricted_fields = frozenset(restricted_fields) + + @classmethod + def __init_restricted_field(cls, attr_name, field): + def getter(self): + val = self.__data.get(field.name) + if field.from_str is not None: + return field.from_str(val) + return val + + def setter(self, val): + if val is not None and field.to_str is not None: + val = field.to_str(val) + if val is None: + if field.allow_none: + if field.name in self.__data: + del self.__data[field.name] + else: + raise TypeError('value must not be None') + else: + self.__data[field.name] = val + + setattr(cls, attr_name, property(getter, setter, None, field.name)) + + def __init__(self, data): + """Initializes the wrapper over 'data', a Deb822 object.""" + super(RestrictedWrapper, self).__init__() + self.__data = data + + def __getitem__(self, key): + return self.__data[key] + + def __setitem__(self, key, value): + if key.lower() in self.__restricted_fields: + raise RestrictedFieldError( + '%s may not be modified directly; use the associated' + ' property' % key) + self.__data[key] = value + + def __delitem__(self, key): + if key.lower() in self.__restricted_fields: + raise RestrictedFieldError( + '%s may not be modified directly; use the associated' + ' property' % key) + del self.__data[key] + + def __iter__(self): + return iter(self.__data) + + def __len__(self): + return len(self.__data) + + def dump(self, *args, **kwargs): + """Calls dump() on the underlying data object. + + See Deb822.dump for more information. + """ + return self.__data.dump(*args, **kwargs) + class _CaseInsensitiveString(str): """Case insensitive string. diff -Nru python-debian-0.1.21+nmu2ubuntu2/lib/debian/debfile.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/debfile.py --- python-debian-0.1.21+nmu2ubuntu2/lib/debian/debfile.py 2012-09-05 10:37:05.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/debfile.py 2015-07-22 13:10:15.000000000 +0000 @@ -20,6 +20,7 @@ import gzip import tarfile import sys +import os.path from debian.arfile import ArFile, ArError from debian.changelog import Changelog @@ -27,7 +28,7 @@ DATA_PART = 'data.tar' # w/o extension CTRL_PART = 'control.tar' -PART_EXTS = ['gz', 'bz2', 'lzma'] # possible extensions +PART_EXTS = ['gz', 'bz2', 'xz', 'lzma'] # possible extensions INFO_PART = 'debian-binary' MAINT_SCRIPTS = ['preinst', 'postinst', 'prerm', 'postrm', 'config'] @@ -45,10 +46,11 @@ """'Part' of a .deb binary package. A .deb package is considered as made of 2 parts: a 'data' part - (corresponding to the 'data.tar.gz' archive embedded in a .deb) and a - 'control' part (the 'control.tar.gz' archive). Each of them is represented - by an instance of this class. Each archive should be a compressed tar - archive; supported compression formats are: .tar.gz, .tar.bz2 . + (corresponding to the possibly compressed 'data.tar' archive embedded + in a .deb) and a 'control' part (the 'control.tar.gz' archive). Each of + them is represented by an instance of this class. Each archive should + be a compressed tar archive although an uncompressed data.tar is permitted; + supported compression formats are: .tar.gz, .tar.bz2, .tar.xz . When referring to file members of the underlying .tar.gz archive, file names can be specified in one of 3 formats "file", "./file", "/file". In @@ -65,20 +67,43 @@ def tgz(self): """Return a TarFile object corresponding to this part of a .deb package. - + Despite the name, this method gives access to various kind of compressed tar archives, not only gzipped ones. """ if self.__tgz is None: name = self.__member.name - if name.endswith('.gz'): - gz = gzip.GzipFile(fileobj=self.__member, mode='r') - self.__tgz = tarfile.TarFile(fileobj=gz, mode='r') - elif name.endswith('.bz2'): - # Tarfile's __init__ doesn't allow for r:bz2 modes, but the - # open() classmethod does ... - self.__tgz = tarfile.open(fileobj=self.__member, mode='r:bz2') + extension = os.path.splitext(name)[1][1:] + if extension in PART_EXTS or name == DATA_PART: + # Permit compressed members and also uncompressed data.tar + if sys.version_info < (3, 3) and extension == 'xz': + try: + import subprocess + import signal + import io + + proc = subprocess.Popen(['unxz', '--stdout'], + stdin=subprocess.PIPE, stdout=subprocess.PIPE, + universal_newlines=False, + preexec_fn=lambda: + signal.signal(signal.SIGPIPE, signal.SIG_DFL)) + except (OSError, ValueError) as e: + raise DebError("%s" % e) + + data = proc.communicate(self.__member.read())[0] + if proc.returncode != 0: + raise DebError("command has failed with code '%s'" % \ + proc.returncode) + + buffer = io.BytesIO(data) + else: + buffer = self.__member + + try: + self.__tgz = tarfile.open(fileobj=buffer, mode='r:*') + except (tarfile.ReadError, tarfile.CompressionError) as e: + raise DebError("tarfile has returned an error: '%s'" % e) else: raise DebError("part '%s' has unexpected extension" % name) return self.__tgz @@ -236,8 +261,8 @@ contained package version), 2.0 at the time of writing for all .deb packages in the Debian archive - data DebPart object corresponding to the data.tar.gz (or - other compressed tar) archive contained in the .deb - file + other compressed or uncompressed tar) archive contained + in the .deb file - control DebPart object corresponding to the control.tar.gz (or other compressed tar) archive contained in the .deb file @@ -248,8 +273,9 @@ actual_names = set(self.getnames()) def compressed_part_name(basename): - global PART_EXTS candidates = [ '%s.%s' % (basename, ext) for ext in PART_EXTS ] + if basename == DATA_PART: # also permit uncompressed data.tar + candidates.append(basename) parts = actual_names.intersection(set(candidates)) if not parts: raise DebError("missing required part in given .deb" \ diff -Nru python-debian-0.1.21+nmu2ubuntu2/lib/debian/debian_support.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/debian_support.py --- python-debian-0.1.21+nmu2ubuntu2/lib/debian/debian_support.py 2012-08-22 15:26:15.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/debian_support.py 2014-10-22 08:37:11.000000000 +0000 @@ -22,7 +22,6 @@ import os import re -import hashlib import types from debian.deprecation import function_deprecated_by @@ -34,6 +33,25 @@ except ImportError: _have_apt_pkg = False +# Use the built-in _sha extension instead of hashlib to avoid a dependency on +# OpenSSL, which is incompatible with the GPL. +try: + # Python 2.x + import _sha + new_sha1 = _sha.new +except ImportError: + # Python 3.x + try: + import _sha1 + new_sha1 = _sha1.sha1 + except ImportError: + def new_sha1(): + raise NotImplementedError( + "Built-in sha1 implementation not found; cannot use hashlib" + " implementation because it depends on OpenSSL, which" + " may not be linked with this library due to license" + " incompatibilities") + class ParseError(Exception): """An exception which is used to signal a parse failure. @@ -396,7 +414,20 @@ def list_releases(): releases = {} - rels = ("potato", "woody", "sarge", "etch", "lenny", "sid") + rels = ("buzz", + "rez", + "bo", + "hamm", + "slink", + "potato", + "woody", + "sarge", + "etch", + "lenny", + "squeeze", + "wheezy", + "jessie", + "sid") for r in range(len(rels)): releases[rels[r]] = Release(rels[r], r) Release.releases = releases @@ -413,7 +444,7 @@ del list_releases def read_lines_sha1(lines): - m = hashlib.sha1() + m = new_sha1() for l in lines: if isinstance(l, bytes): m.update(l) diff -Nru python-debian-0.1.21+nmu2ubuntu2/lib/debian/doc-debtags python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/doc-debtags --- python-debian-0.1.21+nmu2ubuntu2/lib/debian/doc-debtags 2012-08-22 15:25:54.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/lib/debian/doc-debtags 2014-10-22 08:37:11.000000000 +0000 @@ -1,5 +1,20 @@ #!/usr/bin/python +# Copyright (C) 2006 Enrico Zini +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + from __future__ import absolute_import, print_function import sys diff -Nru python-debian-0.1.21+nmu2ubuntu2/setup.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/setup.py --- python-debian-0.1.21+nmu2ubuntu2/setup.py 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/setup.py 2015-04-14 14:54:57.000000000 +0000 @@ -0,0 +1,31 @@ +#!/usr/bin/python + +# Copyright (C) 2006 James Westby +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +from setuptools import setup + +setup(name='python-debian', + version='0.1.27', + description='Debian package related modules', + url='http://packages.debian.org/sid/python-debian', + package_dir={'': 'lib'}, + packages=['debian', 'debian_bundle'], + py_modules=['deb822'], + maintainer='Debian python-debian Maintainers', + maintainer_email='pkg-python-debian-maint@lists.alioth.debian.org', + install_requires=['six'], + ) diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_changelog python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_changelog --- python-debian-0.1.21+nmu2ubuntu2/tests/test_changelog 2012-01-12 23:42:27.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_changelog 2014-10-09 22:45:12.000000000 +0000 @@ -1,7 +1,9 @@ gnutls13 (1:1.4.1-1) unstable; urgency=HIGH [ James Westby ] - * New upstream release. + * New upstream release. Closes: #123, #456, + #789. LP: #1234, #2345, + #3456 * Remove the following patches as they are now included upstream: - 10_certtoolmanpage.diff - 15_fixcompilewarning.diff diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_changelog.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_changelog.py --- python-debian-0.1.21+nmu2ubuntu2/tests/test_changelog.py 2012-08-22 15:26:15.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_changelog.py 2014-10-09 22:45:12.000000000 +0000 @@ -68,7 +68,9 @@ """gnutls13 (1:1.4.1-1) unstable; urgency=HIGH [ James Westby ] - * New upstream release. + * New upstream release. Closes: #123, #456, + #789. LP: #1234, #2345, + #3456 * Remove the following patches as they are now included upstream: - 10_certtoolmanpage.diff - 15_fixcompilewarning.diff @@ -174,6 +176,19 @@ self.assertEqual(c.epoch, '1') self.assertEqual(str(c.version), c.full_version) + def test_bugs_closed(self): + f = open('test_changelog') + c = iter(changelog.Changelog(f)) + f.close() + # test bugs in a list + block = next(c) + self.assertEqual(block.bugs_closed, [123, 456, 789]) + self.assertEqual(block.lp_bugs_closed, [1234, 2345, 3456]) + # test bugs in parentheses + block = next(c) + self.assertEqual(block.bugs_closed, [375815]) + self.assertEqual(block.lp_bugs_closed, []) + def test_allow_full_stops_in_distribution(self): f = open('test_changelog_full_stops') c = changelog.Changelog(f) diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_Changes python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Changes --- python-debian-0.1.21+nmu2ubuntu2/tests/test_Changes 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Changes 2014-10-22 08:37:50.000000000 +0000 @@ -0,0 +1,78 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +Format: 1.8 +Date: Wed, 10 Sep 2014 23:18:38 -0700 +Source: python-debian +Binary: python-debian python3-debian +Architecture: source all +Version: 0.1.23 +Distribution: unstable +Urgency: medium +Maintainer: Debian python-debian Maintainers +Changed-By: John Wright +Description: + python-debian - Python modules to work with Debian-related data formats + python3-debian - Python 3 modules to work with Debian-related data formats +Closes: 634848 655988 670679 671485 695932 712513 718355 732599 743174 760488 +Changes: + python-debian (0.1.23) unstable; urgency=medium + . + [ Stuart Prescott ] + * Add sha512 sums to Release and Sources (Closes: #732599). + * Use warnings rather than stderr in PkgRelation (Closes: #712513). + * Expose the list of bugs closed by a changelog entry; thanks to Jelmer + Vernooi and Stefano Rivera for patches (Closes: #634848). + * Add support for .deb with uncompressed data.tar member (Closes: #718355). + * Prefer the internal parser rather than apt's TagFile for processing deb822 + files unless explicitly called to process Packages or Sources files: + - prevents paragraph parsing truncating on comments (Closes: #743174). + - fix parsing of paragraphs when separated by more whitespace than just a + newline (Closes: #655988). (Finally fixing interactions with devscripts' + wrap-and-sort!) + * Parse foreign architecture (package:any) relationships and also other + multi-arch related relationships (Closes: #670679) + * Parse build-profiles syntax. + . + [ John Wright ] + * Fix a GPG validation bug. With some trailing whitespace, the code + could be tricked into validating a signature, but using the bogus + data after the signed section (Closes: #695932). + * Drop support for python2.5. (This allows us to do fewer import hacks + in deb822, and probably other modules as well.) + * Add a deb822.RestrictedWrapper class, for exposing read-only access + to a Deb822 instance's field values as strings, while restricting + write access to some fields, which are exposed via properties. + * deb822.Deb822Dict.dump: Add a text_mode parameter for dumping to + file(-like) objects that assume text/unicode input. + * Add a copyright module, for parsing machine-readable debian/copyright + files (Closes: #671485). + * Make deb822 tests hermetic with respect to debian-keyring updates + (Closes: #760488). +Checksums-Sha1: + 12dfdc516cca4cb97db35d2058b557ce86ab4226 1861 python-debian_0.1.23.dsc + ad2363927297a16bd152f08ff268b2af147731d5 288092 python-debian_0.1.23.tar.xz + a9808610d3fe406bb66e6bbdd5c69201b669ae13 70630 python-debian_0.1.23_all.deb + 61b44f5a2700e399d78a2c8ee795fe25d40cd08d 50384 python3-debian_0.1.23_all.deb +Checksums-Sha256: + e24ef01c4d285c442577b53644211510c10767a58a6e1c8df2aa7c1b1332b00b 1861 python-debian_0.1.23.dsc + cb057ba2003fd7738f295b15a1e24f1983ce8bc3725613b4ce80013a55fb0b56 288092 python-debian_0.1.23.tar.xz + d55ecce6400a5f8504aa8d8ce76846aab5cebea6003a1e1a240ba1f93e6f88f6 70630 python-debian_0.1.23_all.deb + ebed90218dde5f9a5a5d598db3533208a0bf9683b717c2c597ab95377ca0d69b 50384 python3-debian_0.1.23_all.deb +Files: + 7d81d9acc4168890e10a6f4902c53ecc 70630 python optional python-debian_0.1.23_all.deb + 2ae2e6469ffb87c8d0ea6582c22bd48b 50384 python optional python3-debian_0.1.23_all.deb + b3e9d9f696604ab144d5aed316c808dc 1861 python optional python-debian_0.1.23.dsc + f5458e5d1379feaf5a837e7f866b1b7a 288092 python optional python-debian_0.1.23.tar.xz + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1 + +iQEcBAEBCgAGBQJUEUIQAAoJEOdiPQlLQO87z2cH/3LroAIC4gDT+ux4K11jwaRX +swQId21MKCOxDncnNUx+cwPqUi0YuHhOhp8XEsy7/7g1gDSddJJ+2WkpN0PKgLSx +2lyLtF6BJ+JykAOV3sPz993q5b0+7QJ3/3Fwq2ICzS0bFsLB9XpsRK75uogr6knp +gfOnEn03cyK5JurRdmmK1w0wVtS7ZyktaGYlknZi7xxwIb+IbVgDebpPxHj3TDzC +U9QHA5ZVziuNPeVWqgimk8BWJH0ngL+MRc5frAed4M6Zyd+mug1IetJzxaD+mBzm +W54HlaARddfiVYnXR8FaQVXEYOj76xirQf1jAaLxizwmz4C6zt6YqD2CikmTW7w= +=jb3+ +-----END PGP SIGNATURE----- diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_copyright.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_copyright.py --- python-debian-0.1.21+nmu2ubuntu2/tests/test_copyright.py 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_copyright.py 2014-10-22 08:37:11.000000000 +0000 @@ -0,0 +1,739 @@ +#! /usr/bin/python +## vim: fileencoding=utf-8 + +# Copyright (C) 2014 Google, Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation, either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +from __future__ import unicode_literals + +import re +import sys +import unittest + +sys.path.insert(0, '../lib/') + +from debian import copyright +from debian import deb822 + + +SIMPLE = """\ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: X Solitaire +Source: ftp://ftp.example.com/pub/games + +Files: * +Copyright: Copyright 1998 John Doe +License: GPL-2+ + This program is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later + version. + . + This program is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the GNU General Public License for more + details. + . + You should have received a copy of the GNU General Public + License along with this package; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301 USA + . + On Debian systems, the full text of the GNU General Public + License version 2 can be found in the file + `/usr/share/common-licenses/GPL-2'. + +Files: debian/* +Copyright: Copyright 1998 Jane Smith +License: GPL-2+ + [LICENSE TEXT] +""" + +GPL_TWO_PLUS_TEXT = """\ +This program is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied +warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more +details. + +You should have received a copy of the GNU General Public +License along with this package; if not, write to the Free +Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301 USA + +On Debian systems, the full text of the GNU General Public +License version 2 can be found in the file +`/usr/share/common-licenses/GPL-2'.""" + +MULTI_LICENSE = """\ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: Project Y + +Files: * +Copyright: Copyright 2000 Company A +License: ABC + +Files: src/baz.* +Copyright: Copyright 2000 Company A + Copyright 2001 Company B +License: ABC + +Files: debian/* +Copyright: Copyright 2003 Debian Developer +License: 123 + +Files: debian/rules +Copyright: Copyright 2003 Debian Developer + Copyright 2004 Someone Else +License: 123 + +License: ABC + [ABC TEXT] + +License: 123 + [123 TEXT] +""" + +FORMAT = 'http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/' + + +class LineBasedTest(unittest.TestCase): + """Test for _LineBased.{to,from}_str""" + + def setUp(self): + # Alias for less typing. + self.lb = copyright._LineBased + + def test_from_str_none(self): + self.assertEqual((), self.lb.from_str(None)) + + def test_from_str_empty(self): + self.assertEqual((), self.lb.from_str('')) + + def test_from_str_single_line(self): + self.assertEqual( + ('Foo Bar ',), + self.lb.from_str('Foo Bar ')) + + def test_from_str_single_value_after_newline(self): + self.assertEqual( + ('Foo Bar ',), + self.lb.from_str('\n Foo Bar ')) + + def test_from_str_multiline(self): + self.assertEqual( + ('Foo Bar ', 'http://bar.com/foo'), + self.lb.from_str('\n Foo Bar \n http://bar.com/foo')) + + def test_to_str_empty(self): + self.assertIsNone(self.lb.to_str([])) + self.assertIsNone(self.lb.to_str(())) + + def test_to_str_single(self): + self.assertEqual( + 'Foo Bar ', + self.lb.to_str(['Foo Bar '])) + + def test_to_str_multi_list(self): + self.assertEqual( + '\n Foo Bar \n http://bar.com/foo', + self.lb.to_str( + ['Foo Bar ', 'http://bar.com/foo'])) + + def test_to_str_multi_tuple(self): + self.assertEqual( + '\n Foo Bar \n http://bar.com/foo', + self.lb.to_str( + ('Foo Bar ', 'http://bar.com/foo'))) + + def test_to_str_empty_value(self): + with self.assertRaises(ValueError) as cm: + self.lb.to_str(['foo', '', 'bar']) + self.assertEqual(('values must not be empty',), cm.exception.args) + + def test_to_str_whitespace_only_value(self): + with self.assertRaises(ValueError) as cm: + self.lb.to_str(['foo', ' \t', 'bar']) + self.assertEqual(('values must not be empty',), cm.exception.args) + + def test_to_str_elements_stripped(self): + self.assertEqual( + '\n Foo Bar \n http://bar.com/foo', + self.lb.to_str( + (' Foo Bar \t', ' http://bar.com/foo '))) + + def test_to_str_newlines_single(self): + with self.assertRaises(ValueError) as cm: + self.lb.to_str([' Foo Bar \n http://bar.com/foo ']) + self.assertEqual( + ('values must not contain newlines',), cm.exception.args) + + def test_to_str_newlines_multi(self): + with self.assertRaises(ValueError) as cm: + self.lb.to_str( + ['bar', ' Foo Bar \n http://bar.com/foo ']) + self.assertEqual( + ('values must not contain newlines',), cm.exception.args) + + +class SpaceSeparatedTest(unittest.TestCase): + """Tests for _SpaceSeparated.{to,from}_str.""" + + def setUp(self): + # Alias for less typing. + self.ss = copyright._SpaceSeparated + + def test_from_str_none(self): + self.assertEqual((), self.ss.from_str(None)) + + def test_from_str_empty(self): + self.assertEqual((), self.ss.from_str(' ')) + self.assertEqual((), self.ss.from_str('')) + + def test_from_str_single(self): + self.assertEqual(('foo',), self.ss.from_str('foo')) + self.assertEqual(('bar',), self.ss.from_str(' bar ')) + + def test_from_str_multi(self): + self.assertEqual(('foo', 'bar', 'baz'), self.ss.from_str('foo bar baz')) + self.assertEqual( + ('bar', 'baz', 'quux'), self.ss.from_str(' bar baz quux \t ')) + + def test_to_str_empty(self): + self.assertIsNone(self.ss.to_str([])) + self.assertIsNone(self.ss.to_str(())) + + def test_to_str_single(self): + self.assertEqual('foo', self.ss.to_str(['foo'])) + + def test_to_str_multi(self): + self.assertEqual('foo bar baz', self.ss.to_str(['foo', 'bar', 'baz'])) + + def test_to_str_empty_value(self): + with self.assertRaises(ValueError) as cm: + self.ss.to_str(['foo', '', 'bar']) + self.assertEqual(('values must not be empty',), cm.exception.args) + + def test_to_str_value_has_space_single(self): + with self.assertRaises(ValueError) as cm: + self.ss.to_str([' baz quux ']) + self.assertEqual( + ('values must not contain whitespace',), cm.exception.args) + + def test_to_str_value_has_space_multi(self): + with self.assertRaises(ValueError) as cm: + self.ss.to_str(['foo', ' baz quux ']) + self.assertEqual( + ('values must not contain whitespace',), cm.exception.args) + + +class CopyrightTest(unittest.TestCase): + + def test_basic_parse_success(self): + c = copyright.Copyright(sequence=SIMPLE.splitlines()) + self.assertEqual(FORMAT, c.header.format) + self.assertEqual(FORMAT, c.header['Format']) + self.assertEqual('X Solitaire', c.header.upstream_name) + self.assertEqual('X Solitaire', c.header['Upstream-Name']) + self.assertEqual('ftp://ftp.example.com/pub/games', c.header.source) + self.assertEqual('ftp://ftp.example.com/pub/games', c.header['Source']) + self.assertIsNone(c.header.license) + + def test_parse_and_dump(self): + c = copyright.Copyright(sequence=SIMPLE.splitlines()) + dumped = c.dump() + self.assertEqual(SIMPLE, dumped) + + def test_all_paragraphs(self): + c = copyright.Copyright(MULTI_LICENSE.splitlines()) + expected = [c.header] + list(c.all_files_paragraphs()) + \ + list(c.all_license_paragraphs()) + self.assertEqual(expected, list(c.all_paragraphs())) + self.assertEqual(expected, list(c)) + + def test_all_files_paragraphs(self): + c = copyright.Copyright(sequence=SIMPLE.splitlines()) + self.assertEqual( + [('*',), ('debian/*',)], + [fp.files for fp in c.all_files_paragraphs()]) + + c = copyright.Copyright() + self.assertEqual([], list(c.all_files_paragraphs())) + + def test_find_files_paragraph(self): + c = copyright.Copyright(sequence=SIMPLE.splitlines()) + paragraphs = list(c.all_files_paragraphs()) + + self.assertIs(paragraphs[0], c.find_files_paragraph('Makefile')) + self.assertIs(paragraphs[0], c.find_files_paragraph('src/foo.cc')) + self.assertIs(paragraphs[1], c.find_files_paragraph('debian/rules')) + self.assertIs(paragraphs[1], c.find_files_paragraph('debian/a/b.py')) + + def test_find_files_paragraph_some_unmatched(self): + c = copyright.Copyright() + files1 = copyright.FilesParagraph.create( + ['foo/*'], 'CompanyA', copyright.License('ISC')) + files2 = copyright.FilesParagraph.create( + ['bar/*'], 'CompanyB', copyright.License('Apache')) + c.add_files_paragraph(files1) + c.add_files_paragraph(files2) + self.assertIs(files1, c.find_files_paragraph('foo/bar.cc')) + self.assertIs(files2, c.find_files_paragraph('bar/baz.cc')) + self.assertIsNone(c.find_files_paragraph('baz/quux.cc')) + self.assertIsNone(c.find_files_paragraph('Makefile')) + + def test_all_license_paragraphs(self): + c = copyright.Copyright(sequence=SIMPLE.splitlines()) + self.assertEqual([], list(c.all_license_paragraphs())) + + c = copyright.Copyright(MULTI_LICENSE.splitlines()) + self.assertEqual( + [copyright.License('ABC', '[ABC TEXT]'), + copyright.License('123', '[123 TEXT]')], + list(p.license for p in c.all_license_paragraphs())) + + c.add_license_paragraph(copyright.LicenseParagraph.create( + copyright.License('Foo', '[FOO TEXT]'))) + self.assertEqual( + [copyright.License('ABC', '[ABC TEXT]'), + copyright.License('123', '[123 TEXT]'), + copyright.License('Foo', '[FOO TEXT]')], + list(p.license for p in c.all_license_paragraphs())) + + + +class MultlineTest(unittest.TestCase): + """Test cases for format_multiline{,_lines} and parse_multline{,_as_lines}. + """ + + def setUp(self): + paragraphs = list(deb822.Deb822.iter_paragraphs(SIMPLE.splitlines())) + self.formatted = paragraphs[1]['License'] + self.parsed = 'GPL-2+\n' + GPL_TWO_PLUS_TEXT + self.parsed_lines = self.parsed.splitlines() + + def test_format_multiline(self): + self.assertEqual(None, copyright.format_multiline(None)) + self.assertEqual('Foo', copyright.format_multiline('Foo')) + self.assertEqual( + 'Foo\n Bar baz\n .\n Quux.', + copyright.format_multiline('Foo\nBar baz\n\nQuux.')) + self.assertEqual( + self.formatted, copyright.format_multiline(self.parsed)) + + def test_parse_multiline(self): + self.assertEqual(None, copyright.parse_multiline(None)) + self.assertEqual('Foo', copyright.parse_multiline('Foo')) + self.assertEqual( + 'Foo\nBar baz\n\nQuux.', + copyright.parse_multiline('Foo\n Bar baz\n .\n Quux.')) + self.assertEqual( + self.parsed, copyright.parse_multiline(self.formatted)) + + def test_format_multiline_lines(self): + self.assertEqual('', copyright.format_multiline_lines([])) + self.assertEqual('Foo', copyright.format_multiline_lines(['Foo'])) + self.assertEqual( + 'Foo\n Bar baz\n .\n Quux.', + copyright.format_multiline_lines( + ['Foo', 'Bar baz', '', 'Quux.'])) + self.assertEqual( + self.formatted, + copyright.format_multiline_lines(self.parsed_lines)) + + def test_parse_multiline_as_lines(self): + self.assertEqual([], copyright.parse_multiline_as_lines('')) + self.assertEqual(['Foo'], copyright.parse_multiline_as_lines('Foo')) + self.assertEqual( + ['Foo', 'Bar baz', '', 'Quux.'], + copyright.parse_multiline_as_lines( + 'Foo\n Bar baz\n .\n Quux.')) + self.assertEqual( + self.parsed_lines, + copyright.parse_multiline_as_lines(self.formatted)) + + def test_parse_format_inverses(self): + self.assertEqual( + self.formatted, + copyright.format_multiline( + copyright.parse_multiline(self.formatted))) + + self.assertEqual( + self.formatted, + copyright.format_multiline_lines( + copyright.parse_multiline_as_lines(self.formatted))) + + self.assertEqual( + self.parsed, + copyright.parse_multiline( + copyright.format_multiline(self.parsed))) + + self.assertEqual( + self.parsed_lines, + copyright.parse_multiline_as_lines( + copyright.format_multiline_lines(self.parsed_lines))) + + +class LicenseTest(unittest.TestCase): + + def test_empty_text(self): + l = copyright.License('GPL-2+') + self.assertEqual('GPL-2+', l.synopsis) + self.assertEqual('', l.text) + self.assertEqual('GPL-2+', l.to_str()) + + def test_newline_in_synopsis(self): + with self.assertRaises(ValueError) as cm: + copyright.License('foo\n bar') + self.assertEqual(('must be single line',), cm.exception.args) + + def test_nonempty_text(self): + text = ( + 'Foo bar.\n' + '\n' + 'Baz.\n' + 'Quux\n' + '\n' + 'Bang and such.') + l = copyright.License('GPL-2+', text=text) + self.assertEqual(text, l.text) + self.assertEqual( + ('GPL-2+\n' + ' Foo bar.\n' + ' .\n' + ' Baz.\n' + ' Quux\n' + ' .\n' + ' Bang and such.'), + l.to_str()) + + def test_typical(self): + paragraphs = list(deb822.Deb822.iter_paragraphs(SIMPLE.splitlines())) + p = paragraphs[1] + l = copyright.License.from_str(p['license']) + self.assertEqual('GPL-2+', l.synopsis) + self.assertEqual(GPL_TWO_PLUS_TEXT, l.text) + self.assertEqual(p['license'], l.to_str()) + + +class LicenseParagraphTest(unittest.TestCase): + + def test_properties(self): + d = deb822.Deb822() + d['License'] = 'GPL-2' + lp = copyright.LicenseParagraph(d) + self.assertEqual('GPL-2', lp['License']) + self.assertEqual(copyright.License('GPL-2'), lp.license) + self.assertIsNone(lp.comment) + lp.comment = "Some comment." + self.assertEqual("Some comment.", lp.comment) + self.assertEqual("Some comment.", lp['comment']) + + lp.license = copyright.License('GPL-2+', '[LICENSE TEXT]') + self.assertEqual( + copyright.License('GPL-2+', '[LICENSE TEXT]'), lp.license) + self.assertEqual('GPL-2+\n [LICENSE TEXT]', lp['license']) + + with self.assertRaises(TypeError) as cm: + lp.license = None + self.assertEqual(('value must not be None',), cm.exception.args) + + def test_no_license(self): + d = deb822.Deb822() + with self.assertRaises(ValueError) as cm: + copyright.LicenseParagraph(d) + self.assertEqual(('"License" field required',), cm.exception.args) + + def test_also_has_files(self): + d = deb822.Deb822() + d['License'] = 'GPL-2\n [LICENSE TEXT]' + d['Files'] = '*' + with self.assertRaises(ValueError) as cm: + copyright.LicenseParagraph(d) + self.assertEqual( + ('input appears to be a Files paragraph',), cm.exception.args) + + def test_try_set_files(self): + lp = copyright.LicenseParagraph( + deb822.Deb822({'License': 'GPL-2\n [LICENSE TEXT]'})) + with self.assertRaises(deb822.RestrictedFieldError): + lp['Files'] = 'foo/*' + +class GlobsToReTest(unittest.TestCase): + + def setUp(self): + self.flags = re.MULTILINE | re.DOTALL + + def assertReEqual(self, a, b): + self.assertEqual(a.pattern, b.pattern) + self.assertEqual(a.flags, b.flags) + + def test_empty(self): + self.assertReEqual( + re.compile(r'\Z', self.flags), copyright.globs_to_re([])) + + def test_star(self): + pat = copyright.globs_to_re(['*']) + self.assertReEqual(re.compile(r'.*\Z', self.flags), pat) + self.assertTrue(pat.match('foo')) + self.assertTrue(pat.match('foo/bar/baz')) + + def test_star_prefix(self): + e = re.escape + pat = copyright.globs_to_re(['*.in']) + expected = re.compile('.*' + e('.in') + r'\Z', self.flags) + self.assertReEqual(expected, pat) + self.assertFalse(pat.match('foo')) + self.assertFalse(pat.match('in')) + self.assertTrue(pat.match('Makefile.in')) + self.assertFalse(pat.match('foo/bar/in')) + self.assertTrue(pat.match('foo/bar/Makefile.in')) + + def test_star_prefix_with_slash(self): + e = re.escape + pat = copyright.globs_to_re(['*/Makefile.in']) + expected = re.compile('.*' + e('/Makefile.in') + r'\Z', self.flags) + self.assertReEqual(expected, pat) + self.assertFalse(pat.match('foo')) + self.assertFalse(pat.match('in')) + self.assertFalse(pat.match('foo/bar/in')) + self.assertTrue(pat.match('foo/Makefile.in')) + self.assertTrue(pat.match('foo/bar/Makefile.in')) + + def test_question_mark(self): + e = re.escape + pat = copyright.globs_to_re(['foo/messages.??_??.txt']) + expected = re.compile( + e('foo/messages.') + '..' + e('_') + '..' + e('.txt') + r'\Z', + self.flags) + self.assertReEqual(expected, pat) + self.assertFalse(pat.match('messages.en_US.txt')) + self.assertTrue(pat.match('foo/messages.en_US.txt')) + self.assertTrue(pat.match('foo/messages.ja_JP.txt')) + self.assertFalse(pat.match('foo/messages_ja_JP.txt')) + + def test_multi_literal(self): + e = re.escape + pat = copyright.globs_to_re(['Makefile.in', 'foo/bar']) + expected = re.compile( + e('Makefile.in') + '|' + e('foo/bar') + r'\Z', self.flags) + self.assertReEqual(expected, pat) + self.assertTrue(pat.match('Makefile.in')) + self.assertFalse(pat.match('foo/Makefile.in')) + self.assertTrue(pat.match('foo/bar')) + self.assertFalse(pat.match('foo/barbaz')) + self.assertFalse(pat.match('foo/bar/baz')) + self.assertFalse(pat.match('a/foo/bar')) + + def test_multi_wildcard(self): + e = re.escape + pat = copyright.globs_to_re( + ['debian/*', '*.Debian', 'translations/fr_??/*']) + expected = re.compile( + e('debian/') + '.*|.*' + e('.Debian') + '|' + + e('translations/fr_') + '..' + e('/') + r'.*\Z', + self.flags) + self.assertReEqual(expected, pat) + self.assertTrue(pat.match('debian/rules')) + self.assertFalse(pat.match('other/debian/rules')) + self.assertTrue(pat.match('README.Debian')) + self.assertTrue(pat.match('foo/bar/README.Debian')) + self.assertTrue(pat.match('translations/fr_FR/a.txt')) + self.assertTrue(pat.match('translations/fr_BE/a.txt')) + self.assertFalse(pat.match('translations/en_US/a.txt')) + + def test_literal_backslash(self): + e = re.escape + pat = copyright.globs_to_re([r'foo/bar\\baz.c', r'bar/quux\\']) + expected = re.compile( + e(r'foo/bar\baz.c') + '|' + e('bar/quux\\') + r'\Z', self.flags) + self.assertReEqual(expected, pat) + + self.assertFalse(pat.match('foo/bar.baz.c')) + self.assertFalse(pat.match('foo/bar/baz.c')) + self.assertTrue(pat.match(r'foo/bar\baz.c')) + self.assertFalse(pat.match('bar/quux')) + self.assertTrue(pat.match('bar/quux\\')) + + def test_illegal_backslash(self): + with self.assertRaises(ValueError) as cm: + copyright.globs_to_re([r'foo/a\b.c']) + self.assertEqual((r'invalid escape sequence: \b',), + cm.exception.args) + + with self.assertRaises(ValueError) as cm: + copyright.globs_to_re('foo/bar\\') + self.assertEqual(('single backslash not allowed at end',), + cm.exception.args) + + +class FilesParagraphTest(unittest.TestCase): + + def setUp(self): + self.prototype = deb822.Deb822() + self.prototype['Files'] = '*' + self.prototype['Copyright'] = 'Foo' + self.prototype['License'] = 'ISC' + + def test_files_property(self): + fp = copyright.FilesParagraph(self.prototype) + self.assertEqual(('*',), fp.files) + + fp.files = ['debian/*'] + self.assertEqual(('debian/*',), fp.files) + self.assertEqual('debian/*', fp['files']) + + fp.files = ['src/foo/*', 'src/bar/*'] + self.assertEqual(('src/foo/*', 'src/bar/*'), fp.files) + self.assertEqual('src/foo/* src/bar/*', fp['files']) + + with self.assertRaises(TypeError): + fp.files = None + + self.prototype['Files'] = 'foo/*\tbar/*\n\tbaz/*\n quux/*' + fp = copyright.FilesParagraph(self.prototype) + self.assertEqual(('foo/*', 'bar/*', 'baz/*', 'quux/*'), fp.files) + + def test_license_property(self): + fp = copyright.FilesParagraph(self.prototype) + self.assertEqual(copyright.License('ISC'), fp.license) + fp.license = copyright.License('ISC', '[LICENSE TEXT]') + self.assertEqual(copyright.License('ISC', '[LICENSE TEXT]'), fp.license) + self.assertEqual('ISC\n [LICENSE TEXT]', fp['license']) + + with self.assertRaises(TypeError): + fp.license = None + + def test_matches(self): + fp = copyright.FilesParagraph(self.prototype) + self.assertTrue(fp.matches('foo/bar.cc')) + self.assertTrue(fp.matches('Makefile')) + self.assertTrue(fp.matches('debian/rules')) + + fp.files = ['debian/*'] + self.assertFalse(fp.matches('foo/bar.cc')) + self.assertFalse(fp.matches('Makefile')) + self.assertTrue(fp.matches('debian/rules')) + + fp.files = ['Makefile', 'foo/*'] + self.assertTrue(fp.matches('foo/bar.cc')) + self.assertTrue(fp.matches('Makefile')) + self.assertFalse(fp.matches('debian/rules')) + + def test_create(self): + fp = copyright.FilesParagraph.create( + files=['Makefile', 'foo/*'], + copyright='Copyright 2014 Some Guy', + license=copyright.License('ISC')) + self.assertEqual(('Makefile', 'foo/*'), fp.files) + self.assertEqual('Copyright 2014 Some Guy', fp.copyright) + self.assertEqual(copyright.License('ISC'), fp.license) + + with self.assertRaises(TypeError): + copyright.FilesParagraph.create( + files=['*'], copyright='foo', license=None) + + with self.assertRaises(TypeError): + copyright.FilesParagraph.create( + files=['*'], copyright=None, license=copyright.License('ISC')) + + with self.assertRaises(TypeError): + copyright.FilesParagraph.create( + files=None, copyright='foo', license=copyright.License('ISC')) + + +class HeaderTest(unittest.TestCase): + + def test_format_not_none(self): + h = copyright.Header() + self.assertEqual(FORMAT, h.format) + with self.assertRaises(TypeError) as cm: + h.format = None + self.assertEqual(('value must not be None',), cm.exception.args) + + def test_upstream_name_single_line(self): + h = copyright.Header() + h.upstream_name = 'Foo Bar' + self.assertEqual('Foo Bar', h.upstream_name) + with self.assertRaises(ValueError) as cm: + h.upstream_name = 'Foo Bar\n Baz' + self.assertEqual(('must be single line',), cm.exception.args) + + def test_upstream_contact_single_read(self): + data = deb822.Deb822() + data['Format'] = FORMAT + data['Upstream-Contact'] = 'Foo Bar ' + h = copyright.Header(data=data) + self.assertEqual(('Foo Bar ',), h.upstream_contact) + + def test_upstream_contact_multi1_read(self): + data = deb822.Deb822() + data['Format'] = FORMAT + data['Upstream-Contact'] = 'Foo Bar \n http://bar.com/foo' + h = copyright.Header(data=data) + self.assertEqual( + ('Foo Bar ', 'http://bar.com/foo'), + h.upstream_contact) + + def test_upstream_contact_multi2_read(self): + data = deb822.Deb822() + data['Format'] = FORMAT + data['Upstream-Contact'] = ( + '\n Foo Bar \n http://bar.com/foo') + h = copyright.Header(data=data) + self.assertEqual( + ('Foo Bar ', 'http://bar.com/foo'), + h.upstream_contact) + + def test_upstream_contact_single_write(self): + h = copyright.Header() + h.upstream_contact = ['Foo Bar '] + self.assertEqual(('Foo Bar ',), h.upstream_contact) + self.assertEqual('Foo Bar ', h['Upstream-Contact']) + + def test_upstream_contact_multi_write(self): + h = copyright.Header() + h.upstream_contact = ['Foo Bar ', 'http://bar.com/foo'] + self.assertEqual( + ('Foo Bar ', 'http://bar.com/foo'), + h.upstream_contact) + self.assertEqual( + '\n Foo Bar \n http://bar.com/foo', + h['upstream-contact']) + + def test_license(self): + h = copyright.Header() + self.assertIsNone(h.license) + l = copyright.License('GPL-2+') + h.license = l + self.assertEqual(l, h.license) + self.assertEqual('GPL-2+', h['license']) + + h.license = None + self.assertIsNone(h.license) + self.assertFalse('license' in h) + + +if __name__ == '__main__': + unittest.main() diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_deb822.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_deb822.py --- python-debian-0.1.21+nmu2ubuntu2/tests/test_deb822.py 2012-08-22 15:26:15.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_deb822.py 2014-10-22 08:37:50.000000000 +0000 @@ -5,8 +5,8 @@ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; version 2 -# dated June, 1991. +# as published by the Free Software Foundation, either version 2 +# of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -19,6 +19,7 @@ from __future__ import absolute_import +import io import os import re import sys @@ -33,7 +34,7 @@ import six -sys.path.insert(0, '../lib/') +sys.path.insert(0, '../lib') from debian import deb822 @@ -244,6 +245,9 @@ # An inline comment in the middle of a paragraph should be ignored. Priority: optional Homepage: http://www.debian.org/ +Build-Depends: debhelper, +# quux, (temporarily disabled by a comment character) + python # Comments in the middle shouldn't result in extra blank paragraphs either. @@ -266,6 +270,7 @@ ('Section', 'bar'), ('Priority', 'optional'), ('Homepage', 'http://www.debian.org/'), + ('Build-Depends', 'debhelper,\n python'), ]), deb822.Deb822Dict([ ('Package', 'foo'), @@ -276,10 +281,18 @@ ]), ] +KEYRING = os.path.abspath('test-keyring.gpg') + def open_utf8(filename, mode='r'): """Open a UTF-8 text file in text mode.""" if sys.version < '3': + # TODO(jsw): This isn't actually doing what the docstring says. The + # correct code (for both 2 and 3) is + # io.open(filename, code=mode, encoding='utf-8') + # but that makes a couple of other tests fail on 2.x (both related to + # apt_pkg - not surprisingly, its behavior with unicode objects isn't + # very consistent). return open(filename, mode=mode) else: return open(filename, mode=mode, encoding='UTF-8') @@ -391,17 +404,16 @@ self.assertWellParsed(deb822_, PARSED_PACKAGE) def test_gpg_info(self): - if not (os.path.exists('/usr/bin/gpgv') and - os.path.exists('/usr/share/keyrings/debian-keyring.gpg')): + if not os.path.exists('/usr/bin/gpgv'): return unparsed_with_gpg = SIGNED_CHECKSUM_CHANGES_FILE % CHECKSUM_CHANGES_FILE deb822_from_str = deb822.Dsc(unparsed_with_gpg) - result_from_str = deb822_from_str.get_gpg_info() + result_from_str = deb822_from_str.get_gpg_info(keyrings=[KEYRING]) deb822_from_file = deb822.Dsc(StringIO(unparsed_with_gpg)) - result_from_file = deb822_from_file.get_gpg_info() + result_from_file = deb822_from_file.get_gpg_info(keyrings=[KEYRING]) deb822_from_lines = deb822.Dsc(unparsed_with_gpg.splitlines()) - result_from_lines = deb822_from_lines.get_gpg_info() + result_from_lines = deb822_from_lines.get_gpg_info(keyrings=[KEYRING]) valid = { 'GOODSIG': ['D14219877A786561', 'John Wright '], @@ -422,6 +434,16 @@ self.assertEqual(result['VALIDSIG'], valid['VALIDSIG']) self.assertEqual(result['SIG_ID'][1:], valid['SIG_ID'][1:]) + def test_gpg_info2(self): + if not os.path.exists('/usr/bin/gpgv'): + return + + with open('test_Dsc.badsig', mode='rb') as f: + dsc = deb822.Dsc(f) + i = dsc.get_gpg_info(keyrings=[KEYRING]) + self.assertTrue(i.valid()) + self.assertEqual('at', dsc['Source']) + def test_iter_paragraphs_array(self): text = (UNPARSED_PACKAGE + '\n\n\n' + UNPARSED_PACKAGE).splitlines() @@ -431,7 +453,10 @@ def test_iter_paragraphs_file(self): text = StringIO(UNPARSED_PACKAGE + '\n\n\n' + UNPARSED_PACKAGE) - for d in deb822.Deb822.iter_paragraphs(text): + for d in deb822.Deb822.iter_paragraphs(text, use_apt_pkg=False): + self.assertWellParsed(d, PARSED_PACKAGE) + + for d in deb822.Deb822.iter_paragraphs(text, use_apt_pkg=True): self.assertWellParsed(d, PARSED_PACKAGE) def test_iter_paragraphs_with_gpg(self): @@ -439,11 +464,50 @@ string = string % UNPARSED_PACKAGE text = (string + '\n\n\n' + string).splitlines() - count = 0 - for d in deb822.Deb822.iter_paragraphs(text): - count += 1 - self.assertWellParsed(d, PARSED_PACKAGE) - self.assertEqual(count, 2) + count = len([self.assertWellParsed(d, PARSED_PACKAGE) \ + for d in deb822.Deb822.iter_paragraphs(text)]) + self.assertEqual(2, count) + + def test_iter_paragraphs_with_extra_whitespace(self): + """ Paragraphs not elided when stray whitespace is between + + From policy §5.1: + + The paragraphs are separated by empty lines. Parsers may accept + lines consisting solely of spaces and tabs as paragraph separators, + but control files should use empty lines. + + On the principle of "be strict in what you send; be generous in + what you receive", deb822 should permit such extra whitespace between + deb822 stanzas. + + See #715558 for further details. + """ + for extra_space in (" ", " ", "\t"): + text = six.u(UNPARSED_PACKAGE) + '%s\n' % extra_space + \ + six.u(UNPARSED_PACKAGE) + count = len(list(deb822.Deb822.iter_paragraphs(text))) + self.assertEqual(2, count, + "Wrong number paragraphs were found in list: 2 != %d" % count) + + fd, filename = tempfile.mkstemp() + fp = os.fdopen(fd, 'wb') + fp.write(text.encode('utf-8')) + fp.close() + + try: + with open_utf8(filename) as fh: + count = len(list(deb822.Deb822.iter_paragraphs(fh))) + self.assertEqual(2, count, + "Wrong number paragraphs were found in file: 2 != %d" % count) + with open_utf8(filename) as fh: + count = len(list(deb822.Packages.iter_paragraphs(fh))) + # this time the apt_pkg parser should be used and this + # *should* elide the paragraphs and make a mess + self.assertEqual(count, 1, + "Wrong number paragraphs were found in file: 1 != %d" % count) + finally: + os.remove(filename) def _test_iter_paragraphs(self, filename, cls, **kwargs): """Ensure iter_paragraphs consistency""" @@ -790,6 +854,13 @@ f2.close() f1.close() + def test_dump_text_mode(self): + d = deb822.Deb822(CHANGES_FILE.splitlines()) + buf = io.StringIO() + d.dump(fd=buf, text_mode=True) + self.assertEqual(CHANGES_FILE, buf.getvalue()) + + def test_bug597249_colon_as_first_value_character(self): """Colon should be allowed as the first value character. See #597249. """ @@ -832,86 +903,184 @@ PARSED_PARAGRAPHS_WITH_COMMENTS[i]) def test_iter_paragraphs_comments_use_apt_pkg(self): - paragraphs = list(deb822.Deb822.iter_paragraphs( - UNPARSED_PARAGRAPHS_WITH_COMMENTS.splitlines(), use_apt_pkg=True)) - self._test_iter_paragraphs_comments(paragraphs) + """ apt_pkg does not support comments within multiline fields + + This test actually checks that that the file is *incorrectly* parsed + to ensure that this behaviour doesn't unknowingly and accidentally + change in the future. + + See also https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=750247#35 + """ + fd, filename = tempfile.mkstemp() + fp = os.fdopen(fd, 'wb') + fp.write(UNPARSED_PARAGRAPHS_WITH_COMMENTS.encode('utf-8')) + fp.close() + + try: + with open_utf8(filename) as fh: + paragraphs = list(deb822.Deb822.iter_paragraphs( + fh, use_apt_pkg=True)) + self.assertEqual(paragraphs[0]['Build-Depends'], 'debhelper,') + finally: + os.remove(filename) def test_iter_paragraphs_comments_native(self): paragraphs = list(deb822.Deb822.iter_paragraphs( UNPARSED_PARAGRAPHS_WITH_COMMENTS.splitlines(), use_apt_pkg=False)) self._test_iter_paragraphs_comments(paragraphs) + def test_iter_paragraphs_string_comments_native(self): + paragraphs = list(deb822.Deb822.iter_paragraphs( + UNPARSED_PARAGRAPHS_WITH_COMMENTS, use_apt_pkg=False)) + self._test_iter_paragraphs_comments(paragraphs) + + def test_release(self): + with open('test_Release') as f: + release = deb822.Release(f) + self.assertEqual(release['Codename'], 'sid') + self.assertEqual(len(release['SHA1']), 61) + self.assertEqual(len(release['SHA256']), 61) + self.assertEqual(len(release['SHA512']), 61) + self.assertEqual(release['SHA512'][0]['size'], '113433') + + def test_changes_binary_mode(self): + """Trivial parse test for a signed file in binary mode""" + with io.open('test_Changes', 'rb') as f: + changes = deb822.Changes(f) + self.assertEqual('python-debian', changes['Source']) + + def test_changes_text_mode(self): + """Trivial parse test for a signed file in text mode""" + with io.open('test_Changes', 'r', encoding='utf-8') as f: + changes = deb822.Changes(f) + self.assertEqual('python-debian', changes['Source']) + class TestPkgRelations(unittest.TestCase): + # TODO(jsw): Stop overriding this for Python versions that actually include + # assertWarns. Unfortunately, that's not possible right now because for + # some reason sys.modules changes size during case.py's iteration of it in + # _AssertWarnsContext.__enter__ (python3.4). + def assertWarns(self, warning, callable, *args, **kwds): + with warnings.catch_warnings(record=True) as warning_list: + warnings.simplefilter('always') + + result = callable(*args, **kwds) + + self.assertTrue(any(item.category == warning for item in warning_list)) + + def assertPkgDictEqual(self, expected, actual): + p1keys = sorted(expected.keys()) + p2keys = sorted(actual.keys()) + self.assertEqual(p1keys, p2keys, "Different fields present in packages") + for k in p1keys: + self.assertEqual(expected[k], actual[k], + "Different for field '%s'" % k) + + @staticmethod + def rel(dict_): + """Modify dict_ to ensure it contains all fields from parse_relations + + Accept a dict that partially describes a package relationship and add + to it any missing keys. + + returns: modified dict_ + """ + if 'version' not in dict_: + dict_['version'] = None + if 'arch' not in dict_: + dict_['arch'] = None + if 'archqual' not in dict_: + dict_['archqual'] = None + if 'restrictions' not in dict_: + dict_['restrictions'] = None + return dict_ def test_packages(self): + # make the syntax a bit more compact + rel = TestPkgRelations.rel + f = open('test_Packages') pkgs = deb822.Packages.iter_paragraphs(f) pkg1 = next(pkgs) rel1 = {'breaks': [], 'conflicts': [], - 'depends': [[{'name': 'file', 'version': None, 'arch': None}], - [{'name': 'libc6', 'version': ('>=', '2.7-1'), 'arch': None}], - [{'name': 'libpaper1', 'version': None, 'arch': None}], - [{'name': 'psutils', 'version': None, 'arch': None}]], + 'depends': [ + [rel({'name': 'file', 'archqual': 'i386'})], + [rel({'name': 'libc6', 'version': ('>=', '2.7-1')})], + [rel({'name': 'libpaper1'})], + [rel({'name': 'psutils'})], + ], 'enhances': [], 'pre-depends': [], 'provides': [], - 'recommends': [[{'name': 'bzip2', 'version': None, 'arch': None}], - [{'name': 'lpr', 'version': None, 'arch': None}, - {'name': 'rlpr', 'version': None, 'arch': None}, - {'name': 'cupsys-client', 'version': None, 'arch': None}], - [{'name': 'wdiff', 'version': None, 'arch': None}]], + 'recommends': [ + [rel({'name': 'bzip2'})], + [rel({'name': 'lpr'}), + rel({'name': 'rlpr'}), + rel({'name': 'cupsys-client'})], + [rel({'name': 'wdiff'})], + ], 'replaces': [], - 'suggests': [[{'name': 'emacsen-common', 'version': None, 'arch': None}], - [{'name': 'ghostscript', 'version': None, 'arch': None}], - [{'name': 'graphicsmagick-imagemagick-compat', 'version': None, 'arch': None}, - {'name': 'imagemagick', 'version': None, 'arch': None}], - [{'name': 'groff', 'version': None, 'arch': None}], - [{'name': 'gv', 'version': None, 'arch': None}], - [{'name': 'html2ps', 'version': None, 'arch': None}], - [{'name': 't1-cyrillic', 'version': None, 'arch': None}], - [{'name': 'texlive-base-bin', 'version': None, 'arch': None}]]} - self.assertEqual(rel1, pkg1.relations) + 'suggests': [ + [rel({'name': 'emacsen-common'})], + [rel({'name': 'ghostscript'})], + [rel({'name': 'graphicsmagick-imagemagick-compat'}), + rel({'name': 'imagemagick'})], + [rel({'name': 'groff'})], + [rel({'name': 'gv'})], + [rel({'name': 'html2ps'})], + [rel({'name': 't1-cyrillic'})], + [rel({'name': 'texlive-base-bin'})], + ] + } + self.assertPkgDictEqual(rel1, pkg1.relations) pkg2 = next(pkgs) rel2 = {'breaks': [], 'conflicts': [], - 'depends': [[{'name': 'lrzsz', 'version': None, 'arch': None}], - [{'name': 'openssh-client', 'version': None, 'arch': None}, - {'name': 'telnet', 'version': None, 'arch': None}, - {'name': 'telnet-ssl', 'version': None, 'arch': None}], - [{'name': 'libc6', 'version': ('>=', '2.6.1-1'), 'arch': None}], - [{'name': 'libncurses5', 'version': ('>=', '5.6'), 'arch': None}], - [{'name': 'libreadline5', 'version': ('>=', '5.2'), 'arch': None}]], + 'depends': [ + [rel({'name': 'lrzsz'})], + [rel({'name': 'openssh-client'}), + rel({'name': 'telnet'}), + rel({'name': 'telnet-ssl'})], + [rel({'name': 'libc6', 'version': ('>=', '2.6.1-1')})], + [rel({'name': 'libncurses5', 'version': ('>=', '5.6')})], + [rel({'name': 'libreadline5', 'version': ('>=', '5.2')})], + ], 'enhances': [], 'pre-depends': [], 'provides': [], 'recommends': [], 'replaces': [], - 'suggests': []} - self.assertEqual(rel2, pkg2.relations) + 'suggests': [] + } + self.assertPkgDictEqual(rel2, pkg2.relations) pkg3 = next(pkgs) - dep3 = [[{'arch': None, 'name': 'dcoprss', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'kdenetwork-kfile-plugins', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'kdict', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'kdnssd', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'kget', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'knewsticker', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'kopete', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'kpf', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'kppp', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'krdc', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'krfb', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'ksirc', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'kwifimanager', 'version': ('>=', '4:3.5.9-2')}], - [{'arch': None, 'name': 'librss1', 'version': ('>=', '4:3.5.9-2')}]] + dep3 = [ + [rel({'name': 'dcoprss', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'kdenetwork-kfile-plugins', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'kdict', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'kdnssd', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'kget', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'knewsticker', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'kopete', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'kpf', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'kppp', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'krdc', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'krfb', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'ksirc', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'kwifimanager', 'version': ('>=', '4:3.5.9-2')})], + [rel({'name': 'librss1', 'version': ('>=', '4:3.5.9-2')})], + ] self.assertEqual(dep3, pkg3.relations['depends']) f.close() bin_rels = ['file, libc6 (>= 2.7-1), libpaper1, psutils'] - src_rels = ['apache2-src (>= 2.2.9), libaprutil1-dev, ' \ - 'libcap-dev [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], ' \ - 'autoconf, debhelper (>> 5.0.0)'] + src_rels = ['apache2-src (>= 2.2.9), libaprutil1-dev, ' + 'libcap-dev [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], ' + 'autoconf , ' + 'debhelper (>> 5.0.0) ' + ' '] for bin_rel in bin_rels: self.assertEqual(bin_rel, deb822.PkgRelation.str(deb822.PkgRelation.parse_relations( @@ -920,60 +1089,104 @@ self.assertEqual(src_rel, deb822.PkgRelation.str(deb822.PkgRelation.parse_relations( \ src_rel))) + self.assertWarns(UserWarning, deb822.PkgRelation.parse_relations, + "foo bar") def test_sources(self): + # make the syntax a bit more compact + rel = TestPkgRelations.rel + f = open_utf8('test_Sources') pkgs = deb822.Sources.iter_paragraphs(f) pkg1 = next(pkgs) rel1 = {'build-conflicts': [], 'build-conflicts-indep': [], - 'build-depends': [[{'name': 'apache2-src', 'version': ('>=', '2.2.9'), 'arch': None}], - [{'name': 'libaprutil1-dev', 'version': None, 'arch': None}], - [{'arch': [(False, 'kfreebsd-i386'), (False, 'kfreebsd-amd64'), (False, 'hurd-i386')], - 'name': 'libcap-dev', - 'version': None}], - [{'name': 'autoconf', 'version': None, 'arch': None}], - [{'name': 'debhelper', 'version': ('>>', '5.0.0'), 'arch': None}]], + 'build-depends': [ + [rel({'name': 'apache2-src', 'version': ('>=', '2.2.9')})], + [rel({'name': 'libaprutil1-dev'})], + [rel({'arch': [(False, 'kfreebsd-i386'), (False, 'kfreebsd-amd64'), (False, 'hurd-i386')], + 'name': 'libcap-dev'})], + [rel({'name': 'autoconf'})], + [rel({'name': 'debhelper', 'version': ('>>', '5.0.0')})], + ], 'build-depends-indep': [], - 'binary': [[{'name': 'apache2-mpm-itk', 'version': None, 'arch': None}]]} - self.assertEqual(rel1, pkg1.relations) + 'binary': [ + [rel({'name': 'apache2-mpm-itk'})] + ] + } + self.assertPkgDictEqual(rel1, pkg1.relations) pkg2 = next(pkgs) rel2 = {'build-conflicts': [], 'build-conflicts-indep': [], - 'build-depends': [[{'name': 'dpkg-dev', 'version': ('>=', '1.13.9'), 'arch': None}], - [{'name': 'autoconf', 'version': ('>=', '2.13'), 'arch': None}], - [{'name': 'bash', 'version': None, 'arch': None}], - [{'name': 'bison', 'version': None, 'arch': None}], - [{'name': 'flex', 'version': None, 'arch': None}], - [{'name': 'gettext', 'version': None, 'arch': None}], - [{'name': 'texinfo', 'version': None, 'arch': None}], - [{'arch': [(True, 'hppa')], 'name': 'expect-tcl8.3', 'version': ('>=', '5.32.2')}], - [{'name': 'dejagnu', 'version': ('>=', '1.4.2-1.1'), 'arch': None}], - [{'name': 'dpatch', 'version': None, 'arch': None}], - [{'name': 'file', 'version': None, 'arch': None}], - [{'name': 'bzip2', 'version': None, 'arch': None}], - [{'name': 'lsb-release', 'version': None, 'arch': None}]], + 'build-depends': [ + [rel({'name': 'dpkg-dev', 'version': ('>=', '1.13.9')})], + [rel({'name': 'autoconf', 'version': ('>=', '2.13')})], + [rel({'name': 'bash'})], + [rel({'name': 'bison', 'archqual': 'amd64'})], + [rel({'name': 'flex'})], + [rel({'name': 'gettext', 'archqual': 'any'})], + [rel({'name': 'texinfo', + 'restrictions': [ + [(False, 'stage1')], + [(False, 'stage2'), + (False, 'cross')] + ]})], + [rel({'arch': [(True, 'hppa')], 'name': 'expect-tcl8.3', + 'version': ('>=', '5.32.2'), + 'restrictions': [[(False, 'stage1')]]})], + [rel({'name': 'dejagnu', 'version': ('>=', '1.4.2-1.1'), 'arch': None})], + [rel({'name': 'dpatch'})], + [rel({'name': 'file'})], + [rel({'name': 'bzip2', 'archqual': 'native'})], + [rel({'name': 'lsb-release'})], + ], 'build-depends-indep': [], - 'binary': [[{'name': 'binutils', 'version': None, 'arch': None}], - [{'name': 'binutils-dev', 'version': None, 'arch': None}], - [{'name': 'binutils-multiarch', 'version': None, 'arch': None}], - [{'name': 'binutils-hppa64', 'version': None, 'arch': None}], - [{'name': 'binutils-spu', 'version': None, 'arch': None}], - [{'name': 'binutils-doc', 'version': None, 'arch': None}], - [{'name': 'binutils-source', 'version': None, 'arch': None}]]} - self.assertEqual(rel2, pkg2.relations) + 'binary': [ + [rel({'name': 'binutils'})], + [rel({'name': 'binutils-dev'})], + [rel({'name': 'binutils-multiarch'})], + [rel({'name': 'binutils-hppa64'})], + [rel({'name': 'binutils-spu'})], + [rel({'name': 'binutils-doc'})], + [rel({'name': 'binutils-source'})], + ] + } + self.assertPkgDictEqual(rel2, pkg2.relations) f.close() + def test_restrictions_parse(self): + """ test parsing of restriction formulas """ + r = "foo " + # relation 0, alternative 0, restrictions set 0, condition 0 + term = deb822.PkgRelation.parse_relations(r)[0][0]['restrictions'][0][0] + self.assertEqual(term.enabled, True) + self.assertEqual(term[0], True) + self.assertEqual(term.profile, 'cross') + self.assertEqual(term[1], 'cross') + + r = "foo " + # relation 0, alternative 0, restrictions set 1, condition 0 + term = deb822.PkgRelation.parse_relations(r)[0][0]['restrictions'][1][0] + self.assertEqual(term.enabled, False) + self.assertEqual(term[0], False) + self.assertEqual(term.profile, 'stage2') + self.assertEqual(term[1], 'stage2') + + # relation 0, alternative 0, restrictions set 1, condition 1 + term = deb822.PkgRelation.parse_relations(r)[0][0]['restrictions'][1][1] + self.assertEqual(term.enabled, False) + self.assertEqual(term[0], False) + self.assertEqual(term.profile, 'cross') + self.assertEqual(term[1], 'cross') + class TestGpgInfo(unittest.TestCase): def setUp(self): - # These tests can only run with gpgv and a keyring available. When we - # can use Python >= 2.7, we can use the skip decorator; for now just - # check in each test method whether we should actually run. - self.should_run = ( - os.path.exists('/usr/bin/gpgv') and - os.path.exists('/usr/share/keyrings/debian-keyring.gpg')) + # These tests can only run with gpgv available. When we can use Python + # >= 2.7, we can use the skip decorator; for now just check in each + # test method whether we should actually run. + self.should_run = os.path.exists('/usr/bin/gpgv') self.data = SIGNED_CHECKSUM_CHANGES_FILE % CHECKSUM_CHANGES_FILE self.data = self.data.encode() @@ -1002,7 +1215,7 @@ if not self.should_run: return - gpg_info = deb822.GpgInfo.from_sequence(self.data) + gpg_info = deb822.GpgInfo.from_sequence(self.data, keyrings=[KEYRING]) self._validate_gpg_info(gpg_info) def test_from_sequence_newline_terminated(self): @@ -1010,7 +1223,7 @@ return sequence = BytesIO(self.data) - gpg_info = deb822.GpgInfo.from_sequence(sequence) + gpg_info = deb822.GpgInfo.from_sequence(sequence, keyrings=[KEYRING]) self._validate_gpg_info(gpg_info) def test_from_sequence_no_newlines(self): @@ -1018,7 +1231,7 @@ return sequence = self.data.splitlines() - gpg_info = deb822.GpgInfo.from_sequence(sequence) + gpg_info = deb822.GpgInfo.from_sequence(sequence, keyrings=[KEYRING]) self._validate_gpg_info(gpg_info) def test_from_file(self): @@ -1031,12 +1244,139 @@ fp.close() try: - gpg_info = deb822.GpgInfo.from_file(filename) + gpg_info = deb822.GpgInfo.from_file(filename, keyrings=[KEYRING]) finally: os.remove(filename) self._validate_gpg_info(gpg_info) +def _no_space(s): + """Returns s. Raises ValueError if s contains any whitespace.""" + if re.search(r'\s', s): + raise ValueError('whitespace not allowed') + return s + + +class RestrictedWrapperTest(unittest.TestCase): + class Wrapper(deb822.RestrictedWrapper): + restricted_field = deb822.RestrictedField('Restricted-Field') + required_field = deb822.RestrictedField('Required-Field', allow_none=False) + space_separated = deb822.RestrictedField( + 'Space-Separated', + from_str=lambda s: tuple((s or '').split()), + to_str=lambda seq: ' '.join(_no_space(s) for s in seq) or None) + + def test_unrestricted_get_and_set(self): + data = deb822.Deb822() + data['Foo'] = 'bar' + + wrapper = self.Wrapper(data) + self.assertEqual('bar', wrapper['Foo']) + wrapper['foo'] = 'baz' + self.assertEqual('baz', wrapper['Foo']) + self.assertEqual('baz', wrapper['foo']) + + multiline = 'First line\n Another line' + wrapper['X-Foo-Bar'] = multiline + self.assertEqual(multiline, wrapper['X-Foo-Bar']) + self.assertEqual(multiline, wrapper['x-foo-bar']) + + expected_data = deb822.Deb822() + expected_data['Foo'] = 'baz' + expected_data['X-Foo-Bar'] = multiline + self.assertEqual(expected_data.keys(), data.keys()) + self.assertEqual(expected_data, data) + + def test_trivially_restricted_get_and_set(self): + data = deb822.Deb822() + data['Required-Field'] = 'some value' + + wrapper = self.Wrapper(data) + self.assertEqual('some value', wrapper.required_field) + self.assertEqual('some value', wrapper['Required-Field']) + self.assertEqual('some value', wrapper['required-field']) + self.assertIsNone(wrapper.restricted_field) + + with self.assertRaises(deb822.RestrictedFieldError): + wrapper['Required-Field'] = 'foo' + with self.assertRaises(deb822.RestrictedFieldError): + wrapper['required-field'] = 'foo' + with self.assertRaises(deb822.RestrictedFieldError): + wrapper['Restricted-Field'] = 'foo' + with self.assertRaises(deb822.RestrictedFieldError): + wrapper['Restricted-field'] = 'foo' + + with self.assertRaises(deb822.RestrictedFieldError): + del wrapper['Required-Field'] + with self.assertRaises(deb822.RestrictedFieldError): + del wrapper['required-field'] + with self.assertRaises(deb822.RestrictedFieldError): + del wrapper['Restricted-Field'] + with self.assertRaises(deb822.RestrictedFieldError): + del wrapper['restricted-field'] + + with self.assertRaises(TypeError): + wrapper.required_field = None + + wrapper.restricted_field = 'special value' + self.assertEqual('special value', data['Restricted-Field']) + wrapper.restricted_field = None + self.assertFalse('Restricted-Field' in data) + self.assertIsNone(wrapper.restricted_field) + + wrapper.required_field = 'another value' + self.assertEqual('another value', data['Required-Field']) + + def test_set_already_none_to_none(self): + data = deb822.Deb822() + wrapper = self.Wrapper(data) + wrapper.restricted_field = 'Foo' + wrapper.restricted_field = None + self.assertFalse('restricted-field' in data) + wrapper.restricted_field = None + self.assertFalse('restricted-field' in data) + + def test_processed_get_and_set(self): + data = deb822.Deb822() + data['Space-Separated'] = 'foo bar baz' + + wrapper = self.Wrapper(data) + self.assertEqual(('foo', 'bar', 'baz'), wrapper.space_separated) + wrapper.space_separated = ['bar', 'baz', 'quux'] + self.assertEqual('bar baz quux', data['space-separated']) + self.assertEqual('bar baz quux', wrapper['space-separated']) + self.assertEqual(('bar', 'baz', 'quux'), wrapper.space_separated) + + with self.assertRaises(ValueError) as cm: + wrapper.space_separated = ('foo', 'bar baz') + self.assertEqual(('whitespace not allowed',), cm.exception.args) + + wrapper.space_separated = None + self.assertEqual((), wrapper.space_separated) + self.assertFalse('space-separated' in data) + self.assertFalse('Space-Separated' in data) + + wrapper.space_separated = () + self.assertEqual((), wrapper.space_separated) + self.assertFalse('space-separated' in data) + self.assertFalse('Space-Separated' in data) + + def test_dump(self): + data = deb822.Deb822() + data['Foo'] = 'bar' + data['Baz'] = 'baz' + data['Space-Separated'] = 'baz quux' + data['Required-Field'] = 'required value' + data['Restricted-Field'] = 'restricted value' + + wrapper = self.Wrapper(data) + self.assertEqual(data.dump(), wrapper.dump()) + + wrapper.restricted_field = 'another value' + wrapper.space_separated = ('bar', 'baz', 'quux') + self.assertEqual(data.dump(), wrapper.dump()) + + if __name__ == '__main__': unittest.main() diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_debfile.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_debfile.py --- python-debian-0.1.21+nmu2ubuntu2/tests/test_debfile.py 2012-08-22 15:26:15.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_debfile.py 2015-04-03 13:33:23.000000000 +0000 @@ -37,7 +37,7 @@ class TestArFile(unittest.TestCase): def setUp(self): - os.system("ar r test.ar test_debfile.py test_changelog test_deb822.py >/dev/null 2>&1") + os.system("ar rU test.ar test_debfile.py test_changelog test_deb822.py >/dev/null 2>&1") assert os.path.exists("test.ar") with os.popen("ar t test.ar") as ar: self.testmembers = [x.strip() for x in ar.readlines()] @@ -116,9 +116,13 @@ self.debname = 'test.deb' self.broken_debname = 'test-broken.deb' self.bz2_debname = 'test-bz2.deb' + self.xz_debname = 'test-xz.deb' + self.uncompressed_debname = 'test-uncompressed.deb' uudecode('test.deb.uu', self.debname) uudecode('test-broken.deb.uu', self.broken_debname) uudecode('test-bz2.deb.uu', self.bz2_debname) + uudecode('test-xz.deb.uu', self.xz_debname) + uudecode('test-uncompressed.deb.uu', self.uncompressed_debname) self.debname = 'test.deb' uu_deb = open('test.deb.uu', 'rb') @@ -133,11 +137,21 @@ os.unlink(self.debname) os.unlink(self.broken_debname) os.unlink(self.bz2_debname) + os.unlink(self.xz_debname) + os.unlink(self.uncompressed_debname) def test_missing_members(self): self.assertRaises(debfile.DebError, lambda _: debfile.DebFile(self.broken_debname), None) + def test_tar_uncompressed(self): + un_deb = debfile.DebFile(self.uncompressed_debname) + # random test on the data part (which is uncompressed), just to check + # if we can access its content + self.assertEqual(os.path.normpath(un_deb.data.tgz().getnames()[10]), + os.path.normpath('./usr/share/locale/bg/')) + un_deb.close() + def test_tar_bz2(self): bz2_deb = debfile.DebFile(self.bz2_debname) # random test on the data part (which is bzipped), just to check if we @@ -146,6 +160,14 @@ os.path.normpath('./usr/share/locale/bg/')) bz2_deb.close() + def test_tar_xz(self): + xz_deb = debfile.DebFile(self.xz_debname) + # random test on the data part (which is xz), just to check if we + # can access its content + self.assertEqual(os.path.normpath(xz_deb.data.tgz().getnames()[10]), + os.path.normpath('./usr/share/locale/bg/')) + xz_deb.close() + def test_data_names(self): """ test for file list equality """ tgz = self.d.data.tgz() diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_debian_support.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_debian_support.py --- python-debian-0.1.21+nmu2ubuntu2/tests/test_debian_support.py 2012-08-22 15:26:14.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_debian_support.py 2014-10-22 08:37:11.000000000 +0000 @@ -176,7 +176,9 @@ """Tests for debian_support.Release""" def test_comparison(self): - self.assertTrue(intern_release('sarge') < intern_release('etch')) + self.assertLess(intern_release('buzz'), intern_release('hamm')) + self.assertLess(intern_release('sarge'), intern_release('etch')) + self.assertLess(intern_release('lenny'), intern_release('squeeze')) class HelperRoutineTests(unittest.TestCase): diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_debtags.py python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_debtags.py --- python-debian-0.1.21+nmu2ubuntu2/tests/test_debtags.py 2012-08-22 15:26:15.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_debtags.py 2014-10-22 08:37:11.000000000 +0000 @@ -3,19 +3,18 @@ # Copyright (C) 2006 Enrico Zini # -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; version 2 -# dated June, 1991. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# along with this program. If not, see . from __future__ import absolute_import diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_Dsc.badsig python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Dsc.badsig --- python-debian-0.1.21+nmu2ubuntu2/tests/test_Dsc.badsig 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Dsc.badsig 2014-10-09 22:46:04.000000000 +0000 @@ -0,0 +1,78 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +Format: 1.0 +Source: at +Binary: at +Architecture: any +Version: 3.1.15-1 +Maintainer: Ansgar Burchardt +Standards-Version: 3.9.5 +Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/at.git +Vcs-Git: git://anonscm.debian.org/collab-maint/at.git +Build-Depends: debhelper (>= 9), autotools-dev, bison, flex, libpam0g-dev, perl (>= 5.10.1), dh-systemd +Package-List: + at deb admin standard arch=any +Checksums-Sha1: + 658840da37ee83fc81139b007cb4895abacb8b93 122968 at_3.1.15.orig.tar.gz + bd780f3e71a0751b65dfe3b10f9045cabba0f1e8 10154 at_3.1.15-1.diff.gz +Checksums-Sha256: + 03a84f5293d5a95ef4231b7faf5578f141f0c76a2b304dd655bc7e90e97bf7fc 122968 at_3.1.15.orig.tar.gz + adf292bc0e733cc636822209cc1f7fa7102c5fc605f25f11dbda20e0d917cd90 10154 at_3.1.15-1.diff.gz +Files: + f0f96db22e3a174b53ce4beeeb848839 122968 at_3.1.15.orig.tar.gz + 17846853a08753b886558d34d5dba1ac 10154 at_3.1.15-1.diff.gz + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1 + +iQIcBAEBCgAGBQJT52GxAAoJEIATJTTdNH3I/2oP/jf/C1kNi6iYrzUyybq8uXzf +WemTGCyNUaekM9oaYD+55RrO+GT0/2P0qnnZ+JN9dSl2/qK1EdDWu/umO69d6gVi +eRN3iP1zoiMuaIHS6JQk8J4sdDDrjrwQUkJ8Kulech80rLJUluccPRPzKZcW9uJX +MCfsGCgouH5RPybs91AgOQCO++W9ZlILZaZdQlnArJJlE+TGaKbFKg4h7hEWAWzT +YM34Ibz4O1v/a6qByjVZ8QNWdCFYThMI3QKRCIpw1SIklJOEwaKuwbej101J8yw+ +6Lse0uxkTI3KvpHpcozDpXrNpPMVNlwjOYtrKHTug8GqHNnImlYKJ3jKueICRNfu +C4nQbCBQgMyEnd9Z9nF7T53aWKDENdjtctLZ9BX+mJgt/9rHQHWQ5q9pxKAb2+xU +64MXvubFMwE7SlJIei4E1bGw7qgnTnVZKy63J1MgrHvp4nWtTKGxecMk81yye7kv +k1RTlczN8gOryZ3xNTsL3Nl0XBhsz2CnUkD7LnBqIgdMd2Jf7pJ5Nmo57kibybNR +Xz+zd3mxLqC+TPGTeqW0UTCR5ERyhxQeFV1NVQ+8EipKt940fsQgaWhrW9qOVWhl +2rJYNIzPt/fRRfPptZS9zyix7/SFzlLdqbsfAV5wIwJtEjrUDeejOziaQXJVoWeM +eLphaSC5wKKMMWb4OJf4 +=sf7s +-----END PGP SIGNATURE----- + +Format: 3.0 (quilt) +Source: gnupg +Binary: gnupg, gnupg-curl, gpgv, gnupg-udeb, gpgv-udeb, gpgv-win32 +Architecture: any all +Version: 1.4.12-6 +Maintainer: Debian GnuPG-Maintainers +Uploaders: Sune Vuorela , Daniel Leidert , Thijs Kinkhorst +Homepage: http://www.gnupg.org +Standards-Version: 3.9.3 +Vcs-Browser: http://svn.debian.org/wsvn/pkg-gnupg/gnupg/ +Vcs-Svn: svn://svn.debian.org/svn/pkg-gnupg/gnupg/trunk/ +Build-Depends: debhelper (>> 7), libz-dev, libldap2-dev, libbz2-dev, libusb-dev [!hurd-i386], libreadline-dev, file, gettext, libcurl4-gnutls-dev +Build-Depends-Indep: mingw-w64 +Package-List: + gnupg deb utils important + gnupg-curl deb utils optional + gnupg-udeb udeb debian-installer extra + gpgv deb utils important + gpgv-udeb udeb debian-installer extra + gpgv-win32 deb utils extra +Checksums-Sha1: + 790587e440ec7d429b120db7a96a237badc638fd 4939171 gnupg_1.4.12.orig.tar.gz + ad9793124c400ca7e858291155b42b53ee87d2d4 92008 gnupg_1.4.12-6.debian.tar.gz +Checksums-Sha256: + bb94222fa263e55a5096fdc1c6cd60e9992602ce5067bc453a4ada77bb31e367 4939171 gnupg_1.4.12.orig.tar.gz + 2d146235f3ff89f119849d34f455ba659c0e0dd0c08693305bac56a33dfe5978 92008 gnupg_1.4.12-6.debian.tar.gz +Files: + f9a65ccd7166d3fdb084454cf7427564 4939171 gnupg_1.4.12.orig.tar.gz + e23c2823d4105bfd4597fa4d1c88a87d 92008 gnupg_1.4.12-6.debian.tar.gz + +-----END PGP NOSIGNATURE----- +Version: vim v7.3.547 (GNU/Linux) + +Signed and approved. +-----END PGP NOSIGNATURE----- Binary files /tmp/bEb2eyotPG/python-debian-0.1.21+nmu2ubuntu2/tests/test-keyring.gpg and /tmp/XPXmxyywks/python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test-keyring.gpg differ diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_Packages python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Packages --- python-debian-0.1.21+nmu2ubuntu2/tests/test_Packages 2012-01-12 23:42:27.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Packages 2014-10-09 22:46:00.000000000 +0000 @@ -5,7 +5,7 @@ Maintainer: Masayuki Hatta (mhatta) Architecture: i386 Version: 1:4.14-1 -Depends: file, libc6 (>= 2.7-1), libpaper1, psutils +Depends: file:i386, libc6 (>= 2.7-1), libpaper1, psutils Recommends: bzip2, lpr | rlpr | cupsys-client, wdiff Suggests: emacsen-common, ghostscript, graphicsmagick-imagemagick-compat | imagemagick, groff, gv, html2ps, t1-cyrillic, texlive-base-bin Filename: pool/main/a/a2ps/a2ps_4.14-1_i386.deb diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_Release python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Release --- python-debian-0.1.21+nmu2ubuntu2/tests/test_Release 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Release 2014-10-09 22:45:12.000000000 +0000 @@ -0,0 +1,195 @@ +Architectures: amd64 i386 +Codename: sid +Components: main fix.main +Date: Thu, 12 Jun 2014 01:19:08 UTC +Description: Debian Unstable - aptosid +Label: Debian +Origin: Debian +Suite: unstable +Valid-Until: Thu, 03 Jul 2014 01:19:08 UTC +SHA1: + b56371ab637642cc4e1e3808fc294c6cbe684b0f 113433 Contents-amd64.bz2 + 34256e6c40658e3c550d9f91e3386526a3e3f3a5 156350 Contents-amd64.gz + 539de81930f4c01b15294047f66e5c776fa48609 94651 Contents-amd64.lzma + eab1f0846eea1a6d90dd754180fa3d21fcb7fca4 116204 Contents-amd64.xz + 9e4fd7f6fd611ae75dce81efae4ed3cd776065d1 40046 Contents-i386.bz2 + 9e6c32f57ef11aedc7362171eff1fda30dd6b58f 70794 Contents-i386.gz + b9fe934920a5fa88d3034580a576538760479898 30193 Contents-i386.lzma + cac7d7eaad239810264e04d0fca40bfda8e7fd95 36224 Contents-i386.xz + da39a3ee5e6b4b0d3255bfef95601890afd80709 0 Release + 64a543afbb5f4bf728636bdcbbe7a2ed0804adc2 14 fix.main/Contents-amd64.bz2 + cb9d027118517ae3e817ea4c5c3fd641439b9f93 35 fix.main/Contents-amd64.gz + ff1b0cb02cfaf69e0bf6da88fda61bebe01058b6 18 fix.main/Contents-amd64.lzma + 9746882f4236fa1c3a8f86be2f1d9c46680c0b10 32 fix.main/Contents-amd64.xz + 64a543afbb5f4bf728636bdcbbe7a2ed0804adc2 14 fix.main/Contents-i386.bz2 + c5ce7ea6864fd4dee3240f0f60d5fa858147a1e0 34 fix.main/Contents-i386.gz + ff1b0cb02cfaf69e0bf6da88fda61bebe01058b6 18 fix.main/Contents-i386.lzma + 9746882f4236fa1c3a8f86be2f1d9c46680c0b10 32 fix.main/Contents-i386.xz + da39a3ee5e6b4b0d3255bfef95601890afd80709 0 fix.main/binary-amd64/Packages + 64a543afbb5f4bf728636bdcbbe7a2ed0804adc2 14 fix.main/binary-amd64/Packages.bz2 + 362236fa444b4693d14e798572bb6d4cb2f03a22 29 fix.main/binary-amd64/Packages.gz + ff1b0cb02cfaf69e0bf6da88fda61bebe01058b6 18 fix.main/binary-amd64/Packages.lzma + 9746882f4236fa1c3a8f86be2f1d9c46680c0b10 32 fix.main/binary-amd64/Packages.xz + 2e57b2bb1b9af9d89d685934c1a11273fb381c68 82 fix.main/binary-amd64/Release + da39a3ee5e6b4b0d3255bfef95601890afd80709 0 fix.main/binary-i386/Packages + 64a543afbb5f4bf728636bdcbbe7a2ed0804adc2 14 fix.main/binary-i386/Packages.bz2 + 362236fa444b4693d14e798572bb6d4cb2f03a22 29 fix.main/binary-i386/Packages.gz + ff1b0cb02cfaf69e0bf6da88fda61bebe01058b6 18 fix.main/binary-i386/Packages.lzma + 9746882f4236fa1c3a8f86be2f1d9c46680c0b10 32 fix.main/binary-i386/Packages.xz + e2e786967427144df3db991469521e7027040a15 81 fix.main/binary-i386/Release + ffc88a05907c3cb265dc3a7ca7afcfe16752f89a 83 fix.main/source/Release + da39a3ee5e6b4b0d3255bfef95601890afd80709 0 fix.main/source/Sources + 64a543afbb5f4bf728636bdcbbe7a2ed0804adc2 14 fix.main/source/Sources.bz2 + cbf990182840ab1c99a277a6d0adae8001dfb461 28 fix.main/source/Sources.gz + ff1b0cb02cfaf69e0bf6da88fda61bebe01058b6 18 fix.main/source/Sources.lzma + 9746882f4236fa1c3a8f86be2f1d9c46680c0b10 32 fix.main/source/Sources.xz + 9e4fd7f6fd611ae75dce81efae4ed3cd776065d1 40046 main/Contents-amd64.bz2 + 0e0cfd4b1dfb9ed9e272e25d476b72cd59c7a1ec 70795 main/Contents-amd64.gz + b9fe934920a5fa88d3034580a576538760479898 30193 main/Contents-amd64.lzma + cac7d7eaad239810264e04d0fca40bfda8e7fd95 36224 main/Contents-amd64.xz + 9e4fd7f6fd611ae75dce81efae4ed3cd776065d1 40046 main/Contents-i386.bz2 + a562628257ccef3688f9e65045c64aa607d7162d 70794 main/Contents-i386.gz + b9fe934920a5fa88d3034580a576538760479898 30193 main/Contents-i386.lzma + cac7d7eaad239810264e04d0fca40bfda8e7fd95 36224 main/Contents-i386.xz + 0f8994fd80163b6bf7985f1d0138beab033a41dc 131182 main/binary-amd64/Packages + bb58085e81ddb762562d7ed10a27eb4539642239 30571 main/binary-amd64/Packages.bz2 + 7787f728eccd4fa55f0e3bce37cbfc4f7e24c6ca 35714 main/binary-amd64/Packages.gz + 4e622a82e67ab9c7e9543cd451077cabaaa83f69 30484 main/binary-amd64/Packages.lzma + 3349881eb1b63dd8f47ef93dfc073a7d5912acb4 30672 main/binary-amd64/Packages.xz + b6774b102782ed54c83c8944b85d6c633eeb0bf1 78 main/binary-amd64/Release + bf89d8fac9f4bda548afac400529b1bdfad09754 131624 main/binary-i386/Packages + 2186fe15c9dec7184772c339d6f891c2de740251 30754 main/binary-i386/Packages.bz2 + f34ed82f7be1fb11f774a3bbd5053953d35e2ee3 35930 main/binary-i386/Packages.gz + 9b1abfeffb867f4741ac376e1902345a39624093 30658 main/binary-i386/Packages.lzma + 984d3bc3159082a26c8962983859e16b9989f4f9 30856 main/binary-i386/Packages.xz + c6e3bf49fb0f1888e4e8a26d990d9128ed7caf68 77 main/binary-i386/Release + e62ce8328d21f19f295d3638dd5fe2f29d4c1373 79 main/source/Release + b0c6197bb01c906e34b90d701db080f9af897b4e 52196 main/source/Sources + ecbf089a33f5f46ad67aa7db6334a5c3f5408b94 14191 main/source/Sources.bz2 + 4292ab0969bfc14c09d5d95904c5c4db8cf7629e 15917 main/source/Sources.gz + 9e9285d7bb5a59f3f05334cb82110f1671dbfea1 14026 main/source/Sources.lzma + a3cb9f88c9ee6585995fdcab42c57be5ff20bc6b 14096 main/source/Sources.xz +SHA256: + 9a638f6df7cb02a4890f6d86172ebbfa0550abfbe9e11fc3d0904ff90da409b5 113433 Contents-amd64.bz2 + d3645d5a539a583c9a426091d3af74963fecfc9b8d1e843d53857becc9e24bd9 156350 Contents-amd64.gz + a89fe81e0cee8ed384011b89050a7f8a7b23d0c8dea27461a9a5fbea94466281 94651 Contents-amd64.lzma + 66e043c97dd5cccffd25f7206d5c4865ebc04d074088047742ff67614c3417c6 116204 Contents-amd64.xz + 681e2d48fc9d01565d6840b62347d74b5585ed5f1f23da615e9963b3e05ed370 40046 Contents-i386.bz2 + c3d0f649d8c68b8176ce19c9b030e1d588be14823b04c711843303cae31541b6 70794 Contents-i386.gz + 38e800a1c4235abcc54548b0a46f30e634f045d523bc3f29c197dd18f8edb902 30193 Contents-i386.lzma + 4c9a4dcfbbf98d4b7b249288c9611e5af943ded25dacef7109a931323b095def 36224 Contents-i386.xz + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 Release + d3dda84eb03b9738d118eb2be78e246106900493c0ae07819ad60815134a8058 14 fix.main/Contents-amd64.bz2 + 00d723a37b25fac8fc1bbefb3ac53cc2c5791235a563f3356a295cf62c6d99a7 35 fix.main/Contents-amd64.gz + c3f94b1c85bd8c65059ed4b6e7a96f43f488b422839307109ac4306f1a487e8b 18 fix.main/Contents-amd64.lzma + 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275 32 fix.main/Contents-amd64.xz + d3dda84eb03b9738d118eb2be78e246106900493c0ae07819ad60815134a8058 14 fix.main/Contents-i386.bz2 + bf623e7572bf936eabffce96d660b71704fb7e727f8c47afe1c3b9324b49dac5 34 fix.main/Contents-i386.gz + c3f94b1c85bd8c65059ed4b6e7a96f43f488b422839307109ac4306f1a487e8b 18 fix.main/Contents-i386.lzma + 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275 32 fix.main/Contents-i386.xz + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 fix.main/binary-amd64/Packages + d3dda84eb03b9738d118eb2be78e246106900493c0ae07819ad60815134a8058 14 fix.main/binary-amd64/Packages.bz2 + 95723e3e95a5c7eed1afac648bb3826c4ad0536b9482b21dda853dfd492f77ad 29 fix.main/binary-amd64/Packages.gz + c3f94b1c85bd8c65059ed4b6e7a96f43f488b422839307109ac4306f1a487e8b 18 fix.main/binary-amd64/Packages.lzma + 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275 32 fix.main/binary-amd64/Packages.xz + 3d0076d85d8952a58e71c3d11f8bac53f17b9144bb4a0f7c2520a930ab63ab2c 82 fix.main/binary-amd64/Release + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 fix.main/binary-i386/Packages + d3dda84eb03b9738d118eb2be78e246106900493c0ae07819ad60815134a8058 14 fix.main/binary-i386/Packages.bz2 + 95723e3e95a5c7eed1afac648bb3826c4ad0536b9482b21dda853dfd492f77ad 29 fix.main/binary-i386/Packages.gz + c3f94b1c85bd8c65059ed4b6e7a96f43f488b422839307109ac4306f1a487e8b 18 fix.main/binary-i386/Packages.lzma + 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275 32 fix.main/binary-i386/Packages.xz + a984ce2cb742d1f5d627d3f2af2893fad4e76918e9bc2a57d2275d37863d7b7a 81 fix.main/binary-i386/Release + b43735de54db547e0aeec70bce6a048175876066ba2830fd0a0bc92ed2570581 83 fix.main/source/Release + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 fix.main/source/Sources + d3dda84eb03b9738d118eb2be78e246106900493c0ae07819ad60815134a8058 14 fix.main/source/Sources.bz2 + f61cee8d54a3c9fac5416cfb893eec1a6cf2425b4fc3feb93c855b2e0daebf3b 28 fix.main/source/Sources.gz + c3f94b1c85bd8c65059ed4b6e7a96f43f488b422839307109ac4306f1a487e8b 18 fix.main/source/Sources.lzma + 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275 32 fix.main/source/Sources.xz + 681e2d48fc9d01565d6840b62347d74b5585ed5f1f23da615e9963b3e05ed370 40046 main/Contents-amd64.bz2 + 936ec2309aad6d49e0b4d629858fa84994ec305184f306cffde69fc4b7be54c3 70795 main/Contents-amd64.gz + 38e800a1c4235abcc54548b0a46f30e634f045d523bc3f29c197dd18f8edb902 30193 main/Contents-amd64.lzma + 4c9a4dcfbbf98d4b7b249288c9611e5af943ded25dacef7109a931323b095def 36224 main/Contents-amd64.xz + 681e2d48fc9d01565d6840b62347d74b5585ed5f1f23da615e9963b3e05ed370 40046 main/Contents-i386.bz2 + 25fc0e79c34f900d0fb47556f330c560d52dad66177321817bea34c91c0d03c6 70794 main/Contents-i386.gz + 38e800a1c4235abcc54548b0a46f30e634f045d523bc3f29c197dd18f8edb902 30193 main/Contents-i386.lzma + 4c9a4dcfbbf98d4b7b249288c9611e5af943ded25dacef7109a931323b095def 36224 main/Contents-i386.xz + 7ea82dada6d5f60261280304366cafe9fb3ab2d58e79cfad08dbb38249b025a1 131182 main/binary-amd64/Packages + a043cef020bd7d22c9eae9f8a3054231a2485f9270455521cbdad1b5a16cd1b9 30571 main/binary-amd64/Packages.bz2 + 2c5bfeaaee078549ae7f845cdeb5fb46808802ef1ed9e5402303e1b4d5032958 35714 main/binary-amd64/Packages.gz + b24f8f2f2d6330e976b0c60754380303c38a19705b35cf0dad777b8659500a8e 30484 main/binary-amd64/Packages.lzma + 6752373438f46ad1d2c7b216eb7f1fedf72a656c4a93461cd0431223b33055d7 30672 main/binary-amd64/Packages.xz + 75f315ea7afa01a317e7d5fccf0a00dfac7a0ee0107ac26a5560a5ff4b8e78cc 78 main/binary-amd64/Release + 25efe8312a00f5d39b4888883f8f09b0ea733c33462366ab55fe9b1f501293c8 131624 main/binary-i386/Packages + 98dba620b074f1406d009204e4089cbe9cf07cc16c7b4eb8cc967bef276f5fe6 30754 main/binary-i386/Packages.bz2 + 0bd75b2c93cc8062458a095a1a14fcb9a92ce6f333502a8d301b8e24ae415f43 35930 main/binary-i386/Packages.gz + 5bde471f74a31856089f18fd13b39bbb9bf449e98598d00ac3aea988c206bf99 30658 main/binary-i386/Packages.lzma + a919a5f8014ededdf3eac274eaf1716f5292ec9270a7ebc751484958d3cbcdd5 30856 main/binary-i386/Packages.xz + 8636389374d7278a1928e208db252f66a0cbaaa57f75dbc3c8ccbcac52cc23ed 77 main/binary-i386/Release + 4db0fc22686446cb718c48bfff28f831841ee075315c6783bd8278409537f919 79 main/source/Release + 473590ea71fd8dc7fa9135ad073695e5287e88a6c9fc850d9bb5f72a0dace35f 52196 main/source/Sources + 84accf6aace87e12913c49b23a3658525b0b8ba360f7809c84e1a894b1bdab6c 14191 main/source/Sources.bz2 + a2ca51aa109b493a1b2b6374d381712dd55c10516c798038ef69efa84e946a7e 15917 main/source/Sources.gz + 0dc7cb7017021278220f99118f0ba1516d91f8660d7111d264e39376ce2be282 14026 main/source/Sources.lzma + 981bb4126bbad2cdc605fd15c60a169e1c0a826f56d9ea9f09a2f1321b6451a4 14096 main/source/Sources.xz +SHA512: + 2cb4a8992cfae00ed2f9168b1a88745df07bbd936f78141803a6251cfdbf52aa10051ce8fb24fef491f67f0b47519bc745886f8c1b0e5ec7f54bc3298b92954e 113433 Contents-amd64.bz2 + 5d9a8fb08d0b798174560ed68f33fdfd475cd8ed0ea97f0830d66dad989bf5c5ae85b48afc15296cf28b8c6555d3c57c3afa86687a752d4a66da0f232c156107 156350 Contents-amd64.gz + 65bd810b5cb36d32ad269a3d631f840b69afc94e060635e57a6c9bb707dcacae04465505adcfc05c060c4a0dbd71a3c5d0b8310d3bf0de04c21063acca4a4d93 94651 Contents-amd64.lzma + 0a7e69f872fe2da587ed0af93ad3ce1aa64c119f16b6371b82f814645f776a21f39ce483315715281e0aa3573c4c9784f1ec5cb86621917c160e6f2dae1cb1a6 116204 Contents-amd64.xz + deef2cc5a45ff673817b5c3a23362baca78f88e14c197fb89643305199f10e1336c284078e28d9e2642075b72a1c5586ee3b3ad45ef9f7e3b7aa1325bec5882c 40046 Contents-i386.bz2 + d756cf94affc57d3625f7b029b8db91158269aa670cb6dae52938aa6e0884847f5fc90ad453d090f5b1f095d146b88b747ee3690d5643dba896a3a46fe3c2d26 70794 Contents-i386.gz + bf5752e5ff6a7006af54dff8b842c789486dc9df3fa6b56182603cfd1accc52f36a128cf4034bbae91e3751810b28c1412bb68f852672b8a99b9cc635cc06b8f 30193 Contents-i386.lzma + 24a672d018118b6b2662ae702f92d018cc4dff475cbcf14547f022b0da84b8f27fb2cf053b7ebaa6c973fb04438bc28e624d068c377936f54a03739c1d7ccf5e 36224 Contents-i386.xz + cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e 0 Release + 6de201dfed1d45412509c65deb34690dc2d09c6aafccfe491fd2f440f92842b9c755b61dc7bcdd4cc0c9f18cf46c2b3a1241e99c4c2a33fff5555e7b2f0b6348 14 fix.main/Contents-amd64.bz2 + 4a053110d9c4f9f82c1d50c033f19545cacba6b0b4027883022c893afa90b6bc0fcc30146a2b8e1937a8deb9cb63583b1783313579dbab5bf1def24d77939d22 35 fix.main/Contents-amd64.gz + b316debdef4277ed864f0517417ab03d64db20894bc0bc24c1db4e7783510c46a750b8a76661b1febcef04ba6dd375b5ff8d1e042a48d62a903438aeb8b4bb75 18 fix.main/Contents-amd64.lzma + 034b32f1138322638c7a5b7949a3b184c6a4cdfd003360a496c08c56c2cc645c94fbe9cdf9d84c963af6dda6c442717cd61d7e1cecf7024bd463f6f5196c5527 32 fix.main/Contents-amd64.xz + 6de201dfed1d45412509c65deb34690dc2d09c6aafccfe491fd2f440f92842b9c755b61dc7bcdd4cc0c9f18cf46c2b3a1241e99c4c2a33fff5555e7b2f0b6348 14 fix.main/Contents-i386.bz2 + 8f3a116ba8f819145e9d9064ad2066a7c1c27539e15c349adc298a9e24bb9b4c2428d826cf26011acdc59ba818a325c0ddc42a6a3c474a0767758585d3c7a26d 34 fix.main/Contents-i386.gz + b316debdef4277ed864f0517417ab03d64db20894bc0bc24c1db4e7783510c46a750b8a76661b1febcef04ba6dd375b5ff8d1e042a48d62a903438aeb8b4bb75 18 fix.main/Contents-i386.lzma + 034b32f1138322638c7a5b7949a3b184c6a4cdfd003360a496c08c56c2cc645c94fbe9cdf9d84c963af6dda6c442717cd61d7e1cecf7024bd463f6f5196c5527 32 fix.main/Contents-i386.xz + cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e 0 fix.main/binary-amd64/Packages + 6de201dfed1d45412509c65deb34690dc2d09c6aafccfe491fd2f440f92842b9c755b61dc7bcdd4cc0c9f18cf46c2b3a1241e99c4c2a33fff5555e7b2f0b6348 14 fix.main/binary-amd64/Packages.bz2 + 480fd4c10f7c8f217a446b3b7e68e47633beba4dfe34809427deecbeba2164c3bfe430619fc1742514d5026bdd41d4703eb18858d2fdb653044413c51183a92a 29 fix.main/binary-amd64/Packages.gz + b316debdef4277ed864f0517417ab03d64db20894bc0bc24c1db4e7783510c46a750b8a76661b1febcef04ba6dd375b5ff8d1e042a48d62a903438aeb8b4bb75 18 fix.main/binary-amd64/Packages.lzma + 034b32f1138322638c7a5b7949a3b184c6a4cdfd003360a496c08c56c2cc645c94fbe9cdf9d84c963af6dda6c442717cd61d7e1cecf7024bd463f6f5196c5527 32 fix.main/binary-amd64/Packages.xz + 683c9bc5dc45b412aa4451af8e4766973fc1868b1b4126c82bed8fe6a78eced7efad8b3b2c592aae6a716c81aeda066c513028898b477e23c78517273621358b 82 fix.main/binary-amd64/Release + cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e 0 fix.main/binary-i386/Packages + 6de201dfed1d45412509c65deb34690dc2d09c6aafccfe491fd2f440f92842b9c755b61dc7bcdd4cc0c9f18cf46c2b3a1241e99c4c2a33fff5555e7b2f0b6348 14 fix.main/binary-i386/Packages.bz2 + 480fd4c10f7c8f217a446b3b7e68e47633beba4dfe34809427deecbeba2164c3bfe430619fc1742514d5026bdd41d4703eb18858d2fdb653044413c51183a92a 29 fix.main/binary-i386/Packages.gz + b316debdef4277ed864f0517417ab03d64db20894bc0bc24c1db4e7783510c46a750b8a76661b1febcef04ba6dd375b5ff8d1e042a48d62a903438aeb8b4bb75 18 fix.main/binary-i386/Packages.lzma + 034b32f1138322638c7a5b7949a3b184c6a4cdfd003360a496c08c56c2cc645c94fbe9cdf9d84c963af6dda6c442717cd61d7e1cecf7024bd463f6f5196c5527 32 fix.main/binary-i386/Packages.xz + 523e356481aa27a6773e6231ab7ab872d0114a441b5fe7cc8e7867e404381c0f7cfb49b9e76999f2d7ecc2552661566b8f54ad9fcc18b8c1a00389bf9682d363 81 fix.main/binary-i386/Release + dfc898b8e0db444a37b71171c604e2190532cec78680373dde0f77df1fba96be4e5380893e48926bb010789049dd78399250508b55e1f9c5a5ed4a1fbb77f943 83 fix.main/source/Release + cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e 0 fix.main/source/Sources + 6de201dfed1d45412509c65deb34690dc2d09c6aafccfe491fd2f440f92842b9c755b61dc7bcdd4cc0c9f18cf46c2b3a1241e99c4c2a33fff5555e7b2f0b6348 14 fix.main/source/Sources.bz2 + 72d55cfd7565b1e87a306bdff658e7bcfd51edd7e768f76680db2cf5626937c7d691c955e22e79ca299f03bce89d820704d1567c7fce33c7391cca4c87f5caa2 28 fix.main/source/Sources.gz + b316debdef4277ed864f0517417ab03d64db20894bc0bc24c1db4e7783510c46a750b8a76661b1febcef04ba6dd375b5ff8d1e042a48d62a903438aeb8b4bb75 18 fix.main/source/Sources.lzma + 034b32f1138322638c7a5b7949a3b184c6a4cdfd003360a496c08c56c2cc645c94fbe9cdf9d84c963af6dda6c442717cd61d7e1cecf7024bd463f6f5196c5527 32 fix.main/source/Sources.xz + deef2cc5a45ff673817b5c3a23362baca78f88e14c197fb89643305199f10e1336c284078e28d9e2642075b72a1c5586ee3b3ad45ef9f7e3b7aa1325bec5882c 40046 main/Contents-amd64.bz2 + dc321b5020a0fa8b30c5c710571df2bf55ac50cd4f9fd68ea5214c3a10151b584df37da5004cd36c2472675ee8389bf7b5e03c513a8a31a8f31a5f7288573908 70795 main/Contents-amd64.gz + bf5752e5ff6a7006af54dff8b842c789486dc9df3fa6b56182603cfd1accc52f36a128cf4034bbae91e3751810b28c1412bb68f852672b8a99b9cc635cc06b8f 30193 main/Contents-amd64.lzma + 24a672d018118b6b2662ae702f92d018cc4dff475cbcf14547f022b0da84b8f27fb2cf053b7ebaa6c973fb04438bc28e624d068c377936f54a03739c1d7ccf5e 36224 main/Contents-amd64.xz + deef2cc5a45ff673817b5c3a23362baca78f88e14c197fb89643305199f10e1336c284078e28d9e2642075b72a1c5586ee3b3ad45ef9f7e3b7aa1325bec5882c 40046 main/Contents-i386.bz2 + b05483947647a5b027553cea2483a12766e6a390f129ecc5406775b41904316edbd4b4a8dedcc8af61f5d59e91430509a57cc875457e10a15d9ba9ddbbaeaf10 70794 main/Contents-i386.gz + bf5752e5ff6a7006af54dff8b842c789486dc9df3fa6b56182603cfd1accc52f36a128cf4034bbae91e3751810b28c1412bb68f852672b8a99b9cc635cc06b8f 30193 main/Contents-i386.lzma + 24a672d018118b6b2662ae702f92d018cc4dff475cbcf14547f022b0da84b8f27fb2cf053b7ebaa6c973fb04438bc28e624d068c377936f54a03739c1d7ccf5e 36224 main/Contents-i386.xz + 260e0831a6dc75f8222505d987254512e57b208c2a7982de9666f14a19df9179a62e5e1d174c18ba6fd3089ed005e68d81e8a0db2751db4bb1a17a1ec02fc20f 131182 main/binary-amd64/Packages + 057af6669a8acb6984bc108bbcb3b95f44f957438c57e2b2bf75db71e693b640a108aed36cc0d5d4de7d15b7d2715a72031a83ad8ed400cc32e86779e281b3fd 30571 main/binary-amd64/Packages.bz2 + ffd4d4cbfb4121925645b187274beca5672909979b66eae60e783c9422d318fe1f17216016dcea913705fa2818414828ca58116a0e0df11cfd1b27ff5b79cfa2 35714 main/binary-amd64/Packages.gz + 5705ebea09267cf95360de87a9235186efc43324eec50fc012d500bc44092f851e71e051813d4b848d0efe712d7f73d93d0304bedfb0c37cb0dfd1da4fe1ab8c 30484 main/binary-amd64/Packages.lzma + f7afc377c2b415a760b5517008e48cf2808237c884c1647a553c9537ef9a36d5a4d671a6364abbb6da03c9346e4d154fb3aa89fb45da53a66fd8c752a8c3a5e2 30672 main/binary-amd64/Packages.xz + 179cf25da419c9ebba222072a626c8a580149ef9ef5d32854543a353b8c7016e5fc4ae2cc62ab319eb425f78f8fe035345f457da2f8f16edf37d8ca19cf39e33 78 main/binary-amd64/Release + 6080950b0b17a721c5602a1b1abdc133bdeab788594e0fc9be420dd7a5294272d749c39ba3ae656b9307287fefbd5a510c8a357db8eb825566aa648b7264bf4f 131624 main/binary-i386/Packages + 115ea7d62dc20405258568496ff83ebd4f94b18bb4765f1696c5f85ffd8c9235a7782bc96bf19e6508807a61e287fa8d5108453ba3cc0200e1666ecfb8d0be50 30754 main/binary-i386/Packages.bz2 + e3fa2bc603d1ac50fd052c5dd1815be58e6961eb8cfb75c7186bb5cbcad4475ef6e1eb5c02465573f07821fdfc0004c63cb2afb0813a14a474a41e2a7f4eb72f 35930 main/binary-i386/Packages.gz + 3f56b0bd884d18cdf1dcd5d6bda79fd2b2858a0de0514cd4b7509a6496318a7b19f4567fb53d8dc94ac724f19efbc1d7bc237fa6ae685fde8a96c2a6117ab386 30658 main/binary-i386/Packages.lzma + 5bba16206bdc6423e392178d36545d76fb5c251e9d8441f220a03482c99804bee334918bcc7f72dc548a5ff543c779fcebdb1f8151426d694727dea0dd4d0d2b 30856 main/binary-i386/Packages.xz + 0da68b24c97c384dd548df28cca299ff814afb85ab4e5ef7162c79b5e85321762fdbc1b29a77bba7ac7f1ac1c0218c3471aaf4f8f4f32eda1cbb7cb0b8bcdfc0 77 main/binary-i386/Release + 416bc35a5fe103bc0de794b2062aeed37c18761e14a53ccf497c55aec55ba5e42e3bffad80e916755420dc6ccfef0567ac99448a076c4dbcba5bd16d380587c7 79 main/source/Release + 2cb91b1896af7d34fd28ec08df5adc3958083361801436a55275c88f92507f5a2212bbd10ba563191a84a302baaa4497fd6b537ce24e05b3448d49e91fb82415 52196 main/source/Sources + 2ecf38aa94a8e147f87978930b7c34c273569b5c0b6034676dbe1509b4c3c3e46eb3a947a42f0ad9e3cb572d00b77e80379ad7e118b4558043c45ed5aa79c868 14191 main/source/Sources.bz2 + c9a9e1c82ac8b98433bee8a5af295a2f0c6c4d372418f9bb23f8591320b5322807fefeab2dba70d2dd9c9adcb383701417f731f91a37522006afa0245d8e8dda 15917 main/source/Sources.gz + 9cc084c4a52d28c7d00abc9f2e0e6fa4573c1a940ff5389bbf4a01b23a8ca482fba688dc4feb4038086062c398da9b33158b3df58fedff9c5027e8934d75e740 14026 main/source/Sources.lzma + ca24259f68773feec570ca11b6953c322c088ff1beff3b3027ef76944dcedbf81816959e58981335985fffa2521b0292e7812815a5faf1896d355c655cdd7417 14096 main/source/Sources.xz diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_Sources python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Sources --- python-debian-0.1.21+nmu2ubuntu2/tests/test_Sources 2012-01-12 23:42:27.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Sources 2014-10-22 08:37:11.000000000 +0000 @@ -26,7 +26,7 @@ Priority: optional Section: devel Maintainer: James Troup -Build-Depends: dpkg-dev (>= 1.13.9), autoconf (>= 2.13), bash, bison, flex, gettext, texinfo, expect-tcl8.3 (>= 5.32.2) [hppa], dejagnu (>= 1.4.2-1.1), dpatch, file, bzip2, lsb-release +Build-Depends: dpkg-dev (>= 1.13.9), autoconf (>= 2.13), bash, bison:amd64, flex, gettext:any, texinfo , expect-tcl8.3 (>= 5.32.2) [hppa] , dejagnu (>= 1.4.2-1.1), dpatch, file, bzip2:native, lsb-release Architecture: any Standards-Version: 3.7.3 Format: 1.0 @@ -68,7 +68,7 @@ Priority: optional Section: devel Maintainer: Debian python-debian Maintainers -Build-Depends: debhelper (>= 5.0.37.2), python, python-setuptools +Build-Depends: debhelper (>= 5.0.37.2), python:any, python-setuptools Build-Depends-Indep: python-support (>= 0.3) Architecture: all Standards-Version: 3.8.1 diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test_Sources.iso8859-1 python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Sources.iso8859-1 --- python-debian-0.1.21+nmu2ubuntu2/tests/test_Sources.iso8859-1 2012-01-12 23:42:27.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test_Sources.iso8859-1 2014-10-22 08:37:11.000000000 +0000 @@ -26,7 +26,7 @@ Priority: optional Section: devel Maintainer: James Troup -Build-Depends: dpkg-dev (>= 1.13.9), autoconf (>= 2.13), bash, bison, flex, gettext, texinfo, expect-tcl8.3 (>= 5.32.2) [hppa], dejagnu (>= 1.4.2-1.1), dpatch, file, bzip2, lsb-release +Build-Depends: dpkg-dev (>= 1.13.9), autoconf (>= 2.13), bash, bison:amd64, flex, gettext:any, texinfo , expect-tcl8.3 (>= 5.32.2) [hppa] , dejagnu (>= 1.4.2-1.1), dpatch, file, bzip2:native, lsb-release Architecture: any Standards-Version: 3.7.3 Format: 1.0 @@ -68,7 +68,7 @@ Priority: optional Section: devel Maintainer: Debian python-debian Maintainers -Build-Depends: debhelper (>= 5.0.37.2), python, python-setuptools +Build-Depends: debhelper (>= 5.0.37.2), python:any, python-setuptools Build-Depends-Indep: python-support (>= 0.3) Architecture: all Standards-Version: 3.8.1 diff -Nru python-debian-0.1.21+nmu2ubuntu2/tests/test-uncompressed.deb.uu python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test-uncompressed.deb.uu --- python-debian-0.1.21+nmu2ubuntu2/tests/test-uncompressed.deb.uu 1970-01-01 00:00:00.000000000 +0000 +++ python-debian-0.1.27ubuntu1~ubuntu14.04.1~ppa1/tests/test-uncompressed.deb.uu 2014-10-09 22:45:12.000000000 +0000 @@ -0,0 +1,5056 @@ +begin 644 hello.deb +M(3QA73OS-PA-UYQ +MA5U2BOWK>]:TC:28K9$'%2C*"THKD3.'=\X]]V,NKRX>W03,6[L\I;?BM\]/ +M=B&%='9QW?MXN(X'VCJNHOWE-_^IW5?^OQ_U"ZO;HN=C[?S +M(W['$F!GS%K\G5?V<_RMPSHIE3(7G7A$GS[;_WG\8Y;D%?E0@U+2D=#")I>C +MH.2EL*'KCO-TE?K]U8Z'8=Q(43VE7`*QL9%*3=FX8*K.L<0<]6G]O*.)KX8Q +MT\!7A:_^]MV;'U[?R=MRD[+&M!&U85!N*T(9\M$:%&/$MI@$U +M'5>@1`J2*$!*HMA4!/DD@K'9D,F^M*!X;D-5GZQ(FI3.@EQP4DD9$K/U.1G% +M+:@ZM:&\5-H8([E8841E2EQQU"JMTM+KW/)J:$-9"=9MR+;ZH(PU<*W&J"5S +M]=ZZVH#:4AM*%O8F%5EE-@8@%`FX21:]+D0VHO`(52B618S3,.G,6NB1/ +MQ>20BG&QMKR:[U>X,J!'U^J2#ZYF$D4Y:Z*(AJ1F:NF*YS?/_KZB!XH.:LC6 +M!A\#I\#!AQP(D$*2;#'_?O?FNU=M--8FJ>*+J*%`\2[4Z"HBR$('R;7%V'XE +MCCJYQ#'5K."6P^E4310J1,J)H-L&5%_:4-'+:`EY`KJ\B:Q\5F2\REXCG+%) +M_HI099*E,O*1`_+7!1"<$?NDD09HE[UR),2G5J@_CBKJRJ4Y*(R(JA(KD')BJ +M.+6,%#SY%E=OVU"*+7S@"(&F6KT6F2E7Q"$YKD+95@0/:U6+=76*!'+92.F4 +M538I4M*B!)%L>?5VA?8HO*X"BB(I2\A0*2$A+9,*2'#B%M0*5\A6BO%VX\ZUT/J[H"K07AUS1'DVX!DJRHO.4HJ,.)$R+J[L5 +M75DEHH2T?"6/'([0E1`Y$F,`A@B$EJBZ6Z0J)160FI-(ZX[QRQ@3&*=6E#9:H5+'H&%2=5<0A +M"MGJ%VF[0I?4Z.T8;@O*:ERR.Z6(X4MI+@J9T(`ZK&50*9AK'.=L%3([JR`3 +M)ZT85U6DD?3L*Z +MPF2KKJHJ1#2;B'Z6`\;,WP\/9MV`G*6B,!QC,'*./ +M"W1U+\SOMM[2?OF1'UF4RU?_@?O?)>C;'Z9Q>+0;YA?O_Q)%8[G_0]&8GYS[ +M3;E77_`LN,$D%X'MWG.=[PO\W4W]"F[[NMO_PPT?>F>NF\V +M+_>@>QBX/+WIWV.##6'S`_7[`WYXNNYN:'_H:3MV/_4#=7^::7^//_Y23HDY +M3MMO`3_GJ;\[^?7CCKL\T#SWN=M.S(=^OWW2T;YTU&W'L73\*]W>#;SYL/+[ +M5_\XG;.[F\;M1+?+LQPSSUA>Z;8?>IJ>='7J<8#AW6?$RZY[>=AT<'Q\F+O] +MN'_ZWAT//'5S!E!FK!B'[F'7Y]VF>QB/0^G&PXZG +MAQ[;$G?'/=T3CIF&96F'CVXO-QU>-PS"C_/P[@G>'(_;W36>_=SA1?M/1^O& +MVNW&AV5G&>'%J8AU=Z?``N7E8=D`U$\?W9^"O&P\?&3E]33^@B!^-7?_/!'T +M,$Y#^>H33YONZP_N+T#]8>:A_M:!.D[_#O3-Y1\I0F<[V]G.=K:SG>UL9SO; +MVS3[%^2'WY0`*```"F1A=&$N=&%R+R`@("`@("`Q-#`W,38P +M,34P("`Q,#`P("`Q,#`P("`Q,#`V-#0@(#(R-3(X,"`@("!@"BXO```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```P,#`P-S4U`#`P,#`P,#``,#`P,#`P,``P,#`P,#`P,#`P,``Q,#8P-S$P +M,C4V-0`P,#2!C:&%N9V5S +M+"!V97)Y('1E7)I9VAT("A#*2`Q.3DR+"`Q.3DS+"`Q.3DU +M+"`Q.3DV+"`Q.3DW+"`Q.3DX+"`Q.3DY+"`R,#`P+"`R,#`Q+`H@(#(P,#(L +M(#(P,#,L(#(P,#4L(#(P,#8@1G)E92!3;V9T=V%R92!&;W5N9&%T:6]N+"!) +M;F,N"@H@($-O<'EI;F<@86YD(&1I2!P7)I9VAT"B`@;F]T:6-E(&%N9"!T:&ES(&YO=&EC92!A2X**B!-86YY(&EM<')O=F5M96YT2!'3E4@2`R +M,#`R*0HJ($%U=&]M86ME('-U<'!O&ET2!A;F0@7)I9VAT```````````````````` +M```````````````````````````````````````````````````````````` +M````````````,#`P,#8T-``P,#`P,#`P`#`P,#`P,#``,#`P,#`P,#,Q-C`` +M,3`V,#2!M:6YI;6%L.@H*+2!297!A +M8VMA9V5D('-O=7)C92!T;R!E>&-L=61E(&1O8R!D:7)E8W1O2!A9&1I;F<*("!V87)I;W5S(&1E8FEA;B\J(&9I;&5S +M+@H*4')O9W)A;2!#;W!Y2!O9@I-15)#2$%.5$%"24Q) +M5%D@;W(@1DE43D534R!&3U(@02!005)424-53$%2(%!54E!/4T4N("!3964@ +M=&AE($=.50I'96YE7-T96TL(&EN("]U@`````````````````````` +M```````````````````````````````````````````````````````````` +M`````#`P,#`V-#0`,#`P,#`P,``P,#`P,#`P`#`P,#`P,#$T,32:&AX +MR_*]N;U(0IB'14KMV\E-_WYRTQF/.W\;3W[K#$?=01]F-4W<@,0^J6HZ#*TD +MPA&PSYKEN[\04HIM[X582]-;T#+0'%+7?Z(D#DU8(6]! +MGI4S#9S.*3CFE9$YHEGQJ9J.J*Y&+!*XRU0(25PQRBCO=VCX!WE]1Q?"VF +M/^VUFZ[I[22+]W:3#?R3N\'X:[?7&6FVMW8S"G=SB_=VD\6[G%MK[0ZJ5W2R +M""F-<7'TUV\;6V\SRCM>A66?V:@&II-_(J?"1UA!32NL1OG4`HU^0?L,N7[_ +M/>3J'"\I\9,X2.(*B7QBHN+&^-PJ8:8)Z7 +M80*:_LVTIPX%<)KBUPO+L:-@Q9Z,("TR`KS[UNG=&;?M/@YDDEGBNB]@:-0C +M5NA'D0J6&3!;D`<#"!Z:SIS\L)T9]98)C6`\O**MKEPLW)\`(EO,>@/'KB97 +M@_[7[LV$Z1(`V'7H!V1J6H^18T9+--L-$$=CQR=])J0DHN2!6DN?J+2XQNGK +MZW6W;;T,F43U*!*Z1$('+L"U@/'%]I\4@"]9J$!!%=?RU`0LN_43Q_<6^$]S +MZRUR'RQ`.RFNDGA-!7AO:/E7DC>_\T97P<( +M">MEH83JT>=(VU!2D.6P/;GNCL9LRL1%SPJK'WTFD>T&SOR%^&#U(:$_TQDV +MWA`AX!06U-.B)7+AF:[PAU/?CR,`L8"8WDP8''$C,%UEE"S`_3$7-\_$*K`B +MDZZAZO7#I`NK-1K<#Z\ZD\OVJ%.!K[=U]A'F.Z,.V$4%80VLTPQI00G,**(S +M@#+G!=TI`I[ES@!=*$CGF908VR9(=";"K@8*!+'MS>:S6_YMB/6F">"3:B8_ +M3]Q'VXMBTW%F=A@=:1%UK9&Q67\#UH##1/:>S#`BI=O13?=Z +MXB4&2$LS*BCP$37^F?OW>MX/-CV8@>=5_K0,RTZ#D/>_X!5H"$, +M_)_I.FE;#?'K??]JTN[U!E=M'GO#8UO0'PVE3OR0C;AI5*/[R^ON<,N#8B5J +MJG%Z@,+L\T6H-FSJ&1/20'M]PQ"PY[93$7]5TPF69H6%?!41Y556\2@R1WBT +MSE62OP5>]`DF2Y_):O@Z&D:&A1W;6CZ;X'E#3$HH8V$>FMXC@`2XX,(!ZMW& +M5<$1#$3;;()K([!OS,-[--YB>&AR5[U.NY]*L0_<@][;)N!-A:5=8'QNH"XA +MS*`PWUE!F;Y(/#*2V_V7KM6TM;LIIJN&UJA-M]UU@3M5UYJ8$6[&0>BQC0IY +MI."E.ORKGDFAN?)V^Z4P!-`SP20V2)R]F<2&0J+C`1$.:>!@ZH,6Y\\9>/Y) +M0U^%M)7,_="%BP5%/$Z>[7@)X9ST;"U[4'N3>[N/-ND31(^"`BE3Z.^2HYZ7 +M8S43`@"Y<90<`4@"_PP1F4,:;3I`P3_\G2J6K,J +M&28W9UP9%@F`1S,MRT^\.)5Y-ES(IW.D+"!-+:[PC*@JXA%1(=FUBJ0$=IR: +M!V'F8911ZSF.%!26)$-:XC_9@.0$K"S#Z)2X:3%/PJ*&U%A(":U%!S\,:3C* +MB;][9R;`,L028;Q=`5!$>9$U5NN'_QVA`L?36-/R7F_2Z_9O[ML(2;O.] +MF'IQA!(#]RSNHB0*"@]@(#Q]_]BI)%:2012KG6:4=;6F'RR9C,;A2G*(BN0G +MPMV_$B4!#>=.XB<1/."Z($0&5H/[\=W]N"Q-#+WQ42+;$-$NXW\;I::V*S'I +M##O_5L8E:AB;X48*B9/!W1A:XJ'85 +M`"%YM\ZC*(RJ>I/V[==>^V;=X^(3>_C:)AFQENDX:Q&0C@61X_V:XTBVB`,4 +METDQI8Q)L_Z>Q:ZO69JHP.0LIY:-=GJ(];V&*:QP4?3\XF<6XQ2]:9&A:M'S +MBM)H!YC$/EUDDIO94:Q._[0#H[A-R;DDRMP%!B%5TTJ%E[A3&!HR4+JIR-E; +M&`G8\0Z8X?B2@0ES>PQY(*^B5NR'+PQ\"HJ$/E6M=EZ6Q'$TJ")G$+J(B)WG +M^03S.FK.TG`H=W.4EA7&^`\^T)<]%LQKRYN#Q,2.O&):Q("\"E(F6(74JI:: +M[64S;*YRPP,77%2Y.C]9-I2%B=9$) +M(/>8[6U+L+B$4X\#"1W?@'F*0,@%198RJEF,Z4*:2;,I`M4HH!AF;8[7PLT& +M]&KDKGWUO7W3P81[V+D;#,?;'EX/@S'>#2$F"A<) +MD+L9L.2E%:0WN054%'SSV0\?82"('F$\H)N&8;I65X,Z.F?`<79]+OC2H%A=V^:H]O.F.XQ;Z)(DJ%>7IV932^N[K['6N>OK?';42+EU/LNXK;/J\;&)]I%:?EK^3(JA*[GKHL30NV`,I_:Z +M^$ZSH6K'YI1&FE/FJASW3`8?BP?-5R15.R0^6?-0HB#CS-B>*[@H#$W0Q4K4 +M]?/#%`/8E&..3W($4M2RQQQ[&ON^PW/PN1]BZP`6(2V>,PKD^:]%0J.H$B73 +M_]$^5*`0HNR2:17[3_2S#X.%&9U<=U+2Z)^/*T=GJGVZ1[.;VENXFML92S6V +M\\I9ZEY]^]'N8>A^"$O-?=;6X/8`R3'/N+/5R9@P)"0^D(EMTZ.8B.GGY^=L +M,4\_D+(]RRA7=YK>6P77V">X^MM"JS],B:E=R'G4=)VGE#)N\NL'4,Y!97U+ +MK)^?:4W;(:/ZCOPH7W:16W#$=MFWSM5WMI\.SUSA]C/6YTE`@?\2?EI2)S#@ +MQ;+V6O$("Q0/\%21E%C#%'F(0JOX%_$2C@O4V>8,VWM:X0X.@7`$CP3F@DIB +MU!L?N$!!/+D<9L1/=SKR_6M4(ZK4`U8ATR3&#=*0/8$S6:N'X#ZI1RT`:#-\ +MV:?(QJ[EK4F\Z[5C>3=D*@?J?QS:4[D)J[_:0GR]IO@@7EY5DQBI'?J@JL2. +M4([@WDSOA6"M&<+>!3C=@H(;43[(VTRIK%[\E9`'?);M9Q>):V-O@!TS_8KX +M#K2FHUA=]^7@/V]L$-?2UPD3\'?6>8OV'0`THC^ +M4GX;RCQ0A]?I'B*6;W&![Z[)7T1)1'?`7ZZD+&T]UED1(\)-I=I[AUAMUW(= +M^8P[^A72+;HD8=64W+AL,T/:(M5K>S%+YT]T^Z,Q2(L5=^@SK`[+]67BHC.` +M=5*HV(]R;<>QSP#$CI`5<86W&\@]%]D-%`5`A[%;O0\0Q;XG%V5;X!E7'[!`U?(>MO3S-\4V#V%23%G#AL3&NUG3]Z5C^MG;.+/C%6>- +MW9[Z`,[V93JLMWE;23P4VS-2#:VF[LO"G:Q.SXS233?.#AM7P`K(BY+KYWE_6/YE("2$5"$Q,% +MGALT(#'(Y04<&3ZQ+@%96+S_R'9PTT<,@."8+D64+71=K54/7>BMF80ID:Q^ +M@%;OB]OUQI9Y&TN9B_K[N=@7!.OU=#QC=W1SP'CU?>/Q4'1]VG-MQ89>/WP] +MU[C8%N\*4\NW@>[S0KKQS[,%`VU!:GV0B*WML>S;@-N"-N"/32M.L!&OH*Q+ +M&Z.O$8Q\:[X0HT'TLU;]O`5BAQ78L2MX\4BU*PK1#7!UW>$KT+X$G%+[O5%: +MEQ$G(N*@=7("_]!A3`#)D4S +MM);V4]J#/8)XSEJN=57I@492-JX&=[^#;5?2V*$B10>5@B*B`EXK7>O!+-Q" +M"-X.0@+9F*&W:K56HWJ@6+:SY['1V$*`IJP`+;)".XA9_P+PQ&-5#$!+&>\Y +M#BN0?%L:AI0_**(A,-HD55B_:JO6/)#1#9_1'MXPVQBV;W$?F;6>?.9=T1#Y +MKF],O4TU<7OT8>'9<<2LA6D@[D!-VKV[;VV8+Q;$2&J<*!O>C1Q2!UORI&=) +M%"?S.?K;VW:W/X84M#T<=3!'?8!';4\O9EH-4JFA5$"QC?/W2B4+I%.!9);T +MZ.%!"%BL*1IXB,.;,1_>(-7S5K79:IR^8WCNF#8`ZVMH\T%THC=;]7H+PL/# +M!LGBXC0;VPBJ=5?,YBN=XFR8)`^?C;S+@7/Y:^+-Z%S>H!##_*OI,20"B8'5 +MZ>]:LS5?4!4BPR%TF$"U58=1#E6+U[;$0\HB%>QR$>?!"!E#0DF6$&QA)B(> +M0"QSA>D"-PHYPPD;J"COX29S6+B:OXEV&S"3#%0K1#",#_`CAM%K^]0F<2D6 +M*NS(19L5?=SD0:[%%^$R9'3X,>TLC$@IBGV'BO;^W+Z2T>0ECVGH/\(#B'*K +M#6;4-Z/L+F3*06`M#X`F;8"C90GZKU5O7T`U7V +M?&44"JGC"`;XH<9[@2Q7TV/N-)GT9_*&_*^FT]T +M288:N5F:?]H%Y@&?"D5]3BT!VH)^VP)=767S3/-+(Z3%O)?I: +ML('-=VEZ^I'5T_#+26"&IJMA>+G;9,@K%K/F+%/,_0(Y`SM9LORE\AYC9")A +MQM@X:U7U]XDDESN+VH(HOF0+C$.TZ@U(+#YP+-PN`#?SZ!//P6IZX)`@)I%# +MHB2%*2@$(+V.R%NOOV,*+9*%D"4# +MTLDR/WFR'DQ7Q%&U@B+:NHC+Q-\%N\40:/P]G_\D^\/K:^F%BG$Q^4XR=]F+K'O@G('N@!,*O +M"&LK*!>0`?7@E0OVS,7=`#]OD=%:=2_DYW/2#R.(W?X;(DHO@EB7?/G#9Y\OGL`71E/_,=*"IR?-B[U$\_P=:1^=\5.] +M?"][Z/NOPLDX&X+'4RJ +MVA6APEPQR>H%IEC7G=\FEZO7LY]$P*Q>>E1R^2M6-?84*D@Z:D%9PE,T%/M_ +M3)QLU5BVW#B5Q/G61!;3<(SCN2K4*[S71B0D3'8L15DK1:WM+&UFP6*7ZFR+ +MG<[MGRH@,$NA`8-QR]O--FS2\H,.FHZA!P0@'Z+I?'::PL_BC<"C#$;=OY41 +M*BII#,FJ%,PC`..?5^?=K^[NRL*[:-N$5ON<(I5\1FP-SP`O1O"I.ED0J8Z!9NW\ +M6$>`ZX!H+Q_&W7!,N1]C`7V*N-\@Y,KW8A/L@\TC>XK@8+8TQ8(BYA#!FE0Q +MH=B+>[65OBFDAKA7K8H\](.0U9`".J/*BC/55HU%0Z^>@M(6S[,%*]3+VH8D +MU4=;VS,J>^35!=A]:1:793R&^_Q?H/[5=HJ +M_[(/+UK+/YY3$#_O(TXS+@*'_<2/-_Q]`F3,?Y1QZO">7$7`6AC>AH+!NI%5*@$DEVE@58I@#!2Q-MD6Z(KF3?JRE4=VB]*+NGQY_$GL82(?8 +M-I&>#3__)&DK__]1,K,62K6\D"A4IZ]KTBQP[95?C,RX6P +M,KQ>R'VI<(VY:("4L`\<\IJ5)$OB8UK_[T]*FJ:5`>G-11HL%!2(%E)/,/%\ +M/RBNI\&DU)^4LU,]&\]BT,=6I8'1&*3ZQNF!JR+_(!5*KMO_.E`A"E<[_?'P +M=RW]91TU[89*?]2-63_=LF+I'A9;AHL$XK^8]-K]FR)X@L&C^?+KK[_F0X]5 +MV/&THDTB2.YG^.-+4H%)4U)P*2CK<4CFPP0V=D^)JSRJ@\'URFPJ+%T7 +M%C*,R<5X<"<2KLO!&#+L"XTY(\%`MJ&Q%CMETU#(0SZ.*E;8E322*O)FB(=\ +M,%7IK,5I(+I$AS5QA<>737/B+ +M,2F"P#WY)#/_+M4VR]E2*Z5\833WZR8HEOSI.E&\,.4`,'>8@D\5\-%# +M+E>?U^L954'9`%?>PPIQ(:ZY/>4/3`-'&YYM2/;&\=LHD*$OZT$)!)3=GCZ" +M$*5`&UXP?AY*-4=6Q'!ZO#K4FI8X +M$K*WZ)P$68\0?/"G*U)6&_/M4*OYE_GW0DC3LANXJ]GT*T.,3I:(^H_"UHC` +M+V/3/YXG!L1@1HDS@))2W'%<=;CG<<[Q.#N@..2XY7 +M"1L&\?<-QY79U$5AWH67NBCS2&6K(8!J^]'2A19ZP(0; +MP`T7J&.2;^5RN[-9F`HMOVBM>Z^7"LG!59%;V<_X1>VZM/1=7R;'GF`GE(7. +M-BLF9#?:N`K_0V%=(8+A&PSM%]#,]3<;5@`````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````"XO=7-R+W-H87)E+V1O8R]H96QL;R]C:&%N9V5L;VU92(D($P"OB[+%LR383W8YIY_)D@<"01`1@ +MN!A`-'/R\5L],R!!B9&E'#]8)(%!=W5U="WOD*I$D%3]0 +M5?=_&Y[V]^086]U%8 +M+L62JH4JD72&S%,1*N%8P!9A=!O.$+Z251$)9%G.9572^W>GYY2%>16FYM*K +M19G(G%H9Q5(PB)3*?"8*$E\35=+!VU0JH0)ZZ;:'@V'WT-FJR*(01::!74A5 +M)HCUB#%*\JFD:<+HAP`K2Y1*\AD67SX#J'&(Q6A(IR)BH'KD]H-V.W`[`,K= +M`LIUW%;W20S2G(F3@E193:@`P$7S$,@IFLH"+$F4Q>KS(@Y+?K;,I\G,F55"*0V9_4)5 +MDV>@\JD2H,^`?JI2B\HPZ':#]D/Z,"J=1U%Y0F0ZF?>7GX]__N[-^/09<5[( +M'-7KTD]ASG%VR.T%'2_PVSNKYS\:YX6,DVF"0"_"6\&TWPI2%1A6 +MSD/N6*R0IBW-/JZ@0/UT>XI8=V]<%4Q#K0%5DL8.?4*93"\O97$;%K**=<8( +M.JQ*J1\PJ6:TG"?17#]/Z95L>RF.`F"5(0(ZKE1QK.8@_#%'<`R:.;,_GZL, +M-*"KJ&3(?'*]H.,'7F]G:1^7S)U$[3GN%E$+\;\J*41<$U4)N@GVM598;6,L +MKJ_&H]^09;9($6L$^G%KW#C[F[NB>29CJKY?'LWDC\5OC`HR3,KD3T$+*`3W +MO\S5,0Z +M)ZOQG(YS$`@,ETIHD +MLC!239GF2$XU12Q_4SF[?[<6?-Y='[ZY>KZT^CJEEL\_>CZWXJ.>6)*1A'0 +MU+1GPNCI@((VH^QY@^'00'TJ;6=@U,@P2[A&I5"&;-I_&N_)8TXW49(.ZA[, +MH[2*C>K8YC0D*Q)9).4*%!%IK!IPE=GB&`0>G5P>LUX4TKH;\*7D_H*DNO`T +M$90R?R*(6J\]OW:U;6U+,.Z'`+%['\3>HR":9JOQHM9_R7'L7&TT!/0FCUD_ +M:S%#A]NIK*4(8T[/>-845M4\2H1Z:C+:>7:T\W2'PR&U._#G@3?8Q8CN-V?/ +MIH5L$=&)5:'G2*.[..B)$*C=LJ['-=0&4(`*[SZ,S5=OJAD,IJ89Z@E%N4MD +MI>JI!E)MM+[3:WM']-)K#X>#(_/9-P!'M]!":#R@:L%.YUG59*7;&?1[#6'E +MT<_2KZPJF7V3HGTS=O8UV?9Y-N[7^:W8]NN1*7-LQ[!90YH0)LMGU*H$->', +M6'"4=@;;_!L\EWY:80;:+NB*N>W`PZ;*WT6_CO.XW?S]Y/+BDX+#!L\QA8C'T,$2O8KY3Y,5%='R +M=5)$SB;%E^9//5&(#EAG%'/A9Y:!O;*:_X%RYU-HN-TH8YO#)Z>I!:)J`V[%IY<[4PR")\!4V4G$QTW\[X+]A&0'`^+EK89:;"C6J+RQ@5PC +MKOFZ40\TH.ZA0Z/]S!Z3X(YZ*V3;VV1M-CI+64$Y(3-61@X-1_85>J#(TGJ; +M"+;#@J#!Z^[F)4<75TV;R]LO_AH:H#V'-9@_T(B260[/$>N]LMYEI2$$HDS@ +M5/"X$9*(T3LZ+FU&5:GI!Y/](=31\VE/PF9RJ>`6]RB;\_^M$B&9)W1Y=RCLN:1\Z$[@P +M,#[<2_MA2;^Q%_E6&7>/<$!H#Q;,X=41)0YL'V"1MHPZNQ:CM<\_^^G30,&305I?Y=51-5WH6%PG@S8XHO +M]OM6B=FC\M*@)9!+I;SE&G$0"#^=R*_FZJZY>BS"`BWW;CS^='FJH\>PQUV1 +M]HYJ?9\)&;OP>D^9)I.H]X02&'_;V93`\X).FZW9CA+X3SHPPF1XL&$BO15W +MVH^=,!C$XZ;M$9D^>HUCZ$?MST8`]"=X.3@#>@7`7T?S!!DZW-0YS!PGYE2W +M?!HVK[1WMW._9^76OW]&J'/SGF`[[0Z3R[#>**ZWFWKG9(EDO:;S-%S:^/=X +M;M&\8[SGQ +M\?!L;OR:JWM"BRUL3AC-;?FVVH/=D!*+L$#F:U4R_[>8T>L/";1[40^C9Z*@ +MZ^MY=`(9,S!T`[\/:[<+AO8AB:_P*0FW&V.N"CN!M9=PKC]<7?YN#P*6K$5L](W]>F[Z +M?-CKM;?2Q];4Z^](?_AWV9]?_6JR7_.8SYXB/I-02$#7M+7^K97)6.S;,SZ- +M@^/41WUO_T8I&T?\!W*B9"I*<;@&ZJA&Z3_13BF1!J +M\1\V$/2#[A`MM`/!_C<1?+N)2G>1\9NLA!Q]W23/9WAO$Q]KG!?X@QWQ]0Y_ +M6`_VG3&=G;_371=J);\N1.M4-[;=71J!/X$T)26JS*\-],E(?8;/C:ZW![LR +M6/[AME]'E7JH3IBL&+_KZ-N=P._MF*R=G=&;F'8=_#X]"EUBS[P10A1=/EWS +M?0128ZA/M=FTU=,-NV+"6GM[W-)%`3#T[B'3;5SR2XY-BSL?STY.+\Z\SVPAIZ\Q)* +MJ\WZ8-;LZ9Z^]''+AY?]HXA,4C[Z'U$'3/@F[.A,Q9L*FV?;O$.R6UC5"K +M92;+KO5$@25`````!P````<````_````"4```#<`0`````` +M`'`"``!L````<0(``+,```#>`@``%@```)(#```9````J0,``!D```##`P`` +M+````-T#```=````"@0``"4````H!```+````$X$```M````>P0``"````"I +M!```)@```,H$```?````\00``!\````1!0```0```#$%```V````,P4``+H` +M``!J!0``#0```"4&```I````,P8``!4```!=!@``)@```',&```4````F@8` +M`!8```"O!@```0```,8&```-````R`8``!````#6!@``"P```.<&``!5`0`` +M\P8``+4```!)"```1`$``/\(```F````1`H``"H```!K"@``*@```)8*``!# +M````P0H``#8````%"P``/````#P+``!#````>0L``$0```"]"P``.0````(, +M```Y````/`P``"T```!V#```+0```*0,```#````T@P``!4!``#6#```&0$` +M`.P-```9````!@\``&8````@#P``E0```(````"A$```$````` +M````$````!H````$````'``````````&````#0`````````2`````````!L` +M```(````%@```!@````"````#P`````````5````!0````X````9```````` +M``L````)````%`````P````#````$P`````````1````"@````<````````` +M`````!<`````("`M:"P@+2UH96QP("`@("`@("`@(&1I&ET"B`@+78L("TM=F5R'0M9V5N97)A=&EO;B`@('5S92!N97AT+6=E;F5R871I;VX@9W)E +M971I;F<@9F]R;6%T"B`@+6'1R82!O<&5R86YD +M.B`EF%B;&4@9W)E971I;F7-T96T@97)R;W(`57-A9V4Z("5S(%M/4%1)3TY=+BXN"@!@`&AE;&QO +M+"!W;W)L9`H`;65M;W)Y(&5X:&%U+2TE<^*`G"#0O="U(-"TT+[0O]&#T8'0NM"P(-"PT8#0L]&#T+S0M="] +MT8(*`"5S.B#0OM"_T8;0N-&/T8+0L"#B@)XM5R`E<^*`G"#0O="U(-"TT+[0 +MO]&#T8'0NM"P(-"PT8#0L]&#T+S0M="]T8(*`"5S.B#0OM"_T8;0N-&/T8+0 +ML"#B@)XM5R`E<^*`G"#0M2#0M-"RT8/1@="\T+C1@="[T+70O="P"@`E$@25```` +M`!(````<````K````!T````\`0```````+`!``!L````L0$``!D````>`@`` +M&0```#@"```L````4@(``!T```!_`@``)0```)T"```L````PP(``"T```#P +M`@``(````!X#```F````/P,``!\```!F`P``'P```(8#```V````I@,```T` +M``#=`P``%0```.L#```F`````00```T````H!```:P$``#8$``!Q````H@4` +M`!H````4!@``&0```"\&```G````208``!H```!Q!@``)0```(P&```G```` +ML@8``"@```#:!@``'0````,'```D````(0<``!T```!&!P``&P```&0'```S +M````@`<```H```"T!P``%@```+\'```F````U@<```H```#]!P```0````4` +M```,``````````,```````````````H````)```````````````'```````` +M`!(```````````````(````(````!@`````````-````"P```!$````.```` +M$``````````$````#P``````````("`M:"P@+2UH96QP("`@("`@("`@(&1I +M&ET"B`@+78L("TM=F5RF5D(&]P=&EO;B!@)6,E2!@)7,@+2UH96QP)R!F +M;W(@;6]R92!I;F9O'0O +M<&QA:6X[(&-H87)S970]25-/+3@X-3DM,0I#;VYT96YT+51R86YS9F5R+45N +M8V]D:6YG.B`X8FET"E@M1V5N97)A=&]R.B!+0F%B96P@,"XY+C4*`"`@+6@L +M("TM:&5L<"`@("`@("`@("`@("`@(&5N6$@87%U97-T82!A:G5D82!I +M('-U`P``)@```#\#```?````9@,``!\```"&`P``-@```*8#```- +M````W0,``!4```#K`P``)@````$$```-````*`0``%,!```V!```:0```(H% +M```;````]`4``!L````0!@``+0```"P&```>````6@8``"0```!Y!@``+0`` +M`)X&```N````S`8``"(```#[!@``)0```!X'```:````1`<``!H```!?!P`` +M-0```'H'```+````L`<``%4```"\!P``)P```!((```+````.@@```$````% +M````#``````````#```````````````*````"0``````````````!P`````` +M```2```````````````"````"`````8`````````#0````L````1````#@`` +M`!``````````!`````\``````````"`@+6@L("TM:&5L<"`@("`@("`@("!D +M:7-P;&%Y('1H:7,@:&5L<"!A;F0@97AI=`H@("UV+"`M+79E2!V97)S:6]N(&EN9F]R;6%T:6]N(&%N9"!E>&ET"@`EF5D(&]P=&EO;B!@+2TE61I9W0*`"5S.B!T:6QV86QG(&MRYG9E2!T:&ES(&AE;'`@86YD(&5X:70*("`M=BP@+2UV97)S:6]N +M("`@("`@(&1I7-T96T@97)R +M;W(`57-A9V4Z("5S(%M/4%1)3TY=+BXN"@!H96QL;RP@=V]R;&0*`%!R;VIE +M8W0M260M5F5R6YT87@Z("5S(%M/4%1)3TY=+BXN +M"@!H86QL;RP@5V5L=`H````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````"XO=7-R+W-H87)E+VQO8V%L92]D95]$12\````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````P,#`P-S4U`#`P,#`P,#``,#`P,#`P,``P,#`P +M,#`P,#`P,``Q,#8P-S$P,C4V-0`P,30P,C4`(#4````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````=7-T87(@ +M(`!R;V]T`````````````````````````````````````')O;W0````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````+B]U2!V97)S:6]N(&EN +M9F]R;6%T:6]N(&%N9"!E>&ET"@`EF5D(&]P=&EO;B!@ +M+2TE2!@)7,@+2UH96QP)R!F;W(@;6]R92!I;F9OF5D(&]P=&EO;B!@+2TE'0O<&QA:6X[(&-H87)S970]25-/+3@X-3DM-PI#;VYT96YT +M+51R86YS9F5R+45N8V]D:6YG.B`X+6)I=`H`)7,Z(.SG(-WCZO7QYR#E\.GK +M[^/>("TM("5C"@`E/J]?'G(.7PZ>OOX]X@+2T@)6,*`"5S.B#G +M(.7PZ>OOX]X@8"5C)7,G(.3E[2#DW??E].'I(._QW_/LX?3A"@`E(&`ED@Y.GV[_'O_>SE[><*`"5S.B#G(.7PZ>OOX]X@ +M8"5S)R#A\.'I].7?(/SQZ?/LX0H`)7,Z(.<@Y?#IZ^_CWB!@+2TED@[_'?\^SA].$*`"5S.B#G(.7PZ>OOX]X@8"U7("5S)R#DY>T@ +MY-WWY?3AZ2#O\=_S[.'TX0H`)7,Z(.<@Y?#IZ^_CWB!@+5<@)7,G(.7?[>'I +M(.3O]N_Q[_WLY>WG"@`E(.'PX>GTY=\@W>WA(/SQZ?/L +MX2`M+2`E8PH`)7,Z(.SG(.'MX>/M^?'?\^GLYR#E\.GK[^/>(&`E8R5S)PH` +M)7,Z(.SG(.'MX>/M^?'?\^GLYR#E\.GK[^/>(&`M+25S)PH`P^7IX2#S[_4L +M(.K\\^SE(0#CY>G<(//O]2P@ZOSS[.4*```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````N+W5S$@25`````!H````<````[``` +M`"4```"\`0```````%`"``!L````40(``+,```"^`@``&0```'(#```9```` +MC`,``"P```"F`P``'0```-,#```E````\0,``"P````7!```+0```$0$```@ +M````<@0``"8```"3!```'P```+H$```?````V@0```$```#Z!```-@```/P$ +M``"Z````,P4```T```#N!0``%0```/P%```F````$@8``!0````Y!@``%@`` +M`$X&```!````908```T```!G!@``$````'4&```+````A@8``'2!V97)S:6]N(&EN9F]R;6%T:6]N(&%N +M9"!E>&ET"@`@("UT+"`M+71R861I=&EO;F%L("`@("`@('5S92!TF5D(&]P=&EO;B!@+2TE7!E.B!T +M97AT+W!L86EN.R!C:&%RFD@=')A9&EC:6%N('-A;'5T+69O'0M9V5N97)A=&EO;B`@('5Z:2!N;W9G96YE0```$T(``#&````QP@``!<```"."0``&````*8)```:````OPD` +M`#````#:"0``'@````L*```I````*@H``#````!4"@``,0```(4*```A```` +MMPH``"H```#9"@``(`````0+```@````)0L```$```!&"P``-@```$@+``"Z +M````?PL```P````Z#```*P```$<,``!(````2!T:&ES +M(&AE;'`@86YD(&5X:70*("`M=BP@+2UV97)S:6]N("`@("`@(&1IF5D(&]P=&EO;B!@+2TEF$*("`M=BP@+2UV97)S +M:6]N("`@("`@(&UU97-T'0M9V5N97)A=&EO;B`@('5T:6QI>F$@96P@9F]R;6%T;R!D92!S86QU9&\@ +M;>%S(&YO=F5D;W-O"B`@+62!C;VYF:6=U +M%S(&EN9F]R;6%C:?-N+@H`17)R;W(@9&5L('-I +M`P``)@```#\#```?````9@,``!\```"& +M`P``-@```*8#```-````W0,``!4```#K`P``)@````$$```-````*`0``%4! +M```V!```>````(P%```8````!08``!H````>!@``+````#D&```>````9@8` +M`"D```"%!@``+````*\&```N````W`8``"$````+!P``*@```"T'```@```` +M6`<``"````!Y!P``,P```)H'```,````S@<``!@```#;!P``+````/0'```, +M````(0@```$````%````#``````````#```````````````*````"0`````` +M````````!P`````````2```````````````"````"`````8`````````#0`` +M``L````1````#@```!``````````!`````\``````````"`@+6@L("TM:&5L +M<"`@("`@("`@("!D:7-P;&%Y('1H:7,@:&5L<"!A;F0@97AI=`H@("UV+"`M +M+79E2!V97)S:6]N(&EN9F]R;6%T:6]N(&%N +M9"!E>&ET"@`EF5D(&]P=&EO;B!@+2TE2!T97)M:6YA"B`@+78L("TM +M=F5R2!T97)M:6YA"@`E6]R(&EN9F]R;6%C:6]N"@!H;VQA+"!M=6YD;PH````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`"XO=7-R+W-H87)E+VQO8V%L92]E="\````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````P,#`P-S4U`#`P,#`P,#``,#`P,#`P,``P,#`P,#`P,#`P +M,``Q,#8P-S$P,C4V-0`P,3,T-S4`(#4````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````=7-T87(@(`!R;V]T +M`````````````````````````````````````')O;W0````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````+B]U````>0D``"(```"8"0`` +M(P```+L)```<````WPD``!\```#\"0``&0```!P*```9````-@H```$```!0 +M"@``*@```%(*``"^````?0H```H````\"P``*````$<+```H````<`L``!8` +M``"9"P``%0```+`+```!````Q@L```H```#("P``#0```-,+```1````X0L` +M``$`````````#P```!@````5````&@`````````%````#``````````1```` +M`````!D````'````%````!8````"````#@``````````````!`````T````7 +M``````````H````(````$P````L````#````$@`````````0````"0````8` +M````````````````````("`M:"P@+2UH96QP("`@("`@("`@(&1I&ET"B`@+78L("TM=F5R'0M9V5N97)A=&EO;B`@('5S92!N97AT+6=E;F5R871I +M;VX@9W)E971I;F<@9F]R;6%T"B`@+6F5D(&]P=&EO;B!@)6,E7)I9VAT("A# +M*2`E'1E;G0@<&5R;6ET=&5D(&)Y(&QA=RX*`$AE;&QO +M+"!W;W)L9"$`4F5P;W)T(&)U9W,@=&\@/"5S/BX*`%1R>2!@)7,@+2UH96QP +M)R!F;W(@;6]R92!I;F9O2!E>&AA=7-T960`=W)I=&4@97)R;W(`4')O:F5C="U)9"U697)S:6]N.B!H +M96QL;R`R+C$N.3,*4F5P;W)T+4US9VED+4)U9W,M5&\Z(&)U9RUH96QL;T!G +M;G4N;W)G"E!/5"U#'0O<&QA:6X[ +M(&-H87)S970]:7-O+3@X-3DM,34*0V]N=&5N="U43D2!T:&ES(&AE +M;'`@86YD(&5X:70*("`M=BP@+2UV97)S:6]N("`@("`@(&1I5]N96ME;D!E=7-K +M86PN;W)G/@I,86YG=6%G92U496%M.B!"87-Q=64@/&QI;G5X+65U0&-H86YA +M92YA;'!H86YE="YC:#X*34E-12U697)S:6]N.B`Q+C`*0V]N=&5N="U4>7!E +M.B!T97AT+W!L86EN.R!C:&%RB!K +M86YP;VMO(&%U:V5R82`M+2`E8PH`)7,Z(&QE9V5Z(&MA;G!O:V\@875K97)A +M("TM("5C"@`EB!D=2!AF5N"@`EF%G=6YA(&`M+25S)PH`*RTM+2TM+2TM+2TM+2TM +M+2L*?"!+86EX;RP@;75N9'4A('P**RTM+2TM+2TM+2TM+2TM+2L*`$MA:7AO +M+"!M=6YD=2$`0G5G+6%K(#PE$@25`````!(````<````K``` +M`!T````\`0```````+`!``!L````L0$``!D````>`@``&0```#@"```L```` +M4@(``!T```!_`@``)0```)T"```L````PP(``"T```#P`@``(````!X#```F +M````/P,``!\```!F`P``'P```(8#```V````I@,```T```#=`P``%0```.L# +M```F`````00```T````H!```;@$``#8$``#&````I04``"D```!L!@``*0`` +M`)8&``!`````P`8``"L````!!P``/````"T'``!`````:@<``$$```"K!P`` +M+@```.T'```V````'`@``#$```!3"```,0```(4(``",````MP@``!4```!$ +M"0``FP```%H)``!-````]@D``!4```!$"@```0````4````,``````````,` +M``````````````H````)```````````````'`````````!(````````````` +M``(````(````!@`````````-````"P```!$````.````$``````````$```` +M#P``````````("`M:"P@+2UH96QP("`@("`@("`@(&1I&ET"B`@+78L("TM=F5RF5D(&]P=&EO;B!@)6,E2!@)7,@+2UH96QP)R!F;W(@;6]R92!I;F9O +M7!E.B!T97AT+W!L86EN.R!C:&%R +M$@25`````!P````<````_````"4```#<`0```````'`"``!L````<0(``+,` +M``#>`@``%@```)(#```9````J0,``!D```##`P``+````-T#```=````"@0` +M`"4````H!```+````$X$```M````>P0``"````"I!```)@```,H$```?```` +M\00``!\````1!0```0```#$%```V````,P4``+H```!J!0``#0```"4&```I +M````,P8``!4```!=!@``)@```',&```4````F@8``!8```"O!@```0```,8& +M```-````R`8``!````#6!@``"P```.<&``!U`0``\P8``'0```!I"```P0`` +M`-X(```6````H`D``"````"W"0``(````-@)```I````^0D``"8````C"@`` +M)P```$H*```I````<@H``"H```"<"@``*0```,<*```H````\0H``!\````: +M"P``'P```#H+```#````6@L``,<```!>"P``S0```"8,```.````]`P``"X` +M```##0``B@```#(-```I````O0T``!T```#G#0``&P````4.```#````(0X` +M``X````E#@``#0```#0.```.````0@X```$`````````$````!H````$```` +M'``````````&````#0`````````2`````````!L````(````%@```!@````" +M````#P`````````5````!0````X````9``````````L````)````%`````P` +M```#````$P`````````1````"@````<``````````````!<`````("`M:"P@ +M+2UH96QP("`@("`@("`@(&1I&ET"B`@ +M+78L("TM=F5R'0M9V5N97)A +M=&EO;B`@('5S92!N97AT+6=E;F5R871I;VX@9W)E971I;F<@9F]R;6%T"B`@ +M+6'1R82!O<&5R86YD.B`EF%B;&4@9W)E +M971I;F7-T96T@97)R;W(` +M57-A9V4Z("5S(%M/4%1)3TY=+BXN"@!@`&AE;&QO+"!W;W)L9`H`;65M;W)Y +M(&5X:&%U7!E.B!T97AT+W!L86EN.R!C:&%R71TPZ3#I"!P97)I;G1E:7-TPZ0@=&5R=F5H9'ES;75O=&]A"B`@+6XL +M("TM;F5X="UG96YE71TPZ3#I"!U=61E;B!P;VQV96X@ +M=&5R=F5H9'ES;75O=&]A"B`@+671TPZ3#I"!414M35$G#I"!T97)V96AD>6MS96[#I`H`)7,Z(&QI<\.D=&]I +M;6EN=&\Z("5S"@`E6W#I&X@<.V;FYE=,.D('1A:W5U +M=&$@;&%I;@IS86QL:6UI7,N +M"@!+97)R;R!V:6]I71TP[8Z("5S +M(%M604Q)5%-)3ETN+BX*`.*`G0!T97)V92!M86%I;&UA"@!M=6ES=&D@;&]P +M<'5I`&MI`P``)@```#\#```?````9@,``!\```"& +M`P``-@```*8#```-````W0,``!4```#K`P``)@````$$```-````*`0``&2!V97)S:6]N(&EN9F]R;6%T:6]N(&%N +M9"!E>&ET"@`EF5D(&]P=&EO;B!@+2TE7!E.B!T97AT+W!L86EN.R!C:&%R +MEM +M;VER90H@("UV+"`M+79ELN"@`E0`` +M`%\(``"W````V0@``!@```"1"0``(````*H)```<````RPD``#4```#H"0`` +M'P```!X*```P````/@H``#4```!O"@``-@```*4*```B````W`H``#$```#_ +M"@``&P```#$+```;````30L```$```!I"P``3@```&L+``#"````N@L``!4` +M``!]#```,````),,```E````Q`P``#H```#J#```&0```"4-```5````/PT` +M``$```!5#0``%0```%<-```.````;0T``!(```!\#0```0`````````0```` +M&@````0````<``````````8````-`````````!(`````````&P````@````6 +M````&`````(````/`````````!4````%````#@```!D`````````"P````D` +M```4````#`````,````3`````````!$````*````!P``````````````%P`` +M```@("UH+"`M+6AE;'`@("`@("`@("`@9&ES<&QA>2!T:&ES(&AE;'`@86YD +M(&5X:70*("`M=BP@+2UV97)S:6]N("`@("`@(&1IF5D(&]P=&EO;B!@+2TE2!L +M87'0O<&QA:6X[(&-H87)S970]25-/+3@X-3DM +M,0I#;VYT96YT+51R86YS9F5R+45N8V]D:6YG.B`X8FET"@`@("UH+"`M+6AE +M;'`@("`@("`@("`@=&%I7)I +M9VAT(*D@)7,@1G)E92!3;V9T=V%R92!&;W5N9&%T:6]N+"!);F,N"D-E863Z +M;F%S.B!'3E4@1U!,('8R*R`\:'1T<#HO+W=W=RYG;G4N;W)G+VQI8V5N`P``)@```#\#```?````9@,``!\```"&`P``-@```*8# +M```-````W0,``!4```#K`P``)@````$$```-````*`0``&0!```V!```;P`` +M`)L%```<````"P8``!P````H!@``+````$4&```<````<@8``"@```"/!@`` +M+````+@&```M````Y08``!\````3!P``*0```#,'```A````70<``"$```!_ +M!P``,P```*$'```,````U0<``%\```#B!P``,0```$((```+````=`@```$` +M```%````#``````````#```````````````*````"0``````````````!P`` +M```````2```````````````"````"`````8`````````#0````L````1```` +M#@```!``````````!`````\``````````"`@+6@L("TM:&5L<"`@("`@("`@ +M("!D:7-P;&%Y('1H:7,@:&5L<"!A;F0@97AI=`H@("UV+"`M+79E2!V97)S:6]N(&EN9F]R;6%T:6]N(&%N9"!E>&ET"@`E +MF5D(&]P=&EO;B!@+2TE'5D82!E('-A[7(*("`M=BP@ +M+2UV97)S:6]N("`@("`@(&%M;W-AUR"@`E&5C=&]`=')A%I2!T:&ES(&AE;'`@86YD(&5X:70*("`M=BP@+2UV97)S:6]N +M("`@("`@(&1ID!G +M;G4N;W)G/@I-24U%+59E'0O +M<&QA:6X[(&-H87)S970]25-/+3@X-3DM.`I#;VYT96YT+51R86YS9F5R+45N +M8V]D:6YG.B`X8FET"@`@("`@("`@("`@("`@("`N^NGPZ^7ZY.X@X/;E(.3F +M(.3XYO(@ZO'N(.+VY"`@("`@("`M:"P@+2UH96QP"B`@("`@("`@("`@+OKI +M\.OE^N3N(.#VY2#ZZ?#K^N0@^O'XZ>(@^N`@XO;D("`@("`@("UV+"`M+79E +MGZ[.$@[^GI].#N("TM("5C"@`E'R(.GEXOD@[^GI].#N("TM("5C"@`E'R(.CP[N7B^.`@ +M[.'W[B#E\.G@(&`E8R5S)R#OZ>GTX.X*`"5S(/KI\.OZ(/CEX?(@Z?+N^>XM +MX^<@Y?#IX"!@)7,G(._IZ?3@[@H`)7,@^NGPZ_H@^.7A\B#H\.[EXOC@(.'I +MZ>?N(&`E'R(.CP[N7B^.`@[.'W[B#E +M\.G@(&`M+25S)R#OZ>GTX.X*`"5S(/KI\.OZ(/CEX?(@Z/#NY>+XX"#LX??N +M(.7PZ>`@8"U7("5S)R#OZ>GTX.X*`"5S(/KI\.OZ(/CEX?(@Z?+N^>XMX^<@ +MY?#IX"!@+5<@)7,G(._IZ?3@[@H`)7,Z(.CP[N7B^.`@X>GIY^X@[^GI].#N +M("TM("5C"@`E'R(&`E8R5S)R#DY.7F[BWI^NSA(._IZ?3@ +M[@H`)7,@^NGPZ_H@^.7A\B!@+2TEGTX.X*`"LM +M+2TM+2TM+2TM+2TM+2TM+2L*?"`A[>SE\N0@[.OL(.WE[/D@?`HK+2TM+2TM +M+2TM+2TM+2TM+2TK"@`A[>SE\N0@[.OL(.WE[/D`+CPE,@Y^7L^>P@X/`*`"[X^N7I(.'X(/+CZ>X@^N+VY.P@ +M8"5S("TM:&5L<"<@^>GWY.P@Y/'P"@`A[>SE\N0@[.OL(.WE[/D*```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````N+W5S +M$@25`````!(````<````K````!T````\`0```````+`!``!L````L0$``!D` +M```>`@``&0```#@"```L````4@(``!T```!_`@``)0```)T"```L````PP(` +M`"T```#P`@``(````!X#```F````/P,``!\```!F`P``'P```(8#```V```` +MI@,```T```#=`P``%0```.L#```F`````00```T````H!```;@$``#8$``"! +M````I04``!H````G!@``&@```$(&```I````708``"$```"'!@``+0```*D& +M```I````UP8``"H````!!P``)````"P'```N````40<``"$```"`!P``(0`` +M`*('``!"````Q`<``!$````'"```*@```!D(```I````1`@``!$```!N"``` +M`0````4````,``````````,```````````````H````)```````````````' +M`````````!(```````````````(````(````!@`````````-````"P```!$` +M```.````$``````````$````#P``````````("`M:"P@+2UH96QP("`@("`@ +M("`@(&1I&ET"B`@+78L("TM=F5RF5D(&]P=&EO;B!@)6,E2!@)7,@+2UH +M96QP)R!F;W(@;6]R92!I;F9OAN80H`)7,Z(&]P +M8VEJ82!@)7,G('IA:'1I:F5V82!N96]P:&]D86X@87)G=6UE;G0*`"5S.B!O +M<&-I:F$@8"TM)7,G(&YE(&1O>G9O;&IA=F$@87)G=6UE;G0*`"5S.B!O<&-I +M:F$@8"U7("5S)R!N92!D;WIV;VQJ879A(&%R9W5M96YT"@`EAN80H`)7,Z(&]P8VEJ82!Z86AT:6IE +M=F$@;F5O<&AO9&%N(&%R9W5M96YT("TM("5C"@`EFYA:F5M(&]P8VEJ=2!@ +M+2TEF1R878L('-V:6IE +M=&4A('P**RTM+2TM+2TM+2TM+2TM+2TM+2TK"@!0;WID`P``)@```#\#```?````9@,``!\```"&`P``-@`` +M`*8#```-````W0,``!4```#K`P``)@````$$```-````*`0``&T!```V!``` +M:P```*0%```=````$`8``!\````N!@``,````$X&```A````?P8``"D```"A +M!@``,````,L&```Q````_`8``"8````N!P``*@```%4'```@````@`<``"`` +M``"A!P``-@```,('```+````^0<``)P````%"```&@```*((```,````O0@` +M``$````%````#``````````#```````````````*````"0`````````````` +M!P`````````2```````````````"````"`````8`````````#0````L````1 +M````#@```!``````````!`````\``````````"`@+6@L("TM:&5L<"`@("`@ +M("`@("!D:7-P;&%Y('1H:7,@:&5L<"!A;F0@97AI=`H@("UV+"`M+79E2!V97)S:6]N(&EN9F]R;6%T:6]N(&%N9"!E>&ET +M"@`EF5D(&]P=&EO;B!@+2TEG1E=/5T(.UR +M(&MI"B`@+78L("TM=F5R65L"@`EO4@8^UM96X@:F5L96YT:&5T960Z(#PE````KPH```$```#."@``-@`` +M`-`*``"Z````!PL```T```#""P``%@```-`+```M````YPL``!X````5#``` +M&@```#0,```!````3PP```T```!1#```#````%\,```3````;`P```$````` +M````#P```!@````5````&@`````````%````#``````````1`````````!D` +M```'````%````!8````"````#@``````````````!`````T````7```````` +M``H````(````$P````L````#````$@`````````0````"0````8````````` +M````````````("`M:"P@+2UH96QP("`@("`@("`@(&1I&ET"B`@+78L("TM=F5R'0M9V5N97)A=&EO;B`@('5S92!N97AT+6=E;F5R871I;VX@9W)E +M971I;F<@9F]R;6%T"B`@+6F5D(&]P=&EO;B!@)6,E7)I9VAT("A#*2`E'1E;G0@<&5R;6ET=&5D(&)Y(&QA=RX*`$AE;&QO+"!W;W)L +M9"$`4F5P;W)T(&)U9W,@=&\@/"5S/BX*`%1R>2!@)7,@+2UH96QP)R!F;W(@ +M;6]R92!I;F9O2!E>&AA +M=7-T960`=W)I=&4@97)R;W(`4')O:F5C="U)9"U697)S:6]N.B!H96QL;RTR +M+C$N.3$*4F5P;W)T+4US9VED+4)U9W,M5&\Z(&)U9RUH96QL;T!G;G4N;W)G +M"E!/5"U#6%N=&\@/'1E9&E?:&5R:7EA;G1O0'EA:&]O +M+F-O;3X*3&%N9W5A9V4M5&5A;3H@26YD;VYE`P``)@```#\#```?````9@,``!\```"&`P``-@```*8#```-```` +MW0,``!4```#K`P``)@````$$```-````*`0``%`!```V!```2!V97)S:6]N(&EN9F]R;6%T:6]N(&%N9"!E>&ET"@`EF5D(&]P=&EO;B!@+2TE'0O<&QA +M:6X[(&-H87)S970]:7-O+3@X-3DM,0I#;VYT96YT+51R86YS9F5R+45N8V]D +M:6YG.B`X8FET"@`@("UH+"`M+6AE;'`@("`@("`@("`@;6]S=')A('%U97-T +M;R!A:75T;R!E9"!EFEO;F4@8"5S)R#H(&%M8FEG=6$*`"5S.B!L)V]P +M>FEO;F4@8"5S)R!R:6-H:65D92!U;B!AFEO +M;F4@8"TM)7,G(&YO;B!A;6UE='1E('5N(&%R9V]M96YT;PH`)7,Z(&PG;W!Z +M:6]N92!@+5<@)7,G(&YO;B!A;6UE='1E('5N(&%R9V]M96YT;PH`)7,Z(&PG +M;W!Z:6]N92!@+5<@)7,G(.@@86UB:6=U80H`)7,Z(&PG;W!Z:6]N92!R:6-H +M:65D92!U;B!AFEO;F4@;F]N(')I8V]N +M;W-C:75T80H`*RTM+2TM+2TM+2TM+2TM+2L*?"!386QV92P@;6]N9&\A('P* +M*RTM+2TM+2TM+2TM+2TM+2L*`%-A;'9E+"!M;VYD;R$`4V5G;F%L87)E(&D@ +M8G5G(&$@/"5S/BX*`%5S87)E(&`E2!T:&ES(&AE;'`@86YD(&5X:70*("`M=BP@+2UV97)S:6]N("`@("`@ +M(&1I'0O<&QA +M:6X[(&-H87)S970]155#+4I0"D-O;G1E;G0M5')A;G-F97(M16YC;V1I;F&EPZ6[H;REN*3R +MR;V\J*2WI,:AHKVJSKNDMZ3>I+D*("`M=BP@+2UV97)S:6]N("`@("`@(*70 +MH;REN*7GI?.^\,KSI/+)O;RHI+>DQJ&BO:K.NZ2WI-ZDN0H`)7,Z(,G4P+6D +MRJ6JI=>EMZ7GI?.DQZ2Y("TM("5C"@`E>E\Z3' +MI+D@+2T@)6,*`"5S.B"EJJ77I;>EYZ7S(&`E8R5S)R"DS[#ZO_2D\KSUI+') +MU:2QI-ZDNZ3S"@`E>E\R!@)7,G(*3/VZ/+YJ3'I+D*`"5S +M.B"EJJ77I;>EYZ7S(&`EDQZ2Y"@`E>E\R!@+2TEI+ND\PH`)7,Z(*6J +MI=>EMZ7GI?,@8"U7("5S)R"DSZ&BL/J_]*3RO/6DLEYZ7S(&`M5R`EDN0H`)7,Z(*6JI=>EMZ7G +MI?.DS[#ZO_2D\LW7M>&DMZ3>I+D@+2T@)6,*`"5S.B#'I[RQI,>DK:3*I*2E +MJJ77I;>EYZ7S(&`E8R5S)R"DQZ2Y"@`E\L:3'I*VDRJ2DI:JEUZ6W +MI>>E\R!@+2TEDN0H`J*ZHK*BLJ*RHK*BLJ*RHK*BLJ*RHK*BO"JBM +MP*2SIJ3HH:*DLZ3SI,NDP:3/H:JHK0JHL:BLJ*RHK*BLJ*RHK*BLJ*RHK*BL +MJ+`*`,"DLZ:DZ*&BI+.D\Z3+I,&DSZ&J`*70I;"D\KBKI,2DL:2_I.D@/"5S +M/B"DR\KSN?"DMZ3&I*^DP*2UI*2AHPK&_,OAHJ3H +MI.J^W+K9I,J^\,KSI/+$M*39I,:DWZ3&I*^DP*2UI*2AHPH`P*2SIJ3HH:*D +MLZ3SI,NDP:3/"@`````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````N+W5S$@25```` +M`!(````<````K````!T````\`0```````+`!``!L````L0$``!D````>`@`` +M&0```#@"```L````4@(``!T```!_`@``)0```)T"```L````PP(``"T```#P +M`@``(````!X#```F````/P,``!\```!F`P``'P```(8#```V````I@,```T` +M``#=`P``%0```.L#```F`````00```T````H!```4@$``#8$```8`0``B04` +M`$4```"B!@``/P```.@&``!L````*`<``$H```"5!P``B````.`'``!L```` +M:0@``&T```#6"```30```$0)``"&````D@D``#P````9"@``.@```%8*``!; +M````D0H``"P```#M"@``@@```!H+``!P````G0L``"T````.#````0````4` +M```,``````````,```````````````H````)```````````````'```````` +M`!(```````````````(````(````!@`````````-````"P```!$````.```` +M$``````````$````#P``````````("`M:"P@+2UH96QP("`@("`@("`@(&1I +M&ET"B`@+78L("TM=F5RF5D(&]P=&EO;B!@)6,E2!@)7,@+2UH96QP)R!F +M;W(@;6]R92!I;F9O&#K.&#G>&#H.&#F"#A@Y[A@Y#A@Z#A +M@Y#A@YOA@Y3A@Z+A@Z#A@Y@@+2T@)6,*`"5S.B!@)6,EX8.0X8.@ +MX8.0X8.;X8.4X8.BX8.@X8.A(.&#F^&#G.&#F.&#J.&#E>&#G.&#E.&#FN&# +MG>&#D>&#D"#A@Y#A@Z`@X8.2X8.0X8.3X8.0X8.4X8.JX8.4X8.;X8.0"@`E +MX8.0X8.@X8.0X8.;X8.4X8.BX8.@X8.8X8.A +MX8.7X8.5X8.8X8.A(.&#F^&#G.&#F.&#J.&#E>&#G.&#E.&#FN&#G>&#D>&# +MF.&#H2#A@Y+A@Y#A@Y/A@Y#A@ZKA@Y3A@YOA@Y`*`"5S.B!@+2TE +MX8.0X8.@X8.0X8.;X8.4X8.BX8.@X8.A(.&#F^&#G.&#F.&#J.&#E>&#G.&# +ME.&#FN&#G>&#D>&#D"#A@Y#A@Z`@X8.2X8.0X8.3X8.0X8.4X8.JX8.4X8.; +MX8.0"@`E +MX8.0X8.@X8.0X8.;X8.4X8.BX8.@X8.8X8.AX8.7X8.5X8.8X8.A(.&#F^&# +MG.&#F.&#J.&#E>&#G.&#E.&#FN&#G>&#D>&#F.&#H2#A@Y+A@Y#A@Y/A@Y#A +M@ZKA@Y3A@YOA@Y`*`"5S.B#A@Z/A@ZKA@YSA@YWA@Y'A@Y@@X8.>X8.0X8.@ +MX8.0X8.;X8.4X8.BX8.@X8.8(&`M+25C)7,G"@`E&#G>&#I.&#FN&#F.&#G>&#H2$@?`HK+2TM+2TM+2TM+2TM+2TM+2TM*PH` +MX8.AX8.0X8.:X8.0X8.;X8.8(.&#F^&#H>&#G>&#I.&#FN&#F.&#G>&#H2$` +MX8.HX8.4X8.JX8.3X8.=X8.;X8.4X8.1X8.8X8.A(.&#J.&#E.&#H>&#D.&# +MKN&#E.&#D2#A@Y+A@Y#A@Y#A@Y+A@Y;A@Y#A@Y7A@YSA@Y3A@Y<@X8.HX8.4 +MX8.BX8.GX8.=X8.1X8.8X8.&#H.&#F^&#D.&#JN&#F.&# +MF.&#H>&#E^&#E>&#F.&#H2X*`.&#H>&#D.&#FN&#D.&#F^&#F"#A@YOA@Z'A +M@YWA@Z3A@YKA@YCA@YWA@Z$A"@`````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````"XO=7-R+W-H87)E+VQO8V%L92]K;R\` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````P,#`P-S4U`#`P,#`P +M,#``,#`P,#`P,``P,#`P,#`P,#`P,``Q,#8P-S$P,C4V-0`P,3,T-S8`(#4` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````=7-T87(@(`!R;V]T```````````````````````````````` +M`````')O;W0````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````+B]U2!T:&ES +M(&AE;'`@86YD(&5X:70*("`M=BP@+2UV97)S:6]N("`@("`@(&1I7!E.B!T97AT+W!L86EN.R!C:&%R +MTPB"X\,BCQ]$@O\F\Q\#4M,^TV0H`)7,Z(,#.O/:PH2#'RK_DQ]$@O\F\ +MQ\#4M,^TV2`M+2`E8PH`)7,Z(,#.O<3'TB"\]B"^^+3"(+_)O,<@8"5C)7,G +M"@`E$@25``````X````<```` +MC````!,```#\`````````$@!```9````20$``!D```!C`0``+````'T!```= +M````J@$``"4```#(`0``+````.X!```M````&P(``"````!)`@``)@```&H" +M```?````D0(``!\```"Q`@``#0```-$"```-````WP(``%X!``#M`@``'P`` +M`$P$```<````;`0``"@```")!```(P```+($```B````U@0``"@```#Y!``` +M*0```"(%```F````3`4``"(```!S!0``'0```)8%```=````M`4``!````#2 +M!0``$````.,%```!````"`````T````*````!P````L`````````#@`````` +M````````!@````P````%````"0````,````"``````````0``````````"5S +M.B!I;&QE9V%L(&]P=&EO;B`M+2`E8PH`)7,Z(&EN=F%L:60@;W!T:6]N("TM +M("5C"@`EF5D(&]P=&EO;B!@)6,E6%`9V1E+G1O/@I,86YG=6%G92U4 +M96%M.B!,871V:6%N(#QT'0O<&QA:6X[(&-H87)S +M970]25-/+3@X-3DM,3,*0V]N=&5N="U4F$N"@`EYG82X*`"5S.B!A='-LYV=A("(E$@25 +M`````!(````<````K````!T````\`0```````+`!``!L````L0$``!D````> +M`@``&0```#@"```L````4@(``!T```!_`@``)0```)T"```L````PP(``"T` +M``#P`@``(````!X#```F````/P,``!\```!F`P``'P```(8#```V````I@,` +M``T```#=`P``%0```.L#```F`````00```T````H!```<0$``#8$``!Q```` +MJ`4``!@````:!@``&````#,&```G````3`8``!X```!T!@``)0```),&```G +M````N08``"8```#A!@``'P````@'```D````*`<``!@```!-!P``&````&8' +M```S````?P<```P```"S!P``&0```,`'```J````V@<```P````%"````0`` +M``4````,``````````,```````````````H````)```````````````'```` +M`````!(```````````````(````(````!@`````````-````"P```!$````. +M````$``````````$````#P``````````("`M:"P@+2UH96QP("`@("`@("`@ +M(&1I&ET"B`@+78L("TM=F5RF5D(&]P=&EO;B!@)6,E2!@)7,@+2UH96QP +M)R!F;W(@;6]R92!I;F9O7!E.B!T97AT+W!L86EN.R!C:&%R +M`P``)@```#\#```?````9@,``!\```"&`P``-@```*8# +M```-````W0,``!4```#K`P``)@````$$```-````*`0``%D!```V!```;@`` +M`)`%```:````_P4``!H````:!@``*P```#4&```?````808``"0```"!!@`` +M*P```*8&```L````T@8``"(```#_!@``)0```"('```;````2`<``!L```!D +M!P``.0```(`'```.````N@<``&$```#)!P``*@```"L(```.````5@@```$` +M```%````#``````````#```````````````*````"0``````````````!P`` +M```````2```````````````"````"`````8`````````#0````L````1```` +M#@```!``````````!`````\``````````"`@+6@L("TM:&5L<"`@("`@("`@ +M("!D:7-P;&%Y('1H:7,@:&5L<"!A;F0@97AI=`H@("UV+"`M+79E2!V97)S:6]N(&EN9F]R;6%T:6]N(&%N9"!E>&ET"@`E +MF5D(&]P=&EO;B!@+2TE"YO^_O6EN9&EG +M"@`EFEN;FEG"@`E"YO2!T:&ES(&AE;'`@86YD(&5X:70*("`M=BP@+2UV97)S:6]N +M("`@("`@(&1I'0O<&QA +M:6X[(&-H87)S970]25-/+3@X-3DM,0I#;VYT96YT+51R86YS9F5R+45N8V]D +M:6YG.B`X+6)I=`H`("`M:"P@+2UH96QP("`@("`@("`@('9I +M$@25`````!P````<````_````"4```#<`0```````'`"``!L````<0(``+,` +M``#>`@``%@```)(#```9````J0,``!D```##`P``+````-T#```=````"@0` +M`"4````H!```+````$X$```M````>P0``"````"I!```)@```,H$```?```` +M\00``!\````1!0```0```#$%```V````,P4``+H```!J!0``#0```"4&```I +M````,P8``!4```!=!@``)@```',&```4````F@8``!8```"O!@```0```,8& +M```-````R`8``!````#6!@``"P```.<&``!S`0``\P8``'L```!G"```L@`` +M`.,(```<````E@D``!L```"S"0``&P```,\)```I````ZPD``"0````5"@`` +M'P```#H*```I````6@H``"H```"$"@``)P```*\*```A````UPH``!\```#Y +M"@``'P```!D+```!````.0L``#D````["P``U````'4+```.````2@P``"\` +M``!9#```*0```(D,```K````LPP``!4```#?#```&````/4,```!````#@T` +M``X````0#0``$0```!\-```+````,0T```$`````````$````!H````$```` +M'``````````&````#0`````````2`````````!L````(````%@```!@````" +M````#P`````````5````!0````X````9``````````L````)````%`````P` +M```#````$P`````````1````"@````<``````````````!<`````("`M:"P@ +M+2UH96QP("`@("`@("`@(&1I&ET"B`@ +M+78L("TM=F5R'0M9V5N97)A +M=&EO;B`@('5S92!N97AT+6=E;F5R871I;VX@9W)E971I;F<@9F]R;6%T"B`@ +M+6'1R82!O<&5R86YD.B`EF%B;&4@9W)E +M971I;F7-T96T@97)R;W(` +M57-A9V4Z("5S(%M/4%1)3TY=+BXN"@!@`&AE;&QO+"!W;W)L9`H`;65M;W)Y +M(&5X:&%UFMO=W-K:2`\6-Y:FYY(&9O'0M9V5N97)A=&EO;B`@('6_>6-I92!F;W)M871U('!O=VET86YI82!N;W=E +M:B!G96YE2!AFYA"@`EG!O>FYA;F$@;W!C:F$@?B5C +M)7,G"@`EG=O;&]N>6-H('!R87=E;2X*`%=I=&%J +M(+9W:65C:64A`%=Y<&ES=6IE('!R>GEJ87IN92!K;VYF:6=U7-YLV'F +M(&1O("5S("X*`%6_>6H@8"5S("TM:&5L<"<@9&QA('5Z>7-K86YI82!I;F9O +MFYA;GD@8K.Q9"!S>7-T96UU`%-KLV%D;FEA.B`E6-Z97)P86YA +M`&*SL60@>F%P:7-U```````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````"XO=7-R+W-H87)E+VQO8V%L +M92]P="\````````````````````````````````````````````````````` +M```````````````````````````````````````````````````P,#`P-S4U +M`#`P,#`P,#``,#`P,#`P,``P,#`P,#`P,#`P,``Q,#8P-S$P,C4V-0`P,3,U +M,3``(#4````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````=7-T87(@(`!R;V]T```````````````````````` +M`````````````')O;W0````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M+B]UF5D(&]P=&EO;B!@+2TE'0O<&QA:6X[(&-H87)S970]25-/+3@X-3DM +M,0I#;VYT96YT+51R86YS9F5R+45N8V]D:6YG.B`X+6)I=`H`)7,Z(&]PY^-O +M(&EL96=A;"`M+2`E8PH`)7,Z(&$@;W#GXV\@8"5C)7,G(&[C;R!A9&UI=&4@ +M=6T@87)G=6UE;G1O"@`E@<``#P```"2!T:&ES(&AE;'`@86YD(&5X:70*("`M=BP@+2UV97)S +M:6]N("`@("`@(&1IF5S(#QA9FUE;F5Z0'1EFEL:6%N(%!O'0O<&QA:6X[(&-H87)S970]25-/+3@X-3DM,0I#;VYT96YT+51R +M86YS9F5R+45N8V]D:6YG.B`X+6)I=`H`("`M:"P@+2UH96QP("`@("`@("`@ +M(&UO?U97,@$@25`````!(````<````K````!T````\`0```````+`!``!L````L0$` +M`!D````>`@``&0```#@"```L````4@(``!T```!_`@``)0```)T"```L```` +MPP(``"T```#P`@``(````!X#```F````/P,``!\```!F`P``'P```(8#```V +M````I@,```T```#=`P``%0```.L#```F`````00```T````H!```<@$``#8$ +M``!T````J04``!H````>!@``&P```#D&```L````508``!\```""!@``*``` +M`*(&```L````RP8``"T```#X!@``(@```"8'```I````20<``!\```!S!P`` +M'P```),'```V````LP<```T```#J!P``&P```/@'```R````%`@```T```!' +M"````0````4````,``````````,```````````````H````)```````````` +M```'`````````!(```````````````(````(````!@`````````-````"P`` +M`!$````.````$``````````$````#P``````````("`M:"P@+2UH96QP("`@ +M("`@("`@(&1I&ET"B`@+78L("TM=F5R +MF5D(&]P=&EO;B!@)6,E +M2!@)7,@ +M+2UH96QP)R!F;W(@;6]R92!I;F9O'0O<&QA +M:6X[(&-H87)S970]25-/+3@X-3DM,@I#;VYT96YT+51R86YS9F5R+45N8V]D +M:6YG.B`X8FET"@`@("UH+"`M+6AE;'`@("`@("`@("`@869INF5A>N,@86-E +MN,@:6YF;W)M8?YI:2!V97)S:75N92"Z:2!T97)M:6[C"@`E,*`"5S.B!O`P``)@```#\#```?````9@,``!\```"&`P`` +M-@```*8#```-````W0,``!4```#K`P``)@````$$```-````*`0``%8!```V +M!```;@```(T%```<````_`4``!@````9!@``-````#(&```<````9P8``#$` +M``"$!@``-````+8&```U````ZP8``!\````A!P``,@```$$'```<````=`<` +M`!P```"1!P``/P```*X'```0````[@<``"4```#_!P``0````"4(```0```` +M9@@```$````%````#``````````#```````````````*````"0`````````` +M````!P`````````2```````````````"````"`````8`````````#0````L` +M```1````#@```!``````````!`````\``````````"`@+6@L("TM:&5L<"`@ +M("`@("`@("!D:7-P;&%Y('1H:7,@:&5L<"!A;F0@97AI=`H@("UV+"`M+79E +M2!V97)S:6]N(&EN9F]R;6%T:6]N(&%N9"!E +M>&ET"@`EF5D(&]P=&EO;B!@+2TE7!E.B!T97AT+W!L86EN.R!C:&%R("TM("5C"@`ESMG*(,O,P-X@ +M8"5S)PH`)7,Z(,O,P-X@8"5S)R#$S\S6Q(&`M5R`ESMG* +M(,O,P-X@8"U7("5S)PH`)7,Z(,O,P-X@)6,@Q,_,UL7.(,+9(,G3T,_,V-K/ +MU\'4V-/1(&,@P=+'U`8``"4```":!@``)@```,`&```=````YP8``"(````%!P``&0```"@' +M```9````0@<``#````!2!T:&ES(&AE;'`@86YD(&5X:70*("`M=BP@+2UV +M97)S:6]N("`@("`@(&1IF]BFF[(&EN9F]R;>%C:64@;R!V97)Z:6D@ +M82!S:V]NZ&F["@`E;YA9'5J92!AF[A +M;6$@=F^U8F$@8"5C)7,G"@`E2DN"DMO;65N=.%R92!K('-L;W9E +M;G-KZ6UU('!R96ML861U('IA$@25`````!(````<````K````!T````\`0```````+`!``!L```` +ML0$``!D````>`@``&0```#@"```L````4@(``!T```!_`@``)0```)T"```L +M````PP(``"T```#P`@``(````!X#```F````/P,``!\```!F`P``'P```(8# +M```V````I@,```T```#=`P``%0```.L#```F`````00```T````H!```@`$` +M`#8$``!)````MP4``!T````!!@``'````!\&```K````/`8``"````!H!@`` +M(P```(D&```K````K08``"P```#9!@``(P````8'```B````*@<``"$```!- +M!P``(0```&\'```V````D0<```T```#(!P``CP```-8'```R````9@@```T` +M``"9"````0````4````,``````````,```````````````H````)```````` +M```````'`````````!(```````````````(````(````!@`````````-```` +M"P```!$````.````$``````````$````#P``````````("`M:"P@+2UH96QP +M("`@("`@("`@(&1I&ET"B`@+78L("TM +M=F5RF5D(&]P=&EO;B!@ +M)6,E2!@ +M)7,@+2UH96QP)R!F;W(@;6]R92!I;F9OFEJ +M82!PF)IF)IF)IFYAQ(UN80H`)7,Z(&EZ +M8FER82!Z86AT979A(&%R9W5M96YT("TM("5C"@`EF)IBYP971E"```(@```.\)```N````$@H``"P```!!"@``00```&X*```V +M````L`H``#H```#G"@``00```"(+``!&````9`L``#D```"K"P``-P```.4+ +M```O````'0P``"\```!-#````P```'T,``!%````@0P``!`!``#'#```&@`` +M`-@-``!,````\PT``)$```!`#@``3P```-(.```R````(@\``"<```!5#P`` +M`P```'T/```:````@0\``",```"<#P``&0```,`/```!`````````!`````: +M````!````!P`````````!@````T`````````$@`````````;````"````!8` +M```8`````@````\`````````%0````4````.````&0`````````+````"0`` +M`!0````,`````P```!,`````````$0````H````'```````````````7```` +M`"`@+6@L("TM:&5L<"`@("`@("`@("!D:7-P;&%Y('1H:7,@:&5L<"!A;F0@ +M97AI=`H@("UV+"`M+79E2!V97)S:6]N(&EN +M9F]R;6%T:6]N(&%N9"!E>&ET"@`@("UT+"`M+71R861I=&EO;F%L("`@("`@ +M('5S92!TF5D(&]P=&EO;B!@)6,E7)I9VAT("A#*2`E'1E;G0@<&5R;6ET=&5D(&)Y(&QA +M=RX*`$AE;&QO+"!W;W)L9"$`4')I;G0@82!F2P@8W5S=&]M:7IA +M8FQE(&=R965T:6YG+@H`4F5P;W)T(&)U9W,@=&\@/"5S/BX*`%1R>2!@)7,@ +M+2UH96QP)R!F;W(@;6]R92!I;F9O2!E>&AA=7-T960`=W)I=&4@97)R;W(`4')O:F5C="U)9"U697)S +M:6]N.B!H96QL;R`R+C$N.38*4F5P;W)T+4US9VED+4)U9W,M5&\Z(&)U9RUH +M96QL;T!G;G4N;W)G"E!/5"U#7!E.B!T +M97AT+W!L86EN.R!C:&%R)7/B@)P@T+?0L-&%T8+0M="R +MT+`@T+#1@-"ST8/0O-"UT+W1@@H`)7,Z(-"^T+_1AM"XT9C0L"#B@)XM+25S +MXH"<(-"]T+4@T+30OM"_T8/1B-&"T+`@T+#1@-"ST8/0O-"UT+W1@@H`)7,Z +M(-"^T+_1AM"XT9C0L"#B@)XM5R`E<^*`G"#0O="U(-"TT+[0M]"RT+[1F="P +MT++0L"#0L-&`T+/1@]"\T+70O=&""@`E!@``)P```,4&```@````[08``"<````. +M!P``'````#8'```<````4P<``#8```!P!P``#0```*<'``!2````M0<``"P` +M```("```#0```#4(```!````!0````P``````````P``````````````"@`` +M``D```````````````<`````````$@```````````````@````@````&```` +M``````T````+````$0````X````0``````````0````/```````````@("UH +M+"`M+6AE;'`@("`@("`@("`@9&ES<&QA>2!T:&ES(&AE;'`@86YD(&5X:70* +M("`M=BP@+2UV97)S:6]N("`@("`@(&1I'0O<&QA:6X[(&-H87)S970]:7-O+3@X-3DM +M,0I#;VYT96YT+51R86YS9F5R+45N8V]D:6YG.B`X8FET"@`@("UH+"`M+6AE +M;'`@("`@("`@("`@=FES82!D96YN82!H:N1L<'1E>'0@;V-H(&%V61I +M9PH`)7,Z(&9L86=G86X@(B5S(B!B96CV=F5R(&5T="!A$@25`````!P````<````_````"4```#<`0`````` +M`'`"``!L````<0(``+,```#>`@``%@```)(#```9````J0,``!D```##`P`` +M+````-T#```=````"@0``"4````H!```+````$X$```M````>P0``"````"I +M!```)@```,H$```?````\00``!\````1!0```0```#$%```V````,P4``+H` +M``!J!0``#0```"4&```I````,P8``!4```!=!@``)@```',&```4````F@8` +M`!8```"O!@```0```,8&```-````R`8``!````#6!@``"P```.<&``"V`0`` +M\P8``'4```"J"```U@```"`)```7````]PD``"`````/"@``'0```#`*```E +M````3@H``!T```!T"@``,````)(*```P````PPH``#$```#T"@``(````"8+ +M```O````1PL``"````!W"P``(````)@+```!````N0L``/P```"["P``VP`` +M`+@,```0````E`T``$0```"E#0``9````.H-```K````3PX``!D```![#@`` +M'@```)4.```!````M`X``!````"V#@``#P```,<.```-````UPX```$````` +M````$````!H````$````'``````````&````#0`````````2`````````!L` +M```(````%@```!@````"````#P`````````5````!0````X````9```````` +M``L````)````%`````P````#````$P`````````1````"@````<````````` +M`````!<`````("`M:"P@+2UH96QP("`@("`@("`@(&1I&ET"B`@+78L("TM=F5R'0M9V5N97)A=&EO;B`@('5S92!N97AT+6=E;F5R871I;VX@9W)E +M971I;F<@9F]R;6%T"B`@+6'1R82!O<&5R86YD +M.B`EF%B;&4@9W)E971I;F7-T96T@97)R;W(`57-A9V4Z("5S(%M/4%1)3TY=+BXN"@!@`&AE;&QO +M+"!W;W)L9`H`;65M;W)Y(&5X:&%UFQA9&%N('1EB!S9<.G96YE:R`M+2`E8PH`)7,Z +M(&`E8R5S)R!AB!K=6QL86[$L6S$L7(*`"5S.B!@+5<@)7,G('-EPZ=E +M;F7$GVD@87)GP[QM86YSQ+%Z(&MU;&QA;L2Q;,2Q<@H`)7,Z(&`M5R`E@H`)7,Z('-EPZ=E;F5K(&)I6%N('-EPZ=E +M;F5K(&`E8R5S)PH`)7,Z('1A;L2Q;FUA>6%N('-EPZ=E;F5K(&`M+25S)PH` +M)P#BE(SBE(#BE(#BE(#BE(#BE(#BE(#BE(#BE(#BE(#BE(#BE(#BE(#BE(#B +ME(#BE(#BE(#BE(#BE)`*XI2"($UE6D@PZ=I>F=I;&5R(&G#IVEN9&4@9\.V +MB!B:7(@9&4*97AP;W)T($Q!3D<](G1R7U12+E541BTX +M(@IU;FEC;V1E7W-T87)T"FEL92!D96YE>6EN+@H`5&5L:68@2&%K:\2Q(,*I +M("5S($9R964@4V]F='=AL2Q;,2Q;2!O;&1UQ)]U;F1A;B!Y87-A +M;&%RQ+%N(&EZ:6X@=F5R9&G$GVD@P[9LPZ?#O&1E"FAEFQA(&)I +M;&=I(&G#IVEN(&`EL2Q;BX*`$)I;&EN;65Y96X@6%Z;6$@:&%T87/$ +ML0`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````+B]U`P``)@```#\# +M```?````9@,``!\```"&`P``-@```*8#```-````W0,``!4```#K`P``)@`` +M``$$```-````*`0``&@!```V!```8````)\%```<``````8``!P````=!@`` +M*P```#H&```?````9@8``"4```"&!@``*P```*P&```L````V`8``"(````% +M!P``)````"@'```>````30<``!X```!L!P``-@```(L'```,````P@<``!X` +M``#/!P``,@```.X'```-````(0@```$````%````#``````````#```````` +M```````*````"0``````````````!P`````````2```````````````"```` +M"`````8`````````#0````L````1````#@```!``````````!`````\````` +M`````"`@+6@L("TM:&5L<"`@("`@("`@("!D:7-P;&%Y('1H:7,@:&5L<"!A +M;F0@97AI=`H@("UV+"`M+79E2!V97)S:6]N +M(&EN9F]R;6%T:6]N(&%N9"!E>&ET"@`EF5D(&]P=&EO +M;B!@+2TE7!E.B!T97AT+W!L86EN.R!C:&%RFQ,_-RFU"P@ +MT]>FU"$@?`HK+2TM+2TM+2TM+2TM+2TM*PH`\-+)UZ;4(-/7IM0A`/#2SR#0 +MS\W)S,O)(-K7IM35RM3%(,[!(#PE&ET"B`@+78L("TM=F5R +M'0M9V5N97)A=&EO;B`@('5S +M92!N97AT+6=E;F5R871I;VX@9W)E971I;F<@9F]R;6%T"B`@+6F5D(&]P=&EO;B!@)6,E +M7)I9VAT("A#*2`E'1E;G0@<&5R;6ET=&5D +M(&)Y(&QA=RX*`$AE;&QO+"!W;W)L9"$`4F5P;W)T(&)U9W,@=&\@/"5S/BX* +M`%1R>2!@)7,@+2UH96QP)R!F;W(@;6]R92!I;F9O2!E>&AA=7-T960`=W)I=&4@97)R;W(`4')O:F5C +M="U)9"U697)S:6]N.B!H96QL;R`R+C$N.3,*4F5P;W)T+4US9VED+4)U9W,M +M5&\Z(&)U9RUH96QL;T!G;G4N;W)G"E!/5"U#71I94!R:79E7!E.B!T97AT+W!L86EN.R!C:&%R&[@VX@=&CANXL@=&C#M&YG('1I;B!?<&AI +MPZIN(&+ANJ-N7R!RX;N3:2!T:&_#H70*`"`M="`M+71R861I=&EO;F%L("`@ +M("`@("`@9,.Y;F<@9.&ZH6YG('1HX;NI8R!C:,.@;R!MX;NK;F<@7W1R=7GA +MNX%N('1HX;N1;F=?"B`M;B`M+6YE>'0M9V5N97)A=&EO;B`@("`@9,.Y;F<@ +M9.&ZH6YG('1HX;NI8R!C:,.@;R!MX;NK;F<@7W1HX;J_(&CANX<@=.&[FVE? +M"B`M9RP@+2UG2!C:.&[C6X@ +M8^&ZI6T@PJL@+2TE8R#"NPH`)7,Z('3#N7D@8VCANXUN(&MHP[1N9R!HX;NC +M<"!LX;N'(,*K("TM("5C(,*["@`E2!C:.&[C6X@PJL@)6,E2!C:.&[ +MC6X@PJL@)7,@PKL@;,.@(&W&H2!HX;N3"@`E2!C:.&[C6X@PJL@ +M)7,@PKL@8^&ZIVX@=&AIX;J_="#$D>&[D6D@<^&[D0H`)7,Z('3#N7D@8VCA +MNXUN(,*K("TM)7,@PKL@:VC#M&YG(&-H;R!P:,.I<"#$D>&[D6D@<^&[D0H` +M)7,Z('3#N7D@8VCANXUN(,*K("U7("5S(,*[(&MHP[1N9R!C:&\@<&C#J7`@ +MQ)'ANY%I('/ANY$*`"5S.B!TP[EY(&-HX;N-;B#"JR`M5R`E2!C:.&[C6X@8VC&L&$@Q)'& +ML.&[HV,@;FCANJUN(&1IX;N';B#"JR`E8R5S(,*["@`E2!C:.&[ +MC6X@8VC&L&$@Q)'&L.&[HV,@;FCANJUN(&1IX;N';B#"JR`M+25S(,*["@`@ +MPKL`XI2/XI2!XI2!XI2!XI2!XI2!XI2!XI2!XI2!XI2!XI23"N*4@R`@0VC# +MH&\@=&CANK\@9VGANYMI("$@("`@XI2#"N*4E^*4@>*4@>*4@>*4@>*4@>*4 +M@>*4@>*4@>*4@>*4FPH`5,.A8R!Q=7GANX%N(,*I(&[$@VT@)7,@5.&[E2!# +M:.&[L6,@4&CANJ=N($WANX%M(%3AN[$@1&\N"D=IX;JE>2!0:,.I<#H@1VGA +MNJ5Y(%!HPZEP($/#M&YG($/ANYEN9R!'3E4@*$=03"D@<&AIPZIN(&+ANJ-N +M(#(K"CQH='1P.B\O=W=W+F=N=2YO&[@6T@=.&[L2!D;RX@2TC#E$Y'($/#DR!"X;JB +M3R!(PX!.2"!.PX!/($/ANJ(L"G;ANYMI(,21:>&[@74@:VGANX=N(,21QK#A +MNZ-C('!HPZ%P(&QUX;JM="!C:&\@<&C#J7`N"@!#:,.@;R!T:.&ZOR!G:>&[ +MFVD@(0!4:,.T;F<@8L.A;R!LX;N7:2!C:&\@/"5S/BX*5&C#M&YG(&+#H6\@ +M;.&[EVD@9.&[BV-H(&-H;R`\=FDM5DY`9V]O9VQE9W)O=7!S+F-O;3X@;FC# +MJ2X*`%1HX;NM(&SANX=N:"#"JR`EFA? +M0TXO```````````````````````````````````````````````````````` +M````````````````````````````````````````````,#`P,#$@25`````!(````<```` +MK````!T````\`0```````+`!``!L````L0$``!D````>`@``&0```#@"```L +M````4@(``!T```!_`@``)0```)T"```L````PP(``"T```#P`@``(````!X# +M```F````/P,``!\```!F`P``'P```(8#```V````I@,```T```#=`P``%0`` +M`.L#```F`````00```T````H!```;P$``#8$``!.````I@4``!,```#U!0`` +M$P````D&```=````'08``!4````[!@``&P```%$&```=````;08``!X```"+ +M!@``&````*H&```9````PP8``!H```#=!@``&@```/@&```M````$P<```H` +M``!!!P``%0```$P'```B````8@<```D```"%!P```0````4````,```````` +M``,```````````````H````)```````````````'`````````!(````````` +M``````(````(````!@`````````-````"P```!$````.````$``````````$ +M````#P``````````("`M:"P@+2UH96QP("`@("`@("`@(&1I&ET"B`@+78L("TM=F5RF5D(&]P=&EO;B!@)6,E2!@)7,@+2UH96QP)R!F;W(@;6]R92!I +M;F9O7!E.B!T97AT+W!L86EN.R!C:&%RHH:JAJB5C"@`E +MT*>AJJ&J)6,*`"5SH[K1H<_NH:XE8R5SH:^RN]3*T.VT^++. +MROT*`"5SH[JAKB5SH:_1H<_NT]#&Y]+E"@`EHRK:Q\+7$ +MT:'/[B`G)6,EHRK:Q\+7$T:'/[B`G+2TE?$X[K#"@`````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````"XO=7-R+W-H87)E+VQO8V%L92]Z:%]45R\````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````P,#`P-S4U`#`P,#`P,#``,#`P,#`P,``P,#`P +M,#`P,#`P,``Q,#8P-S$P,C4V-0`P,30Q,C``(#4````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````=7-T87(@ +M(`!R;V]T`````````````````````````````````````')O;W0````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````+B]UFA?5%2!T:&ES(&AE;'`@86YD(&5X:70* +M("`M=BP@+2UV97)S:6]N("`@("`@(&1I'0O<&QA:6X[(&-H87)S970]551&+3@*0V]N=&5N="U4DNN:MI.B\E.6*J>BHBN:! +MK^2XINF;HNF6BPH@("UV+"`M+79E60B.:SE>>:A.F!N.F@A2#BE(`@ +M)6,*`"5S[[R:YX2AYI6(YYJ$Z8&XZ:"%(.*4@"`E8PH`)7/OO)KI@;CIH(7B +M@)@E8R5SXH"9Y+B-Y8^OZ86-Y9"(Y;R5YI6XY+V_YY2H"@`E<^^\FNF!N.F@ +MA>*`F"5SXH"9Y+B-YIB.YZ*Z"@`E<^^\FNF!N.F@A>*`F"5SXH"9Z9R`Z*:! +MY;R5YI6X"@`E<^^\FNF!N.F@A>*`F"TM)7/B@)GDN(WECZ_IA8WED(CEO)7F +ME;CDO;_GE*@*`"5S[[R:Z8&XZ:"%XH"8+5<@)7/B@)GDN(WECZ_IA8WED(CE +MO)7FE;CDO;_GE*@*`"5S[[R:Z8&XZ:"%XH"8+5<@)7/B@)GDN(WFF([GHKH* +M`"5S[[R:Z8&XZ:"%Z9R`Z*:!Y;R5YI6X(.*4@"`E8PH`)7/OO)KGA*'FLY7H +MK9CEB*7GFH3I@;CIH(7B@)@E8R5SXH"9"@`E<^^\FN>$H>:SE>BMF.6(I>>: +MA.F!N.F@A>*`F"TM)7/B@)D*`.*4C.*4@.*4@.*4@.*4@.*4@.*4@.*4@.*4 +MD`KBE(+EDXCEFXGOO(SEI*?EKK;EI;WOO('BE((*XI24XI2`XI2`XI2`XI2` +MXI2`XI2`XI2`XI28"@#EDXCEFXGOO(SEI*?EKK;EI;WOO($`Z*N+Y9"1(#PE +MY:"QZ8ROZ*JDXX"""@#HJXOEF)?HJ:;EG[?HH8SB@)@E^\C.6DI^6N +MMN6EO0H````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````N+W5S@`````````````````````` +M```````````````````````````````````````````````````````````` +M`````````#`P,#`V-#0`,#`P,#`P,``P,#`P,#`P`#`P,#`P,#`Q,C(T`#$P +M-C`W,3`R-38U`#`Q-3`T,``@,``````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````!U-I +MTE*GR[0]5%VU-"4)4@H(J+9H[,$!`Y8,1K9)FOWU.PAIHDV3@G2^W/?=K^]H +MZL!3`'Z0P'/PY"VWD*R]&);>QGT'X%DX,`,E;[AFEN>P.T+%93NK60,?Z:?/ +ME-!D#6MWLPG`^>B`XZL]KW=D-%%KP)I='*#7G5C0EM%J5FM5#;+SU@S#V8D(?88"0GVGA!6'B!7Y: +M1+\HI4/$QO*J2:P&#B +M`WO%-\F%:24[@JV$&08`V`+P5V$OP/TU<,^U$:JYQHXN$$VA=,UL;__+8J]9 +MK&:YZ`.9[)DZP^'*=9G2B?!"TER3-/S5IC?C"L>:>J:__?^G*Z_ISE'H^XKC +M3]P?R9FQMP'E8JO+9*'FQK"2#YMQ(C<,HL3S5_#XLHH=$O%6:0N[KD24@GLT +MAJ%+]:UL.JIT^7#:Z2((MY&W6B=DH=JC%F5E(7V?J4%FL,1D$*O"'ICFL%1= +MDP\M3P\E]@%6Y@/_L`]Y6U[=UT>C@BW7M;#C +MZ4AV.+7CQ*X+\TT<.$C.H>BDA%QE78V0TS)P!Q>=8XJ:H9#Q0R*<,(,$98-" +M0G_3,8G%>$6?ML?T?H+*NN#'*T(`!F +M<')I;G1F`&1C9V5T=&5X=`!O<'1I;F0`9F5R6#[`CH60(``.BP`@``Z"L7``#)PP#_-1RX!`C_)2"X!`@````` +M_R4DN`0(:`````#IX/____\E*+@$"&@(````Z=#_____)2RX!`AH$````.G` +M_____R4PN`0(:!@```#IL/____\E-+@$"&@@````Z:#_____)3BX!`AH*``` +M`.F0_____R4\N`0(:#````#I@/____\E0+@$"&@X````Z7#_____)42X!`AH +M0````.E@_____R5(N`0(:$@```#I4/____\E3+@$"&A0````Z4#_____)5"X +M!`AH6````.DP_____R54N`0(:&````#I(/____\E6+@$"&AH````Z1#_____ +M)5RX!`AH<````.D`_____R5@N`0(:'@```#I\/[___\E9+@$"&B`````Z>#^ +M____)6BX!`AHB````.G0_O___R5LN`0(:)````#IP/[___\E<+@$"&B8```` +MZ;#^____)72X!`AHH````.F@_O___R5XN`0(:*@```#ID/[___\E?+@$"&BP +M````Z8#^____)8"X!`AHN````.EP_O___R6$N`0(:,````#I8/[___\EB+@$ +M"&C(````Z5#^____)8RX!`AHT````.E`_O___R60N`0(:-@```#I,/[___\E +ME+@$"&C@````Z2#^____)9BX!`AHZ````.D0_O___R6!`A15FA`BP0(Z+?^___TD)!5B>53@^P$Z`````!; +M@<-8+0``BY/\____A=)T!>BB____6%O)PY"0D)"0D%6)Y8/L"(`]\+@$"`!T +M#.L<@\`$H["X!`C_TJ&PN`0(BQ"%TG7KQ@7PN`0(`57,?]64U&#["B+602+,8L#QP0D!@```*-`N@0(N#*@!`B)1"0$Z%'] +M__^XZ)\$"(E$)`3'!"3ZGP0(Z)S]___'!"3ZGP0(Z/#]___'!"0`CP0(Z*P3 +M``#'1>0`````QT7H`````,=%[`````"-M"8`````,<"Y6Z`$"(E$)!"X@*,$ +M"(E$)`R)3"0(B5PD!(DT).CD_?__@_C_#X2K`0``@^AG@_@/=PO_)(5`HP0( +MC70F`+\!````Z[FAZ+@$"(E%[)#KKK@%````BQU`N@0(OP4```")1"0(N!R@ +M!`B^(*($"(E$)`3'!"0`````Z&C\__^)7"0$B00DZ$S]__^X!0```(L=X+@$ +M"(E$)`BXA*$$"(E$)`3'!"0`````Z#C\__^)7"0$B00DZ+S\___'!"0RH`0( +MZ'#\__^X!0```(L=X+@$"(E$)`BXL*$$"(E$)`3'!"0`````Z/S[__^)7"0$ +MB00DZ(#\___'!"0RH`0(Z#3\__^+'>"X!`B)?"0(B70D!,<$)`````#HROO_ +M_XE<)`2[!0```(D$).A)_/__QP0D"@```.B]^___N3.@!`B)7"0(B4PD!,<$ +M)`````#HE/O__[I)H`0(B50D!(D$).AS_/__QP0D`````.BW_/__QT7H`0`` +M`.F#_O__QT7D`0```.EW_O__OP"@!`B^^I\$"(E\)`B[!0```(ET)`3'!"0$ +MH`0(Z"S\___'!"0RH`0(Z(#[__^YR*`$"(E<)`B)3"0$QP0D`````.@7^___ +MNA>@!`CK@87_#X62````H>RX!`@YQ@^.DP```(L<@[H%````N&*@!`B+-4"Z +M!`B)5"0(B40D!,<$)`````#HU/K__XE<)`R)="0(B40D!*'DN`0(B00DZ*OZ +M__^X!0```(L=0+H$"(E$)`BXU*($"(E$)`3'!"0`````Z)?Z__^)7"0(B40D +M!*'DN`0(B00DZ'+Z___'!"0!````Z+;[__^A[+@$"#G&?K+I;?___XM%Y(7` +M=1Z+?>B%_W5"BTWLA:`$ +M"(E$)`3'!"0`````Z"7Z__^)!"3H#?O__^F5_O__O@4```"[_*($"(ET)`B) +M7"0$QP0D`````.CZ^?__B00DZ.+Z___I:O[__[H%````N(>@!`B)5"0(B40D +M!,<$)`````#HS_G__XE%[.ET____D)"0D)"0D)"0D)"0D)"058GEBT4(7:/T +MN`0(PXUV`%6)Y8/L**'@N`0(B5WXB77\B00DZ`2X!`B)!"3H +M]@X``(7`=66+7?B+=?R)[%W#O@4```"[X*,$"(ET)`B)7"0$QP0D`````.A2 +M^?__B<:A]+@$"(7`=#^)!"3H)PL``(G#Z'CY__^Y[*,$"(ET)!")7"0,B4PD +M"(L`QP0D`````(E$)`3HQ?K__Z&TN`0(B00DZ)CZ___H0_G__[KPHP0(B70D +M#(E4)`B+`,<$)`````")1"0$Z)3Z___KS9"0D)"0D)"0D)!5B>6+10B%P'0& +MBP!=PXGVN`"Y!`B+`%W#C;0F`````%6)Y8M5"(72=`>+10R)`EW#BT4,N@"Y +M!`B)`EW#C78`58GEBU4(5@^V30Q3BW40A=)T+8C(#[;)P.@%@^$?#[;8@^8! +MC1R:BU,$B=#3Z(/@`3'&T^8Q\HE3!%M>7<.)]KH`N00(Z\R)]HV\)P````!5 +MN0@```")Y8/L//R)7?2)??R)PS'`C7W4B77XC770\ZN)W[D)````B570B=CS +MI8M=](MU^(M]_(GL7<.-="8`58GE5U93@^P,@SV\N`0(`8L]N+@$"'8?B?N^ +M`0```)"+0PQ&@\,(B00DZ$GY__\Y-;RX!`AWZ8M'!#U`N00(=!Z)!"2[``$` +M`.@J^?__N4"Y!`B)'<"X!`B)#<2X!`B!_\"X!`AT$XD\).@)^?__NL"X!`B) +M%;BX!`BX`0```*.\N`0(@\0,6UY?7<.-="8`58GE@^P8B5WXB<.X!0```(EU +M_(G6B40D"(E<)`3'!"0`````Z$_W__\YPW0*BUWXBW7\B>Q=PX/^!G7QN/.C +M!`CKZHVV`````(V\)P````!5B>575E.#[%R)1<")5;R)3;CH0?C__X-]#`:) +M1<1W$(M%#/\DA4"D!`B-M@````#'1=``````QT74`````,9%V@#'14"``"+1;B+=<@!\(E%M(M%M`^V`#Q^B$7;=PT/ML#_)(5@`````QT7L``````^$6`4``,=%W`````#&1>,!BT7< +MC57PBWW(BUVXB10D`<>-1>@!^XE$)`R+10B)7"0$*?B)1"0(Z-_V__^%P(G& +M='R#^/\/A$H%``"#^/X/A!P%``"#?0P!=3F#^`%V-(G:N0$```"-M@````"- +MO"<`````#[9"`2Q;/"%W"@^VP/\DA5BF!`A!0CG.=>:-M@````"+1?")!"3H +M+??__XU-Z(D,)(7`#Y7`]M@@1>,!==SH5??__X7`#X12____@WW<`0^&+0(` +M`(M-R(M]W(MUM`'YZR"+1;PY1+3;B+1<@!P8E-M.GR_/__Z$_U__\/ME7;QT7< +M`0```(L`#[<$4,'H#B0!B$7C@'W:``^$;/___X!]XP`/A2S____INOW__XM% +MR(M=N(M]T/P!PXM%U(E=M(G>.<")P?.F#X6;_/__BU6\.57,^___BU4,B<.X]Z,$".B/^___B<2)/"3H9//__XE]T,9%V@&)1=3IUOO__\=%T`````#'1=0````` +MQD7:`<=%S`````#IN/O__XM%O(7`=`:+5<#&`B+'1=#SHP0(QT74`0```,9% +MV@''1+1+7<#&!`-+5<#&!`(G@T7,`^DY_?__L&'K@X!]V@`/ +MA&?]__^+5;PY5+5<#&!`(PBT7,@\`" +M.46\=@>+3<#&!`$P@T7,`[@!````N@```0#&1=LPZ?[\__^PF+1;PY1

P$`#Y7`Z4'^__^)]HV\)P````!5B>6#[!B)??R+ +M?1B)7?2)=?B%_W0ZZ(WP__^+31"+50R+,(G#B7PD"(L'B40D!(M%%(D$)(M% +M".@#^?__B3.+7?2+=?B+??R)[%W#C70F`+\`N00(Z[^)]HV\)P````!5B>57 +M5E.#["R)1>B)5>2)3>#H,?#__XL=N+@$"(E%[(L`B47PBT7HA<`/B%(!``"+ +M5>@[%;RX!`AR=8G61H'^____'P^'/0$``('[P+@$"(T$]0`````/A-@```") +M'"2)1"0$Z(<#``")PZ.XN`0(H;RX!`B)\BG"C3S#C035`````(/X!W88]\<$ +M````#X7-````C;8`````C;\`````B<$QP/S!Z0+SJXDUO+@$"(M%Z(M5"(T\ +MPXM%X(L?BW<$B50D$(M5Y(E$)`R)7"0$B30DB50D".C$_O__.<-W0XU8`8'^ +M0+D$"(D?=`B)-"3H@_#__XD<).AS`P``BU7@B4<$B<:+10B)5"0,B5PD!(DT +M)(E$)!"+1>2)1"0(Z'W^__^+1?"+5>R)`H/$+(GP6UY?7<.)1"0$QP0D```` +M`.BK`@``BQ7$N`0(B<.CN+@$"*'`N`0(B5,$B0/I#____X/H!(G!,<#\QP<` +M````P>D"@\<$\ZN)-;RX!`CI+O___^CQ[O__Z*0#``"-="8`5;D)````B>6# +M[$C\#[Y%#(EU^(E]_+X`N00(N@$```"-?=")7?2-7=#SI8E4)`B)'"2)1"0$ +MZ*7U__^+50BY_____S'`B1PDZ"/^__^+7?2+=?B+??R)[%W#C;8`````5;DZ +M````B>6#[`B+10B)3"0$B00DZ(;____)PXUT)@!5B>53@^PTBU4,C5W8B=CH +MG/7__XM-%(M5$(M%"(D<).C+_?__@\0T6UW#D(UT)@!5B>53@^PTBU4,C5W8 +MB=CH;/7__XM5$+G_____BT4(B1PDZ)G]__^#Q#1;7<.-=@!5B>6#[!B+10S' +M!"0`````B40D"(M%"(E$)`3HL/___\G#C;0F`````(V\)P````!5N?____^) +MY8M%"(M5#,=%"`"Y!`A=Z47]__^0C70F`%6)Y8/L"(M%",<$)`````")1"0$ +MZ,?____)PY"-="8`58GE@^PHB5WT,=N)=?B)??SH4NW__XG&BP")7"0$QP0D +M`````(E%\(M%$(E$)!"+10R)1"0,BT4(B40D".A^_/__C7@!B3PDZ$,!``") +M?"0$B<.+11")'"2)1"00BT4,B40D#(M%"(E$)`CH4/S__XM%\(D&B=B+7?2+ +M=?B+??R)[%W#C;8`````C;\`````58GE@^P8B5WTBUT(B77XB7W\Z,'L__^% +MVXG&BSAT(;@D````B1PDB40D!.@``0``B3Z+7?2+=?B+??R)[%W#D+L`N00( +MZ]B0D)"0D)"0D)!5B>6#[`B+10R)1"0$BT4(B00DZ(#M__^%P'0"R<.)]NA+ +M`0``C70F`(V\)P````!5B>53@^P4BUT,BT4(B5PD!(D$).C/[/__A6#[`B+30B+50R%R8L"=!X]____?W+H6^K__\<``````+C_____Z]60D)"0 +MD)!5B>575E/HF````('#;1D``(/L#(V#'/___XV['/___RGXP?@"C7#_@_[_ +M=`R-=@#_%+=.@_[_=?>-M"8`````Z-\```"#Q`Q;7E]=PXUV`%6)Y5=64^A( +M````@<,=&0``@^P,Z$?I__^-@QS___^-DQS___\IT,'X`HE%\'0<,?^)UHVV +M`````(V\)P````!'_Q:#Q@0Y??!U]8/$#%M>7UW#BQPDPY"0D)"0D)"0D%4Q +MP(GE4^CH____@<.]&```@^P,BY/X____A=)T`HL"B40D"#'`B40D!(M%"(D$ +M).A3Z?__@\0,6UW#D)"0D)!5B>53NS2W!`B#[`2A-+<$"(/X_W06C78`C;PG +M`````(/K!/_0BP.#^/]U]%A;79##D)"058GE4X/L!.@`````6X'#2!@``.@$ +MZ___65O)PP,````!``(`+W5S'0M9V5N97)A=&EO;@!T&ET"B`@+78L("TM=F5R'0M9V5N97)A=&EO;B`@('5S92!N97AT +M+6=E;F5R871I;VX@9W)E971I;F<@9F]R;6%T"B`@+62!@)7,@+2UH96QP)R!F;W(@;6]R92!I;F9O,!`@2C`0(`(P$"`",!`@`C`0(`(P$"`",!`@Q +MC00(`(P$"`",!`@`C`0(`(P$"`",!`@]C00(`(P$"$F-!`B5H`0(`0`````` +M``!G````GJ`$"```````````:````*.@!`@``````````&X```"SH`0(```` +M``````!T````OZ`$"```````````=@````````````````````````!W7,`8P!ED!`@4I`0(%J0$"/.?!`@=I`0(```````````!`````@````,` +M```$````!0````8```!M96UOB`0([H@$"/Z(!`@. +MB00('HD$""Z)!`@^B00(3HD$"%Z)!`ANB00(?HD$"(Z)!`B>B00(KHD$"+Z) +M!`C.B00(WHD$".Z)!`C^B00(#HH$"!Z*!`@NB@0(/HH$"$Z*!`A>B@0(;HH$ +M"'Z*!`@``````````$"W!`@!````P+@$"`$``````0``0+D$"`!'0T,Z("A' +M3E4I(#0N,2XR(#(P,#8Q,3$U("AP73OS-PA-UYQ +MA5U2BOWK>]:TC:28K9$'%2C*"THKD3.'=\X]]V,NKRX>W03,6[L\I;?BM\]/ +M=B&%='9QW?MXN(X'VCJNHOWE-_^IW5?^OQ_U"ZO;HN=C[?S +M(W['$F!GS%K\G5?V<_RMPSHIE3(7G7A$GS[;_WG\8Y;D%?E0@U+2D=#")I>C +MH.2EL*'KCO-TE?K]U8Z'8=Q(43VE7`*QL9%*3=FX8*K.L<0<]6G]O*.)KX8Q +MT\!7A:_^]MV;'U[?R=MRD[+&M!&U85!N*T(9\M$:%&/$MI@$U +M'5>@1`J2*$!*HMA4!/DD@K'9D,F^M*!X;D-5GZQ(FI3.@EQP4DD9$K/U.1G% +M+:@ZM:&\5-H8([E8841E2EQQU"JMTM+KW/)J:$-9"=9MR+;ZH(PU<*W&J"5S +M]=ZZVH#:4AM*%O8F%5EE-@8@%`FX21:]+D0VHO`(52B618S3,.G,6NB1/ +MQ>20BG&QMKR:[U>X,J!'U^J2#ZYF$D4Y:Z*(AJ1F:NF*YS?/_KZB!XH.:LC6 +M!A\#I\#!AQP(D$*2;#'_?O?FNU=M--8FJ>*+J*%`\2[4Z"HBR$('R;7%V'XE +MCCJYQ#'5K."6P^E4310J1,J)H-L&5%_:4-'+:`EY`KJ\B:Q\5F2\REXCG+%) +M_HI099*E,O*1`_+7!1"<$?NDD09HE[UR),2G5J@_CBKJRJ4Y*(R(JA(KD')BJ +M.+6,%#SY%E=OVU"*+7S@"(&F6KT6F2E7Q"$YKD+95@0/:U6+=76*!'+92.F4 +M538I4M*B!)%L>?5VA?8HO*X"BB(I2\A0*2$A+9,*2'#B%M0*5\A6BO%VX\ZUT/J[H"K07AUS1'DVX!DJRHO.4HJ,.)$R+J[L5 +M75DEHH2T?"6/'([0E1`Y$F,`A@B$EJBZ6Z0J)160FI-(ZX[QRQ@3&*=6E#9:H5+'H&%2=5<0A +M"MGJ%VF[0I?4Z.T8;@O*:ERR.Z6(X4MI+@J9T(`ZK&50*9AK'.=L%3([JR`3 +M)ZT85U6DD?3L*Z +MPF2KKJHJ1#2;B'Z6`\;,WP\/9MV`G*6B,!QC,'*./ +M"W1U+\SOMM[2?OF1'UF4RU?_@?O?)>C;'Z9Q>+0;YA?O_Q)%8[G_0]&8GYS[ +M3;E77_`LN,$D%X'MWG.=[PO\W4W]"F[[NMO_PPT?>F>NF\V +M+_>@>QBX/+WIWV.##6'S`_7[`WYXNNYN:'_H:3MV/_4#=7^::7^//_Y23HDY +M3MMO`3_GJ;\[^?7CCKL\T#SWN=M.S(=^OWW2T;YTU&W'L73\*]W>#;SYL/+[ +M5_\XG;.[F\;M1+?+LQPSSUA>Z;8?>IJ>='7J<8#AW6?$RZY[>=AT<'Q\F+O] +MN'_ZWAT//'5S!E!FK!B'[F'7Y]VF>QB/0^G&PXZG +MAQ[;$G?'/=T3CIF&96F'CVXO-QU>-PS"C_/P[@G>'(_;W36>_=SA1?M/1^O& +MVNW&AV5G&>'%J8AU=Z?``N7E8=D`U$\?W9^"O&P\?&3E]33^@B!^-7?_/!'T +M,$Y#^>H33YONZP_N+T#]8>:A_M:!.D[_#O3-Y1\I0F<[V]G.=K:SG>UL9SO; +MVS3[%^2'WY0`*```"F1A=&$N=&%R+GAZ+R`@("`P("`@("`@ +M("`@("`P("`@("`P("`@("`V-#0@("`@(#,U-#4R("`@("!@"OTW>EA:```$ +MYM:T1@(`(0$6````="_EH^-O_XHZ70`7"[POZ$`F\ +M9,!1*,IY8;_,_3;1GZJ,JO&MDYNQJN-]>\0Y0J*L6V-BX4*"":UF^"C7#404 +M!?-O54H4"<3_E\I;040+IYU=0;S!A(S]_,3./Y3QJGHM)4& +M&XDP!:.^<;S=[4#M%>^3ZP'L]"AE(9B-><-]^)C6BJYKA6GUZ"7<^9\HYD9Z +M5T09H+[OIK<78UX%GC3^%RL&<1+2Q@;X,GFXF&7):@&BZ7[.,HL;$_1()6&6 +MG:(S&S1&;ON5%[7,#38+F98DJZ-4"4RHWJ-4]JU:@2L+!&C7V"HONB5#;&-' +MR@X$/](R*FZG^J;=;X!>:9<>9',Y?]2\&CLFFOV"E.=NLK9NY3B;-2U(*[M_ +M$=2[E#2>CN5ZX`TJ"!C^_1RM.S)TK!N[T1`*X=Y'*V]+K+F.%Z@OR\QV=$4+ +M_(_*;0[QI#7^X%O"EC<@*6^.TFCUY'Q,?0,3`Z#?$&TLS!V;[:&;V%(X\[?-/!9 +M+DN[PI,O9G6[M;L?&SLS3FW^F%5N%>0P1_9+^+V;V=BM:N\? +MY$-NW16Y">7S#R1Q!DU]T'2%"R9U5V^>K@H&RN'()FC?"6ML,K6ILXL)IY_L +M>(KW<19K.F'MY/@#*%55QHZCQ6=>M!;:A_H +M1"@=L_"%.[$T:Y.ODN@8R]1Z6_.C%"D&OJK%ILW2YR.`5Q2@*EL?E$0-W49U +M*`FWV2/\`A(&Z#FIQ\??:C_4:;0=F.6@[\280&!-[*52U%(,J+/U7/MG960^ +M7[7$X>:M,_$>4Q)]-EJ-=O8J.,IU;LRZ!\LTV3UZLBOZMO.LENB>IB9/4':< +MK'*D_)G#XF'`.YEE;9;)O[WP0KIZV.1LWO>IR]Z4'R\NHWDZ)9VQ-E +M,S#(\["7-,7-9OV,#GBU?Y*<>-Y'6CE,:#E_?Q^O555Y!V4L:WFN\8!8+=:G +M;$@>@SLP"NN'ODXVDQ99K`6#PX9:U*G'UI$*_I=S#,K+5DDX4)G\+H`BZ=+2"TNMJ,R&4&8,2$:!)VN[:AH@>`N(V +MW+1W&M=R2UC,_ +M\>P.SO;'^\C_K*H:B`*$%C)F-ROAU%WNM,`GXWK2UXI(=9'E^`@`J-ERUDRV +M3Q;G>!L.Q>(U\;2/DE9^YN/%XZ8MKT?2#DFN`T^U[O;["*8N3XC#P/SZUA@W +M`2!;%6*!.+YPG>E;'1R+,<-`5".:H<_#\UN15R4J3&K7*3E$-P:KRM-DC)#S +M"O3+Z-RX+167)'Q1?/1-T0VH=$I%;TVG5IJHU`C*$,D/+`B1A&'[:$OM'(8! +M2[V7+=*5![`-%^2`FG+;T*F;W4M.6`NJQD/I%[K]],B+%F$<-<0I3]ZQLGL, +MSRM"B3Q^ZNPH4X6FZ52OC-\RVO/*6%/-V$#JF:D)8OJJ<\MR*@$`]:-'V2/_:X2*4IKDWJ_$S'A\F*9T +M0;M,AQN/,Y0-Z>K>0WEK="..!T)OGF7UV)@$C;)C%6Z*RQ_V%RP/R`$#/[U4 +MS65E/;Z0C1AM+5FGNSVEF45,PIL;&9]%ND76F1G4+'+0R5JGCH81\%+RU_@T +M[2,.@N4P%U%W5TI1K3B(YM#0U'TS$BLC'$O;-5W;4N)O/-2;7ZM2U@TC)O`X +ME@<'NQKR=_FF^CCLG10K:&9GOU,Y*+IZ,%@$M@SV)\W/*`CMD\)KSONFG=*O +M1N#HLFB0OLQPJEBA%)?Q=$_9J$@F)D@H=>0"D1G#5Z%?8CA"BDZI`M@.^=1] +MR7B[S>+Q@W(!N0'<_6S;`3=DCZ\/FZFP5-&H@&YH%7GO,CH-%8O4IC,"Q^4# +M;C^.XH@!X0+_.X?&?`?/C9HJ^3IL6BB4.ZWB+!N6C]2G[$$H4T^#Y-_@A`3< +MZVY5XHW7`.L61LN3]LL[+O4NV6?Y.0+:*_]("1>7$KS:J@K-?S0V@_-]$P216R&#)3=D:E87 +M5QC.%/-*9P^-HM5RR7-M_7US7JQYY%(_7>B]7L1)JID48TZS8%?8LHK=1(/[ +M>=08J32LX%HJ^P.0;P(TZA:MV39OYI5(SL=@$UC/0&+^JC=HUNUM=45@,GY673,-N)A5*V#,6-;_AC"=I8PM>3M32&=LPNIN;C909 +M,C@$\,B9H^,X!.D)MM>_W0V-2X[.WZI%,V`Q"9#?AGQ]/E?7*"N36C@I=EK(8NG]??RL):S\#]+LR%@ZRJ:D +M7"=,AT$-]4(]B&J[<<5"JN%)V$9O-^35'-GMOFQXC'X\(ZY])[!9N4V +M,.5Y4,KCMWYD"P&P'L_]9.LR*3T,)A%1#WNCP\SBH"I?\)WW+%IX4$&HU/A[ +M98;2LD$:.L4:(K\0;=X45!!"@9C(,/S7M2=%/OTJ['[XP(0+.2I7!DHXF`0U +MI!NSM7V=EQE/S?BJ'S/WV6J6SC\+Q$>*8&CM76_]8)7W2JD%HMC+#=I4XB<3C%V`"9I$CSICV-=0?!)]XR#C2BTV*Y@3CQI&V0KU=+:2 +MHZ@\XO#()]VN_Z[T731)PVD,Y\PAJ)L:,G[CVFC=1BAL$JJN!X>ML-U98_'* +M0Y"1]X5L/HFI`8^NI[&I: +M%)N:8=30M)&7+Y8;[115!KX@1."0Q:((!_UPI<5AX/HR9.&KU#C$N^5MRP2VRQ#C]5($@#\B?4Z-K-]P5L]21^'V<*Y_M'[FCZR+=6 +MGFD;:+1JMQJ37-2'#L=.I5;]1.<@!/T$=4WD53*('D$!&,M%3+!MGB\EGF!O +M=S0`5<-+"]?KS^>%C(^RJC4&D)*NO!5G-H@M@FS/5EI^7<5=M\W!&N?<^E42 +M<+)HT#9IMY7+[Q=/L#Y9H@_:C-77Z$26#%YI)16<5+6ZU_,O*CKF#_NK)D/] +M95<:!&0/LXOCLI*8MD)D6SZ?WZ&BHCF(9]`]=.KJ;=%1#Z6J>0\0'3XF<[``<3:CV#C],2(/QFH/ +MB[6_=NPZD5X6Q"TT?,&1=^!=5.\Q1_-YSKUS@CUO,T!H+K&J,]]BVT?;DP?+ +MII_K=DKB1`W*4"?/HX`6.4L2#;V*34:FF`*J\7N,"0^E)Y,[*E7<03Z]#[1# +M3G[[HZ/Y)^K!Q"N18P+6^SJ.`4#W)V4@S\)92Z]5J,RK,F08%D\"@JLUBZW< +M#_3="KEXE<-59X`_$R+"'UV&&'L2*5(P[^:]$4B]Y[##R^@N3ND#?9Z@/"TM +MR`B&F4JIA"(>A71T0AB,6QRW+5Y)XB5!7);=O+_"PM`=0`L&`R/M/H@>+'+( +M#/]7;_2N&J%T-U[016OEBCN-CO'4!<&;^P]@E5=#_9L>5JD];BO2UI48Z_N-!'@TA47Y%7 +M^JYBRV7"W"D_(J/LBT)*=KI8,7`\K'4)N*&?*UK4\F#ROI]&-L;^QGGK87@N +MJ=]C=N[AZD9A(&,X2X\U[?6Y=G-TDGYTB>MT#?;FO5TH!51LVN=(@?4XV&^* +MGM'_E8ZB((02Y>_7!/]`,-!=`_F`LN+<`+.JO'`I^:;F,*Z7X\,UX.O-2W*A +M*]F_2U\HC<`**#Y7<:0XKTOY_L>G?YIPC-7H_+.1DI1)1-"U`B3A0(F6<,R/ +M"+"!=."XCOBB4L_D)!GX.C925R#13]-80!?TE\(ID@2(7F@GQ9R.-_TD9J-> +MN2P&H9=,_@DY%/`@-77$T)6*^^UT_RB=2&3L/Z%.')2D,E[*-FQ(?XD7NO_\ +M(!X:(6K.@S69+(D#'N3AJ2GA(GSCK^:^B&"[8^2)4T?^HAF%P:0<,4;CG3UY +M<";A,F(A74-T/H0`!%]'B@0VFZLT-:CRIN%:JWL`K%A<9V1+;%80_K\O-;97 +M"CY;[@OP);&1M"K'`K!YH+C]>#:]-Y$][?J5M1,`1]PB +MBBQLW(WS<^G7.^R":F60HR3ZZ:RJNG+T?>;RMXYHY+S(A#J$\I68'LJI#&NQB)^5FY\"&ZH+D.1P"1 +MR`?MN"B*"PNO6]((?00EM:DG#/X7\ITN*B">92L_^6;M)28;E'^0-4YHR[S8 +M:V_$F\I^%%!/C6%&%[^3W8I.X!6Q!Y['RP*4P\SR'\;9\+^9 +M[MC_S=X6YSB#!_5&XH>^..,3_E=C'`H$,V+[0')'L27[ +M!H4EG"*LP4NP#'<,M)Z-R;^ZJ9US&*JKRB`Q\.=^^T?HHV:ZN6@7R('DNXBG +M/%(LQRK+S$8N:`,C`IXVZW7>.JWIO='!K2E*8UQ/Q!O,'G%/W@U;0!-8K7Z\U3]T?0>.TVJ*,VSN_'"]:!^_C+13TX1+87 +M47K7:_,GF9_;PNAVZ5X)6%93A5?\CNV2O9Z<-?36.6WV7NRZ9B590`Y9XB,6 +M`.HLM?NF[;OX+IV1F\>/%NW69^YGF<$/*/GJI_?L7JP$Z04\_(:V"UR +M`?QZS]-((]=,YBM:-FME; +M_O=IIMJ]72IVM.OR<=,=\%]B)VD+%K?UCLK:NB&4;$<,#6]06L/*.%3Z,Z,Z +MU757I=<>:'_?W[\&`UY6`5#+LD8A-KU%Q+BU>$B:NXN_<%4*G##_M[,\$[*I +MJB5D.Q"&8EA9',XZNNF)LDR-S(A)?F&?AX,I%2$PJ-=+C@@=#XA\J.O1W +M;1\26,DG6ZH.6$/G8,?)7\+%B@L>ZBD1ZBAXH&-$-?B+B-ZD''2"S#R!Q7W9 +MOFIT/:H1(]CI6%IG%>":.I67JHQ5%(78&?ZL61P`,U-W*&(QZZ*N2Z_R1`#G +M7VG')@AX2S2'5SQ]A)E:@O);96T_6RP"+1)DU%,_GQCDUJ+6A(_'R8N?2ZPT +MR[SN)Z`LG-&R\+(&Y71%8Q'S9MYH84>2$.G80SY\-18D.53-CW7SR+]9V-IQ_(!6/7!,V+U.&6ZH-8 +M([V$,/%L0;R-KX$>AKHP?$&]?D`!$CF"F=K,XC1LMTE6K$7-]L4ZV2A0DER: +M#QIR0E&%)3KW'+N9N>S!_M;+!?]&MT,S_7M1!A.0;UF&ND7WH/8-D:67WH>S +M;*#?VSQF"7VD&5BW?.K`"([6\_!JHR^W43FWVPCD*H6N@2R'O/=9']S6G]CL3;JU +M.FED)F:[71_X1#_5A[/WHYSE(>$4SO%DP;A;RV=2NLM>5!;A[@S2GO>RU<(R +MUQ.""A7V\-2:2*S]PA=OC-(2J,#'"S%JM5T5V2(*^]C*#;TT_QQG$?H:'$LI!2WY@JX9L>3BI9(8%F(E/EX0H5"%^(]@QZFYT +MF2Q3)5XL#DA)5V$#01Z6JWWO0,-H)-#!RN:@3"YNCL9W8'^G#XCT;:!-&KO5 +M]S[AIQP`.;$X@%_28D-X#VBS@5)+0R86II/RK.D\L1,GS*P9-G/UC$^:$8Y/ +M4#:2\8"&2+&V:XF1M=_/$9=%]?HR7$%[GR9YE@6745&_#W(H;A`U['XI;\\. +M]>PZ[*C1-2L>Y9.C:A6"0WM0*GRD&@!>$VG*#Y4@B*R\CXA.0PRO`Z(/Y;U= +M01^5@"^[N&VB1*/?R@S:;Q^`+WMS4TLK<*X+L5\O8H`T-]\#;-!M +MK1LE8>,/6#V"TLP%7%[\3`[>289O.DME2T"*&L!?<9M+Y=$U\Q2#\[+R](W% +M/D^D)U1.U1=L!\_)._J/J-7`,A502]`=)Z)D@<,>%#)^&?%+)8U<='"(H[HF +M4,T,G^1J"=3^/:Z8R@RI&YGD:L;]V;;=_Q+/UD!+$L8&CK`$Z/=S18=-:N5( +M#Q.\WEKL.YSV\/DG]TRN6Y\NZ#JS;.+Y;Z+6HKCVQODHU;,%IZB<0R#_[3*S +M_\@0LZG=4.C4*5QB3'3[>Z*Q(CJ(DGG]$DJW.2IN^/XTL>QS^=HS156R\6,> +M,!\#S$I'KFROYII"V!0!WOG&>..QSVSVWRD-8!2BA>_>CO=B##"[VT]E+/!S +MJ+LX%M=/.2O1&Y5KA^+H1=.!JX8;ZP(DAW04G>V>NZFY0`D5MLX +MRQM%AVD!+,0)VYMC\W9L4/Q']F9VBN=J-E-^+W`WM-WS->VWQ%ALE^V"(E]I +M]'M3`^:#&F,'U\]"@P$AK'JXO@YU@+Q)`&CAC08B/K@",7OU,*M1K;EH/L@3 +MKLUDLO7-F1+*5(84MK:C,J3`D98U.>JOS2WOQ0%<]=^'+JN`=8*G.UKQ\;(_ +MG&4)?(2\%8*,5`<.HXB.RM2J6-Z!2G)*?QQ6>3FF8%87Z`[C)2)C)H??@@0+ +M/A+D@7Z2INO*A')0S5RB%7\OK75O7MS&8R>IJF$7?4$7_2V1L2>420-_?![+ +MF&I$.Q-[V`>LBK+/DGY`%\Q;8Z/#;"BSK"&,)L^;!8%-UI)8'JLUK]9I/`DQZQ>_3$-9@-`2/ +MM7H2$";&A+Q$B]9(/AT!&"J3ZJV*(<9)?6>3'RF2HI+Q!TO)'/:T9N^TEDU9 +M`TX6OHL(_998B'7$1<*F5F6%@RPIR.Y?TQ^5M^?"=:"^]GYLJT:;?:"-)I2I +M7;YNRN#CI-DE,/NXWK8C8K6!Y@/'1T@MQOI+!EX2KF&#@XQ7Z70V-()BXI9# +MFL!H9((KH$*=^Q%C)WQ(+,3.'`D@7V("^[AL/PM]3WW;#'51K-A/G+KA8O3@ +MZ))/'KN9%+"9_DA1J-/UYW5R;S.VH4C!)1 +M.4KHJ0%XO=EH*"G@"[K]3^^X/>F?4Q6FHLI1<*4P^PDWRDS^)]+DU2JK0#SV +M3P[I//+CD620,X,GAYO;W?%JSFURU^*#CG#?S"K1@$V+P@%'1?1Q!]J\H;+> +M$%I\JS,QZ7EBZ#2`U6W;\SO"6^2>!D"T];'MTUHWNEQT(RJ+UXX\S83&[#ZB +M_L!LF@Z7+\P=.Q52I_U,#&H[,@14!+3BA+^PI7@NU8V_91RZLKALX'F*?X9Z +M8R*WW'@M]22";SAE&78JV'/KP.S2205Y7L4_F1$1\)6UT.V912*'6MZ_:#H\ +M*OU&(%0.<;LNS\.E__7NA-=\&:HSKCY.:$O6[H.':C:0JD?0:ZE(.%U5\U8@ +M'E3JEL]28^GS0#X=[5[(+0'8^G0=N*X^-;BC1BW)XS.$-3WD'T2TM_%P4`M3 +MH+_]8XHC?C7+J+UG&3T]V[_J)FLU6D5JJX`R9#Z+7;^]9S'5A]AW<^5B"?8@ +M/E`'+6%0%X%81!J_L*0&CM$R(7EA9`F/=O:CGHGA1(!5Q:^N5[KX`[8SPU,W +M%;')4RB:0U@J1S<`R"R.-WJZQ#_XAPI5:8)K_-:W9P2PY`TXBB!X*")@F8=( +M2TJ-*J_#[7ZF\KA:LS8#$WRAA[&PD*L9Q&L,>1(GDZ>"P]-L;<66]O4J)NN0 +M3TC9.=P+\_Y>R4[T2=!=V<*VFI*.3(:`^2 +M?7JE.W[EM@>8,+%#0DV1=T#$>;DT+)0BI1)!C?#"GTR=.^6H'V-:M8<-6'X`R:/6B7_M>+O_A9"2&QQ*>U"N2TQ%P0!/#W]3I&4KL>^&H2- +M.EU+!.W-3;KY89I)R8;;#TOY$[?P=:V]/,0W]>;'/E9"91T3>[9#OHAD&S%, +MM[,F9\W+DON-GH)PCV1S.X2<:M7_";/:J=&E/9%6F"3G.7'&ASY4@I[61:S: +M]BCG@`8X(-CR'G`UHAHQY4@V]G/:=*[%0-T%?3Y-0'.N`/?VY==F%CR%/J*U +MY91GU,<_*G(=;EY5.3/.9JS()^>"'$_7T$-AK$#P`8TOR332O_(8* +M&VI`SPX,9<0!_576!1@(K3M_Z'123XD>]SF^BM(,GWF,34,S#J:%Q?;_FT;2 +M)L0(PX:"M/`6DL@IJ6NL^17_8RO>S]\/YBQ4R['YFE8Q4/>;=\B7$A_SJWY! +M5I*MJ)FE'C)?+6+,3R;1B!^)[OQ4MDB)/L8MH5$7?P_Z90P>")7`PMO.?35] +MW5&[N(AE7\FAS\EIL_%L9X%0^Y`?5OLGE"%2[S?$/98>JP.AYF-L2%R5@6C^ +M!\\M)=-1[$)>ZV07F#T]E^%ZW'18]$4M#2B_(V:S9S%Q=19&SYK0979`.FTV03T;\R +M`I(PEISV..Z9"8<25?)WG:"6='[%M;0+F8Q2W.OC7Z8<>H%EYI5. +MO(J$7I+VM*D??^6&SP37H%1 +MLVG3]"D#D$5;\I36OE)YRFO?,#"%7F'"7S1X$J#8I4!0Z2CBO=KC>OC0Y@&D +M`E.3<:$"%R@;U#*-,"@#/UAV!K_OEHH9%>RDV._X.F67P><7N$AJ>_1#5MRL +MG_`NM2XC]-#_+P8;,9D>`L--6CTNYYT& +M-5L`Z;BP\C4JS39GI7U]G?WF`[#.(NV0/J1_$7T^U#<#>7$![*X4&7SJ%VI1 +M]2?O^<-B1W +M/#DR&J>)5R^&YFW#M&CGF0_`!\4$VB4FT#?*>>1`A?%-&A,XV:Y>X`Q./N,% +M#;BS7/X_RMTL-SJ<7JAU]R(7J(_'#P!60!V/69E[13AVV/"A[G;_CWF^NS5P +M%-I]XAI^B.7V9DVW+=#U6DP^YM)M!K3T4 +MBR9PLQ/SPP&-[Y'M#V_^AS(.R<2[T:UUYEZ2V^;/AJIEBS>(9DW0+75Z"`MJ +MEV?R])::(*CYYBN!J[6M^\=[4^BB5.3,WGB$(S;"/40X&3GRI<.$Z:PM8(HU +MP)!W/:,*AHXI,JN_^[&0U7NR>!"NR30"AS58:'@2MF=@,/>5X*\3+;3>6H[0 +MMQTJ[FK4!]N.9/=45FX9L:1[<;('898]H]"=#>1/M=[U/".5(IP[ZR+`W4*' +M.@HO9)FA>HJ8>"ZLI$^+!2.]#BY8+7P!6(,FD?U?L--=?TWZ1/$@P8OAQV^. +M_VIB^.,9DHU1:RNB,>[(W_A)RQ.W2\=3T6@=`;AWM3BB+,!S6V/8S_SVPIF` +M"!VSZ]NWF,`.@:U`X%Z$(KLENA5U7@G+%D=4W`XJF2Q^9GC.JA +M)N'R29MTZXSZBNXW/U190U#>"7&`W_?A])OFH-K1E42,"A?GT]Q;F2JDCMY3 +MZ,;`+;OA27"5BWT+$;$L$&L)"R]+X-7",6J(S;]GA/;W4*#:79.(AV9=37X% +M+IPY\:W+M:E"IA`F&+*@2$AZB?M,0%L4#2)_%___4I`6#L859.+VQD-ZZ<,+"5 +ML+P7H(AUT+N(8!/R;?JT8B4Q8'"C,.5'U9-8XD:*A.V+Z!S6BK,#LS*''SU. +M:CD0/F#OX20X&&*JC=!QI'%PVJLVTMK7"+1R9^T783V@1@9B1XEXF#>KE__! +MQFX6IUI@ZS)Z97;(&7_1IWIZWS3[,`>]?)K!PA."*JWZJ9*G&_\9&UQT1$BF +M2H=F%B08^[5]2WC:@_2%Y6!#2]A$+X?XO>QS#Z`W8U"365"?+*MTAO;`F1_# +M(5J]>T\(;[ZJZIJ\B-*-V86F9VVJ.67A(4PG=[^O%JSP&(JJ7J%.,'30I2#DA9*7KNSICDB8G`+:W#Q>`> +M>D/IN<"DPZCN%JU1G@Y8W;M0B;Y&FN!>WX27VN-7KJ!1?9%A1**_X, +MF?1B_NA0TU",.-EYJ%"7_=F?TW8JN)=M\&9KX?-;2LM"D^$;'_@3,3"&!GQ]\4CX..T6QOOF1%2:C01O15+MF;'<.Q%3R +M(XH-*OOC2Q/?[2TVV!`Z#6`-,?%"V)\@ +M+L./E$Z\Z\T7VBR(HSX!F]/&I7VRN5\X+Q^$VGN.9-?/&X_-)J?.P_^3SM&N +M$PD6'N2Z!!(2R8MR;VD[,EQ<03`E%B(I?_>^OD0_5);\;XNJ=D#-,@Z!B\X( +M?2%>\L6]'/W^Y*W"JQV6_I+_/H\03D#ED@W!F]&\58K*EV%Q@] +MV4S!O,"9*UINUP$")#7V_Q456:,4C:%,*#DPY\HAI&CI`4T/44_3=)$N4!@> +M?BZG)4``@7$]P(CIR+^2SD6:!$4;\C-9?N686G_7Q26ARI8LT(_IHOW]Q)=@ +M45NTI@XC/E=+FK`AG7ET78[3GI2`;6,JQ3C0TB4RB+UG[X^S?6MN+*WN;5P2FX>S:WJ&O/*"+*> +ME[X381HX_B\Z(,U,JV($"&/A.]G$\QB(F.8STH!ID3F5GG<[X8I(>W.1^8M< +M:H2B74&21^Y8Y6]INW7PONUO]=75,;:I +M$2\2)"X'2;UH6Z?U!M\HL)NIIBOX::"[P0.0"F41'?$$W@VC3WS)1V"+,!-- +M\_2_BM=S,(W/.;+V\P!`J6\C@R#R>"HJO3UG1'E%M!+<8GI3"];Y)J=-R9.L +MGP_3>^(]23P$F`-J6+=VT.)[CGL'NFW(Z]6>%/X'L&.&"-2M\XEDD1H+\:\/ +MAM%SIZP"P2!V^]2\N2\JQT]A>_H6WVK+8G`810&HSGKV/;ZWWJUJ`&3^$1B: +M/T=T"->:]?3=51=KKT@I+:QANYG#2)>S=9T5HIMC[0ID;[>(^A&5LHL@BN,[ +M87"E3ZMKAU@ZVL'@7,3+GGW1>9T.2)V`8)A'+39IT;_)JP(2"`6;,&`P=HZ0 +MO$$/LLF-EGG$P_'^O);JRP;D +M:J_.R)H,(\,1P=4XIX0H[):VH'!9W[30[()\N91]Q9[K;N[^SY:Y3WX^+$1A_+[@2 +MC\2Y[:K-BBGE]L^SODP-&0/]^./B>GU904] +M5?@I70$VX,Q;K.M&L!AO)T^T('MCXV3TMKNF@8J=QGBYJRGQF8595A1(&MZ`E+H.@ +M`HHAR)W?B_IN+PB\WM?/WS\@1U4Y75)O+LMOO;18^%GVSN[9`MGG2Y(\=Y4%?Q/9/P/R$W;^F4/WVHHIUH+TA-OE +M]VCOTEFTR&6I;#===YKIU>Y;SJ)](G`7%SI;'FR55)B)%\UK;VQ8Y$+AI,L2L7'.& +M4X*V-^M2'0C0G[)]X1\-O#>WKE(%;SQ#8\25Q;>BN,">:V@Y@F*3,$<56CCX +M;!YT$\K@P9H%/XG_6;FX0-;/D(D)9CVG(<6GX>)J3(_L&_[;=^/WRG;0:>BRRH?GE#[ +M,M$U:)8EKI4]3!0X3G"M[(@4+R("D2"06,HS/&LX!1@^3L?,#^KZ`T_S`Z[L>NH48$(DBPC5/L((]I +MZ:!U!`[8V5ER5ML*1Z5Y9"JFFQE!>%Y/B'#C6-JQ8&;-G,X_LDNZ:TDN&9TU +M&

A[W-I8"GI.F:4CD)AZAU$,/1/X`;G(56B![$?B2&7D^6(0MK +M4<(`3*I0*ZXWJTFY,`-TJTM'`MGHDBF_I1;`#A3'@S0_8GS])5DJRTYX#3Y> +MBM-^U+IK*X%`2NT!6CRK$'<4)?03W3]V6_LRZOV9R9.5KE]31U(%_,7>E@;@ +MO-ZG#1'DG1%_KGO!).O,,D*2])FW>T>#<=[2C.YY0C*&;G9>LWU7Z$AQIUN? +M!9J8GLNWJ"I$2>H7<8W=0IIAB(^)>>:O+P<99HO\I_T?E-9)M\M8S3L(`%#/?@UC.FBUZ8B_*UGCQ4B +MSN6<0*`<\!FYYZ32 +MQ26K$EFCF,RT56.,4OB/ZV1N1=/\+IQ>8SU$D[$&P*,I9H_1A3+6&Z8YS:?0 +MO56,[/L;P8%-<%K**T*[RWE4(B7)@A=![;"1YHR'K6GP9EPBI&F*UP`*'O`B +M6J\%1>:($I)O/:L-^H<1`DS-K?+UR4!>Z-Z<14DWP[6F8[-HZ'`EJ.F +M[,Y")#"45%%_5+WK]SP;UYAB($B)^(MAOG715R!,Q@AHV(%>LQ5X2V'U"M@8 +MQ*I]@[O9;846!F.#IYTP(K3;OI2.GS74?3MLN70-%=J(J39$@U5(.K<16$D/ +MH.WU9L1L9]DQ\'@D2=,*FKRW/3*6LSO6?A)G5&+%I#G%=<9.*1G"=I,)(HC; +M,W#1.((\@V9./F9H#.@\\'($<))"W*Y6`HBHOGL^W8*)9]* +M>3(>3QPOA8*Q#RQM"]`3\W:_&WB)=N^U;X.R;G+N>5>MP%T,7^U/';TG>7]= +MD_3<+JB";1]&%B/_/5KMQ8`0FZY'\R&,A%#HUGR)3-_3#`\096+E:^O!`XUN +M@EO@P8T64;U(Z3NQIF,:&55JZ@=YPFF*WI.,HF>P3@'G88]&5($NPR5&$D=. +M((;'8B+5\W1LL=N?34/I[:902*A"]P"7USY7S`[,NQ;N]8")@1?V=U`OPQ=D +MJSWD3-%S=\S6$:\:YHLDA71'T^)B3F*1;J'GDP8%^A85V!.)4AN<.)D:==[L +M"7NI<=TFJM8M6;^>)JCJ*"T?R1SG>'5=6,L%%W.>^9WBM58E';8;J&_.OK1' +M4A,GP;^E2=O7Y[OZ)A7G_(6$SAB0K;6$1B9LS9BTXQJ3)A)5H;J\*H>:@6*; +M(8!+M)LVME6=+,KH:1'WN]=77\[-?0U)HRU8@.8)"CH6*-[6[(^-\/A.C"#X +M:9OH_)@.QG%;1OW.B.I#OT"JBJ:3513]BWHE-T%KXC'5.12@<:)') +M@([T4)D:@)%A@S6-GS&H#_9ZF7LIVKCN)M))6-+ +MN"/+;AIBM:8;YJ#?T:'*)_1V@RV'5(@_%]OFMPC:"*I[/G7:*A:NGU,#04Y8,7#NMXJFQ=K"F>UE>%DDP'S=\;V/50U74/A*_X;N]>7M*P?/4X0B]VUS6:_0-F[W%TW+;_NDP];M!P&4_V +M\$`!&7_!Q=MCY]Q'\ +M+.5YM#-3))$R-218*/BQA"H[Q#@3&7]["TUBNQA=$$>.45"$[U +M8;^3138KYPL$H8FVX5E`6NTCT(1O4"?.15>+.3,I%7"_E-&>@OUJ48-,J +MPCN-9,=F;>.2%XWXS&:2,&N5!/SNET*8UQ-`(7WZ+[> +MME#='7\UG5QPC=B\1\W1"AN=JMD-_@,>W>ZR>9R_D99(1NORW]]%,PY+AJ@J +M+6JH^=,#!*3HH\-NID.Y/^/M1U8,2+S/"A:!3HVTS#'+N`1_^#8PYQBD\QB# +M*X(L1O4!AG?R"'-@X!TI!Y0`)8L9":;.?EXYH7J5Z('&4#A=:*7AB\ +MV^9EY_T,L5.QLD6MIUL53[^K7JF,+>TE`R8-K("*Q>0RR'$:1>XOWI +MWU,_,Z/W+<($Q"M:_R@Q6`I%+3&"GF%>,;A@HFF5QA/N*KDR[]4U5*VDCC9I +M.N@SD'7FRK3$G#))JU9)I-8*AP,L#DTGERL_6N6+-Z)_`OSC9TYQJS,KD2JA +MN".&T4RR`3]WPXB0$N6O\]AM)LLK80[JX*8#Y.S6OI+&!^?B_PU#1/XQJF&1@EWEK)G2#+]O-_:?+OMZ6VV5,`O +ML/O0I%5X[J0F4OCK;S6E&@I5UP'!:'RUPCXV@8"] +M]O_YYL>.ONM3OR+-HJPV! +MZ0+-S092\V1+8?$;M1*ZY7>06'F-",CI;UP$L@7R(&AH,]Q^YPS^$(B89"JG +M#10)Z0C8%'!$\>W[\SMQ8)]4!6F125V25&C^)>`'J>2B&I!?.SQDEO]^T;P> +MC5$*ARP'05GX5$#,Y5-ON5ZGE#P4A:"@U/_89?H;\3EIAR\1OV$RT,&/S#&K +MUH[:0<3+B()\M,HE_E,8"R):=\,U!#2DN"D4/>$9(%9ECL>3F.V77P=/3Z-_ +MW00ZPH0<]13(=-UL*4WU`>8>ZOK!,7O&&GV&0;')RR>`K2GB7J&Q`@:']P^! +M%L"%2OQ"@/:[UZ/2O/MB`<&,0MU`QQ-_W46<&%Q=T7[$8A+!C_4;)3SWVB*M +M/YE<8)@8^\>E(;@N(Z#D741PM$E"?SJVC+GK>/]:H<9RCU9).^=!IUS=K'M8 +M=>J#AK-#-B!V^RE9);[(^@41+>ISZL\#Y((>M6]E!\?OMNP>U`9$LNG5VU4Z +M/NE.JFX=6&:?737'ZW,HF.>W;R==@T*9EZ1"U0/^?]#C03"1QH$@V1\C(ODE +MA=':&XOQ+`?7(>)%="&;W#DD[P6&9K)B^,)H2'9\"GBM"C8,(.Q)BGO7E4\B +MK\1?>L6=L![S&RL-AP+X)$X=Q#`"/(+"0E7DZ^E+WXF!.@FG1.&N^O`OD+OU +M`U>#$>79O1POCAS0_IW&HMYF,C9UA56)@6NR>8.8BNXYWJ-8SCYV]HR.O9H+ +MSH"]AY:5N,0OJ`BLAM*^-+9)X3^CG1P+%V,,;(&U>I;9L5X$8$V0=!?ZZV\& +MT6!14Z`6MW:IQ18*4%:OP"U@CTB>LI2NF,/(TZ';N_BD+)\36UB+BC3*9L(F +ML!=D'H75D&UG)?W[C\5A^_>2TC8OO"=)$7_9">=9*0=/DQSY=C&! +M85>@1?)$,B?=)].47Z-EMECP`/X!9\XH;#-^:)R0*R:W3O8^L->BM]KB8K9? +M)_IG'1`R?#%@Y?MU_S!1>?D56:971B+-88H +M[A&O;V;X\@E9[;+@?)RM +MP%M-Q$_7'Y;H%[+@GOAMSB#^1(;PW@!!*:NV+MM)-I<[";:B&`+@ZJ3!O5:4AS]Q` +MP4$Q?AW.59MKTD>/L(Y#^FB-):1][$*V&VZRZ6`#9RW&C6$*?WDVX8BG1H:< +M7"YU>R3)#!-/HZB!_4YJ4;XADWJ8TV3KQ3SB57RZ\;DF7K23Y3L@91W\'*JB>F0&MGOX=S!&`.Q[4/ +M!YB*H;Y8AQ8\OL^ATY$G;RY,54XH/3X5%1-SS)0J$*TGI&+^QXBC.0<^6YIN +MF]C1):1D-O&7,[E1-S&9@L_G>(A?BC9&G=`Z.OR7AG5\'"C+>TFUP]@3H&47 +MV%_*[T=)Q,9TA,4]?_D]S['CWX8S+X<1EU%]<0,0%G258!6)`#+I1Y%LWQ*? +M,FX1A=M([`K[)6RXR[MX2/&A_2JS&-!B***HO&-HPDW#C5Z&&9W+G>_9'^?I&+8"]S4,-6OY3M:P0DSH,6L\YK4ZG0#DZ[?&] +MN7!JP/.>\/NG]^<>P%XIB'(6$'^JG^"/A;UR#)!;)U='_5Y+N0&#`ZEK^K]; +M>>Y,)ING>0P$-%P,\O3`EECUUADGB_B+^=.R$*?49H9"EPTVJ+!0,F0EHW\- +M)\)%H4*S(N3CV2KHC'9G@/JKQ\WCG9,I%\\F4]82V!*N4`RY+7Z9,D<22@.N +M[7C0:D3!D>7!=I*[1#M#(]4X/ +MPR=G)=,1K>1M6N4S7M6&]QX9)X6SY(N*2!#[K`;Z(6^6PBK5T<^6<2U7)&M6 +M"._`_E%-][!73T[Q,FPDMEHE7=(Z'F'?E.#=2OFOB&<<&FB]J-NZ>,LHB:_C +M?0,K&'$$_;>797%!&U:X4`M89`'#@\(!(0."K18"1'L`!I)V.."#+,GMOY"1 +MH`"'=;"4YS&)=!0Q\W8!LF2*7:*.%U^95509!)/22>URJ))BPD*D3K4^"=EE +MOVY%S?W1&5D4N562[&L9F'TF?XXQT^WB_+/PV@9KF+C=^-BF +MMBTT$O5(8Z*\76)1V^Z=,\,HZ()("XYX]U +MSS<-4D)O1>N:-)42X4/Y++8Q;,FQ!<@AP>&0S_89.H/`EK9L1//[)\J`?3?@ +MAB2&DJB@*:Y&_QK8`EKH-5I].:WBBY$9JB<\Q#.Q4?SK;S05:5KU60)L+G)R +M65K^(BB;HIHZ/V>/Z)5%88NT+R2^_;84A%)V7_C)C`%8A%2E/HED'H&WW8U[ +M\?4`MB(V3A4Q>\D>AA"ND@K"["TR]:P/+#"\7.%ZI(\$W7_MQ2^)94\,YZZ$ +M"6<<-EUO!A\Q]X,H6`27H(0DZPL^6<+,SHV_@5A5!Y:I$O#O7*Z0Z>50;;[1 +MU`]897GPBT%7+I6R-!TJ2[4SJ[2-0O4,)#NS@%(^?'1X/"+-;AG$7%A!+N8/ +M/L^YH=1D585<^]]@BW6ULETH08<]]*UX4-]4WA03O^6PL!@1;-2\])#14VUI +MDQN`SY*$'QANDJ[V%4!T\`Z66WC7$1KEL;D)%CB2*AL=+8NK.4KDU(0)SM3=%./+@X-??XYWL&X5R:#J,"A8B:CG +M6\`V]$Z]F-2@C5AMU]!A>L5*\[=\I>QW-<:2%JM="N,#7,G,F/M9W7S9QSK# +ME0*`,RY2]'E3`PWT.P-?TH)+"""\I$L:WX!17;'T9FQ0I'WT.:B"[ +M#;WZZV%\S-JCDIO8Y&/2K?6PN(@9QE@/WG5Q/HR5(M5%R(,HFY0?A1L"ZH#- +MB2R^2F0A4,5AR$'$1+<.B$YP=13VX]N'A3V,DTW$&P*7`V9?S46]Y$#TECF/ +M03D*A-`AGEN'+\\;()P=5;H`W,E_S.'=]MRDR#ZD4(ZQ\>05!/,X^8`9)A%8 +M>(I*AN#].1=-F8@J349>4TV?6X998SID,(@7\[C-"1C9YJVFY#2)R4'EE\_2 +MV=B`Q$U+:`YPTM>&RZ3G72[?VA'`J&8E+N"+]Y?VL+\;,&`TQ_E/T\-!@.5/ +M'J`HUB]E7CY/4'M?QC["9MBQFS(?!?E]JS=CX$1R(SV!1TRC9FC#@5;SXXD" +MN?B(1HL(^HG0RDJ++2_O6XDMR*1.Q0,.:"(!J?[BHH)4[8$DXGV+C'\21HI7 +MR[>6<(;[VES1$IB-94'EA=$%C>.TOG%[-X+&;_F^YGJ\Q*2YWZM,R,2$*=F]I'5(8P^Y +M2*+[HOG,31:X3!7VT.SV%[OT-_5'34X88K].7K@`CQ)K=8S>?.@N=,>#7@W)TC<6P]\\@4`*%?D"+M +M(_L_HU,(.;W$_^T&40OQ5^-F$60`-3#E18)R[_Y.7^Y1"C"85A +MPZ8A&ZHN8&0/&=LNP39=(6:3:3]RLC1J;AY+7)(G/N32@RF])Y"_57-9[G2* +MN?H%H]JKPEP5'-)O#N!N./7>_4V!#TAF@'P2*^#_K>]R,.?:5 +MPBBYVP=^,^]SM#6>5QM+^XV9F',]BW1:N/WPAUCF)/1Z04;X2#IVB\3G;4;. +M_/!;-5+?+PWIDV(%R1Y8P&RAJSM:^3CJ_XP[4`+?[B-M-85C7[$5WM`-SCG! +MBH\9;#1RCZ@&^DCH+2\8S-9QUE=#()TBL^CHT)$4L;6-9$+7W%N*019N6^S, +M>5<.47HZA@OAC)O_J(:P>[H/,,6\)?-+@_XD%`/LT6%J-#?`/Z5&?.+#%3$1 +MV/-88[OSQ#/W_`99;=/IG:^SIM2=2T?N7ND.Z<%&>-]FDG/?T;Z/N!_I4"#A&PQIG2S#*PQ"^ +MAI!F!CVFX]=UZIV!(FP);TMSOWB#,T%\RT.;F9]!FYB=0MG=,J.4HZD'2\`Z=_WLESOA+22I0.^/OC13NAU!E`@? +M:!-S.(KG)>>B;Z1&M-"'EH"XJ6.BYMHLXQ=P$DL<@UU +M>_H)^!XA7BI@RWE@&"GQ!4!.CPJ8!AXB$%UUQ^.1J?+@;Q;0(1,7GD\?S,.,_?/TF`TPT_V*?2U"2.['FO,9'2/C7#:3 +MEVK[[URO[T#[84VPW?9@V)`N!/ +MIC3H6G9PIR\>)-P=#TE/*R&_X#^V^\,Y>&3^8Q26-WA/]#&9A:D#?S'I/S_P6/?DIQX-5N)KXVY70_ +MK(X8FX:J8+'#QYN8ZJ@X<8L\>(5MW=,Q1>)90'FQ%^LHS%"'[I=N#4FGZ,Z& +M3]`?;OTQ:].C7MV1M!=FN=%+B(BX:1^VVMC=#'A9M'NXF=5$N&92"R5P8)4Z +MPOO&CUA"#;]2CQ2E\)EUL/_;RMX%ZCRTKFG-=Q#?KR]XAH;)VK('VQ45([U5 +ME\.4Y\G`\BKS5>H==^0Y&:=RGY*]Q#H@I-.DX%=K??"!8#LKG$$D3I*_C_(7 +M'0:)\E>2]O@@FIEHVH2#CA>R\41[>#C,7^:71,.9G."11Z.3P3&A%]@D_R8T?/SQ,C_HQ#UI^ +MQ6RK.QSQ!2HP#'-UPRD8.U";]X)MZ;4-6^!'SLDSE(]5A@+'`&EL$&`&I"I? +MWA[#X#R.*N05W)PAZ:X>T?J._%"BP+CY4^U!P#PFT@NJ>BG*4*!*\BQ"B>+: +MMXXNK#@@S(3ZV0^WE'ACM)4[0,H"+0SOS];^5Y(J'Z_\'#7-TL^LD0:+EW_X +M$;$^I30[7<-(-NYD3GD_&XL\L#1[&=$\H;:G14>=UZ>]3E0=5*-:AFER;EM5 +M(=]3@SO/^I:P-%])TJALG]D%;>TE4LNPT64*01\7WDE(J4X6[=>L(B.7J"KN +MFO,5+KBSC?,4/6=)[7N>L?`Z3<5G=-Y:(>2^G4<`2LB4FS#TU#J6,WVL\A\$ +M%AZB=;0NV24&C=%Z&"PR1?*LV,6259HGJP04]CY`0:;_/R_WVRP?>DZ4@J!V +MM1P-=WAR*?ME:&[K(4]1\[_QM/)RXT:?Z6VQ%MF;BP5:@"HP,#3.!2Y?MK=D +MD[QQE,Y0=MVV*."G%18#R"HL01=QL^K58PA90AH&X!YFS)3'8+`3YCF7N%K< +MB?;4;H1]I*F9D.RS:_L;?D4.#_GR[EQG#Y$S`=\JLZ075/68;04>'&-30:!J +M/;?HW_MZ^BW9;VOCF>$J6J*VA2%D?7`D73WA:J!#!4UB!]0,(%]Q;G10,`R7 +MK:V8EL;_5<,)M>SMSU'"-O`VY4*ST=OU:D$3M:J`FNEIFN[Z?O*8GG7-.9#) +M6DM=!BRSUPWC8V(:)8H`9%]FTX4P_1%M_J78Q_YG]M[59-HA1V7HYV[7#H/^ +M4;_AFKJ,&C:_G6UM=8;4N#@US3]S:A]X'QI*,],XP>*:XK6Y#IQD@#D7@Q(X +M#=\_K;1K3@81Z_W@7M*/IH/TH"L"4BF,F#]!>%3 +MK!]H+<$4,<@N7*J94"-.DZIQ8UB73H%??/2K^=QKJ='9W2\7CQA*]457!SV, +M+7"V\F$_\0(_1ZB+==(`F_8K3)1]LF75H(_!YZ5+I6^1%U +M37!S1\7.I!7[2B"ML`A.9F#;K5UN<"/5\%%)E97RX:E?%A6+-L17L-Z[SBM7 +M2K'.ZB?*P`"8$#9$`A7&F%ME:TEL+]RQ)_+,F8FSRS>'L`DNP*G^UX&HESG" +MXOYF\$,8LG\Z,*_"S??@V?B>HA#-M*UB*0*E]1'6,YV +MZ_K_A)%V_"C?_,'&JP)72_8O/&0VP!252WM(DZ;MU"C\)1SEF6L],(^29G!N=R/9<;?(=+@'JP6^<1R*CXA+3I>N +MD"YR$C+7T"L]V72!!/MA39@.^$T*[CBGQ?D,RG+P'PCLUT@SL:SG"5DW5VMU +M)Y556*P^(X2C)+-S,VO^W@RE&AK'9>!6?LQH4;)=A+ZB_9D;4+&ZK=&BRSBF +M68`?GNO&M79]CK8ZR(5LUY!4*]@QR(^&-P +M*`*=Y@Z?S4E@;`%%"-4IP,@\ON+>]L4<,:S,)17[COM..+_I>%:."5VQX7VG +M3X7ANVLN:>W[X\EVFD%F:^T$XCLX%N!Z5Z_Q"M21'1W>9Z*!/E_L"#;77M1MH80NDM&S]MM<' +M?;4OST'"\VUK&T+/EP^[Z%,[F.JW05MMRTGU97^=K7ZT*46C8:A-/=ZU/PD> +M["#D76=PE?I*K7F9A/^Z/5>GQ['#L>&XQ8JBM5\4W-@&@@WB-A8)@=3946L6,FBS1.>49*0` +M!12]R#:;,G@OZG4Y"O9;AU&EID@4)U^21`X#.EG-,@P$BPY$E`,9PB3^%\:PF:%IM@>U%/UM#,&B^JYX`N1!.?Q-RO +M!W6B^-<#54B+-$SCRG#E+B+\'178S)X2>M\I3I/:QJURE +M)#XA>(BH?95O<*IJ:[#\#BS-8*7KHSSQP$I*9HH;:/.[6=78LT$8;R8/P#/( +MX/VMPU%*.;?*)S*O^2-="`\UE%(81#^E&LP+KR+JMTT/6^\H]!WSV8F/7L\Y +MP.#E2BCPF%(H%=1;>]HD94>M&K65R3Z%>+6?R*'S6E*W!;D@SJ]9!:R>\HS& +MVN:X^.Y@0O_ZRMS#IR4_O<$[^I&8/[X[64A:49A3_%=L@\XL8>63R%-;VI<^ +M$()4;>Q74CDTV7FM%A`N=26U#]KC7,9TRSCJ!KB6M!-%4A22)/D(ZD.C4*`P +M#[@V&T4,.;GJ15DF34,V%N]>!WF;4=-Z8_$S?RQVO"L$$HK"N*W'/DC+3V%* +M52OI$F9`]W/\F#WF^TIT:O_)S1;?L_>`J@L'8W*?4^A60KSG(S%3,CD\%=$A +M#%,.'OB:36O"NBD)$KV$R5`ZQ@=Y'S==;,%K:<2P +MV)&VNQ,2\)K^M@5I@,+'+D%]YFVTTNU?4&>%R7>2`^58K`TQ-;IR=":>SV+Q +M`;"PH%,=VO;PR=("E%CDCL;[1%(1[$(\KW*[>\JQ:#Y@QG=OLP^$`+"SJB#, +M?H+\U&Q)0YD-0Q]N$FWRJU'G$%%(S87,!!8CQ&0>0^PX!."J4`M^&B'9DTL;-L"(.7QNY[/HN8ZFI_#\*UF*E%Y2#7(H_ +M&%#'-NW!*28UBG,!>IDQ\)#84-=T+YX39YB5ZK,1Y-*7#,";Z"5^K$G$FX[E +M$_>7!BT.VHB@BG$:+N*A!F/55YJ/E_PFBBT.MGP[5PF]`X,OH]1P?3%(Q^L_ +M=^')O#QON1&:+AX(Y9BD:?%/$@X$&9_!.?\'9PW=(0Q9WGME4PU;[+'G!\N5 +MF!.HGP:/*`YF(/SLL\]'HU!U,3.]LU;ZY#]N+TH-57&SHX^/S8*@'&R-%(__ +M]12!^E(F!W^4$P0+S86 +MRA#J+>!,I(&W_,DH3!A.J*&D3[P2PL2&_5T)LT:KMLCLOS(?0^E98X$UZK!Y +MS@`U*V,&3>^69?VS,5&#=DXW'0,J!]LDMH$%D7_);GVW:+9"==H/L1M8;C-' +MZECY$*N^4]I*DF9/+6W07)^FK4H("HOAS1:AU^02;O\`'<"[4$7=J[US!BGYZ8*3TA'7P<@:FQ7]9#+2R*FQ"G6H==Y*,L +M*)[_2\*LQ@V_`RB:`/>W1M-0*J=%`;8%7&D(G?O0-:;D4@'L[.Q1)V$XN-NR +M`H[``W#'C6&+>^'7-I8#K^II+$V@73+*88Y]*W,!K1ZN.VNF +M=D7/I(H9&$_UDWIW`R75Y\@4"<[T$.2\?]9X._*,9@,2D;N<8T&30^0B2ERL +M^4-T(QA1-VKH=SL1'*C=R)&@*.O +M8<`IMG'S5QK(KW:?`M'_LD9P'<^=T70D6%0JH7N^/L^2P2'^3!G.3Q=SGW<= +M>JQI)'D\@3'M;3%4.^>-TOV7KVX++7MJ=N[BT)G8?GSHP(T?FJ[G%?"S>6L> +M78VCDKM!;W^Y?[\9\X#V%N6(;[8H@'CU+,4: +MM-A22K3P7:HF]&*;+R6[HPOX)/!MBO.=R_AYEL6)-M=LD^\Z?A>M`AW[=.JE78^IBLG(W% +M-/TRZ<18W,$E2/.-W.`WC..AFL'8P?U7>UOXE,*+,,$W>X(XW*DZ;F)9B$5H +M16NS#S%6I>/X=>"6Q@\`1&A$&(.-9&02^AHWT.\CKH-L]UNOD +M7,8)Q_SW\#J_H>=[)YABIUG@%JEI`LI'"M(CBQF`DW1Z.(7,8*%Y_\N+LT,! +M5;:2K3[<`2M#_IM\I>/3$4`8--E'`*/;?:%GM$&HIIDQ`5"QGU-1)@2*91IK +M+E)2,Y`'40SSL)%0.Q$%1"37RD/6N)JE:M;=0F_9'/*P;QT\?EW'WJ-/?5S! +MSIYO9\ECJ>]6Y#`4K,"Z@@"-K>"O_C'?[B,H$NY0>)ZC`-%SHBO-H%$Y'`T* +M<,FW9,5;<5K8[TS9R0V;30W#ZS"?^EM+9\EP\53U>.!UE&P.1Q()=BJO +MOPX'0@V4`QA8U!P95&`4'&(1*]2*+TPKSF:VW%"!>5&WG`#L?Z(B\*#`%W?9 +M8N9!'CP_9A;M62'>C&/,G<01;R7.$,YO#7]>Q.X<"LM-CBNT_*%R/SI/:^XZ@<9`+XS5ESLDQ3"$> +MUQDA'^#2R)BP7&37Z[R(/?P%R';2)QSVS[=,8/#FLF0J/"6'S1>E$B.L +M`1RC=P3(4@O[V>X\B."#>*AFLQD3GK$_Y>1PK5D42$A:LL$)+9P,9WK?^EYW +MB"L%B,*R&.!K@8EQD&9C8"ET]W-8)T="/Z!."X@7J*68JXV75-^HL*IF[D(< +MHM-97.7T>FG=->.`]%ZF)?G6.V;_:4]<7!?=$R"Z0\)IE^C\O\?B^B!JLWHP +MV0["U*I`5A?>BD5C!5B5N'8%"1DT\0^:5;B$45%S +MI0,+=3]MLBUV@9OU?HB/U;=J@4'=[1SOFD]X)EF*N[[>&5T_B>3XWHQBK*$\ +M`[D9:D4L=?51N.%6?9\.I_C8,H6J`^+!Q+#5C5QIP_!E>#7=DPF<\]![T1M! +MTC_"NR"Z'1M>6@1'5J5+Q*<NK0\8U +MTM;"C]R04MN_>P\I+:M<[KM(@B2&_T`Z>>$T+^>0X(D]DQ&+YIMERXZCB#X_ +MJV%7"CVOZ\`4%VQ+H-4#QJ';:M=SQ7QEKQG0.6Z9)/H-&35KO/A)(=D$>I=S +M,C7:.Y8%>OG80N.Z81,6I9RQI63TU(Y.9NU6-(F[9=K4;"01\U$@;4-]-)"O +MO%)`FXVP[H13BFZHDFQ_46%IL0/UB89M22_%SL"@Z]Z[&>7J]]S;Z2>(#YUP +M\6+.^[#\=Z48>KNQL<.YX9X.[!4.5+I]S(!KE*2-N_=#NU(&!$C(]"4N&2$O +M-3(^IF39&678S61HN_!G,*"H_;_:AN;E:6G:Z3WFA\:6Y^;N6=L.4Z(6K6K- +M9H(&+KT^6Q9+M.<'NZ?*'^A*2.7FZHW$HTA\HQ@.KM23B7:]XGW.2Y9Y/?Y/ +M$J_SHG1L5X=V9$M*@[_8!,$KROC=)8A7QR_OQ(7:.L\]P;"2PJ8AB33GV0F3 +M#K5:,NT_R3U8EB%I$5TT9+P3IT]=%Q%OLML[24="KE5`'G[=]^@Q9^)W6$(Q +M-//K%&1)T&D793$^30+A@A]9`2<&FFRTE6M(3&E%]];Z$C?B4@"H[,]C]2NN +M5?.G5(!YXS-+/.R +M[,?SY-2`5TC*R%\Q3SF/WMR*BS[4^(Q9PV/=`P+-\)R_+]CN'%L:J:4OR4`) +ME6>KD5OV`"C+B,+OL,?#H@FTEBGY/V$D&]8>;='5OX:#_3#E6BS1&C&TGBEL +M1-Z;&FQ3]@X=J20O^LP4BTE`IN1*"S&**6()IR"`>.O+403;V>+QK0?WTNVM"I(`"\&ZM<] +M'U=P%@GY9%`P501C`C@_N3#Y9$A^J`GA6%4=$R=4K/2FIG247\F[#)GYZ;=U +MGV<=/BD%V](Y3_TX?O>#6H[91Z0H0%)+6K5V?XEL66\9^T/ +M-'C8HV90FM0LITT]=-L+-LM23BO4_5\R"BVILEF7DD"JN>90G8^GTH;'+R]<`= +MMOYE3R7F3"`?T-H86012IBGXCW]^8/&+(DY5D;XAE47"LA]AQ6G]:0(<4HB&LQ%))J>&J8%"LB_QC&K_[E?=;LH!0ZCU2I%QP@3:,&VNRN +M$`"XZRK7%53-0W\Q2M'Q>JZB;!\7]UA:VA3_>?*KAEZ_84,(H`Z2*!?-4<-H +M[:&1#9:PB_.5I8\?-ZZF/\A_->HIFS`*\*-!'-Z:+Q](":[+&J6*+(D9; +M2Z+!E1M_KHN,9-^>>9D3O_,+T>L]I0;I\T`8OQ414>`'63<):"&9*E+B^-A# +M!+\F!S"U=MFG0Q(@VFU**4UN@BXL[V$P#LJ`C.U80!98)-@<#%DOH^IX.L(` +M$E>!3.>ASQXOC?VZ4Q&IXZ?KM;2DDK)B!T.J98.;IKGN)UG7WC7)MU<(/) +M`D1HJ)85KXLB1+$L@TU'N]&UB@@4C-;:0[>`ILI9UCMA867"T[@KE6< +MV\B7521H[_'"4H/B&J#DTI3DTL[?Y]#;"OQVL`?8/-Y^-Y>G*!>$Z5RZD4E9 +MB$ZZH@@;J<6Z/)3VII5%1.KV/E;>QAVZ4?@*=_6PIBWDQL'A2YH!KUI']/+5 +M':.Z#!(>M.CO/KCTHE<%I@5"#L)4N#LL['D"Z9;:6I<1%ZQ_H*:L$9Z+G/(`>"K.YEIRK".@-7^V*/RZQ'(TB#):\F'K +MGJULYC+8,"CK"I0U8*$H9@5C+),'UA7+TOSZP"J#4'4+N\N,OL'Q\2$(O,K@ +M0KFJ2K:T[7Z##)A0;Y'@[;&H[+V99ZF][U-T)9<.@<&TVPN;[XRWA8D.LYGG +M>/7*,A8:`!PRH8EFVJ_J[(#NF-*.1BV`D7Z&3G3G`$R!9=J>XOA/(<<'=UV[,9F"1HR);)0+I +MS##EC*W*`)LKV6_DS1;/M>/9T.#+:`45SWM#E',$4(::`OBQ?\T=Q0W,Q#IF +MBB5P5*Y/$\B/AR)%420++A`^PK1L:WJHDL7+4?]7+>]8M8WIWZFX>_XTM>W[ +M16EZ4%'_<5;/0Q:Q68HE(`I.J[6*=G4^W6A551HLEGY%9=@(<6[6B^W/CJ$0 +M3*Z4J0VK1`'&!];@20HY2TD]0"),46+REJ'$J"*C"+T[0)RO+D9G][K_M+=( +M;1VDLZ/&D8C=N5'N)@AN"4?LSR<[7"X5-`48T!A,54`4;]WF]+GO!S/,LA3/ +M./Y$ZP^2+X0QD(T,$M_=S42BT;*\42!NM;OFV`Q_AV>46NC0!=!#M,:L*9(Q +M+-.,<..E?BF)#+ZL3.7OI.^=/H?NWH0EC7K,[Z94P"1@*_6-9*MB6*>L/##&LHG2)O!X<="#?;UF<:BM:[RME; +MYUEUDNJ0.;(PFD5'V]-ZW[]!A0FHOLOQ#V]73`21;#4ZZ5*%P>4/)]^::-U4 +M=YN\&?)''Y_-#4UV8O%`Q$3Y9-@;F5VXRKDWM!"/+V!H]=`X*..T%7A%B#)9 +M7E=G,89P_;FB(UA&2-K$EA&Y?W0Q8B`:+%$W`026<_U\$H9;RWV-;\#*Q.\6 +M*CZU.&_4:'(O?=>%::^R^+;+$Z+#&9F%W(Q=Q]"@E`'-M%";V9PM&QSHT.^L +M$^!A)T.L1FL,OG]&<_3)<^%)E@%_]H4J&,&6%>U#^CE<#5Z!(/%GOG:-GA[^ +M'X]ZGUOP?:&W2>X+U60JZ')VQVX7A)(FEC"4W,?X&Y'AN.J>;7LKT(\RPMY2 +MB%<*4]9W;2^@[)_(!>MY;=9.PSR@LOU%4IWWV;@7W\P.VG$FGY)I&_B'!W7Z +M?<(HK4AF\AN-YQ!%;]W0W'W)(C#4?,V\M[84=<;W$Z?+M(R1UV`V?\'=.D"5 +M4QH0*,6QZ*8BW7"MN^@Z\QDT:'G2OC'9&N9P1OJE"QP6_#^ZO/VZO4`'H=BI +MM^C0-`%[;%,JPO,;3F=46W?F\C`L,]`P#>3\K?DJUU>'3J70E+W_Z*K[,$MW +MR)(\W''3?8%!%E8';2[EC1\"`3`]3OGI.%6$_08%[VL-I'5/N,E2R27&'(;0Y54@]&+'T +M?-<40]XOYDU>@,8BJ6NH7ANM6G7J,,8]UJ!"#8/618&@U*A=@9#@J@CC]R^% +MUJGB.1D>;[6!7@VJ[\A9)8+T(HSB,&2PZ<`;F@(\]UJ)P'T^C@J12Y["08BJ +M/07!02@204Q&F#76%:Z*U[TG70BD%2F+#KQW7V4K+A3<:BD^MT(V[8064"5Z +MZNO`]F,[*VJF![VJILL2PO6[>F4RZT[^(7=U[1S^KZ7=Y([O<8Z@0YD//P9! +MA:SR'NO?\DR@%M*%Q2G%IM:3&E01]KT!+#2E\9J#,>F5&N9D)2OM#3XGKW8+ +MYM">",=`IVHM=.Y;ACTM0K%/VO>A"VXMU +M9'^`;"\">U,`7PW2NU/)SM)T7K`@(A=_*^J:FV.9`=K2V/=A!7*_P!HR.FU- +MH;YEK)/]0F++[RU-.R.L#"6,4@6<29K[NT76/>[4HT&&*]^"K5 +MICM/E@$6,.'\FS:!;W21T.W#A+37(Q1J,Q0^G$JDH?&*DI\R7AIQ$/X)9J",+&#DR: +M$_D/R=-X`.G1I?YW7:!0R9/P^B;/IQK\%0%?N>(7Y%(FF1#N]7RWMZ8"K>Q$ +MWVD9=F),!DF^Z-ZQQ78OT?&63(,B>*QLFGCBPZ+:Y+@N"Q[\7=56AXK9NF.+ +M90X<9=F$1*?;VLUHI,J&XRJ2G`\-/CMILU`)+J6UOFQ\40OVRQZXCZI!,GK@_16%%U"216WF@SC>=!.K=X:JLWYBUEA9;X!2 +M*P=V53%B70`C#7X/DK8@\0T=[>']+CB,'B_UFJ"MDH'I\O)]+'3II,OL"K5Z +M0<$D2A;@.5E:9_7$[GJ#5MT[=UC//ALP$Q*ZG\*XD11M,0IR5SX*5-U[K'4ZE2;89=R +M.JCV\D`Z']U]O64]?'O?LS:JC,>#';BR5.3V$-@]*U(H')-4Z<,=`@\,)J@- +M*,3;-R'X0)4E\[H(12RHET9/9*?)2MQ/Q_>DO@M.)_`OT +M]2N!%Y`G\K1QD5/=GZ?R\6S;GG'@QQS"F#D;LJC>2V=T(@@]=&PQEZM4$$0$ +MT4V;!R!W0'UKAJ,2_`LW2>.2*><#$$:3%U^PJ>+(_.`+`?YCL!2(&&,H<5PM +M"+T(J?EUN`FJ:[(S=TP$;K\E?G):5RX^GX/?7/@S$H6X$A86=9M@INO:PDY8 +MHGD,('ZKF*N4&Z[V>W_,X)9=G"?B>W_Y2(]Z6#<^06#NE(R:S$_?K.SUU80S +M!BRN!G@_?,LG3.NF":H21I1^4Z+BO&R2N6!#'.DN_:(EV'>YPQ>2/,.Z4:-/ +MF&"/(CFBO7_3,V@"7+^4/7$H,"AL7A"ZY1FT8_=(Y'YV +MLX1W;A363GX8+7+-%SNP(/`,`NR)PRKIQ2[>,235P-FD+M!%_`G.57EWQ^L? +M&(]TAW_,H9GFT%NZ9C?[@$R#6WB.HNZG#?GY8-UB7N2:WFC66APSHV`G,66^ +M:KVO+./K^X/+LVHKPI2?@_#-!")4D,8@;FUK)MUO\_7TWN9O2/`D/D\TDZ:H +MYO]A(RU/S-`;QMUJ>(`7I+86!C(%W%=9V@?'<69-A?/+>%D3+@?^!9[,M-7F +MVO'/2+FDS(!S%Q(4+NV:E.5-\E=CB,L>[T^@'X__S^OT#WUEEBB4F7H6M\1N +M76PJ7.U(X'NR9F)V)%OK,JU;]8`KUYC+_Q@WKC`0"D,^2FV1`[IP[K +M6.C5+/@1-"KFS$O'!.`;X'/S4A81?7^I<+(W-660?[8%_R!C0!YVGK24R`IK +MKJ%U_@JRID'KELK!?*13-\6[*^8]WJEC'$<%-`69$UK1^^W7P3]8R+ZC5M]^ +M>O#'_RIHWK9OD@MA,(*KK[P/70(=+\W^$Z21D%G0W2)+`\N=:%G"N]J,C#1] +M(JW^"[)LHH>))4>T<0V--%5%D="$A"U.\%(QC$"H,8.+`$2::59O4*!3L5?/ +MQW%_."PK+8&X2]YLNPDGI_CJM0FXFGL>ED +M>RJT\7WEG\2Z_3QQY1,<^*@66(MB>V9Y2G[;)`ZK_)HL70KIRE7J'/D[U1.%>>3NW8&*F(<"8][&RQ]L3!,..X!( +M8'AX$E\AI9<><>.DOA7?8RIWJV&#E8&?,_@DTRX[D2@U\7+T^W[N[HC08<-) +MU:;CVY*WR_LY="W"+)34^3;93G2N@@KU,Y.G:_+))?9!9+\;!NO4)XIGG5[" +MO$,D4>YY8CO_]8E:;QE__CATVU!A1S;QC,9Y$20PL"?_7FA*IYK;=>#']/#I +M0=>HU`+Z&>?_ANK#5'CSF]TFT]$@3G0D,Q)2J\,`N"1`#.W*J/99;MA@Z];. +MU_#UWQ>AYI)_ZX_`Y.U2I_*4`B4^CK1AU/1#4D.D*5T<=U`2C^U'^E0^6'-F +M,%7JJ(8Y.0>!1N?;` +M_K5?K>J[K?8[[050S"Z;$+UA_)]YMXF)B8IG#!`J.P%L.JJ:G'])%6<>4I#SMZ>>>YE-:T!` +MQJ4F]+E.%-MI^I_5?:H'=-AYZ/M:GQQ&8[2B6-03DZ2SSV?P2/O"8.,#7QWQ,;%"_H^HVU+QPA-<"RA:87"+O@X +M:1;LS:7#*&#%O$94T#(_YCY:+Z5YS)V\%7_W((^4%YG+=9_8><##.&&W\7(O +M;&PJ/%HTR3N/\"#3]O^;8D7-?@14[8"]2=].!H%^NK[ZU@3#(I?P:0](90*V +M^4%-*\W(-0AD"-I4TN\6=4A6;P'(QH3<4)]JGG?0(ULT&>OO9U%#R%LCB1'C/!B?.;%"O7\35SZ15SZ\37E2HP(.X6/B\H"9?J +M1I:=)LVE&:]Y=:175SX:KT9M9ACR&]&O],Q^&-:FYL8S +MR1;[F';N)<.F?R*=DJ8=3'O'7E"X1N6SMPG*4U^RD0BE +MU8UC'4A;>`))^F_$I8A#\,NYDE,49$#$'+Z/6^DD.;E(PTC]I#4`8E\&X+$S +M?$%#-^UE"!Z[2+D.\$C?T[LJRGADZY6!00C`VMUVR_2!]NO]L:(O2#,G_3^, +M;K:9#O]/K`^;/IAC.O.Y_2S-4NUHD655^LQ[9>FC3TRB<0):0!;`B/[2DQ42 +M&JR:/PV7R`LKA9AT3:Q-5W\`H4A;M\<5YRNHFGN7)5/,`S%$#?7U`YD\.<)'(41+NSU<( +MWTKW5F'Y3`?"K01(ND'=ZA$\+3_G6W%.Z4QF56C;?+@;YO>C2K=E?0FF\:[] +M!,]6/B*_(-FKL$%KF',E70FJXF"L9RBMI=L4^>(*@W'J2K99_S\'K)>-@-]S +MQ@]GC%K*G`==D$!UUR[R8GYNAB,A3#/,DKZ@#O\+^:I\+U#H4!0X@&""*IU'KL@H'I/WU;WO^G60.C%F2@3IW%TCD]E9-6^"A", +M\UD9C[RDSC?GT$?2H@MD]0E@DKLC8RI>;O00.,A`IV[V9W?FN$:$L^7SRM\N +M$>BJ#KLI5NE(551FZQ3E"Z3SVL3 +M\F)5\(KF-'%_,>\>`&T$84LR-U2]=O?S-/HP6].9&%=9)4@!MN(X%27`!$!^ +MQ9+@9S:[=T*".N]:E9D+5+*_IH!`J'WF5_3P1 +MS_ZMI"6$36L1B?`*E]EJW#O*;Q2YG[J.[&D]=:XH]!`L)$_F7X2>6O/':&0^[KZ!BVMO*?P%GBZ9@ +M6$A/KEI`\(HA><"OD@B_SAIG,DZK3B2'`QO&-2Q:XII&+PN'/._;W@IJ=6,: +M<[]/@O*#W#=)B1C+K3PE`=)Z8N#YX5"1*IU]+S&L'S0?5&&G2O>O"/W(?3X3XK8^;L?, +MT1-`(W9][=CR1C&KQXO,&)U1YCE/UXQ\*YT$9LX2KZBX[08(C`-J99NS&<4) +M5OR7Q%^!4[5-<^R,22^&R^P5/.UE($A*/S0G8?2=8'-`?;2A]]U*#.RP'/AT +M9I"Z+] +M7WN@&)&&PX:QC\O[ +MH5B$9%_P,>CG)^G5IU,>!C+;!(OP\Q6OTW)#Q1&)DNR$`L689-(:\;I9;O-4XX8S*`,6X6UQ7+![HML5V!V3GX8SGX*; +M8`#/Y\99!Q1H+W0[B3_.;P)PN^N\?G'%L*''.06) +MC>ZFU`B?&S!7Y]08:A7`%IZ.5Y3LJ!H):>F\_^R4P!E'3V.U!8S5H,(95W>+ +M#CE*7#3SB:#BR)_)`NPB5)PSDA"O[GQJCJU0VN[&6OZD-CP!+1@2B?DV^)8= +ML=54]'I'+T3[",_28",!0((_-L^B$+?%,EK]@#1OX%XI8VT9@0./8.4+]>9=*#6@L4TPCY7"@18! +M:$VD;)"R*;<@O!RS%0<7S:?Y/-]\>>FDE%[71F6%#`A3E\EN`M$D10B+AF3H +MVWX9TPI:&CS\.FQ$E38'YO5!.TV*:;S9&(=T3YJ_;R])8\@44F14P +M6*555;H'-;"552\B?_6T._\#5](XVPA#9$D!'*5G-IJV\96>XP$&/M!`M(U0 +M"*:*'THI>U2I@J7.T*3Y%(Z;T:#`,M(H5X"/(^]E=P]S`KH($#=^T8*#('EM +MS-7$RZ8,_5XO#HYGX?_`[;G4[E"$U/=XPA#BID2D#ZD#"XY6W(2 +MC6ZFME6!LZUX5F!5$;%9BGZOD+3OU43E+PNZ!D/2<:4^=4G#GEXZ7V((J+WA*(.7R-IJW`/C9 +M'AX[A(7LX0X]O3\=-$3(0BL";0]UX-KPQW+B.>[2*20!F1&)]]\.`D0@A7HW +M<>9;RHLE:;&C*V^I&^1^(Q%^2@P-#[U61V7DOX6+#%\%O$1?TYR\ +MXLX2:1.3B'`OBD%"U94C.[>9$W,I=N(:;FFQ#0AKQ68U'N$%\3_'LE +M8/EV:M]SCV.SA]?PORG?JG6(NA.=$?%6D,&F8`*5`YR4*BEGV\C\C6,)P/4[ +M*J(@>%I9UF,'6'U+`=-2G&A-))4Y3AN>Z$5]'"%B8JC^MQA/(T9BLM8DB>)> +M-#2F>97-F.*D-\'I5;\X"<035)@55CL%OYMW"_R\ +MPM[GOE/Z;9Y4N/R"C6_(RI.>1Z0BM0.?<+!@KNS$*9N%HG7Q"EAL[%+);$]$ +M5;/FFG@9U/3#9]DJ"0:PL1;S9?[@R,[A]0W+-@XX*)]_IHVH8>]"\FW`%?*] +MH-B8WW-7TJN\9_>MQP$J9F?"!VHO0!F!U6Z$?YH3=:EW85L-;-&K[^Q/J><] +M6@6KM2@I-OR&9&6%&H6%,R4$4Z]X"5-(:U:GZ+:'+P,M7Z5KQS +M'1*%_D^"4DE2)>&_Q1@#Z?W+G1>P4C=VN+W4H]!N])YV>^P5N=J-_3MDE`]R +MC]=N[\1SMWL'S.O_V$,%X:_(EZ,:"S58<'COAX1,Q1&-HN3CCA?'OM+'-,># +M,^J43<8MR[;!88X+\^GVS@/@#+G"?HYD*[3";F3M#2OT-K[X<@P0TOTKB +M&SE.CL5<5WQU+12*N%:(^4:9LG6#HN'#N`8'*9_!F\@W*5TWFR-LZ,`$DIYT +M-)NK"]1LFK`CFTE.Y/#6GD#-#QXXKGI2MQ/'\[H378ZZ3,Q&M!VVK"#N798. +MH-BA6,\G".@3DU;0A-S'C&A4Y:+$?XNM%-MW +M;HG.BV[E902?`T5CJ+M/[[7@@J+$,6"]*]:DACBTXN1>QM\?X"X@^!)9QP,.\V$D=6H'/9_@PR^V73.'6X +M!G:TK97=[.'5]O?\V01+-;(P6L[B?@F=,42?3W5A./O#S3^7HGI[F,^HR3YM +M@XM:%<_F&_T,CC8T.]E:E5=#Q/S0WY\.&FHDV5B-XV50NFC:\HBBDOP-'A0] +M*-SC[45;.'H!UP!C?H#<#J$&#W*&L\9BMLD^V'P[:/SAHE<%%H;M?SA=\%0) +M36N[E&G!F*?)66!L?)?[B&,^JVC*=D(4Z_W`69(A$["RA-H%D2>]TV^?_[#R +M3/D-DWL)JDN3+/070QTGHF9:WR8%OL^_?M;F^C=M?E#AZOIDX;>=F&/&A2XH +M&B_[^&>UA^SPB1<)H#@PWJW`47KPX06:&*Y<1XC^"8*,KC$^%5KC"%--OJV\ +MT+<)&`IA%03RU<3QJ?I70[]U;K'E7>@NC9/T&)W7<2-ADIN.$$Y&K28F@.6C +MR(&O.2AU&`S.UWQK9RJO!=<%4TD8_QU8;O`XB23ZV=I;@5"S]VG-]!*-U]CG +ML6F]H+G?BEZ*"320[SD1T5T<:621*\(F?"0+)21)]V,!!$Z(SEW`'\&^:16] +MA^5P5UX&`IG*2[&[PXQ?;&[4K5C5S'65B_IX5PVLRTG2V>89<#,2H+J(Z_0F +M#2:MB6=/@%*9A_Q`6\`GIDN]5TEZ!K#EZ[B@J:B45L37I,%TN,IU-Y2Y>!;P +MTY?`4E%__$N-`Q&Y$P<".0O6OA/]BT-#C'5`*K!$(".43A)&#[\VC>P#.) +M`HB.X(HKVU#`RNUK>-6+2L +MK2EL=!:7,"2ZN(OL]?\55&L@E'50 +M#7<8<UF47&%$%./'LNY-2'G")(VW62F6TG[\YD(O>D!C!%7!5R6PO4M)+JZ# +M$H/A+Y`5@_!E1-70$"/+8.+`K$?5N`W7`,V;%3?],L> +M@N6'``DYK[R>>8`TOMK[M$0!=A)14Y9W(5?U@N,IH/!N).B":LR+99_WG +M$5Q+G;FS(>;K3IH1V16(2FWOC:UOE+S_JLB71R,,U)"!PZOVG]QZID,HU,V? +M*G2MEIMQ<3>!7J_N%(;;$_*]:/?]A1]Y?\[V=BK7_I(!;GZ,0^\H*1OC?"9E +M)A#/^RD33LB8=HJJ]"*RK!!8\:Z)U&,($3KDAV1EKYSPTY9965A<=;.`3KJ7 +M]GZPX[R$=H-/`-+P(`(;EZ^6.<:NX&R>9"]R#!\VD`[R7L,L5TO6-6%)5.I, +M#\B:%[@A%"0?=WIYS(P)AZ'^95Y6(=VP/[*XU'CV`%B#:"_0#'DM2`U*++R, +MD)Y6Y1>"$O2P\6"ZWTPS7ITC54IC=CSKO-;VG!D+CD8P>R8]?&0K>VL12($' +M-JZH7Z"OJB^E8:VE:I-H9OM@P`)IWN%EW*5D;4V-.F^K9N$LH_H]!'Q:+-NX< +MIJ+`1V@0H?))MO5&AXT^`U\.NB`R\7EG7*2+3J$=)1@+M*!IZ6#&II>E5^,: +M;3[,.(.E*]U234@V-KIX'-IYK@1$$N)&^H?H=@U(+ZXM:\?SRGCL6_8.L]$] +ML6"5Y61B*<8C3WW"RS0>O,$9)QN*'.(-D^(\,[9WT9.TU$1<&(F8\8^C/"A%]EVDA@:8`H/ +MM?_C?"CDNH_+]=4>K$C46SZX$5[-GA]""%Y5HPJ1>"M1.*?Z@^V)$^,8%[MN +M\IKU<:*.\;(+W$7Q`(ZL^^D]!)L(TLT*574:X?,#UWQC"E)!8VET(+H?(_IE +M^_(7@B)1:>>W1K:9Q&=HJ(:>V#4?UFK9-XGO(R;^5U3,./NB3YZ +M[DT&9?ST5]'4F)RJ+/^>+%S0%O0)8U1;5VUA"`"\::HNF:D;_3<X)`8W`YJ!*:2\DX0XN2B@NRU#!27O0"GNU/OWD6G]4EF68M]<[@W[B".O<'R\ +M/5EV%P6<[4/X! +MMUIO`;:'P$-\3B39!V%M\-VUP4!HG`.C4IYIW*3D*<,%;":FH"N@IG420TPM +M_XGAZ.0*4E?!SGHG(P&J"PVX0/,*L&#!YC*-RV3("+&9E2F,S,8'T0N*>N8P +M!0JLF?4>ZE2KA6I?8&T>-$+1SCIV%)'BF,#8;1,7YTYY(\C!FDIFH_0D;*'] +M@`OEWRJ5QO8"T.KE8]8?S@7D*N"%HX`+IW1('T=M^S+F@`@A@48=;;8^9QDG +MTDC&RJ!8](I^+^XI;F23J^!(W=',$ME]K"3!@XU=3XVU)WE05R;_V]Q*9N'H +M)`B!L"O^L2.MF,]C@J]?J,-]"U$I+'+9/PSJ_K,YBO6CC3_G%NMUA(,E'B3(_?7&\]X>@3%<.O%WCX$LQ?RR]#K##4P_?O47.ATB)Y_ +MWGZ$)&C;0@KE8Q5^KY\M09$2+5QG0_.\L$W.;\X@0OHEW'CS'N)`[5Z/!,[C +M!],05L]QY1J(E<'E?DIZER#)CG*/IGEDADXP3!J?!WA)(.MS+W!@;4^J(7,X +ME+T:FV/:.MQ@3S7T`KMF_`0/'BZB8W;K%NZ[W>JV*+R;/(X0GN$!(`$&T.VW +ML>ZDOI?P&DX$E[=/G4Q>,2>Q@>ZH!R(8\FP7E4$IL]C_](A09(51G2S%HY=) +M<69M$F+>&.KT"9-I@H-(G:`J_\>H;D\7^)JIXOZ0)-2[K:_"/QW)!`'P:LBZ +MT0"M^Z7KZV*\':[ZB>13WZ.W(1-4XJ([!)K"'UK9:%4,F=6R98!B5?)*L:,5 +MPW^8+`+0B)2DU$AA5HN_'WG.+QT+&%^A[V6XV!<8DWD#(;OJ=&U5D*X85Z7? +M.:;G#2.N!K[\9%U3=N$GR2%"G<[<"UYB12Z>(1"6\:Z3O0,A@UU*3Z\25H'7 +M:W"S21BMBE4_T5Q3`"LH#PRB=FY$L/#R;>R^GW?J0QR45"R6'8E%PW?(195! +M=TY,1BD.+FD7R1]AN36+U8^E(`+*Y4+R,@)7;Z_$X]WT4:T2BDP``>?*62/M +M&5K[`K6Y!C(G0#+WA30@1=9YH+-U-[M3WQRXVAG>^+WSHI +MK/K!4/3)*3M2-@Z$C/<:T)\%DU]#3YU%\](`"2R''IDZ^[L6Q)HEG*OA&]#H;18+@VWN9W_IZTI-_@NWMXGNFZ'PM/'.)G,%DBMCQKP:68F$]; +MIN->]^2B@LRA;4%YOGMGZ +M"V&4%\*!GP!$GG#>9O[!D*81'R:N22,1M)7L-M7B,[4K1_%U[Z@,U["3HO2! +MA.\MGA[M%-Y.9)/AA^.AX +M08-BG1MVU*GD3?Z5H\]D5&@,G0^%DB";3$#^G03FN/OK^11,.:;>H3RR+RZZ +MR9;$F;W@^\I6>/[A&E%L57K'X^A]!PWZ>N[JGN)1`]4\.;;++`ZI<:0_OA,D +M6#YP:]YQK",C)H]P<'YBB@"M!:E%?'G7I*4@'RLCM?ZGOGC[+?FJN`7B/,@A +M!E,E0/.PQR\:,KK;7EHF_;9`GKN!+I?1NM#)PRGUQE22Z*I.N;F+G:M7#LQ= +M`Z,YGJE+:=0`6S:*B\)GXP6IBHJN.8AK%T=IJ73"W:#%]3-TZK"!/719E4SB +M8O?.$GT^58^L/9!SG,`1^(2/\H4W!9K75_2CV3/?_!T$XBS8:?;WASZL&HL4 +M:XP@,GLQ!)T@22.;ERQ<1X/%!-O8\LIO=?J5Z?==D5C5/A")QA6`(,K?RC8^ +MN%$B4$':FSKX$U\C]W:]9*G$JNNS6/'[F'[1XE7(P2Z['7&B,FU^N=5C&&_% +M4G@!9.8$[(L&JOM*9PY"Z+]!S"XN;O?^>H/AZ\33[@B9`L2K*F&`````%<4$ +="L;5*)4``=:4`H#@#67V1TBQQ&?[`@`````$65H` +` +end